Normalize line endings and whitespace in source files
diff --git a/portable/IAR/78K0R/ISR_Support.h b/portable/IAR/78K0R/ISR_Support.h
index b40dfba..4eeb077 100644
--- a/portable/IAR/78K0R/ISR_Support.h
+++ b/portable/IAR/78K0R/ISR_Support.h
@@ -1,83 +1,83 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-#include "FreeRTOSConfig.h"

-

-; Variables used by scheduler

-;------------------------------------------------------------------------------

-	EXTERN    pxCurrentTCB

-	EXTERN    usCriticalNesting

-

-;------------------------------------------------------------------------------

-;   portSAVE_CONTEXT MACRO

-;   Saves the context of the general purpose registers, CS and ES (only in far

-;	memory mode) registers the usCriticalNesting Value and the Stack Pointer

-;   of the active Task onto the task stack

-;------------------------------------------------------------------------------

-portSAVE_CONTEXT MACRO

-

-	PUSH      AX                    ; Save AX Register to stack.

-	PUSH      HL

-	MOV       A, CS                 ; Save CS register.

-	XCH       A, X

-	MOV       A, ES                 ; Save ES register.

-	PUSH      AX

-	PUSH      DE                    ; Save the remaining general purpose registers.

-	PUSH      BC

-	MOVW      AX, usCriticalNesting ; Save the usCriticalNesting value.

-	PUSH      AX

-	MOVW      AX, pxCurrentTCB 	    ; Save the Stack pointer.

-	MOVW      HL, AX

-	MOVW      AX, SP

-	MOVW      [HL], AX

-	ENDM

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   portRESTORE_CONTEXT MACRO

-;   Restores the task Stack Pointer then use this to restore usCriticalNesting,

-;   general purpose registers and the CS and ES (only in far memory mode)

-;   of the selected task from the task stack

-;------------------------------------------------------------------------------

-portRESTORE_CONTEXT MACRO

-	MOVW      AX, pxCurrentTCB	    ; Restore the Stack pointer.

-	MOVW      HL, AX

-	MOVW      AX, [HL]

-	MOVW      SP, AX

-	POP	      AX	                ; Restore usCriticalNesting value.

-	MOVW      usCriticalNesting, AX

-	POP	      BC                    ; Restore the necessary general purpose registers.

-	POP	      DE

-	POP       AX                    ; Restore the ES register.

-	MOV       ES, A

-	XCH       A, X                  ; Restore the CS register.

-	MOV       CS, A

-	POP       HL                    ; Restore general purpose register HL.

-	POP       AX                    ; Restore AX.

-	ENDM

-;------------------------------------------------------------------------------

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+#include "FreeRTOSConfig.h"
+
+; Variables used by scheduler
+;------------------------------------------------------------------------------
+    EXTERN    pxCurrentTCB
+    EXTERN    usCriticalNesting
+
+;------------------------------------------------------------------------------
+;   portSAVE_CONTEXT MACRO
+;   Saves the context of the general purpose registers, CS and ES (only in far
+;   memory mode) registers the usCriticalNesting Value and the Stack Pointer
+;   of the active Task onto the task stack
+;------------------------------------------------------------------------------
+portSAVE_CONTEXT MACRO
+
+    PUSH      AX                    ; Save AX Register to stack.
+    PUSH      HL
+    MOV       A, CS                 ; Save CS register.
+    XCH       A, X
+    MOV       A, ES                 ; Save ES register.
+    PUSH      AX
+    PUSH      DE                    ; Save the remaining general purpose registers.
+    PUSH      BC
+    MOVW      AX, usCriticalNesting ; Save the usCriticalNesting value.
+    PUSH      AX
+    MOVW      AX, pxCurrentTCB      ; Save the Stack pointer.
+    MOVW      HL, AX
+    MOVW      AX, SP
+    MOVW      [HL], AX
+    ENDM
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   portRESTORE_CONTEXT MACRO
+;   Restores the task Stack Pointer then use this to restore usCriticalNesting,
+;   general purpose registers and the CS and ES (only in far memory mode)
+;   of the selected task from the task stack
+;------------------------------------------------------------------------------
+portRESTORE_CONTEXT MACRO
+    MOVW      AX, pxCurrentTCB      ; Restore the Stack pointer.
+    MOVW      HL, AX
+    MOVW      AX, [HL]
+    MOVW      SP, AX
+    POP       AX                    ; Restore usCriticalNesting value.
+    MOVW      usCriticalNesting, AX
+    POP       BC                    ; Restore the necessary general purpose registers.
+    POP       DE
+    POP       AX                    ; Restore the ES register.
+    MOV       ES, A
+    XCH       A, X                  ; Restore the CS register.
+    MOV       CS, A
+    POP       HL                    ; Restore general purpose register HL.
+    POP       AX                    ; Restore AX.
+    ENDM
+;------------------------------------------------------------------------------
diff --git a/portable/IAR/78K0R/port.c b/portable/IAR/78K0R/port.c
index 3a5aff0..75f5a3e 100644
--- a/portable/IAR/78K0R/port.c
+++ b/portable/IAR/78K0R/port.c
@@ -1,226 +1,225 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Standard includes. */

-#include <stdlib.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* The critical nesting value is initialised to a non zero value to ensure

-interrupts don't accidentally become enabled before the scheduler is started. */

-#define portINITIAL_CRITICAL_NESTING  (( uint16_t ) 10)

-

-/* Initial PSW value allocated to a newly created task.

- *   1100011000000000

- *   ||||||||-------------- Fill byte

- *   |||||||--------------- Carry Flag cleared

- *   |||||----------------- In-service priority Flags set to low level

- *   ||||------------------ Register bank Select 0 Flag cleared

- *   |||------------------- Auxiliary Carry Flag cleared

- *   ||-------------------- Register bank Select 1 Flag cleared

- *   |--------------------- Zero Flag set

- *   ---------------------- Global Interrupt Flag set (enabled)

- */

-#define portPSW		  (0xc6UL)

-

-/* We require the address of the pxCurrentTCB variable, but don't want to know

-any details of its type. */

-typedef void TCB_t;

-extern volatile TCB_t * volatile pxCurrentTCB;

-

-/* Most ports implement critical sections by placing the interrupt flags on

-the stack before disabling interrupts.  Exiting the critical section is then

-simply a case of popping the flags from the stack.  As 78K0 IAR does not use

-a frame pointer this cannot be done as modifying the stack will clobber all

-the stack variables.  Instead each task maintains a count of the critical

-section nesting depth.  Each time a critical section is entered the count is

-incremented.  Each time a critical section is left the count is decremented -

-with interrupts only being re-enabled if the count is zero.

-

-usCriticalNesting will get set to zero when the scheduler starts, but must

-not be initialised to zero as this will cause problems during the startup

-sequence. */

-volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;

-/*-----------------------------------------------------------*/

-

-/*

- * Sets up the periodic ISR used for the RTOS tick.

- */

-static void prvSetupTimerInterrupt( void );

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See the header file portable.h.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-uint32_t *pulLocal;

-

-	#if configMEMORY_MODE == 1

-	{

-		/* Parameters are passed in on the stack, and written using a 32bit value

-		hence a space is left for the second two bytes. */

-		pxTopOfStack--;

-

-		/* Write in the parameter value. */

-		pulLocal =  ( uint32_t * ) pxTopOfStack;

-		*pulLocal = ( uint32_t ) pvParameters;

-		pxTopOfStack--;

-

-		/* These values are just spacers.  The return address of the function

-		would normally be written here. */

-		*pxTopOfStack = ( StackType_t ) 0xcdcd;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0xcdcd;

-		pxTopOfStack--;

-

-		/* The start address / PSW value is also written in as a 32bit value,

-		so leave a space for the second two bytes. */

-		pxTopOfStack--;

-	

-		/* Task function start address combined with the PSW. */

-		pulLocal = ( uint32_t * ) pxTopOfStack;

-		*pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );

-		pxTopOfStack--;

-

-		/* An initial value for the AX register. */

-		*pxTopOfStack = ( StackType_t ) 0x1111;

-		pxTopOfStack--;

-	}

-	#else

-	{

-		/* Task function address is written to the stack first.  As it is

-		written as a 32bit value a space is left on the stack for the second

-		two bytes. */

-		pxTopOfStack--;

-

-		/* Task function start address combined with the PSW. */

-		pulLocal = ( uint32_t * ) pxTopOfStack;

-		*pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );

-		pxTopOfStack--;

-

-		/* The parameter is passed in AX. */

-		*pxTopOfStack = ( StackType_t ) pvParameters;

-		pxTopOfStack--;

-	}

-	#endif

-

-	/* An initial value for the HL register. */

-	*pxTopOfStack = ( StackType_t ) 0x2222;

-	pxTopOfStack--;

-

-	/* CS and ES registers. */

-	*pxTopOfStack = ( StackType_t ) 0x0F00;

-	pxTopOfStack--;

-

-	/* Finally the remaining general purpose registers DE and BC */

-	*pxTopOfStack = ( StackType_t ) 0xDEDE;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0xBCBC;

-	pxTopOfStack--;

-

-	/* Finally the critical section nesting count is set to zero when the task

-	first starts. */

-	*pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;	

-

-	/* Return a pointer to the top of the stack we have generated so this can

-	be stored in the task control block for the task. */

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-	/* Setup the hardware to generate the tick.  Interrupts are disabled when

-	this function is called. */

-	prvSetupTimerInterrupt();

-

-	/* Restore the context of the first task that is going to run. */

-	vPortStart();

-

-	/* Should not get here as the tasks are now running! */

-	return pdTRUE;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the 78K0R port will get stopped.  If required simply

-	disable the tick interrupt here. */

-}

-/*-----------------------------------------------------------*/

-

-static void prvSetupTimerInterrupt( void )

-{

-	/* Setup channel 5 of the TAU to generate the tick interrupt. */

-

-	/* First the Timer Array Unit has to be enabled. */

-	TAU0EN = 1;

-

-	/* To configure the Timer Array Unit all Channels have to first be stopped. */

-	TT0 = 0xff;

-

-	/* Interrupt of Timer Array Unit Channel 5 is disabled to set the interrupt

-	priority. */

-	TMMK05 = 1;

-

-	/* Clear Timer Array Unit Channel 5 interrupt flag. */	

-	TMIF05 = 0;

-

-	/* Set Timer Array Unit Channel 5 interrupt priority */

-	TMPR005 = 0;

-	TMPR105 = 0;

-

-	/* Set Timer Array Unit Channel 5 Mode as interval timer. */

-	TMR05 = 0x0000;

-

-	/* Set the compare match value according to the tick rate we want. */

-	TDR05 = ( TickType_t ) ( configCPU_CLOCK_HZ / configTICK_RATE_HZ );

-

-	/* Set Timer Array Unit Channel 5 output mode */

-	TOM0 &= ~0x0020;

-

-	/* Set Timer Array Unit Channel 5 output level */	

-	TOL0 &= ~0x0020;

-

-	/* Set Timer Array Unit Channel 5 output enable */	

-	TOE0 &= ~0x0020;

-

-	/* Interrupt of Timer Array Unit Channel 5 enabled */

-	TMMK05 = 0;

-

-	/* Start Timer Array Unit Channel 5.*/

-	TS0 |= 0x0020;

-}

-/*-----------------------------------------------------------*/

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Standard includes. */
+#include <stdlib.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* The critical nesting value is initialised to a non zero value to ensure
+interrupts don't accidentally become enabled before the scheduler is started. */
+#define portINITIAL_CRITICAL_NESTING  (( uint16_t ) 10)
+
+/* Initial PSW value allocated to a newly created task.
+ *   1100011000000000
+ *   ||||||||-------------- Fill byte
+ *   |||||||--------------- Carry Flag cleared
+ *   |||||----------------- In-service priority Flags set to low level
+ *   ||||------------------ Register bank Select 0 Flag cleared
+ *   |||------------------- Auxiliary Carry Flag cleared
+ *   ||-------------------- Register bank Select 1 Flag cleared
+ *   |--------------------- Zero Flag set
+ *   ---------------------- Global Interrupt Flag set (enabled)
+ */
+#define portPSW       (0xc6UL)
+
+/* We require the address of the pxCurrentTCB variable, but don't want to know
+any details of its type. */
+typedef void TCB_t;
+extern volatile TCB_t * volatile pxCurrentTCB;
+
+/* Most ports implement critical sections by placing the interrupt flags on
+the stack before disabling interrupts.  Exiting the critical section is then
+simply a case of popping the flags from the stack.  As 78K0 IAR does not use
+a frame pointer this cannot be done as modifying the stack will clobber all
+the stack variables.  Instead each task maintains a count of the critical
+section nesting depth.  Each time a critical section is entered the count is
+incremented.  Each time a critical section is left the count is decremented -
+with interrupts only being re-enabled if the count is zero.
+
+usCriticalNesting will get set to zero when the scheduler starts, but must
+not be initialised to zero as this will cause problems during the startup
+sequence. */
+volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;
+/*-----------------------------------------------------------*/
+
+/*
+ * Sets up the periodic ISR used for the RTOS tick.
+ */
+static void prvSetupTimerInterrupt( void );
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See the header file portable.h.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+uint32_t *pulLocal;
+
+    #if configMEMORY_MODE == 1
+    {
+        /* Parameters are passed in on the stack, and written using a 32bit value
+        hence a space is left for the second two bytes. */
+        pxTopOfStack--;
+
+        /* Write in the parameter value. */
+        pulLocal =  ( uint32_t * ) pxTopOfStack;
+        *pulLocal = ( uint32_t ) pvParameters;
+        pxTopOfStack--;
+
+        /* These values are just spacers.  The return address of the function
+        would normally be written here. */
+        *pxTopOfStack = ( StackType_t ) 0xcdcd;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0xcdcd;
+        pxTopOfStack--;
+
+        /* The start address / PSW value is also written in as a 32bit value,
+        so leave a space for the second two bytes. */
+        pxTopOfStack--;
+
+        /* Task function start address combined with the PSW. */
+        pulLocal = ( uint32_t * ) pxTopOfStack;
+        *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );
+        pxTopOfStack--;
+
+        /* An initial value for the AX register. */
+        *pxTopOfStack = ( StackType_t ) 0x1111;
+        pxTopOfStack--;
+    }
+    #else
+    {
+        /* Task function address is written to the stack first.  As it is
+        written as a 32bit value a space is left on the stack for the second
+        two bytes. */
+        pxTopOfStack--;
+
+        /* Task function start address combined with the PSW. */
+        pulLocal = ( uint32_t * ) pxTopOfStack;
+        *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );
+        pxTopOfStack--;
+
+        /* The parameter is passed in AX. */
+        *pxTopOfStack = ( StackType_t ) pvParameters;
+        pxTopOfStack--;
+    }
+    #endif
+
+    /* An initial value for the HL register. */
+    *pxTopOfStack = ( StackType_t ) 0x2222;
+    pxTopOfStack--;
+
+    /* CS and ES registers. */
+    *pxTopOfStack = ( StackType_t ) 0x0F00;
+    pxTopOfStack--;
+
+    /* Finally the remaining general purpose registers DE and BC */
+    *pxTopOfStack = ( StackType_t ) 0xDEDE;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0xBCBC;
+    pxTopOfStack--;
+
+    /* Finally the critical section nesting count is set to zero when the task
+    first starts. */
+    *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;
+
+    /* Return a pointer to the top of the stack we have generated so this can
+    be stored in the task control block for the task. */
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+    /* Setup the hardware to generate the tick.  Interrupts are disabled when
+    this function is called. */
+    prvSetupTimerInterrupt();
+
+    /* Restore the context of the first task that is going to run. */
+    vPortStart();
+
+    /* Should not get here as the tasks are now running! */
+    return pdTRUE;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the 78K0R port will get stopped.  If required simply
+    disable the tick interrupt here. */
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupTimerInterrupt( void )
+{
+    /* Setup channel 5 of the TAU to generate the tick interrupt. */
+
+    /* First the Timer Array Unit has to be enabled. */
+    TAU0EN = 1;
+
+    /* To configure the Timer Array Unit all Channels have to first be stopped. */
+    TT0 = 0xff;
+
+    /* Interrupt of Timer Array Unit Channel 5 is disabled to set the interrupt
+    priority. */
+    TMMK05 = 1;
+
+    /* Clear Timer Array Unit Channel 5 interrupt flag. */
+    TMIF05 = 0;
+
+    /* Set Timer Array Unit Channel 5 interrupt priority */
+    TMPR005 = 0;
+    TMPR105 = 0;
+
+    /* Set Timer Array Unit Channel 5 Mode as interval timer. */
+    TMR05 = 0x0000;
+
+    /* Set the compare match value according to the tick rate we want. */
+    TDR05 = ( TickType_t ) ( configCPU_CLOCK_HZ / configTICK_RATE_HZ );
+
+    /* Set Timer Array Unit Channel 5 output mode */
+    TOM0 &= ~0x0020;
+
+    /* Set Timer Array Unit Channel 5 output level */
+    TOL0 &= ~0x0020;
+
+    /* Set Timer Array Unit Channel 5 output enable */
+    TOE0 &= ~0x0020;
+
+    /* Interrupt of Timer Array Unit Channel 5 enabled */
+    TMMK05 = 0;
+
+    /* Start Timer Array Unit Channel 5.*/
+    TS0 |= 0x0020;
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/78K0R/portasm.s26 b/portable/IAR/78K0R/portasm.s26
index d273d12..6b6b761 100644
--- a/portable/IAR/78K0R/portasm.s26
+++ b/portable/IAR/78K0R/portasm.s26
@@ -1,139 +1,139 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-#include "ISR_Support.h"

-;------------------------------------------------------------------------------

-

-#if __CORE__ != __78K0R__

-	#error "This file is only for 78K0R Devices"

-#endif

-

-#define CS                    0xFFFFC

-#define ES                    0xFFFFD

-

-; Functions implemented in this file

-;------------------------------------------------------------------------------

-	PUBLIC    vPortYield

-	PUBLIC    vPortStart

-

-; Functions used by scheduler

-;------------------------------------------------------------------------------

-	EXTERN    vTaskSwitchContext

-	EXTERN    xTaskIncrementTick

-

-; Tick ISR Prototype

-;------------------------------------------------------------------------------

-;	EXTERN    ?CL78K0R_V2_L00

-

-	PUBWEAK   `??MD_INTTM05??INTVEC 68`

-	PUBLIC    MD_INTTM05

-

-MD_INTTM05    SYMBOL "MD_INTTM05"

-`??MD_INTTM05??INTVEC 68` SYMBOL "??INTVEC 68", MD_INTTM05

-

-

-

-;------------------------------------------------------------------------------

-;   Yield to another task.  Implemented as a software interrupt.  The return

-;   address and PSW will have been saved to the stack automatically before

-;   this code runs.

-;

-;   Input:  NONE

-;

-;   Call:   CALL    vPortYield

-;

-;   Output: NONE

-;

-;------------------------------------------------------------------------------

-    RSEG CODE:CODE

-vPortYield:

-	portSAVE_CONTEXT		        ; Save the context of the current task.

-	call      vTaskSwitchContext    ; Call the scheduler to select the next task.

-	portRESTORE_CONTEXT		        ; Restore the context of the next task to run.

-	retb

-

-

-;------------------------------------------------------------------------------

-;   Restore the context of the first task that is going to run.

-;

-;   Input:  NONE

-;

-;   Call:   CALL    vPortStart

-;

-;   Output: NONE

-;

-;------------------------------------------------------------------------------

-    RSEG CODE:CODE

-vPortStart:

-	portRESTORE_CONTEXT	            ; Restore the context of whichever task the ...

-	reti					        ; An interrupt stack frame is used so the task

-                                    ; is started using a RETI instruction.

-

-;------------------------------------------------------------------------------

-;   Perform the necessary steps of the Tick Count Increment and Task Switch

-;   depending on the chosen kernel configuration

-;

-;   Input:  NONE

-;

-;   Call:   ISR

-;

-;   Output: NONE

-;

-;------------------------------------------------------------------------------

-

-MD_INTTM05:

-

-	portSAVE_CONTEXT		        ; Save the context of the current task.

-	call      xTaskIncrementTick    ; Call the timer tick function.

-#if configUSE_PREEMPTION == 1

-	call      vTaskSwitchContext    ; Call the scheduler to select the next task.

-#endif

-	portRESTORE_CONTEXT		        ; Restore the context of the next task to run.

-	reti

-

-

-

-;	REQUIRE ?CL78K0R_V2_L00

-	COMMON INTVEC:CODE:ROOT(1)      ; Set ISR location to the Interrupt vector table.

-	ORG 68

-`??MD_INTTM05??INTVEC 68`:

-	DW MD_INTTM05

-

-	COMMON INTVEC:CODE:ROOT(1)      ; Set ISR location to the Interrupt vector table.

-	ORG 126

-`??vPortYield??INTVEC 126`:

-	DW vPortYield

-

-									; Set value for the usCriticalNesting.

-	RSEG NEAR_ID:CONST:SORT:NOROOT(1)

-`?<Initializer for usCriticalNesting>`:

-	DW 10

-

-;#endif

-

-      END

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+#include "ISR_Support.h"
+;------------------------------------------------------------------------------
+
+#if __CORE__ != __78K0R__
+    #error "This file is only for 78K0R Devices"
+#endif
+
+#define CS                    0xFFFFC
+#define ES                    0xFFFFD
+
+; Functions implemented in this file
+;------------------------------------------------------------------------------
+    PUBLIC    vPortYield
+    PUBLIC    vPortStart
+
+; Functions used by scheduler
+;------------------------------------------------------------------------------
+    EXTERN    vTaskSwitchContext
+    EXTERN    xTaskIncrementTick
+
+; Tick ISR Prototype
+;------------------------------------------------------------------------------
+;   EXTERN    ?CL78K0R_V2_L00
+
+    PUBWEAK   `??MD_INTTM05??INTVEC 68`
+    PUBLIC    MD_INTTM05
+
+MD_INTTM05    SYMBOL "MD_INTTM05"
+`??MD_INTTM05??INTVEC 68` SYMBOL "??INTVEC 68", MD_INTTM05
+
+
+
+;------------------------------------------------------------------------------
+;   Yield to another task.  Implemented as a software interrupt.  The return
+;   address and PSW will have been saved to the stack automatically before
+;   this code runs.
+;
+;   Input:  NONE
+;
+;   Call:   CALL    vPortYield
+;
+;   Output: NONE
+;
+;------------------------------------------------------------------------------
+    RSEG CODE:CODE
+vPortYield:
+    portSAVE_CONTEXT                ; Save the context of the current task.
+    call      vTaskSwitchContext    ; Call the scheduler to select the next task.
+    portRESTORE_CONTEXT             ; Restore the context of the next task to run.
+    retb
+
+
+;------------------------------------------------------------------------------
+;   Restore the context of the first task that is going to run.
+;
+;   Input:  NONE
+;
+;   Call:   CALL    vPortStart
+;
+;   Output: NONE
+;
+;------------------------------------------------------------------------------
+    RSEG CODE:CODE
+vPortStart:
+    portRESTORE_CONTEXT             ; Restore the context of whichever task the ...
+    reti                            ; An interrupt stack frame is used so the task
+                                    ; is started using a RETI instruction.
+
+;------------------------------------------------------------------------------
+;   Perform the necessary steps of the Tick Count Increment and Task Switch
+;   depending on the chosen kernel configuration
+;
+;   Input:  NONE
+;
+;   Call:   ISR
+;
+;   Output: NONE
+;
+;------------------------------------------------------------------------------
+
+MD_INTTM05:
+
+    portSAVE_CONTEXT                ; Save the context of the current task.
+    call      xTaskIncrementTick    ; Call the timer tick function.
+#if configUSE_PREEMPTION == 1
+    call      vTaskSwitchContext    ; Call the scheduler to select the next task.
+#endif
+    portRESTORE_CONTEXT             ; Restore the context of the next task to run.
+    reti
+
+
+
+;   REQUIRE ?CL78K0R_V2_L00
+    COMMON INTVEC:CODE:ROOT(1)      ; Set ISR location to the Interrupt vector table.
+    ORG 68
+`??MD_INTTM05??INTVEC 68`:
+    DW MD_INTTM05
+
+    COMMON INTVEC:CODE:ROOT(1)      ; Set ISR location to the Interrupt vector table.
+    ORG 126
+`??vPortYield??INTVEC 126`:
+    DW vPortYield
+
+                                    ; Set value for the usCriticalNesting.
+    RSEG NEAR_ID:CONST:SORT:NOROOT(1)
+`?<Initializer for usCriticalNesting>`:
+    DW 10
+
+;#endif
+
+      END
diff --git a/portable/IAR/78K0R/portmacro.h b/portable/IAR/78K0R/portmacro.h
index 2b48506..673cf15 100644
--- a/portable/IAR/78K0R/portmacro.h
+++ b/portable/IAR/78K0R/portmacro.h
@@ -1,146 +1,145 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-

-#define portCHAR        char

-#define portFLOAT       float

-#define portDOUBLE      double

-#define portLONG        long

-#define portSHORT       short

-#define portSTACK_TYPE  uint16_t

-#define portBASE_TYPE   short

-

-typedef portSTACK_TYPE StackType_t;

-typedef short BaseType_t;

-typedef unsigned short UBaseType_t;

-

-#if (configUSE_16_BIT_TICKS==1)

-	typedef unsigned int TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-/*-----------------------------------------------------------*/

-

-/* Interrupt control macros. */

-#define portDISABLE_INTERRUPTS() __asm ( "DI" )

-#define portENABLE_INTERRUPTS()	 __asm ( "EI" )

-/*-----------------------------------------------------------*/

-

-/* Critical section control macros. */

-#define portNO_CRITICAL_SECTION_NESTING		( ( uint16_t ) 0 )

-

-#define portENTER_CRITICAL()													\

-{																				\

-extern volatile uint16_t usCriticalNesting;							\

-																				\

-	portDISABLE_INTERRUPTS();													\

-																				\

-	/* Now interrupts are disabled ulCriticalNesting can be accessed */			\

-	/* directly.  Increment ulCriticalNesting to keep a count of how many */	\

-	/* times portENTER_CRITICAL() has been called. */							\

-	usCriticalNesting++;														\

-}

-

-#define portEXIT_CRITICAL()														\

-{																				\

-extern volatile uint16_t usCriticalNesting;							\

-																				\

-	if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )					\

-	{																			\

-		/* Decrement the nesting count as we are leaving a critical section. */	\

-		usCriticalNesting--;													\

-																				\

-		/* If the nesting level has reached zero then interrupts should be */	\

-		/* re-enabled. */														\

-		if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )				\

-		{																		\

-			portENABLE_INTERRUPTS();											\

-		}																		\

-	}																			\

-}

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-extern void vPortStart( void );

-#define portYIELD()	__asm( "BRK" )

-#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 )

-#define portNOP()	__asm( "NOP" )

-/*-----------------------------------------------------------*/

-

-/* Hardwware specifics. */

-#define portBYTE_ALIGNMENT	2

-#define portSTACK_GROWTH	( -1 )

-#define portTICK_PERIOD_MS	( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-

-static __interrupt void P0_isr   (void);

-

-/* --------------------------------------------------------------------------*/

-/* Option-bytes and security ID                                              */

-/* --------------------------------------------------------------------------*/

-#define OPT_BYTES_SIZE     4

-#define SECU_ID_SIZE       10

-#define WATCHDOG_DISABLED  0x00

-#define LVI_ENABLED        0xFE

-#define LVI_DISABLED       0xFF

-#define RESERVED_FF        0xFF

-#define OCD_DISABLED       0x04

-#define OCD_ENABLED        0x81

-#define OCD_ENABLED_ERASE  0x80

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions. */
+
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint16_t
+#define portBASE_TYPE   short
+
+typedef portSTACK_TYPE StackType_t;
+typedef short BaseType_t;
+typedef unsigned short UBaseType_t;
+
+#if (configUSE_16_BIT_TICKS==1)
+    typedef unsigned int TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+/*-----------------------------------------------------------*/
+
+/* Interrupt control macros. */
+#define portDISABLE_INTERRUPTS() __asm ( "DI" )
+#define portENABLE_INTERRUPTS()  __asm ( "EI" )
+/*-----------------------------------------------------------*/
+
+/* Critical section control macros. */
+#define portNO_CRITICAL_SECTION_NESTING     ( ( uint16_t ) 0 )
+
+#define portENTER_CRITICAL()                                                    \
+{                                                                               \
+extern volatile uint16_t usCriticalNesting;                         \
+                                                                                \
+    portDISABLE_INTERRUPTS();                                                   \
+                                                                                \
+    /* Now interrupts are disabled ulCriticalNesting can be accessed */         \
+    /* directly.  Increment ulCriticalNesting to keep a count of how many */    \
+    /* times portENTER_CRITICAL() has been called. */                           \
+    usCriticalNesting++;                                                        \
+}
+
+#define portEXIT_CRITICAL()                                                     \
+{                                                                               \
+extern volatile uint16_t usCriticalNesting;                         \
+                                                                                \
+    if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )                   \
+    {                                                                           \
+        /* Decrement the nesting count as we are leaving a critical section. */ \
+        usCriticalNesting--;                                                    \
+                                                                                \
+        /* If the nesting level has reached zero then interrupts should be */   \
+        /* re-enabled. */                                                       \
+        if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )              \
+        {                                                                       \
+            portENABLE_INTERRUPTS();                                            \
+        }                                                                       \
+    }                                                                           \
+}
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+extern void vPortStart( void );
+#define portYIELD() __asm( "BRK" )
+#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 )
+#define portNOP()   __asm( "NOP" )
+/*-----------------------------------------------------------*/
+
+/* Hardwware specifics. */
+#define portBYTE_ALIGNMENT  2
+#define portSTACK_GROWTH    ( -1 )
+#define portTICK_PERIOD_MS  ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+
+static __interrupt void P0_isr   (void);
+
+/* --------------------------------------------------------------------------*/
+/* Option-bytes and security ID                                              */
+/* --------------------------------------------------------------------------*/
+#define OPT_BYTES_SIZE     4
+#define SECU_ID_SIZE       10
+#define WATCHDOG_DISABLED  0x00
+#define LVI_ENABLED        0xFE
+#define LVI_DISABLED       0xFF
+#define RESERVED_FF        0xFF
+#define OCD_DISABLED       0x04
+#define OCD_ENABLED        0x81
+#define OCD_ENABLED_ERASE  0x80
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CA5_No_GIC/port.c b/portable/IAR/ARM_CA5_No_GIC/port.c
index 6a99961..b1c2158 100644
--- a/portable/IAR/ARM_CA5_No_GIC/port.c
+++ b/portable/IAR/ARM_CA5_No_GIC/port.c
@@ -1,301 +1,298 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* IAR includes. */

-#include <intrinsics.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1

-	/* Check the configuration. */

-	#if( configMAX_PRIORITIES > 32 )

-		#error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.

-	#endif

-#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-

-#ifndef configSETUP_TICK_INTERRUPT

-	#error configSETUP_TICK_INTERRUPT() must be defined in FreeRTOSConfig.h to call the function that sets up the tick interrupt.  A default that uses the PIT is provided in the official demo application.

-#endif

-

-#ifndef configCLEAR_TICK_INTERRUPT

-	#error configCLEAR_TICK_INTERRUPT must be defined in FreeRTOSConfig.h to clear which ever interrupt was used to generate the tick interrupt.  A default that uses the PIT is provided in the official demo application.

-#endif

-

-/* A critical section is exited when the critical section nesting count reaches

-this value. */

-#define portNO_CRITICAL_NESTING			( ( uint32_t ) 0 )

-

-/* Tasks are not created with a floating point context, but can be given a

-floating point context after they have been created.  A variable is stored as

-part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task

-does not have an FPU context, or any other value if the task does have an FPU

-context. */

-#define portNO_FLOATING_POINT_CONTEXT	( ( StackType_t ) 0 )

-

-/* Constants required to setup the initial task context. */

-#define portINITIAL_SPSR				( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */

-#define portTHUMB_MODE_BIT				( ( StackType_t ) 0x20 )

-#define portTHUMB_MODE_ADDRESS			( 0x01UL )

-

-/* Masks all bits in the APSR other than the mode bits. */

-#define portAPSR_MODE_BITS_MASK			( 0x1F )

-

-/* The value of the mode bits in the APSR when the CPU is executing in user

-mode. */

-#define portAPSR_USER_MODE				( 0x10 )

-

-/*-----------------------------------------------------------*/

-

-/*

- * Starts the first task executing.  This function is necessarily written in

- * assembly code so is implemented in portASM.s.

- */

-extern void vPortRestoreTaskContext( void );

-

-/*

- * Used to catch tasks that attempt to return from their implementing function.

- */

-static void prvTaskExitError( void );

-

-/*-----------------------------------------------------------*/

-

-/* A variable is used to keep track of the critical section nesting.  This

-variable has to be stored as part of the task context and must be initialised to

-a non zero value to ensure interrupts don't inadvertently become unmasked before

-the scheduler starts.  As it is stored as part of the task context it will

-automatically be set to 0 when the first task is started. */

-volatile uint32_t ulCriticalNesting = 9999UL;

-

-/* Saved as part of the task context.  If ulPortTaskHasFPUContext is non-zero

-then a floating point context must be saved and restored for the task. */

-uint32_t ulPortTaskHasFPUContext = pdFALSE;

-

-/* Set to 1 to pend a context switch from an ISR. */

-uint32_t ulPortYieldRequired = pdFALSE;

-

-/* Counts the interrupt nesting depth.  A context switch is only performed if

-if the nesting depth is 0. */

-uint32_t ulPortInterruptNesting = 0UL;

-

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-	/* Setup the initial stack of the task.  The stack is set exactly as

-	expected by the portRESTORE_CONTEXT() macro.

-

-	The fist real value on the stack is the status register, which is set for

-	system mode, with interrupts enabled.  A few NULLs are added first to ensure

-	GDB does not try decoding a non-existent return address. */

-	*pxTopOfStack = NULL;

-	pxTopOfStack--;

-	*pxTopOfStack = NULL;

-	pxTopOfStack--;

-	*pxTopOfStack = NULL;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;

-

-	if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL )

-	{

-		/* The task will start in THUMB mode. */

-		*pxTopOfStack |= portTHUMB_MODE_BIT;

-	}

-

-	pxTopOfStack--;

-

-	/* Next the return address, which in this case is the start of the task. */

-	*pxTopOfStack = ( StackType_t ) pxCode;

-	pxTopOfStack--;

-

-	/* Next all the registers other than the stack pointer. */

-	*pxTopOfStack = ( StackType_t ) prvTaskExitError;	/* R14 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12121212;	/* R12 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x11111111;	/* R11 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x10101010;	/* R10 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x09090909;	/* R9 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x08080808;	/* R8 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x07070707;	/* R7 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x06060606;	/* R6 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x05050505;	/* R5 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x04040404;	/* R4 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x03030303;	/* R3 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x02020202;	/* R2 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x01010101;	/* R1 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-	pxTopOfStack--;

-

-	/* The task will start with a critical nesting count of 0 as interrupts are

-	enabled. */

-	*pxTopOfStack = portNO_CRITICAL_NESTING;

-	pxTopOfStack--;

-

-	/* The task will start without a floating point context.  A task that uses

-	the floating point hardware must call vPortTaskUsesFPU() before executing

-	any floating point instructions. */

-	*pxTopOfStack = portNO_FLOATING_POINT_CONTEXT;

-

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-static void prvTaskExitError( void )

-{

-	/* A function that implements a task must not exit or attempt to return to

-	its caller as there is nothing to return to.  If a task wants to exit it

-	should instead call vTaskDelete( NULL ).

-

-	Artificially force an assert() to be triggered if configASSERT() is

-	defined, then stop here so application writers can catch the error. */

-	configASSERT( ulPortInterruptNesting == ~0UL );

-	portDISABLE_INTERRUPTS();

-	for( ;; );

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-uint32_t ulAPSR;

-

-	/* Only continue if the CPU is not in User mode.  The CPU must be in a

-	Privileged mode for the scheduler to start. */

-	__asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) );

-	ulAPSR &= portAPSR_MODE_BITS_MASK;

-	configASSERT( ulAPSR != portAPSR_USER_MODE );

-

-	if( ulAPSR != portAPSR_USER_MODE )

-	{

-		/* Start the timer that generates the tick ISR. */

-		configSETUP_TICK_INTERRUPT();

-		vPortRestoreTaskContext();

-	}

-

-	/* Will only get here if vTaskStartScheduler() was called with the CPU in

-	a non-privileged mode or the binary point register was not set to its lowest

-	possible value. */

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* Not implemented in ports where there is nothing to return to.

-	Artificially force an assert. */

-	configASSERT( ulCriticalNesting == 1000UL );

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-	portDISABLE_INTERRUPTS();

-

-	/* Now interrupts are disabled ulCriticalNesting can be accessed

-	directly.  Increment ulCriticalNesting to keep a count of how many times

-	portENTER_CRITICAL() has been called. */

-	ulCriticalNesting++;

-

-	/* This is not the interrupt safe version of the enter critical function so

-	assert() if it is being called from an interrupt context.  Only API

-	functions that end in "FromISR" can be used in an interrupt.  Only assert if

-	the critical nesting count is 1 to protect against recursive calls if the

-	assert function also uses a critical section. */

-	if( ulCriticalNesting == 1 )

-	{

-		configASSERT( ulPortInterruptNesting == 0 );

-	}

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-	if( ulCriticalNesting > portNO_CRITICAL_NESTING )

-	{

-		/* Decrement the nesting count as the critical section is being

-		exited. */

-		ulCriticalNesting--;

-

-		/* If the nesting level has reached zero then all interrupt

-		priorities must be re-enabled. */

-		if( ulCriticalNesting == portNO_CRITICAL_NESTING )

-		{

-			/* Critical nesting has reached zero so all interrupt priorities

-			should be unmasked. */

-			portENABLE_INTERRUPTS();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-void FreeRTOS_Tick_Handler( void )

-{

-	portDISABLE_INTERRUPTS();

-

-	/* Increment the RTOS tick. */

-	if( xTaskIncrementTick() != pdFALSE )

-	{

-		ulPortYieldRequired = pdTRUE;

-	}

-

-	portENABLE_INTERRUPTS();

-	configCLEAR_TICK_INTERRUPT();

-}

-/*-----------------------------------------------------------*/

-

-void vPortTaskUsesFPU( void )

-{

-uint32_t ulInitialFPSCR = 0;

-

-	/* A task is registering the fact that it needs an FPU context.  Set the

-	FPU flag (which is saved as part of the task context). */

-	ulPortTaskHasFPUContext = pdTRUE;

-

-	/* Initialise the floating point status register. */

-	__asm( "FMXR 	FPSCR, %0" :: "r" (ulInitialFPSCR) );

-}

-/*-----------------------------------------------------------*/

-

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* IAR includes. */
+#include <intrinsics.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
+    /* Check the configuration. */
+    #if( configMAX_PRIORITIES > 32 )
+        #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.
+    #endif
+#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+
+#ifndef configSETUP_TICK_INTERRUPT
+    #error configSETUP_TICK_INTERRUPT() must be defined in FreeRTOSConfig.h to call the function that sets up the tick interrupt.  A default that uses the PIT is provided in the official demo application.
+#endif
+
+#ifndef configCLEAR_TICK_INTERRUPT
+    #error configCLEAR_TICK_INTERRUPT must be defined in FreeRTOSConfig.h to clear which ever interrupt was used to generate the tick interrupt.  A default that uses the PIT is provided in the official demo application.
+#endif
+
+/* A critical section is exited when the critical section nesting count reaches
+this value. */
+#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
+
+/* Tasks are not created with a floating point context, but can be given a
+floating point context after they have been created.  A variable is stored as
+part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task
+does not have an FPU context, or any other value if the task does have an FPU
+context. */
+#define portNO_FLOATING_POINT_CONTEXT   ( ( StackType_t ) 0 )
+
+/* Constants required to setup the initial task context. */
+#define portINITIAL_SPSR                ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */
+#define portTHUMB_MODE_BIT              ( ( StackType_t ) 0x20 )
+#define portTHUMB_MODE_ADDRESS          ( 0x01UL )
+
+/* Masks all bits in the APSR other than the mode bits. */
+#define portAPSR_MODE_BITS_MASK         ( 0x1F )
+
+/* The value of the mode bits in the APSR when the CPU is executing in user
+mode. */
+#define portAPSR_USER_MODE              ( 0x10 )
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Starts the first task executing.  This function is necessarily written in
+ * assembly code so is implemented in portASM.s.
+ */
+extern void vPortRestoreTaskContext( void );
+
+/*
+ * Used to catch tasks that attempt to return from their implementing function.
+ */
+static void prvTaskExitError( void );
+
+/*-----------------------------------------------------------*/
+
+/* A variable is used to keep track of the critical section nesting.  This
+variable has to be stored as part of the task context and must be initialised to
+a non zero value to ensure interrupts don't inadvertently become unmasked before
+the scheduler starts.  As it is stored as part of the task context it will
+automatically be set to 0 when the first task is started. */
+volatile uint32_t ulCriticalNesting = 9999UL;
+
+/* Saved as part of the task context.  If ulPortTaskHasFPUContext is non-zero
+then a floating point context must be saved and restored for the task. */
+uint32_t ulPortTaskHasFPUContext = pdFALSE;
+
+/* Set to 1 to pend a context switch from an ISR. */
+uint32_t ulPortYieldRequired = pdFALSE;
+
+/* Counts the interrupt nesting depth.  A context switch is only performed if
+if the nesting depth is 0. */
+uint32_t ulPortInterruptNesting = 0UL;
+
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+    /* Setup the initial stack of the task.  The stack is set exactly as
+    expected by the portRESTORE_CONTEXT() macro.
+
+    The fist real value on the stack is the status register, which is set for
+    system mode, with interrupts enabled.  A few NULLs are added first to ensure
+    GDB does not try decoding a non-existent return address. */
+    *pxTopOfStack = NULL;
+    pxTopOfStack--;
+    *pxTopOfStack = NULL;
+    pxTopOfStack--;
+    *pxTopOfStack = NULL;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;
+
+    if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL )
+    {
+        /* The task will start in THUMB mode. */
+        *pxTopOfStack |= portTHUMB_MODE_BIT;
+    }
+
+    pxTopOfStack--;
+
+    /* Next the return address, which in this case is the start of the task. */
+    *pxTopOfStack = ( StackType_t ) pxCode;
+    pxTopOfStack--;
+
+    /* Next all the registers other than the stack pointer. */
+    *pxTopOfStack = ( StackType_t ) prvTaskExitError;   /* R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+    pxTopOfStack--;
+
+    /* The task will start with a critical nesting count of 0 as interrupts are
+    enabled. */
+    *pxTopOfStack = portNO_CRITICAL_NESTING;
+    pxTopOfStack--;
+
+    /* The task will start without a floating point context.  A task that uses
+    the floating point hardware must call vPortTaskUsesFPU() before executing
+    any floating point instructions. */
+    *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT;
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+static void prvTaskExitError( void )
+{
+    /* A function that implements a task must not exit or attempt to return to
+    its caller as there is nothing to return to.  If a task wants to exit it
+    should instead call vTaskDelete( NULL ).
+
+    Artificially force an assert() to be triggered if configASSERT() is
+    defined, then stop here so application writers can catch the error. */
+    configASSERT( ulPortInterruptNesting == ~0UL );
+    portDISABLE_INTERRUPTS();
+    for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+uint32_t ulAPSR;
+
+    /* Only continue if the CPU is not in User mode.  The CPU must be in a
+    Privileged mode for the scheduler to start. */
+    __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) );
+    ulAPSR &= portAPSR_MODE_BITS_MASK;
+    configASSERT( ulAPSR != portAPSR_USER_MODE );
+
+    if( ulAPSR != portAPSR_USER_MODE )
+    {
+        /* Start the timer that generates the tick ISR. */
+        configSETUP_TICK_INTERRUPT();
+        vPortRestoreTaskContext();
+    }
+
+    /* Will only get here if vTaskStartScheduler() was called with the CPU in
+    a non-privileged mode or the binary point register was not set to its lowest
+    possible value. */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+    Artificially force an assert. */
+    configASSERT( ulCriticalNesting == 1000UL );
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    portDISABLE_INTERRUPTS();
+
+    /* Now interrupts are disabled ulCriticalNesting can be accessed
+    directly.  Increment ulCriticalNesting to keep a count of how many times
+    portENTER_CRITICAL() has been called. */
+    ulCriticalNesting++;
+
+    /* This is not the interrupt safe version of the enter critical function so
+    assert() if it is being called from an interrupt context.  Only API
+    functions that end in "FromISR" can be used in an interrupt.  Only assert if
+    the critical nesting count is 1 to protect against recursive calls if the
+    assert function also uses a critical section. */
+    if( ulCriticalNesting == 1 )
+    {
+        configASSERT( ulPortInterruptNesting == 0 );
+    }
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
+    {
+        /* Decrement the nesting count as the critical section is being
+        exited. */
+        ulCriticalNesting--;
+
+        /* If the nesting level has reached zero then all interrupt
+        priorities must be re-enabled. */
+        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
+        {
+            /* Critical nesting has reached zero so all interrupt priorities
+            should be unmasked. */
+            portENABLE_INTERRUPTS();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+void FreeRTOS_Tick_Handler( void )
+{
+    portDISABLE_INTERRUPTS();
+
+    /* Increment the RTOS tick. */
+    if( xTaskIncrementTick() != pdFALSE )
+    {
+        ulPortYieldRequired = pdTRUE;
+    }
+
+    portENABLE_INTERRUPTS();
+    configCLEAR_TICK_INTERRUPT();
+}
+/*-----------------------------------------------------------*/
+
+void vPortTaskUsesFPU( void )
+{
+uint32_t ulInitialFPSCR = 0;
+
+    /* A task is registering the fact that it needs an FPU context.  Set the
+    FPU flag (which is saved as part of the task context). */
+    ulPortTaskHasFPUContext = pdTRUE;
+
+    /* Initialise the floating point status register. */
+    __asm( "FMXR    FPSCR, %0" :: "r" (ulInitialFPSCR) );
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CA5_No_GIC/portASM.h b/portable/IAR/ARM_CA5_No_GIC/portASM.h
index de22451..1a9006d 100644
--- a/portable/IAR/ARM_CA5_No_GIC/portASM.h
+++ b/portable/IAR/ARM_CA5_No_GIC/portASM.h
@@ -1,114 +1,109 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-	EXTERN	vTaskSwitchContext

-	EXTERN  ulCriticalNesting

-	EXTERN	pxCurrentTCB

-	EXTERN	ulPortTaskHasFPUContext

-	EXTERN  ulAsmAPIPriorityMask

-

-portSAVE_CONTEXT macro

-

-	; Save the LR and SPSR onto the system mode stack before switching to

-	; system mode to save the remaining system mode registers

-	SRSDB	sp!, #SYS_MODE

-	CPS		#SYS_MODE

-	PUSH	{R0-R12, R14}

-

-	; Push the critical nesting count

-	LDR		R2, =ulCriticalNesting

-	LDR		R1, [R2]

-	PUSH	{R1}

-

-	; Does the task have a floating point context that needs saving?  If

-	; ulPortTaskHasFPUContext is 0 then no.

-	LDR		R2, =ulPortTaskHasFPUContext

-	LDR		R3, [R2]

-	CMP		R3, #0

-

-	; Save the floating point context, if any

-	FMRXNE  R1,  FPSCR

-	VPUSHNE {D0-D15}

-#if configFPU_D32 == 1

-	VPUSHNE	{D16-D31}

-#endif ; configFPU_D32

-	PUSHNE	{R1}

-

-	; Save ulPortTaskHasFPUContext itself

-	PUSH	{R3}

-

-	; Save the stack pointer in the TCB

-	LDR		R0, =pxCurrentTCB

-	LDR		R1, [R0]

-	STR		SP, [R1]

-

-	endm

-

-; /**********************************************************************/

-

-portRESTORE_CONTEXT macro

-

-	; Set the SP to point to the stack of the task being restored.

-	LDR		R0, =pxCurrentTCB

-	LDR		R1, [R0]

-	LDR		SP, [R1]

-

-	; Is there a floating point context to restore?  If the restored

-	; ulPortTaskHasFPUContext is zero then no.

-	LDR		R0, =ulPortTaskHasFPUContext

-	POP		{R1}

-	STR		R1, [R0]

-	CMP		R1, #0

-

-	; Restore the floating point context, if any

-	POPNE 	{R0}

-#if configFPU_D32 == 1

-	VPOPNE	{D16-D31}

-#endif ; configFPU_D32

-	VPOPNE	{D0-D15}

-	VMSRNE  FPSCR, R0

-

-	; Restore the critical section nesting depth

-	LDR		R0, =ulCriticalNesting

-	POP		{R1}

-	STR		R1, [R0]

-

-	; Restore all system mode registers other than the SP (which is already

-	; being used)

-	POP		{R0-R12, R14}

-

-	; Return to the task code, loading CPSR on the way.  CPSR has the interrupt

-	; enable bit set appropriately for the task about to execute.

-	RFEIA	sp!

-

-	endm

-

-

-

-

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+    EXTERN  vTaskSwitchContext
+    EXTERN  ulCriticalNesting
+    EXTERN  pxCurrentTCB
+    EXTERN  ulPortTaskHasFPUContext
+    EXTERN  ulAsmAPIPriorityMask
+
+portSAVE_CONTEXT macro
+
+    ; Save the LR and SPSR onto the system mode stack before switching to
+    ; system mode to save the remaining system mode registers
+    SRSDB   sp!, #SYS_MODE
+    CPS     #SYS_MODE
+    PUSH    {R0-R12, R14}
+
+    ; Push the critical nesting count
+    LDR     R2, =ulCriticalNesting
+    LDR     R1, [R2]
+    PUSH    {R1}
+
+    ; Does the task have a floating point context that needs saving?  If
+    ; ulPortTaskHasFPUContext is 0 then no.
+    LDR     R2, =ulPortTaskHasFPUContext
+    LDR     R3, [R2]
+    CMP     R3, #0
+
+    ; Save the floating point context, if any
+    FMRXNE  R1,  FPSCR
+    VPUSHNE {D0-D15}
+#if configFPU_D32 == 1
+    VPUSHNE {D16-D31}
+#endif ; configFPU_D32
+    PUSHNE  {R1}
+
+    ; Save ulPortTaskHasFPUContext itself
+    PUSH    {R3}
+
+    ; Save the stack pointer in the TCB
+    LDR     R0, =pxCurrentTCB
+    LDR     R1, [R0]
+    STR     SP, [R1]
+
+    endm
+
+; /**********************************************************************/
+
+portRESTORE_CONTEXT macro
+
+    ; Set the SP to point to the stack of the task being restored.
+    LDR     R0, =pxCurrentTCB
+    LDR     R1, [R0]
+    LDR     SP, [R1]
+
+    ; Is there a floating point context to restore?  If the restored
+    ; ulPortTaskHasFPUContext is zero then no.
+    LDR     R0, =ulPortTaskHasFPUContext
+    POP     {R1}
+    STR     R1, [R0]
+    CMP     R1, #0
+
+    ; Restore the floating point context, if any
+    POPNE   {R0}
+#if configFPU_D32 == 1
+    VPOPNE  {D16-D31}
+#endif ; configFPU_D32
+    VPOPNE  {D0-D15}
+    VMSRNE  FPSCR, R0
+
+    ; Restore the critical section nesting depth
+    LDR     R0, =ulCriticalNesting
+    POP     {R1}
+    STR     R1, [R0]
+
+    ; Restore all system mode registers other than the SP (which is already
+    ; being used)
+    POP     {R0-R12, R14}
+
+    ; Return to the task code, loading CPSR on the way.  CPSR has the interrupt
+    ; enable bit set appropriately for the task about to execute.
+    RFEIA   sp!
+
+    endm
diff --git a/portable/IAR/ARM_CA5_No_GIC/portASM.s b/portable/IAR/ARM_CA5_No_GIC/portASM.s
index d18eb3a..8edcb6c 100644
--- a/portable/IAR/ARM_CA5_No_GIC/portASM.s
+++ b/portable/IAR/ARM_CA5_No_GIC/portASM.s
@@ -1,177 +1,173 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-	INCLUDE FreeRTOSConfig.h

-	INCLUDE portmacro.h

-

-	EXTERN	vTaskSwitchContext

-	EXTERN	ulPortYieldRequired

-	EXTERN	ulPortInterruptNesting

-	EXTERN	vApplicationIRQHandler

-

-	PUBLIC	FreeRTOS_SWI_Handler

-	PUBLIC  FreeRTOS_IRQ_Handler

-	PUBLIC 	vPortRestoreTaskContext

-

-SYS_MODE			EQU		0x1f

-SVC_MODE			EQU		0x13

-IRQ_MODE			EQU		0x12

-

-	SECTION .text:CODE:ROOT(2)

-	ARM

-

-	INCLUDE portASM.h

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; SVC handler is used to yield a task.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-FreeRTOS_SWI_Handler

-

-	PRESERVE8

-

-	; Save the context of the current task and select a new task to run.

-	portSAVE_CONTEXT

-	LDR R0, =vTaskSwitchContext

-	BLX	R0

-	portRESTORE_CONTEXT

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; vPortRestoreTaskContext is used to start the scheduler.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortRestoreTaskContext

-

-	PRESERVE8

-

-	; Switch to system mode

-	CPS		#SYS_MODE

-	portRESTORE_CONTEXT

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; IRQ interrupt handler used when individual priorities cannot be masked

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-FreeRTOS_IRQ_Handler

-

-	PRESERVE8

-

-	; Return to the interrupted instruction.

-	SUB		lr, lr, #4

-

-	; Push the return address and SPSR

-	PUSH	{lr}

-	MRS		lr, SPSR

-	PUSH	{lr}

-

-	; Change to supervisor mode to allow reentry.

-	CPS		#SVC_MODE

-

-	; Push used registers.

-	PUSH	{r0-r4, r12}

-

-	; Increment nesting count.  r3 holds the address of ulPortInterruptNesting

-	; for future use.  r1 holds the original ulPortInterruptNesting value for

-	; future use.

-	LDR		r3, =ulPortInterruptNesting

-	LDR		r1, [r3]

-	ADD		r4, r1, #1

-	STR		r4, [r3]

-

-	; Ensure bit 2 of the stack pointer is clear.  r2 holds the bit 2 value for

-	; future use.

-	MOV		r2, sp

-	AND		r2, r2, #4

-	SUB		sp, sp, r2

-

-	PUSH	{r0-r4, lr}

-

-	; Call the port part specific handler.

-	LDR		r0, =vApplicationIRQHandler

-	BLX		r0

-	POP		{r0-r4, lr}

-	ADD		sp, sp, r2

-

-	CPSID	i

-

-	; Write to the EOI register.

-	LDR 	r4, =configEOI_ADDRESS

-	STR		r0, [r4]

-

-	; Restore the old nesting count

-	STR		r1, [r3]

-

-	; A context switch is never performed if the nesting count is not 0.

-	CMP		r1, #0

-	BNE		exit_without_switch

-

-	; Did the interrupt request a context switch?  r1 holds the address of

-	; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future

-	; use.

-	LDR		r1, =ulPortYieldRequired

-	LDR		r0, [r1]

-	CMP		r0, #0

-	BNE		switch_before_exit

-

-exit_without_switch

-	; No context switch.  Restore used registers, LR_irq and SPSR before

-	; returning.

-	POP		{r0-r4, r12}

-	CPS		#IRQ_MODE

-	POP		{LR}

-	MSR		SPSR_cxsf, LR

-	POP		{LR}

-	MOVS	PC, LR

-

-switch_before_exit

-	; A context switch is to be performed.  Clear the context switch pending

-	; flag.

-	MOV		r0, #0

-	STR		r0, [r1]

-

-	; Restore used registers, LR-irq and SPSR before saving the context

-	; to the task stack.

-	POP		{r0-r4, r12}

-	CPS		#IRQ_MODE

-	POP		{LR}

-	MSR		SPSR_cxsf, LR

-	POP		{LR}

-	portSAVE_CONTEXT

-

-	; Call the function that selects the new task to execute.

-	; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD

-	; instructions, or 8 byte aligned stack allocated data.  LR does not need

-	; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway.

-	LDR		r0, =vTaskSwitchContext

-	BLX		r0

-

-	; Restore the context of, and branch to, the task selected to execute next.

-	portRESTORE_CONTEXT

-

-	END

-

-

-

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+    INCLUDE FreeRTOSConfig.h
+    INCLUDE portmacro.h
+
+    EXTERN  vTaskSwitchContext
+    EXTERN  ulPortYieldRequired
+    EXTERN  ulPortInterruptNesting
+    EXTERN  vApplicationIRQHandler
+
+    PUBLIC  FreeRTOS_SWI_Handler
+    PUBLIC  FreeRTOS_IRQ_Handler
+    PUBLIC  vPortRestoreTaskContext
+
+SYS_MODE            EQU     0x1f
+SVC_MODE            EQU     0x13
+IRQ_MODE            EQU     0x12
+
+    SECTION .text:CODE:ROOT(2)
+    ARM
+
+    INCLUDE portASM.h
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; SVC handler is used to yield a task.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+FreeRTOS_SWI_Handler
+
+    PRESERVE8
+
+    ; Save the context of the current task and select a new task to run.
+    portSAVE_CONTEXT
+    LDR R0, =vTaskSwitchContext
+    BLX R0
+    portRESTORE_CONTEXT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; vPortRestoreTaskContext is used to start the scheduler.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortRestoreTaskContext
+
+    PRESERVE8
+
+    ; Switch to system mode
+    CPS     #SYS_MODE
+    portRESTORE_CONTEXT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; IRQ interrupt handler used when individual priorities cannot be masked
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+FreeRTOS_IRQ_Handler
+
+    PRESERVE8
+
+    ; Return to the interrupted instruction.
+    SUB     lr, lr, #4
+
+    ; Push the return address and SPSR
+    PUSH    {lr}
+    MRS     lr, SPSR
+    PUSH    {lr}
+
+    ; Change to supervisor mode to allow reentry.
+    CPS     #SVC_MODE
+
+    ; Push used registers.
+    PUSH    {r0-r4, r12}
+
+    ; Increment nesting count.  r3 holds the address of ulPortInterruptNesting
+    ; for future use.  r1 holds the original ulPortInterruptNesting value for
+    ; future use.
+    LDR     r3, =ulPortInterruptNesting
+    LDR     r1, [r3]
+    ADD     r4, r1, #1
+    STR     r4, [r3]
+
+    ; Ensure bit 2 of the stack pointer is clear.  r2 holds the bit 2 value for
+    ; future use.
+    MOV     r2, sp
+    AND     r2, r2, #4
+    SUB     sp, sp, r2
+
+    PUSH    {r0-r4, lr}
+
+    ; Call the port part specific handler.
+    LDR     r0, =vApplicationIRQHandler
+    BLX     r0
+    POP     {r0-r4, lr}
+    ADD     sp, sp, r2
+
+    CPSID   i
+
+    ; Write to the EOI register.
+    LDR     r4, =configEOI_ADDRESS
+    STR     r0, [r4]
+
+    ; Restore the old nesting count
+    STR     r1, [r3]
+
+    ; A context switch is never performed if the nesting count is not 0.
+    CMP     r1, #0
+    BNE     exit_without_switch
+
+    ; Did the interrupt request a context switch?  r1 holds the address of
+    ; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future
+    ; use.
+    LDR     r1, =ulPortYieldRequired
+    LDR     r0, [r1]
+    CMP     r0, #0
+    BNE     switch_before_exit
+
+exit_without_switch
+    ; No context switch.  Restore used registers, LR_irq and SPSR before
+    ; returning.
+    POP     {r0-r4, r12}
+    CPS     #IRQ_MODE
+    POP     {LR}
+    MSR     SPSR_cxsf, LR
+    POP     {LR}
+    MOVS    PC, LR
+
+switch_before_exit
+    ; A context switch is to be performed.  Clear the context switch pending
+    ; flag.
+    MOV     r0, #0
+    STR     r0, [r1]
+
+    ; Restore used registers, LR-irq and SPSR before saving the context
+    ; to the task stack.
+    POP     {r0-r4, r12}
+    CPS     #IRQ_MODE
+    POP     {LR}
+    MSR     SPSR_cxsf, LR
+    POP     {LR}
+    portSAVE_CONTEXT
+
+    ; Call the function that selects the new task to execute.
+    ; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD
+    ; instructions, or 8 byte aligned stack allocated data.  LR does not need
+    ; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway.
+    LDR     r0, =vTaskSwitchContext
+    BLX     r0
+
+    ; Restore the context of, and branch to, the task selected to execute next.
+    portRESTORE_CONTEXT
+
+    END
diff --git a/portable/IAR/ARM_CA5_No_GIC/portmacro.h b/portable/IAR/ARM_CA5_No_GIC/portmacro.h
index 0b903e5..3d73f83 100644
--- a/portable/IAR/ARM_CA5_No_GIC/portmacro.h
+++ b/portable/IAR/ARM_CA5_No_GIC/portmacro.h
@@ -1,163 +1,162 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-/* IAR includes. */

-#ifdef __ICCARM__

-

-	#include <intrinsics.h>

-

-	#ifdef __cplusplus

-		extern "C" {

-	#endif

-

-	/*-----------------------------------------------------------

-	 * Port specific definitions.

-	 *

-	 * The settings in this file configure FreeRTOS correctly for the given hardware

-	 * and compiler.

-	 *

-	 * These settings should not be altered.

-	 *-----------------------------------------------------------

-	 */

-

-	/* Type definitions. */

-	#define portCHAR		char

-	#define portFLOAT		float

-	#define portDOUBLE		double

-	#define portLONG		long

-	#define portSHORT		short

-	#define portSTACK_TYPE	uint32_t

-	#define portBASE_TYPE	long

-

-	typedef portSTACK_TYPE StackType_t;

-	typedef long BaseType_t;

-	typedef unsigned long UBaseType_t;

-

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-

-	/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

-	not need to be guarded with a critical section. */

-	#define portTICK_TYPE_IS_ATOMIC 1

-

-	/*-----------------------------------------------------------*/

-

-	/* Hardware specifics. */

-	#define portSTACK_GROWTH			( -1 )

-	#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-	#define portBYTE_ALIGNMENT			8

-

-	/*-----------------------------------------------------------*/

-

-	/* Task utilities. */

-

-	/* Called at the end of an ISR that can cause a context switch. */

-	#define portEND_SWITCHING_ISR( xSwitchRequired )\

-	{												\

-	extern uint32_t ulPortYieldRequired;			\

-													\

-		if( xSwitchRequired != pdFALSE )			\

-		{											\

-			ulPortYieldRequired = pdTRUE;			\

-		}											\

-	}

-

-	#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )

-	#define portYIELD() __asm volatile ( "SWI 0" ); __ISB()

-

-

-	/*-----------------------------------------------------------

-	 * Critical section control

-	 *----------------------------------------------------------*/

-

-	extern void vPortEnterCritical( void );

-	extern void vPortExitCritical( void );

-	extern uint32_t ulPortSetInterruptMask( void );

-	extern void vPortClearInterruptMask( uint32_t ulNewMaskValue );

-

-	#define portENTER_CRITICAL()		vPortEnterCritical();

-	#define portEXIT_CRITICAL()			vPortExitCritical();

-	#define portDISABLE_INTERRUPTS()	__disable_irq(); __DSB(); __ISB() /* No priority mask register so global disable is used. */

-	#define portENABLE_INTERRUPTS()		__enable_irq()

-	#define portSET_INTERRUPT_MASK_FROM_ISR()		__get_interrupt_state(); __disable_irq() /* No priority mask register so global disable is used. */

-	#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)	__set_interrupt_state(x)

-

-	/*-----------------------------------------------------------*/

-

-	/* Task function macros as described on the FreeRTOS.org WEB site.  These are

-	not required for this port but included in case common demo code that uses these

-	macros is used. */

-	#define portTASK_FUNCTION_PROTO( vFunction, pvParameters )	void vFunction( void *pvParameters )

-	#define portTASK_FUNCTION( vFunction, pvParameters )	void vFunction( void *pvParameters )

-

-	/* Prototype of the FreeRTOS tick handler.  This must be installed as the

-	handler for whichever peripheral is used to generate the RTOS tick. */

-	void FreeRTOS_Tick_Handler( void );

-

-	/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU()

-	before any floating point instructions are executed. */

-	void vPortTaskUsesFPU( void );

-	#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU()

-

-	/* Architecture specific optimisations. */

-	#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

-		#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1

-	#endif

-

-	#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1

-

-		/* Store/clear the ready priorities in a bit map. */

-		#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

-		#define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

-

-		/*-----------------------------------------------------------*/

-

-		#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __CLZ( uxReadyPriorities ) )

-

-	#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-

-	#define portNOP() __asm volatile( "NOP" )

-

-

-	#ifdef __cplusplus

-		} /* extern C */

-	#endif

-

-	/* Suppress warnings that are generated by the IAR tools, but cannot be

-	fixed in the source code because to do so would cause other compilers to

-	generate warnings. */

-	#pragma diag_suppress=Pe191

-	#pragma diag_suppress=Pa082

-

-#endif /* __ICCARM__ */

-

-#endif /* PORTMACRO_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+/* IAR includes. */
+#ifdef __ICCARM__
+
+    #include <intrinsics.h>
+
+    #ifdef __cplusplus
+        extern "C" {
+    #endif
+
+    /*-----------------------------------------------------------
+     * Port specific definitions.
+     *
+     * The settings in this file configure FreeRTOS correctly for the given hardware
+     * and compiler.
+     *
+     * These settings should not be altered.
+     *-----------------------------------------------------------
+     */
+
+    /* Type definitions. */
+    #define portCHAR        char
+    #define portFLOAT       float
+    #define portDOUBLE      double
+    #define portLONG        long
+    #define portSHORT       short
+    #define portSTACK_TYPE  uint32_t
+    #define portBASE_TYPE   long
+
+    typedef portSTACK_TYPE StackType_t;
+    typedef long BaseType_t;
+    typedef unsigned long UBaseType_t;
+
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+
+    /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+    not need to be guarded with a critical section. */
+    #define portTICK_TYPE_IS_ATOMIC 1
+
+    /*-----------------------------------------------------------*/
+
+    /* Hardware specifics. */
+    #define portSTACK_GROWTH            ( -1 )
+    #define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+    #define portBYTE_ALIGNMENT          8
+
+    /*-----------------------------------------------------------*/
+
+    /* Task utilities. */
+
+    /* Called at the end of an ISR that can cause a context switch. */
+    #define portEND_SWITCHING_ISR( xSwitchRequired )\
+    {                                               \
+    extern uint32_t ulPortYieldRequired;            \
+                                                    \
+        if( xSwitchRequired != pdFALSE )            \
+        {                                           \
+            ulPortYieldRequired = pdTRUE;           \
+        }                                           \
+    }
+
+    #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
+    #define portYIELD() __asm volatile ( "SWI 0" ); __ISB()
+
+
+    /*-----------------------------------------------------------
+     * Critical section control
+     *----------------------------------------------------------*/
+
+    extern void vPortEnterCritical( void );
+    extern void vPortExitCritical( void );
+    extern uint32_t ulPortSetInterruptMask( void );
+    extern void vPortClearInterruptMask( uint32_t ulNewMaskValue );
+
+    #define portENTER_CRITICAL()        vPortEnterCritical();
+    #define portEXIT_CRITICAL()         vPortExitCritical();
+    #define portDISABLE_INTERRUPTS()    __disable_irq(); __DSB(); __ISB() /* No priority mask register so global disable is used. */
+    #define portENABLE_INTERRUPTS()     __enable_irq()
+    #define portSET_INTERRUPT_MASK_FROM_ISR()       __get_interrupt_state(); __disable_irq() /* No priority mask register so global disable is used. */
+    #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)    __set_interrupt_state(x)
+
+    /*-----------------------------------------------------------*/
+
+    /* Task function macros as described on the FreeRTOS.org WEB site.  These are
+    not required for this port but included in case common demo code that uses these
+    macros is used. */
+    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )  void vFunction( void *pvParameters )
+    #define portTASK_FUNCTION( vFunction, pvParameters )    void vFunction( void *pvParameters )
+
+    /* Prototype of the FreeRTOS tick handler.  This must be installed as the
+    handler for whichever peripheral is used to generate the RTOS tick. */
+    void FreeRTOS_Tick_Handler( void );
+
+    /* Any task that uses the floating point unit MUST call vPortTaskUsesFPU()
+    before any floating point instructions are executed. */
+    void vPortTaskUsesFPU( void );
+    #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU()
+
+    /* Architecture specific optimisations. */
+    #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
+        #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
+    #endif
+
+    #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
+
+        /* Store/clear the ready priorities in a bit map. */
+        #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
+        #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
+
+        /*-----------------------------------------------------------*/
+
+        #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __CLZ( uxReadyPriorities ) )
+
+    #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+
+    #define portNOP() __asm volatile( "NOP" )
+
+
+    #ifdef __cplusplus
+        } /* extern C */
+    #endif
+
+    /* Suppress warnings that are generated by the IAR tools, but cannot be
+    fixed in the source code because to do so would cause other compilers to
+    generate warnings. */
+    #pragma diag_suppress=Pe191
+    #pragma diag_suppress=Pa082
+
+#endif /* __ICCARM__ */
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CA9/port.c b/portable/IAR/ARM_CA9/port.c
index 1c6ffe8..aa6fcf8 100644
--- a/portable/IAR/ARM_CA9/port.c
+++ b/portable/IAR/ARM_CA9/port.c
@@ -1,440 +1,438 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Standard includes. */

-#include <stdlib.h>

-

-/* IAR includes. */

-#include <intrinsics.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS

-	#error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html

-#endif

-

-#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET

-	#error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html

-#endif

-

-#ifndef configUNIQUE_INTERRUPT_PRIORITIES

-	#error configUNIQUE_INTERRUPT_PRIORITIES must be defined.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html

-#endif

-

-#ifndef configSETUP_TICK_INTERRUPT

-	#error configSETUP_TICK_INTERRUPT() must be defined.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html

-#endif /* configSETUP_TICK_INTERRUPT */

-

-#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY

-	#error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html

-#endif

-

-#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0

-	#error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0

-#endif

-

-#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES

-	#error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority

-#endif

-

-#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1

-	/* Check the configuration. */

-	#if( configMAX_PRIORITIES > 32 )

-		#error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.

-	#endif

-#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-

-/* In case security extensions are implemented. */

-#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 )

-	#error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 )

-#endif

-

-#ifndef configCLEAR_TICK_INTERRUPT

-	#define configCLEAR_TICK_INTERRUPT()

-#endif

-

-/* A critical section is exited when the critical section nesting count reaches

-this value. */

-#define portNO_CRITICAL_NESTING			( ( uint32_t ) 0 )

-

-/* In all GICs 255 can be written to the priority mask register to unmask all

-(but the lowest) interrupt priority. */

-#define portUNMASK_VALUE				( 0xFFUL )

-

-/* Tasks are not created with a floating point context, but can be given a

-floating point context after they have been created.  A variable is stored as

-part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task

-does not have an FPU context, or any other value if the task does have an FPU

-context. */

-#define portNO_FLOATING_POINT_CONTEXT	( ( StackType_t ) 0 )

-

-/* Constants required to setup the initial task context. */

-#define portINITIAL_SPSR				( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */

-#define portTHUMB_MODE_BIT				( ( StackType_t ) 0x20 )

-#define portTHUMB_MODE_ADDRESS			( 0x01UL )

-

-/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary

-point is zero. */

-#define portBINARY_POINT_BITS			( ( uint8_t ) 0x03 )

-

-/* Masks all bits in the APSR other than the mode bits. */

-#define portAPSR_MODE_BITS_MASK			( 0x1F )

-

-/* The value of the mode bits in the APSR when the CPU is executing in user

-mode. */

-#define portAPSR_USER_MODE				( 0x10 )

-

-/* Macro to unmask all interrupt priorities. */

-#define portCLEAR_INTERRUPT_MASK()											\

-{																			\

-	__disable_irq();														\

-	portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE;					\

-	__asm(	"DSB		\n"													\

-			"ISB		\n" );												\

-	__enable_irq();															\

-}

-

-/*-----------------------------------------------------------*/

-

-/*

- * Starts the first task executing.  This function is necessarily written in

- * assembly code so is implemented in portASM.s.

- */

-extern void vPortRestoreTaskContext( void );

-

-/*

- * Used to catch tasks that attempt to return from their implementing function.

- */

-static void prvTaskExitError( void );

-

-/*-----------------------------------------------------------*/

-

-/* A variable is used to keep track of the critical section nesting.  This

-variable has to be stored as part of the task context and must be initialised to

-a non zero value to ensure interrupts don't inadvertently become unmasked before

-the scheduler starts.  As it is stored as part of the task context it will

-automatically be set to 0 when the first task is started. */

-volatile uint32_t ulCriticalNesting = 9999UL;

-

-/* Saved as part of the task context.  If ulPortTaskHasFPUContext is non-zero

-then a floating point context must be saved and restored for the task. */

-uint32_t ulPortTaskHasFPUContext = pdFALSE;

-

-/* Set to 1 to pend a context switch from an ISR. */

-uint32_t ulPortYieldRequired = pdFALSE;

-

-/* Counts the interrupt nesting depth.  A context switch is only performed if

-if the nesting depth is 0. */

-uint32_t ulPortInterruptNesting = 0UL;

-

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-	/* Setup the initial stack of the task.  The stack is set exactly as

-	expected by the portRESTORE_CONTEXT() macro.

-

-	The fist real value on the stack is the status register, which is set for

-	system mode, with interrupts enabled.  A few NULLs are added first to ensure

-	GDB does not try decoding a non-existent return address. */

-	*pxTopOfStack = NULL;

-	pxTopOfStack--;

-	*pxTopOfStack = NULL;

-	pxTopOfStack--;

-	*pxTopOfStack = NULL;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;

-

-	if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL )

-	{

-		/* The task will start in THUMB mode. */

-		*pxTopOfStack |= portTHUMB_MODE_BIT;

-	}

-

-	pxTopOfStack--;

-

-	/* Next the return address, which in this case is the start of the task. */

-	*pxTopOfStack = ( StackType_t ) pxCode;

-	pxTopOfStack--;

-

-	/* Next all the registers other than the stack pointer. */

-	*pxTopOfStack = ( StackType_t ) prvTaskExitError;	/* R14 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12121212;	/* R12 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x11111111;	/* R11 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x10101010;	/* R10 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x09090909;	/* R9 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x08080808;	/* R8 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x07070707;	/* R7 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x06060606;	/* R6 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x05050505;	/* R5 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x04040404;	/* R4 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x03030303;	/* R3 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x02020202;	/* R2 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x01010101;	/* R1 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-	pxTopOfStack--;

-

-	/* The task will start with a critical nesting count of 0 as interrupts are

-	enabled. */

-	*pxTopOfStack = portNO_CRITICAL_NESTING;

-	pxTopOfStack--;

-

-	/* The task will start without a floating point context.  A task that uses

-	the floating point hardware must call vPortTaskUsesFPU() before executing

-	any floating point instructions. */

-	*pxTopOfStack = portNO_FLOATING_POINT_CONTEXT;

-

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-static void prvTaskExitError( void )

-{

-	/* A function that implements a task must not exit or attempt to return to

-	its caller as there is nothing to return to.  If a task wants to exit it

-	should instead call vTaskDelete( NULL ).

-

-	Artificially force an assert() to be triggered if configASSERT() is

-	defined, then stop here so application writers can catch the error. */

-	configASSERT( ulPortInterruptNesting == ~0UL );

-	portDISABLE_INTERRUPTS();

-	for( ;; );

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-uint32_t ulAPSR;

-

-	/* Only continue if the CPU is not in User mode.  The CPU must be in a

-	Privileged mode for the scheduler to start. */

-	__asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) );

-	ulAPSR &= portAPSR_MODE_BITS_MASK;

-	configASSERT( ulAPSR != portAPSR_USER_MODE );

-

-	if( ulAPSR != portAPSR_USER_MODE )

-	{

-		/* Only continue if the binary point value is set to its lowest possible

-		setting.  See the comments in vPortValidateInterruptPriority() below for

-		more information. */

-		configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE );

-

-		if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE )

-		{

-			/* Start the timer that generates the tick ISR. */

-			configSETUP_TICK_INTERRUPT();

-

-			__enable_irq();

-			vPortRestoreTaskContext();

-		}

-	}

-

-	/* Will only get here if vTaskStartScheduler() was called with the CPU in

-	a non-privileged mode or the binary point register was not set to its lowest

-	possible value. */

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* Not implemented in ports where there is nothing to return to.

-	Artificially force an assert. */

-	configASSERT( ulCriticalNesting == 1000UL );

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-	/* Disable interrupts as per portDISABLE_INTERRUPTS(); 	*/

-	ulPortSetInterruptMask();

-

-	/* Now interrupts are disabled ulCriticalNesting can be accessed

-	directly.  Increment ulCriticalNesting to keep a count of how many times

-	portENTER_CRITICAL() has been called. */

-	ulCriticalNesting++;

-	

-	/* This is not the interrupt safe version of the enter critical function so

-	assert() if it is being called from an interrupt context.  Only API 

-	functions that end in "FromISR" can be used in an interrupt.  Only assert if

-	the critical nesting count is 1 to protect against recursive calls if the

-	assert function also uses a critical section. */

-	if( ulCriticalNesting == 1 )

-	{

-		configASSERT( ulPortInterruptNesting == 0 );

-	}

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-	if( ulCriticalNesting > portNO_CRITICAL_NESTING )

-	{

-		/* Decrement the nesting count as the critical section is being

-		exited. */

-		ulCriticalNesting--;

-

-		/* If the nesting level has reached zero then all interrupt

-		priorities must be re-enabled. */

-		if( ulCriticalNesting == portNO_CRITICAL_NESTING )

-		{

-			/* Critical nesting has reached zero so all interrupt priorities

-			should be unmasked. */

-			portCLEAR_INTERRUPT_MASK();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-void FreeRTOS_Tick_Handler( void )

-{

-	/* Set interrupt mask before altering scheduler structures.   The tick

-	handler runs at the lowest priority, so interrupts cannot already be masked,

-	so there is no need to save and restore the current mask value. */

-	__disable_irq();

-	portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT );

-	__asm(	"DSB		\n"

-			"ISB		\n" );

-	__enable_irq();

-

-	/* Increment the RTOS tick. */

-	if( xTaskIncrementTick() != pdFALSE )

-	{

-		ulPortYieldRequired = pdTRUE;

-	}

-

-	/* Ensure all interrupt priorities are active again. */

-	portCLEAR_INTERRUPT_MASK();

-	configCLEAR_TICK_INTERRUPT();

-}

-/*-----------------------------------------------------------*/

-

-void vPortTaskUsesFPU( void )

-{

-uint32_t ulInitialFPSCR = 0;

-

-	/* A task is registering the fact that it needs an FPU context.  Set the

-	FPU flag (which is saved as part of the task context). */

-	ulPortTaskHasFPUContext = pdTRUE;

-

-	/* Initialise the floating point status register. */

-	__asm( "FMXR 	FPSCR, %0" :: "r" (ulInitialFPSCR) );

-}

-/*-----------------------------------------------------------*/

-

-void vPortClearInterruptMask( uint32_t ulNewMaskValue )

-{

-	if( ulNewMaskValue == pdFALSE )

-	{

-		portCLEAR_INTERRUPT_MASK();

-	}

-}

-/*-----------------------------------------------------------*/

-

-uint32_t ulPortSetInterruptMask( void )

-{

-uint32_t ulReturn;

-

-	__disable_irq();

-	if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) )

-	{

-		/* Interrupts were already masked. */

-		ulReturn = pdTRUE;

-	}

-	else

-	{

-		ulReturn = pdFALSE;

-		portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT );

-		__asm(	"DSB		\n"

-				"ISB		\n" );

-	}

-	__enable_irq();

-

-	return ulReturn;

-}

-/*-----------------------------------------------------------*/

-

-#if( configASSERT_DEFINED == 1 )

-

-	void vPortValidateInterruptPriority( void )

-	{

-		/* The following assertion will fail if a service routine (ISR) for

-		an interrupt that has been assigned a priority above

-		configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API

-		function.  ISR safe FreeRTOS API functions must *only* be called

-		from interrupts that have been assigned a priority at or below

-		configMAX_SYSCALL_INTERRUPT_PRIORITY.

-

-		Numerically low interrupt priority numbers represent logically high

-		interrupt priorities, therefore the priority of the interrupt must

-		be set to a value equal to or numerically *higher* than

-		configMAX_SYSCALL_INTERRUPT_PRIORITY.

-

-		FreeRTOS maintains separate thread and ISR API functions to ensure

-		interrupt entry is as fast and simple as possible.

-

-		The following links provide detailed information:

-		https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html

-		https://www.FreeRTOS.org/FAQHelp.html */

-		configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) );

-

-		/* Priority grouping:  The interrupt controller (GIC) allows the bits

-		that define each interrupt's priority to be split between bits that

-		define the interrupt's pre-emption priority bits and bits that define

-		the interrupt's sub-priority.  For simplicity all bits must be defined

-		to be pre-emption priority bits.  The following assertion will fail if

-		this is not the case (if some bits represent a sub-priority).

-

-		The priority grouping is configured by the GIC's binary point register

-		(ICCBPR).  Writting 0 to ICCBPR will ensure it is set to its lowest

-		possible value (which may be above 0). */

-		configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE );

-	}

-

-#endif /* configASSERT_DEFINED */

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Standard includes. */
+#include <stdlib.h>
+
+/* IAR includes. */
+#include <intrinsics.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS
+    #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html
+#endif
+
+#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET
+    #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html
+#endif
+
+#ifndef configUNIQUE_INTERRUPT_PRIORITIES
+    #error configUNIQUE_INTERRUPT_PRIORITIES must be defined.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html
+#endif
+
+#ifndef configSETUP_TICK_INTERRUPT
+    #error configSETUP_TICK_INTERRUPT() must be defined.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html
+#endif /* configSETUP_TICK_INTERRUPT */
+
+#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY
+    #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html
+#endif
+
+#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0
+    #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0
+#endif
+
+#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES
+    #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority
+#endif
+
+#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
+    /* Check the configuration. */
+    #if( configMAX_PRIORITIES > 32 )
+        #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.
+    #endif
+#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+
+/* In case security extensions are implemented. */
+#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 )
+    #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 )
+#endif
+
+#ifndef configCLEAR_TICK_INTERRUPT
+    #define configCLEAR_TICK_INTERRUPT()
+#endif
+
+/* A critical section is exited when the critical section nesting count reaches
+this value. */
+#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
+
+/* In all GICs 255 can be written to the priority mask register to unmask all
+(but the lowest) interrupt priority. */
+#define portUNMASK_VALUE                ( 0xFFUL )
+
+/* Tasks are not created with a floating point context, but can be given a
+floating point context after they have been created.  A variable is stored as
+part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task
+does not have an FPU context, or any other value if the task does have an FPU
+context. */
+#define portNO_FLOATING_POINT_CONTEXT   ( ( StackType_t ) 0 )
+
+/* Constants required to setup the initial task context. */
+#define portINITIAL_SPSR                ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */
+#define portTHUMB_MODE_BIT              ( ( StackType_t ) 0x20 )
+#define portTHUMB_MODE_ADDRESS          ( 0x01UL )
+
+/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary
+point is zero. */
+#define portBINARY_POINT_BITS           ( ( uint8_t ) 0x03 )
+
+/* Masks all bits in the APSR other than the mode bits. */
+#define portAPSR_MODE_BITS_MASK         ( 0x1F )
+
+/* The value of the mode bits in the APSR when the CPU is executing in user
+mode. */
+#define portAPSR_USER_MODE              ( 0x10 )
+
+/* Macro to unmask all interrupt priorities. */
+#define portCLEAR_INTERRUPT_MASK()                                          \
+{                                                                           \
+    __disable_irq();                                                        \
+    portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE;                   \
+    __asm(  "DSB        \n"                                                 \
+            "ISB        \n" );                                              \
+    __enable_irq();                                                         \
+}
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Starts the first task executing.  This function is necessarily written in
+ * assembly code so is implemented in portASM.s.
+ */
+extern void vPortRestoreTaskContext( void );
+
+/*
+ * Used to catch tasks that attempt to return from their implementing function.
+ */
+static void prvTaskExitError( void );
+
+/*-----------------------------------------------------------*/
+
+/* A variable is used to keep track of the critical section nesting.  This
+variable has to be stored as part of the task context and must be initialised to
+a non zero value to ensure interrupts don't inadvertently become unmasked before
+the scheduler starts.  As it is stored as part of the task context it will
+automatically be set to 0 when the first task is started. */
+volatile uint32_t ulCriticalNesting = 9999UL;
+
+/* Saved as part of the task context.  If ulPortTaskHasFPUContext is non-zero
+then a floating point context must be saved and restored for the task. */
+uint32_t ulPortTaskHasFPUContext = pdFALSE;
+
+/* Set to 1 to pend a context switch from an ISR. */
+uint32_t ulPortYieldRequired = pdFALSE;
+
+/* Counts the interrupt nesting depth.  A context switch is only performed if
+if the nesting depth is 0. */
+uint32_t ulPortInterruptNesting = 0UL;
+
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+    /* Setup the initial stack of the task.  The stack is set exactly as
+    expected by the portRESTORE_CONTEXT() macro.
+
+    The fist real value on the stack is the status register, which is set for
+    system mode, with interrupts enabled.  A few NULLs are added first to ensure
+    GDB does not try decoding a non-existent return address. */
+    *pxTopOfStack = NULL;
+    pxTopOfStack--;
+    *pxTopOfStack = NULL;
+    pxTopOfStack--;
+    *pxTopOfStack = NULL;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;
+
+    if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL )
+    {
+        /* The task will start in THUMB mode. */
+        *pxTopOfStack |= portTHUMB_MODE_BIT;
+    }
+
+    pxTopOfStack--;
+
+    /* Next the return address, which in this case is the start of the task. */
+    *pxTopOfStack = ( StackType_t ) pxCode;
+    pxTopOfStack--;
+
+    /* Next all the registers other than the stack pointer. */
+    *pxTopOfStack = ( StackType_t ) prvTaskExitError;   /* R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+    pxTopOfStack--;
+
+    /* The task will start with a critical nesting count of 0 as interrupts are
+    enabled. */
+    *pxTopOfStack = portNO_CRITICAL_NESTING;
+    pxTopOfStack--;
+
+    /* The task will start without a floating point context.  A task that uses
+    the floating point hardware must call vPortTaskUsesFPU() before executing
+    any floating point instructions. */
+    *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT;
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+static void prvTaskExitError( void )
+{
+    /* A function that implements a task must not exit or attempt to return to
+    its caller as there is nothing to return to.  If a task wants to exit it
+    should instead call vTaskDelete( NULL ).
+
+    Artificially force an assert() to be triggered if configASSERT() is
+    defined, then stop here so application writers can catch the error. */
+    configASSERT( ulPortInterruptNesting == ~0UL );
+    portDISABLE_INTERRUPTS();
+    for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+uint32_t ulAPSR;
+
+    /* Only continue if the CPU is not in User mode.  The CPU must be in a
+    Privileged mode for the scheduler to start. */
+    __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) );
+    ulAPSR &= portAPSR_MODE_BITS_MASK;
+    configASSERT( ulAPSR != portAPSR_USER_MODE );
+
+    if( ulAPSR != portAPSR_USER_MODE )
+    {
+        /* Only continue if the binary point value is set to its lowest possible
+        setting.  See the comments in vPortValidateInterruptPriority() below for
+        more information. */
+        configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE );
+
+        if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE )
+        {
+            /* Start the timer that generates the tick ISR. */
+            configSETUP_TICK_INTERRUPT();
+
+            __enable_irq();
+            vPortRestoreTaskContext();
+        }
+    }
+
+    /* Will only get here if vTaskStartScheduler() was called with the CPU in
+    a non-privileged mode or the binary point register was not set to its lowest
+    possible value. */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+    Artificially force an assert. */
+    configASSERT( ulCriticalNesting == 1000UL );
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    /* Disable interrupts as per portDISABLE_INTERRUPTS();  */
+    ulPortSetInterruptMask();
+
+    /* Now interrupts are disabled ulCriticalNesting can be accessed
+    directly.  Increment ulCriticalNesting to keep a count of how many times
+    portENTER_CRITICAL() has been called. */
+    ulCriticalNesting++;
+
+    /* This is not the interrupt safe version of the enter critical function so
+    assert() if it is being called from an interrupt context.  Only API
+    functions that end in "FromISR" can be used in an interrupt.  Only assert if
+    the critical nesting count is 1 to protect against recursive calls if the
+    assert function also uses a critical section. */
+    if( ulCriticalNesting == 1 )
+    {
+        configASSERT( ulPortInterruptNesting == 0 );
+    }
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
+    {
+        /* Decrement the nesting count as the critical section is being
+        exited. */
+        ulCriticalNesting--;
+
+        /* If the nesting level has reached zero then all interrupt
+        priorities must be re-enabled. */
+        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
+        {
+            /* Critical nesting has reached zero so all interrupt priorities
+            should be unmasked. */
+            portCLEAR_INTERRUPT_MASK();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+void FreeRTOS_Tick_Handler( void )
+{
+    /* Set interrupt mask before altering scheduler structures.   The tick
+    handler runs at the lowest priority, so interrupts cannot already be masked,
+    so there is no need to save and restore the current mask value. */
+    __disable_irq();
+    portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT );
+    __asm(  "DSB        \n"
+            "ISB        \n" );
+    __enable_irq();
+
+    /* Increment the RTOS tick. */
+    if( xTaskIncrementTick() != pdFALSE )
+    {
+        ulPortYieldRequired = pdTRUE;
+    }
+
+    /* Ensure all interrupt priorities are active again. */
+    portCLEAR_INTERRUPT_MASK();
+    configCLEAR_TICK_INTERRUPT();
+}
+/*-----------------------------------------------------------*/
+
+void vPortTaskUsesFPU( void )
+{
+uint32_t ulInitialFPSCR = 0;
+
+    /* A task is registering the fact that it needs an FPU context.  Set the
+    FPU flag (which is saved as part of the task context). */
+    ulPortTaskHasFPUContext = pdTRUE;
+
+    /* Initialise the floating point status register. */
+    __asm( "FMXR    FPSCR, %0" :: "r" (ulInitialFPSCR) );
+}
+/*-----------------------------------------------------------*/
+
+void vPortClearInterruptMask( uint32_t ulNewMaskValue )
+{
+    if( ulNewMaskValue == pdFALSE )
+    {
+        portCLEAR_INTERRUPT_MASK();
+    }
+}
+/*-----------------------------------------------------------*/
+
+uint32_t ulPortSetInterruptMask( void )
+{
+uint32_t ulReturn;
+
+    __disable_irq();
+    if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) )
+    {
+        /* Interrupts were already masked. */
+        ulReturn = pdTRUE;
+    }
+    else
+    {
+        ulReturn = pdFALSE;
+        portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT );
+        __asm(  "DSB        \n"
+                "ISB        \n" );
+    }
+    __enable_irq();
+
+    return ulReturn;
+}
+/*-----------------------------------------------------------*/
+
+#if( configASSERT_DEFINED == 1 )
+
+    void vPortValidateInterruptPriority( void )
+    {
+        /* The following assertion will fail if a service routine (ISR) for
+        an interrupt that has been assigned a priority above
+        configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API
+        function.  ISR safe FreeRTOS API functions must *only* be called
+        from interrupts that have been assigned a priority at or below
+        configMAX_SYSCALL_INTERRUPT_PRIORITY.
+
+        Numerically low interrupt priority numbers represent logically high
+        interrupt priorities, therefore the priority of the interrupt must
+        be set to a value equal to or numerically *higher* than
+        configMAX_SYSCALL_INTERRUPT_PRIORITY.
+
+        FreeRTOS maintains separate thread and ISR API functions to ensure
+        interrupt entry is as fast and simple as possible.
+
+        The following links provide detailed information:
+        https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
+        https://www.FreeRTOS.org/FAQHelp.html */
+        configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) );
+
+        /* Priority grouping:  The interrupt controller (GIC) allows the bits
+        that define each interrupt's priority to be split between bits that
+        define the interrupt's pre-emption priority bits and bits that define
+        the interrupt's sub-priority.  For simplicity all bits must be defined
+        to be pre-emption priority bits.  The following assertion will fail if
+        this is not the case (if some bits represent a sub-priority).
+
+        The priority grouping is configured by the GIC's binary point register
+        (ICCBPR).  Writting 0 to ICCBPR will ensure it is set to its lowest
+        possible value (which may be above 0). */
+        configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE );
+    }
+
+#endif /* configASSERT_DEFINED */
diff --git a/portable/IAR/ARM_CA9/portASM.h b/portable/IAR/ARM_CA9/portASM.h
index 1011a79..e6df989 100644
--- a/portable/IAR/ARM_CA9/portASM.h
+++ b/portable/IAR/ARM_CA9/portASM.h
@@ -1,116 +1,111 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-	EXTERN	vTaskSwitchContext

-	EXTERN  ulCriticalNesting

-	EXTERN	pxCurrentTCB

-	EXTERN	ulPortTaskHasFPUContext

-	EXTERN  ulAsmAPIPriorityMask

-

-portSAVE_CONTEXT macro

-

-	; Save the LR and SPSR onto the system mode stack before switching to

-	; system mode to save the remaining system mode registers

-	SRSDB	sp!, #SYS_MODE

-	CPS		#SYS_MODE

-	PUSH	{R0-R12, R14}

-

-	; Push the critical nesting count

-	LDR		R2, =ulCriticalNesting

-	LDR		R1, [R2]

-	PUSH	{R1}

-

-	; Does the task have a floating point context that needs saving?  If

-	; ulPortTaskHasFPUContext is 0 then no.

-	LDR		R2, =ulPortTaskHasFPUContext

-	LDR		R3, [R2]

-	CMP		R3, #0

-

-	; Save the floating point context, if any

-	FMRXNE  R1,  FPSCR

-	VPUSHNE {D0-D15}

-	VPUSHNE	{D16-D31}

-	PUSHNE	{R1}

-

-	; Save ulPortTaskHasFPUContext itself

-	PUSH	{R3}

-

-	; Save the stack pointer in the TCB

-	LDR		R0, =pxCurrentTCB

-	LDR		R1, [R0]

-	STR		SP, [R1]

-

-	endm

-

-; /**********************************************************************/

-

-portRESTORE_CONTEXT macro

-

-	; Set the SP to point to the stack of the task being restored.

-	LDR		R0, =pxCurrentTCB

-	LDR		R1, [R0]

-	LDR		SP, [R1]

-

-	; Is there a floating point context to restore?  If the restored

-	; ulPortTaskHasFPUContext is zero then no.

-	LDR		R0, =ulPortTaskHasFPUContext

-	POP		{R1}

-	STR		R1, [R0]

-	CMP		R1, #0

-

-	; Restore the floating point context, if any

-	POPNE 	{R0}

-	VPOPNE	{D16-D31}

-	VPOPNE	{D0-D15}

-	VMSRNE  FPSCR, R0

-

-	; Restore the critical section nesting depth

-	LDR		R0, =ulCriticalNesting

-	POP		{R1}

-	STR		R1, [R0]

-

-	; Ensure the priority mask is correct for the critical nesting depth

-	LDR		R2, =portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS

-	CMP		R1, #0

-	MOVEQ	R4, #255

-	LDRNE	R4, =( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT )

-	STR		R4, [r2]

-

-	; Restore all system mode registers other than the SP (which is already

-	; being used)

-	POP		{R0-R12, R14}

-

-	; Return to the task code, loading CPSR on the way.

-	RFEIA	sp!

-

-	endm

-

-

-

-

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+    EXTERN  vTaskSwitchContext
+    EXTERN  ulCriticalNesting
+    EXTERN  pxCurrentTCB
+    EXTERN  ulPortTaskHasFPUContext
+    EXTERN  ulAsmAPIPriorityMask
+
+portSAVE_CONTEXT macro
+
+    ; Save the LR and SPSR onto the system mode stack before switching to
+    ; system mode to save the remaining system mode registers
+    SRSDB   sp!, #SYS_MODE
+    CPS     #SYS_MODE
+    PUSH    {R0-R12, R14}
+
+    ; Push the critical nesting count
+    LDR     R2, =ulCriticalNesting
+    LDR     R1, [R2]
+    PUSH    {R1}
+
+    ; Does the task have a floating point context that needs saving?  If
+    ; ulPortTaskHasFPUContext is 0 then no.
+    LDR     R2, =ulPortTaskHasFPUContext
+    LDR     R3, [R2]
+    CMP     R3, #0
+
+    ; Save the floating point context, if any
+    FMRXNE  R1,  FPSCR
+    VPUSHNE {D0-D15}
+    VPUSHNE {D16-D31}
+    PUSHNE  {R1}
+
+    ; Save ulPortTaskHasFPUContext itself
+    PUSH    {R3}
+
+    ; Save the stack pointer in the TCB
+    LDR     R0, =pxCurrentTCB
+    LDR     R1, [R0]
+    STR     SP, [R1]
+
+    endm
+
+; /**********************************************************************/
+
+portRESTORE_CONTEXT macro
+
+    ; Set the SP to point to the stack of the task being restored.
+    LDR     R0, =pxCurrentTCB
+    LDR     R1, [R0]
+    LDR     SP, [R1]
+
+    ; Is there a floating point context to restore?  If the restored
+    ; ulPortTaskHasFPUContext is zero then no.
+    LDR     R0, =ulPortTaskHasFPUContext
+    POP     {R1}
+    STR     R1, [R0]
+    CMP     R1, #0
+
+    ; Restore the floating point context, if any
+    POPNE   {R0}
+    VPOPNE  {D16-D31}
+    VPOPNE  {D0-D15}
+    VMSRNE  FPSCR, R0
+
+    ; Restore the critical section nesting depth
+    LDR     R0, =ulCriticalNesting
+    POP     {R1}
+    STR     R1, [R0]
+
+    ; Ensure the priority mask is correct for the critical nesting depth
+    LDR     R2, =portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS
+    CMP     R1, #0
+    MOVEQ   R4, #255
+    LDRNE   R4, =( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT )
+    STR     R4, [r2]
+
+    ; Restore all system mode registers other than the SP (which is already
+    ; being used)
+    POP     {R0-R12, R14}
+
+    ; Return to the task code, loading CPSR on the way.
+    RFEIA   sp!
+
+    endm
diff --git a/portable/IAR/ARM_CA9/portASM.s b/portable/IAR/ARM_CA9/portASM.s
index f96ccd2..56ec384 100644
--- a/portable/IAR/ARM_CA9/portASM.s
+++ b/portable/IAR/ARM_CA9/portASM.s
@@ -1,178 +1,174 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-	INCLUDE FreeRTOSConfig.h

-	INCLUDE portmacro.h

-

-	EXTERN	vApplicationIRQHandler

-	EXTERN	vTaskSwitchContext

-	EXTERN	ulPortYieldRequired

-	EXTERN	ulPortInterruptNesting

-

-	PUBLIC	FreeRTOS_SWI_Handler

-	PUBLIC  FreeRTOS_IRQ_Handler

-	PUBLIC 	vPortRestoreTaskContext

-

-SYS_MODE			EQU		0x1f

-SVC_MODE			EQU		0x13

-IRQ_MODE			EQU		0x12

-

-

-	SECTION .text:CODE:ROOT(2)

-	ARM

-

-	INCLUDE portASM.h

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; SVC handler is used to yield a task.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-FreeRTOS_SWI_Handler

-

-	PRESERVE8

-

-	; Save the context of the current task and select a new task to run.

-	portSAVE_CONTEXT

-	LDR R0, =vTaskSwitchContext

-	BLX	R0

-	portRESTORE_CONTEXT

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; vPortRestoreTaskContext is used to start the scheduler.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortRestoreTaskContext

-	; Switch to system mode

-	CPS		#SYS_MODE

-	portRESTORE_CONTEXT

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; PL390 GIC interrupt handler

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-FreeRTOS_IRQ_Handler

-

-	; Return to the interrupted instruction.

-	SUB		lr, lr, #4

-

-	; Push the return address and SPSR

-	PUSH	{lr}

-	MRS		lr, SPSR

-	PUSH	{lr}

-

-	; Change to supervisor mode to allow reentry.

-	CPS		#SVC_MODE

-

-	; Push used registers.

-	PUSH	{r0-r4, r12}

-

-	; Increment nesting count.  r3 holds the address of ulPortInterruptNesting

-	; for future use.  r1 holds the original ulPortInterruptNesting value for

-	; future use.

-	LDR		r3, =ulPortInterruptNesting

-	LDR		r1, [r3]

-	ADD		r4, r1, #1

-	STR		r4, [r3]

-

-	; Read value from the interrupt acknowledge register, which is stored in r0

-	; for future parameter and interrupt clearing use.

-	LDR 	r2, =portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS

-	LDR		r0, [r2]

-

-	; Ensure bit 2 of the stack pointer is clear.  r2 holds the bit 2 value for

-	; future use.  _RB_ Is this ever necessary if start of stack is 8-byte aligned?

-	MOV		r2, sp

-	AND		r2, r2, #4

-	SUB		sp, sp, r2

-

-	; Call the interrupt handler.  r4 is pushed to maintain alignment.

-	PUSH	{r0-r4, lr}

-	LDR		r1, =vApplicationIRQHandler

-	BLX		r1

-	POP		{r0-r4, lr}

-	ADD		sp, sp, r2

-

-	CPSID	i

-

-	; Write the value read from ICCIAR to ICCEOIR

-	LDR 	r4, =portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS

-	STR		r0, [r4]

-

-	; Restore the old nesting count

-	STR		r1, [r3]

-

-	; A context switch is never performed if the nesting count is not 0

-	CMP		r1, #0

-	BNE		exit_without_switch

-

-	; Did the interrupt request a context switch?  r1 holds the address of

-	; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future

-	; use.

-	LDR		r1, =ulPortYieldRequired

-	LDR		r0, [r1]

-	CMP		r0, #0

-	BNE		switch_before_exit

-

-exit_without_switch

-	; No context switch.  Restore used registers, LR_irq and SPSR before

-	; returning.

-	POP		{r0-r4, r12}

-	CPS		#IRQ_MODE

-	POP		{LR}

-	MSR		SPSR_cxsf, LR

-	POP		{LR}

-	MOVS	PC, LR

-

-switch_before_exit

-	; A context switch is to be performed.  Clear the context switch pending

-	; flag.

-	MOV		r0, #0

-	STR		r0, [r1]

-

-	; Restore used registers, LR-irq and SPSR before saving the context

-	; to the task stack.

-	POP		{r0-r4, r12}

-	CPS		#IRQ_MODE

-	POP		{LR}

-	MSR		SPSR_cxsf, LR

-	POP		{LR}

-	portSAVE_CONTEXT

-

-	; Call the function that selects the new task to execute.

-	; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD

-	; instructions, or 8 byte aligned stack allocated data.  LR does not need

-	; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway.

-	LDR		r0, =vTaskSwitchContext

-	BLX		r0

-

-	; Restore the context of, and branch to, the task selected to execute next.

-	portRESTORE_CONTEXT

-

-

-	END

-

-

-

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+    INCLUDE FreeRTOSConfig.h
+    INCLUDE portmacro.h
+
+    EXTERN  vApplicationIRQHandler
+    EXTERN  vTaskSwitchContext
+    EXTERN  ulPortYieldRequired
+    EXTERN  ulPortInterruptNesting
+
+    PUBLIC  FreeRTOS_SWI_Handler
+    PUBLIC  FreeRTOS_IRQ_Handler
+    PUBLIC  vPortRestoreTaskContext
+
+SYS_MODE            EQU     0x1f
+SVC_MODE            EQU     0x13
+IRQ_MODE            EQU     0x12
+
+
+    SECTION .text:CODE:ROOT(2)
+    ARM
+
+    INCLUDE portASM.h
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; SVC handler is used to yield a task.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+FreeRTOS_SWI_Handler
+
+    PRESERVE8
+
+    ; Save the context of the current task and select a new task to run.
+    portSAVE_CONTEXT
+    LDR R0, =vTaskSwitchContext
+    BLX R0
+    portRESTORE_CONTEXT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; vPortRestoreTaskContext is used to start the scheduler.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortRestoreTaskContext
+    ; Switch to system mode
+    CPS     #SYS_MODE
+    portRESTORE_CONTEXT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; PL390 GIC interrupt handler
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+FreeRTOS_IRQ_Handler
+
+    ; Return to the interrupted instruction.
+    SUB     lr, lr, #4
+
+    ; Push the return address and SPSR
+    PUSH    {lr}
+    MRS     lr, SPSR
+    PUSH    {lr}
+
+    ; Change to supervisor mode to allow reentry.
+    CPS     #SVC_MODE
+
+    ; Push used registers.
+    PUSH    {r0-r4, r12}
+
+    ; Increment nesting count.  r3 holds the address of ulPortInterruptNesting
+    ; for future use.  r1 holds the original ulPortInterruptNesting value for
+    ; future use.
+    LDR     r3, =ulPortInterruptNesting
+    LDR     r1, [r3]
+    ADD     r4, r1, #1
+    STR     r4, [r3]
+
+    ; Read value from the interrupt acknowledge register, which is stored in r0
+    ; for future parameter and interrupt clearing use.
+    LDR     r2, =portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS
+    LDR     r0, [r2]
+
+    ; Ensure bit 2 of the stack pointer is clear.  r2 holds the bit 2 value for
+    ; future use.  _RB_ Is this ever necessary if start of stack is 8-byte aligned?
+    MOV     r2, sp
+    AND     r2, r2, #4
+    SUB     sp, sp, r2
+
+    ; Call the interrupt handler.  r4 is pushed to maintain alignment.
+    PUSH    {r0-r4, lr}
+    LDR     r1, =vApplicationIRQHandler
+    BLX     r1
+    POP     {r0-r4, lr}
+    ADD     sp, sp, r2
+
+    CPSID   i
+
+    ; Write the value read from ICCIAR to ICCEOIR
+    LDR     r4, =portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS
+    STR     r0, [r4]
+
+    ; Restore the old nesting count
+    STR     r1, [r3]
+
+    ; A context switch is never performed if the nesting count is not 0
+    CMP     r1, #0
+    BNE     exit_without_switch
+
+    ; Did the interrupt request a context switch?  r1 holds the address of
+    ; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future
+    ; use.
+    LDR     r1, =ulPortYieldRequired
+    LDR     r0, [r1]
+    CMP     r0, #0
+    BNE     switch_before_exit
+
+exit_without_switch
+    ; No context switch.  Restore used registers, LR_irq and SPSR before
+    ; returning.
+    POP     {r0-r4, r12}
+    CPS     #IRQ_MODE
+    POP     {LR}
+    MSR     SPSR_cxsf, LR
+    POP     {LR}
+    MOVS    PC, LR
+
+switch_before_exit
+    ; A context switch is to be performed.  Clear the context switch pending
+    ; flag.
+    MOV     r0, #0
+    STR     r0, [r1]
+
+    ; Restore used registers, LR-irq and SPSR before saving the context
+    ; to the task stack.
+    POP     {r0-r4, r12}
+    CPS     #IRQ_MODE
+    POP     {LR}
+    MSR     SPSR_cxsf, LR
+    POP     {LR}
+    portSAVE_CONTEXT
+
+    ; Call the function that selects the new task to execute.
+    ; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD
+    ; instructions, or 8 byte aligned stack allocated data.  LR does not need
+    ; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway.
+    LDR     r0, =vTaskSwitchContext
+    BLX     r0
+
+    ; Restore the context of, and branch to, the task selected to execute next.
+    portRESTORE_CONTEXT
+
+
+    END
diff --git a/portable/IAR/ARM_CA9/portmacro.h b/portable/IAR/ARM_CA9/portmacro.h
index d709f0b..87c83ea 100644
--- a/portable/IAR/ARM_CA9/portmacro.h
+++ b/portable/IAR/ARM_CA9/portmacro.h
@@ -1,210 +1,209 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-/* IAR includes. */

-#ifdef __ICCARM__

-

-	#include <intrinsics.h>

-

-	#ifdef __cplusplus

-		extern "C" {

-	#endif

-

-	/*-----------------------------------------------------------

-	 * Port specific definitions.

-	 *

-	 * The settings in this file configure FreeRTOS correctly for the given hardware

-	 * and compiler.

-	 *

-	 * These settings should not be altered.

-	 *-----------------------------------------------------------

-	 */

-

-	/* Type definitions. */

-	#define portCHAR		char

-	#define portFLOAT		float

-	#define portDOUBLE		double

-	#define portLONG		long

-	#define portSHORT		short

-	#define portSTACK_TYPE	uint32_t

-	#define portBASE_TYPE	long

-

-	typedef portSTACK_TYPE StackType_t;

-	typedef long BaseType_t;

-	typedef unsigned long UBaseType_t;

-

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-

-	/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

-	not need to be guarded with a critical section. */

-	#define portTICK_TYPE_IS_ATOMIC 1

-

-	/*-----------------------------------------------------------*/

-

-	/* Hardware specifics. */

-	#define portSTACK_GROWTH			( -1 )

-	#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-	#define portBYTE_ALIGNMENT			8

-

-	/*-----------------------------------------------------------*/

-

-	/* Task utilities. */

-

-	/* Called at the end of an ISR that can cause a context switch. */

-	#define portEND_SWITCHING_ISR( xSwitchRequired )\

-	{												\

-	extern uint32_t ulPortYieldRequired;			\

-													\

-		if( xSwitchRequired != pdFALSE )			\

-		{											\

-			ulPortYieldRequired = pdTRUE;			\

-		}											\

-	}

-

-	#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )

-	#define portYIELD() __asm( "SWI 0" );

-

-

-	/*-----------------------------------------------------------

-	 * Critical section control

-	 *----------------------------------------------------------*/

-

-	extern void vPortEnterCritical( void );

-	extern void vPortExitCritical( void );

-	extern uint32_t ulPortSetInterruptMask( void );

-	extern void vPortClearInterruptMask( uint32_t ulNewMaskValue );

-

-	/* These macros do not globally disable/enable interrupts.  They do mask off

-	interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */

-	#define portENTER_CRITICAL()		vPortEnterCritical();

-	#define portEXIT_CRITICAL()			vPortExitCritical();

-	#define portDISABLE_INTERRUPTS()	ulPortSetInterruptMask()

-	#define portENABLE_INTERRUPTS()		vPortClearInterruptMask( 0 )

-	#define portSET_INTERRUPT_MASK_FROM_ISR()		ulPortSetInterruptMask()

-	#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)	vPortClearInterruptMask(x)

-

-	/*-----------------------------------------------------------*/

-

-	/* Task function macros as described on the FreeRTOS.org WEB site.  These are

-	not required for this port but included in case common demo code that uses these

-	macros is used. */

-	#define portTASK_FUNCTION_PROTO( vFunction, pvParameters )	void vFunction( void *pvParameters )

-	#define portTASK_FUNCTION( vFunction, pvParameters )	void vFunction( void *pvParameters )

-

-	/* Prototype of the FreeRTOS tick handler.  This must be installed as the

-	handler for whichever peripheral is used to generate the RTOS tick. */

-	void FreeRTOS_Tick_Handler( void );

-

-	/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU()

-	before any floating point instructions are executed. */

-	void vPortTaskUsesFPU( void );

-	#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU()

-

-	#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL )

-	#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL )

-

-	/* Architecture specific optimisations. */

-	#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

-		#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1

-	#endif

-

-	#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1

-

-		/* Store/clear the ready priorities in a bit map. */

-		#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

-		#define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

-

-		/*-----------------------------------------------------------*/

-

-		#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __CLZ( uxReadyPriorities ) )

-

-	#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-

-	#ifdef configASSERT

-		void vPortValidateInterruptPriority( void );

-		#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() 	vPortValidateInterruptPriority()

-	#endif /* configASSERT */

-

-	#define portNOP() __asm volatile( "NOP" )

-

-

-	#ifdef __cplusplus

-		} /* extern C */

-	#endif

-

-	/* Suppress warnings that are generated by the IAR tools, but cannot be

-	fixed in the source code because to do so would cause other compilers to

-	generate warnings. */

-	#pragma diag_suppress=Pe191

-	#pragma diag_suppress=Pa082

-

-#endif /* __ICCARM__ */

-

-

-/* The number of bits to shift for an interrupt priority is dependent on the

-number of bits implemented by the interrupt controller. */

-#if configUNIQUE_INTERRUPT_PRIORITIES == 16

-	#define portPRIORITY_SHIFT 4

-	#define portMAX_BINARY_POINT_VALUE	3

-#elif configUNIQUE_INTERRUPT_PRIORITIES == 32

-	#define portPRIORITY_SHIFT 3

-	#define portMAX_BINARY_POINT_VALUE	2

-#elif configUNIQUE_INTERRUPT_PRIORITIES == 64

-	#define portPRIORITY_SHIFT 2

-	#define portMAX_BINARY_POINT_VALUE	1

-#elif configUNIQUE_INTERRUPT_PRIORITIES == 128

-	#define portPRIORITY_SHIFT 1

-	#define portMAX_BINARY_POINT_VALUE	0

-#elif configUNIQUE_INTERRUPT_PRIORITIES == 256

-	#define portPRIORITY_SHIFT 0

-	#define portMAX_BINARY_POINT_VALUE	0

-#else

-	#error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting.  configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware

-#endif

-

-/* Interrupt controller access addresses. */

-#define portICCPMR_PRIORITY_MASK_OFFSET  						( 0x04 )

-#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET 				( 0x0C )

-#define portICCEOIR_END_OF_INTERRUPT_OFFSET 					( 0x10 )

-#define portICCBPR_BINARY_POINT_OFFSET							( 0x08 )

-#define portICCRPR_RUNNING_PRIORITY_OFFSET						( 0x14 )

-

-#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS 		( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET )

-#define portICCPMR_PRIORITY_MASK_REGISTER 					( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) )

-#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS 	( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET )

-#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS 		( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET )

-#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS 			( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET )

-#define portICCBPR_BINARY_POINT_REGISTER 					( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) )

-#define portICCRPR_RUNNING_PRIORITY_REGISTER 				( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) )

-

-#endif /* PORTMACRO_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+/* IAR includes. */
+#ifdef __ICCARM__
+
+    #include <intrinsics.h>
+
+    #ifdef __cplusplus
+        extern "C" {
+    #endif
+
+    /*-----------------------------------------------------------
+     * Port specific definitions.
+     *
+     * The settings in this file configure FreeRTOS correctly for the given hardware
+     * and compiler.
+     *
+     * These settings should not be altered.
+     *-----------------------------------------------------------
+     */
+
+    /* Type definitions. */
+    #define portCHAR        char
+    #define portFLOAT       float
+    #define portDOUBLE      double
+    #define portLONG        long
+    #define portSHORT       short
+    #define portSTACK_TYPE  uint32_t
+    #define portBASE_TYPE   long
+
+    typedef portSTACK_TYPE StackType_t;
+    typedef long BaseType_t;
+    typedef unsigned long UBaseType_t;
+
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+
+    /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+    not need to be guarded with a critical section. */
+    #define portTICK_TYPE_IS_ATOMIC 1
+
+    /*-----------------------------------------------------------*/
+
+    /* Hardware specifics. */
+    #define portSTACK_GROWTH            ( -1 )
+    #define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+    #define portBYTE_ALIGNMENT          8
+
+    /*-----------------------------------------------------------*/
+
+    /* Task utilities. */
+
+    /* Called at the end of an ISR that can cause a context switch. */
+    #define portEND_SWITCHING_ISR( xSwitchRequired )\
+    {                                               \
+    extern uint32_t ulPortYieldRequired;            \
+                                                    \
+        if( xSwitchRequired != pdFALSE )            \
+        {                                           \
+            ulPortYieldRequired = pdTRUE;           \
+        }                                           \
+    }
+
+    #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
+    #define portYIELD() __asm( "SWI 0" );
+
+
+    /*-----------------------------------------------------------
+     * Critical section control
+     *----------------------------------------------------------*/
+
+    extern void vPortEnterCritical( void );
+    extern void vPortExitCritical( void );
+    extern uint32_t ulPortSetInterruptMask( void );
+    extern void vPortClearInterruptMask( uint32_t ulNewMaskValue );
+
+    /* These macros do not globally disable/enable interrupts.  They do mask off
+    interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */
+    #define portENTER_CRITICAL()        vPortEnterCritical();
+    #define portEXIT_CRITICAL()         vPortExitCritical();
+    #define portDISABLE_INTERRUPTS()    ulPortSetInterruptMask()
+    #define portENABLE_INTERRUPTS()     vPortClearInterruptMask( 0 )
+    #define portSET_INTERRUPT_MASK_FROM_ISR()       ulPortSetInterruptMask()
+    #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)    vPortClearInterruptMask(x)
+
+    /*-----------------------------------------------------------*/
+
+    /* Task function macros as described on the FreeRTOS.org WEB site.  These are
+    not required for this port but included in case common demo code that uses these
+    macros is used. */
+    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )  void vFunction( void *pvParameters )
+    #define portTASK_FUNCTION( vFunction, pvParameters )    void vFunction( void *pvParameters )
+
+    /* Prototype of the FreeRTOS tick handler.  This must be installed as the
+    handler for whichever peripheral is used to generate the RTOS tick. */
+    void FreeRTOS_Tick_Handler( void );
+
+    /* Any task that uses the floating point unit MUST call vPortTaskUsesFPU()
+    before any floating point instructions are executed. */
+    void vPortTaskUsesFPU( void );
+    #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU()
+
+    #define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL )
+    #define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL )
+
+    /* Architecture specific optimisations. */
+    #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
+        #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
+    #endif
+
+    #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
+
+        /* Store/clear the ready priorities in a bit map. */
+        #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
+        #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
+
+        /*-----------------------------------------------------------*/
+
+        #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __CLZ( uxReadyPriorities ) )
+
+    #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+
+    #ifdef configASSERT
+        void vPortValidateInterruptPriority( void );
+        #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()  vPortValidateInterruptPriority()
+    #endif /* configASSERT */
+
+    #define portNOP() __asm volatile( "NOP" )
+
+
+    #ifdef __cplusplus
+        } /* extern C */
+    #endif
+
+    /* Suppress warnings that are generated by the IAR tools, but cannot be
+    fixed in the source code because to do so would cause other compilers to
+    generate warnings. */
+    #pragma diag_suppress=Pe191
+    #pragma diag_suppress=Pa082
+
+#endif /* __ICCARM__ */
+
+
+/* The number of bits to shift for an interrupt priority is dependent on the
+number of bits implemented by the interrupt controller. */
+#if configUNIQUE_INTERRUPT_PRIORITIES == 16
+    #define portPRIORITY_SHIFT 4
+    #define portMAX_BINARY_POINT_VALUE  3
+#elif configUNIQUE_INTERRUPT_PRIORITIES == 32
+    #define portPRIORITY_SHIFT 3
+    #define portMAX_BINARY_POINT_VALUE  2
+#elif configUNIQUE_INTERRUPT_PRIORITIES == 64
+    #define portPRIORITY_SHIFT 2
+    #define portMAX_BINARY_POINT_VALUE  1
+#elif configUNIQUE_INTERRUPT_PRIORITIES == 128
+    #define portPRIORITY_SHIFT 1
+    #define portMAX_BINARY_POINT_VALUE  0
+#elif configUNIQUE_INTERRUPT_PRIORITIES == 256
+    #define portPRIORITY_SHIFT 0
+    #define portMAX_BINARY_POINT_VALUE  0
+#else
+    #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting.  configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware
+#endif
+
+/* Interrupt controller access addresses. */
+#define portICCPMR_PRIORITY_MASK_OFFSET                         ( 0x04 )
+#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET                 ( 0x0C )
+#define portICCEOIR_END_OF_INTERRUPT_OFFSET                     ( 0x10 )
+#define portICCBPR_BINARY_POINT_OFFSET                          ( 0x08 )
+#define portICCRPR_RUNNING_PRIORITY_OFFSET                      ( 0x14 )
+
+#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS      ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET )
+#define portICCPMR_PRIORITY_MASK_REGISTER                   ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) )
+#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS   ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET )
+#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS       ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET )
+#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS           ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET )
+#define portICCBPR_BINARY_POINT_REGISTER                    ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) )
+#define portICCRPR_RUNNING_PRIORITY_REGISTER                ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) )
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CM0/port.c b/portable/IAR/ARM_CM0/port.c
index 4e40442..ad168e5 100644
--- a/portable/IAR/ARM_CM0/port.c
+++ b/portable/IAR/ARM_CM0/port.c
@@ -1,498 +1,498 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

-* Implementation of functions defined in portable.h for the ARM CM0 port.

-*----------------------------------------------------------*/

-

-/* IAR includes. */

-#include "intrinsics.h"

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Constants required to manipulate the NVIC. */

-#define portNVIC_SYSTICK_CTRL_REG             ( *( ( volatile uint32_t * ) 0xe000e010 ) )

-#define portNVIC_SYSTICK_LOAD_REG             ( *( ( volatile uint32_t * ) 0xe000e014 ) )

-#define portNVIC_SYSTICK_CURRENT_VALUE_REG    ( *( ( volatile uint32_t * ) 0xe000e018 ) )

-#define portNVIC_INT_CTRL_REG                 ( *( ( volatile uint32_t * ) 0xe000ed04 ) )

-#define portNVIC_SHPR3_REG                    ( *( ( volatile uint32_t * ) 0xe000ed20 ) )

-#define portNVIC_SYSTICK_CLK_BIT              ( 1UL << 2UL )

-#define portNVIC_SYSTICK_INT_BIT              ( 1UL << 1UL )

-#define portNVIC_SYSTICK_ENABLE_BIT           ( 1UL << 0UL )

-#define portNVIC_SYSTICK_COUNT_FLAG_BIT       ( 1UL << 16UL )

-#define portNVIC_PEND_SYSTICK_SET_BIT         ( 1UL << 26UL )

-#define portNVIC_PEND_SYSTICK_CLEAR_BIT       ( 1UL << 25UL )

-#define portMIN_INTERRUPT_PRIORITY            ( 255UL )

-#define portNVIC_PENDSV_PRI                   ( portMIN_INTERRUPT_PRIORITY << 16UL )

-#define portNVIC_SYSTICK_PRI                  ( portMIN_INTERRUPT_PRIORITY << 24UL )

-

-/* Constants required to set up the initial stack. */

-#define portINITIAL_XPSR                      ( 0x01000000 )

-

-/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is

- * defined.  The value 255 should also ensure backward compatibility.

- * FreeRTOS.org versions prior to V4.3.0 did not include this definition. */

-#ifndef configKERNEL_INTERRUPT_PRIORITY

-    #define configKERNEL_INTERRUPT_PRIORITY    0

-#endif

-

-/* Each task maintains its own interrupt status in the critical nesting

- * variable. */

-static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;

-

-/* The systick is a 24-bit counter. */

-#define portMAX_24_BIT_NUMBER    ( 0xffffffUL )

-

-/* A fiddle factor to estimate the number of SysTick counts that would have

- * occurred while the SysTick counter is stopped during tickless idle

- * calculations. */

-#ifndef portMISSED_COUNTS_FACTOR

-    #define portMISSED_COUNTS_FACTOR    ( 94UL )

-#endif

-

-/* The number of SysTick increments that make up one tick period. */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t ulTimerCountsForOneTick = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/* The maximum number of tick periods that can be suppressed is limited by the

- * 24 bit resolution of the SysTick timer. */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t xMaximumPossibleSuppressedTicks = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/* Compensate for the CPU cycles that pass while the SysTick is stopped (low

- * power functionality only. */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t ulStoppedTimerCompensation = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/* Let the user override the default SysTick clock rate.  If defined by the

- * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the

- * configuration register. */

-#ifndef configSYSTICK_CLOCK_HZ

-    #define configSYSTICK_CLOCK_HZ             ( configCPU_CLOCK_HZ )

-    /* Ensure the SysTick is clocked at the same frequency as the core. */

-    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( portNVIC_SYSTICK_CLK_BIT )

-#else

-    /* Select the option to clock SysTick not at the same frequency as the core. */

-    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( 0 )

-#endif

-

-/*

- * Setup the timer to generate the tick interrupts.  The implementation in this

- * file is weak to allow application writers to change the timer used to

- * generate the tick interrupt.

- */

-void vPortSetupTimerInterrupt( void );

-

-/*

- * Exception handlers.

- */

-void xPortSysTickHandler( void );

-

-/*

- * Start first task is a separate function so it can be tested in isolation.

- */

-extern void vPortStartFirstTask( void );

-

-/*

- * Used to catch tasks that attempt to return from their implementing function.

- */

-static void prvTaskExitError( void );

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,

-                                     TaskFunction_t pxCode,

-                                     void * pvParameters )

-{

-    /* Simulate the stack frame as it would be created by a context switch

-     * interrupt. */

-    pxTopOfStack--;                                   /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */

-    *pxTopOfStack = portINITIAL_XPSR;                 /* xPSR */

-    pxTopOfStack--;

-    *pxTopOfStack = ( StackType_t ) pxCode;           /* PC */

-    pxTopOfStack--;

-    *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */

-    pxTopOfStack -= 5;                                /* R12, R3, R2 and R1. */

-    *pxTopOfStack = ( StackType_t ) pvParameters;     /* R0 */

-    pxTopOfStack -= 8;                                /* R11..R4. */

-

-    return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-static void prvTaskExitError( void )

-{

-    /* A function that implements a task must not exit or attempt to return to

-     * its caller as there is nothing to return to.  If a task wants to exit it

-     * should instead call vTaskDelete( NULL ).

-     *

-     * Artificially force an assert() to be triggered if configASSERT() is

-     * defined, then stop here so application writers can catch the error. */

-    configASSERT( uxCriticalNesting == ~0UL );

-    portDISABLE_INTERRUPTS();

-

-    for( ; ; )

-    {

-    }

-}

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-BaseType_t xPortStartScheduler( void )

-{

-    /* Make PendSV and SysTick the lowest priority interrupts. */

-    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;

-    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;

-

-    /* Start the timer that generates the tick ISR.  Interrupts are disabled

-     * here already. */

-    vPortSetupTimerInterrupt();

-

-    /* Initialise the critical nesting count ready for the first task. */

-    uxCriticalNesting = 0;

-

-    /* Start the first task. */

-    vPortStartFirstTask();

-

-    /* Should not get here! */

-    return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-    /* Not implemented in ports where there is nothing to return to.

-     * Artificially force an assert. */

-    configASSERT( uxCriticalNesting == 1000UL );

-}

-/*-----------------------------------------------------------*/

-

-void vPortYield( void )

-{

-    /* Set a PendSV to request a context switch. */

-    portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET;

-

-    /* Barriers are normally not required but do ensure the code is completely

-     * within the specified behaviour for the architecture. */

-    __DSB();

-    __ISB();

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-    portDISABLE_INTERRUPTS();

-    uxCriticalNesting++;

-    __DSB();

-    __ISB();

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-    configASSERT( uxCriticalNesting );

-    uxCriticalNesting--;

-

-    if( uxCriticalNesting == 0 )

-    {

-        portENABLE_INTERRUPTS();

-    }

-}

-/*-----------------------------------------------------------*/

-

-void xPortSysTickHandler( void )

-{

-    uint32_t ulPreviousMask;

-

-    ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR();

-    {

-        /* Increment the RTOS tick. */

-        if( xTaskIncrementTick() != pdFALSE )

-        {

-            /* Pend a context switch. */

-            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET;

-        }

-    }

-    portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Setup the systick timer to generate the tick interrupts at the required

- * frequency.

- */

-__weak void vPortSetupTimerInterrupt( void )

-{

-    /* Calculate the constants required to configure the tick interrupt. */

-    #if ( configUSE_TICKLESS_IDLE == 1 )

-    {

-        ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );

-        xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;

-        ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );

-    }

-    #endif /* configUSE_TICKLESS_IDLE */

-

-    /* Stop and reset the SysTick. */

-    portNVIC_SYSTICK_CTRL_REG = 0UL;

-    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-

-    /* Configure SysTick to interrupt at the requested rate. */

-    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;

-    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );

-}

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TICKLESS_IDLE == 1 )

-

-    __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )

-    {

-        uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft;

-        TickType_t xModifiableIdleTime;

-

-        /* Make sure the SysTick reload value does not overflow the counter. */

-        if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )

-        {

-            xExpectedIdleTime = xMaximumPossibleSuppressedTicks;

-        }

-

-        /* Enter a critical section but don't use the taskENTER_CRITICAL()

-         * method as that will mask interrupts that should exit sleep mode. */

-        __disable_interrupt();

-        __DSB();

-        __ISB();

-

-        /* If a context switch is pending or a task is waiting for the scheduler

-         * to be unsuspended then abandon the low power entry. */

-        if( eTaskConfirmSleepModeStatus() == eAbortSleep )

-        {

-            /* Re-enable interrupts - see comments above the __disable_interrupt()

-             * call above. */

-            __enable_interrupt();

-        }

-        else

-        {

-            /* Stop the SysTick momentarily.  The time the SysTick is stopped for

-             * is accounted for as best it can be, but using the tickless mode will

-             * inevitably result in some tiny drift of the time maintained by the

-             * kernel with respect to calendar time. */

-            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );

-

-            /* Use the SysTick current-value register to determine the number of

-             * SysTick decrements remaining until the next tick interrupt.  If the

-             * current-value register is zero, then there are actually

-             * ulTimerCountsForOneTick decrements remaining, not zero, because the

-             * SysTick requests the interrupt when decrementing from 1 to 0. */

-            ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;

-

-            if( ulSysTickDecrementsLeft == 0 )

-            {

-                ulSysTickDecrementsLeft = ulTimerCountsForOneTick;

-            }

-

-            /* Calculate the reload value required to wait xExpectedIdleTime

-             * tick periods.  -1 is used because this code normally executes part

-             * way through the first tick period.  But if the SysTick IRQ is now

-             * pending, then clear the IRQ, suppressing the first tick, and correct

-             * the reload value to reflect that the second tick period is already

-             * underway.  The expected idle time is always at least two ticks. */

-            ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );

-

-            if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 )

-            {

-                portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT;

-                ulReloadValue -= ulTimerCountsForOneTick;

-            }

-

-            if( ulReloadValue > ulStoppedTimerCompensation )

-            {

-                ulReloadValue -= ulStoppedTimerCompensation;

-            }

-

-            /* Set the new reload value. */

-            portNVIC_SYSTICK_LOAD_REG = ulReloadValue;

-

-            /* Clear the SysTick count flag and set the count value back to

-             * zero. */

-            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-

-            /* Restart SysTick. */

-            portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;

-

-            /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can

-             * set its parameter to 0 to indicate that its implementation contains

-             * its own wait for interrupt or wait for event instruction, and so wfi

-             * should not be executed again.  However, the original expected idle

-             * time variable must remain unmodified, so a copy is taken. */

-            xModifiableIdleTime = xExpectedIdleTime;

-            configPRE_SLEEP_PROCESSING( xModifiableIdleTime );

-

-            if( xModifiableIdleTime > 0 )

-            {

-                __DSB();

-                __WFI();

-                __ISB();

-            }

-

-            configPOST_SLEEP_PROCESSING( xExpectedIdleTime );

-

-            /* Re-enable interrupts to allow the interrupt that brought the MCU

-             * out of sleep mode to execute immediately.  See comments above

-             * the __disable_interrupt() call above. */

-            __enable_interrupt();

-            __DSB();

-            __ISB();

-

-            /* Disable interrupts again because the clock is about to be stopped

-             * and interrupts that execute while the clock is stopped will increase

-             * any slippage between the time maintained by the RTOS and calendar

-             * time. */

-            __disable_interrupt();

-            __DSB();

-            __ISB();

-

-            /* Disable the SysTick clock without reading the

-             * portNVIC_SYSTICK_CTRL_REG register to ensure the

-             * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,

-             * the time the SysTick is stopped for is accounted for as best it can

-             * be, but using the tickless mode will inevitably result in some tiny

-             * drift of the time maintained by the kernel with respect to calendar

-             * time*/

-            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );

-

-            /* Determine whether the SysTick has already counted to zero. */

-            if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )

-            {

-                uint32_t ulCalculatedLoadValue;

-

-                /* The tick interrupt ended the sleep (or is now pending), and

-                 * a new tick period has started.  Reset portNVIC_SYSTICK_LOAD_REG

-                 * with whatever remains of the new tick period. */

-                ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );

-

-                /* Don't allow a tiny value, or values that have somehow

-                 * underflowed because the post sleep hook did something

-                 * that took too long or because the SysTick current-value register

-                 * is zero. */

-                if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )

-                {

-                    ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );

-                }

-

-                portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;

-

-                /* As the pending tick will be processed as soon as this

-                 * function exits, the tick value maintained by the tick is stepped

-                 * forward by one less than the time spent waiting. */

-                ulCompleteTickPeriods = xExpectedIdleTime - 1UL;

-            }

-            else

-            {

-                /* Something other than the tick interrupt ended the sleep. */

-

-                /* Use the SysTick current-value register to determine the

-                 * number of SysTick decrements remaining until the expected idle

-                 * time would have ended. */

-                ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;

-                #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT )

-                {

-                    /* If the SysTick is not using the core clock, the current-

-                     * value register might still be zero here.  In that case, the

-                     * SysTick didn't load from the reload register, and there are

-                     * ulReloadValue decrements remaining in the expected idle

-                     * time, not zero. */

-                    if( ulSysTickDecrementsLeft == 0 )

-                    {

-                        ulSysTickDecrementsLeft = ulReloadValue;

-                    }

-                }

-                #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */

-

-                /* Work out how long the sleep lasted rounded to complete tick

-                 * periods (not the ulReload value which accounted for part

-                 * ticks). */

-                ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft;

-

-                /* How many complete tick periods passed while the processor

-                 * was waiting? */

-                ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;

-

-                /* The reload value is set to whatever fraction of a single tick

-                 * period remains. */

-                portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;

-            }

-

-            /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again,

-             * then set portNVIC_SYSTICK_LOAD_REG back to its standard value.  If

-             * the SysTick is not using the core clock, temporarily configure it to

-             * use the core clock.  This configuration forces the SysTick to load

-             * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next

-             * cycle of the other clock.  Then portNVIC_SYSTICK_LOAD_REG is ready

-             * to receive the standard value immediately. */

-            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-            portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;

-            #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT )

-            {

-                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

-            }

-            #else

-            {

-                /* The temporary usage of the core clock has served its purpose,

-                 * as described above.  Resume usage of the other clock. */

-                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT;

-

-                if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )

-                {

-                    /* The partial tick period already ended.  Be sure the SysTick

-                     * counts it only once. */

-                    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0;

-                }

-

-                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

-                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;

-            }

-            #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */

-

-            /* Step the tick to account for any tick periods that elapsed. */

-            vTaskStepTick( ulCompleteTickPeriods );

-

-            /* Exit with interrupts enabled. */

-            __enable_interrupt();

-        }

-    }

-

-#endif /* configUSE_TICKLESS_IDLE */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+* Implementation of functions defined in portable.h for the ARM CM0 port.
+*----------------------------------------------------------*/
+
+/* IAR includes. */
+#include "intrinsics.h"
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Constants required to manipulate the NVIC. */
+#define portNVIC_SYSTICK_CTRL_REG             ( *( ( volatile uint32_t * ) 0xe000e010 ) )
+#define portNVIC_SYSTICK_LOAD_REG             ( *( ( volatile uint32_t * ) 0xe000e014 ) )
+#define portNVIC_SYSTICK_CURRENT_VALUE_REG    ( *( ( volatile uint32_t * ) 0xe000e018 ) )
+#define portNVIC_INT_CTRL_REG                 ( *( ( volatile uint32_t * ) 0xe000ed04 ) )
+#define portNVIC_SHPR3_REG                    ( *( ( volatile uint32_t * ) 0xe000ed20 ) )
+#define portNVIC_SYSTICK_CLK_BIT              ( 1UL << 2UL )
+#define portNVIC_SYSTICK_INT_BIT              ( 1UL << 1UL )
+#define portNVIC_SYSTICK_ENABLE_BIT           ( 1UL << 0UL )
+#define portNVIC_SYSTICK_COUNT_FLAG_BIT       ( 1UL << 16UL )
+#define portNVIC_PEND_SYSTICK_SET_BIT         ( 1UL << 26UL )
+#define portNVIC_PEND_SYSTICK_CLEAR_BIT       ( 1UL << 25UL )
+#define portMIN_INTERRUPT_PRIORITY            ( 255UL )
+#define portNVIC_PENDSV_PRI                   ( portMIN_INTERRUPT_PRIORITY << 16UL )
+#define portNVIC_SYSTICK_PRI                  ( portMIN_INTERRUPT_PRIORITY << 24UL )
+
+/* Constants required to set up the initial stack. */
+#define portINITIAL_XPSR                      ( 0x01000000 )
+
+/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is
+ * defined.  The value 255 should also ensure backward compatibility.
+ * FreeRTOS.org versions prior to V4.3.0 did not include this definition. */
+#ifndef configKERNEL_INTERRUPT_PRIORITY
+    #define configKERNEL_INTERRUPT_PRIORITY    0
+#endif
+
+/* Each task maintains its own interrupt status in the critical nesting
+ * variable. */
+static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
+
+/* The systick is a 24-bit counter. */
+#define portMAX_24_BIT_NUMBER    ( 0xffffffUL )
+
+/* A fiddle factor to estimate the number of SysTick counts that would have
+ * occurred while the SysTick counter is stopped during tickless idle
+ * calculations. */
+#ifndef portMISSED_COUNTS_FACTOR
+    #define portMISSED_COUNTS_FACTOR    ( 94UL )
+#endif
+
+/* The number of SysTick increments that make up one tick period. */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t ulTimerCountsForOneTick = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/* The maximum number of tick periods that can be suppressed is limited by the
+ * 24 bit resolution of the SysTick timer. */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t xMaximumPossibleSuppressedTicks = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/* Compensate for the CPU cycles that pass while the SysTick is stopped (low
+ * power functionality only. */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t ulStoppedTimerCompensation = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/* Let the user override the default SysTick clock rate.  If defined by the
+ * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the
+ * configuration register. */
+#ifndef configSYSTICK_CLOCK_HZ
+    #define configSYSTICK_CLOCK_HZ             ( configCPU_CLOCK_HZ )
+    /* Ensure the SysTick is clocked at the same frequency as the core. */
+    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( portNVIC_SYSTICK_CLK_BIT )
+#else
+    /* Select the option to clock SysTick not at the same frequency as the core. */
+    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( 0 )
+#endif
+
+/*
+ * Setup the timer to generate the tick interrupts.  The implementation in this
+ * file is weak to allow application writers to change the timer used to
+ * generate the tick interrupt.
+ */
+void vPortSetupTimerInterrupt( void );
+
+/*
+ * Exception handlers.
+ */
+void xPortSysTickHandler( void );
+
+/*
+ * Start first task is a separate function so it can be tested in isolation.
+ */
+extern void vPortStartFirstTask( void );
+
+/*
+ * Used to catch tasks that attempt to return from their implementing function.
+ */
+static void prvTaskExitError( void );
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
+                                     TaskFunction_t pxCode,
+                                     void * pvParameters )
+{
+    /* Simulate the stack frame as it would be created by a context switch
+     * interrupt. */
+    pxTopOfStack--;                                   /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
+    *pxTopOfStack = portINITIAL_XPSR;                 /* xPSR */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxCode;           /* PC */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */
+    pxTopOfStack -= 5;                                /* R12, R3, R2 and R1. */
+    *pxTopOfStack = ( StackType_t ) pvParameters;     /* R0 */
+    pxTopOfStack -= 8;                                /* R11..R4. */
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+static void prvTaskExitError( void )
+{
+    /* A function that implements a task must not exit or attempt to return to
+     * its caller as there is nothing to return to.  If a task wants to exit it
+     * should instead call vTaskDelete( NULL ).
+     *
+     * Artificially force an assert() to be triggered if configASSERT() is
+     * defined, then stop here so application writers can catch the error. */
+    configASSERT( uxCriticalNesting == ~0UL );
+    portDISABLE_INTERRUPTS();
+
+    for( ; ; )
+    {
+    }
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+BaseType_t xPortStartScheduler( void )
+{
+    /* Make PendSV and SysTick the lowest priority interrupts. */
+    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
+    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+     * here already. */
+    vPortSetupTimerInterrupt();
+
+    /* Initialise the critical nesting count ready for the first task. */
+    uxCriticalNesting = 0;
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+     * Artificially force an assert. */
+    configASSERT( uxCriticalNesting == 1000UL );
+}
+/*-----------------------------------------------------------*/
+
+void vPortYield( void )
+{
+    /* Set a PendSV to request a context switch. */
+    portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET;
+
+    /* Barriers are normally not required but do ensure the code is completely
+     * within the specified behaviour for the architecture. */
+    __DSB();
+    __ISB();
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    portDISABLE_INTERRUPTS();
+    uxCriticalNesting++;
+    __DSB();
+    __ISB();
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    configASSERT( uxCriticalNesting );
+    uxCriticalNesting--;
+
+    if( uxCriticalNesting == 0 )
+    {
+        portENABLE_INTERRUPTS();
+    }
+}
+/*-----------------------------------------------------------*/
+
+void xPortSysTickHandler( void )
+{
+    uint32_t ulPreviousMask;
+
+    ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR();
+    {
+        /* Increment the RTOS tick. */
+        if( xTaskIncrementTick() != pdFALSE )
+        {
+            /* Pend a context switch. */
+            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET;
+        }
+    }
+    portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * Setup the systick timer to generate the tick interrupts at the required
+ * frequency.
+ */
+__weak void vPortSetupTimerInterrupt( void )
+{
+    /* Calculate the constants required to configure the tick interrupt. */
+    #if ( configUSE_TICKLESS_IDLE == 1 )
+    {
+        ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
+        xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
+        ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
+    }
+    #endif /* configUSE_TICKLESS_IDLE */
+
+    /* Stop and reset the SysTick. */
+    portNVIC_SYSTICK_CTRL_REG = 0UL;
+    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+
+    /* Configure SysTick to interrupt at the requested rate. */
+    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
+    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
+}
+/*-----------------------------------------------------------*/
+
+#if ( configUSE_TICKLESS_IDLE == 1 )
+
+    __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
+    {
+        uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft;
+        TickType_t xModifiableIdleTime;
+
+        /* Make sure the SysTick reload value does not overflow the counter. */
+        if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )
+        {
+            xExpectedIdleTime = xMaximumPossibleSuppressedTicks;
+        }
+
+        /* Enter a critical section but don't use the taskENTER_CRITICAL()
+         * method as that will mask interrupts that should exit sleep mode. */
+        __disable_interrupt();
+        __DSB();
+        __ISB();
+
+        /* If a context switch is pending or a task is waiting for the scheduler
+         * to be unsuspended then abandon the low power entry. */
+        if( eTaskConfirmSleepModeStatus() == eAbortSleep )
+        {
+            /* Re-enable interrupts - see comments above the __disable_interrupt()
+             * call above. */
+            __enable_interrupt();
+        }
+        else
+        {
+            /* Stop the SysTick momentarily.  The time the SysTick is stopped for
+             * is accounted for as best it can be, but using the tickless mode will
+             * inevitably result in some tiny drift of the time maintained by the
+             * kernel with respect to calendar time. */
+            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );
+
+            /* Use the SysTick current-value register to determine the number of
+             * SysTick decrements remaining until the next tick interrupt.  If the
+             * current-value register is zero, then there are actually
+             * ulTimerCountsForOneTick decrements remaining, not zero, because the
+             * SysTick requests the interrupt when decrementing from 1 to 0. */
+            ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;
+
+            if( ulSysTickDecrementsLeft == 0 )
+            {
+                ulSysTickDecrementsLeft = ulTimerCountsForOneTick;
+            }
+
+            /* Calculate the reload value required to wait xExpectedIdleTime
+             * tick periods.  -1 is used because this code normally executes part
+             * way through the first tick period.  But if the SysTick IRQ is now
+             * pending, then clear the IRQ, suppressing the first tick, and correct
+             * the reload value to reflect that the second tick period is already
+             * underway.  The expected idle time is always at least two ticks. */
+            ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
+
+            if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 )
+            {
+                portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT;
+                ulReloadValue -= ulTimerCountsForOneTick;
+            }
+
+            if( ulReloadValue > ulStoppedTimerCompensation )
+            {
+                ulReloadValue -= ulStoppedTimerCompensation;
+            }
+
+            /* Set the new reload value. */
+            portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
+
+            /* Clear the SysTick count flag and set the count value back to
+             * zero. */
+            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+
+            /* Restart SysTick. */
+            portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
+
+            /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can
+             * set its parameter to 0 to indicate that its implementation contains
+             * its own wait for interrupt or wait for event instruction, and so wfi
+             * should not be executed again.  However, the original expected idle
+             * time variable must remain unmodified, so a copy is taken. */
+            xModifiableIdleTime = xExpectedIdleTime;
+            configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
+
+            if( xModifiableIdleTime > 0 )
+            {
+                __DSB();
+                __WFI();
+                __ISB();
+            }
+
+            configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
+
+            /* Re-enable interrupts to allow the interrupt that brought the MCU
+             * out of sleep mode to execute immediately.  See comments above
+             * the __disable_interrupt() call above. */
+            __enable_interrupt();
+            __DSB();
+            __ISB();
+
+            /* Disable interrupts again because the clock is about to be stopped
+             * and interrupts that execute while the clock is stopped will increase
+             * any slippage between the time maintained by the RTOS and calendar
+             * time. */
+            __disable_interrupt();
+            __DSB();
+            __ISB();
+
+            /* Disable the SysTick clock without reading the
+             * portNVIC_SYSTICK_CTRL_REG register to ensure the
+             * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,
+             * the time the SysTick is stopped for is accounted for as best it can
+             * be, but using the tickless mode will inevitably result in some tiny
+             * drift of the time maintained by the kernel with respect to calendar
+             * time*/
+            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );
+
+            /* Determine whether the SysTick has already counted to zero. */
+            if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
+            {
+                uint32_t ulCalculatedLoadValue;
+
+                /* The tick interrupt ended the sleep (or is now pending), and
+                 * a new tick period has started.  Reset portNVIC_SYSTICK_LOAD_REG
+                 * with whatever remains of the new tick period. */
+                ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
+
+                /* Don't allow a tiny value, or values that have somehow
+                 * underflowed because the post sleep hook did something
+                 * that took too long or because the SysTick current-value register
+                 * is zero. */
+                if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
+                {
+                    ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
+                }
+
+                portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
+
+                /* As the pending tick will be processed as soon as this
+                 * function exits, the tick value maintained by the tick is stepped
+                 * forward by one less than the time spent waiting. */
+                ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
+            }
+            else
+            {
+                /* Something other than the tick interrupt ended the sleep. */
+
+                /* Use the SysTick current-value register to determine the
+                 * number of SysTick decrements remaining until the expected idle
+                 * time would have ended. */
+                ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;
+                #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT )
+                {
+                    /* If the SysTick is not using the core clock, the current-
+                     * value register might still be zero here.  In that case, the
+                     * SysTick didn't load from the reload register, and there are
+                     * ulReloadValue decrements remaining in the expected idle
+                     * time, not zero. */
+                    if( ulSysTickDecrementsLeft == 0 )
+                    {
+                        ulSysTickDecrementsLeft = ulReloadValue;
+                    }
+                }
+                #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */
+
+                /* Work out how long the sleep lasted rounded to complete tick
+                 * periods (not the ulReload value which accounted for part
+                 * ticks). */
+                ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft;
+
+                /* How many complete tick periods passed while the processor
+                 * was waiting? */
+                ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
+
+                /* The reload value is set to whatever fraction of a single tick
+                 * period remains. */
+                portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
+            }
+
+            /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again,
+             * then set portNVIC_SYSTICK_LOAD_REG back to its standard value.  If
+             * the SysTick is not using the core clock, temporarily configure it to
+             * use the core clock.  This configuration forces the SysTick to load
+             * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next
+             * cycle of the other clock.  Then portNVIC_SYSTICK_LOAD_REG is ready
+             * to receive the standard value immediately. */
+            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+            portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
+            #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT )
+            {
+                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+            }
+            #else
+            {
+                /* The temporary usage of the core clock has served its purpose,
+                 * as described above.  Resume usage of the other clock. */
+                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT;
+
+                if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
+                {
+                    /* The partial tick period already ended.  Be sure the SysTick
+                     * counts it only once. */
+                    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0;
+                }
+
+                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
+            }
+            #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */
+
+            /* Step the tick to account for any tick periods that elapsed. */
+            vTaskStepTick( ulCompleteTickPeriods );
+
+            /* Exit with interrupts enabled. */
+            __enable_interrupt();
+        }
+    }
+
+#endif /* configUSE_TICKLESS_IDLE */
diff --git a/portable/IAR/ARM_CM0/portasm.s b/portable/IAR/ARM_CM0/portasm.s
index 6ac2d20..768ce41 100644
--- a/portable/IAR/ARM_CM0/portasm.s
+++ b/portable/IAR/ARM_CM0/portasm.s
@@ -1,132 +1,132 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#include <FreeRTOSConfig.h>

-

-	RSEG    CODE:CODE(2)

-	thumb

-

-	EXTERN vPortYieldFromISR

-	EXTERN pxCurrentTCB

-	EXTERN vTaskSwitchContext

-

-	PUBLIC vSetMSP

-	PUBLIC xPortPendSVHandler

-	PUBLIC vPortSVCHandler

-	PUBLIC vPortStartFirstTask

-	PUBLIC ulSetInterruptMaskFromISR

-	PUBLIC vClearInterruptMaskFromISR

-

-/*-----------------------------------------------------------*/

-

-vSetMSP

-	msr msp, r0

-	bx lr

-

-/*-----------------------------------------------------------*/

-

-xPortPendSVHandler:

-	mrs r0, psp

-

-	ldr	r3, =pxCurrentTCB	/* Get the location of the current TCB. */

-	ldr	r2, [r3]

-

-	subs r0, r0, #32		/* Make space for the remaining low registers. */

-	str r0, [r2]			/* Save the new top of stack. */

-	stmia r0!, {r4-r7}		/* Store the low registers that are not saved automatically. */

-	mov r4, r8				/* Store the high registers. */

-	mov r5, r9

-	mov r6, r10

-	mov r7, r11

-	stmia r0!, {r4-r7}

-

-	push {r3, r14}

-	cpsid i

-	bl vTaskSwitchContext

-	cpsie i

-	pop {r2, r3}			/* lr goes in r3. r2 now holds tcb pointer. */

-

-	ldr r1, [r2]

-	ldr r0, [r1]			/* The first item in pxCurrentTCB is the task top of stack. */

-	adds r0, r0, #16		/* Move to the high registers. */

-	ldmia r0!, {r4-r7}		/* Pop the high registers. */

-	mov r8, r4

-	mov r9, r5

-	mov r10, r6

-	mov r11, r7

-

-	msr psp, r0				/* Remember the new top of stack for the task. */

-

-	subs r0, r0, #32		/* Go back for the low registers that are not automatically restored. */

-	ldmia r0!, {r4-r7}		/* Pop low registers.  */

-

-	bx r3

-

-/*-----------------------------------------------------------*/

-

-vPortSVCHandler;

-	/* This function is no longer used, but retained for backward

-	compatibility. */

-	bx lr

-

-/*-----------------------------------------------------------*/

-

-vPortStartFirstTask

-	/* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector

-	table offset register that can be used to locate the initial stack value.

-	Not all M0 parts have the application vector table at address 0. */

-

-	ldr	r3, =pxCurrentTCB	/* Obtain location of pxCurrentTCB. */

-	ldr r1, [r3]

-	ldr r0, [r1]			/* The first item in pxCurrentTCB is the task top of stack. */

-	adds r0, #32			/* Discard everything up to r0. */

-	msr psp, r0				/* This is now the new top of stack to use in the task. */

-	movs r0, #2				/* Switch to the psp stack. */

-	msr CONTROL, r0

-	isb

-	pop {r0-r5}				/* Pop the registers that are saved automatically. */

-	mov lr, r5				/* lr is now in r5. */

-	pop {r3}				/* The return address is now in r3. */

-	pop {r2}				/* Pop and discard the XPSR. */

-	cpsie i					/* The first task has its context and interrupts can be enabled. */

-	bx r3					/* Jump to the user defined task code. */

-

-/*-----------------------------------------------------------*/

-

-ulSetInterruptMaskFromISR

-	mrs r0, PRIMASK

-	cpsid i

-	bx lr

-

-/*-----------------------------------------------------------*/

-

-vClearInterruptMaskFromISR

-	msr PRIMASK, r0

-	bx lr

-

-	END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#include <FreeRTOSConfig.h>
+
+    RSEG    CODE:CODE(2)
+    thumb
+
+    EXTERN vPortYieldFromISR
+    EXTERN pxCurrentTCB
+    EXTERN vTaskSwitchContext
+
+    PUBLIC vSetMSP
+    PUBLIC xPortPendSVHandler
+    PUBLIC vPortSVCHandler
+    PUBLIC vPortStartFirstTask
+    PUBLIC ulSetInterruptMaskFromISR
+    PUBLIC vClearInterruptMaskFromISR
+
+/*-----------------------------------------------------------*/
+
+vSetMSP
+    msr msp, r0
+    bx lr
+
+/*-----------------------------------------------------------*/
+
+xPortPendSVHandler:
+    mrs r0, psp
+
+    ldr r3, =pxCurrentTCB   /* Get the location of the current TCB. */
+    ldr r2, [r3]
+
+    subs r0, r0, #32        /* Make space for the remaining low registers. */
+    str r0, [r2]            /* Save the new top of stack. */
+    stmia r0!, {r4-r7}      /* Store the low registers that are not saved automatically. */
+    mov r4, r8              /* Store the high registers. */
+    mov r5, r9
+    mov r6, r10
+    mov r7, r11
+    stmia r0!, {r4-r7}
+
+    push {r3, r14}
+    cpsid i
+    bl vTaskSwitchContext
+    cpsie i
+    pop {r2, r3}            /* lr goes in r3. r2 now holds tcb pointer. */
+
+    ldr r1, [r2]
+    ldr r0, [r1]            /* The first item in pxCurrentTCB is the task top of stack. */
+    adds r0, r0, #16        /* Move to the high registers. */
+    ldmia r0!, {r4-r7}      /* Pop the high registers. */
+    mov r8, r4
+    mov r9, r5
+    mov r10, r6
+    mov r11, r7
+
+    msr psp, r0             /* Remember the new top of stack for the task. */
+
+    subs r0, r0, #32        /* Go back for the low registers that are not automatically restored. */
+    ldmia r0!, {r4-r7}      /* Pop low registers.  */
+
+    bx r3
+
+/*-----------------------------------------------------------*/
+
+vPortSVCHandler;
+    /* This function is no longer used, but retained for backward
+    compatibility. */
+    bx lr
+
+/*-----------------------------------------------------------*/
+
+vPortStartFirstTask
+    /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector
+    table offset register that can be used to locate the initial stack value.
+    Not all M0 parts have the application vector table at address 0. */
+
+    ldr r3, =pxCurrentTCB   /* Obtain location of pxCurrentTCB. */
+    ldr r1, [r3]
+    ldr r0, [r1]            /* The first item in pxCurrentTCB is the task top of stack. */
+    adds r0, #32            /* Discard everything up to r0. */
+    msr psp, r0             /* This is now the new top of stack to use in the task. */
+    movs r0, #2             /* Switch to the psp stack. */
+    msr CONTROL, r0
+    isb
+    pop {r0-r5}             /* Pop the registers that are saved automatically. */
+    mov lr, r5              /* lr is now in r5. */
+    pop {r3}                /* The return address is now in r3. */
+    pop {r2}                /* Pop and discard the XPSR. */
+    cpsie i                 /* The first task has its context and interrupts can be enabled. */
+    bx r3                   /* Jump to the user defined task code. */
+
+/*-----------------------------------------------------------*/
+
+ulSetInterruptMaskFromISR
+    mrs r0, PRIMASK
+    cpsid i
+    bx lr
+
+/*-----------------------------------------------------------*/
+
+vClearInterruptMaskFromISR
+    msr PRIMASK, r0
+    bx lr
+
+    END
diff --git a/portable/IAR/ARM_CM0/portmacro.h b/portable/IAR/ARM_CM0/portmacro.h
index 56127df..0056158 100644
--- a/portable/IAR/ARM_CM0/portmacro.h
+++ b/portable/IAR/ARM_CM0/portmacro.h
@@ -1,128 +1,128 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-    #define PORTMACRO_H

-

-    #ifdef __cplusplus

-        extern "C" {

-    #endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-    #define portCHAR          char

-    #define portFLOAT         float

-    #define portDOUBLE        double

-    #define portLONG          long

-    #define portSHORT         short

-    #define portSTACK_TYPE    uint32_t

-    #define portBASE_TYPE     long

-

-    typedef portSTACK_TYPE   StackType_t;

-    typedef long             BaseType_t;

-    typedef unsigned long    UBaseType_t;

-

-

-    #if ( configUSE_16_BIT_TICKS == 1 )

-        typedef uint16_t     TickType_t;

-        #define portMAX_DELAY              ( TickType_t ) 0xffff

-    #else

-        typedef uint32_t     TickType_t;

-        #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL

-

-/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

- * not need to be guarded with a critical section. */

-        #define portTICK_TYPE_IS_ATOMIC    1

-    #endif

-/*-----------------------------------------------------------*/

-

-/* Architecture specifics. */

-    #define portSTACK_GROWTH      ( -1 )

-    #define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-    #define portBYTE_ALIGNMENT    8

-/*-----------------------------------------------------------*/

-

-

-/* Scheduler utilities. */

-    extern void vPortYield( void );

-    #define portNVIC_INT_CTRL                           ( ( volatile uint32_t * ) 0xe000ed04 )

-    #define portNVIC_PENDSVSET                          0x10000000

-    #define portYIELD()                                 vPortYield()

-    #define portEND_SWITCHING_ISR( xSwitchRequired )    if( xSwitchRequired ) *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET

-    #define portYIELD_FROM_ISR( x )                     portEND_SWITCHING_ISR( x )

-/*-----------------------------------------------------------*/

-

-

-/* Critical section management. */

-

-    extern void vPortEnterCritical( void );

-    extern void vPortExitCritical( void );

-    extern uint32_t ulSetInterruptMaskFromISR( void );

-    extern void vClearInterruptMaskFromISR( uint32_t ulMask );

-

-    #define portDISABLE_INTERRUPTS()                  __asm volatile ( "cpsid i" )

-    #define portENABLE_INTERRUPTS()                   __asm volatile ( "cpsie i" )

-    #define portENTER_CRITICAL()                      vPortEnterCritical()

-    #define portEXIT_CRITICAL()                       vPortExitCritical()

-    #define portSET_INTERRUPT_MASK_FROM_ISR()         ulSetInterruptMaskFromISR()

-    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    vClearInterruptMaskFromISR( x )

-

-/*-----------------------------------------------------------*/

-

-/* Tickless idle/low power functionality. */

-    #ifndef portSUPPRESS_TICKS_AND_SLEEP

-        extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );

-        #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )    vPortSuppressTicksAndSleep( xExpectedIdleTime )

-    #endif

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )

-    #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )

-

-    #define portNOP()

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

- * the source code because to do so would cause other compilers to generate

- * warnings. */

-    #pragma diag_suppress=Pa082

-

-    #ifdef __cplusplus

-        }

-    #endif

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+    #define PORTMACRO_H
+
+    #ifdef __cplusplus
+        extern "C" {
+    #endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions. */
+    #define portCHAR          char
+    #define portFLOAT         float
+    #define portDOUBLE        double
+    #define portLONG          long
+    #define portSHORT         short
+    #define portSTACK_TYPE    uint32_t
+    #define portBASE_TYPE     long
+
+    typedef portSTACK_TYPE   StackType_t;
+    typedef long             BaseType_t;
+    typedef unsigned long    UBaseType_t;
+
+
+    #if ( configUSE_16_BIT_TICKS == 1 )
+        typedef uint16_t     TickType_t;
+        #define portMAX_DELAY              ( TickType_t ) 0xffff
+    #else
+        typedef uint32_t     TickType_t;
+        #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL
+
+/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+ * not need to be guarded with a critical section. */
+        #define portTICK_TYPE_IS_ATOMIC    1
+    #endif
+/*-----------------------------------------------------------*/
+
+/* Architecture specifics. */
+    #define portSTACK_GROWTH      ( -1 )
+    #define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+    #define portBYTE_ALIGNMENT    8
+/*-----------------------------------------------------------*/
+
+
+/* Scheduler utilities. */
+    extern void vPortYield( void );
+    #define portNVIC_INT_CTRL                           ( ( volatile uint32_t * ) 0xe000ed04 )
+    #define portNVIC_PENDSVSET                          0x10000000
+    #define portYIELD()                                 vPortYield()
+    #define portEND_SWITCHING_ISR( xSwitchRequired )    if( xSwitchRequired ) *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET
+    #define portYIELD_FROM_ISR( x )                     portEND_SWITCHING_ISR( x )
+/*-----------------------------------------------------------*/
+
+
+/* Critical section management. */
+
+    extern void vPortEnterCritical( void );
+    extern void vPortExitCritical( void );
+    extern uint32_t ulSetInterruptMaskFromISR( void );
+    extern void vClearInterruptMaskFromISR( uint32_t ulMask );
+
+    #define portDISABLE_INTERRUPTS()                  __asm volatile ( "cpsid i" )
+    #define portENABLE_INTERRUPTS()                   __asm volatile ( "cpsie i" )
+    #define portENTER_CRITICAL()                      vPortEnterCritical()
+    #define portEXIT_CRITICAL()                       vPortExitCritical()
+    #define portSET_INTERRUPT_MASK_FROM_ISR()         ulSetInterruptMaskFromISR()
+    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    vClearInterruptMaskFromISR( x )
+
+/*-----------------------------------------------------------*/
+
+/* Tickless idle/low power functionality. */
+    #ifndef portSUPPRESS_TICKS_AND_SLEEP
+        extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
+        #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )    vPortSuppressTicksAndSleep( xExpectedIdleTime )
+    #endif
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )
+    #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )
+
+    #define portNOP()
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+ * the source code because to do so would cause other compilers to generate
+ * warnings. */
+    #pragma diag_suppress=Pa082
+
+    #ifdef __cplusplus
+        }
+    #endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CM23/non_secure/portasm.h b/portable/IAR/ARM_CM23/non_secure/portasm.h
index b37f6d1..ecd86b9 100644
--- a/portable/IAR/ARM_CM23/non_secure/portasm.h
+++ b/portable/IAR/ARM_CM23/non_secure/portasm.h
@@ -1,114 +1,114 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __PORT_ASM_H__

-#define __PORT_ASM_H__

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-

-/* MPU wrappers includes. */

-#include "mpu_wrappers.h"

-

-/**

- * @brief Restore the context of the first task so that the first task starts

- * executing.

- */

-void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Checks whether or not the processor is privileged.

- *

- * @return 1 if the processor is already privileged, 0 otherwise.

- */

-BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Raises the privilege level by clearing the bit 0 of the CONTROL

- * register.

- *

- * @note This is a privileged function and should only be called from the kenrel

- * code.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Lowers the privilege level by setting the bit 0 of the CONTROL

- * register.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vResetPrivilege( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Starts the first task.

- */

-void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Disables interrupts.

- */

-uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Enables interrupts.

- */

-void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief PendSV Exception handler.

- */

-void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief SVC Handler.

- */

-void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Allocate a Secure context for the calling task.

- *

- * @param[in] ulSecureStackSize The size of the stack to be allocated on the

- * secure side for the calling task.

- */

-void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );

-

-/**

- * @brief Free the task's secure context.

- *

- * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.

- */

-void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-#endif /* __PORT_ASM_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __PORT_ASM_H__
+#define __PORT_ASM_H__
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+
+/* MPU wrappers includes. */
+#include "mpu_wrappers.h"
+
+/**
+ * @brief Restore the context of the first task so that the first task starts
+ * executing.
+ */
+void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Checks whether or not the processor is privileged.
+ *
+ * @return 1 if the processor is already privileged, 0 otherwise.
+ */
+BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Raises the privilege level by clearing the bit 0 of the CONTROL
+ * register.
+ *
+ * @note This is a privileged function and should only be called from the kenrel
+ * code.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Lowers the privilege level by setting the bit 0 of the CONTROL
+ * register.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vResetPrivilege( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Starts the first task.
+ */
+void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Disables interrupts.
+ */
+uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Enables interrupts.
+ */
+void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief PendSV Exception handler.
+ */
+void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief SVC Handler.
+ */
+void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Allocate a Secure context for the calling task.
+ *
+ * @param[in] ulSecureStackSize The size of the stack to be allocated on the
+ * secure side for the calling task.
+ */
+void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );
+
+/**
+ * @brief Free the task's secure context.
+ *
+ * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
+ */
+void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+#endif /* __PORT_ASM_H__ */
diff --git a/portable/IAR/ARM_CM23/non_secure/portasm.s b/portable/IAR/ARM_CM23/non_secure/portasm.s
index 705889e..fffed8d 100644
--- a/portable/IAR/ARM_CM23/non_secure/portasm.s
+++ b/portable/IAR/ARM_CM23/non_secure/portasm.s
@@ -1,391 +1,391 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Including FreeRTOSConfig.h here will cause build errors if the header file

-contains code not understood by the assembler - for example the 'extern' keyword.

-To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so

-the code is included in C files but excluded by the preprocessor in assembly

-files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */

-#include "FreeRTOSConfig.h"

-

-	EXTERN pxCurrentTCB

-	EXTERN xSecureContext

-	EXTERN vTaskSwitchContext

-	EXTERN vPortSVCHandler_C

-	EXTERN SecureContext_SaveContext

-	EXTERN SecureContext_LoadContext

-

-	PUBLIC xIsPrivileged

-	PUBLIC vResetPrivilege

-	PUBLIC vPortAllocateSecureContext

-	PUBLIC vRestoreContextOfFirstTask

-	PUBLIC vRaisePrivilege

-	PUBLIC vStartFirstTask

-	PUBLIC ulSetInterruptMask

-	PUBLIC vClearInterruptMask

-	PUBLIC PendSV_Handler

-	PUBLIC SVC_Handler

-	PUBLIC vPortFreeSecureContext

-

-#if ( configENABLE_FPU == 1 )

-	#error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.

-#endif

-/*-----------------------------------------------------------*/

-

-/*---------------- Unprivileged Functions -------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION .text:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-xIsPrivileged:

-	mrs r0, control							/* r0 = CONTROL. */

-	movs r1, #1								/* r1 = 1. */

-	tst r0, r1								/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */

-	beq running_privileged					/* If the result of previous AND operation was 0, branch. */

-	movs r0, #0								/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */

-	bx lr									/* Return. */

-	running_privileged:

-		movs r0, #1							/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */

-		bx lr								/* Return. */

-/*-----------------------------------------------------------*/

-

-vResetPrivilege:

-	mrs r0, control							/* r0 = CONTROL. */

-	movs r1, #1								/* r1 = 1. */

-	orrs r0, r1								/* r0 = r0 | r1. */

-	msr control, r0							/* CONTROL = r0. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-vPortAllocateSecureContext:

-	svc 0									/* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-/*----------------- Privileged Functions --------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION privileged_functions:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-vRestoreContextOfFirstTask:

-	ldr  r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr  r3, [r2]							/* Read pxCurrentTCB. */

-	ldr  r0, [r3]							/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */

-

-#if ( configENABLE_MPU == 1 )

-	dmb										/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	movs r5, #1								/* r5 = 1. */

-	bics r4, r5								/* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */

-	str r4, [r2]							/* Disable MPU. */

-

-	adds r3, #4								/* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */

-	ldr  r4, [r3]							/* r4 = *r3 i.e. r4 = MAIR0. */

-	ldr  r2, =0xe000edc0					/* r2 = 0xe000edc0 [Location of MAIR0]. */

-	str  r4, [r2]							/* Program MAIR0. */

-	ldr  r2, =0xe000ed98					/* r2 = 0xe000ed98 [Location of RNR]. */

-	adds r3, #4								/* r3 = r3 + 4. r3 now points to first RBAR in TCB. */

-	movs r5, #4								/* r5 = 4. */

-	str  r5, [r2]							/* Program RNR = 4. */

-	ldmia r3!, {r6,r7}						/* Read first set of RBAR/RLAR from TCB. */

-	ldr  r4, =0xe000ed9c					/* r4 = 0xe000ed9c [Location of RBAR]. */

-	stmia r4!, {r6,r7}						/* Write first set of RBAR/RLAR registers. */

-	movs r5, #5								/* r5 = 5. */

-	str  r5, [r2]							/* Program RNR = 5. */

-	ldmia r3!, {r6,r7}						/* Read second set of RBAR/RLAR from TCB. */

-	ldr  r4, =0xe000ed9c					/* r4 = 0xe000ed9c [Location of RBAR]. */

-	stmia r4!, {r6,r7}						/* Write second set of RBAR/RLAR registers. */

-	movs r5, #6								/* r5 = 6. */

-	str  r5, [r2]							/* Program RNR = 6. */

-	ldmia r3!, {r6,r7}						/* Read third set of RBAR/RLAR from TCB. */

-	ldr  r4, =0xe000ed9c					/* r4 = 0xe000ed9c [Location of RBAR]. */

-	stmia r4!, {r6,r7}						/* Write third set of RBAR/RLAR registers. */

-	movs r5, #7								/* r5 = 7. */

-	str  r5, [r2]							/* Program RNR = 7. */

-	ldmia r3!, {r6,r7}						/* Read fourth set of RBAR/RLAR from TCB. */

-	ldr  r4, =0xe000ed9c					/* r4 = 0xe000ed9c [Location of RBAR]. */

-	stmia r4!, {r6,r7}						/* Write fourth set of RBAR/RLAR registers. */

-

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	movs r5, #1								/* r5 = 1. */

-	orrs r4, r5								/* r4 = r4 | r5 i.e. Set the bit 0 in r4. */

-	str r4, [r2]							/* Enable MPU. */

-	dsb										/* Force memory writes before continuing. */

-#endif /* configENABLE_MPU */

-

-#if ( configENABLE_MPU == 1 )

-	ldm  r0!, {r1-r4}						/* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */

-	ldr  r5, =xSecureContext

-	str  r1, [r5]							/* Set xSecureContext to this task's value for the same. */

-	msr  psplim, r2							/* Set this task's PSPLIM value. */

-	msr  control, r3						/* Set this task's CONTROL value. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	bx   r4									/* Finally, branch to EXC_RETURN. */

-#else /* configENABLE_MPU */

-	ldm  r0!, {r1-r3}						/* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */

-	ldr  r4, =xSecureContext

-	str  r1, [r4]							/* Set xSecureContext to this task's value for the same. */

-	msr  psplim, r2							/* Set this task's PSPLIM value. */

-	movs r1, #2								/* r1 = 2. */

-	msr  CONTROL, r1						/* Switch to use PSP in the thread mode. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	bx   r3									/* Finally, branch to EXC_RETURN. */

-#endif /* configENABLE_MPU */

-/*-----------------------------------------------------------*/

-

-vRaisePrivilege:

-	mrs r0, control							/* Read the CONTROL register. */

-	movs r1, #1								/* r1 = 1. */

-	bics r0, r1								/* Clear the bit 0. */

-	msr control, r0							/* Write back the new CONTROL value. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-vStartFirstTask:

-	ldr r0, =0xe000ed08						/* Use the NVIC offset register to locate the stack. */

-	ldr r0, [r0]							/* Read the VTOR register which gives the address of vector table. */

-	ldr r0, [r0]							/* The first entry in vector table is stack pointer. */

-	msr msp, r0								/* Set the MSP back to the start of the stack. */

-	cpsie i									/* Globally enable interrupts. */

-	dsb

-	isb

-	svc 2									/* System call to start the first task. portSVC_START_SCHEDULER = 2. */

-/*-----------------------------------------------------------*/

-

-ulSetInterruptMask:

-	mrs r0, PRIMASK

-	cpsid i

-	bx lr

-/*-----------------------------------------------------------*/

-

-vClearInterruptMask:

-	msr PRIMASK, r0

-	bx lr

-/*-----------------------------------------------------------*/

-

-PendSV_Handler:

-	ldr r3, =xSecureContext					/* Read the location of xSecureContext i.e. &( xSecureContext ). */

-	ldr r0, [r3]							/* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */

-	ldr r3, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r3]							/* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */

-	mrs r2, psp								/* Read PSP in r2. */

-

-	cbz r0, save_ns_context					/* No secure context to save. */

-	push {r0-r2, r14}

-	bl SecureContext_SaveContext			/* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */

-	pop {r0-r3}								/* LR is now in r3. */

-	mov lr, r3								/* LR = r3. */

-	lsls r1, r3, #25						/* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */

-	bpl save_ns_context						/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */

-	ldr r3, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r3]							/* Read pxCurrentTCB. */

-#if ( configENABLE_MPU == 1 )

-	subs r2, r2, #16						/* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */

-	str r2, [r1]							/* Save the new top of stack in TCB. */

-	mrs r1, psplim							/* r1 = PSPLIM. */

-	mrs r3, control							/* r3 = CONTROL. */

-	mov r4, lr								/* r4 = LR/EXC_RETURN. */

-	stmia r2!, {r0, r1, r3, r4}				/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */

-#else /* configENABLE_MPU */

-	subs r2, r2, #12						/* Make space for xSecureContext, PSPLIM and LR on the stack. */

-	str r2, [r1]							/* Save the new top of stack in TCB. */

-	mrs r1, psplim							/* r1 = PSPLIM. */

-	mov r3, lr								/* r3 = LR/EXC_RETURN. */

-	stmia r2!, {r0, r1, r3}					/* Store xSecureContext, PSPLIM and LR on the stack. */

-#endif /* configENABLE_MPU */

-	b select_next_task

-

-	save_ns_context:

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-	#if ( configENABLE_MPU == 1 )

-		subs r2, r2, #48					/* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */

-		str r2, [r1]						/* Save the new top of stack in TCB. */

-		adds r2, r2, #16					/* r2 = r2 + 16. */

-		stmia r2!, {r4-r7}					/* Store the low registers that are not saved automatically. */

-		mov r4, r8							/* r4 = r8. */

-		mov r5, r9							/* r5 = r9. */

-		mov r6, r10							/* r6 = r10. */

-		mov r7, r11							/* r7 = r11. */

-		stmia r2!, {r4-r7}					/* Store the high registers that are not saved automatically. */

-		mrs r1, psplim						/* r1 = PSPLIM. */

-		mrs r3, control						/* r3 = CONTROL. */

-		mov r4, lr							/* r4 = LR/EXC_RETURN. */

-		subs r2, r2, #48					/* r2 = r2 - 48. */

-		stmia r2!, {r0, r1, r3, r4}			/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */

-	#else /* configENABLE_MPU */

-		subs r2, r2, #44					/* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */

-		str r2, [r1]						/* Save the new top of stack in TCB. */

-		mrs r1, psplim						/* r1 = PSPLIM. */

-		mov r3, lr							/* r3 = LR/EXC_RETURN. */

-		stmia r2!, {r0, r1, r3-r7}			/* Store xSecureContext, PSPLIM, LR and the low registers that are not saved automatically. */

-		mov r4, r8							/* r4 = r8. */

-		mov r5, r9							/* r5 = r9. */

-		mov r6, r10							/* r6 = r10. */

-		mov r7, r11							/* r7 = r11. */

-		stmia r2!, {r4-r7}					/* Store the high registers that are not saved automatically. */

-	#endif /* configENABLE_MPU */

-

-	select_next_task:

-		cpsid i

-		bl vTaskSwitchContext

-		cpsie i

-

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-		ldr r2, [r1]						/* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */

-

-	#if ( configENABLE_MPU == 1 )

-		dmb									/* Complete outstanding transfers before disabling MPU. */

-		ldr r3, =0xe000ed94					/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */

-		ldr r4, [r3]						/* Read the value of MPU_CTRL. */

-		movs r5, #1							/* r5 = 1. */

-		bics r4, r5							/* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */

-		str r4, [r3]						/* Disable MPU. */

-

-		adds r1, #4							/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */

-		ldr r4, [r1]						/* r4 = *r1 i.e. r4 = MAIR0. */

-		ldr r3, =0xe000edc0					/* r3 = 0xe000edc0 [Location of MAIR0]. */

-		str r4, [r3]						/* Program MAIR0. */

-		ldr r4, =0xe000ed98					/* r4 = 0xe000ed98 [Location of RNR]. */

-		adds r1, #4							/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */

-		movs r5, #4							/* r5 = 4. */

-		str  r5, [r4]						/* Program RNR = 4. */

-		ldmia r1!, {r6,r7}					/* Read first set of RBAR/RLAR from TCB. */

-		ldr  r3, =0xe000ed9c				/* r3 = 0xe000ed9c [Location of RBAR]. */

-		stmia r3!, {r6,r7}					/* Write first set of RBAR/RLAR registers. */

-		movs r5, #5							/* r5 = 5. */

-		str  r5, [r4]						/* Program RNR = 5. */

-		ldmia r1!, {r6,r7}					/* Read second set of RBAR/RLAR from TCB. */

-		ldr  r3, =0xe000ed9c				/* r3 = 0xe000ed9c [Location of RBAR]. */

-		stmia r3!, {r6,r7}					/* Write second set of RBAR/RLAR registers. */

-		movs r5, #6							/* r5 = 6. */

-		str  r5, [r4]						/* Program RNR = 6. */

-		ldmia r1!, {r6,r7}					/* Read third set of RBAR/RLAR from TCB. */

-		ldr  r3, =0xe000ed9c				/* r3 = 0xe000ed9c [Location of RBAR]. */

-		stmia r3!, {r6,r7}					/* Write third set of RBAR/RLAR registers. */

-		movs r5, #7							/* r5 = 7. */

-		str  r5, [r4]						/* Program RNR = 7. */

-		ldmia r1!, {r6,r7}					/* Read fourth set of RBAR/RLAR from TCB. */

-		ldr  r3, =0xe000ed9c				/* r3 = 0xe000ed9c [Location of RBAR]. */

-		stmia r3!, {r6,r7}					/* Write fourth set of RBAR/RLAR registers. */

-

-		ldr r3, =0xe000ed94					/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */

-		ldr r4, [r3]						/* Read the value of MPU_CTRL. */

-		movs r5, #1							/* r5 = 1. */

-		orrs r4, r5							/* r4 = r4 | r5 i.e. Set the bit 0 in r4. */

-		str r4, [r3]						/* Enable MPU. */

-		dsb									/* Force memory writes before continuing. */

-	#endif /* configENABLE_MPU */

-

-	#if ( configENABLE_MPU == 1 )

-		ldmia r2!, {r0, r1, r3, r4}			/* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */

-		msr psplim, r1						/* Restore the PSPLIM register value for the task. */

-		msr control, r3						/* Restore the CONTROL register value for the task. */

-		mov lr, r4							/* LR = r4. */

-		ldr r3, =xSecureContext				/* Read the location of xSecureContext i.e. &( xSecureContext ). */

-		str r0, [r3]						/* Restore the task's xSecureContext. */

-		cbz r0, restore_ns_context			/* If there is no secure context for the task, restore the non-secure context. */

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-		push {r2, r4}

-		bl SecureContext_LoadContext		/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */

-		pop {r2, r4}

-		mov lr, r4							/* LR = r4. */

-		lsls r1, r4, #25					/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */

-		bpl restore_ns_context				/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */

-		msr psp, r2							/* Remember the new top of stack for the task. */

-		bx lr

-	#else /* configENABLE_MPU */

-		ldmia r2!, {r0, r1, r4}				/* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */

-		msr psplim, r1						/* Restore the PSPLIM register value for the task. */

-		mov lr, r4							/* LR = r4. */

-		ldr r3, =xSecureContext				/* Read the location of xSecureContext i.e. &( xSecureContext ). */

-		str r0, [r3]						/* Restore the task's xSecureContext. */

-		cbz r0, restore_ns_context			/* If there is no secure context for the task, restore the non-secure context. */

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-		push {r2, r4}

-		bl SecureContext_LoadContext		/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */

-		pop {r2, r4}

-		mov lr, r4							/* LR = r4. */

-		lsls r1, r4, #25					/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */

-		bpl restore_ns_context				/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */

-		msr psp, r2							/* Remember the new top of stack for the task. */

-		bx lr

-	#endif /* configENABLE_MPU */

-

-	restore_ns_context:

-		adds r2, r2, #16					/* Move to the high registers. */

-		ldmia r2!, {r4-r7}					/* Restore the high registers that are not automatically restored. */

-		mov r8, r4							/* r8 = r4. */

-		mov r9, r5							/* r9 = r5. */

-		mov r10, r6							/* r10 = r6. */

-		mov r11, r7							/* r11 = r7. */

-		msr psp, r2							/* Remember the new top of stack for the task. */

-		subs r2, r2, #32					/* Go back to the low registers. */

-		ldmia r2!, {r4-r7}					/* Restore the low registers that are not automatically restored. */

-		bx lr

-/*-----------------------------------------------------------*/

-

-SVC_Handler:

-	movs r0, #4

-	mov r1, lr

-	tst r0, r1

-	beq stacking_used_msp

-	mrs r0, psp

-	b vPortSVCHandler_C

-	stacking_used_msp:

-		mrs r0, msp

-		b vPortSVCHandler_C

-/*-----------------------------------------------------------*/

-

-vPortFreeSecureContext:

-	ldr r2, [r0]							/* The first item in the TCB is the top of the stack. */

-	ldr r1, [r2]							/* The first item on the stack is the task's xSecureContext. */

-	cmp r1, #0								/* Raise svc if task's xSecureContext is not NULL. */

-	bne free_secure_context					/* Branch if r1 != 0. */

-	bx lr									/* There is no secure context (xSecureContext is NULL). */

-	free_secure_context:

-		svc 1								/* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */

-		bx lr								/* Return. */

-/*-----------------------------------------------------------*/

-

-	END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Including FreeRTOSConfig.h here will cause build errors if the header file
+contains code not understood by the assembler - for example the 'extern' keyword.
+To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
+the code is included in C files but excluded by the preprocessor in assembly
+files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
+#include "FreeRTOSConfig.h"
+
+    EXTERN pxCurrentTCB
+    EXTERN xSecureContext
+    EXTERN vTaskSwitchContext
+    EXTERN vPortSVCHandler_C
+    EXTERN SecureContext_SaveContext
+    EXTERN SecureContext_LoadContext
+
+    PUBLIC xIsPrivileged
+    PUBLIC vResetPrivilege
+    PUBLIC vPortAllocateSecureContext
+    PUBLIC vRestoreContextOfFirstTask
+    PUBLIC vRaisePrivilege
+    PUBLIC vStartFirstTask
+    PUBLIC ulSetInterruptMask
+    PUBLIC vClearInterruptMask
+    PUBLIC PendSV_Handler
+    PUBLIC SVC_Handler
+    PUBLIC vPortFreeSecureContext
+
+#if ( configENABLE_FPU == 1 )
+    #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.
+#endif
+/*-----------------------------------------------------------*/
+
+/*---------------- Unprivileged Functions -------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+xIsPrivileged:
+    mrs r0, control                         /* r0 = CONTROL. */
+    movs r1, #1                             /* r1 = 1. */
+    tst r0, r1                              /* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
+    beq running_privileged                  /* If the result of previous AND operation was 0, branch. */
+    movs r0, #0                             /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
+    bx lr                                   /* Return. */
+    running_privileged:
+        movs r0, #1                         /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
+        bx lr                               /* Return. */
+/*-----------------------------------------------------------*/
+
+vResetPrivilege:
+    mrs r0, control                         /* r0 = CONTROL. */
+    movs r1, #1                             /* r1 = 1. */
+    orrs r0, r1                             /* r0 = r0 | r1. */
+    msr control, r0                         /* CONTROL = r0. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+vPortAllocateSecureContext:
+    svc 0                                   /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+/*----------------- Privileged Functions --------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION privileged_functions:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+vRestoreContextOfFirstTask:
+    ldr  r2, =pxCurrentTCB                  /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr  r3, [r2]                           /* Read pxCurrentTCB. */
+    ldr  r0, [r3]                           /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
+
+#if ( configENABLE_MPU == 1 )
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    movs r5, #1                             /* r5 = 1. */
+    bics r4, r5                             /* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */
+    str r4, [r2]                            /* Disable MPU. */
+
+    adds r3, #4                             /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
+    ldr  r4, [r3]                           /* r4 = *r3 i.e. r4 = MAIR0. */
+    ldr  r2, =0xe000edc0                    /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str  r4, [r2]                           /* Program MAIR0. */
+    ldr  r2, =0xe000ed98                    /* r2 = 0xe000ed98 [Location of RNR]. */
+    adds r3, #4                             /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
+    movs r5, #4                             /* r5 = 4. */
+    str  r5, [r2]                           /* Program RNR = 4. */
+    ldmia r3!, {r6,r7}                      /* Read first set of RBAR/RLAR from TCB. */
+    ldr  r4, =0xe000ed9c                    /* r4 = 0xe000ed9c [Location of RBAR]. */
+    stmia r4!, {r6,r7}                      /* Write first set of RBAR/RLAR registers. */
+    movs r5, #5                             /* r5 = 5. */
+    str  r5, [r2]                           /* Program RNR = 5. */
+    ldmia r3!, {r6,r7}                      /* Read second set of RBAR/RLAR from TCB. */
+    ldr  r4, =0xe000ed9c                    /* r4 = 0xe000ed9c [Location of RBAR]. */
+    stmia r4!, {r6,r7}                      /* Write second set of RBAR/RLAR registers. */
+    movs r5, #6                             /* r5 = 6. */
+    str  r5, [r2]                           /* Program RNR = 6. */
+    ldmia r3!, {r6,r7}                      /* Read third set of RBAR/RLAR from TCB. */
+    ldr  r4, =0xe000ed9c                    /* r4 = 0xe000ed9c [Location of RBAR]. */
+    stmia r4!, {r6,r7}                      /* Write third set of RBAR/RLAR registers. */
+    movs r5, #7                             /* r5 = 7. */
+    str  r5, [r2]                           /* Program RNR = 7. */
+    ldmia r3!, {r6,r7}                      /* Read fourth set of RBAR/RLAR from TCB. */
+    ldr  r4, =0xe000ed9c                    /* r4 = 0xe000ed9c [Location of RBAR]. */
+    stmia r4!, {r6,r7}                      /* Write fourth set of RBAR/RLAR registers. */
+
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    movs r5, #1                             /* r5 = 1. */
+    orrs r4, r5                             /* r4 = r4 | r5 i.e. Set the bit 0 in r4. */
+    str r4, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
+#endif /* configENABLE_MPU */
+
+#if ( configENABLE_MPU == 1 )
+    ldm  r0!, {r1-r4}                       /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */
+    ldr  r5, =xSecureContext
+    str  r1, [r5]                           /* Set xSecureContext to this task's value for the same. */
+    msr  psplim, r2                         /* Set this task's PSPLIM value. */
+    msr  control, r3                        /* Set this task's CONTROL value. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    bx   r4                                 /* Finally, branch to EXC_RETURN. */
+#else /* configENABLE_MPU */
+    ldm  r0!, {r1-r3}                       /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
+    ldr  r4, =xSecureContext
+    str  r1, [r4]                           /* Set xSecureContext to this task's value for the same. */
+    msr  psplim, r2                         /* Set this task's PSPLIM value. */
+    movs r1, #2                             /* r1 = 2. */
+    msr  CONTROL, r1                        /* Switch to use PSP in the thread mode. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    bx   r3                                 /* Finally, branch to EXC_RETURN. */
+#endif /* configENABLE_MPU */
+/*-----------------------------------------------------------*/
+
+vRaisePrivilege:
+    mrs r0, control                         /* Read the CONTROL register. */
+    movs r1, #1                             /* r1 = 1. */
+    bics r0, r1                             /* Clear the bit 0. */
+    msr control, r0                         /* Write back the new CONTROL value. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+vStartFirstTask:
+    ldr r0, =0xe000ed08                     /* Use the NVIC offset register to locate the stack. */
+    ldr r0, [r0]                            /* Read the VTOR register which gives the address of vector table. */
+    ldr r0, [r0]                            /* The first entry in vector table is stack pointer. */
+    msr msp, r0                             /* Set the MSP back to the start of the stack. */
+    cpsie i                                 /* Globally enable interrupts. */
+    dsb
+    isb
+    svc 2                                   /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
+/*-----------------------------------------------------------*/
+
+ulSetInterruptMask:
+    mrs r0, PRIMASK
+    cpsid i
+    bx lr
+/*-----------------------------------------------------------*/
+
+vClearInterruptMask:
+    msr PRIMASK, r0
+    bx lr
+/*-----------------------------------------------------------*/
+
+PendSV_Handler:
+    ldr r3, =xSecureContext                 /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+    ldr r0, [r3]                            /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */
+    ldr r3, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r3]                            /* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */
+    mrs r2, psp                             /* Read PSP in r2. */
+
+    cbz r0, save_ns_context                 /* No secure context to save. */
+    push {r0-r2, r14}
+    bl SecureContext_SaveContext            /* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+    pop {r0-r3}                             /* LR is now in r3. */
+    mov lr, r3                              /* LR = r3. */
+    lsls r1, r3, #25                        /* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+    bpl save_ns_context                     /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+    ldr r3, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r3]                            /* Read pxCurrentTCB. */
+#if ( configENABLE_MPU == 1 )
+    subs r2, r2, #16                        /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+    str r2, [r1]                            /* Save the new top of stack in TCB. */
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mrs r3, control                         /* r3 = CONTROL. */
+    mov r4, lr                              /* r4 = LR/EXC_RETURN. */
+    stmia r2!, {r0, r1, r3, r4}             /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+#else /* configENABLE_MPU */
+    subs r2, r2, #12                        /* Make space for xSecureContext, PSPLIM and LR on the stack. */
+    str r2, [r1]                            /* Save the new top of stack in TCB. */
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmia r2!, {r0, r1, r3}                 /* Store xSecureContext, PSPLIM and LR on the stack. */
+#endif /* configENABLE_MPU */
+    b select_next_task
+
+    save_ns_context:
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+    #if ( configENABLE_MPU == 1 )
+        subs r2, r2, #48                    /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */
+        str r2, [r1]                        /* Save the new top of stack in TCB. */
+        adds r2, r2, #16                    /* r2 = r2 + 16. */
+        stmia r2!, {r4-r7}                  /* Store the low registers that are not saved automatically. */
+        mov r4, r8                          /* r4 = r8. */
+        mov r5, r9                          /* r5 = r9. */
+        mov r6, r10                         /* r6 = r10. */
+        mov r7, r11                         /* r7 = r11. */
+        stmia r2!, {r4-r7}                  /* Store the high registers that are not saved automatically. */
+        mrs r1, psplim                      /* r1 = PSPLIM. */
+        mrs r3, control                     /* r3 = CONTROL. */
+        mov r4, lr                          /* r4 = LR/EXC_RETURN. */
+        subs r2, r2, #48                    /* r2 = r2 - 48. */
+        stmia r2!, {r0, r1, r3, r4}         /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+    #else /* configENABLE_MPU */
+        subs r2, r2, #44                    /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */
+        str r2, [r1]                        /* Save the new top of stack in TCB. */
+        mrs r1, psplim                      /* r1 = PSPLIM. */
+        mov r3, lr                          /* r3 = LR/EXC_RETURN. */
+        stmia r2!, {r0, r1, r3-r7}          /* Store xSecureContext, PSPLIM, LR and the low registers that are not saved automatically. */
+        mov r4, r8                          /* r4 = r8. */
+        mov r5, r9                          /* r5 = r9. */
+        mov r6, r10                         /* r6 = r10. */
+        mov r7, r11                         /* r7 = r11. */
+        stmia r2!, {r4-r7}                  /* Store the high registers that are not saved automatically. */
+    #endif /* configENABLE_MPU */
+
+    select_next_task:
+        cpsid i
+        bl vTaskSwitchContext
+        cpsie i
+
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        ldr r2, [r1]                        /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
+
+    #if ( configENABLE_MPU == 1 )
+        dmb                                 /* Complete outstanding transfers before disabling MPU. */
+        ldr r3, =0xe000ed94                 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */
+        ldr r4, [r3]                        /* Read the value of MPU_CTRL. */
+        movs r5, #1                         /* r5 = 1. */
+        bics r4, r5                         /* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */
+        str r4, [r3]                        /* Disable MPU. */
+
+        adds r1, #4                         /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+        ldr r4, [r1]                        /* r4 = *r1 i.e. r4 = MAIR0. */
+        ldr r3, =0xe000edc0                 /* r3 = 0xe000edc0 [Location of MAIR0]. */
+        str r4, [r3]                        /* Program MAIR0. */
+        ldr r4, =0xe000ed98                 /* r4 = 0xe000ed98 [Location of RNR]. */
+        adds r1, #4                         /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+        movs r5, #4                         /* r5 = 4. */
+        str  r5, [r4]                       /* Program RNR = 4. */
+        ldmia r1!, {r6,r7}                  /* Read first set of RBAR/RLAR from TCB. */
+        ldr  r3, =0xe000ed9c                /* r3 = 0xe000ed9c [Location of RBAR]. */
+        stmia r3!, {r6,r7}                  /* Write first set of RBAR/RLAR registers. */
+        movs r5, #5                         /* r5 = 5. */
+        str  r5, [r4]                       /* Program RNR = 5. */
+        ldmia r1!, {r6,r7}                  /* Read second set of RBAR/RLAR from TCB. */
+        ldr  r3, =0xe000ed9c                /* r3 = 0xe000ed9c [Location of RBAR]. */
+        stmia r3!, {r6,r7}                  /* Write second set of RBAR/RLAR registers. */
+        movs r5, #6                         /* r5 = 6. */
+        str  r5, [r4]                       /* Program RNR = 6. */
+        ldmia r1!, {r6,r7}                  /* Read third set of RBAR/RLAR from TCB. */
+        ldr  r3, =0xe000ed9c                /* r3 = 0xe000ed9c [Location of RBAR]. */
+        stmia r3!, {r6,r7}                  /* Write third set of RBAR/RLAR registers. */
+        movs r5, #7                         /* r5 = 7. */
+        str  r5, [r4]                       /* Program RNR = 7. */
+        ldmia r1!, {r6,r7}                  /* Read fourth set of RBAR/RLAR from TCB. */
+        ldr  r3, =0xe000ed9c                /* r3 = 0xe000ed9c [Location of RBAR]. */
+        stmia r3!, {r6,r7}                  /* Write fourth set of RBAR/RLAR registers. */
+
+        ldr r3, =0xe000ed94                 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */
+        ldr r4, [r3]                        /* Read the value of MPU_CTRL. */
+        movs r5, #1                         /* r5 = 1. */
+        orrs r4, r5                         /* r4 = r4 | r5 i.e. Set the bit 0 in r4. */
+        str r4, [r3]                        /* Enable MPU. */
+        dsb                                 /* Force memory writes before continuing. */
+    #endif /* configENABLE_MPU */
+
+    #if ( configENABLE_MPU == 1 )
+        ldmia r2!, {r0, r1, r3, r4}         /* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */
+        msr psplim, r1                      /* Restore the PSPLIM register value for the task. */
+        msr control, r3                     /* Restore the CONTROL register value for the task. */
+        mov lr, r4                          /* LR = r4. */
+        ldr r3, =xSecureContext             /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+        str r0, [r3]                        /* Restore the task's xSecureContext. */
+        cbz r0, restore_ns_context          /* If there is no secure context for the task, restore the non-secure context. */
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        push {r2, r4}
+        bl SecureContext_LoadContext        /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+        pop {r2, r4}
+        mov lr, r4                          /* LR = r4. */
+        lsls r1, r4, #25                    /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+        bpl restore_ns_context              /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
+    #else /* configENABLE_MPU */
+        ldmia r2!, {r0, r1, r4}             /* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */
+        msr psplim, r1                      /* Restore the PSPLIM register value for the task. */
+        mov lr, r4                          /* LR = r4. */
+        ldr r3, =xSecureContext             /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+        str r0, [r3]                        /* Restore the task's xSecureContext. */
+        cbz r0, restore_ns_context          /* If there is no secure context for the task, restore the non-secure context. */
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        push {r2, r4}
+        bl SecureContext_LoadContext        /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+        pop {r2, r4}
+        mov lr, r4                          /* LR = r4. */
+        lsls r1, r4, #25                    /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+        bpl restore_ns_context              /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
+    #endif /* configENABLE_MPU */
+
+    restore_ns_context:
+        adds r2, r2, #16                    /* Move to the high registers. */
+        ldmia r2!, {r4-r7}                  /* Restore the high registers that are not automatically restored. */
+        mov r8, r4                          /* r8 = r4. */
+        mov r9, r5                          /* r9 = r5. */
+        mov r10, r6                         /* r10 = r6. */
+        mov r11, r7                         /* r11 = r7. */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        subs r2, r2, #32                    /* Go back to the low registers. */
+        ldmia r2!, {r4-r7}                  /* Restore the low registers that are not automatically restored. */
+        bx lr
+/*-----------------------------------------------------------*/
+
+SVC_Handler:
+    movs r0, #4
+    mov r1, lr
+    tst r0, r1
+    beq stacking_used_msp
+    mrs r0, psp
+    b vPortSVCHandler_C
+    stacking_used_msp:
+        mrs r0, msp
+        b vPortSVCHandler_C
+/*-----------------------------------------------------------*/
+
+vPortFreeSecureContext:
+    ldr r2, [r0]                            /* The first item in the TCB is the top of the stack. */
+    ldr r1, [r2]                            /* The first item on the stack is the task's xSecureContext. */
+    cmp r1, #0                              /* Raise svc if task's xSecureContext is not NULL. */
+    bne free_secure_context                 /* Branch if r1 != 0. */
+    bx lr                                   /* There is no secure context (xSecureContext is NULL). */
+    free_secure_context:
+        svc 1                               /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */
+        bx lr                               /* Return. */
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/ARM_CM23/non_secure/portmacro.h b/portable/IAR/ARM_CM23/non_secure/portmacro.h
index 0f7326c..d845ac1 100644
--- a/portable/IAR/ARM_CM23/non_secure/portmacro.h
+++ b/portable/IAR/ARM_CM23/non_secure/portmacro.h
@@ -1,78 +1,78 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#ifdef __cplusplus

-    extern "C" {

-#endif

-

-#include "portmacrocommon.h"

-

-/*------------------------------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the given hardware

- * and compiler.

- *

- * These settings should not be altered.

- *------------------------------------------------------------------------------

- */

-

-/**

- * Architecture specifics.

- */

-#define portARCH_NAME                       "Cortex-M23"

-#define portDONT_DISCARD                    __root

-/*-----------------------------------------------------------*/

-

-#if( configTOTAL_MPU_REGIONS == 16 )

-    #error 16 MPU regions are not yet supported for this port.

-#endif

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Critical section management.

- */

-#define portDISABLE_INTERRUPTS()            __asm volatile ( " cpsid i " ::: "memory" )

-#define portENABLE_INTERRUPTS()             __asm volatile ( " cpsie i " ::: "memory" )

-/*-----------------------------------------------------------*/

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

- * the source code because to do so would cause other compilers to generate

- * warnings. */

-#pragma diag_suppress=Be006

-#pragma diag_suppress=Pa082

-/*-----------------------------------------------------------*/

-

-#ifdef __cplusplus

-    }

-#endif

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#ifdef __cplusplus
+    extern "C" {
+#endif
+
+#include "portmacrocommon.h"
+
+/*------------------------------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the given hardware
+ * and compiler.
+ *
+ * These settings should not be altered.
+ *------------------------------------------------------------------------------
+ */
+
+/**
+ * Architecture specifics.
+ */
+#define portARCH_NAME                       "Cortex-M23"
+#define portDONT_DISCARD                    __root
+/*-----------------------------------------------------------*/
+
+#if( configTOTAL_MPU_REGIONS == 16 )
+    #error 16 MPU regions are not yet supported for this port.
+#endif
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Critical section management.
+ */
+#define portDISABLE_INTERRUPTS()            __asm volatile ( " cpsid i " ::: "memory" )
+#define portENABLE_INTERRUPTS()             __asm volatile ( " cpsie i " ::: "memory" )
+/*-----------------------------------------------------------*/
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+ * the source code because to do so would cause other compilers to generate
+ * warnings. */
+#pragma diag_suppress=Be006
+#pragma diag_suppress=Pa082
+/*-----------------------------------------------------------*/
+
+#ifdef __cplusplus
+    }
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h b/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h
index 4b1f99b..51e21ea 100644
--- a/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h
+++ b/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h
@@ -155,9 +155,9 @@
  * 8-bit values encoded as follows:
  *  Bit[7:4] - 0000 - Device Memory
  *  Bit[3:2] - 00 --> Device-nGnRnE
- *				01 --> Device-nGnRE
- *				10 --> Device-nGRE
- *				11 --> Device-GRE
+ *              01 --> Device-nGnRE
+ *              10 --> Device-nGRE
+ *              11 --> Device-GRE
  *  Bit[1:0] - 00, Reserved.
  */
     #define portMPU_DEVICE_MEMORY_nGnRnE                  ( 0x00 )   /* 0000 0000 */
diff --git a/portable/IAR/ARM_CM23/secure/secure_context.c b/portable/IAR/ARM_CM23/secure/secure_context.c
index b1d5503..0730d57 100644
--- a/portable/IAR/ARM_CM23/secure/secure_context.c
+++ b/portable/IAR/ARM_CM23/secure/secure_context.c
@@ -1,351 +1,351 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Secure context includes. */

-#include "secure_context.h"

-

-/* Secure heap includes. */

-#include "secure_heap.h"

-

-/* Secure port macros. */

-#include "secure_port_macros.h"

-

-/**

- * @brief CONTROL value for privileged tasks.

- *

- * Bit[0] - 0 --> Thread mode is privileged.

- * Bit[1] - 1 --> Thread mode uses PSP.

- */

-#define securecontextCONTROL_VALUE_PRIVILEGED      0x02

-

-/**

- * @brief CONTROL value for un-privileged tasks.

- *

- * Bit[0] - 1 --> Thread mode is un-privileged.

- * Bit[1] - 1 --> Thread mode uses PSP.

- */

-#define securecontextCONTROL_VALUE_UNPRIVILEGED    0x03

-

-/**

- * @brief Size of stack seal values in bytes.

- */

-#define securecontextSTACK_SEAL_SIZE               8

-

-/**

- * @brief Stack seal value as recommended by ARM.

- */

-#define securecontextSTACK_SEAL_VALUE              0xFEF5EDA5

-

-/**

- * @brief Maximum number of secure contexts.

- */

-#ifndef secureconfigMAX_SECURE_CONTEXTS

-    #define secureconfigMAX_SECURE_CONTEXTS        8UL

-#endif

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Pre-allocated array of secure contexts.

- */

-SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ];

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Get a free secure context for a task from the secure context pool (xSecureContexts).

- *

- * This function ensures that only one secure context is allocated for a task.

- *

- * @param[in] pvTaskHandle The task handle for which the secure context is allocated.

- *

- * @return Index of a free secure context in the xSecureContexts array.

- */

-static uint32_t ulGetSecureContext( void * pvTaskHandle );

-

-/**

- * @brief Return the secure context to the secure context pool (xSecureContexts).

- *

- * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array.

- */

-static void vReturnSecureContext( uint32_t ulSecureContextIndex );

-

-/* These are implemented in assembly. */

-extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext );

-extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext );

-/*-----------------------------------------------------------*/

-

-static uint32_t ulGetSecureContext( void * pvTaskHandle )

-{

-    /* Start with invalid index. */

-    uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;

-

-    for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )

-    {

-        if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) &&

-            ( xSecureContexts[ i ].pucStackLimit == NULL ) &&

-            ( xSecureContexts[ i ].pucStackStart == NULL ) &&

-            ( xSecureContexts[ i ].pvTaskHandle == NULL ) &&

-            ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) )

-        {

-            ulSecureContextIndex = i;

-        }

-        else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle )

-        {

-            /* A task can only have one secure context. Do not allocate a second

-             * context for the same task. */

-            ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;

-            break;

-        }

-    }

-

-    return ulSecureContextIndex;

-}

-/*-----------------------------------------------------------*/

-

-static void vReturnSecureContext( uint32_t ulSecureContextIndex )

-{

-    xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL;

-    xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL;

-    xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL;

-    xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL;

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_Init( void )

-{

-    uint32_t ulIPSR, i;

-    static uint32_t ulSecureContextsInitialized = 0;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) )

-    {

-        /* Ensure to initialize secure contexts only once. */

-        ulSecureContextsInitialized = 1;

-

-        /* No stack for thread mode until a task's context is loaded. */

-        secureportSET_PSPLIM( securecontextNO_STACK );

-        secureportSET_PSP( securecontextNO_STACK );

-

-        /* Initialize all secure contexts. */

-        for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )

-        {

-            xSecureContexts[ i ].pucCurrentStackPointer = NULL;

-            xSecureContexts[ i ].pucStackLimit = NULL;

-            xSecureContexts[ i ].pucStackStart = NULL;

-            xSecureContexts[ i ].pvTaskHandle = NULL;

-        }

-

-        #if ( configENABLE_MPU == 1 )

-            {

-                /* Configure thread mode to use PSP and to be unprivileged. */

-                secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED );

-            }

-        #else /* configENABLE_MPU */

-            {

-                /* Configure thread mode to use PSP and to be privileged. */

-                secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED );

-            }

-        #endif /* configENABLE_MPU */

-    }

-}

-/*-----------------------------------------------------------*/

-

-#if ( configENABLE_MPU == 1 )

-    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                                                       uint32_t ulIsTaskPrivileged,

-                                                                                       void * pvTaskHandle )

-#else /* configENABLE_MPU */

-    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                                                       void * pvTaskHandle )

-#endif /* configENABLE_MPU */

-{

-    uint8_t * pucStackMemory = NULL;

-    uint8_t * pucStackLimit;

-    uint32_t ulIPSR, ulSecureContextIndex;

-    SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID;

-

-    #if ( configENABLE_MPU == 1 )

-        uint32_t * pulCurrentStackPointer = NULL;

-    #endif /* configENABLE_MPU */

-

-    /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit

-     * Register (PSPLIM) value. */

-    secureportREAD_IPSR( ulIPSR );

-    secureportREAD_PSPLIM( pucStackLimit );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode.

-     * Also do nothing, if a secure context us already loaded. PSPLIM is set to

-     * securecontextNO_STACK when no secure context is loaded. */

-    if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) )

-    {

-        /* Ontain a free secure context. */

-        ulSecureContextIndex = ulGetSecureContext( pvTaskHandle );

-

-        /* Were we able to get a free context? */

-        if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS )

-        {

-            /* Allocate the stack space. */

-            pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE );

-

-            if( pucStackMemory != NULL )

-            {

-                /* Since stack grows down, the starting point will be the last

-                 * location. Note that this location is next to the last

-                 * allocated byte for stack (excluding the space for seal values)

-                 * because the hardware decrements the stack pointer before

-                 * writing i.e. if stack pointer is 0x2, a push operation will

-                 * decrement the stack pointer to 0x1 and then write at 0x1. */

-                xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize;

-

-                /* Seal the created secure process stack. */

-                *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE;

-                *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE;

-

-                /* The stack cannot go beyond this location. This value is

-                 * programmed in the PSPLIM register on context switch.*/

-                xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory;

-

-                xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle;

-

-                #if ( configENABLE_MPU == 1 )

-                    {

-                        /* Store the correct CONTROL value for the task on the stack.

-                         * This value is programmed in the CONTROL register on

-                         * context switch. */

-                        pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart;

-                        pulCurrentStackPointer--;

-

-                        if( ulIsTaskPrivileged )

-                        {

-                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;

-                        }

-                        else

-                        {

-                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED;

-                        }

-

-                        /* Store the current stack pointer. This value is programmed in

-                         * the PSP register on context switch. */

-                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer;

-                    }

-                #else /* configENABLE_MPU */

-                    {

-                        /* Current SP is set to the starting of the stack. This

-                         * value programmed in the PSP register on context switch. */

-                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart;

-                    }

-                #endif /* configENABLE_MPU */

-

-                /* Ensure to never return 0 as a valid context handle. */

-                xSecureContextHandle = ulSecureContextIndex + 1UL;

-            }

-        }

-    }

-

-    return xSecureContextHandle;

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )

-{

-    uint32_t ulIPSR, ulSecureContextIndex;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ulIPSR != 0 )

-    {

-        /* Only free if a valid context handle is passed. */

-        if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )

-        {

-            ulSecureContextIndex = xSecureContextHandle - 1UL;

-

-            /* Ensure that the secure context being deleted is associated with

-             * the task. */

-            if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle )

-            {

-                /* Free the stack space. */

-                vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit );

-

-                /* Return the secure context back to the free secure contexts pool. */

-                vReturnSecureContext( ulSecureContextIndex );

-            }

-        }

-    }

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )

-{

-    uint8_t * pucStackLimit;

-    uint32_t ulSecureContextIndex;

-

-    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )

-    {

-        ulSecureContextIndex = xSecureContextHandle - 1UL;

-

-        secureportREAD_PSPLIM( pucStackLimit );

-

-        /* Ensure that no secure context is loaded and the task is loading it's

-         * own context. */

-        if( ( pucStackLimit == securecontextNO_STACK ) &&

-            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )

-        {

-            SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );

-        }

-    }

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )

-{

-    uint8_t * pucStackLimit;

-    uint32_t ulSecureContextIndex;

-

-    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )

-    {

-        ulSecureContextIndex = xSecureContextHandle - 1UL;

-

-        secureportREAD_PSPLIM( pucStackLimit );

-

-        /* Ensure that task's context is loaded and the task is saving it's own

-         * context. */

-        if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) &&

-            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )

-        {

-            SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );

-        }

-    }

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Secure context includes. */
+#include "secure_context.h"
+
+/* Secure heap includes. */
+#include "secure_heap.h"
+
+/* Secure port macros. */
+#include "secure_port_macros.h"
+
+/**
+ * @brief CONTROL value for privileged tasks.
+ *
+ * Bit[0] - 0 --> Thread mode is privileged.
+ * Bit[1] - 1 --> Thread mode uses PSP.
+ */
+#define securecontextCONTROL_VALUE_PRIVILEGED      0x02
+
+/**
+ * @brief CONTROL value for un-privileged tasks.
+ *
+ * Bit[0] - 1 --> Thread mode is un-privileged.
+ * Bit[1] - 1 --> Thread mode uses PSP.
+ */
+#define securecontextCONTROL_VALUE_UNPRIVILEGED    0x03
+
+/**
+ * @brief Size of stack seal values in bytes.
+ */
+#define securecontextSTACK_SEAL_SIZE               8
+
+/**
+ * @brief Stack seal value as recommended by ARM.
+ */
+#define securecontextSTACK_SEAL_VALUE              0xFEF5EDA5
+
+/**
+ * @brief Maximum number of secure contexts.
+ */
+#ifndef secureconfigMAX_SECURE_CONTEXTS
+    #define secureconfigMAX_SECURE_CONTEXTS        8UL
+#endif
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Pre-allocated array of secure contexts.
+ */
+SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ];
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Get a free secure context for a task from the secure context pool (xSecureContexts).
+ *
+ * This function ensures that only one secure context is allocated for a task.
+ *
+ * @param[in] pvTaskHandle The task handle for which the secure context is allocated.
+ *
+ * @return Index of a free secure context in the xSecureContexts array.
+ */
+static uint32_t ulGetSecureContext( void * pvTaskHandle );
+
+/**
+ * @brief Return the secure context to the secure context pool (xSecureContexts).
+ *
+ * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array.
+ */
+static void vReturnSecureContext( uint32_t ulSecureContextIndex );
+
+/* These are implemented in assembly. */
+extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext );
+extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext );
+/*-----------------------------------------------------------*/
+
+static uint32_t ulGetSecureContext( void * pvTaskHandle )
+{
+    /* Start with invalid index. */
+    uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;
+
+    for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )
+    {
+        if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) &&
+            ( xSecureContexts[ i ].pucStackLimit == NULL ) &&
+            ( xSecureContexts[ i ].pucStackStart == NULL ) &&
+            ( xSecureContexts[ i ].pvTaskHandle == NULL ) &&
+            ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) )
+        {
+            ulSecureContextIndex = i;
+        }
+        else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle )
+        {
+            /* A task can only have one secure context. Do not allocate a second
+             * context for the same task. */
+            ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;
+            break;
+        }
+    }
+
+    return ulSecureContextIndex;
+}
+/*-----------------------------------------------------------*/
+
+static void vReturnSecureContext( uint32_t ulSecureContextIndex )
+{
+    xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL;
+    xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL;
+    xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL;
+    xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL;
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_Init( void )
+{
+    uint32_t ulIPSR, i;
+    static uint32_t ulSecureContextsInitialized = 0;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) )
+    {
+        /* Ensure to initialize secure contexts only once. */
+        ulSecureContextsInitialized = 1;
+
+        /* No stack for thread mode until a task's context is loaded. */
+        secureportSET_PSPLIM( securecontextNO_STACK );
+        secureportSET_PSP( securecontextNO_STACK );
+
+        /* Initialize all secure contexts. */
+        for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )
+        {
+            xSecureContexts[ i ].pucCurrentStackPointer = NULL;
+            xSecureContexts[ i ].pucStackLimit = NULL;
+            xSecureContexts[ i ].pucStackStart = NULL;
+            xSecureContexts[ i ].pvTaskHandle = NULL;
+        }
+
+        #if ( configENABLE_MPU == 1 )
+            {
+                /* Configure thread mode to use PSP and to be unprivileged. */
+                secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED );
+            }
+        #else /* configENABLE_MPU */
+            {
+                /* Configure thread mode to use PSP and to be privileged. */
+                secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED );
+            }
+        #endif /* configENABLE_MPU */
+    }
+}
+/*-----------------------------------------------------------*/
+
+#if ( configENABLE_MPU == 1 )
+    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                                                       uint32_t ulIsTaskPrivileged,
+                                                                                       void * pvTaskHandle )
+#else /* configENABLE_MPU */
+    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                                                       void * pvTaskHandle )
+#endif /* configENABLE_MPU */
+{
+    uint8_t * pucStackMemory = NULL;
+    uint8_t * pucStackLimit;
+    uint32_t ulIPSR, ulSecureContextIndex;
+    SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID;
+
+    #if ( configENABLE_MPU == 1 )
+        uint32_t * pulCurrentStackPointer = NULL;
+    #endif /* configENABLE_MPU */
+
+    /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit
+     * Register (PSPLIM) value. */
+    secureportREAD_IPSR( ulIPSR );
+    secureportREAD_PSPLIM( pucStackLimit );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode.
+     * Also do nothing, if a secure context us already loaded. PSPLIM is set to
+     * securecontextNO_STACK when no secure context is loaded. */
+    if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) )
+    {
+        /* Ontain a free secure context. */
+        ulSecureContextIndex = ulGetSecureContext( pvTaskHandle );
+
+        /* Were we able to get a free context? */
+        if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS )
+        {
+            /* Allocate the stack space. */
+            pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE );
+
+            if( pucStackMemory != NULL )
+            {
+                /* Since stack grows down, the starting point will be the last
+                 * location. Note that this location is next to the last
+                 * allocated byte for stack (excluding the space for seal values)
+                 * because the hardware decrements the stack pointer before
+                 * writing i.e. if stack pointer is 0x2, a push operation will
+                 * decrement the stack pointer to 0x1 and then write at 0x1. */
+                xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize;
+
+                /* Seal the created secure process stack. */
+                *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE;
+                *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE;
+
+                /* The stack cannot go beyond this location. This value is
+                 * programmed in the PSPLIM register on context switch.*/
+                xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory;
+
+                xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle;
+
+                #if ( configENABLE_MPU == 1 )
+                    {
+                        /* Store the correct CONTROL value for the task on the stack.
+                         * This value is programmed in the CONTROL register on
+                         * context switch. */
+                        pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart;
+                        pulCurrentStackPointer--;
+
+                        if( ulIsTaskPrivileged )
+                        {
+                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;
+                        }
+                        else
+                        {
+                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED;
+                        }
+
+                        /* Store the current stack pointer. This value is programmed in
+                         * the PSP register on context switch. */
+                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer;
+                    }
+                #else /* configENABLE_MPU */
+                    {
+                        /* Current SP is set to the starting of the stack. This
+                         * value programmed in the PSP register on context switch. */
+                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart;
+                    }
+                #endif /* configENABLE_MPU */
+
+                /* Ensure to never return 0 as a valid context handle. */
+                xSecureContextHandle = ulSecureContextIndex + 1UL;
+            }
+        }
+    }
+
+    return xSecureContextHandle;
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )
+{
+    uint32_t ulIPSR, ulSecureContextIndex;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ulIPSR != 0 )
+    {
+        /* Only free if a valid context handle is passed. */
+        if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )
+        {
+            ulSecureContextIndex = xSecureContextHandle - 1UL;
+
+            /* Ensure that the secure context being deleted is associated with
+             * the task. */
+            if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle )
+            {
+                /* Free the stack space. */
+                vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit );
+
+                /* Return the secure context back to the free secure contexts pool. */
+                vReturnSecureContext( ulSecureContextIndex );
+            }
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )
+{
+    uint8_t * pucStackLimit;
+    uint32_t ulSecureContextIndex;
+
+    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )
+    {
+        ulSecureContextIndex = xSecureContextHandle - 1UL;
+
+        secureportREAD_PSPLIM( pucStackLimit );
+
+        /* Ensure that no secure context is loaded and the task is loading it's
+         * own context. */
+        if( ( pucStackLimit == securecontextNO_STACK ) &&
+            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )
+        {
+            SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )
+{
+    uint8_t * pucStackLimit;
+    uint32_t ulSecureContextIndex;
+
+    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )
+    {
+        ulSecureContextIndex = xSecureContextHandle - 1UL;
+
+        secureportREAD_PSPLIM( pucStackLimit );
+
+        /* Ensure that task's context is loaded and the task is saving it's own
+         * context. */
+        if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) &&
+            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )
+        {
+            SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );
+        }
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CM23/secure/secure_context.h b/portable/IAR/ARM_CM23/secure/secure_context.h
index 57e390c..d0adbaf 100644
--- a/portable/IAR/ARM_CM23/secure/secure_context.h
+++ b/portable/IAR/ARM_CM23/secure/secure_context.h
@@ -1,135 +1,135 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_CONTEXT_H__

-#define __SECURE_CONTEXT_H__

-

-/* Standard includes. */

-#include <stdint.h>

-

-/* FreeRTOS includes. */

-#include "FreeRTOSConfig.h"

-

-/**

- * @brief PSP value when no secure context is loaded.

- */

-#define securecontextNO_STACK               0x0

-

-/**

- * @brief Invalid context ID.

- */

-#define securecontextINVALID_CONTEXT_ID     0UL

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Structure to represent a secure context.

- *

- * @note Since stack grows down, pucStackStart is the highest address while

- * pucStackLimit is the first address of the allocated memory.

- */

-typedef struct SecureContext

-{

-    uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */

-    uint8_t * pucStackLimit;          /**< Last location of the stack memory (PSPLIM). */

-    uint8_t * pucStackStart;          /**< First location of the stack memory. */

-    void * pvTaskHandle;              /**< Task handle of the task this context is associated with. */

-} SecureContext_t;

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Opaque handle for a secure context.

- */

-typedef uint32_t SecureContextHandle_t;

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Initializes the secure context management system.

- *

- * PSP is set to NULL and therefore a task must allocate and load a context

- * before calling any secure side function in the thread mode.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- */

-void SecureContext_Init( void );

-

-/**

- * @brief Allocates a context on the secure side.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] ulSecureStackSize Size of the stack to allocate on secure side.

- * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise.

- *

- * @return Opaque context handle if context is successfully allocated, NULL

- * otherwise.

- */

-#if ( configENABLE_MPU == 1 )

-    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                         uint32_t ulIsTaskPrivileged,

-                                                         void * pvTaskHandle );

-#else /* configENABLE_MPU */

-    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                         void * pvTaskHandle );

-#endif /* configENABLE_MPU */

-

-/**

- * @brief Frees the given context.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] xSecureContextHandle Context handle corresponding to the

- * context to be freed.

- */

-void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );

-

-/**

- * @brief Loads the given context.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] xSecureContextHandle Context handle corresponding to the context

- * to be loaded.

- */

-void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );

-

-/**

- * @brief Saves the given context.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] xSecureContextHandle Context handle corresponding to the context

- * to be saved.

- */

-void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );

-

-#endif /* __SECURE_CONTEXT_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_CONTEXT_H__
+#define __SECURE_CONTEXT_H__
+
+/* Standard includes. */
+#include <stdint.h>
+
+/* FreeRTOS includes. */
+#include "FreeRTOSConfig.h"
+
+/**
+ * @brief PSP value when no secure context is loaded.
+ */
+#define securecontextNO_STACK               0x0
+
+/**
+ * @brief Invalid context ID.
+ */
+#define securecontextINVALID_CONTEXT_ID     0UL
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Structure to represent a secure context.
+ *
+ * @note Since stack grows down, pucStackStart is the highest address while
+ * pucStackLimit is the first address of the allocated memory.
+ */
+typedef struct SecureContext
+{
+    uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */
+    uint8_t * pucStackLimit;          /**< Last location of the stack memory (PSPLIM). */
+    uint8_t * pucStackStart;          /**< First location of the stack memory. */
+    void * pvTaskHandle;              /**< Task handle of the task this context is associated with. */
+} SecureContext_t;
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Opaque handle for a secure context.
+ */
+typedef uint32_t SecureContextHandle_t;
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Initializes the secure context management system.
+ *
+ * PSP is set to NULL and therefore a task must allocate and load a context
+ * before calling any secure side function in the thread mode.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ */
+void SecureContext_Init( void );
+
+/**
+ * @brief Allocates a context on the secure side.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] ulSecureStackSize Size of the stack to allocate on secure side.
+ * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise.
+ *
+ * @return Opaque context handle if context is successfully allocated, NULL
+ * otherwise.
+ */
+#if ( configENABLE_MPU == 1 )
+    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                         uint32_t ulIsTaskPrivileged,
+                                                         void * pvTaskHandle );
+#else /* configENABLE_MPU */
+    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                         void * pvTaskHandle );
+#endif /* configENABLE_MPU */
+
+/**
+ * @brief Frees the given context.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] xSecureContextHandle Context handle corresponding to the
+ * context to be freed.
+ */
+void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );
+
+/**
+ * @brief Loads the given context.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] xSecureContextHandle Context handle corresponding to the context
+ * to be loaded.
+ */
+void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );
+
+/**
+ * @brief Saves the given context.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] xSecureContextHandle Context handle corresponding to the context
+ * to be saved.
+ */
+void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );
+
+#endif /* __SECURE_CONTEXT_H__ */
diff --git a/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s b/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s
index 1124e82..f7c5d19 100644
--- a/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s
+++ b/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s
@@ -1,88 +1,88 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-    SECTION .text:CODE:NOROOT(2)

-    THUMB

-

-/* Including FreeRTOSConfig.h here will cause build errors if the header file

-contains code not understood by the assembler - for example the 'extern' keyword.

-To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so

-the code is included in C files but excluded by the preprocessor in assembly

-files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */

-#include "FreeRTOSConfig.h"

-

-    PUBLIC SecureContext_LoadContextAsm

-    PUBLIC SecureContext_SaveContextAsm

-

-#if ( configENABLE_FPU == 1 )

-    #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.

-#endif

-/*-----------------------------------------------------------*/

-

-SecureContext_LoadContextAsm:

-    /* pxSecureContext value is in r0. */

-    mrs r1, ipsr                    /* r1 = IPSR. */

-    cbz r1, load_ctx_therad_mode    /* Do nothing if the processor is running in the Thread Mode. */

-    ldmia r0!, {r1, r2}             /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */

-

-#if ( configENABLE_MPU == 1 )

-    ldmia r1!, {r3}                 /* Read CONTROL register value from task's stack. r3 = CONTROL. */

-    msr control, r3                 /* CONTROL = r3. */

-#endif /* configENABLE_MPU */

-

-    msr psplim, r2                  /* PSPLIM = r2. */

-    msr psp, r1                     /* PSP = r1. */

-

-    load_ctx_therad_mode:

-        bx lr

-/*-----------------------------------------------------------*/

-

-SecureContext_SaveContextAsm:

-    /* pxSecureContext value is in r0. */

-    mrs r1, ipsr                    /* r1 = IPSR. */

-    cbz r1, save_ctx_therad_mode    /* Do nothing if the processor is running in the Thread Mode. */

-    mrs r1, psp                     /* r1 = PSP. */

-

-#if ( configENABLE_MPU == 1 )

-    mrs r2, control                 /* r2 = CONTROL. */

-    subs r1, r1, #4                 /* Make space for the CONTROL value on the stack. */

-    str r1, [r0]                    /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */

-    stmia r1!, {r2}                 /* Store CONTROL value on the stack. */

-#else /* configENABLE_MPU */

-    str r1, [r0]                    /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */

-#endif /* configENABLE_MPU */

-

-    movs r1, #0                     /* r1 = securecontextNO_STACK. */

-    msr psplim, r1                  /* PSPLIM = securecontextNO_STACK. */

-    msr psp, r1                     /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */

-

-    save_ctx_therad_mode:

-        bx lr

-/*-----------------------------------------------------------*/

-

-    END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
+
+/* Including FreeRTOSConfig.h here will cause build errors if the header file
+contains code not understood by the assembler - for example the 'extern' keyword.
+To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
+the code is included in C files but excluded by the preprocessor in assembly
+files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
+#include "FreeRTOSConfig.h"
+
+    PUBLIC SecureContext_LoadContextAsm
+    PUBLIC SecureContext_SaveContextAsm
+
+#if ( configENABLE_FPU == 1 )
+    #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.
+#endif
+/*-----------------------------------------------------------*/
+
+SecureContext_LoadContextAsm:
+    /* pxSecureContext value is in r0. */
+    mrs r1, ipsr                    /* r1 = IPSR. */
+    cbz r1, load_ctx_therad_mode    /* Do nothing if the processor is running in the Thread Mode. */
+    ldmia r0!, {r1, r2}             /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */
+
+#if ( configENABLE_MPU == 1 )
+    ldmia r1!, {r3}                 /* Read CONTROL register value from task's stack. r3 = CONTROL. */
+    msr control, r3                 /* CONTROL = r3. */
+#endif /* configENABLE_MPU */
+
+    msr psplim, r2                  /* PSPLIM = r2. */
+    msr psp, r1                     /* PSP = r1. */
+
+    load_ctx_therad_mode:
+        bx lr
+/*-----------------------------------------------------------*/
+
+SecureContext_SaveContextAsm:
+    /* pxSecureContext value is in r0. */
+    mrs r1, ipsr                    /* r1 = IPSR. */
+    cbz r1, save_ctx_therad_mode    /* Do nothing if the processor is running in the Thread Mode. */
+    mrs r1, psp                     /* r1 = PSP. */
+
+#if ( configENABLE_MPU == 1 )
+    mrs r2, control                 /* r2 = CONTROL. */
+    subs r1, r1, #4                 /* Make space for the CONTROL value on the stack. */
+    str r1, [r0]                    /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */
+    stmia r1!, {r2}                 /* Store CONTROL value on the stack. */
+#else /* configENABLE_MPU */
+    str r1, [r0]                    /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */
+#endif /* configENABLE_MPU */
+
+    movs r1, #0                     /* r1 = securecontextNO_STACK. */
+    msr psplim, r1                  /* PSPLIM = securecontextNO_STACK. */
+    msr psp, r1                     /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */
+
+    save_ctx_therad_mode:
+        bx lr
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/ARM_CM23/secure/secure_heap.c b/portable/IAR/ARM_CM23/secure/secure_heap.c
index 741b463..157fdbf 100644
--- a/portable/IAR/ARM_CM23/secure/secure_heap.c
+++ b/portable/IAR/ARM_CM23/secure/secure_heap.c
@@ -1,454 +1,454 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Standard includes. */

-#include <stdint.h>

-

-/* Secure context heap includes. */

-#include "secure_heap.h"

-

-/* Secure port macros. */

-#include "secure_port_macros.h"

-

-/**

- * @brief Total heap size.

- */

-#ifndef secureconfigTOTAL_HEAP_SIZE

-    #define secureconfigTOTAL_HEAP_SIZE    ( ( ( size_t ) ( 10 * 1024 ) ) )

-#endif

-

-/* No test marker by default. */

-#ifndef mtCOVERAGE_TEST_MARKER

-    #define mtCOVERAGE_TEST_MARKER()

-#endif

-

-/* No tracing by default. */

-#ifndef traceMALLOC

-    #define traceMALLOC( pvReturn, xWantedSize )

-#endif

-

-/* No tracing by default. */

-#ifndef traceFREE

-    #define traceFREE( pv, xBlockSize )

-#endif

-

-/* Block sizes must not get too small. */

-#define secureheapMINIMUM_BLOCK_SIZE    ( ( size_t ) ( xHeapStructSize << 1 ) )

-

-/* Assumes 8bit bytes! */

-#define secureheapBITS_PER_BYTE         ( ( size_t ) 8 )

-/*-----------------------------------------------------------*/

-

-/* Allocate the memory for the heap. */

-#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )

-

-/* The application writer has already defined the array used for the RTOS

-* heap - probably so it can be placed in a special segment or address. */

-    extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];

-#else /* configAPPLICATION_ALLOCATED_HEAP */

-    static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];

-#endif /* configAPPLICATION_ALLOCATED_HEAP */

-

-/**

- * @brief The linked list structure.

- *

- * This is used to link free blocks in order of their memory address.

- */

-typedef struct A_BLOCK_LINK

-{

-    struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */

-    size_t xBlockSize;                     /**< The size of the free block. */

-} BlockLink_t;

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Called automatically to setup the required heap structures the first

- * time pvPortMalloc() is called.

- */

-static void prvHeapInit( void );

-

-/**

- * @brief Inserts a block of memory that is being freed into the correct

- * position in the list of free memory blocks.

- *

- * The block being freed will be merged with the block in front it and/or the

- * block behind it if the memory blocks are adjacent to each other.

- *

- * @param[in] pxBlockToInsert The block being freed.

- */

-static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert );

-/*-----------------------------------------------------------*/

-

-/**

- * @brief The size of the structure placed at the beginning of each allocated

- * memory block must by correctly byte aligned.

- */

-static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );

-

-/**

- * @brief Create a couple of list links to mark the start and end of the list.

- */

-static BlockLink_t xStart;

-static BlockLink_t * pxEnd = NULL;

-

-/**

- * @brief Keeps track of the number of free bytes remaining, but says nothing

- * about fragmentation.

- */

-static size_t xFreeBytesRemaining = 0U;

-static size_t xMinimumEverFreeBytesRemaining = 0U;

-

-/**

- * @brief Gets set to the top bit of an size_t type.

- *

- * When this bit in the xBlockSize member of an BlockLink_t structure is set

- * then the block belongs to the application. When the bit is free the block is

- * still part of the free heap space.

- */

-static size_t xBlockAllocatedBit = 0;

-/*-----------------------------------------------------------*/

-

-static void prvHeapInit( void )

-{

-    BlockLink_t * pxFirstFreeBlock;

-    uint8_t * pucAlignedHeap;

-    size_t uxAddress;

-    size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE;

-

-    /* Ensure the heap starts on a correctly aligned boundary. */

-    uxAddress = ( size_t ) ucHeap;

-

-    if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 )

-    {

-        uxAddress += ( secureportBYTE_ALIGNMENT - 1 );

-        uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );

-        xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;

-    }

-

-    pucAlignedHeap = ( uint8_t * ) uxAddress;

-

-    /* xStart is used to hold a pointer to the first item in the list of free

-     * blocks.  The void cast is used to prevent compiler warnings. */

-    xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;

-    xStart.xBlockSize = ( size_t ) 0;

-

-    /* pxEnd is used to mark the end of the list of free blocks and is inserted

-     * at the end of the heap space. */

-    uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;

-    uxAddress -= xHeapStructSize;

-    uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );

-    pxEnd = ( void * ) uxAddress;

-    pxEnd->xBlockSize = 0;

-    pxEnd->pxNextFreeBlock = NULL;

-

-    /* To start with there is a single free block that is sized to take up the

-     * entire heap space, minus the space taken by pxEnd. */

-    pxFirstFreeBlock = ( void * ) pucAlignedHeap;

-    pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;

-    pxFirstFreeBlock->pxNextFreeBlock = pxEnd;

-

-    /* Only one block exists - and it covers the entire usable heap space. */

-    xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;

-    xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;

-

-    /* Work out the position of the top bit in a size_t variable. */

-    xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 );

-}

-/*-----------------------------------------------------------*/

-

-static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert )

-{

-    BlockLink_t * pxIterator;

-    uint8_t * puc;

-

-    /* Iterate through the list until a block is found that has a higher address

-     * than the block being inserted. */

-    for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )

-    {

-        /* Nothing to do here, just iterate to the right position. */

-    }

-

-    /* Do the block being inserted, and the block it is being inserted after

-     * make a contiguous block of memory? */

-    puc = ( uint8_t * ) pxIterator;

-

-    if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )

-    {

-        pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;

-        pxBlockToInsert = pxIterator;

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-

-    /* Do the block being inserted, and the block it is being inserted before

-     * make a contiguous block of memory? */

-    puc = ( uint8_t * ) pxBlockToInsert;

-

-    if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )

-    {

-        if( pxIterator->pxNextFreeBlock != pxEnd )

-        {

-            /* Form one big block from the two blocks. */

-            pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;

-            pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;

-        }

-        else

-        {

-            pxBlockToInsert->pxNextFreeBlock = pxEnd;

-        }

-    }

-    else

-    {

-        pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;

-    }

-

-    /* If the block being inserted plugged a gab, so was merged with the block

-     * before and the block after, then it's pxNextFreeBlock pointer will have

-     * already been set, and should not be set here as that would make it point

-     * to itself. */

-    if( pxIterator != pxBlockToInsert )

-    {

-        pxIterator->pxNextFreeBlock = pxBlockToInsert;

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-}

-/*-----------------------------------------------------------*/

-

-void * pvPortMalloc( size_t xWantedSize )

-{

-    BlockLink_t * pxBlock;

-    BlockLink_t * pxPreviousBlock;

-    BlockLink_t * pxNewBlockLink;

-    void * pvReturn = NULL;

-

-    /* If this is the first call to malloc then the heap will require

-     * initialisation to setup the list of free blocks. */

-    if( pxEnd == NULL )

-    {

-        prvHeapInit();

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-

-    /* Check the requested block size is not so large that the top bit is set.

-     * The top bit of the block size member of the BlockLink_t structure is used

-     * to determine who owns the block - the application or the kernel, so it

-     * must be free. */

-    if( ( xWantedSize & xBlockAllocatedBit ) == 0 )

-    {

-        /* The wanted size is increased so it can contain a BlockLink_t

-         * structure in addition to the requested amount of bytes. */

-        if( xWantedSize > 0 )

-        {

-            xWantedSize += xHeapStructSize;

-

-            /* Ensure that blocks are always aligned to the required number of

-             * bytes. */

-            if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 )

-            {

-                /* Byte alignment required. */

-                xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) );

-                secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 );

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-        else

-        {

-            mtCOVERAGE_TEST_MARKER();

-        }

-

-        if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )

-        {

-            /* Traverse the list from the start (lowest address) block until

-             * one of adequate size is found. */

-            pxPreviousBlock = &xStart;

-            pxBlock = xStart.pxNextFreeBlock;

-

-            while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )

-            {

-                pxPreviousBlock = pxBlock;

-                pxBlock = pxBlock->pxNextFreeBlock;

-            }

-

-            /* If the end marker was reached then a block of adequate size was

-             * not found. */

-            if( pxBlock != pxEnd )

-            {

-                /* Return the memory space pointed to - jumping over the

-                 * BlockLink_t structure at its start. */

-                pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );

-

-                /* This block is being returned for use so must be taken out

-                 * of the list of free blocks. */

-                pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;

-

-                /* If the block is larger than required it can be split into

-                 * two. */

-                if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE )

-                {

-                    /* This block is to be split into two.  Create a new

-                     * block following the number of bytes requested. The void

-                     * cast is used to prevent byte alignment warnings from the

-                     * compiler. */

-                    pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );

-                    secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 );

-

-                    /* Calculate the sizes of two blocks split from the single

-                     * block. */

-                    pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;

-                    pxBlock->xBlockSize = xWantedSize;

-

-                    /* Insert the new block into the list of free blocks. */

-                    prvInsertBlockIntoFreeList( pxNewBlockLink );

-                }

-                else

-                {

-                    mtCOVERAGE_TEST_MARKER();

-                }

-

-                xFreeBytesRemaining -= pxBlock->xBlockSize;

-

-                if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )

-                {

-                    xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;

-                }

-                else

-                {

-                    mtCOVERAGE_TEST_MARKER();

-                }

-

-                /* The block is being returned - it is allocated and owned by

-                 * the application and has no "next" block. */

-                pxBlock->xBlockSize |= xBlockAllocatedBit;

-                pxBlock->pxNextFreeBlock = NULL;

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-        else

-        {

-            mtCOVERAGE_TEST_MARKER();

-        }

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-

-    traceMALLOC( pvReturn, xWantedSize );

-

-    #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 )

-        {

-            if( pvReturn == NULL )

-            {

-                extern void vApplicationMallocFailedHook( void );

-                vApplicationMallocFailedHook();

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-    #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */

-

-    secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );

-    return pvReturn;

-}

-/*-----------------------------------------------------------*/

-

-void vPortFree( void * pv )

-{

-    uint8_t * puc = ( uint8_t * ) pv;

-    BlockLink_t * pxLink;

-

-    if( pv != NULL )

-    {

-        /* The memory being freed will have an BlockLink_t structure immediately

-         * before it. */

-        puc -= xHeapStructSize;

-

-        /* This casting is to keep the compiler from issuing warnings. */

-        pxLink = ( void * ) puc;

-

-        /* Check the block is actually allocated. */

-        secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );

-        secureportASSERT( pxLink->pxNextFreeBlock == NULL );

-

-        if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )

-        {

-            if( pxLink->pxNextFreeBlock == NULL )

-            {

-                /* The block is being returned to the heap - it is no longer

-                 * allocated. */

-                pxLink->xBlockSize &= ~xBlockAllocatedBit;

-

-                secureportDISABLE_NON_SECURE_INTERRUPTS();

-                {

-                    /* Add this block to the list of free blocks. */

-                    xFreeBytesRemaining += pxLink->xBlockSize;

-                    traceFREE( pv, pxLink->xBlockSize );

-                    prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );

-                }

-                secureportENABLE_NON_SECURE_INTERRUPTS();

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-        else

-        {

-            mtCOVERAGE_TEST_MARKER();

-        }

-    }

-}

-/*-----------------------------------------------------------*/

-

-size_t xPortGetFreeHeapSize( void )

-{

-    return xFreeBytesRemaining;

-}

-/*-----------------------------------------------------------*/

-

-size_t xPortGetMinimumEverFreeHeapSize( void )

-{

-    return xMinimumEverFreeBytesRemaining;

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Standard includes. */
+#include <stdint.h>
+
+/* Secure context heap includes. */
+#include "secure_heap.h"
+
+/* Secure port macros. */
+#include "secure_port_macros.h"
+
+/**
+ * @brief Total heap size.
+ */
+#ifndef secureconfigTOTAL_HEAP_SIZE
+    #define secureconfigTOTAL_HEAP_SIZE    ( ( ( size_t ) ( 10 * 1024 ) ) )
+#endif
+
+/* No test marker by default. */
+#ifndef mtCOVERAGE_TEST_MARKER
+    #define mtCOVERAGE_TEST_MARKER()
+#endif
+
+/* No tracing by default. */
+#ifndef traceMALLOC
+    #define traceMALLOC( pvReturn, xWantedSize )
+#endif
+
+/* No tracing by default. */
+#ifndef traceFREE
+    #define traceFREE( pv, xBlockSize )
+#endif
+
+/* Block sizes must not get too small. */
+#define secureheapMINIMUM_BLOCK_SIZE    ( ( size_t ) ( xHeapStructSize << 1 ) )
+
+/* Assumes 8bit bytes! */
+#define secureheapBITS_PER_BYTE         ( ( size_t ) 8 )
+/*-----------------------------------------------------------*/
+
+/* Allocate the memory for the heap. */
+#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )
+
+/* The application writer has already defined the array used for the RTOS
+* heap - probably so it can be placed in a special segment or address. */
+    extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
+#else /* configAPPLICATION_ALLOCATED_HEAP */
+    static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
+#endif /* configAPPLICATION_ALLOCATED_HEAP */
+
+/**
+ * @brief The linked list structure.
+ *
+ * This is used to link free blocks in order of their memory address.
+ */
+typedef struct A_BLOCK_LINK
+{
+    struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */
+    size_t xBlockSize;                     /**< The size of the free block. */
+} BlockLink_t;
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Called automatically to setup the required heap structures the first
+ * time pvPortMalloc() is called.
+ */
+static void prvHeapInit( void );
+
+/**
+ * @brief Inserts a block of memory that is being freed into the correct
+ * position in the list of free memory blocks.
+ *
+ * The block being freed will be merged with the block in front it and/or the
+ * block behind it if the memory blocks are adjacent to each other.
+ *
+ * @param[in] pxBlockToInsert The block being freed.
+ */
+static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert );
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief The size of the structure placed at the beginning of each allocated
+ * memory block must by correctly byte aligned.
+ */
+static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
+
+/**
+ * @brief Create a couple of list links to mark the start and end of the list.
+ */
+static BlockLink_t xStart;
+static BlockLink_t * pxEnd = NULL;
+
+/**
+ * @brief Keeps track of the number of free bytes remaining, but says nothing
+ * about fragmentation.
+ */
+static size_t xFreeBytesRemaining = 0U;
+static size_t xMinimumEverFreeBytesRemaining = 0U;
+
+/**
+ * @brief Gets set to the top bit of an size_t type.
+ *
+ * When this bit in the xBlockSize member of an BlockLink_t structure is set
+ * then the block belongs to the application. When the bit is free the block is
+ * still part of the free heap space.
+ */
+static size_t xBlockAllocatedBit = 0;
+/*-----------------------------------------------------------*/
+
+static void prvHeapInit( void )
+{
+    BlockLink_t * pxFirstFreeBlock;
+    uint8_t * pucAlignedHeap;
+    size_t uxAddress;
+    size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE;
+
+    /* Ensure the heap starts on a correctly aligned boundary. */
+    uxAddress = ( size_t ) ucHeap;
+
+    if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 )
+    {
+        uxAddress += ( secureportBYTE_ALIGNMENT - 1 );
+        uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
+        xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;
+    }
+
+    pucAlignedHeap = ( uint8_t * ) uxAddress;
+
+    /* xStart is used to hold a pointer to the first item in the list of free
+     * blocks.  The void cast is used to prevent compiler warnings. */
+    xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
+    xStart.xBlockSize = ( size_t ) 0;
+
+    /* pxEnd is used to mark the end of the list of free blocks and is inserted
+     * at the end of the heap space. */
+    uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;
+    uxAddress -= xHeapStructSize;
+    uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
+    pxEnd = ( void * ) uxAddress;
+    pxEnd->xBlockSize = 0;
+    pxEnd->pxNextFreeBlock = NULL;
+
+    /* To start with there is a single free block that is sized to take up the
+     * entire heap space, minus the space taken by pxEnd. */
+    pxFirstFreeBlock = ( void * ) pucAlignedHeap;
+    pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;
+    pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
+
+    /* Only one block exists - and it covers the entire usable heap space. */
+    xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
+    xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
+
+    /* Work out the position of the top bit in a size_t variable. */
+    xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 );
+}
+/*-----------------------------------------------------------*/
+
+static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert )
+{
+    BlockLink_t * pxIterator;
+    uint8_t * puc;
+
+    /* Iterate through the list until a block is found that has a higher address
+     * than the block being inserted. */
+    for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
+    {
+        /* Nothing to do here, just iterate to the right position. */
+    }
+
+    /* Do the block being inserted, and the block it is being inserted after
+     * make a contiguous block of memory? */
+    puc = ( uint8_t * ) pxIterator;
+
+    if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
+    {
+        pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
+        pxBlockToInsert = pxIterator;
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+
+    /* Do the block being inserted, and the block it is being inserted before
+     * make a contiguous block of memory? */
+    puc = ( uint8_t * ) pxBlockToInsert;
+
+    if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
+    {
+        if( pxIterator->pxNextFreeBlock != pxEnd )
+        {
+            /* Form one big block from the two blocks. */
+            pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
+            pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
+        }
+        else
+        {
+            pxBlockToInsert->pxNextFreeBlock = pxEnd;
+        }
+    }
+    else
+    {
+        pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
+    }
+
+    /* If the block being inserted plugged a gab, so was merged with the block
+     * before and the block after, then it's pxNextFreeBlock pointer will have
+     * already been set, and should not be set here as that would make it point
+     * to itself. */
+    if( pxIterator != pxBlockToInsert )
+    {
+        pxIterator->pxNextFreeBlock = pxBlockToInsert;
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+}
+/*-----------------------------------------------------------*/
+
+void * pvPortMalloc( size_t xWantedSize )
+{
+    BlockLink_t * pxBlock;
+    BlockLink_t * pxPreviousBlock;
+    BlockLink_t * pxNewBlockLink;
+    void * pvReturn = NULL;
+
+    /* If this is the first call to malloc then the heap will require
+     * initialisation to setup the list of free blocks. */
+    if( pxEnd == NULL )
+    {
+        prvHeapInit();
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+
+    /* Check the requested block size is not so large that the top bit is set.
+     * The top bit of the block size member of the BlockLink_t structure is used
+     * to determine who owns the block - the application or the kernel, so it
+     * must be free. */
+    if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
+    {
+        /* The wanted size is increased so it can contain a BlockLink_t
+         * structure in addition to the requested amount of bytes. */
+        if( xWantedSize > 0 )
+        {
+            xWantedSize += xHeapStructSize;
+
+            /* Ensure that blocks are always aligned to the required number of
+             * bytes. */
+            if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 )
+            {
+                /* Byte alignment required. */
+                xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) );
+                secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 );
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+        else
+        {
+            mtCOVERAGE_TEST_MARKER();
+        }
+
+        if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
+        {
+            /* Traverse the list from the start (lowest address) block until
+             * one of adequate size is found. */
+            pxPreviousBlock = &xStart;
+            pxBlock = xStart.pxNextFreeBlock;
+
+            while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
+            {
+                pxPreviousBlock = pxBlock;
+                pxBlock = pxBlock->pxNextFreeBlock;
+            }
+
+            /* If the end marker was reached then a block of adequate size was
+             * not found. */
+            if( pxBlock != pxEnd )
+            {
+                /* Return the memory space pointed to - jumping over the
+                 * BlockLink_t structure at its start. */
+                pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
+
+                /* This block is being returned for use so must be taken out
+                 * of the list of free blocks. */
+                pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
+
+                /* If the block is larger than required it can be split into
+                 * two. */
+                if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE )
+                {
+                    /* This block is to be split into two.  Create a new
+                     * block following the number of bytes requested. The void
+                     * cast is used to prevent byte alignment warnings from the
+                     * compiler. */
+                    pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
+                    secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 );
+
+                    /* Calculate the sizes of two blocks split from the single
+                     * block. */
+                    pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
+                    pxBlock->xBlockSize = xWantedSize;
+
+                    /* Insert the new block into the list of free blocks. */
+                    prvInsertBlockIntoFreeList( pxNewBlockLink );
+                }
+                else
+                {
+                    mtCOVERAGE_TEST_MARKER();
+                }
+
+                xFreeBytesRemaining -= pxBlock->xBlockSize;
+
+                if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
+                {
+                    xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
+                }
+                else
+                {
+                    mtCOVERAGE_TEST_MARKER();
+                }
+
+                /* The block is being returned - it is allocated and owned by
+                 * the application and has no "next" block. */
+                pxBlock->xBlockSize |= xBlockAllocatedBit;
+                pxBlock->pxNextFreeBlock = NULL;
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+        else
+        {
+            mtCOVERAGE_TEST_MARKER();
+        }
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+
+    traceMALLOC( pvReturn, xWantedSize );
+
+    #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 )
+        {
+            if( pvReturn == NULL )
+            {
+                extern void vApplicationMallocFailedHook( void );
+                vApplicationMallocFailedHook();
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+    #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */
+
+    secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );
+    return pvReturn;
+}
+/*-----------------------------------------------------------*/
+
+void vPortFree( void * pv )
+{
+    uint8_t * puc = ( uint8_t * ) pv;
+    BlockLink_t * pxLink;
+
+    if( pv != NULL )
+    {
+        /* The memory being freed will have an BlockLink_t structure immediately
+         * before it. */
+        puc -= xHeapStructSize;
+
+        /* This casting is to keep the compiler from issuing warnings. */
+        pxLink = ( void * ) puc;
+
+        /* Check the block is actually allocated. */
+        secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
+        secureportASSERT( pxLink->pxNextFreeBlock == NULL );
+
+        if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )
+        {
+            if( pxLink->pxNextFreeBlock == NULL )
+            {
+                /* The block is being returned to the heap - it is no longer
+                 * allocated. */
+                pxLink->xBlockSize &= ~xBlockAllocatedBit;
+
+                secureportDISABLE_NON_SECURE_INTERRUPTS();
+                {
+                    /* Add this block to the list of free blocks. */
+                    xFreeBytesRemaining += pxLink->xBlockSize;
+                    traceFREE( pv, pxLink->xBlockSize );
+                    prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
+                }
+                secureportENABLE_NON_SECURE_INTERRUPTS();
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+        else
+        {
+            mtCOVERAGE_TEST_MARKER();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+size_t xPortGetFreeHeapSize( void )
+{
+    return xFreeBytesRemaining;
+}
+/*-----------------------------------------------------------*/
+
+size_t xPortGetMinimumEverFreeHeapSize( void )
+{
+    return xMinimumEverFreeBytesRemaining;
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CM23/secure/secure_heap.h b/portable/IAR/ARM_CM23/secure/secure_heap.h
index bd42ff9..c13590f 100644
--- a/portable/IAR/ARM_CM23/secure/secure_heap.h
+++ b/portable/IAR/ARM_CM23/secure/secure_heap.h
@@ -1,66 +1,66 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_HEAP_H__

-#define __SECURE_HEAP_H__

-

-/* Standard includes. */

-#include <stdlib.h>

-

-/**

- * @brief Allocates memory from heap.

- *

- * @param[in] xWantedSize The size of the memory to be allocated.

- *

- * @return Pointer to the memory region if the allocation is successful, NULL

- * otherwise.

- */

-void * pvPortMalloc( size_t xWantedSize );

-

-/**

- * @brief Frees the previously allocated memory.

- *

- * @param[in] pv Pointer to the memory to be freed.

- */

-void vPortFree( void * pv );

-

-/**

- * @brief Get the free heap size.

- *

- * @return Free heap size.

- */

-size_t xPortGetFreeHeapSize( void );

-

-/**

- * @brief Get the minimum ever free heap size.

- *

- * @return Minimum ever free heap size.

- */

-size_t xPortGetMinimumEverFreeHeapSize( void );

-

-#endif /* __SECURE_HEAP_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_HEAP_H__
+#define __SECURE_HEAP_H__
+
+/* Standard includes. */
+#include <stdlib.h>
+
+/**
+ * @brief Allocates memory from heap.
+ *
+ * @param[in] xWantedSize The size of the memory to be allocated.
+ *
+ * @return Pointer to the memory region if the allocation is successful, NULL
+ * otherwise.
+ */
+void * pvPortMalloc( size_t xWantedSize );
+
+/**
+ * @brief Frees the previously allocated memory.
+ *
+ * @param[in] pv Pointer to the memory to be freed.
+ */
+void vPortFree( void * pv );
+
+/**
+ * @brief Get the free heap size.
+ *
+ * @return Free heap size.
+ */
+size_t xPortGetFreeHeapSize( void );
+
+/**
+ * @brief Get the minimum ever free heap size.
+ *
+ * @return Minimum ever free heap size.
+ */
+size_t xPortGetMinimumEverFreeHeapSize( void );
+
+#endif /* __SECURE_HEAP_H__ */
diff --git a/portable/IAR/ARM_CM23/secure/secure_init.c b/portable/IAR/ARM_CM23/secure/secure_init.c
index d91695b..dc19ebc 100644
--- a/portable/IAR/ARM_CM23/secure/secure_init.c
+++ b/portable/IAR/ARM_CM23/secure/secure_init.c
@@ -1,106 +1,106 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Standard includes. */

-#include <stdint.h>

-

-/* Secure init includes. */

-#include "secure_init.h"

-

-/* Secure port macros. */

-#include "secure_port_macros.h"

-

-/**

- * @brief Constants required to manipulate the SCB.

- */

-#define secureinitSCB_AIRCR                 ( ( volatile uint32_t * ) 0xe000ed0c )  /* Application Interrupt and Reset Control Register. */

-#define secureinitSCB_AIRCR_VECTKEY_POS     ( 16UL )

-#define secureinitSCB_AIRCR_VECTKEY_MASK    ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS )

-#define secureinitSCB_AIRCR_PRIS_POS        ( 14UL )

-#define secureinitSCB_AIRCR_PRIS_MASK       ( 1UL << secureinitSCB_AIRCR_PRIS_POS )

-

-/**

- * @brief Constants required to manipulate the FPU.

- */

-#define secureinitFPCCR                     ( ( volatile uint32_t * ) 0xe000ef34 )  /* Floating Point Context Control Register. */

-#define secureinitFPCCR_LSPENS_POS          ( 29UL )

-#define secureinitFPCCR_LSPENS_MASK         ( 1UL << secureinitFPCCR_LSPENS_POS )

-#define secureinitFPCCR_TS_POS              ( 26UL )

-#define secureinitFPCCR_TS_MASK             ( 1UL << secureinitFPCCR_TS_POS )

-

-#define secureinitNSACR                     ( ( volatile uint32_t * ) 0xe000ed8c )  /* Non-secure Access Control Register. */

-#define secureinitNSACR_CP10_POS            ( 10UL )

-#define secureinitNSACR_CP10_MASK           ( 1UL << secureinitNSACR_CP10_POS )

-#define secureinitNSACR_CP11_POS            ( 11UL )

-#define secureinitNSACR_CP11_MASK           ( 1UL << secureinitNSACR_CP11_POS )

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void )

-{

-    uint32_t ulIPSR;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ulIPSR != 0 )

-    {

-        *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) |

-                                   ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) |

-                                   ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK );

-    }

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void )

-{

-    uint32_t ulIPSR;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ulIPSR != 0 )

-    {

-        /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is

-         * permitted. CP11 should be programmed to the same value as CP10. */

-        *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK );

-

-        /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures

-         * that we can enable/disable lazy stacking in port.c file. */

-        *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK );

-

-        /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP

-         * registers (S16-S31) are also pushed to stack on exception entry and

-         * restored on exception return. */

-        *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK );

-    }

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Standard includes. */
+#include <stdint.h>
+
+/* Secure init includes. */
+#include "secure_init.h"
+
+/* Secure port macros. */
+#include "secure_port_macros.h"
+
+/**
+ * @brief Constants required to manipulate the SCB.
+ */
+#define secureinitSCB_AIRCR                 ( ( volatile uint32_t * ) 0xe000ed0c )  /* Application Interrupt and Reset Control Register. */
+#define secureinitSCB_AIRCR_VECTKEY_POS     ( 16UL )
+#define secureinitSCB_AIRCR_VECTKEY_MASK    ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS )
+#define secureinitSCB_AIRCR_PRIS_POS        ( 14UL )
+#define secureinitSCB_AIRCR_PRIS_MASK       ( 1UL << secureinitSCB_AIRCR_PRIS_POS )
+
+/**
+ * @brief Constants required to manipulate the FPU.
+ */
+#define secureinitFPCCR                     ( ( volatile uint32_t * ) 0xe000ef34 )  /* Floating Point Context Control Register. */
+#define secureinitFPCCR_LSPENS_POS          ( 29UL )
+#define secureinitFPCCR_LSPENS_MASK         ( 1UL << secureinitFPCCR_LSPENS_POS )
+#define secureinitFPCCR_TS_POS              ( 26UL )
+#define secureinitFPCCR_TS_MASK             ( 1UL << secureinitFPCCR_TS_POS )
+
+#define secureinitNSACR                     ( ( volatile uint32_t * ) 0xe000ed8c )  /* Non-secure Access Control Register. */
+#define secureinitNSACR_CP10_POS            ( 10UL )
+#define secureinitNSACR_CP10_MASK           ( 1UL << secureinitNSACR_CP10_POS )
+#define secureinitNSACR_CP11_POS            ( 11UL )
+#define secureinitNSACR_CP11_MASK           ( 1UL << secureinitNSACR_CP11_POS )
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void )
+{
+    uint32_t ulIPSR;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ulIPSR != 0 )
+    {
+        *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) |
+                                   ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) |
+                                   ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK );
+    }
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void )
+{
+    uint32_t ulIPSR;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ulIPSR != 0 )
+    {
+        /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is
+         * permitted. CP11 should be programmed to the same value as CP10. */
+        *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK );
+
+        /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures
+         * that we can enable/disable lazy stacking in port.c file. */
+        *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK );
+
+        /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP
+         * registers (S16-S31) are also pushed to stack on exception entry and
+         * restored on exception return. */
+        *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK );
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CM23/secure/secure_init.h b/portable/IAR/ARM_CM23/secure/secure_init.h
index e18ba44..21daeda 100644
--- a/portable/IAR/ARM_CM23/secure/secure_init.h
+++ b/portable/IAR/ARM_CM23/secure/secure_init.h
@@ -1,54 +1,54 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_INIT_H__

-#define __SECURE_INIT_H__

-

-/**

- * @brief De-prioritizes the non-secure exceptions.

- *

- * This is needed to ensure that the non-secure PendSV runs at the lowest

- * priority. Context switch is done in the non-secure PendSV handler.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- */

-void SecureInit_DePrioritizeNSExceptions( void );

-

-/**

- * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access.

- *

- * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point

- * Registers are not leaked to the non-secure side.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- */

-void SecureInit_EnableNSFPUAccess( void );

-

-#endif /* __SECURE_INIT_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_INIT_H__
+#define __SECURE_INIT_H__
+
+/**
+ * @brief De-prioritizes the non-secure exceptions.
+ *
+ * This is needed to ensure that the non-secure PendSV runs at the lowest
+ * priority. Context switch is done in the non-secure PendSV handler.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ */
+void SecureInit_DePrioritizeNSExceptions( void );
+
+/**
+ * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access.
+ *
+ * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point
+ * Registers are not leaked to the non-secure side.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ */
+void SecureInit_EnableNSFPUAccess( void );
+
+#endif /* __SECURE_INIT_H__ */
diff --git a/portable/IAR/ARM_CM23/secure/secure_port_macros.h b/portable/IAR/ARM_CM23/secure/secure_port_macros.h
index 5499054..304913b 100644
--- a/portable/IAR/ARM_CM23/secure/secure_port_macros.h
+++ b/portable/IAR/ARM_CM23/secure/secure_port_macros.h
@@ -1,140 +1,140 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_PORT_MACROS_H__

-#define __SECURE_PORT_MACROS_H__

-

-/**

- * @brief Byte alignment requirements.

- */

-#define secureportBYTE_ALIGNMENT         8

-#define secureportBYTE_ALIGNMENT_MASK    ( 0x0007 )

-

-/**

- * @brief Macro to declare a function as non-secure callable.

- */

-#if defined( __IAR_SYSTEMS_ICC__ )

-    #define secureportNON_SECURE_CALLABLE    __cmse_nonsecure_entry __root

-#else

-    #define secureportNON_SECURE_CALLABLE    __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) )

-#endif

-

-/**

- * @brief Set the secure PRIMASK value.

- */

-#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \

-    __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" )

-

-/**

- * @brief Set the non-secure PRIMASK value.

- */

-#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \

-    __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" )

-

-/**

- * @brief Read the PSP value in the given variable.

- */

-#define secureportREAD_PSP( pucOutCurrentStackPointer ) \

-    __asm volatile ( "mrs %0, psp"  : "=r" ( pucOutCurrentStackPointer ) )

-

-/**

- * @brief Set the PSP to the given value.

- */

-#define secureportSET_PSP( pucCurrentStackPointer ) \

-    __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) )

-

-/**

- * @brief Read the PSPLIM value in the given variable.

- */

-#define secureportREAD_PSPLIM( pucOutStackLimit ) \

-    __asm volatile ( "mrs %0, psplim"  : "=r" ( pucOutStackLimit ) )

-

-/**

- * @brief Set the PSPLIM to the given value.

- */

-#define secureportSET_PSPLIM( pucStackLimit ) \

-    __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) )

-

-/**

- * @brief Set the NonSecure MSP to the given value.

- */

-#define secureportSET_MSP_NS( pucMainStackPointer ) \

-    __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) )

-

-/**

- * @brief Set the CONTROL register to the given value.

- */

-#define secureportSET_CONTROL( ulControl ) \

-    __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" )

-

-/**

- * @brief Read the Interrupt Program Status Register (IPSR) value in the given

- * variable.

- */

-#define secureportREAD_IPSR( ulIPSR ) \

-    __asm volatile ( "mrs %0, ipsr"  : "=r" ( ulIPSR ) )

-

-/**

- * @brief PRIMASK value to enable interrupts.

- */

-#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL     0

-

-/**

- * @brief PRIMASK value to disable interrupts.

- */

-#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL    1

-

-/**

- * @brief Disable secure interrupts.

- */

-#define secureportDISABLE_SECURE_INTERRUPTS()        secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )

-

-/**

- * @brief Disable non-secure interrupts.

- *

- * This effectively disables context switches.

- */

-#define secureportDISABLE_NON_SECURE_INTERRUPTS()    secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )

-

-/**

- * @brief Enable non-secure interrupts.

- */

-#define secureportENABLE_NON_SECURE_INTERRUPTS()     secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL )

-

-/**

- * @brief Assert definition.

- */

-#define secureportASSERT( x )                      \

-    if( ( x ) == 0 )                               \

-    {                                              \

-        secureportDISABLE_SECURE_INTERRUPTS();     \

-        secureportDISABLE_NON_SECURE_INTERRUPTS(); \

-        for( ; ; ) {; }                            \

-    }

-

-#endif /* __SECURE_PORT_MACROS_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_PORT_MACROS_H__
+#define __SECURE_PORT_MACROS_H__
+
+/**
+ * @brief Byte alignment requirements.
+ */
+#define secureportBYTE_ALIGNMENT         8
+#define secureportBYTE_ALIGNMENT_MASK    ( 0x0007 )
+
+/**
+ * @brief Macro to declare a function as non-secure callable.
+ */
+#if defined( __IAR_SYSTEMS_ICC__ )
+    #define secureportNON_SECURE_CALLABLE    __cmse_nonsecure_entry __root
+#else
+    #define secureportNON_SECURE_CALLABLE    __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) )
+#endif
+
+/**
+ * @brief Set the secure PRIMASK value.
+ */
+#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \
+    __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" )
+
+/**
+ * @brief Set the non-secure PRIMASK value.
+ */
+#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \
+    __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" )
+
+/**
+ * @brief Read the PSP value in the given variable.
+ */
+#define secureportREAD_PSP( pucOutCurrentStackPointer ) \
+    __asm volatile ( "mrs %0, psp"  : "=r" ( pucOutCurrentStackPointer ) )
+
+/**
+ * @brief Set the PSP to the given value.
+ */
+#define secureportSET_PSP( pucCurrentStackPointer ) \
+    __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) )
+
+/**
+ * @brief Read the PSPLIM value in the given variable.
+ */
+#define secureportREAD_PSPLIM( pucOutStackLimit ) \
+    __asm volatile ( "mrs %0, psplim"  : "=r" ( pucOutStackLimit ) )
+
+/**
+ * @brief Set the PSPLIM to the given value.
+ */
+#define secureportSET_PSPLIM( pucStackLimit ) \
+    __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) )
+
+/**
+ * @brief Set the NonSecure MSP to the given value.
+ */
+#define secureportSET_MSP_NS( pucMainStackPointer ) \
+    __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) )
+
+/**
+ * @brief Set the CONTROL register to the given value.
+ */
+#define secureportSET_CONTROL( ulControl ) \
+    __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" )
+
+/**
+ * @brief Read the Interrupt Program Status Register (IPSR) value in the given
+ * variable.
+ */
+#define secureportREAD_IPSR( ulIPSR ) \
+    __asm volatile ( "mrs %0, ipsr"  : "=r" ( ulIPSR ) )
+
+/**
+ * @brief PRIMASK value to enable interrupts.
+ */
+#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL     0
+
+/**
+ * @brief PRIMASK value to disable interrupts.
+ */
+#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL    1
+
+/**
+ * @brief Disable secure interrupts.
+ */
+#define secureportDISABLE_SECURE_INTERRUPTS()        secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
+
+/**
+ * @brief Disable non-secure interrupts.
+ *
+ * This effectively disables context switches.
+ */
+#define secureportDISABLE_NON_SECURE_INTERRUPTS()    secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
+
+/**
+ * @brief Enable non-secure interrupts.
+ */
+#define secureportENABLE_NON_SECURE_INTERRUPTS()     secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL )
+
+/**
+ * @brief Assert definition.
+ */
+#define secureportASSERT( x )                      \
+    if( ( x ) == 0 )                               \
+    {                                              \
+        secureportDISABLE_SECURE_INTERRUPTS();     \
+        secureportDISABLE_NON_SECURE_INTERRUPTS(); \
+        for( ; ; ) {; }                            \
+    }
+
+#endif /* __SECURE_PORT_MACROS_H__ */
diff --git a/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h b/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h
index b37f6d1..ecd86b9 100644
--- a/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h
+++ b/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h
@@ -1,114 +1,114 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __PORT_ASM_H__

-#define __PORT_ASM_H__

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-

-/* MPU wrappers includes. */

-#include "mpu_wrappers.h"

-

-/**

- * @brief Restore the context of the first task so that the first task starts

- * executing.

- */

-void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Checks whether or not the processor is privileged.

- *

- * @return 1 if the processor is already privileged, 0 otherwise.

- */

-BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Raises the privilege level by clearing the bit 0 of the CONTROL

- * register.

- *

- * @note This is a privileged function and should only be called from the kenrel

- * code.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Lowers the privilege level by setting the bit 0 of the CONTROL

- * register.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vResetPrivilege( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Starts the first task.

- */

-void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Disables interrupts.

- */

-uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Enables interrupts.

- */

-void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief PendSV Exception handler.

- */

-void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief SVC Handler.

- */

-void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Allocate a Secure context for the calling task.

- *

- * @param[in] ulSecureStackSize The size of the stack to be allocated on the

- * secure side for the calling task.

- */

-void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );

-

-/**

- * @brief Free the task's secure context.

- *

- * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.

- */

-void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-#endif /* __PORT_ASM_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __PORT_ASM_H__
+#define __PORT_ASM_H__
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+
+/* MPU wrappers includes. */
+#include "mpu_wrappers.h"
+
+/**
+ * @brief Restore the context of the first task so that the first task starts
+ * executing.
+ */
+void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Checks whether or not the processor is privileged.
+ *
+ * @return 1 if the processor is already privileged, 0 otherwise.
+ */
+BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Raises the privilege level by clearing the bit 0 of the CONTROL
+ * register.
+ *
+ * @note This is a privileged function and should only be called from the kenrel
+ * code.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Lowers the privilege level by setting the bit 0 of the CONTROL
+ * register.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vResetPrivilege( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Starts the first task.
+ */
+void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Disables interrupts.
+ */
+uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Enables interrupts.
+ */
+void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief PendSV Exception handler.
+ */
+void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief SVC Handler.
+ */
+void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Allocate a Secure context for the calling task.
+ *
+ * @param[in] ulSecureStackSize The size of the stack to be allocated on the
+ * secure side for the calling task.
+ */
+void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );
+
+/**
+ * @brief Free the task's secure context.
+ *
+ * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
+ */
+void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+#endif /* __PORT_ASM_H__ */
diff --git a/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s b/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s
index 6ab1aef..62bd387 100644
--- a/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s
+++ b/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s
@@ -1,310 +1,310 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-/* Including FreeRTOSConfig.h here will cause build errors if the header file

-contains code not understood by the assembler - for example the 'extern' keyword.

-To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so

-the code is included in C files but excluded by the preprocessor in assembly

-files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */

-#include "FreeRTOSConfig.h"

-

-	EXTERN pxCurrentTCB

-	EXTERN vTaskSwitchContext

-	EXTERN vPortSVCHandler_C

-

-	PUBLIC xIsPrivileged

-	PUBLIC vResetPrivilege

-	PUBLIC vRestoreContextOfFirstTask

-	PUBLIC vRaisePrivilege

-	PUBLIC vStartFirstTask

-	PUBLIC ulSetInterruptMask

-	PUBLIC vClearInterruptMask

-	PUBLIC PendSV_Handler

-	PUBLIC SVC_Handler

-

-#if ( configENABLE_FPU == 1 )

-	#error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.

-#endif

-/*-----------------------------------------------------------*/

-

-/*---------------- Unprivileged Functions -------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION .text:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-xIsPrivileged:

-	mrs r0, control							/* r0 = CONTROL. */

-	movs r1, #1								/* r1 = 1. */

-	tst r0, r1								/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */

-	beq running_privileged					/* If the result of previous AND operation was 0, branch. */

-	movs r0, #0								/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */

-	bx lr									/* Return. */

-	running_privileged:

-		movs r0, #1							/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */

-		bx lr								/* Return. */

-

-/*-----------------------------------------------------------*/

-

-vResetPrivilege:

-	mrs r0, control							/* r0 = CONTROL. */

-	movs r1, #1								/* r1 = 1. */

-	orrs r0, r1								/* r0 = r0 | r1. */

-	msr control, r0							/* CONTROL = r0. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-/*----------------- Privileged Functions --------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION privileged_functions:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-vRestoreContextOfFirstTask:

-	ldr  r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr  r1, [r2]							/* Read pxCurrentTCB. */

-	ldr  r0, [r1]							/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */

-

-#if ( configENABLE_MPU == 1 )

-	dmb										/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r3, [r2]							/* Read the value of MPU_CTRL. */

-	movs r4, #1								/* r4 = 1. */

-	bics r3, r4								/* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */

-	str r3, [r2]							/* Disable MPU. */

-

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */

-	ldr  r4, [r1]							/* r4 = *r1 i.e. r4 = MAIR0. */

-	ldr  r2, =0xe000edc0					/* r2 = 0xe000edc0 [Location of MAIR0]. */

-	str  r4, [r2]							/* Program MAIR0. */

-	ldr  r2, =0xe000ed98					/* r2 = 0xe000ed98 [Location of RNR]. */

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */

-	movs r4, #4								/* r4 = 4. */

-	str  r4, [r2]							/* Program RNR = 4. */

-	ldmia r1!, {r5,r6}						/* Read first set of RBAR/RLAR from TCB. */

-	ldr  r3, =0xe000ed9c					/* r3 = 0xe000ed9c [Location of RBAR]. */

-	stmia r3!, {r5,r6}						/* Write first set of RBAR/RLAR registers. */

-	movs r4, #5								/* r4 = 5. */

-	str  r4, [r2]							/* Program RNR = 5. */

-	ldmia r1!, {r5,r6}						/* Read second set of RBAR/RLAR from TCB. */

-	ldr  r3, =0xe000ed9c					/* r3 = 0xe000ed9c [Location of RBAR]. */

-	stmia r3!, {r5,r6}						/* Write second set of RBAR/RLAR registers. */

-	movs r4, #6								/* r4 = 6. */

-	str  r4, [r2]							/* Program RNR = 6. */

-	ldmia r1!, {r5,r6}						/* Read third set of RBAR/RLAR from TCB. */

-	ldr  r3, =0xe000ed9c					/* r3 = 0xe000ed9c [Location of RBAR]. */

-	stmia r3!, {r5,r6}						/* Write third set of RBAR/RLAR registers. */

-	movs r4, #7								/* r4 = 7. */

-	str  r4, [r2]							/* Program RNR = 7. */

-	ldmia r1!, {r5,r6}						/* Read fourth set of RBAR/RLAR from TCB. */

-	ldr  r3, =0xe000ed9c					/* r3 = 0xe000ed9c [Location of RBAR]. */

-	stmia r3!, {r5,r6}						/* Write fourth set of RBAR/RLAR registers. */

-

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r3, [r2]							/* Read the value of MPU_CTRL. */

-	movs r4, #1								/* r4 = 1. */

-	orrs r3, r4								/* r3 = r3 | r4 i.e. Set the bit 0 in r3. */

-	str r3, [r2]							/* Enable MPU. */

-	dsb										/* Force memory writes before continuing. */

-#endif /* configENABLE_MPU */

-

-#if ( configENABLE_MPU == 1 )

-	ldm  r0!, {r1-r3}						/* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */

-	msr  psplim, r1							/* Set this task's PSPLIM value. */

-	msr  control, r2						/* Set this task's CONTROL value. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	bx   r3									/* Finally, branch to EXC_RETURN. */

-#else /* configENABLE_MPU */

-	ldm  r0!, {r1-r2}						/* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */

-	msr  psplim, r1							/* Set this task's PSPLIM value. */

-	movs r1, #2								/* r1 = 2. */

-	msr  CONTROL, r1						/* Switch to use PSP in the thread mode. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	bx   r2									/* Finally, branch to EXC_RETURN. */

-#endif /* configENABLE_MPU */

-/*-----------------------------------------------------------*/

-

-vRaisePrivilege:

-	mrs  r0, control						/* Read the CONTROL register. */

-	movs r1, #1								/* r1 = 1. */

-	bics r0, r1								/* Clear the bit 0. */

-	msr  control, r0						/* Write back the new CONTROL value. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-vStartFirstTask:

-	ldr r0, =0xe000ed08						/* Use the NVIC offset register to locate the stack. */

-	ldr r0, [r0]							/* Read the VTOR register which gives the address of vector table. */

-	ldr r0, [r0]							/* The first entry in vector table is stack pointer. */

-	msr msp, r0								/* Set the MSP back to the start of the stack. */

-	cpsie i									/* Globally enable interrupts. */

-	dsb

-	isb

-	svc 2									/* System call to start the first task. portSVC_START_SCHEDULER = 2. */

-	nop

-/*-----------------------------------------------------------*/

-

-ulSetInterruptMask:

-	mrs r0, PRIMASK

-	cpsid i

-	bx lr

-/*-----------------------------------------------------------*/

-

-vClearInterruptMask:

-	msr PRIMASK, r0

-	bx lr

-/*-----------------------------------------------------------*/

-

-PendSV_Handler:

-	mrs r0, psp								/* Read PSP in r0. */

-	ldr r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r2]							/* Read pxCurrentTCB. */

-#if ( configENABLE_MPU == 1 )

-	subs r0, r0, #44						/* Make space for PSPLIM, CONTROL, LR and the remaining registers on the stack. */

-	str r0, [r1]							/* Save the new top of stack in TCB. */

-	mrs r1, psplim							/* r1 = PSPLIM. */

-	mrs r2, control							/* r2 = CONTROL. */

-	mov r3, lr								/* r3 = LR/EXC_RETURN. */

-	stmia r0!, {r1-r7}						/* Store on the stack - PSPLIM, CONTROL, LR and low registers that are not automatically saved. */

-	mov r4, r8								/* r4 = r8. */

-	mov r5, r9								/* r5 = r9. */

-	mov r6, r10								/* r6 = r10. */

-	mov r7, r11								/* r7 = r11. */

-	stmia r0!, {r4-r7}						/* Store the high registers that are not saved automatically. */

-#else /* configENABLE_MPU */

-	subs r0, r0, #40						/* Make space for PSPLIM, LR and the remaining registers on the stack. */

-	str r0, [r1]							/* Save the new top of stack in TCB. */

-	mrs r2, psplim							/* r2 = PSPLIM. */

-	mov r3, lr								/* r3 = LR/EXC_RETURN. */

-	stmia r0!, {r2-r7}						/* Store on the stack - PSPLIM, LR and low registers that are not automatically saved. */

-	mov r4, r8								/* r4 = r8. */

-	mov r5, r9								/* r5 = r9. */

-	mov r6, r10								/* r6 = r10. */

-	mov r7, r11								/* r7 = r11. */

-	stmia r0!, {r4-r7}						/* Store the high registers that are not saved automatically. */

-#endif /* configENABLE_MPU */

-

-	cpsid i

-	bl vTaskSwitchContext

-	cpsie i

-

-	ldr r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r2]							/* Read pxCurrentTCB. */

-	ldr r0, [r1]							/* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */

-

-#if ( configENABLE_MPU == 1 )

-	dmb										/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r3, [r2]							/* Read the value of MPU_CTRL. */

-	movs r4, #1								/* r4 = 1. */

-	bics r3, r4								/* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */

-	str r3, [r2]							/* Disable MPU. */

-

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */

-	ldr  r4, [r1]							/* r4 = *r1 i.e. r4 = MAIR0. */

-	ldr  r2, =0xe000edc0					/* r2 = 0xe000edc0 [Location of MAIR0]. */

-	str  r4, [r2]							/* Program MAIR0. */

-	ldr  r2, =0xe000ed98					/* r2 = 0xe000ed98 [Location of RNR]. */

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */

-	movs r4, #4								/* r4 = 4. */

-	str  r4, [r2]							/* Program RNR = 4. */

-	ldmia r1!, {r5,r6}						/* Read first set of RBAR/RLAR from TCB. */

-	ldr  r3, =0xe000ed9c					/* r3 = 0xe000ed9c [Location of RBAR]. */

-	stmia r3!, {r5,r6}						/* Write first set of RBAR/RLAR registers. */

-	movs r4, #5								/* r4 = 5. */

-	str  r4, [r2]							/* Program RNR = 5. */

-	ldmia r1!, {r5,r6}						/* Read second set of RBAR/RLAR from TCB. */

-	ldr  r3, =0xe000ed9c					/* r3 = 0xe000ed9c [Location of RBAR]. */

-	stmia r3!, {r5,r6}						/* Write second set of RBAR/RLAR registers. */

-	movs r4, #6								/* r4 = 6. */

-	str  r4, [r2]							/* Program RNR = 6. */

-	ldmia r1!, {r5,r6}						/* Read third set of RBAR/RLAR from TCB. */

-	ldr  r3, =0xe000ed9c					/* r3 = 0xe000ed9c [Location of RBAR]. */

-	stmia r3!, {r5,r6}						/* Write third set of RBAR/RLAR registers. */

-	movs r4, #7								/* r4 = 7. */

-	str  r4, [r2]							/* Program RNR = 7. */

-	ldmia r1!, {r5,r6}						/* Read fourth set of RBAR/RLAR from TCB. */

-	ldr  r3, =0xe000ed9c					/* r3 = 0xe000ed9c [Location of RBAR]. */

-	stmia r3!, {r5,r6}						/* Write fourth set of RBAR/RLAR registers. */

-

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r3, [r2]							/* Read the value of MPU_CTRL. */

-	movs r4, #1								/* r4 = 1. */

-	orrs r3, r4								/* r3 = r3 | r4 i.e. Set the bit 0 in r3. */

-	str r3, [r2]							/* Enable MPU. */

-	dsb										/* Force memory writes before continuing. */

-#endif /* configENABLE_MPU */

-

-#if ( configENABLE_MPU == 1 )

-	adds r0, r0, #28						/* Move to the high registers. */

-	ldmia r0!, {r4-r7}						/* Restore the high registers that are not automatically restored. */

-	mov r8, r4								/* r8 = r4. */

-	mov r9, r5								/* r9 = r5. */

-	mov r10, r6								/* r10 = r6. */

-	mov r11, r7								/* r11 = r7. */

-	msr psp, r0								/* Remember the new top of stack for the task. */

-	subs r0, r0, #44						/* Move to the starting of the saved context. */

-	ldmia r0!, {r1-r7}						/* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r7 restored. */

-	msr psplim, r1							/* Restore the PSPLIM register value for the task. */

-	msr control, r2							/* Restore the CONTROL register value for the task. */

-	bx r3

-#else /* configENABLE_MPU */

-	adds r0, r0, #24						/* Move to the high registers. */

-	ldmia r0!, {r4-r7}						/* Restore the high registers that are not automatically restored. */

-	mov r8, r4								/* r8 = r4. */

-	mov r9, r5								/* r9 = r5. */

-	mov r10, r6								/* r10 = r6. */

-	mov r11, r7								/* r11 = r7. */

-	msr psp, r0								/* Remember the new top of stack for the task. */

-	subs r0, r0, #40						/* Move to the starting of the saved context. */

-	ldmia r0!, {r2-r7}						/* Read from stack - r2 = PSPLIM, r3 = LR and r4-r7 restored. */

-	msr psplim, r2							/* Restore the PSPLIM register value for the task. */

-	bx r3

-#endif /* configENABLE_MPU */

-/*-----------------------------------------------------------*/

-

-SVC_Handler:

-	movs r0, #4

-	mov r1, lr

-	tst r0, r1

-	beq stacking_used_msp

-	mrs r0, psp

-	b vPortSVCHandler_C

-	stacking_used_msp:

-		mrs r0, msp

-		b vPortSVCHandler_C

-/*-----------------------------------------------------------*/

-

-	END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+/* Including FreeRTOSConfig.h here will cause build errors if the header file
+contains code not understood by the assembler - for example the 'extern' keyword.
+To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
+the code is included in C files but excluded by the preprocessor in assembly
+files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
+#include "FreeRTOSConfig.h"
+
+    EXTERN pxCurrentTCB
+    EXTERN vTaskSwitchContext
+    EXTERN vPortSVCHandler_C
+
+    PUBLIC xIsPrivileged
+    PUBLIC vResetPrivilege
+    PUBLIC vRestoreContextOfFirstTask
+    PUBLIC vRaisePrivilege
+    PUBLIC vStartFirstTask
+    PUBLIC ulSetInterruptMask
+    PUBLIC vClearInterruptMask
+    PUBLIC PendSV_Handler
+    PUBLIC SVC_Handler
+
+#if ( configENABLE_FPU == 1 )
+    #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.
+#endif
+/*-----------------------------------------------------------*/
+
+/*---------------- Unprivileged Functions -------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+xIsPrivileged:
+    mrs r0, control                         /* r0 = CONTROL. */
+    movs r1, #1                             /* r1 = 1. */
+    tst r0, r1                              /* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
+    beq running_privileged                  /* If the result of previous AND operation was 0, branch. */
+    movs r0, #0                             /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
+    bx lr                                   /* Return. */
+    running_privileged:
+        movs r0, #1                         /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
+        bx lr                               /* Return. */
+
+/*-----------------------------------------------------------*/
+
+vResetPrivilege:
+    mrs r0, control                         /* r0 = CONTROL. */
+    movs r1, #1                             /* r1 = 1. */
+    orrs r0, r1                             /* r0 = r0 | r1. */
+    msr control, r0                         /* CONTROL = r0. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+/*----------------- Privileged Functions --------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION privileged_functions:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+vRestoreContextOfFirstTask:
+    ldr  r2, =pxCurrentTCB                  /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr  r1, [r2]                           /* Read pxCurrentTCB. */
+    ldr  r0, [r1]                           /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
+
+#if ( configENABLE_MPU == 1 )
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r3, [r2]                            /* Read the value of MPU_CTRL. */
+    movs r4, #1                             /* r4 = 1. */
+    bics r3, r4                             /* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */
+    str r3, [r2]                            /* Disable MPU. */
+
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+    ldr  r4, [r1]                           /* r4 = *r1 i.e. r4 = MAIR0. */
+    ldr  r2, =0xe000edc0                    /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str  r4, [r2]                           /* Program MAIR0. */
+    ldr  r2, =0xe000ed98                    /* r2 = 0xe000ed98 [Location of RNR]. */
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+    movs r4, #4                             /* r4 = 4. */
+    str  r4, [r2]                           /* Program RNR = 4. */
+    ldmia r1!, {r5,r6}                      /* Read first set of RBAR/RLAR from TCB. */
+    ldr  r3, =0xe000ed9c                    /* r3 = 0xe000ed9c [Location of RBAR]. */
+    stmia r3!, {r5,r6}                      /* Write first set of RBAR/RLAR registers. */
+    movs r4, #5                             /* r4 = 5. */
+    str  r4, [r2]                           /* Program RNR = 5. */
+    ldmia r1!, {r5,r6}                      /* Read second set of RBAR/RLAR from TCB. */
+    ldr  r3, =0xe000ed9c                    /* r3 = 0xe000ed9c [Location of RBAR]. */
+    stmia r3!, {r5,r6}                      /* Write second set of RBAR/RLAR registers. */
+    movs r4, #6                             /* r4 = 6. */
+    str  r4, [r2]                           /* Program RNR = 6. */
+    ldmia r1!, {r5,r6}                      /* Read third set of RBAR/RLAR from TCB. */
+    ldr  r3, =0xe000ed9c                    /* r3 = 0xe000ed9c [Location of RBAR]. */
+    stmia r3!, {r5,r6}                      /* Write third set of RBAR/RLAR registers. */
+    movs r4, #7                             /* r4 = 7. */
+    str  r4, [r2]                           /* Program RNR = 7. */
+    ldmia r1!, {r5,r6}                      /* Read fourth set of RBAR/RLAR from TCB. */
+    ldr  r3, =0xe000ed9c                    /* r3 = 0xe000ed9c [Location of RBAR]. */
+    stmia r3!, {r5,r6}                      /* Write fourth set of RBAR/RLAR registers. */
+
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r3, [r2]                            /* Read the value of MPU_CTRL. */
+    movs r4, #1                             /* r4 = 1. */
+    orrs r3, r4                             /* r3 = r3 | r4 i.e. Set the bit 0 in r3. */
+    str r3, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
+#endif /* configENABLE_MPU */
+
+#if ( configENABLE_MPU == 1 )
+    ldm  r0!, {r1-r3}                       /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */
+    msr  psplim, r1                         /* Set this task's PSPLIM value. */
+    msr  control, r2                        /* Set this task's CONTROL value. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    bx   r3                                 /* Finally, branch to EXC_RETURN. */
+#else /* configENABLE_MPU */
+    ldm  r0!, {r1-r2}                       /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
+    msr  psplim, r1                         /* Set this task's PSPLIM value. */
+    movs r1, #2                             /* r1 = 2. */
+    msr  CONTROL, r1                        /* Switch to use PSP in the thread mode. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    bx   r2                                 /* Finally, branch to EXC_RETURN. */
+#endif /* configENABLE_MPU */
+/*-----------------------------------------------------------*/
+
+vRaisePrivilege:
+    mrs  r0, control                        /* Read the CONTROL register. */
+    movs r1, #1                             /* r1 = 1. */
+    bics r0, r1                             /* Clear the bit 0. */
+    msr  control, r0                        /* Write back the new CONTROL value. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+vStartFirstTask:
+    ldr r0, =0xe000ed08                     /* Use the NVIC offset register to locate the stack. */
+    ldr r0, [r0]                            /* Read the VTOR register which gives the address of vector table. */
+    ldr r0, [r0]                            /* The first entry in vector table is stack pointer. */
+    msr msp, r0                             /* Set the MSP back to the start of the stack. */
+    cpsie i                                 /* Globally enable interrupts. */
+    dsb
+    isb
+    svc 2                                   /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
+    nop
+/*-----------------------------------------------------------*/
+
+ulSetInterruptMask:
+    mrs r0, PRIMASK
+    cpsid i
+    bx lr
+/*-----------------------------------------------------------*/
+
+vClearInterruptMask:
+    msr PRIMASK, r0
+    bx lr
+/*-----------------------------------------------------------*/
+
+PendSV_Handler:
+    mrs r0, psp                             /* Read PSP in r0. */
+    ldr r2, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r2]                            /* Read pxCurrentTCB. */
+#if ( configENABLE_MPU == 1 )
+    subs r0, r0, #44                        /* Make space for PSPLIM, CONTROL, LR and the remaining registers on the stack. */
+    str r0, [r1]                            /* Save the new top of stack in TCB. */
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mrs r2, control                         /* r2 = CONTROL. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmia r0!, {r1-r7}                      /* Store on the stack - PSPLIM, CONTROL, LR and low registers that are not automatically saved. */
+    mov r4, r8                              /* r4 = r8. */
+    mov r5, r9                              /* r5 = r9. */
+    mov r6, r10                             /* r6 = r10. */
+    mov r7, r11                             /* r7 = r11. */
+    stmia r0!, {r4-r7}                      /* Store the high registers that are not saved automatically. */
+#else /* configENABLE_MPU */
+    subs r0, r0, #40                        /* Make space for PSPLIM, LR and the remaining registers on the stack. */
+    str r0, [r1]                            /* Save the new top of stack in TCB. */
+    mrs r2, psplim                          /* r2 = PSPLIM. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmia r0!, {r2-r7}                      /* Store on the stack - PSPLIM, LR and low registers that are not automatically saved. */
+    mov r4, r8                              /* r4 = r8. */
+    mov r5, r9                              /* r5 = r9. */
+    mov r6, r10                             /* r6 = r10. */
+    mov r7, r11                             /* r7 = r11. */
+    stmia r0!, {r4-r7}                      /* Store the high registers that are not saved automatically. */
+#endif /* configENABLE_MPU */
+
+    cpsid i
+    bl vTaskSwitchContext
+    cpsie i
+
+    ldr r2, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r2]                            /* Read pxCurrentTCB. */
+    ldr r0, [r1]                            /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
+
+#if ( configENABLE_MPU == 1 )
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r3, [r2]                            /* Read the value of MPU_CTRL. */
+    movs r4, #1                             /* r4 = 1. */
+    bics r3, r4                             /* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */
+    str r3, [r2]                            /* Disable MPU. */
+
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+    ldr  r4, [r1]                           /* r4 = *r1 i.e. r4 = MAIR0. */
+    ldr  r2, =0xe000edc0                    /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str  r4, [r2]                           /* Program MAIR0. */
+    ldr  r2, =0xe000ed98                    /* r2 = 0xe000ed98 [Location of RNR]. */
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+    movs r4, #4                             /* r4 = 4. */
+    str  r4, [r2]                           /* Program RNR = 4. */
+    ldmia r1!, {r5,r6}                      /* Read first set of RBAR/RLAR from TCB. */
+    ldr  r3, =0xe000ed9c                    /* r3 = 0xe000ed9c [Location of RBAR]. */
+    stmia r3!, {r5,r6}                      /* Write first set of RBAR/RLAR registers. */
+    movs r4, #5                             /* r4 = 5. */
+    str  r4, [r2]                           /* Program RNR = 5. */
+    ldmia r1!, {r5,r6}                      /* Read second set of RBAR/RLAR from TCB. */
+    ldr  r3, =0xe000ed9c                    /* r3 = 0xe000ed9c [Location of RBAR]. */
+    stmia r3!, {r5,r6}                      /* Write second set of RBAR/RLAR registers. */
+    movs r4, #6                             /* r4 = 6. */
+    str  r4, [r2]                           /* Program RNR = 6. */
+    ldmia r1!, {r5,r6}                      /* Read third set of RBAR/RLAR from TCB. */
+    ldr  r3, =0xe000ed9c                    /* r3 = 0xe000ed9c [Location of RBAR]. */
+    stmia r3!, {r5,r6}                      /* Write third set of RBAR/RLAR registers. */
+    movs r4, #7                             /* r4 = 7. */
+    str  r4, [r2]                           /* Program RNR = 7. */
+    ldmia r1!, {r5,r6}                      /* Read fourth set of RBAR/RLAR from TCB. */
+    ldr  r3, =0xe000ed9c                    /* r3 = 0xe000ed9c [Location of RBAR]. */
+    stmia r3!, {r5,r6}                      /* Write fourth set of RBAR/RLAR registers. */
+
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r3, [r2]                            /* Read the value of MPU_CTRL. */
+    movs r4, #1                             /* r4 = 1. */
+    orrs r3, r4                             /* r3 = r3 | r4 i.e. Set the bit 0 in r3. */
+    str r3, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
+#endif /* configENABLE_MPU */
+
+#if ( configENABLE_MPU == 1 )
+    adds r0, r0, #28                        /* Move to the high registers. */
+    ldmia r0!, {r4-r7}                      /* Restore the high registers that are not automatically restored. */
+    mov r8, r4                              /* r8 = r4. */
+    mov r9, r5                              /* r9 = r5. */
+    mov r10, r6                             /* r10 = r6. */
+    mov r11, r7                             /* r11 = r7. */
+    msr psp, r0                             /* Remember the new top of stack for the task. */
+    subs r0, r0, #44                        /* Move to the starting of the saved context. */
+    ldmia r0!, {r1-r7}                      /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r7 restored. */
+    msr psplim, r1                          /* Restore the PSPLIM register value for the task. */
+    msr control, r2                         /* Restore the CONTROL register value for the task. */
+    bx r3
+#else /* configENABLE_MPU */
+    adds r0, r0, #24                        /* Move to the high registers. */
+    ldmia r0!, {r4-r7}                      /* Restore the high registers that are not automatically restored. */
+    mov r8, r4                              /* r8 = r4. */
+    mov r9, r5                              /* r9 = r5. */
+    mov r10, r6                             /* r10 = r6. */
+    mov r11, r7                             /* r11 = r7. */
+    msr psp, r0                             /* Remember the new top of stack for the task. */
+    subs r0, r0, #40                        /* Move to the starting of the saved context. */
+    ldmia r0!, {r2-r7}                      /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r7 restored. */
+    msr psplim, r2                          /* Restore the PSPLIM register value for the task. */
+    bx r3
+#endif /* configENABLE_MPU */
+/*-----------------------------------------------------------*/
+
+SVC_Handler:
+    movs r0, #4
+    mov r1, lr
+    tst r0, r1
+    beq stacking_used_msp
+    mrs r0, psp
+    b vPortSVCHandler_C
+    stacking_used_msp:
+        mrs r0, msp
+        b vPortSVCHandler_C
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h b/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h
index 0f7326c..d845ac1 100644
--- a/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h
+++ b/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h
@@ -1,78 +1,78 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#ifdef __cplusplus

-    extern "C" {

-#endif

-

-#include "portmacrocommon.h"

-

-/*------------------------------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the given hardware

- * and compiler.

- *

- * These settings should not be altered.

- *------------------------------------------------------------------------------

- */

-

-/**

- * Architecture specifics.

- */

-#define portARCH_NAME                       "Cortex-M23"

-#define portDONT_DISCARD                    __root

-/*-----------------------------------------------------------*/

-

-#if( configTOTAL_MPU_REGIONS == 16 )

-    #error 16 MPU regions are not yet supported for this port.

-#endif

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Critical section management.

- */

-#define portDISABLE_INTERRUPTS()            __asm volatile ( " cpsid i " ::: "memory" )

-#define portENABLE_INTERRUPTS()             __asm volatile ( " cpsie i " ::: "memory" )

-/*-----------------------------------------------------------*/

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

- * the source code because to do so would cause other compilers to generate

- * warnings. */

-#pragma diag_suppress=Be006

-#pragma diag_suppress=Pa082

-/*-----------------------------------------------------------*/

-

-#ifdef __cplusplus

-    }

-#endif

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#ifdef __cplusplus
+    extern "C" {
+#endif
+
+#include "portmacrocommon.h"
+
+/*------------------------------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the given hardware
+ * and compiler.
+ *
+ * These settings should not be altered.
+ *------------------------------------------------------------------------------
+ */
+
+/**
+ * Architecture specifics.
+ */
+#define portARCH_NAME                       "Cortex-M23"
+#define portDONT_DISCARD                    __root
+/*-----------------------------------------------------------*/
+
+#if( configTOTAL_MPU_REGIONS == 16 )
+    #error 16 MPU regions are not yet supported for this port.
+#endif
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Critical section management.
+ */
+#define portDISABLE_INTERRUPTS()            __asm volatile ( " cpsid i " ::: "memory" )
+#define portENABLE_INTERRUPTS()             __asm volatile ( " cpsie i " ::: "memory" )
+/*-----------------------------------------------------------*/
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+ * the source code because to do so would cause other compilers to generate
+ * warnings. */
+#pragma diag_suppress=Be006
+#pragma diag_suppress=Pa082
+/*-----------------------------------------------------------*/
+
+#ifdef __cplusplus
+    }
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h b/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h
index 4b1f99b..51e21ea 100644
--- a/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h
+++ b/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h
@@ -155,9 +155,9 @@
  * 8-bit values encoded as follows:
  *  Bit[7:4] - 0000 - Device Memory
  *  Bit[3:2] - 00 --> Device-nGnRnE
- *				01 --> Device-nGnRE
- *				10 --> Device-nGRE
- *				11 --> Device-GRE
+ *              01 --> Device-nGnRE
+ *              10 --> Device-nGRE
+ *              11 --> Device-GRE
  *  Bit[1:0] - 00, Reserved.
  */
     #define portMPU_DEVICE_MEMORY_nGnRnE                  ( 0x00 )   /* 0000 0000 */
diff --git a/portable/IAR/ARM_CM3/port.c b/portable/IAR/ARM_CM3/port.c
index f8e6a1b..cef6c24 100644
--- a/portable/IAR/ARM_CM3/port.c
+++ b/portable/IAR/ARM_CM3/port.c
@@ -1,664 +1,664 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

-* Implementation of functions defined in portable.h for the ARM CM3 port.

-*----------------------------------------------------------*/

-

-/* IAR includes. */

-#include <intrinsics.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )

-    #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */

-#endif

-

-/* Constants required to manipulate the core.  Registers first... */

-#define portNVIC_SYSTICK_CTRL_REG             ( *( ( volatile uint32_t * ) 0xe000e010 ) )

-#define portNVIC_SYSTICK_LOAD_REG             ( *( ( volatile uint32_t * ) 0xe000e014 ) )

-#define portNVIC_SYSTICK_CURRENT_VALUE_REG    ( *( ( volatile uint32_t * ) 0xe000e018 ) )

-#define portNVIC_SHPR3_REG                    ( *( ( volatile uint32_t * ) 0xe000ed20 ) )

-/* ...then bits in the registers. */

-#define portNVIC_SYSTICK_CLK_BIT              ( 1UL << 2UL )

-#define portNVIC_SYSTICK_INT_BIT              ( 1UL << 1UL )

-#define portNVIC_SYSTICK_ENABLE_BIT           ( 1UL << 0UL )

-#define portNVIC_SYSTICK_COUNT_FLAG_BIT       ( 1UL << 16UL )

-#define portNVIC_PENDSVCLEAR_BIT              ( 1UL << 27UL )

-#define portNVIC_PEND_SYSTICK_SET_BIT         ( 1UL << 26UL )

-#define portNVIC_PEND_SYSTICK_CLEAR_BIT       ( 1UL << 25UL )

-

-#define portNVIC_PENDSV_PRI                   ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )

-#define portNVIC_SYSTICK_PRI                  ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )

-

-/* Constants required to check the validity of an interrupt priority. */

-#define portFIRST_USER_INTERRUPT_NUMBER       ( 16 )

-#define portNVIC_IP_REGISTERS_OFFSET_16       ( 0xE000E3F0 )

-#define portAIRCR_REG                         ( *( ( volatile uint32_t * ) 0xE000ED0C ) )

-#define portMAX_8_BIT_VALUE                   ( ( uint8_t ) 0xff )

-#define portTOP_BIT_OF_BYTE                   ( ( uint8_t ) 0x80 )

-#define portMAX_PRIGROUP_BITS                 ( ( uint8_t ) 7 )

-#define portPRIORITY_GROUP_MASK               ( 0x07UL << 8UL )

-#define portPRIGROUP_SHIFT                    ( 8UL )

-

-/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */

-#define portVECTACTIVE_MASK                   ( 0xFFUL )

-

-/* Constants required to set up the initial stack. */

-#define portINITIAL_XPSR                      ( 0x01000000 )

-

-/* The systick is a 24-bit counter. */

-#define portMAX_24_BIT_NUMBER                 ( 0xffffffUL )

-

-/* A fiddle factor to estimate the number of SysTick counts that would have

- * occurred while the SysTick counter is stopped during tickless idle

- * calculations. */

-#define portMISSED_COUNTS_FACTOR              ( 94UL )

-

-/* For strict compliance with the Cortex-M spec the task start address should

- * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */

-#define portSTART_ADDRESS_MASK                ( ( StackType_t ) 0xfffffffeUL )

-

-/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is

- * defined.  The value 255 should also ensure backward compatibility.

- * FreeRTOS.org versions prior to V4.3.0 did not include this definition. */

-#ifndef configKERNEL_INTERRUPT_PRIORITY

-    #define configKERNEL_INTERRUPT_PRIORITY    255

-#endif

-

-/* Let the user override the default SysTick clock rate.  If defined by the

- * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the

- * configuration register. */

-#ifndef configSYSTICK_CLOCK_HZ

-    #define configSYSTICK_CLOCK_HZ             ( configCPU_CLOCK_HZ )

-    /* Ensure the SysTick is clocked at the same frequency as the core. */

-    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( portNVIC_SYSTICK_CLK_BIT )

-#else

-    /* Select the option to clock SysTick not at the same frequency as the core. */

-    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( 0 )

-#endif

-

-/*

- * Setup the timer to generate the tick interrupts.  The implementation in this

- * file is weak to allow application writers to change the timer used to

- * generate the tick interrupt.

- */

-void vPortSetupTimerInterrupt( void );

-

-/*

- * Exception handlers.

- */

-void xPortSysTickHandler( void );

-

-/*

- * Start first task is a separate function so it can be tested in isolation.

- */

-extern void vPortStartFirstTask( void );

-

-/*

- * Used to catch tasks that attempt to return from their implementing function.

- */

-static void prvTaskExitError( void );

-

-/*-----------------------------------------------------------*/

-

-/* Each task maintains its own interrupt status in the critical nesting

- * variable. */

-static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;

-

-/*

- * The number of SysTick increments that make up one tick period.

- */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t ulTimerCountsForOneTick = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/*

- * The maximum number of tick periods that can be suppressed is limited by the

- * 24 bit resolution of the SysTick timer.

- */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t xMaximumPossibleSuppressedTicks = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/*

- * Compensate for the CPU cycles that pass while the SysTick is stopped (low

- * power functionality only.

- */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t ulStoppedTimerCompensation = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/*

- * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure

- * FreeRTOS API functions are not called from interrupts that have been assigned

- * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.

- */

-#if ( configASSERT_DEFINED == 1 )

-    static uint8_t ucMaxSysCallPriority = 0;

-    static uint32_t ulMaxPRIGROUPValue = 0;

-    static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;

-#endif /* configASSERT_DEFINED */

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,

-                                     TaskFunction_t pxCode,

-                                     void * pvParameters )

-{

-    /* Simulate the stack frame as it would be created by a context switch

-     * interrupt. */

-    pxTopOfStack--;                                                      /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */

-    *pxTopOfStack = portINITIAL_XPSR;                                    /* xPSR */

-    pxTopOfStack--;

-    *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */

-    pxTopOfStack--;

-    *pxTopOfStack = ( StackType_t ) prvTaskExitError;                    /* LR */

-    pxTopOfStack -= 5;                                                   /* R12, R3, R2 and R1. */

-    *pxTopOfStack = ( StackType_t ) pvParameters;                        /* R0 */

-    pxTopOfStack -= 8;                                                   /* R11, R10, R9, R8, R7, R6, R5 and R4. */

-

-    return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-static void prvTaskExitError( void )

-{

-    /* A function that implements a task must not exit or attempt to return to

-     * its caller as there is nothing to return to.  If a task wants to exit it

-     * should instead call vTaskDelete( NULL ).

-     *

-     * Artificially force an assert() to be triggered if configASSERT() is

-     * defined, then stop here so application writers can catch the error. */

-    configASSERT( uxCriticalNesting == ~0UL );

-    portDISABLE_INTERRUPTS();

-

-    for( ; ; )

-    {

-    }

-}

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-BaseType_t xPortStartScheduler( void )

-{

-    /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.

-     * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */

-    configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );

-

-    #if ( configASSERT_DEFINED == 1 )

-    {

-        volatile uint32_t ulOriginalPriority;

-        volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );

-        volatile uint8_t ucMaxPriorityValue;

-

-        /* Determine the maximum priority from which ISR safe FreeRTOS API

-         * functions can be called.  ISR safe functions are those that end in

-         * "FromISR".  FreeRTOS maintains separate thread and ISR API functions to

-         * ensure interrupt entry is as fast and simple as possible.

-         *

-         * Save the interrupt priority value that is about to be clobbered. */

-        ulOriginalPriority = *pucFirstUserPriorityRegister;

-

-        /* Determine the number of priority bits available.  First write to all

-         * possible bits. */

-        *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;

-

-        /* Read the value back to see how many bits stuck. */

-        ucMaxPriorityValue = *pucFirstUserPriorityRegister;

-

-        /* Use the same mask on the maximum system call priority. */

-        ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;

-

-        /* Calculate the maximum acceptable priority group value for the number

-         * of bits read back. */

-        ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;

-

-        while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )

-        {

-            ulMaxPRIGROUPValue--;

-            ucMaxPriorityValue <<= ( uint8_t ) 0x01;

-        }

-

-        #ifdef __NVIC_PRIO_BITS

-        {

-            /* Check the CMSIS configuration that defines the number of

-             * priority bits matches the number of priority bits actually queried

-             * from the hardware. */

-            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );

-        }

-        #endif

-

-        #ifdef configPRIO_BITS

-        {

-            /* Check the FreeRTOS configuration that defines the number of

-             * priority bits matches the number of priority bits actually queried

-             * from the hardware. */

-            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );

-        }

-        #endif

-

-        /* Shift the priority group value back to its position within the AIRCR

-         * register. */

-        ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;

-        ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;

-

-        /* Restore the clobbered interrupt priority register to its original

-         * value. */

-        *pucFirstUserPriorityRegister = ulOriginalPriority;

-    }

-    #endif /* configASSERT_DEFINED */

-

-    /* Make PendSV and SysTick the lowest priority interrupts. */

-    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;

-    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;

-

-    /* Start the timer that generates the tick ISR.  Interrupts are disabled

-     * here already. */

-    vPortSetupTimerInterrupt();

-

-    /* Initialise the critical nesting count ready for the first task. */

-    uxCriticalNesting = 0;

-

-    /* Start the first task. */

-    vPortStartFirstTask();

-

-    /* Should not get here! */

-    return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-    /* Not implemented in ports where there is nothing to return to.

-     * Artificially force an assert. */

-    configASSERT( uxCriticalNesting == 1000UL );

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-    portDISABLE_INTERRUPTS();

-    uxCriticalNesting++;

-

-    /* This is not the interrupt safe version of the enter critical function so

-     * assert() if it is being called from an interrupt context.  Only API

-     * functions that end in "FromISR" can be used in an interrupt.  Only assert if

-     * the critical nesting count is 1 to protect against recursive calls if the

-     * assert function also uses a critical section. */

-    if( uxCriticalNesting == 1 )

-    {

-        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );

-    }

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-    configASSERT( uxCriticalNesting );

-    uxCriticalNesting--;

-

-    if( uxCriticalNesting == 0 )

-    {

-        portENABLE_INTERRUPTS();

-    }

-}

-/*-----------------------------------------------------------*/

-

-void xPortSysTickHandler( void )

-{

-    /* The SysTick runs at the lowest interrupt priority, so when this interrupt

-     * executes all interrupts must be unmasked.  There is therefore no need to

-     * save and then restore the interrupt mask value as its value is already

-     * known. */

-    portDISABLE_INTERRUPTS();

-    {

-        /* Increment the RTOS tick. */

-        if( xTaskIncrementTick() != pdFALSE )

-        {

-            /* A context switch is required.  Context switching is performed in

-             * the PendSV interrupt.  Pend the PendSV interrupt. */

-            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;

-        }

-    }

-    portENABLE_INTERRUPTS();

-}

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TICKLESS_IDLE == 1 )

-

-    __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )

-    {

-        uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft;

-        TickType_t xModifiableIdleTime;

-

-        /* Make sure the SysTick reload value does not overflow the counter. */

-        if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )

-        {

-            xExpectedIdleTime = xMaximumPossibleSuppressedTicks;

-        }

-

-        /* Enter a critical section but don't use the taskENTER_CRITICAL()

-         * method as that will mask interrupts that should exit sleep mode. */

-        __disable_interrupt();

-        __DSB();

-        __ISB();

-

-        /* If a context switch is pending or a task is waiting for the scheduler

-         * to be unsuspended then abandon the low power entry. */

-        if( eTaskConfirmSleepModeStatus() == eAbortSleep )

-        {

-            /* Re-enable interrupts - see comments above the __disable_interrupt()

-             * call above. */

-            __enable_interrupt();

-        }

-        else

-        {

-            /* Stop the SysTick momentarily.  The time the SysTick is stopped for

-             * is accounted for as best it can be, but using the tickless mode will

-             * inevitably result in some tiny drift of the time maintained by the

-             * kernel with respect to calendar time. */

-            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );

-

-            /* Use the SysTick current-value register to determine the number of

-             * SysTick decrements remaining until the next tick interrupt.  If the

-             * current-value register is zero, then there are actually

-             * ulTimerCountsForOneTick decrements remaining, not zero, because the

-             * SysTick requests the interrupt when decrementing from 1 to 0. */

-            ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;

-

-            if( ulSysTickDecrementsLeft == 0 )

-            {

-                ulSysTickDecrementsLeft = ulTimerCountsForOneTick;

-            }

-

-            /* Calculate the reload value required to wait xExpectedIdleTime

-             * tick periods.  -1 is used because this code normally executes part

-             * way through the first tick period.  But if the SysTick IRQ is now

-             * pending, then clear the IRQ, suppressing the first tick, and correct

-             * the reload value to reflect that the second tick period is already

-             * underway.  The expected idle time is always at least two ticks. */

-            ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );

-

-            if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 )

-            {

-                portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT;

-                ulReloadValue -= ulTimerCountsForOneTick;

-            }

-

-            if( ulReloadValue > ulStoppedTimerCompensation )

-            {

-                ulReloadValue -= ulStoppedTimerCompensation;

-            }

-

-            /* Set the new reload value. */

-            portNVIC_SYSTICK_LOAD_REG = ulReloadValue;

-

-            /* Clear the SysTick count flag and set the count value back to

-             * zero. */

-            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-

-            /* Restart SysTick. */

-            portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;

-

-            /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can

-             * set its parameter to 0 to indicate that its implementation contains

-             * its own wait for interrupt or wait for event instruction, and so wfi

-             * should not be executed again.  However, the original expected idle

-             * time variable must remain unmodified, so a copy is taken. */

-            xModifiableIdleTime = xExpectedIdleTime;

-            configPRE_SLEEP_PROCESSING( xModifiableIdleTime );

-

-            if( xModifiableIdleTime > 0 )

-            {

-                __DSB();

-                __WFI();

-                __ISB();

-            }

-

-            configPOST_SLEEP_PROCESSING( xExpectedIdleTime );

-

-            /* Re-enable interrupts to allow the interrupt that brought the MCU

-             * out of sleep mode to execute immediately.  See comments above

-             * the __disable_interrupt() call above. */

-            __enable_interrupt();

-            __DSB();

-            __ISB();

-

-            /* Disable interrupts again because the clock is about to be stopped

-             * and interrupts that execute while the clock is stopped will increase

-             * any slippage between the time maintained by the RTOS and calendar

-             * time. */

-            __disable_interrupt();

-            __DSB();

-            __ISB();

-

-            /* Disable the SysTick clock without reading the

-             * portNVIC_SYSTICK_CTRL_REG register to ensure the

-             * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,

-             * the time the SysTick is stopped for is accounted for as best it can

-             * be, but using the tickless mode will inevitably result in some tiny

-             * drift of the time maintained by the kernel with respect to calendar

-             * time*/

-            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );

-

-            /* Determine whether the SysTick has already counted to zero. */

-            if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )

-            {

-                uint32_t ulCalculatedLoadValue;

-

-                /* The tick interrupt ended the sleep (or is now pending), and

-                 * a new tick period has started.  Reset portNVIC_SYSTICK_LOAD_REG

-                 * with whatever remains of the new tick period. */

-                ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );

-

-                /* Don't allow a tiny value, or values that have somehow

-                 * underflowed because the post sleep hook did something

-                 * that took too long or because the SysTick current-value register

-                 * is zero. */

-                if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )

-                {

-                    ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );

-                }

-

-                portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;

-

-                /* As the pending tick will be processed as soon as this

-                 * function exits, the tick value maintained by the tick is stepped

-                 * forward by one less than the time spent waiting. */

-                ulCompleteTickPeriods = xExpectedIdleTime - 1UL;

-            }

-            else

-            {

-                /* Something other than the tick interrupt ended the sleep. */

-

-                /* Use the SysTick current-value register to determine the

-                 * number of SysTick decrements remaining until the expected idle

-                 * time would have ended. */

-                ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;

-                #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT )

-                {

-                    /* If the SysTick is not using the core clock, the current-

-                     * value register might still be zero here.  In that case, the

-                     * SysTick didn't load from the reload register, and there are

-                     * ulReloadValue decrements remaining in the expected idle

-                     * time, not zero. */

-                    if( ulSysTickDecrementsLeft == 0 )

-                    {

-                        ulSysTickDecrementsLeft = ulReloadValue;

-                    }

-                }

-                #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */

-

-                /* Work out how long the sleep lasted rounded to complete tick

-                 * periods (not the ulReload value which accounted for part

-                 * ticks). */

-                ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft;

-

-                /* How many complete tick periods passed while the processor

-                 * was waiting? */

-                ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;

-

-                /* The reload value is set to whatever fraction of a single tick

-                 * period remains. */

-                portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;

-            }

-

-            /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again,

-             * then set portNVIC_SYSTICK_LOAD_REG back to its standard value.  If

-             * the SysTick is not using the core clock, temporarily configure it to

-             * use the core clock.  This configuration forces the SysTick to load

-             * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next

-             * cycle of the other clock.  Then portNVIC_SYSTICK_LOAD_REG is ready

-             * to receive the standard value immediately. */

-            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-            portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;

-            #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT )

-            {

-                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

-            }

-            #else

-            {

-                /* The temporary usage of the core clock has served its purpose,

-                 * as described above.  Resume usage of the other clock. */

-                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT;

-

-                if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )

-                {

-                    /* The partial tick period already ended.  Be sure the SysTick

-                     * counts it only once. */

-                    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0;

-                }

-

-                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

-                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;

-            }

-            #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */

-

-            /* Step the tick to account for any tick periods that elapsed. */

-            vTaskStepTick( ulCompleteTickPeriods );

-

-            /* Exit with interrupts enabled. */

-            __enable_interrupt();

-        }

-    }

-

-#endif /* configUSE_TICKLESS_IDLE */

-/*-----------------------------------------------------------*/

-

-/*

- * Setup the systick timer to generate the tick interrupts at the required

- * frequency.

- */

-__weak void vPortSetupTimerInterrupt( void )

-{

-    /* Calculate the constants required to configure the tick interrupt. */

-    #if ( configUSE_TICKLESS_IDLE == 1 )

-    {

-        ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );

-        xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;

-        ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );

-    }

-    #endif /* configUSE_TICKLESS_IDLE */

-

-    /* Stop and clear the SysTick. */

-    portNVIC_SYSTICK_CTRL_REG = 0UL;

-    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-

-    /* Configure SysTick to interrupt at the requested rate. */

-    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;

-    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );

-}

-/*-----------------------------------------------------------*/

-

-#if ( configASSERT_DEFINED == 1 )

-

-    void vPortValidateInterruptPriority( void )

-    {

-        uint32_t ulCurrentInterrupt;

-        uint8_t ucCurrentPriority;

-

-        /* Obtain the number of the currently executing interrupt. */

-        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );

-

-        /* Is the interrupt number a user defined interrupt? */

-        if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )

-        {

-            /* Look up the interrupt's priority. */

-            ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];

-

-            /* The following assertion will fail if a service routine (ISR) for

-             * an interrupt that has been assigned a priority above

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API

-             * function.  ISR safe FreeRTOS API functions must *only* be called

-             * from interrupts that have been assigned a priority at or below

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY.

-             *

-             * Numerically low interrupt priority numbers represent logically high

-             * interrupt priorities, therefore the priority of the interrupt must

-             * be set to a value equal to or numerically *higher* than

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY.

-             *

-             * Interrupts that	use the FreeRTOS API must not be left at their

-             * default priority of	zero as that is the highest possible priority,

-             * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,

-             * and	therefore also guaranteed to be invalid.

-             *

-             * FreeRTOS maintains separate thread and ISR API functions to ensure

-             * interrupt entry is as fast and simple as possible.

-             *

-             * The following links provide detailed information:

-             * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html

-             * https://www.FreeRTOS.org/FAQHelp.html */

-            configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

-        }

-

-        /* Priority grouping:  The interrupt controller (NVIC) allows the bits

-         * that define each interrupt's priority to be split between bits that

-         * define the interrupt's pre-emption priority bits and bits that define

-         * the interrupt's sub-priority.  For simplicity all bits must be defined

-         * to be pre-emption priority bits.  The following assertion will fail if

-         * this is not the case (if some bits represent a sub-priority).

-         *

-         * If the application only uses CMSIS libraries for interrupt

-         * configuration then the correct setting can be achieved on all Cortex-M

-         * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the

-         * scheduler.  Note however that some vendor specific peripheral libraries

-         * assume a non-zero priority group setting, in which cases using a value

-         * of zero will result in unpredictable behaviour. */

-        configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );

-    }

-

-#endif /* configASSERT_DEFINED */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+* Implementation of functions defined in portable.h for the ARM CM3 port.
+*----------------------------------------------------------*/
+
+/* IAR includes. */
+#include <intrinsics.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )
+    #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
+#endif
+
+/* Constants required to manipulate the core.  Registers first... */
+#define portNVIC_SYSTICK_CTRL_REG             ( *( ( volatile uint32_t * ) 0xe000e010 ) )
+#define portNVIC_SYSTICK_LOAD_REG             ( *( ( volatile uint32_t * ) 0xe000e014 ) )
+#define portNVIC_SYSTICK_CURRENT_VALUE_REG    ( *( ( volatile uint32_t * ) 0xe000e018 ) )
+#define portNVIC_SHPR3_REG                    ( *( ( volatile uint32_t * ) 0xe000ed20 ) )
+/* ...then bits in the registers. */
+#define portNVIC_SYSTICK_CLK_BIT              ( 1UL << 2UL )
+#define portNVIC_SYSTICK_INT_BIT              ( 1UL << 1UL )
+#define portNVIC_SYSTICK_ENABLE_BIT           ( 1UL << 0UL )
+#define portNVIC_SYSTICK_COUNT_FLAG_BIT       ( 1UL << 16UL )
+#define portNVIC_PENDSVCLEAR_BIT              ( 1UL << 27UL )
+#define portNVIC_PEND_SYSTICK_SET_BIT         ( 1UL << 26UL )
+#define portNVIC_PEND_SYSTICK_CLEAR_BIT       ( 1UL << 25UL )
+
+#define portNVIC_PENDSV_PRI                   ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
+#define portNVIC_SYSTICK_PRI                  ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )
+
+/* Constants required to check the validity of an interrupt priority. */
+#define portFIRST_USER_INTERRUPT_NUMBER       ( 16 )
+#define portNVIC_IP_REGISTERS_OFFSET_16       ( 0xE000E3F0 )
+#define portAIRCR_REG                         ( *( ( volatile uint32_t * ) 0xE000ED0C ) )
+#define portMAX_8_BIT_VALUE                   ( ( uint8_t ) 0xff )
+#define portTOP_BIT_OF_BYTE                   ( ( uint8_t ) 0x80 )
+#define portMAX_PRIGROUP_BITS                 ( ( uint8_t ) 7 )
+#define portPRIORITY_GROUP_MASK               ( 0x07UL << 8UL )
+#define portPRIGROUP_SHIFT                    ( 8UL )
+
+/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */
+#define portVECTACTIVE_MASK                   ( 0xFFUL )
+
+/* Constants required to set up the initial stack. */
+#define portINITIAL_XPSR                      ( 0x01000000 )
+
+/* The systick is a 24-bit counter. */
+#define portMAX_24_BIT_NUMBER                 ( 0xffffffUL )
+
+/* A fiddle factor to estimate the number of SysTick counts that would have
+ * occurred while the SysTick counter is stopped during tickless idle
+ * calculations. */
+#define portMISSED_COUNTS_FACTOR              ( 94UL )
+
+/* For strict compliance with the Cortex-M spec the task start address should
+ * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */
+#define portSTART_ADDRESS_MASK                ( ( StackType_t ) 0xfffffffeUL )
+
+/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is
+ * defined.  The value 255 should also ensure backward compatibility.
+ * FreeRTOS.org versions prior to V4.3.0 did not include this definition. */
+#ifndef configKERNEL_INTERRUPT_PRIORITY
+    #define configKERNEL_INTERRUPT_PRIORITY    255
+#endif
+
+/* Let the user override the default SysTick clock rate.  If defined by the
+ * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the
+ * configuration register. */
+#ifndef configSYSTICK_CLOCK_HZ
+    #define configSYSTICK_CLOCK_HZ             ( configCPU_CLOCK_HZ )
+    /* Ensure the SysTick is clocked at the same frequency as the core. */
+    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( portNVIC_SYSTICK_CLK_BIT )
+#else
+    /* Select the option to clock SysTick not at the same frequency as the core. */
+    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( 0 )
+#endif
+
+/*
+ * Setup the timer to generate the tick interrupts.  The implementation in this
+ * file is weak to allow application writers to change the timer used to
+ * generate the tick interrupt.
+ */
+void vPortSetupTimerInterrupt( void );
+
+/*
+ * Exception handlers.
+ */
+void xPortSysTickHandler( void );
+
+/*
+ * Start first task is a separate function so it can be tested in isolation.
+ */
+extern void vPortStartFirstTask( void );
+
+/*
+ * Used to catch tasks that attempt to return from their implementing function.
+ */
+static void prvTaskExitError( void );
+
+/*-----------------------------------------------------------*/
+
+/* Each task maintains its own interrupt status in the critical nesting
+ * variable. */
+static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
+
+/*
+ * The number of SysTick increments that make up one tick period.
+ */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t ulTimerCountsForOneTick = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/*
+ * The maximum number of tick periods that can be suppressed is limited by the
+ * 24 bit resolution of the SysTick timer.
+ */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t xMaximumPossibleSuppressedTicks = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/*
+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low
+ * power functionality only.
+ */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t ulStoppedTimerCompensation = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/*
+ * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure
+ * FreeRTOS API functions are not called from interrupts that have been assigned
+ * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.
+ */
+#if ( configASSERT_DEFINED == 1 )
+    static uint8_t ucMaxSysCallPriority = 0;
+    static uint32_t ulMaxPRIGROUPValue = 0;
+    static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;
+#endif /* configASSERT_DEFINED */
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
+                                     TaskFunction_t pxCode,
+                                     void * pvParameters )
+{
+    /* Simulate the stack frame as it would be created by a context switch
+     * interrupt. */
+    pxTopOfStack--;                                                      /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
+    *pxTopOfStack = portINITIAL_XPSR;                                    /* xPSR */
+    pxTopOfStack--;
+    *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) prvTaskExitError;                    /* LR */
+    pxTopOfStack -= 5;                                                   /* R12, R3, R2 and R1. */
+    *pxTopOfStack = ( StackType_t ) pvParameters;                        /* R0 */
+    pxTopOfStack -= 8;                                                   /* R11, R10, R9, R8, R7, R6, R5 and R4. */
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+static void prvTaskExitError( void )
+{
+    /* A function that implements a task must not exit or attempt to return to
+     * its caller as there is nothing to return to.  If a task wants to exit it
+     * should instead call vTaskDelete( NULL ).
+     *
+     * Artificially force an assert() to be triggered if configASSERT() is
+     * defined, then stop here so application writers can catch the error. */
+    configASSERT( uxCriticalNesting == ~0UL );
+    portDISABLE_INTERRUPTS();
+
+    for( ; ; )
+    {
+    }
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+BaseType_t xPortStartScheduler( void )
+{
+    /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.
+     * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
+    configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );
+
+    #if ( configASSERT_DEFINED == 1 )
+    {
+        volatile uint32_t ulOriginalPriority;
+        volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );
+        volatile uint8_t ucMaxPriorityValue;
+
+        /* Determine the maximum priority from which ISR safe FreeRTOS API
+         * functions can be called.  ISR safe functions are those that end in
+         * "FromISR".  FreeRTOS maintains separate thread and ISR API functions to
+         * ensure interrupt entry is as fast and simple as possible.
+         *
+         * Save the interrupt priority value that is about to be clobbered. */
+        ulOriginalPriority = *pucFirstUserPriorityRegister;
+
+        /* Determine the number of priority bits available.  First write to all
+         * possible bits. */
+        *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
+
+        /* Read the value back to see how many bits stuck. */
+        ucMaxPriorityValue = *pucFirstUserPriorityRegister;
+
+        /* Use the same mask on the maximum system call priority. */
+        ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
+
+        /* Calculate the maximum acceptable priority group value for the number
+         * of bits read back. */
+        ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
+
+        while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
+        {
+            ulMaxPRIGROUPValue--;
+            ucMaxPriorityValue <<= ( uint8_t ) 0x01;
+        }
+
+        #ifdef __NVIC_PRIO_BITS
+        {
+            /* Check the CMSIS configuration that defines the number of
+             * priority bits matches the number of priority bits actually queried
+             * from the hardware. */
+            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );
+        }
+        #endif
+
+        #ifdef configPRIO_BITS
+        {
+            /* Check the FreeRTOS configuration that defines the number of
+             * priority bits matches the number of priority bits actually queried
+             * from the hardware. */
+            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
+        }
+        #endif
+
+        /* Shift the priority group value back to its position within the AIRCR
+         * register. */
+        ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
+        ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
+
+        /* Restore the clobbered interrupt priority register to its original
+         * value. */
+        *pucFirstUserPriorityRegister = ulOriginalPriority;
+    }
+    #endif /* configASSERT_DEFINED */
+
+    /* Make PendSV and SysTick the lowest priority interrupts. */
+    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
+    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+     * here already. */
+    vPortSetupTimerInterrupt();
+
+    /* Initialise the critical nesting count ready for the first task. */
+    uxCriticalNesting = 0;
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+     * Artificially force an assert. */
+    configASSERT( uxCriticalNesting == 1000UL );
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    portDISABLE_INTERRUPTS();
+    uxCriticalNesting++;
+
+    /* This is not the interrupt safe version of the enter critical function so
+     * assert() if it is being called from an interrupt context.  Only API
+     * functions that end in "FromISR" can be used in an interrupt.  Only assert if
+     * the critical nesting count is 1 to protect against recursive calls if the
+     * assert function also uses a critical section. */
+    if( uxCriticalNesting == 1 )
+    {
+        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
+    }
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    configASSERT( uxCriticalNesting );
+    uxCriticalNesting--;
+
+    if( uxCriticalNesting == 0 )
+    {
+        portENABLE_INTERRUPTS();
+    }
+}
+/*-----------------------------------------------------------*/
+
+void xPortSysTickHandler( void )
+{
+    /* The SysTick runs at the lowest interrupt priority, so when this interrupt
+     * executes all interrupts must be unmasked.  There is therefore no need to
+     * save and then restore the interrupt mask value as its value is already
+     * known. */
+    portDISABLE_INTERRUPTS();
+    {
+        /* Increment the RTOS tick. */
+        if( xTaskIncrementTick() != pdFALSE )
+        {
+            /* A context switch is required.  Context switching is performed in
+             * the PendSV interrupt.  Pend the PendSV interrupt. */
+            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
+        }
+    }
+    portENABLE_INTERRUPTS();
+}
+/*-----------------------------------------------------------*/
+
+#if ( configUSE_TICKLESS_IDLE == 1 )
+
+    __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
+    {
+        uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft;
+        TickType_t xModifiableIdleTime;
+
+        /* Make sure the SysTick reload value does not overflow the counter. */
+        if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )
+        {
+            xExpectedIdleTime = xMaximumPossibleSuppressedTicks;
+        }
+
+        /* Enter a critical section but don't use the taskENTER_CRITICAL()
+         * method as that will mask interrupts that should exit sleep mode. */
+        __disable_interrupt();
+        __DSB();
+        __ISB();
+
+        /* If a context switch is pending or a task is waiting for the scheduler
+         * to be unsuspended then abandon the low power entry. */
+        if( eTaskConfirmSleepModeStatus() == eAbortSleep )
+        {
+            /* Re-enable interrupts - see comments above the __disable_interrupt()
+             * call above. */
+            __enable_interrupt();
+        }
+        else
+        {
+            /* Stop the SysTick momentarily.  The time the SysTick is stopped for
+             * is accounted for as best it can be, but using the tickless mode will
+             * inevitably result in some tiny drift of the time maintained by the
+             * kernel with respect to calendar time. */
+            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );
+
+            /* Use the SysTick current-value register to determine the number of
+             * SysTick decrements remaining until the next tick interrupt.  If the
+             * current-value register is zero, then there are actually
+             * ulTimerCountsForOneTick decrements remaining, not zero, because the
+             * SysTick requests the interrupt when decrementing from 1 to 0. */
+            ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;
+
+            if( ulSysTickDecrementsLeft == 0 )
+            {
+                ulSysTickDecrementsLeft = ulTimerCountsForOneTick;
+            }
+
+            /* Calculate the reload value required to wait xExpectedIdleTime
+             * tick periods.  -1 is used because this code normally executes part
+             * way through the first tick period.  But if the SysTick IRQ is now
+             * pending, then clear the IRQ, suppressing the first tick, and correct
+             * the reload value to reflect that the second tick period is already
+             * underway.  The expected idle time is always at least two ticks. */
+            ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
+
+            if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 )
+            {
+                portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT;
+                ulReloadValue -= ulTimerCountsForOneTick;
+            }
+
+            if( ulReloadValue > ulStoppedTimerCompensation )
+            {
+                ulReloadValue -= ulStoppedTimerCompensation;
+            }
+
+            /* Set the new reload value. */
+            portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
+
+            /* Clear the SysTick count flag and set the count value back to
+             * zero. */
+            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+
+            /* Restart SysTick. */
+            portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
+
+            /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can
+             * set its parameter to 0 to indicate that its implementation contains
+             * its own wait for interrupt or wait for event instruction, and so wfi
+             * should not be executed again.  However, the original expected idle
+             * time variable must remain unmodified, so a copy is taken. */
+            xModifiableIdleTime = xExpectedIdleTime;
+            configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
+
+            if( xModifiableIdleTime > 0 )
+            {
+                __DSB();
+                __WFI();
+                __ISB();
+            }
+
+            configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
+
+            /* Re-enable interrupts to allow the interrupt that brought the MCU
+             * out of sleep mode to execute immediately.  See comments above
+             * the __disable_interrupt() call above. */
+            __enable_interrupt();
+            __DSB();
+            __ISB();
+
+            /* Disable interrupts again because the clock is about to be stopped
+             * and interrupts that execute while the clock is stopped will increase
+             * any slippage between the time maintained by the RTOS and calendar
+             * time. */
+            __disable_interrupt();
+            __DSB();
+            __ISB();
+
+            /* Disable the SysTick clock without reading the
+             * portNVIC_SYSTICK_CTRL_REG register to ensure the
+             * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,
+             * the time the SysTick is stopped for is accounted for as best it can
+             * be, but using the tickless mode will inevitably result in some tiny
+             * drift of the time maintained by the kernel with respect to calendar
+             * time*/
+            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );
+
+            /* Determine whether the SysTick has already counted to zero. */
+            if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
+            {
+                uint32_t ulCalculatedLoadValue;
+
+                /* The tick interrupt ended the sleep (or is now pending), and
+                 * a new tick period has started.  Reset portNVIC_SYSTICK_LOAD_REG
+                 * with whatever remains of the new tick period. */
+                ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
+
+                /* Don't allow a tiny value, or values that have somehow
+                 * underflowed because the post sleep hook did something
+                 * that took too long or because the SysTick current-value register
+                 * is zero. */
+                if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
+                {
+                    ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
+                }
+
+                portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
+
+                /* As the pending tick will be processed as soon as this
+                 * function exits, the tick value maintained by the tick is stepped
+                 * forward by one less than the time spent waiting. */
+                ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
+            }
+            else
+            {
+                /* Something other than the tick interrupt ended the sleep. */
+
+                /* Use the SysTick current-value register to determine the
+                 * number of SysTick decrements remaining until the expected idle
+                 * time would have ended. */
+                ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;
+                #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT )
+                {
+                    /* If the SysTick is not using the core clock, the current-
+                     * value register might still be zero here.  In that case, the
+                     * SysTick didn't load from the reload register, and there are
+                     * ulReloadValue decrements remaining in the expected idle
+                     * time, not zero. */
+                    if( ulSysTickDecrementsLeft == 0 )
+                    {
+                        ulSysTickDecrementsLeft = ulReloadValue;
+                    }
+                }
+                #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */
+
+                /* Work out how long the sleep lasted rounded to complete tick
+                 * periods (not the ulReload value which accounted for part
+                 * ticks). */
+                ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft;
+
+                /* How many complete tick periods passed while the processor
+                 * was waiting? */
+                ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
+
+                /* The reload value is set to whatever fraction of a single tick
+                 * period remains. */
+                portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
+            }
+
+            /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again,
+             * then set portNVIC_SYSTICK_LOAD_REG back to its standard value.  If
+             * the SysTick is not using the core clock, temporarily configure it to
+             * use the core clock.  This configuration forces the SysTick to load
+             * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next
+             * cycle of the other clock.  Then portNVIC_SYSTICK_LOAD_REG is ready
+             * to receive the standard value immediately. */
+            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+            portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
+            #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT )
+            {
+                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+            }
+            #else
+            {
+                /* The temporary usage of the core clock has served its purpose,
+                 * as described above.  Resume usage of the other clock. */
+                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT;
+
+                if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
+                {
+                    /* The partial tick period already ended.  Be sure the SysTick
+                     * counts it only once. */
+                    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0;
+                }
+
+                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
+            }
+            #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */
+
+            /* Step the tick to account for any tick periods that elapsed. */
+            vTaskStepTick( ulCompleteTickPeriods );
+
+            /* Exit with interrupts enabled. */
+            __enable_interrupt();
+        }
+    }
+
+#endif /* configUSE_TICKLESS_IDLE */
+/*-----------------------------------------------------------*/
+
+/*
+ * Setup the systick timer to generate the tick interrupts at the required
+ * frequency.
+ */
+__weak void vPortSetupTimerInterrupt( void )
+{
+    /* Calculate the constants required to configure the tick interrupt. */
+    #if ( configUSE_TICKLESS_IDLE == 1 )
+    {
+        ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
+        xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
+        ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
+    }
+    #endif /* configUSE_TICKLESS_IDLE */
+
+    /* Stop and clear the SysTick. */
+    portNVIC_SYSTICK_CTRL_REG = 0UL;
+    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+
+    /* Configure SysTick to interrupt at the requested rate. */
+    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
+    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
+}
+/*-----------------------------------------------------------*/
+
+#if ( configASSERT_DEFINED == 1 )
+
+    void vPortValidateInterruptPriority( void )
+    {
+        uint32_t ulCurrentInterrupt;
+        uint8_t ucCurrentPriority;
+
+        /* Obtain the number of the currently executing interrupt. */
+        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );
+
+        /* Is the interrupt number a user defined interrupt? */
+        if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
+        {
+            /* Look up the interrupt's priority. */
+            ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
+
+            /* The following assertion will fail if a service routine (ISR) for
+             * an interrupt that has been assigned a priority above
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API
+             * function.  ISR safe FreeRTOS API functions must *only* be called
+             * from interrupts that have been assigned a priority at or below
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY.
+             *
+             * Numerically low interrupt priority numbers represent logically high
+             * interrupt priorities, therefore the priority of the interrupt must
+             * be set to a value equal to or numerically *higher* than
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY.
+             *
+             * Interrupts that  use the FreeRTOS API must not be left at their
+             * default priority of  zero as that is the highest possible priority,
+             * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,
+             * and  therefore also guaranteed to be invalid.
+             *
+             * FreeRTOS maintains separate thread and ISR API functions to ensure
+             * interrupt entry is as fast and simple as possible.
+             *
+             * The following links provide detailed information:
+             * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
+             * https://www.FreeRTOS.org/FAQHelp.html */
+            configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
+        }
+
+        /* Priority grouping:  The interrupt controller (NVIC) allows the bits
+         * that define each interrupt's priority to be split between bits that
+         * define the interrupt's pre-emption priority bits and bits that define
+         * the interrupt's sub-priority.  For simplicity all bits must be defined
+         * to be pre-emption priority bits.  The following assertion will fail if
+         * this is not the case (if some bits represent a sub-priority).
+         *
+         * If the application only uses CMSIS libraries for interrupt
+         * configuration then the correct setting can be achieved on all Cortex-M
+         * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
+         * scheduler.  Note however that some vendor specific peripheral libraries
+         * assume a non-zero priority group setting, in which cases using a value
+         * of zero will result in unpredictable behaviour. */
+        configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
+    }
+
+#endif /* configASSERT_DEFINED */
diff --git a/portable/IAR/ARM_CM3/portasm.s b/portable/IAR/ARM_CM3/portasm.s
index 728af47..0dbb43b 100644
--- a/portable/IAR/ARM_CM3/portasm.s
+++ b/portable/IAR/ARM_CM3/portasm.s
@@ -1,104 +1,104 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#include <FreeRTOSConfig.h>

-

-	RSEG    CODE:CODE(2)

-	thumb

-

-	EXTERN pxCurrentTCB

-	EXTERN vTaskSwitchContext

-

-	PUBLIC xPortPendSVHandler

-	PUBLIC vPortSVCHandler

-	PUBLIC vPortStartFirstTask

-

-

-

-/*-----------------------------------------------------------*/

-

-xPortPendSVHandler:

-	mrs r0, psp

-	isb

-	ldr	r3, =pxCurrentTCB			/* Get the location of the current TCB. */

-	ldr	r2, [r3]

-

-	stmdb r0!, {r4-r11}				/* Save the remaining registers. */

-	str r0, [r2]					/* Save the new top of stack into the first member of the TCB. */

-

-	stmdb sp!, {r3, r14}

-	mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-	msr basepri, r0

-	dsb

-	isb

-	bl vTaskSwitchContext

-	mov r0, #0

-	msr basepri, r0

-	ldmia sp!, {r3, r14}

-

-	ldr r1, [r3]

-	ldr r0, [r1]					/* The first item in pxCurrentTCB is the task top of stack. */

-	ldmia r0!, {r4-r11}				/* Pop the registers. */

-	msr psp, r0

-	isb

-	bx r14

-

-

-/*-----------------------------------------------------------*/

-

-vPortSVCHandler:

-	/* Get the location of the current TCB. */

-	ldr	r3, =pxCurrentTCB

-	ldr r1, [r3]

-	ldr r0, [r1]

-	/* Pop the core registers. */

-	ldmia r0!, {r4-r11}

-	msr psp, r0

-	isb

-	mov r0, #0

-	msr	basepri, r0

-	orr r14, r14, #13

-	bx r14

-

-/*-----------------------------------------------------------*/

-

-vPortStartFirstTask

-	/* Use the NVIC offset register to locate the stack. */

-	ldr r0, =0xE000ED08

-	ldr r0, [r0]

-	ldr r0, [r0]

-	/* Set the msp back to the start of the stack. */

-	msr msp, r0

-	/* Call SVC to start the first task, ensuring interrupts are enabled. */

-	cpsie i

-	cpsie f

-	dsb

-	isb

-	svc 0

-

-	END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#include <FreeRTOSConfig.h>
+
+    RSEG    CODE:CODE(2)
+    thumb
+
+    EXTERN pxCurrentTCB
+    EXTERN vTaskSwitchContext
+
+    PUBLIC xPortPendSVHandler
+    PUBLIC vPortSVCHandler
+    PUBLIC vPortStartFirstTask
+
+
+
+/*-----------------------------------------------------------*/
+
+xPortPendSVHandler:
+    mrs r0, psp
+    isb
+    ldr r3, =pxCurrentTCB           /* Get the location of the current TCB. */
+    ldr r2, [r3]
+
+    stmdb r0!, {r4-r11}             /* Save the remaining registers. */
+    str r0, [r2]                    /* Save the new top of stack into the first member of the TCB. */
+
+    stmdb sp!, {r3, r14}
+    mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r0
+    dsb
+    isb
+    bl vTaskSwitchContext
+    mov r0, #0
+    msr basepri, r0
+    ldmia sp!, {r3, r14}
+
+    ldr r1, [r3]
+    ldr r0, [r1]                    /* The first item in pxCurrentTCB is the task top of stack. */
+    ldmia r0!, {r4-r11}             /* Pop the registers. */
+    msr psp, r0
+    isb
+    bx r14
+
+
+/*-----------------------------------------------------------*/
+
+vPortSVCHandler:
+    /* Get the location of the current TCB. */
+    ldr r3, =pxCurrentTCB
+    ldr r1, [r3]
+    ldr r0, [r1]
+    /* Pop the core registers. */
+    ldmia r0!, {r4-r11}
+    msr psp, r0
+    isb
+    mov r0, #0
+    msr basepri, r0
+    orr r14, r14, #13
+    bx r14
+
+/*-----------------------------------------------------------*/
+
+vPortStartFirstTask
+    /* Use the NVIC offset register to locate the stack. */
+    ldr r0, =0xE000ED08
+    ldr r0, [r0]
+    ldr r0, [r0]
+    /* Set the msp back to the start of the stack. */
+    msr msp, r0
+    /* Call SVC to start the first task, ensuring interrupts are enabled. */
+    cpsie i
+    cpsie f
+    dsb
+    isb
+    svc 0
+
+    END
diff --git a/portable/IAR/ARM_CM3/portmacro.h b/portable/IAR/ARM_CM3/portmacro.h
index 23e29e0..3825a7c 100644
--- a/portable/IAR/ARM_CM3/portmacro.h
+++ b/portable/IAR/ARM_CM3/portmacro.h
@@ -1,208 +1,208 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-    #define PORTMACRO_H

-

-    #ifdef __cplusplus

-        extern "C" {

-    #endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* IAR includes. */

-    #include <intrinsics.h>

-

-/* Type definitions. */

-    #define portCHAR          char

-    #define portFLOAT         float

-    #define portDOUBLE        double

-    #define portLONG          long

-    #define portSHORT         short

-    #define portSTACK_TYPE    uint32_t

-    #define portBASE_TYPE     long

-

-    typedef portSTACK_TYPE   StackType_t;

-    typedef long             BaseType_t;

-    typedef unsigned long    UBaseType_t;

-

-    #if ( configUSE_16_BIT_TICKS == 1 )

-        typedef uint16_t     TickType_t;

-        #define portMAX_DELAY              ( TickType_t ) 0xffff

-    #else

-        typedef uint32_t     TickType_t;

-        #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL

-

-/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

- * not need to be guarded with a critical section. */

-        #define portTICK_TYPE_IS_ATOMIC    1

-    #endif

-/*-----------------------------------------------------------*/

-

-/* Architecture specifics. */

-    #define portSTACK_GROWTH      ( -1 )

-    #define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-    #define portBYTE_ALIGNMENT    8

-/*-----------------------------------------------------------*/

-

-/* Compiler directives. */

-    #define portWEAK_SYMBOL    __attribute__( ( weak ) )

-

-/*-----------------------------------------------------------*/

-

-

-/* Scheduler utilities. */

-    #define portYIELD()                                 \

-    {                                                   \

-        /* Set a PendSV to request a context switch. */ \

-        portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \

-        __DSB();                                        \

-        __ISB();                                        \

-    }

-

-    #define portNVIC_INT_CTRL_REG     ( *( ( volatile uint32_t * ) 0xe000ed04 ) )

-    #define portNVIC_PENDSVSET_BIT    ( 1UL << 28UL )

-    #define portEND_SWITCHING_ISR( xSwitchRequired )    do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 )

-    #define portYIELD_FROM_ISR( x )                     portEND_SWITCHING_ISR( x )

-

-/*-----------------------------------------------------------*/

-

-/* Architecture specific optimisations. */

-    #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

-        #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1

-    #endif

-

-    #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )

-

-/* Check the configuration. */

-        #if ( configMAX_PRIORITIES > 32 )

-            #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.

-        #endif

-

-/* Store/clear the ready priorities in a bit map. */

-        #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )    ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

-        #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities )     ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

-

-/*-----------------------------------------------------------*/

-

-        #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )    uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) )

-

-    #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-/*-----------------------------------------------------------*/

-

-/* Critical section management. */

-    extern void vPortEnterCritical( void );

-    extern void vPortExitCritical( void );

-

-    #define portDISABLE_INTERRUPTS()                           \

-    {                                                          \

-        __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \

-        __DSB();                                               \

-        __ISB();                                               \

-    }

-

-    #define portENABLE_INTERRUPTS()                   __set_BASEPRI( 0 )

-    #define portENTER_CRITICAL()                      vPortEnterCritical()

-    #define portEXIT_CRITICAL()                       vPortExitCritical()

-    #define portSET_INTERRUPT_MASK_FROM_ISR()         __get_BASEPRI(); portDISABLE_INTERRUPTS()

-    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    __set_BASEPRI( x )

-/*-----------------------------------------------------------*/

-

-/* Tickless idle/low power functionality. */

-    #ifndef portSUPPRESS_TICKS_AND_SLEEP

-        extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );

-        #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )    vPortSuppressTicksAndSleep( xExpectedIdleTime )

-    #endif

-

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site.  These are

- * not necessary for to use this port.  They are defined so the common demo files

- * (which build with all the ports) will build. */

-    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )

-    #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )

-/*-----------------------------------------------------------*/

-

-    #ifdef configASSERT

-        void vPortValidateInterruptPriority( void );

-        #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()    vPortValidateInterruptPriority()

-    #endif

-

-/* portNOP() is not required by this port. */

-    #define portNOP()

-

-    #define portINLINE              __inline

-

-    #ifndef portFORCE_INLINE

-        #define portFORCE_INLINE    inline __attribute__( ( always_inline ) )

-    #endif

-

-/*-----------------------------------------------------------*/

-

-    portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )

-    {

-        uint32_t ulCurrentInterrupt;

-        BaseType_t xReturn;

-

-        /* Obtain the number of the currently executing interrupt. */

-        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );

-

-        if( ulCurrentInterrupt == 0 )

-        {

-            xReturn = pdFALSE;

-        }

-        else

-        {

-            xReturn = pdTRUE;

-        }

-

-        return xReturn;

-    }

-

-/*-----------------------------------------------------------*/

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

- * the source code because to do so would cause other compilers to generate

- * warnings. */

-    #pragma diag_suppress=Pe191

-    #pragma diag_suppress=Pa082

-

-    #ifdef __cplusplus

-        }

-    #endif

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+    #define PORTMACRO_H
+
+    #ifdef __cplusplus
+        extern "C" {
+    #endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* IAR includes. */
+    #include <intrinsics.h>
+
+/* Type definitions. */
+    #define portCHAR          char
+    #define portFLOAT         float
+    #define portDOUBLE        double
+    #define portLONG          long
+    #define portSHORT         short
+    #define portSTACK_TYPE    uint32_t
+    #define portBASE_TYPE     long
+
+    typedef portSTACK_TYPE   StackType_t;
+    typedef long             BaseType_t;
+    typedef unsigned long    UBaseType_t;
+
+    #if ( configUSE_16_BIT_TICKS == 1 )
+        typedef uint16_t     TickType_t;
+        #define portMAX_DELAY              ( TickType_t ) 0xffff
+    #else
+        typedef uint32_t     TickType_t;
+        #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL
+
+/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+ * not need to be guarded with a critical section. */
+        #define portTICK_TYPE_IS_ATOMIC    1
+    #endif
+/*-----------------------------------------------------------*/
+
+/* Architecture specifics. */
+    #define portSTACK_GROWTH      ( -1 )
+    #define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+    #define portBYTE_ALIGNMENT    8
+/*-----------------------------------------------------------*/
+
+/* Compiler directives. */
+    #define portWEAK_SYMBOL    __attribute__( ( weak ) )
+
+/*-----------------------------------------------------------*/
+
+
+/* Scheduler utilities. */
+    #define portYIELD()                                 \
+    {                                                   \
+        /* Set a PendSV to request a context switch. */ \
+        portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \
+        __DSB();                                        \
+        __ISB();                                        \
+    }
+
+    #define portNVIC_INT_CTRL_REG     ( *( ( volatile uint32_t * ) 0xe000ed04 ) )
+    #define portNVIC_PENDSVSET_BIT    ( 1UL << 28UL )
+    #define portEND_SWITCHING_ISR( xSwitchRequired )    do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 )
+    #define portYIELD_FROM_ISR( x )                     portEND_SWITCHING_ISR( x )
+
+/*-----------------------------------------------------------*/
+
+/* Architecture specific optimisations. */
+    #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
+        #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1
+    #endif
+
+    #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )
+
+/* Check the configuration. */
+        #if ( configMAX_PRIORITIES > 32 )
+            #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.
+        #endif
+
+/* Store/clear the ready priorities in a bit map. */
+        #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )    ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
+        #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities )     ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
+
+/*-----------------------------------------------------------*/
+
+        #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )    uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) )
+
+    #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+/*-----------------------------------------------------------*/
+
+/* Critical section management. */
+    extern void vPortEnterCritical( void );
+    extern void vPortExitCritical( void );
+
+    #define portDISABLE_INTERRUPTS()                           \
+    {                                                          \
+        __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \
+        __DSB();                                               \
+        __ISB();                                               \
+    }
+
+    #define portENABLE_INTERRUPTS()                   __set_BASEPRI( 0 )
+    #define portENTER_CRITICAL()                      vPortEnterCritical()
+    #define portEXIT_CRITICAL()                       vPortExitCritical()
+    #define portSET_INTERRUPT_MASK_FROM_ISR()         __get_BASEPRI(); portDISABLE_INTERRUPTS()
+    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    __set_BASEPRI( x )
+/*-----------------------------------------------------------*/
+
+/* Tickless idle/low power functionality. */
+    #ifndef portSUPPRESS_TICKS_AND_SLEEP
+        extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
+        #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )    vPortSuppressTicksAndSleep( xExpectedIdleTime )
+    #endif
+
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site.  These are
+ * not necessary for to use this port.  They are defined so the common demo files
+ * (which build with all the ports) will build. */
+    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )
+    #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )
+/*-----------------------------------------------------------*/
+
+    #ifdef configASSERT
+        void vPortValidateInterruptPriority( void );
+        #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()    vPortValidateInterruptPriority()
+    #endif
+
+/* portNOP() is not required by this port. */
+    #define portNOP()
+
+    #define portINLINE              __inline
+
+    #ifndef portFORCE_INLINE
+        #define portFORCE_INLINE    inline __attribute__( ( always_inline ) )
+    #endif
+
+/*-----------------------------------------------------------*/
+
+    portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
+    {
+        uint32_t ulCurrentInterrupt;
+        BaseType_t xReturn;
+
+        /* Obtain the number of the currently executing interrupt. */
+        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );
+
+        if( ulCurrentInterrupt == 0 )
+        {
+            xReturn = pdFALSE;
+        }
+        else
+        {
+            xReturn = pdTRUE;
+        }
+
+        return xReturn;
+    }
+
+/*-----------------------------------------------------------*/
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+ * the source code because to do so would cause other compilers to generate
+ * warnings. */
+    #pragma diag_suppress=Pe191
+    #pragma diag_suppress=Pa082
+
+    #ifdef __cplusplus
+        }
+    #endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CM33/non_secure/portasm.h b/portable/IAR/ARM_CM33/non_secure/portasm.h
index b37f6d1..ecd86b9 100644
--- a/portable/IAR/ARM_CM33/non_secure/portasm.h
+++ b/portable/IAR/ARM_CM33/non_secure/portasm.h
@@ -1,114 +1,114 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __PORT_ASM_H__

-#define __PORT_ASM_H__

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-

-/* MPU wrappers includes. */

-#include "mpu_wrappers.h"

-

-/**

- * @brief Restore the context of the first task so that the first task starts

- * executing.

- */

-void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Checks whether or not the processor is privileged.

- *

- * @return 1 if the processor is already privileged, 0 otherwise.

- */

-BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Raises the privilege level by clearing the bit 0 of the CONTROL

- * register.

- *

- * @note This is a privileged function and should only be called from the kenrel

- * code.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Lowers the privilege level by setting the bit 0 of the CONTROL

- * register.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vResetPrivilege( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Starts the first task.

- */

-void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Disables interrupts.

- */

-uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Enables interrupts.

- */

-void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief PendSV Exception handler.

- */

-void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief SVC Handler.

- */

-void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Allocate a Secure context for the calling task.

- *

- * @param[in] ulSecureStackSize The size of the stack to be allocated on the

- * secure side for the calling task.

- */

-void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );

-

-/**

- * @brief Free the task's secure context.

- *

- * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.

- */

-void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-#endif /* __PORT_ASM_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __PORT_ASM_H__
+#define __PORT_ASM_H__
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+
+/* MPU wrappers includes. */
+#include "mpu_wrappers.h"
+
+/**
+ * @brief Restore the context of the first task so that the first task starts
+ * executing.
+ */
+void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Checks whether or not the processor is privileged.
+ *
+ * @return 1 if the processor is already privileged, 0 otherwise.
+ */
+BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Raises the privilege level by clearing the bit 0 of the CONTROL
+ * register.
+ *
+ * @note This is a privileged function and should only be called from the kenrel
+ * code.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Lowers the privilege level by setting the bit 0 of the CONTROL
+ * register.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vResetPrivilege( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Starts the first task.
+ */
+void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Disables interrupts.
+ */
+uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Enables interrupts.
+ */
+void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief PendSV Exception handler.
+ */
+void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief SVC Handler.
+ */
+void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Allocate a Secure context for the calling task.
+ *
+ * @param[in] ulSecureStackSize The size of the stack to be allocated on the
+ * secure side for the calling task.
+ */
+void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );
+
+/**
+ * @brief Free the task's secure context.
+ *
+ * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
+ */
+void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+#endif /* __PORT_ASM_H__ */
diff --git a/portable/IAR/ARM_CM33/non_secure/portasm.s b/portable/IAR/ARM_CM33/non_secure/portasm.s
index 44cd8d0..a193cd7 100644
--- a/portable/IAR/ARM_CM33/non_secure/portasm.s
+++ b/portable/IAR/ARM_CM33/non_secure/portasm.s
@@ -1,353 +1,353 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-/* Including FreeRTOSConfig.h here will cause build errors if the header file

-contains code not understood by the assembler - for example the 'extern' keyword.

-To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so

-the code is included in C files but excluded by the preprocessor in assembly

-files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */

-#include "FreeRTOSConfig.h"

-

-	EXTERN pxCurrentTCB

-	EXTERN xSecureContext

-	EXTERN vTaskSwitchContext

-	EXTERN vPortSVCHandler_C

-	EXTERN SecureContext_SaveContext

-	EXTERN SecureContext_LoadContext

-

-	PUBLIC xIsPrivileged

-	PUBLIC vResetPrivilege

-	PUBLIC vPortAllocateSecureContext

-	PUBLIC vRestoreContextOfFirstTask

-	PUBLIC vRaisePrivilege

-	PUBLIC vStartFirstTask

-	PUBLIC ulSetInterruptMask

-	PUBLIC vClearInterruptMask

-	PUBLIC PendSV_Handler

-	PUBLIC SVC_Handler

-	PUBLIC vPortFreeSecureContext

-/*-----------------------------------------------------------*/

-

-/*---------------- Unprivileged Functions -------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION .text:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-xIsPrivileged:

-	mrs r0, control							/* r0 = CONTROL. */

-	tst r0, #1								/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */

-	ite ne

-	movne r0, #0							/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */

-	moveq r0, #1							/* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-vResetPrivilege:

-	mrs r0, control							/* r0 = CONTROL. */

-	orr r0, r0, #1							/* r0 = r0 | 1. */

-	msr control, r0							/* CONTROL = r0. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-vPortAllocateSecureContext:

-	svc 0									/* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-/*----------------- Privileged Functions --------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION privileged_functions:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-vRestoreContextOfFirstTask:

-	ldr  r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr  r3, [r2]							/* Read pxCurrentTCB. */

-	ldr  r0, [r3]							/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */

-

-#if ( configENABLE_MPU == 1 )

-	dmb										/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	bic r4, r4, #1							/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */

-	str r4, [r2]							/* Disable MPU. */

-

-	adds r3, #4								/* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */

-	ldr  r4, [r3]							/* r4 = *r3 i.e. r4 = MAIR0. */

-	ldr  r2, =0xe000edc0					/* r2 = 0xe000edc0 [Location of MAIR0]. */

-	str  r4, [r2]							/* Program MAIR0. */

-	ldr  r2, =0xe000ed98					/* r2 = 0xe000ed98 [Location of RNR]. */

-	movs r4, #4								/* r4 = 4. */

-	str  r4, [r2]							/* Program RNR = 4. */

-	adds r3, #4								/* r3 = r3 + 4. r3 now points to first RBAR in TCB. */

-	ldr  r2, =0xe000ed9c					/* r2 = 0xe000ed9c [Location of RBAR]. */

-	ldmia r3!, {r4-r11}						/* Read 4 set of RBAR/RLAR registers from TCB. */

-	stmia r2!, {r4-r11}						/* Write 4 set of RBAR/RLAR registers using alias registers. */

-

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	orr r4, r4, #1							/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */

-	str r4, [r2]							/* Enable MPU. */

-	dsb										/* Force memory writes before continuing. */

-#endif /* configENABLE_MPU */

-

-#if ( configENABLE_MPU == 1 )

-	ldm  r0!, {r1-r4}						/* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */

-	ldr  r5, =xSecureContext

-	str  r1, [r5]							/* Set xSecureContext to this task's value for the same. */

-	msr  psplim, r2							/* Set this task's PSPLIM value. */

-	msr  control, r3						/* Set this task's CONTROL value. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	mov  r0, #0

-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */

-	bx   r4									/* Finally, branch to EXC_RETURN. */

-#else /* configENABLE_MPU */

-	ldm  r0!, {r1-r3}						/* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */

-	ldr  r4, =xSecureContext

-	str  r1, [r4]							/* Set xSecureContext to this task's value for the same. */

-	msr  psplim, r2							/* Set this task's PSPLIM value. */

-	movs r1, #2								/* r1 = 2. */

-	msr  CONTROL, r1						/* Switch to use PSP in the thread mode. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	mov  r0, #0

-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */

-	bx   r3									/* Finally, branch to EXC_RETURN. */

-#endif /* configENABLE_MPU */

-/*-----------------------------------------------------------*/

-

-vRaisePrivilege:

-	mrs  r0, control						/* Read the CONTROL register. */

-	bic r0, r0, #1							/* Clear the bit 0. */

-	msr  control, r0						/* Write back the new CONTROL value. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-vStartFirstTask:

-	ldr r0, =0xe000ed08						/* Use the NVIC offset register to locate the stack. */

-	ldr r0, [r0]							/* Read the VTOR register which gives the address of vector table. */

-	ldr r0, [r0]							/* The first entry in vector table is stack pointer. */

-	msr msp, r0								/* Set the MSP back to the start of the stack. */

-	cpsie i									/* Globally enable interrupts. */

-	cpsie f

-	dsb

-	isb

-	svc 2									/* System call to start the first task. portSVC_START_SCHEDULER = 2. */

-/*-----------------------------------------------------------*/

-

-ulSetInterruptMask:

-	mrs r0, basepri							/* r0 = basepri. Return original basepri value. */

-	mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-	msr basepri, r1							/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */

-	dsb

-	isb

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-vClearInterruptMask:

-	msr basepri, r0							/* basepri = ulMask. */

-	dsb

-	isb

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-PendSV_Handler:

-	ldr r3, =xSecureContext					/* Read the location of xSecureContext i.e. &( xSecureContext ). */

-	ldr r0, [r3]							/* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */

-	ldr r3, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r3]							/* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */

-	mrs r2, psp								/* Read PSP in r2. */

-

-	cbz r0, save_ns_context					/* No secure context to save. */

-	push {r0-r2, r14}

-	bl SecureContext_SaveContext			/* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */

-	pop {r0-r3}								/* LR is now in r3. */

-	mov lr, r3								/* LR = r3. */

-	lsls r1, r3, #25						/* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */

-	bpl save_ns_context						/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */

-

-	ldr r3, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r3]							/* Read pxCurrentTCB. */

-#if ( configENABLE_MPU == 1 )

-	subs r2, r2, #16						/* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */

-	str r2, [r1]							/* Save the new top of stack in TCB. */

-	mrs r1, psplim							/* r1 = PSPLIM. */

-	mrs r3, control							/* r3 = CONTROL. */

-	mov r4, lr								/* r4 = LR/EXC_RETURN. */

-	stmia r2!, {r0, r1, r3, r4}				/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */

-#else /* configENABLE_MPU */

-	subs r2, r2, #12						/* Make space for xSecureContext, PSPLIM and LR on the stack. */

-	str r2, [r1]							/* Save the new top of stack in TCB. */

-	mrs r1, psplim							/* r1 = PSPLIM. */

-	mov r3, lr								/* r3 = LR/EXC_RETURN. */

-	stmia r2!, {r0, r1, r3}					/* Store xSecureContext, PSPLIM and LR on the stack. */

-#endif /* configENABLE_MPU */

-	b select_next_task

-

-	save_ns_context:

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-	#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )

-		tst lr, #0x10						/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */

-		it eq

-		vstmdbeq r2!, {s16-s31}				/* Store the additional FP context registers which are not saved automatically. */

-	#endif /* configENABLE_FPU || configENABLE_MVE */

-	#if ( configENABLE_MPU == 1 )

-		subs r2, r2, #48					/* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */

-		str r2, [r1]						/* Save the new top of stack in TCB. */

-		adds r2, r2, #16					/* r2 = r2 + 16. */

-		stm r2, {r4-r11}					/* Store the registers that are not saved automatically. */

-		mrs r1, psplim						/* r1 = PSPLIM. */

-		mrs r3, control						/* r3 = CONTROL. */

-		mov r4, lr							/* r4 = LR/EXC_RETURN. */

-		subs r2, r2, #16					/* r2 = r2 - 16. */

-		stmia r2!, {r0, r1, r3, r4}			/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */

-	#else /* configENABLE_MPU */

-		subs r2, r2, #44					/* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */

-		str r2, [r1]						/* Save the new top of stack in TCB. */

-		adds r2, r2, #12					/* r2 = r2 + 12. */

-		stm r2, {r4-r11}					/* Store the registers that are not saved automatically. */

-		mrs r1, psplim						/* r1 = PSPLIM. */

-		mov r3, lr							/* r3 = LR/EXC_RETURN. */

-		subs r2, r2, #12					/* r2 = r2 - 12. */

-		stmia r2!, {r0, r1, r3}				/* Store xSecureContext, PSPLIM and LR on the stack. */

-	#endif /* configENABLE_MPU */

-

-	select_next_task:

-		mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-		msr basepri, r0						/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */

-		dsb

-		isb

-		bl vTaskSwitchContext

-		mov r0, #0							/* r0 = 0. */

-		msr basepri, r0						/* Enable interrupts. */

-

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-		ldr r2, [r1]						/* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */

-

-	#if ( configENABLE_MPU == 1 )

-		dmb									/* Complete outstanding transfers before disabling MPU. */

-		ldr r3, =0xe000ed94					/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */

-		ldr r4, [r3]						/* Read the value of MPU_CTRL. */

-		bic r4, r4, #1						/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */

-		str r4, [r3]						/* Disable MPU. */

-

-		adds r1, #4							/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */

-		ldr r4, [r1]						/* r4 = *r1 i.e. r4 = MAIR0. */

-		ldr r3, =0xe000edc0					/* r3 = 0xe000edc0 [Location of MAIR0]. */

-		str r4, [r3]						/* Program MAIR0. */

-		ldr r3, =0xe000ed98					/* r3 = 0xe000ed98 [Location of RNR]. */

-		movs r4, #4							/* r4 = 4. */

-		str r4, [r3]						/* Program RNR = 4. */

-		adds r1, #4							/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */

-		ldr  r3, =0xe000ed9c				/* r3 = 0xe000ed9c [Location of RBAR]. */

-		ldmia r1!, {r4-r11}					/* Read 4 sets of RBAR/RLAR registers from TCB. */

-		stmia r3!, {r4-r11}					/* Write 4 set of RBAR/RLAR registers using alias registers. */

-

-		ldr r3, =0xe000ed94					/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */

-		ldr r4, [r3]						/* Read the value of MPU_CTRL. */

-		orr r4, r4, #1						/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */

-		str r4, [r3]						/* Enable MPU. */

-		dsb									/* Force memory writes before continuing. */

-	#endif /* configENABLE_MPU */

-

-	#if ( configENABLE_MPU == 1 )

-		ldmia r2!, {r0, r1, r3, r4}			/* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */

-		msr psplim, r1						/* Restore the PSPLIM register value for the task. */

-		msr control, r3						/* Restore the CONTROL register value for the task. */

-		mov lr, r4							/* LR = r4. */

-		ldr r3, =xSecureContext				/* Read the location of xSecureContext i.e. &( xSecureContext ). */

-		str r0, [r3]						/* Restore the task's xSecureContext. */

-		cbz r0, restore_ns_context			/* If there is no secure context for the task, restore the non-secure context. */

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-		push {r2, r4}

-		bl SecureContext_LoadContext		/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */

-		pop {r2, r4}

-		mov lr, r4							/* LR = r4. */

-		lsls r1, r4, #25					/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */

-		bpl restore_ns_context				/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */

-		msr psp, r2							/* Remember the new top of stack for the task. */

-		bx lr

-	#else /* configENABLE_MPU */

-		ldmia r2!, {r0, r1, r4}				/* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */

-		msr psplim, r1						/* Restore the PSPLIM register value for the task. */

-		mov lr, r4							/* LR = r4. */

-		ldr r3, =xSecureContext				/* Read the location of xSecureContext i.e. &( xSecureContext ). */

-		str r0, [r3]						/* Restore the task's xSecureContext. */

-		cbz r0, restore_ns_context			/* If there is no secure context for the task, restore the non-secure context. */

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-		push {r2, r4}

-		bl SecureContext_LoadContext		/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */

-		pop {r2, r4}

-		mov lr, r4							/* LR = r4. */

-		lsls r1, r4, #25					/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */

-		bpl restore_ns_context				/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */

-		msr psp, r2							/* Remember the new top of stack for the task. */

-		bx lr

-	#endif /* configENABLE_MPU */

-

-	restore_ns_context:

-		ldmia r2!, {r4-r11}					/* Restore the registers that are not automatically restored. */

-	#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )

-		tst lr, #0x10						/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */

-		it eq

-		vldmiaeq r2!, {s16-s31}				/* Restore the additional FP context registers which are not restored automatically. */

-	#endif /* configENABLE_FPU || configENABLE_MVE */

-		msr psp, r2							/* Remember the new top of stack for the task. */

-		bx lr

-/*-----------------------------------------------------------*/

-

-SVC_Handler:

-	tst lr, #4

-	ite eq

-	mrseq r0, msp

-	mrsne r0, psp

-	b vPortSVCHandler_C

-/*-----------------------------------------------------------*/

-

-vPortFreeSecureContext:

-	/* r0 = uint32_t *pulTCB. */

-	ldr r2, [r0]							/* The first item in the TCB is the top of the stack. */

-	ldr r1, [r2]							/* The first item on the stack is the task's xSecureContext. */

-	cmp r1, #0								/* Raise svc if task's xSecureContext is not NULL. */

-	it ne

-	svcne 1									/* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-	END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+/* Including FreeRTOSConfig.h here will cause build errors if the header file
+contains code not understood by the assembler - for example the 'extern' keyword.
+To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
+the code is included in C files but excluded by the preprocessor in assembly
+files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
+#include "FreeRTOSConfig.h"
+
+    EXTERN pxCurrentTCB
+    EXTERN xSecureContext
+    EXTERN vTaskSwitchContext
+    EXTERN vPortSVCHandler_C
+    EXTERN SecureContext_SaveContext
+    EXTERN SecureContext_LoadContext
+
+    PUBLIC xIsPrivileged
+    PUBLIC vResetPrivilege
+    PUBLIC vPortAllocateSecureContext
+    PUBLIC vRestoreContextOfFirstTask
+    PUBLIC vRaisePrivilege
+    PUBLIC vStartFirstTask
+    PUBLIC ulSetInterruptMask
+    PUBLIC vClearInterruptMask
+    PUBLIC PendSV_Handler
+    PUBLIC SVC_Handler
+    PUBLIC vPortFreeSecureContext
+/*-----------------------------------------------------------*/
+
+/*---------------- Unprivileged Functions -------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+xIsPrivileged:
+    mrs r0, control                         /* r0 = CONTROL. */
+    tst r0, #1                              /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
+    ite ne
+    movne r0, #0                            /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
+    moveq r0, #1                            /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+vResetPrivilege:
+    mrs r0, control                         /* r0 = CONTROL. */
+    orr r0, r0, #1                          /* r0 = r0 | 1. */
+    msr control, r0                         /* CONTROL = r0. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+vPortAllocateSecureContext:
+    svc 0                                   /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+/*----------------- Privileged Functions --------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION privileged_functions:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+vRestoreContextOfFirstTask:
+    ldr  r2, =pxCurrentTCB                  /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr  r3, [r2]                           /* Read pxCurrentTCB. */
+    ldr  r0, [r3]                           /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
+
+#if ( configENABLE_MPU == 1 )
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    bic r4, r4, #1                          /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+    str r4, [r2]                            /* Disable MPU. */
+
+    adds r3, #4                             /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
+    ldr  r4, [r3]                           /* r4 = *r3 i.e. r4 = MAIR0. */
+    ldr  r2, =0xe000edc0                    /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str  r4, [r2]                           /* Program MAIR0. */
+    ldr  r2, =0xe000ed98                    /* r2 = 0xe000ed98 [Location of RNR]. */
+    movs r4, #4                             /* r4 = 4. */
+    str  r4, [r2]                           /* Program RNR = 4. */
+    adds r3, #4                             /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
+    ldr  r2, =0xe000ed9c                    /* r2 = 0xe000ed9c [Location of RBAR]. */
+    ldmia r3!, {r4-r11}                     /* Read 4 set of RBAR/RLAR registers from TCB. */
+    stmia r2!, {r4-r11}                     /* Write 4 set of RBAR/RLAR registers using alias registers. */
+
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    orr r4, r4, #1                          /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+    str r4, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
+#endif /* configENABLE_MPU */
+
+#if ( configENABLE_MPU == 1 )
+    ldm  r0!, {r1-r4}                       /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */
+    ldr  r5, =xSecureContext
+    str  r1, [r5]                           /* Set xSecureContext to this task's value for the same. */
+    msr  psplim, r2                         /* Set this task's PSPLIM value. */
+    msr  control, r3                        /* Set this task's CONTROL value. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r4                                 /* Finally, branch to EXC_RETURN. */
+#else /* configENABLE_MPU */
+    ldm  r0!, {r1-r3}                       /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
+    ldr  r4, =xSecureContext
+    str  r1, [r4]                           /* Set xSecureContext to this task's value for the same. */
+    msr  psplim, r2                         /* Set this task's PSPLIM value. */
+    movs r1, #2                             /* r1 = 2. */
+    msr  CONTROL, r1                        /* Switch to use PSP in the thread mode. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r3                                 /* Finally, branch to EXC_RETURN. */
+#endif /* configENABLE_MPU */
+/*-----------------------------------------------------------*/
+
+vRaisePrivilege:
+    mrs  r0, control                        /* Read the CONTROL register. */
+    bic r0, r0, #1                          /* Clear the bit 0. */
+    msr  control, r0                        /* Write back the new CONTROL value. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+vStartFirstTask:
+    ldr r0, =0xe000ed08                     /* Use the NVIC offset register to locate the stack. */
+    ldr r0, [r0]                            /* Read the VTOR register which gives the address of vector table. */
+    ldr r0, [r0]                            /* The first entry in vector table is stack pointer. */
+    msr msp, r0                             /* Set the MSP back to the start of the stack. */
+    cpsie i                                 /* Globally enable interrupts. */
+    cpsie f
+    dsb
+    isb
+    svc 2                                   /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
+/*-----------------------------------------------------------*/
+
+ulSetInterruptMask:
+    mrs r0, basepri                         /* r0 = basepri. Return original basepri value. */
+    mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r1                         /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+vClearInterruptMask:
+    msr basepri, r0                         /* basepri = ulMask. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+PendSV_Handler:
+    ldr r3, =xSecureContext                 /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+    ldr r0, [r3]                            /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */
+    ldr r3, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r3]                            /* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */
+    mrs r2, psp                             /* Read PSP in r2. */
+
+    cbz r0, save_ns_context                 /* No secure context to save. */
+    push {r0-r2, r14}
+    bl SecureContext_SaveContext            /* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+    pop {r0-r3}                             /* LR is now in r3. */
+    mov lr, r3                              /* LR = r3. */
+    lsls r1, r3, #25                        /* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+    bpl save_ns_context                     /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+
+    ldr r3, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r3]                            /* Read pxCurrentTCB. */
+#if ( configENABLE_MPU == 1 )
+    subs r2, r2, #16                        /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+    str r2, [r1]                            /* Save the new top of stack in TCB. */
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mrs r3, control                         /* r3 = CONTROL. */
+    mov r4, lr                              /* r4 = LR/EXC_RETURN. */
+    stmia r2!, {r0, r1, r3, r4}             /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+#else /* configENABLE_MPU */
+    subs r2, r2, #12                        /* Make space for xSecureContext, PSPLIM and LR on the stack. */
+    str r2, [r1]                            /* Save the new top of stack in TCB. */
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmia r2!, {r0, r1, r3}                 /* Store xSecureContext, PSPLIM and LR on the stack. */
+#endif /* configENABLE_MPU */
+    b select_next_task
+
+    save_ns_context:
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+    #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+        tst lr, #0x10                       /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+        it eq
+        vstmdbeq r2!, {s16-s31}             /* Store the additional FP context registers which are not saved automatically. */
+    #endif /* configENABLE_FPU || configENABLE_MVE */
+    #if ( configENABLE_MPU == 1 )
+        subs r2, r2, #48                    /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */
+        str r2, [r1]                        /* Save the new top of stack in TCB. */
+        adds r2, r2, #16                    /* r2 = r2 + 16. */
+        stm r2, {r4-r11}                    /* Store the registers that are not saved automatically. */
+        mrs r1, psplim                      /* r1 = PSPLIM. */
+        mrs r3, control                     /* r3 = CONTROL. */
+        mov r4, lr                          /* r4 = LR/EXC_RETURN. */
+        subs r2, r2, #16                    /* r2 = r2 - 16. */
+        stmia r2!, {r0, r1, r3, r4}         /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+    #else /* configENABLE_MPU */
+        subs r2, r2, #44                    /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */
+        str r2, [r1]                        /* Save the new top of stack in TCB. */
+        adds r2, r2, #12                    /* r2 = r2 + 12. */
+        stm r2, {r4-r11}                    /* Store the registers that are not saved automatically. */
+        mrs r1, psplim                      /* r1 = PSPLIM. */
+        mov r3, lr                          /* r3 = LR/EXC_RETURN. */
+        subs r2, r2, #12                    /* r2 = r2 - 12. */
+        stmia r2!, {r0, r1, r3}             /* Store xSecureContext, PSPLIM and LR on the stack. */
+    #endif /* configENABLE_MPU */
+
+    select_next_task:
+        mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+        msr basepri, r0                     /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+        dsb
+        isb
+        bl vTaskSwitchContext
+        mov r0, #0                          /* r0 = 0. */
+        msr basepri, r0                     /* Enable interrupts. */
+
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        ldr r2, [r1]                        /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
+
+    #if ( configENABLE_MPU == 1 )
+        dmb                                 /* Complete outstanding transfers before disabling MPU. */
+        ldr r3, =0xe000ed94                 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */
+        ldr r4, [r3]                        /* Read the value of MPU_CTRL. */
+        bic r4, r4, #1                      /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+        str r4, [r3]                        /* Disable MPU. */
+
+        adds r1, #4                         /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+        ldr r4, [r1]                        /* r4 = *r1 i.e. r4 = MAIR0. */
+        ldr r3, =0xe000edc0                 /* r3 = 0xe000edc0 [Location of MAIR0]. */
+        str r4, [r3]                        /* Program MAIR0. */
+        ldr r3, =0xe000ed98                 /* r3 = 0xe000ed98 [Location of RNR]. */
+        movs r4, #4                         /* r4 = 4. */
+        str r4, [r3]                        /* Program RNR = 4. */
+        adds r1, #4                         /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+        ldr  r3, =0xe000ed9c                /* r3 = 0xe000ed9c [Location of RBAR]. */
+        ldmia r1!, {r4-r11}                 /* Read 4 sets of RBAR/RLAR registers from TCB. */
+        stmia r3!, {r4-r11}                 /* Write 4 set of RBAR/RLAR registers using alias registers. */
+
+        ldr r3, =0xe000ed94                 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */
+        ldr r4, [r3]                        /* Read the value of MPU_CTRL. */
+        orr r4, r4, #1                      /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+        str r4, [r3]                        /* Enable MPU. */
+        dsb                                 /* Force memory writes before continuing. */
+    #endif /* configENABLE_MPU */
+
+    #if ( configENABLE_MPU == 1 )
+        ldmia r2!, {r0, r1, r3, r4}         /* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */
+        msr psplim, r1                      /* Restore the PSPLIM register value for the task. */
+        msr control, r3                     /* Restore the CONTROL register value for the task. */
+        mov lr, r4                          /* LR = r4. */
+        ldr r3, =xSecureContext             /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+        str r0, [r3]                        /* Restore the task's xSecureContext. */
+        cbz r0, restore_ns_context          /* If there is no secure context for the task, restore the non-secure context. */
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        push {r2, r4}
+        bl SecureContext_LoadContext        /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+        pop {r2, r4}
+        mov lr, r4                          /* LR = r4. */
+        lsls r1, r4, #25                    /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+        bpl restore_ns_context              /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
+    #else /* configENABLE_MPU */
+        ldmia r2!, {r0, r1, r4}             /* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */
+        msr psplim, r1                      /* Restore the PSPLIM register value for the task. */
+        mov lr, r4                          /* LR = r4. */
+        ldr r3, =xSecureContext             /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+        str r0, [r3]                        /* Restore the task's xSecureContext. */
+        cbz r0, restore_ns_context          /* If there is no secure context for the task, restore the non-secure context. */
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        push {r2, r4}
+        bl SecureContext_LoadContext        /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+        pop {r2, r4}
+        mov lr, r4                          /* LR = r4. */
+        lsls r1, r4, #25                    /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+        bpl restore_ns_context              /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
+    #endif /* configENABLE_MPU */
+
+    restore_ns_context:
+        ldmia r2!, {r4-r11}                 /* Restore the registers that are not automatically restored. */
+    #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+        tst lr, #0x10                       /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+        it eq
+        vldmiaeq r2!, {s16-s31}             /* Restore the additional FP context registers which are not restored automatically. */
+    #endif /* configENABLE_FPU || configENABLE_MVE */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
+/*-----------------------------------------------------------*/
+
+SVC_Handler:
+    tst lr, #4
+    ite eq
+    mrseq r0, msp
+    mrsne r0, psp
+    b vPortSVCHandler_C
+/*-----------------------------------------------------------*/
+
+vPortFreeSecureContext:
+    /* r0 = uint32_t *pulTCB. */
+    ldr r2, [r0]                            /* The first item in the TCB is the top of the stack. */
+    ldr r1, [r2]                            /* The first item on the stack is the task's xSecureContext. */
+    cmp r1, #0                              /* Raise svc if task's xSecureContext is not NULL. */
+    it ne
+    svcne 1                                 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/ARM_CM33/non_secure/portmacro.h b/portable/IAR/ARM_CM33/non_secure/portmacro.h
index 5e5b20c..b6df20e 100644
--- a/portable/IAR/ARM_CM33/non_secure/portmacro.h
+++ b/portable/IAR/ARM_CM33/non_secure/portmacro.h
@@ -1,78 +1,78 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#ifdef __cplusplus

-    extern "C" {

-#endif

-

-#include "portmacrocommon.h"

-

-/*------------------------------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the given hardware

- * and compiler.

- *

- * These settings should not be altered.

- *------------------------------------------------------------------------------

- */

-

-/**

- * Architecture specifics.

- */

-#define portARCH_NAME                       "Cortex-M33"

-#define portDONT_DISCARD                    __root

-/*-----------------------------------------------------------*/

-

-#if( configTOTAL_MPU_REGIONS == 16 )

-    #error 16 MPU regions are not yet supported for this port.

-#endif

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Critical section management.

- */

-#define portDISABLE_INTERRUPTS()            ulSetInterruptMask()

-#define portENABLE_INTERRUPTS()             vClearInterruptMask( 0 )

-/*-----------------------------------------------------------*/

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

- * the source code because to do so would cause other compilers to generate

- * warnings. */

-#pragma diag_suppress=Be006

-#pragma diag_suppress=Pa082

-/*-----------------------------------------------------------*/

-

-#ifdef __cplusplus

-    }

-#endif

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#ifdef __cplusplus
+    extern "C" {
+#endif
+
+#include "portmacrocommon.h"
+
+/*------------------------------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the given hardware
+ * and compiler.
+ *
+ * These settings should not be altered.
+ *------------------------------------------------------------------------------
+ */
+
+/**
+ * Architecture specifics.
+ */
+#define portARCH_NAME                       "Cortex-M33"
+#define portDONT_DISCARD                    __root
+/*-----------------------------------------------------------*/
+
+#if( configTOTAL_MPU_REGIONS == 16 )
+    #error 16 MPU regions are not yet supported for this port.
+#endif
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Critical section management.
+ */
+#define portDISABLE_INTERRUPTS()            ulSetInterruptMask()
+#define portENABLE_INTERRUPTS()             vClearInterruptMask( 0 )
+/*-----------------------------------------------------------*/
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+ * the source code because to do so would cause other compilers to generate
+ * warnings. */
+#pragma diag_suppress=Be006
+#pragma diag_suppress=Pa082
+/*-----------------------------------------------------------*/
+
+#ifdef __cplusplus
+    }
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h b/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h
index 4b1f99b..51e21ea 100644
--- a/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h
+++ b/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h
@@ -155,9 +155,9 @@
  * 8-bit values encoded as follows:
  *  Bit[7:4] - 0000 - Device Memory
  *  Bit[3:2] - 00 --> Device-nGnRnE
- *				01 --> Device-nGnRE
- *				10 --> Device-nGRE
- *				11 --> Device-GRE
+ *              01 --> Device-nGnRE
+ *              10 --> Device-nGRE
+ *              11 --> Device-GRE
  *  Bit[1:0] - 00, Reserved.
  */
     #define portMPU_DEVICE_MEMORY_nGnRnE                  ( 0x00 )   /* 0000 0000 */
diff --git a/portable/IAR/ARM_CM33/secure/secure_context.c b/portable/IAR/ARM_CM33/secure/secure_context.c
index b1d5503..0730d57 100644
--- a/portable/IAR/ARM_CM33/secure/secure_context.c
+++ b/portable/IAR/ARM_CM33/secure/secure_context.c
@@ -1,351 +1,351 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Secure context includes. */

-#include "secure_context.h"

-

-/* Secure heap includes. */

-#include "secure_heap.h"

-

-/* Secure port macros. */

-#include "secure_port_macros.h"

-

-/**

- * @brief CONTROL value for privileged tasks.

- *

- * Bit[0] - 0 --> Thread mode is privileged.

- * Bit[1] - 1 --> Thread mode uses PSP.

- */

-#define securecontextCONTROL_VALUE_PRIVILEGED      0x02

-

-/**

- * @brief CONTROL value for un-privileged tasks.

- *

- * Bit[0] - 1 --> Thread mode is un-privileged.

- * Bit[1] - 1 --> Thread mode uses PSP.

- */

-#define securecontextCONTROL_VALUE_UNPRIVILEGED    0x03

-

-/**

- * @brief Size of stack seal values in bytes.

- */

-#define securecontextSTACK_SEAL_SIZE               8

-

-/**

- * @brief Stack seal value as recommended by ARM.

- */

-#define securecontextSTACK_SEAL_VALUE              0xFEF5EDA5

-

-/**

- * @brief Maximum number of secure contexts.

- */

-#ifndef secureconfigMAX_SECURE_CONTEXTS

-    #define secureconfigMAX_SECURE_CONTEXTS        8UL

-#endif

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Pre-allocated array of secure contexts.

- */

-SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ];

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Get a free secure context for a task from the secure context pool (xSecureContexts).

- *

- * This function ensures that only one secure context is allocated for a task.

- *

- * @param[in] pvTaskHandle The task handle for which the secure context is allocated.

- *

- * @return Index of a free secure context in the xSecureContexts array.

- */

-static uint32_t ulGetSecureContext( void * pvTaskHandle );

-

-/**

- * @brief Return the secure context to the secure context pool (xSecureContexts).

- *

- * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array.

- */

-static void vReturnSecureContext( uint32_t ulSecureContextIndex );

-

-/* These are implemented in assembly. */

-extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext );

-extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext );

-/*-----------------------------------------------------------*/

-

-static uint32_t ulGetSecureContext( void * pvTaskHandle )

-{

-    /* Start with invalid index. */

-    uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;

-

-    for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )

-    {

-        if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) &&

-            ( xSecureContexts[ i ].pucStackLimit == NULL ) &&

-            ( xSecureContexts[ i ].pucStackStart == NULL ) &&

-            ( xSecureContexts[ i ].pvTaskHandle == NULL ) &&

-            ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) )

-        {

-            ulSecureContextIndex = i;

-        }

-        else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle )

-        {

-            /* A task can only have one secure context. Do not allocate a second

-             * context for the same task. */

-            ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;

-            break;

-        }

-    }

-

-    return ulSecureContextIndex;

-}

-/*-----------------------------------------------------------*/

-

-static void vReturnSecureContext( uint32_t ulSecureContextIndex )

-{

-    xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL;

-    xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL;

-    xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL;

-    xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL;

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_Init( void )

-{

-    uint32_t ulIPSR, i;

-    static uint32_t ulSecureContextsInitialized = 0;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) )

-    {

-        /* Ensure to initialize secure contexts only once. */

-        ulSecureContextsInitialized = 1;

-

-        /* No stack for thread mode until a task's context is loaded. */

-        secureportSET_PSPLIM( securecontextNO_STACK );

-        secureportSET_PSP( securecontextNO_STACK );

-

-        /* Initialize all secure contexts. */

-        for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )

-        {

-            xSecureContexts[ i ].pucCurrentStackPointer = NULL;

-            xSecureContexts[ i ].pucStackLimit = NULL;

-            xSecureContexts[ i ].pucStackStart = NULL;

-            xSecureContexts[ i ].pvTaskHandle = NULL;

-        }

-

-        #if ( configENABLE_MPU == 1 )

-            {

-                /* Configure thread mode to use PSP and to be unprivileged. */

-                secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED );

-            }

-        #else /* configENABLE_MPU */

-            {

-                /* Configure thread mode to use PSP and to be privileged. */

-                secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED );

-            }

-        #endif /* configENABLE_MPU */

-    }

-}

-/*-----------------------------------------------------------*/

-

-#if ( configENABLE_MPU == 1 )

-    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                                                       uint32_t ulIsTaskPrivileged,

-                                                                                       void * pvTaskHandle )

-#else /* configENABLE_MPU */

-    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                                                       void * pvTaskHandle )

-#endif /* configENABLE_MPU */

-{

-    uint8_t * pucStackMemory = NULL;

-    uint8_t * pucStackLimit;

-    uint32_t ulIPSR, ulSecureContextIndex;

-    SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID;

-

-    #if ( configENABLE_MPU == 1 )

-        uint32_t * pulCurrentStackPointer = NULL;

-    #endif /* configENABLE_MPU */

-

-    /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit

-     * Register (PSPLIM) value. */

-    secureportREAD_IPSR( ulIPSR );

-    secureportREAD_PSPLIM( pucStackLimit );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode.

-     * Also do nothing, if a secure context us already loaded. PSPLIM is set to

-     * securecontextNO_STACK when no secure context is loaded. */

-    if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) )

-    {

-        /* Ontain a free secure context. */

-        ulSecureContextIndex = ulGetSecureContext( pvTaskHandle );

-

-        /* Were we able to get a free context? */

-        if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS )

-        {

-            /* Allocate the stack space. */

-            pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE );

-

-            if( pucStackMemory != NULL )

-            {

-                /* Since stack grows down, the starting point will be the last

-                 * location. Note that this location is next to the last

-                 * allocated byte for stack (excluding the space for seal values)

-                 * because the hardware decrements the stack pointer before

-                 * writing i.e. if stack pointer is 0x2, a push operation will

-                 * decrement the stack pointer to 0x1 and then write at 0x1. */

-                xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize;

-

-                /* Seal the created secure process stack. */

-                *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE;

-                *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE;

-

-                /* The stack cannot go beyond this location. This value is

-                 * programmed in the PSPLIM register on context switch.*/

-                xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory;

-

-                xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle;

-

-                #if ( configENABLE_MPU == 1 )

-                    {

-                        /* Store the correct CONTROL value for the task on the stack.

-                         * This value is programmed in the CONTROL register on

-                         * context switch. */

-                        pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart;

-                        pulCurrentStackPointer--;

-

-                        if( ulIsTaskPrivileged )

-                        {

-                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;

-                        }

-                        else

-                        {

-                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED;

-                        }

-

-                        /* Store the current stack pointer. This value is programmed in

-                         * the PSP register on context switch. */

-                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer;

-                    }

-                #else /* configENABLE_MPU */

-                    {

-                        /* Current SP is set to the starting of the stack. This

-                         * value programmed in the PSP register on context switch. */

-                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart;

-                    }

-                #endif /* configENABLE_MPU */

-

-                /* Ensure to never return 0 as a valid context handle. */

-                xSecureContextHandle = ulSecureContextIndex + 1UL;

-            }

-        }

-    }

-

-    return xSecureContextHandle;

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )

-{

-    uint32_t ulIPSR, ulSecureContextIndex;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ulIPSR != 0 )

-    {

-        /* Only free if a valid context handle is passed. */

-        if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )

-        {

-            ulSecureContextIndex = xSecureContextHandle - 1UL;

-

-            /* Ensure that the secure context being deleted is associated with

-             * the task. */

-            if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle )

-            {

-                /* Free the stack space. */

-                vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit );

-

-                /* Return the secure context back to the free secure contexts pool. */

-                vReturnSecureContext( ulSecureContextIndex );

-            }

-        }

-    }

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )

-{

-    uint8_t * pucStackLimit;

-    uint32_t ulSecureContextIndex;

-

-    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )

-    {

-        ulSecureContextIndex = xSecureContextHandle - 1UL;

-

-        secureportREAD_PSPLIM( pucStackLimit );

-

-        /* Ensure that no secure context is loaded and the task is loading it's

-         * own context. */

-        if( ( pucStackLimit == securecontextNO_STACK ) &&

-            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )

-        {

-            SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );

-        }

-    }

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )

-{

-    uint8_t * pucStackLimit;

-    uint32_t ulSecureContextIndex;

-

-    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )

-    {

-        ulSecureContextIndex = xSecureContextHandle - 1UL;

-

-        secureportREAD_PSPLIM( pucStackLimit );

-

-        /* Ensure that task's context is loaded and the task is saving it's own

-         * context. */

-        if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) &&

-            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )

-        {

-            SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );

-        }

-    }

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Secure context includes. */
+#include "secure_context.h"
+
+/* Secure heap includes. */
+#include "secure_heap.h"
+
+/* Secure port macros. */
+#include "secure_port_macros.h"
+
+/**
+ * @brief CONTROL value for privileged tasks.
+ *
+ * Bit[0] - 0 --> Thread mode is privileged.
+ * Bit[1] - 1 --> Thread mode uses PSP.
+ */
+#define securecontextCONTROL_VALUE_PRIVILEGED      0x02
+
+/**
+ * @brief CONTROL value for un-privileged tasks.
+ *
+ * Bit[0] - 1 --> Thread mode is un-privileged.
+ * Bit[1] - 1 --> Thread mode uses PSP.
+ */
+#define securecontextCONTROL_VALUE_UNPRIVILEGED    0x03
+
+/**
+ * @brief Size of stack seal values in bytes.
+ */
+#define securecontextSTACK_SEAL_SIZE               8
+
+/**
+ * @brief Stack seal value as recommended by ARM.
+ */
+#define securecontextSTACK_SEAL_VALUE              0xFEF5EDA5
+
+/**
+ * @brief Maximum number of secure contexts.
+ */
+#ifndef secureconfigMAX_SECURE_CONTEXTS
+    #define secureconfigMAX_SECURE_CONTEXTS        8UL
+#endif
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Pre-allocated array of secure contexts.
+ */
+SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ];
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Get a free secure context for a task from the secure context pool (xSecureContexts).
+ *
+ * This function ensures that only one secure context is allocated for a task.
+ *
+ * @param[in] pvTaskHandle The task handle for which the secure context is allocated.
+ *
+ * @return Index of a free secure context in the xSecureContexts array.
+ */
+static uint32_t ulGetSecureContext( void * pvTaskHandle );
+
+/**
+ * @brief Return the secure context to the secure context pool (xSecureContexts).
+ *
+ * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array.
+ */
+static void vReturnSecureContext( uint32_t ulSecureContextIndex );
+
+/* These are implemented in assembly. */
+extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext );
+extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext );
+/*-----------------------------------------------------------*/
+
+static uint32_t ulGetSecureContext( void * pvTaskHandle )
+{
+    /* Start with invalid index. */
+    uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;
+
+    for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )
+    {
+        if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) &&
+            ( xSecureContexts[ i ].pucStackLimit == NULL ) &&
+            ( xSecureContexts[ i ].pucStackStart == NULL ) &&
+            ( xSecureContexts[ i ].pvTaskHandle == NULL ) &&
+            ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) )
+        {
+            ulSecureContextIndex = i;
+        }
+        else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle )
+        {
+            /* A task can only have one secure context. Do not allocate a second
+             * context for the same task. */
+            ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;
+            break;
+        }
+    }
+
+    return ulSecureContextIndex;
+}
+/*-----------------------------------------------------------*/
+
+static void vReturnSecureContext( uint32_t ulSecureContextIndex )
+{
+    xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL;
+    xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL;
+    xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL;
+    xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL;
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_Init( void )
+{
+    uint32_t ulIPSR, i;
+    static uint32_t ulSecureContextsInitialized = 0;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) )
+    {
+        /* Ensure to initialize secure contexts only once. */
+        ulSecureContextsInitialized = 1;
+
+        /* No stack for thread mode until a task's context is loaded. */
+        secureportSET_PSPLIM( securecontextNO_STACK );
+        secureportSET_PSP( securecontextNO_STACK );
+
+        /* Initialize all secure contexts. */
+        for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )
+        {
+            xSecureContexts[ i ].pucCurrentStackPointer = NULL;
+            xSecureContexts[ i ].pucStackLimit = NULL;
+            xSecureContexts[ i ].pucStackStart = NULL;
+            xSecureContexts[ i ].pvTaskHandle = NULL;
+        }
+
+        #if ( configENABLE_MPU == 1 )
+            {
+                /* Configure thread mode to use PSP and to be unprivileged. */
+                secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED );
+            }
+        #else /* configENABLE_MPU */
+            {
+                /* Configure thread mode to use PSP and to be privileged. */
+                secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED );
+            }
+        #endif /* configENABLE_MPU */
+    }
+}
+/*-----------------------------------------------------------*/
+
+#if ( configENABLE_MPU == 1 )
+    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                                                       uint32_t ulIsTaskPrivileged,
+                                                                                       void * pvTaskHandle )
+#else /* configENABLE_MPU */
+    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                                                       void * pvTaskHandle )
+#endif /* configENABLE_MPU */
+{
+    uint8_t * pucStackMemory = NULL;
+    uint8_t * pucStackLimit;
+    uint32_t ulIPSR, ulSecureContextIndex;
+    SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID;
+
+    #if ( configENABLE_MPU == 1 )
+        uint32_t * pulCurrentStackPointer = NULL;
+    #endif /* configENABLE_MPU */
+
+    /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit
+     * Register (PSPLIM) value. */
+    secureportREAD_IPSR( ulIPSR );
+    secureportREAD_PSPLIM( pucStackLimit );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode.
+     * Also do nothing, if a secure context us already loaded. PSPLIM is set to
+     * securecontextNO_STACK when no secure context is loaded. */
+    if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) )
+    {
+        /* Ontain a free secure context. */
+        ulSecureContextIndex = ulGetSecureContext( pvTaskHandle );
+
+        /* Were we able to get a free context? */
+        if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS )
+        {
+            /* Allocate the stack space. */
+            pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE );
+
+            if( pucStackMemory != NULL )
+            {
+                /* Since stack grows down, the starting point will be the last
+                 * location. Note that this location is next to the last
+                 * allocated byte for stack (excluding the space for seal values)
+                 * because the hardware decrements the stack pointer before
+                 * writing i.e. if stack pointer is 0x2, a push operation will
+                 * decrement the stack pointer to 0x1 and then write at 0x1. */
+                xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize;
+
+                /* Seal the created secure process stack. */
+                *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE;
+                *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE;
+
+                /* The stack cannot go beyond this location. This value is
+                 * programmed in the PSPLIM register on context switch.*/
+                xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory;
+
+                xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle;
+
+                #if ( configENABLE_MPU == 1 )
+                    {
+                        /* Store the correct CONTROL value for the task on the stack.
+                         * This value is programmed in the CONTROL register on
+                         * context switch. */
+                        pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart;
+                        pulCurrentStackPointer--;
+
+                        if( ulIsTaskPrivileged )
+                        {
+                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;
+                        }
+                        else
+                        {
+                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED;
+                        }
+
+                        /* Store the current stack pointer. This value is programmed in
+                         * the PSP register on context switch. */
+                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer;
+                    }
+                #else /* configENABLE_MPU */
+                    {
+                        /* Current SP is set to the starting of the stack. This
+                         * value programmed in the PSP register on context switch. */
+                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart;
+                    }
+                #endif /* configENABLE_MPU */
+
+                /* Ensure to never return 0 as a valid context handle. */
+                xSecureContextHandle = ulSecureContextIndex + 1UL;
+            }
+        }
+    }
+
+    return xSecureContextHandle;
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )
+{
+    uint32_t ulIPSR, ulSecureContextIndex;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ulIPSR != 0 )
+    {
+        /* Only free if a valid context handle is passed. */
+        if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )
+        {
+            ulSecureContextIndex = xSecureContextHandle - 1UL;
+
+            /* Ensure that the secure context being deleted is associated with
+             * the task. */
+            if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle )
+            {
+                /* Free the stack space. */
+                vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit );
+
+                /* Return the secure context back to the free secure contexts pool. */
+                vReturnSecureContext( ulSecureContextIndex );
+            }
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )
+{
+    uint8_t * pucStackLimit;
+    uint32_t ulSecureContextIndex;
+
+    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )
+    {
+        ulSecureContextIndex = xSecureContextHandle - 1UL;
+
+        secureportREAD_PSPLIM( pucStackLimit );
+
+        /* Ensure that no secure context is loaded and the task is loading it's
+         * own context. */
+        if( ( pucStackLimit == securecontextNO_STACK ) &&
+            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )
+        {
+            SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )
+{
+    uint8_t * pucStackLimit;
+    uint32_t ulSecureContextIndex;
+
+    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )
+    {
+        ulSecureContextIndex = xSecureContextHandle - 1UL;
+
+        secureportREAD_PSPLIM( pucStackLimit );
+
+        /* Ensure that task's context is loaded and the task is saving it's own
+         * context. */
+        if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) &&
+            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )
+        {
+            SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );
+        }
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CM33/secure/secure_context.h b/portable/IAR/ARM_CM33/secure/secure_context.h
index 57e390c..d0adbaf 100644
--- a/portable/IAR/ARM_CM33/secure/secure_context.h
+++ b/portable/IAR/ARM_CM33/secure/secure_context.h
@@ -1,135 +1,135 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_CONTEXT_H__

-#define __SECURE_CONTEXT_H__

-

-/* Standard includes. */

-#include <stdint.h>

-

-/* FreeRTOS includes. */

-#include "FreeRTOSConfig.h"

-

-/**

- * @brief PSP value when no secure context is loaded.

- */

-#define securecontextNO_STACK               0x0

-

-/**

- * @brief Invalid context ID.

- */

-#define securecontextINVALID_CONTEXT_ID     0UL

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Structure to represent a secure context.

- *

- * @note Since stack grows down, pucStackStart is the highest address while

- * pucStackLimit is the first address of the allocated memory.

- */

-typedef struct SecureContext

-{

-    uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */

-    uint8_t * pucStackLimit;          /**< Last location of the stack memory (PSPLIM). */

-    uint8_t * pucStackStart;          /**< First location of the stack memory. */

-    void * pvTaskHandle;              /**< Task handle of the task this context is associated with. */

-} SecureContext_t;

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Opaque handle for a secure context.

- */

-typedef uint32_t SecureContextHandle_t;

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Initializes the secure context management system.

- *

- * PSP is set to NULL and therefore a task must allocate and load a context

- * before calling any secure side function in the thread mode.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- */

-void SecureContext_Init( void );

-

-/**

- * @brief Allocates a context on the secure side.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] ulSecureStackSize Size of the stack to allocate on secure side.

- * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise.

- *

- * @return Opaque context handle if context is successfully allocated, NULL

- * otherwise.

- */

-#if ( configENABLE_MPU == 1 )

-    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                         uint32_t ulIsTaskPrivileged,

-                                                         void * pvTaskHandle );

-#else /* configENABLE_MPU */

-    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                         void * pvTaskHandle );

-#endif /* configENABLE_MPU */

-

-/**

- * @brief Frees the given context.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] xSecureContextHandle Context handle corresponding to the

- * context to be freed.

- */

-void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );

-

-/**

- * @brief Loads the given context.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] xSecureContextHandle Context handle corresponding to the context

- * to be loaded.

- */

-void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );

-

-/**

- * @brief Saves the given context.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] xSecureContextHandle Context handle corresponding to the context

- * to be saved.

- */

-void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );

-

-#endif /* __SECURE_CONTEXT_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_CONTEXT_H__
+#define __SECURE_CONTEXT_H__
+
+/* Standard includes. */
+#include <stdint.h>
+
+/* FreeRTOS includes. */
+#include "FreeRTOSConfig.h"
+
+/**
+ * @brief PSP value when no secure context is loaded.
+ */
+#define securecontextNO_STACK               0x0
+
+/**
+ * @brief Invalid context ID.
+ */
+#define securecontextINVALID_CONTEXT_ID     0UL
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Structure to represent a secure context.
+ *
+ * @note Since stack grows down, pucStackStart is the highest address while
+ * pucStackLimit is the first address of the allocated memory.
+ */
+typedef struct SecureContext
+{
+    uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */
+    uint8_t * pucStackLimit;          /**< Last location of the stack memory (PSPLIM). */
+    uint8_t * pucStackStart;          /**< First location of the stack memory. */
+    void * pvTaskHandle;              /**< Task handle of the task this context is associated with. */
+} SecureContext_t;
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Opaque handle for a secure context.
+ */
+typedef uint32_t SecureContextHandle_t;
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Initializes the secure context management system.
+ *
+ * PSP is set to NULL and therefore a task must allocate and load a context
+ * before calling any secure side function in the thread mode.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ */
+void SecureContext_Init( void );
+
+/**
+ * @brief Allocates a context on the secure side.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] ulSecureStackSize Size of the stack to allocate on secure side.
+ * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise.
+ *
+ * @return Opaque context handle if context is successfully allocated, NULL
+ * otherwise.
+ */
+#if ( configENABLE_MPU == 1 )
+    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                         uint32_t ulIsTaskPrivileged,
+                                                         void * pvTaskHandle );
+#else /* configENABLE_MPU */
+    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                         void * pvTaskHandle );
+#endif /* configENABLE_MPU */
+
+/**
+ * @brief Frees the given context.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] xSecureContextHandle Context handle corresponding to the
+ * context to be freed.
+ */
+void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );
+
+/**
+ * @brief Loads the given context.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] xSecureContextHandle Context handle corresponding to the context
+ * to be loaded.
+ */
+void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );
+
+/**
+ * @brief Saves the given context.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] xSecureContextHandle Context handle corresponding to the context
+ * to be saved.
+ */
+void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );
+
+#endif /* __SECURE_CONTEXT_H__ */
diff --git a/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s b/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s
index 99240ca..400bd01 100644
--- a/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s
+++ b/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s
@@ -1,86 +1,86 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-    SECTION .text:CODE:NOROOT(2)

-    THUMB

-

-/* Including FreeRTOSConfig.h here will cause build errors if the header file

-contains code not understood by the assembler - for example the 'extern' keyword.

-To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so

-the code is included in C files but excluded by the preprocessor in assembly

-files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */

-#include "FreeRTOSConfig.h"

-

-    PUBLIC SecureContext_LoadContextAsm

-    PUBLIC SecureContext_SaveContextAsm

-/*-----------------------------------------------------------*/

-

-SecureContext_LoadContextAsm:

-    /* pxSecureContext value is in r0. */

-    mrs r1, ipsr                        /* r1 = IPSR. */

-    cbz r1, load_ctx_therad_mode        /* Do nothing if the processor is running in the Thread Mode. */

-    ldmia r0!, {r1, r2}                 /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */

-

-#if ( configENABLE_MPU == 1 )

-    ldmia r1!, {r3}                     /* Read CONTROL register value from task's stack. r3 = CONTROL. */

-    msr control, r3                     /* CONTROL = r3. */

-#endif /* configENABLE_MPU */

-

-    msr psplim, r2                      /* PSPLIM = r2. */

-    msr psp, r1                         /* PSP = r1. */

-

-    load_ctx_therad_mode:

-        bx lr

-/*-----------------------------------------------------------*/

-

-SecureContext_SaveContextAsm:

-    /* pxSecureContext value is in r0. */

-    mrs r1, ipsr                        /* r1 = IPSR. */

-    cbz r1, save_ctx_therad_mode        /* Do nothing if the processor is running in the Thread Mode. */

-    mrs r1, psp                         /* r1 = PSP. */

-

-#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )

-    vstmdb r1!, {s0}                    /* Trigger the deferred stacking of FPU registers. */

-    vldmia r1!, {s0}                    /* Nullify the effect of the previous statement. */

-#endif /* configENABLE_FPU || configENABLE_MVE */

-

-#if ( configENABLE_MPU == 1 )

-    mrs r2, control                     /* r2 = CONTROL. */

-    stmdb r1!, {r2}                     /* Store CONTROL value on the stack. */

-#endif /* configENABLE_MPU */

-

-    str r1, [r0]                        /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */

-    movs r1, #0                         /* r1 = securecontextNO_STACK. */

-    msr psplim, r1                      /* PSPLIM = securecontextNO_STACK. */

-    msr psp, r1                         /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */

-

-    save_ctx_therad_mode:

-        bx lr

-/*-----------------------------------------------------------*/

-

-    END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
+
+/* Including FreeRTOSConfig.h here will cause build errors if the header file
+contains code not understood by the assembler - for example the 'extern' keyword.
+To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
+the code is included in C files but excluded by the preprocessor in assembly
+files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
+#include "FreeRTOSConfig.h"
+
+    PUBLIC SecureContext_LoadContextAsm
+    PUBLIC SecureContext_SaveContextAsm
+/*-----------------------------------------------------------*/
+
+SecureContext_LoadContextAsm:
+    /* pxSecureContext value is in r0. */
+    mrs r1, ipsr                        /* r1 = IPSR. */
+    cbz r1, load_ctx_therad_mode        /* Do nothing if the processor is running in the Thread Mode. */
+    ldmia r0!, {r1, r2}                 /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */
+
+#if ( configENABLE_MPU == 1 )
+    ldmia r1!, {r3}                     /* Read CONTROL register value from task's stack. r3 = CONTROL. */
+    msr control, r3                     /* CONTROL = r3. */
+#endif /* configENABLE_MPU */
+
+    msr psplim, r2                      /* PSPLIM = r2. */
+    msr psp, r1                         /* PSP = r1. */
+
+    load_ctx_therad_mode:
+        bx lr
+/*-----------------------------------------------------------*/
+
+SecureContext_SaveContextAsm:
+    /* pxSecureContext value is in r0. */
+    mrs r1, ipsr                        /* r1 = IPSR. */
+    cbz r1, save_ctx_therad_mode        /* Do nothing if the processor is running in the Thread Mode. */
+    mrs r1, psp                         /* r1 = PSP. */
+
+#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+    vstmdb r1!, {s0}                    /* Trigger the deferred stacking of FPU registers. */
+    vldmia r1!, {s0}                    /* Nullify the effect of the previous statement. */
+#endif /* configENABLE_FPU || configENABLE_MVE */
+
+#if ( configENABLE_MPU == 1 )
+    mrs r2, control                     /* r2 = CONTROL. */
+    stmdb r1!, {r2}                     /* Store CONTROL value on the stack. */
+#endif /* configENABLE_MPU */
+
+    str r1, [r0]                        /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */
+    movs r1, #0                         /* r1 = securecontextNO_STACK. */
+    msr psplim, r1                      /* PSPLIM = securecontextNO_STACK. */
+    msr psp, r1                         /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */
+
+    save_ctx_therad_mode:
+        bx lr
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/ARM_CM33/secure/secure_heap.c b/portable/IAR/ARM_CM33/secure/secure_heap.c
index 741b463..157fdbf 100644
--- a/portable/IAR/ARM_CM33/secure/secure_heap.c
+++ b/portable/IAR/ARM_CM33/secure/secure_heap.c
@@ -1,454 +1,454 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Standard includes. */

-#include <stdint.h>

-

-/* Secure context heap includes. */

-#include "secure_heap.h"

-

-/* Secure port macros. */

-#include "secure_port_macros.h"

-

-/**

- * @brief Total heap size.

- */

-#ifndef secureconfigTOTAL_HEAP_SIZE

-    #define secureconfigTOTAL_HEAP_SIZE    ( ( ( size_t ) ( 10 * 1024 ) ) )

-#endif

-

-/* No test marker by default. */

-#ifndef mtCOVERAGE_TEST_MARKER

-    #define mtCOVERAGE_TEST_MARKER()

-#endif

-

-/* No tracing by default. */

-#ifndef traceMALLOC

-    #define traceMALLOC( pvReturn, xWantedSize )

-#endif

-

-/* No tracing by default. */

-#ifndef traceFREE

-    #define traceFREE( pv, xBlockSize )

-#endif

-

-/* Block sizes must not get too small. */

-#define secureheapMINIMUM_BLOCK_SIZE    ( ( size_t ) ( xHeapStructSize << 1 ) )

-

-/* Assumes 8bit bytes! */

-#define secureheapBITS_PER_BYTE         ( ( size_t ) 8 )

-/*-----------------------------------------------------------*/

-

-/* Allocate the memory for the heap. */

-#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )

-

-/* The application writer has already defined the array used for the RTOS

-* heap - probably so it can be placed in a special segment or address. */

-    extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];

-#else /* configAPPLICATION_ALLOCATED_HEAP */

-    static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];

-#endif /* configAPPLICATION_ALLOCATED_HEAP */

-

-/**

- * @brief The linked list structure.

- *

- * This is used to link free blocks in order of their memory address.

- */

-typedef struct A_BLOCK_LINK

-{

-    struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */

-    size_t xBlockSize;                     /**< The size of the free block. */

-} BlockLink_t;

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Called automatically to setup the required heap structures the first

- * time pvPortMalloc() is called.

- */

-static void prvHeapInit( void );

-

-/**

- * @brief Inserts a block of memory that is being freed into the correct

- * position in the list of free memory blocks.

- *

- * The block being freed will be merged with the block in front it and/or the

- * block behind it if the memory blocks are adjacent to each other.

- *

- * @param[in] pxBlockToInsert The block being freed.

- */

-static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert );

-/*-----------------------------------------------------------*/

-

-/**

- * @brief The size of the structure placed at the beginning of each allocated

- * memory block must by correctly byte aligned.

- */

-static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );

-

-/**

- * @brief Create a couple of list links to mark the start and end of the list.

- */

-static BlockLink_t xStart;

-static BlockLink_t * pxEnd = NULL;

-

-/**

- * @brief Keeps track of the number of free bytes remaining, but says nothing

- * about fragmentation.

- */

-static size_t xFreeBytesRemaining = 0U;

-static size_t xMinimumEverFreeBytesRemaining = 0U;

-

-/**

- * @brief Gets set to the top bit of an size_t type.

- *

- * When this bit in the xBlockSize member of an BlockLink_t structure is set

- * then the block belongs to the application. When the bit is free the block is

- * still part of the free heap space.

- */

-static size_t xBlockAllocatedBit = 0;

-/*-----------------------------------------------------------*/

-

-static void prvHeapInit( void )

-{

-    BlockLink_t * pxFirstFreeBlock;

-    uint8_t * pucAlignedHeap;

-    size_t uxAddress;

-    size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE;

-

-    /* Ensure the heap starts on a correctly aligned boundary. */

-    uxAddress = ( size_t ) ucHeap;

-

-    if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 )

-    {

-        uxAddress += ( secureportBYTE_ALIGNMENT - 1 );

-        uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );

-        xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;

-    }

-

-    pucAlignedHeap = ( uint8_t * ) uxAddress;

-

-    /* xStart is used to hold a pointer to the first item in the list of free

-     * blocks.  The void cast is used to prevent compiler warnings. */

-    xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;

-    xStart.xBlockSize = ( size_t ) 0;

-

-    /* pxEnd is used to mark the end of the list of free blocks and is inserted

-     * at the end of the heap space. */

-    uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;

-    uxAddress -= xHeapStructSize;

-    uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );

-    pxEnd = ( void * ) uxAddress;

-    pxEnd->xBlockSize = 0;

-    pxEnd->pxNextFreeBlock = NULL;

-

-    /* To start with there is a single free block that is sized to take up the

-     * entire heap space, minus the space taken by pxEnd. */

-    pxFirstFreeBlock = ( void * ) pucAlignedHeap;

-    pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;

-    pxFirstFreeBlock->pxNextFreeBlock = pxEnd;

-

-    /* Only one block exists - and it covers the entire usable heap space. */

-    xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;

-    xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;

-

-    /* Work out the position of the top bit in a size_t variable. */

-    xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 );

-}

-/*-----------------------------------------------------------*/

-

-static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert )

-{

-    BlockLink_t * pxIterator;

-    uint8_t * puc;

-

-    /* Iterate through the list until a block is found that has a higher address

-     * than the block being inserted. */

-    for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )

-    {

-        /* Nothing to do here, just iterate to the right position. */

-    }

-

-    /* Do the block being inserted, and the block it is being inserted after

-     * make a contiguous block of memory? */

-    puc = ( uint8_t * ) pxIterator;

-

-    if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )

-    {

-        pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;

-        pxBlockToInsert = pxIterator;

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-

-    /* Do the block being inserted, and the block it is being inserted before

-     * make a contiguous block of memory? */

-    puc = ( uint8_t * ) pxBlockToInsert;

-

-    if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )

-    {

-        if( pxIterator->pxNextFreeBlock != pxEnd )

-        {

-            /* Form one big block from the two blocks. */

-            pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;

-            pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;

-        }

-        else

-        {

-            pxBlockToInsert->pxNextFreeBlock = pxEnd;

-        }

-    }

-    else

-    {

-        pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;

-    }

-

-    /* If the block being inserted plugged a gab, so was merged with the block

-     * before and the block after, then it's pxNextFreeBlock pointer will have

-     * already been set, and should not be set here as that would make it point

-     * to itself. */

-    if( pxIterator != pxBlockToInsert )

-    {

-        pxIterator->pxNextFreeBlock = pxBlockToInsert;

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-}

-/*-----------------------------------------------------------*/

-

-void * pvPortMalloc( size_t xWantedSize )

-{

-    BlockLink_t * pxBlock;

-    BlockLink_t * pxPreviousBlock;

-    BlockLink_t * pxNewBlockLink;

-    void * pvReturn = NULL;

-

-    /* If this is the first call to malloc then the heap will require

-     * initialisation to setup the list of free blocks. */

-    if( pxEnd == NULL )

-    {

-        prvHeapInit();

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-

-    /* Check the requested block size is not so large that the top bit is set.

-     * The top bit of the block size member of the BlockLink_t structure is used

-     * to determine who owns the block - the application or the kernel, so it

-     * must be free. */

-    if( ( xWantedSize & xBlockAllocatedBit ) == 0 )

-    {

-        /* The wanted size is increased so it can contain a BlockLink_t

-         * structure in addition to the requested amount of bytes. */

-        if( xWantedSize > 0 )

-        {

-            xWantedSize += xHeapStructSize;

-

-            /* Ensure that blocks are always aligned to the required number of

-             * bytes. */

-            if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 )

-            {

-                /* Byte alignment required. */

-                xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) );

-                secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 );

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-        else

-        {

-            mtCOVERAGE_TEST_MARKER();

-        }

-

-        if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )

-        {

-            /* Traverse the list from the start (lowest address) block until

-             * one of adequate size is found. */

-            pxPreviousBlock = &xStart;

-            pxBlock = xStart.pxNextFreeBlock;

-

-            while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )

-            {

-                pxPreviousBlock = pxBlock;

-                pxBlock = pxBlock->pxNextFreeBlock;

-            }

-

-            /* If the end marker was reached then a block of adequate size was

-             * not found. */

-            if( pxBlock != pxEnd )

-            {

-                /* Return the memory space pointed to - jumping over the

-                 * BlockLink_t structure at its start. */

-                pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );

-

-                /* This block is being returned for use so must be taken out

-                 * of the list of free blocks. */

-                pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;

-

-                /* If the block is larger than required it can be split into

-                 * two. */

-                if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE )

-                {

-                    /* This block is to be split into two.  Create a new

-                     * block following the number of bytes requested. The void

-                     * cast is used to prevent byte alignment warnings from the

-                     * compiler. */

-                    pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );

-                    secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 );

-

-                    /* Calculate the sizes of two blocks split from the single

-                     * block. */

-                    pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;

-                    pxBlock->xBlockSize = xWantedSize;

-

-                    /* Insert the new block into the list of free blocks. */

-                    prvInsertBlockIntoFreeList( pxNewBlockLink );

-                }

-                else

-                {

-                    mtCOVERAGE_TEST_MARKER();

-                }

-

-                xFreeBytesRemaining -= pxBlock->xBlockSize;

-

-                if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )

-                {

-                    xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;

-                }

-                else

-                {

-                    mtCOVERAGE_TEST_MARKER();

-                }

-

-                /* The block is being returned - it is allocated and owned by

-                 * the application and has no "next" block. */

-                pxBlock->xBlockSize |= xBlockAllocatedBit;

-                pxBlock->pxNextFreeBlock = NULL;

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-        else

-        {

-            mtCOVERAGE_TEST_MARKER();

-        }

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-

-    traceMALLOC( pvReturn, xWantedSize );

-

-    #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 )

-        {

-            if( pvReturn == NULL )

-            {

-                extern void vApplicationMallocFailedHook( void );

-                vApplicationMallocFailedHook();

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-    #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */

-

-    secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );

-    return pvReturn;

-}

-/*-----------------------------------------------------------*/

-

-void vPortFree( void * pv )

-{

-    uint8_t * puc = ( uint8_t * ) pv;

-    BlockLink_t * pxLink;

-

-    if( pv != NULL )

-    {

-        /* The memory being freed will have an BlockLink_t structure immediately

-         * before it. */

-        puc -= xHeapStructSize;

-

-        /* This casting is to keep the compiler from issuing warnings. */

-        pxLink = ( void * ) puc;

-

-        /* Check the block is actually allocated. */

-        secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );

-        secureportASSERT( pxLink->pxNextFreeBlock == NULL );

-

-        if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )

-        {

-            if( pxLink->pxNextFreeBlock == NULL )

-            {

-                /* The block is being returned to the heap - it is no longer

-                 * allocated. */

-                pxLink->xBlockSize &= ~xBlockAllocatedBit;

-

-                secureportDISABLE_NON_SECURE_INTERRUPTS();

-                {

-                    /* Add this block to the list of free blocks. */

-                    xFreeBytesRemaining += pxLink->xBlockSize;

-                    traceFREE( pv, pxLink->xBlockSize );

-                    prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );

-                }

-                secureportENABLE_NON_SECURE_INTERRUPTS();

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-        else

-        {

-            mtCOVERAGE_TEST_MARKER();

-        }

-    }

-}

-/*-----------------------------------------------------------*/

-

-size_t xPortGetFreeHeapSize( void )

-{

-    return xFreeBytesRemaining;

-}

-/*-----------------------------------------------------------*/

-

-size_t xPortGetMinimumEverFreeHeapSize( void )

-{

-    return xMinimumEverFreeBytesRemaining;

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Standard includes. */
+#include <stdint.h>
+
+/* Secure context heap includes. */
+#include "secure_heap.h"
+
+/* Secure port macros. */
+#include "secure_port_macros.h"
+
+/**
+ * @brief Total heap size.
+ */
+#ifndef secureconfigTOTAL_HEAP_SIZE
+    #define secureconfigTOTAL_HEAP_SIZE    ( ( ( size_t ) ( 10 * 1024 ) ) )
+#endif
+
+/* No test marker by default. */
+#ifndef mtCOVERAGE_TEST_MARKER
+    #define mtCOVERAGE_TEST_MARKER()
+#endif
+
+/* No tracing by default. */
+#ifndef traceMALLOC
+    #define traceMALLOC( pvReturn, xWantedSize )
+#endif
+
+/* No tracing by default. */
+#ifndef traceFREE
+    #define traceFREE( pv, xBlockSize )
+#endif
+
+/* Block sizes must not get too small. */
+#define secureheapMINIMUM_BLOCK_SIZE    ( ( size_t ) ( xHeapStructSize << 1 ) )
+
+/* Assumes 8bit bytes! */
+#define secureheapBITS_PER_BYTE         ( ( size_t ) 8 )
+/*-----------------------------------------------------------*/
+
+/* Allocate the memory for the heap. */
+#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )
+
+/* The application writer has already defined the array used for the RTOS
+* heap - probably so it can be placed in a special segment or address. */
+    extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
+#else /* configAPPLICATION_ALLOCATED_HEAP */
+    static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
+#endif /* configAPPLICATION_ALLOCATED_HEAP */
+
+/**
+ * @brief The linked list structure.
+ *
+ * This is used to link free blocks in order of their memory address.
+ */
+typedef struct A_BLOCK_LINK
+{
+    struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */
+    size_t xBlockSize;                     /**< The size of the free block. */
+} BlockLink_t;
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Called automatically to setup the required heap structures the first
+ * time pvPortMalloc() is called.
+ */
+static void prvHeapInit( void );
+
+/**
+ * @brief Inserts a block of memory that is being freed into the correct
+ * position in the list of free memory blocks.
+ *
+ * The block being freed will be merged with the block in front it and/or the
+ * block behind it if the memory blocks are adjacent to each other.
+ *
+ * @param[in] pxBlockToInsert The block being freed.
+ */
+static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert );
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief The size of the structure placed at the beginning of each allocated
+ * memory block must by correctly byte aligned.
+ */
+static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
+
+/**
+ * @brief Create a couple of list links to mark the start and end of the list.
+ */
+static BlockLink_t xStart;
+static BlockLink_t * pxEnd = NULL;
+
+/**
+ * @brief Keeps track of the number of free bytes remaining, but says nothing
+ * about fragmentation.
+ */
+static size_t xFreeBytesRemaining = 0U;
+static size_t xMinimumEverFreeBytesRemaining = 0U;
+
+/**
+ * @brief Gets set to the top bit of an size_t type.
+ *
+ * When this bit in the xBlockSize member of an BlockLink_t structure is set
+ * then the block belongs to the application. When the bit is free the block is
+ * still part of the free heap space.
+ */
+static size_t xBlockAllocatedBit = 0;
+/*-----------------------------------------------------------*/
+
+static void prvHeapInit( void )
+{
+    BlockLink_t * pxFirstFreeBlock;
+    uint8_t * pucAlignedHeap;
+    size_t uxAddress;
+    size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE;
+
+    /* Ensure the heap starts on a correctly aligned boundary. */
+    uxAddress = ( size_t ) ucHeap;
+
+    if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 )
+    {
+        uxAddress += ( secureportBYTE_ALIGNMENT - 1 );
+        uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
+        xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;
+    }
+
+    pucAlignedHeap = ( uint8_t * ) uxAddress;
+
+    /* xStart is used to hold a pointer to the first item in the list of free
+     * blocks.  The void cast is used to prevent compiler warnings. */
+    xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
+    xStart.xBlockSize = ( size_t ) 0;
+
+    /* pxEnd is used to mark the end of the list of free blocks and is inserted
+     * at the end of the heap space. */
+    uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;
+    uxAddress -= xHeapStructSize;
+    uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
+    pxEnd = ( void * ) uxAddress;
+    pxEnd->xBlockSize = 0;
+    pxEnd->pxNextFreeBlock = NULL;
+
+    /* To start with there is a single free block that is sized to take up the
+     * entire heap space, minus the space taken by pxEnd. */
+    pxFirstFreeBlock = ( void * ) pucAlignedHeap;
+    pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;
+    pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
+
+    /* Only one block exists - and it covers the entire usable heap space. */
+    xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
+    xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
+
+    /* Work out the position of the top bit in a size_t variable. */
+    xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 );
+}
+/*-----------------------------------------------------------*/
+
+static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert )
+{
+    BlockLink_t * pxIterator;
+    uint8_t * puc;
+
+    /* Iterate through the list until a block is found that has a higher address
+     * than the block being inserted. */
+    for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
+    {
+        /* Nothing to do here, just iterate to the right position. */
+    }
+
+    /* Do the block being inserted, and the block it is being inserted after
+     * make a contiguous block of memory? */
+    puc = ( uint8_t * ) pxIterator;
+
+    if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
+    {
+        pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
+        pxBlockToInsert = pxIterator;
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+
+    /* Do the block being inserted, and the block it is being inserted before
+     * make a contiguous block of memory? */
+    puc = ( uint8_t * ) pxBlockToInsert;
+
+    if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
+    {
+        if( pxIterator->pxNextFreeBlock != pxEnd )
+        {
+            /* Form one big block from the two blocks. */
+            pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
+            pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
+        }
+        else
+        {
+            pxBlockToInsert->pxNextFreeBlock = pxEnd;
+        }
+    }
+    else
+    {
+        pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
+    }
+
+    /* If the block being inserted plugged a gab, so was merged with the block
+     * before and the block after, then it's pxNextFreeBlock pointer will have
+     * already been set, and should not be set here as that would make it point
+     * to itself. */
+    if( pxIterator != pxBlockToInsert )
+    {
+        pxIterator->pxNextFreeBlock = pxBlockToInsert;
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+}
+/*-----------------------------------------------------------*/
+
+void * pvPortMalloc( size_t xWantedSize )
+{
+    BlockLink_t * pxBlock;
+    BlockLink_t * pxPreviousBlock;
+    BlockLink_t * pxNewBlockLink;
+    void * pvReturn = NULL;
+
+    /* If this is the first call to malloc then the heap will require
+     * initialisation to setup the list of free blocks. */
+    if( pxEnd == NULL )
+    {
+        prvHeapInit();
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+
+    /* Check the requested block size is not so large that the top bit is set.
+     * The top bit of the block size member of the BlockLink_t structure is used
+     * to determine who owns the block - the application or the kernel, so it
+     * must be free. */
+    if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
+    {
+        /* The wanted size is increased so it can contain a BlockLink_t
+         * structure in addition to the requested amount of bytes. */
+        if( xWantedSize > 0 )
+        {
+            xWantedSize += xHeapStructSize;
+
+            /* Ensure that blocks are always aligned to the required number of
+             * bytes. */
+            if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 )
+            {
+                /* Byte alignment required. */
+                xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) );
+                secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 );
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+        else
+        {
+            mtCOVERAGE_TEST_MARKER();
+        }
+
+        if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
+        {
+            /* Traverse the list from the start (lowest address) block until
+             * one of adequate size is found. */
+            pxPreviousBlock = &xStart;
+            pxBlock = xStart.pxNextFreeBlock;
+
+            while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
+            {
+                pxPreviousBlock = pxBlock;
+                pxBlock = pxBlock->pxNextFreeBlock;
+            }
+
+            /* If the end marker was reached then a block of adequate size was
+             * not found. */
+            if( pxBlock != pxEnd )
+            {
+                /* Return the memory space pointed to - jumping over the
+                 * BlockLink_t structure at its start. */
+                pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
+
+                /* This block is being returned for use so must be taken out
+                 * of the list of free blocks. */
+                pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
+
+                /* If the block is larger than required it can be split into
+                 * two. */
+                if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE )
+                {
+                    /* This block is to be split into two.  Create a new
+                     * block following the number of bytes requested. The void
+                     * cast is used to prevent byte alignment warnings from the
+                     * compiler. */
+                    pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
+                    secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 );
+
+                    /* Calculate the sizes of two blocks split from the single
+                     * block. */
+                    pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
+                    pxBlock->xBlockSize = xWantedSize;
+
+                    /* Insert the new block into the list of free blocks. */
+                    prvInsertBlockIntoFreeList( pxNewBlockLink );
+                }
+                else
+                {
+                    mtCOVERAGE_TEST_MARKER();
+                }
+
+                xFreeBytesRemaining -= pxBlock->xBlockSize;
+
+                if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
+                {
+                    xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
+                }
+                else
+                {
+                    mtCOVERAGE_TEST_MARKER();
+                }
+
+                /* The block is being returned - it is allocated and owned by
+                 * the application and has no "next" block. */
+                pxBlock->xBlockSize |= xBlockAllocatedBit;
+                pxBlock->pxNextFreeBlock = NULL;
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+        else
+        {
+            mtCOVERAGE_TEST_MARKER();
+        }
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+
+    traceMALLOC( pvReturn, xWantedSize );
+
+    #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 )
+        {
+            if( pvReturn == NULL )
+            {
+                extern void vApplicationMallocFailedHook( void );
+                vApplicationMallocFailedHook();
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+    #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */
+
+    secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );
+    return pvReturn;
+}
+/*-----------------------------------------------------------*/
+
+void vPortFree( void * pv )
+{
+    uint8_t * puc = ( uint8_t * ) pv;
+    BlockLink_t * pxLink;
+
+    if( pv != NULL )
+    {
+        /* The memory being freed will have an BlockLink_t structure immediately
+         * before it. */
+        puc -= xHeapStructSize;
+
+        /* This casting is to keep the compiler from issuing warnings. */
+        pxLink = ( void * ) puc;
+
+        /* Check the block is actually allocated. */
+        secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
+        secureportASSERT( pxLink->pxNextFreeBlock == NULL );
+
+        if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )
+        {
+            if( pxLink->pxNextFreeBlock == NULL )
+            {
+                /* The block is being returned to the heap - it is no longer
+                 * allocated. */
+                pxLink->xBlockSize &= ~xBlockAllocatedBit;
+
+                secureportDISABLE_NON_SECURE_INTERRUPTS();
+                {
+                    /* Add this block to the list of free blocks. */
+                    xFreeBytesRemaining += pxLink->xBlockSize;
+                    traceFREE( pv, pxLink->xBlockSize );
+                    prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
+                }
+                secureportENABLE_NON_SECURE_INTERRUPTS();
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+        else
+        {
+            mtCOVERAGE_TEST_MARKER();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+size_t xPortGetFreeHeapSize( void )
+{
+    return xFreeBytesRemaining;
+}
+/*-----------------------------------------------------------*/
+
+size_t xPortGetMinimumEverFreeHeapSize( void )
+{
+    return xMinimumEverFreeBytesRemaining;
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CM33/secure/secure_heap.h b/portable/IAR/ARM_CM33/secure/secure_heap.h
index bd42ff9..c13590f 100644
--- a/portable/IAR/ARM_CM33/secure/secure_heap.h
+++ b/portable/IAR/ARM_CM33/secure/secure_heap.h
@@ -1,66 +1,66 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_HEAP_H__

-#define __SECURE_HEAP_H__

-

-/* Standard includes. */

-#include <stdlib.h>

-

-/**

- * @brief Allocates memory from heap.

- *

- * @param[in] xWantedSize The size of the memory to be allocated.

- *

- * @return Pointer to the memory region if the allocation is successful, NULL

- * otherwise.

- */

-void * pvPortMalloc( size_t xWantedSize );

-

-/**

- * @brief Frees the previously allocated memory.

- *

- * @param[in] pv Pointer to the memory to be freed.

- */

-void vPortFree( void * pv );

-

-/**

- * @brief Get the free heap size.

- *

- * @return Free heap size.

- */

-size_t xPortGetFreeHeapSize( void );

-

-/**

- * @brief Get the minimum ever free heap size.

- *

- * @return Minimum ever free heap size.

- */

-size_t xPortGetMinimumEverFreeHeapSize( void );

-

-#endif /* __SECURE_HEAP_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_HEAP_H__
+#define __SECURE_HEAP_H__
+
+/* Standard includes. */
+#include <stdlib.h>
+
+/**
+ * @brief Allocates memory from heap.
+ *
+ * @param[in] xWantedSize The size of the memory to be allocated.
+ *
+ * @return Pointer to the memory region if the allocation is successful, NULL
+ * otherwise.
+ */
+void * pvPortMalloc( size_t xWantedSize );
+
+/**
+ * @brief Frees the previously allocated memory.
+ *
+ * @param[in] pv Pointer to the memory to be freed.
+ */
+void vPortFree( void * pv );
+
+/**
+ * @brief Get the free heap size.
+ *
+ * @return Free heap size.
+ */
+size_t xPortGetFreeHeapSize( void );
+
+/**
+ * @brief Get the minimum ever free heap size.
+ *
+ * @return Minimum ever free heap size.
+ */
+size_t xPortGetMinimumEverFreeHeapSize( void );
+
+#endif /* __SECURE_HEAP_H__ */
diff --git a/portable/IAR/ARM_CM33/secure/secure_init.c b/portable/IAR/ARM_CM33/secure/secure_init.c
index d91695b..dc19ebc 100644
--- a/portable/IAR/ARM_CM33/secure/secure_init.c
+++ b/portable/IAR/ARM_CM33/secure/secure_init.c
@@ -1,106 +1,106 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Standard includes. */

-#include <stdint.h>

-

-/* Secure init includes. */

-#include "secure_init.h"

-

-/* Secure port macros. */

-#include "secure_port_macros.h"

-

-/**

- * @brief Constants required to manipulate the SCB.

- */

-#define secureinitSCB_AIRCR                 ( ( volatile uint32_t * ) 0xe000ed0c )  /* Application Interrupt and Reset Control Register. */

-#define secureinitSCB_AIRCR_VECTKEY_POS     ( 16UL )

-#define secureinitSCB_AIRCR_VECTKEY_MASK    ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS )

-#define secureinitSCB_AIRCR_PRIS_POS        ( 14UL )

-#define secureinitSCB_AIRCR_PRIS_MASK       ( 1UL << secureinitSCB_AIRCR_PRIS_POS )

-

-/**

- * @brief Constants required to manipulate the FPU.

- */

-#define secureinitFPCCR                     ( ( volatile uint32_t * ) 0xe000ef34 )  /* Floating Point Context Control Register. */

-#define secureinitFPCCR_LSPENS_POS          ( 29UL )

-#define secureinitFPCCR_LSPENS_MASK         ( 1UL << secureinitFPCCR_LSPENS_POS )

-#define secureinitFPCCR_TS_POS              ( 26UL )

-#define secureinitFPCCR_TS_MASK             ( 1UL << secureinitFPCCR_TS_POS )

-

-#define secureinitNSACR                     ( ( volatile uint32_t * ) 0xe000ed8c )  /* Non-secure Access Control Register. */

-#define secureinitNSACR_CP10_POS            ( 10UL )

-#define secureinitNSACR_CP10_MASK           ( 1UL << secureinitNSACR_CP10_POS )

-#define secureinitNSACR_CP11_POS            ( 11UL )

-#define secureinitNSACR_CP11_MASK           ( 1UL << secureinitNSACR_CP11_POS )

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void )

-{

-    uint32_t ulIPSR;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ulIPSR != 0 )

-    {

-        *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) |

-                                   ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) |

-                                   ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK );

-    }

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void )

-{

-    uint32_t ulIPSR;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ulIPSR != 0 )

-    {

-        /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is

-         * permitted. CP11 should be programmed to the same value as CP10. */

-        *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK );

-

-        /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures

-         * that we can enable/disable lazy stacking in port.c file. */

-        *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK );

-

-        /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP

-         * registers (S16-S31) are also pushed to stack on exception entry and

-         * restored on exception return. */

-        *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK );

-    }

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Standard includes. */
+#include <stdint.h>
+
+/* Secure init includes. */
+#include "secure_init.h"
+
+/* Secure port macros. */
+#include "secure_port_macros.h"
+
+/**
+ * @brief Constants required to manipulate the SCB.
+ */
+#define secureinitSCB_AIRCR                 ( ( volatile uint32_t * ) 0xe000ed0c )  /* Application Interrupt and Reset Control Register. */
+#define secureinitSCB_AIRCR_VECTKEY_POS     ( 16UL )
+#define secureinitSCB_AIRCR_VECTKEY_MASK    ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS )
+#define secureinitSCB_AIRCR_PRIS_POS        ( 14UL )
+#define secureinitSCB_AIRCR_PRIS_MASK       ( 1UL << secureinitSCB_AIRCR_PRIS_POS )
+
+/**
+ * @brief Constants required to manipulate the FPU.
+ */
+#define secureinitFPCCR                     ( ( volatile uint32_t * ) 0xe000ef34 )  /* Floating Point Context Control Register. */
+#define secureinitFPCCR_LSPENS_POS          ( 29UL )
+#define secureinitFPCCR_LSPENS_MASK         ( 1UL << secureinitFPCCR_LSPENS_POS )
+#define secureinitFPCCR_TS_POS              ( 26UL )
+#define secureinitFPCCR_TS_MASK             ( 1UL << secureinitFPCCR_TS_POS )
+
+#define secureinitNSACR                     ( ( volatile uint32_t * ) 0xe000ed8c )  /* Non-secure Access Control Register. */
+#define secureinitNSACR_CP10_POS            ( 10UL )
+#define secureinitNSACR_CP10_MASK           ( 1UL << secureinitNSACR_CP10_POS )
+#define secureinitNSACR_CP11_POS            ( 11UL )
+#define secureinitNSACR_CP11_MASK           ( 1UL << secureinitNSACR_CP11_POS )
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void )
+{
+    uint32_t ulIPSR;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ulIPSR != 0 )
+    {
+        *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) |
+                                   ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) |
+                                   ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK );
+    }
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void )
+{
+    uint32_t ulIPSR;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ulIPSR != 0 )
+    {
+        /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is
+         * permitted. CP11 should be programmed to the same value as CP10. */
+        *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK );
+
+        /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures
+         * that we can enable/disable lazy stacking in port.c file. */
+        *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK );
+
+        /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP
+         * registers (S16-S31) are also pushed to stack on exception entry and
+         * restored on exception return. */
+        *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK );
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CM33/secure/secure_init.h b/portable/IAR/ARM_CM33/secure/secure_init.h
index e18ba44..21daeda 100644
--- a/portable/IAR/ARM_CM33/secure/secure_init.h
+++ b/portable/IAR/ARM_CM33/secure/secure_init.h
@@ -1,54 +1,54 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_INIT_H__

-#define __SECURE_INIT_H__

-

-/**

- * @brief De-prioritizes the non-secure exceptions.

- *

- * This is needed to ensure that the non-secure PendSV runs at the lowest

- * priority. Context switch is done in the non-secure PendSV handler.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- */

-void SecureInit_DePrioritizeNSExceptions( void );

-

-/**

- * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access.

- *

- * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point

- * Registers are not leaked to the non-secure side.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- */

-void SecureInit_EnableNSFPUAccess( void );

-

-#endif /* __SECURE_INIT_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_INIT_H__
+#define __SECURE_INIT_H__
+
+/**
+ * @brief De-prioritizes the non-secure exceptions.
+ *
+ * This is needed to ensure that the non-secure PendSV runs at the lowest
+ * priority. Context switch is done in the non-secure PendSV handler.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ */
+void SecureInit_DePrioritizeNSExceptions( void );
+
+/**
+ * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access.
+ *
+ * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point
+ * Registers are not leaked to the non-secure side.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ */
+void SecureInit_EnableNSFPUAccess( void );
+
+#endif /* __SECURE_INIT_H__ */
diff --git a/portable/IAR/ARM_CM33/secure/secure_port_macros.h b/portable/IAR/ARM_CM33/secure/secure_port_macros.h
index 5499054..304913b 100644
--- a/portable/IAR/ARM_CM33/secure/secure_port_macros.h
+++ b/portable/IAR/ARM_CM33/secure/secure_port_macros.h
@@ -1,140 +1,140 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_PORT_MACROS_H__

-#define __SECURE_PORT_MACROS_H__

-

-/**

- * @brief Byte alignment requirements.

- */

-#define secureportBYTE_ALIGNMENT         8

-#define secureportBYTE_ALIGNMENT_MASK    ( 0x0007 )

-

-/**

- * @brief Macro to declare a function as non-secure callable.

- */

-#if defined( __IAR_SYSTEMS_ICC__ )

-    #define secureportNON_SECURE_CALLABLE    __cmse_nonsecure_entry __root

-#else

-    #define secureportNON_SECURE_CALLABLE    __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) )

-#endif

-

-/**

- * @brief Set the secure PRIMASK value.

- */

-#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \

-    __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" )

-

-/**

- * @brief Set the non-secure PRIMASK value.

- */

-#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \

-    __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" )

-

-/**

- * @brief Read the PSP value in the given variable.

- */

-#define secureportREAD_PSP( pucOutCurrentStackPointer ) \

-    __asm volatile ( "mrs %0, psp"  : "=r" ( pucOutCurrentStackPointer ) )

-

-/**

- * @brief Set the PSP to the given value.

- */

-#define secureportSET_PSP( pucCurrentStackPointer ) \

-    __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) )

-

-/**

- * @brief Read the PSPLIM value in the given variable.

- */

-#define secureportREAD_PSPLIM( pucOutStackLimit ) \

-    __asm volatile ( "mrs %0, psplim"  : "=r" ( pucOutStackLimit ) )

-

-/**

- * @brief Set the PSPLIM to the given value.

- */

-#define secureportSET_PSPLIM( pucStackLimit ) \

-    __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) )

-

-/**

- * @brief Set the NonSecure MSP to the given value.

- */

-#define secureportSET_MSP_NS( pucMainStackPointer ) \

-    __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) )

-

-/**

- * @brief Set the CONTROL register to the given value.

- */

-#define secureportSET_CONTROL( ulControl ) \

-    __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" )

-

-/**

- * @brief Read the Interrupt Program Status Register (IPSR) value in the given

- * variable.

- */

-#define secureportREAD_IPSR( ulIPSR ) \

-    __asm volatile ( "mrs %0, ipsr"  : "=r" ( ulIPSR ) )

-

-/**

- * @brief PRIMASK value to enable interrupts.

- */

-#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL     0

-

-/**

- * @brief PRIMASK value to disable interrupts.

- */

-#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL    1

-

-/**

- * @brief Disable secure interrupts.

- */

-#define secureportDISABLE_SECURE_INTERRUPTS()        secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )

-

-/**

- * @brief Disable non-secure interrupts.

- *

- * This effectively disables context switches.

- */

-#define secureportDISABLE_NON_SECURE_INTERRUPTS()    secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )

-

-/**

- * @brief Enable non-secure interrupts.

- */

-#define secureportENABLE_NON_SECURE_INTERRUPTS()     secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL )

-

-/**

- * @brief Assert definition.

- */

-#define secureportASSERT( x )                      \

-    if( ( x ) == 0 )                               \

-    {                                              \

-        secureportDISABLE_SECURE_INTERRUPTS();     \

-        secureportDISABLE_NON_SECURE_INTERRUPTS(); \

-        for( ; ; ) {; }                            \

-    }

-

-#endif /* __SECURE_PORT_MACROS_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_PORT_MACROS_H__
+#define __SECURE_PORT_MACROS_H__
+
+/**
+ * @brief Byte alignment requirements.
+ */
+#define secureportBYTE_ALIGNMENT         8
+#define secureportBYTE_ALIGNMENT_MASK    ( 0x0007 )
+
+/**
+ * @brief Macro to declare a function as non-secure callable.
+ */
+#if defined( __IAR_SYSTEMS_ICC__ )
+    #define secureportNON_SECURE_CALLABLE    __cmse_nonsecure_entry __root
+#else
+    #define secureportNON_SECURE_CALLABLE    __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) )
+#endif
+
+/**
+ * @brief Set the secure PRIMASK value.
+ */
+#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \
+    __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" )
+
+/**
+ * @brief Set the non-secure PRIMASK value.
+ */
+#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \
+    __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" )
+
+/**
+ * @brief Read the PSP value in the given variable.
+ */
+#define secureportREAD_PSP( pucOutCurrentStackPointer ) \
+    __asm volatile ( "mrs %0, psp"  : "=r" ( pucOutCurrentStackPointer ) )
+
+/**
+ * @brief Set the PSP to the given value.
+ */
+#define secureportSET_PSP( pucCurrentStackPointer ) \
+    __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) )
+
+/**
+ * @brief Read the PSPLIM value in the given variable.
+ */
+#define secureportREAD_PSPLIM( pucOutStackLimit ) \
+    __asm volatile ( "mrs %0, psplim"  : "=r" ( pucOutStackLimit ) )
+
+/**
+ * @brief Set the PSPLIM to the given value.
+ */
+#define secureportSET_PSPLIM( pucStackLimit ) \
+    __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) )
+
+/**
+ * @brief Set the NonSecure MSP to the given value.
+ */
+#define secureportSET_MSP_NS( pucMainStackPointer ) \
+    __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) )
+
+/**
+ * @brief Set the CONTROL register to the given value.
+ */
+#define secureportSET_CONTROL( ulControl ) \
+    __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" )
+
+/**
+ * @brief Read the Interrupt Program Status Register (IPSR) value in the given
+ * variable.
+ */
+#define secureportREAD_IPSR( ulIPSR ) \
+    __asm volatile ( "mrs %0, ipsr"  : "=r" ( ulIPSR ) )
+
+/**
+ * @brief PRIMASK value to enable interrupts.
+ */
+#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL     0
+
+/**
+ * @brief PRIMASK value to disable interrupts.
+ */
+#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL    1
+
+/**
+ * @brief Disable secure interrupts.
+ */
+#define secureportDISABLE_SECURE_INTERRUPTS()        secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
+
+/**
+ * @brief Disable non-secure interrupts.
+ *
+ * This effectively disables context switches.
+ */
+#define secureportDISABLE_NON_SECURE_INTERRUPTS()    secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
+
+/**
+ * @brief Enable non-secure interrupts.
+ */
+#define secureportENABLE_NON_SECURE_INTERRUPTS()     secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL )
+
+/**
+ * @brief Assert definition.
+ */
+#define secureportASSERT( x )                      \
+    if( ( x ) == 0 )                               \
+    {                                              \
+        secureportDISABLE_SECURE_INTERRUPTS();     \
+        secureportDISABLE_NON_SECURE_INTERRUPTS(); \
+        for( ; ; ) {; }                            \
+    }
+
+#endif /* __SECURE_PORT_MACROS_H__ */
diff --git a/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h b/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h
index b37f6d1..ecd86b9 100644
--- a/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h
+++ b/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h
@@ -1,114 +1,114 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __PORT_ASM_H__

-#define __PORT_ASM_H__

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-

-/* MPU wrappers includes. */

-#include "mpu_wrappers.h"

-

-/**

- * @brief Restore the context of the first task so that the first task starts

- * executing.

- */

-void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Checks whether or not the processor is privileged.

- *

- * @return 1 if the processor is already privileged, 0 otherwise.

- */

-BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Raises the privilege level by clearing the bit 0 of the CONTROL

- * register.

- *

- * @note This is a privileged function and should only be called from the kenrel

- * code.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Lowers the privilege level by setting the bit 0 of the CONTROL

- * register.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vResetPrivilege( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Starts the first task.

- */

-void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Disables interrupts.

- */

-uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Enables interrupts.

- */

-void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief PendSV Exception handler.

- */

-void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief SVC Handler.

- */

-void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Allocate a Secure context for the calling task.

- *

- * @param[in] ulSecureStackSize The size of the stack to be allocated on the

- * secure side for the calling task.

- */

-void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );

-

-/**

- * @brief Free the task's secure context.

- *

- * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.

- */

-void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-#endif /* __PORT_ASM_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __PORT_ASM_H__
+#define __PORT_ASM_H__
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+
+/* MPU wrappers includes. */
+#include "mpu_wrappers.h"
+
+/**
+ * @brief Restore the context of the first task so that the first task starts
+ * executing.
+ */
+void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Checks whether or not the processor is privileged.
+ *
+ * @return 1 if the processor is already privileged, 0 otherwise.
+ */
+BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Raises the privilege level by clearing the bit 0 of the CONTROL
+ * register.
+ *
+ * @note This is a privileged function and should only be called from the kenrel
+ * code.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Lowers the privilege level by setting the bit 0 of the CONTROL
+ * register.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vResetPrivilege( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Starts the first task.
+ */
+void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Disables interrupts.
+ */
+uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Enables interrupts.
+ */
+void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief PendSV Exception handler.
+ */
+void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief SVC Handler.
+ */
+void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Allocate a Secure context for the calling task.
+ *
+ * @param[in] ulSecureStackSize The size of the stack to be allocated on the
+ * secure side for the calling task.
+ */
+void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );
+
+/**
+ * @brief Free the task's secure context.
+ *
+ * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
+ */
+void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+#endif /* __PORT_ASM_H__ */
diff --git a/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s b/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s
index 9e9970c..581b84d 100644
--- a/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s
+++ b/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s
@@ -1,262 +1,262 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-/* Including FreeRTOSConfig.h here will cause build errors if the header file

-contains code not understood by the assembler - for example the 'extern' keyword.

-To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so

-the code is included in C files but excluded by the preprocessor in assembly

-files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */

-#include "FreeRTOSConfig.h"

-

-	EXTERN pxCurrentTCB

-	EXTERN vTaskSwitchContext

-	EXTERN vPortSVCHandler_C

-

-	PUBLIC xIsPrivileged

-	PUBLIC vResetPrivilege

-	PUBLIC vRestoreContextOfFirstTask

-	PUBLIC vRaisePrivilege

-	PUBLIC vStartFirstTask

-	PUBLIC ulSetInterruptMask

-	PUBLIC vClearInterruptMask

-	PUBLIC PendSV_Handler

-	PUBLIC SVC_Handler

-/*-----------------------------------------------------------*/

-

-/*---------------- Unprivileged Functions -------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION .text:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-xIsPrivileged:

-	mrs r0, control							/* r0 = CONTROL. */

-	tst r0, #1								/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */

-	ite ne

-	movne r0, #0							/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */

-	moveq r0, #1							/* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-vResetPrivilege:

-	mrs r0, control							/* r0 = CONTROL. */

-	orr r0, r0, #1							/* r0 = r0 | 1. */

-	msr control, r0							/* CONTROL = r0. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-/*----------------- Privileged Functions --------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION privileged_functions:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-vRestoreContextOfFirstTask:

-	ldr  r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr  r1, [r2]							/* Read pxCurrentTCB. */

-	ldr  r0, [r1]							/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */

-

-#if ( configENABLE_MPU == 1 )

-	dmb										/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	bic r4, r4, #1							/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */

-	str r4, [r2]							/* Disable MPU. */

-

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */

-	ldr r3, [r1]							/* r3 = *r1 i.e. r3 = MAIR0. */

-	ldr r2, =0xe000edc0						/* r2 = 0xe000edc0 [Location of MAIR0]. */

-	str r3, [r2]							/* Program MAIR0. */

-	ldr r2, =0xe000ed98						/* r2 = 0xe000ed98 [Location of RNR]. */

-	movs r3, #4								/* r3 = 4. */

-	str r3, [r2]							/* Program RNR = 4. */

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */

-	ldr r2, =0xe000ed9c						/* r2 = 0xe000ed9c [Location of RBAR]. */

-	ldmia r1!, {r4-r11}						/* Read 4 sets of RBAR/RLAR registers from TCB. */

-	stmia r2!, {r4-r11}						/* Write 4 set of RBAR/RLAR registers using alias registers. */

-

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	orr r4, r4, #1							/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */

-	str r4, [r2]							/* Enable MPU. */

-	dsb										/* Force memory writes before continuing. */

-#endif /* configENABLE_MPU */

-

-#if ( configENABLE_MPU == 1 )

-	ldm  r0!, {r1-r3}						/* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */

-	msr  psplim, r1							/* Set this task's PSPLIM value. */

-	msr  control, r2						/* Set this task's CONTROL value. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	mov  r0, #0

-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */

-	bx   r3									/* Finally, branch to EXC_RETURN. */

-#else /* configENABLE_MPU */

-	ldm  r0!, {r1-r2}						/* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */

-	msr  psplim, r1							/* Set this task's PSPLIM value. */

-	movs r1, #2								/* r1 = 2. */

-	msr  CONTROL, r1						/* Switch to use PSP in the thread mode. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	mov  r0, #0

-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */

-	bx   r2									/* Finally, branch to EXC_RETURN. */

-#endif /* configENABLE_MPU */

-/*-----------------------------------------------------------*/

-

-vRaisePrivilege:

-	mrs  r0, control						/* Read the CONTROL register. */

-	bic r0, r0, #1							/* Clear the bit 0. */

-	msr  control, r0						/* Write back the new CONTROL value. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-vStartFirstTask:

-	ldr r0, =0xe000ed08						/* Use the NVIC offset register to locate the stack. */

-	ldr r0, [r0]							/* Read the VTOR register which gives the address of vector table. */

-	ldr r0, [r0]							/* The first entry in vector table is stack pointer. */

-	msr msp, r0								/* Set the MSP back to the start of the stack. */

-	cpsie i									/* Globally enable interrupts. */

-	cpsie f

-	dsb

-	isb

-	svc 2									/* System call to start the first task. portSVC_START_SCHEDULER = 2. */

-/*-----------------------------------------------------------*/

-

-ulSetInterruptMask:

-	mrs r0, basepri							/* r0 = basepri. Return original basepri value. */

-	mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-	msr basepri, r1							/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */

-	dsb

-	isb

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-vClearInterruptMask:

-	msr basepri, r0							/* basepri = ulMask. */

-	dsb

-	isb

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-PendSV_Handler:

-	mrs r0, psp								/* Read PSP in r0. */

-#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )

-	tst lr, #0x10							/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */

-	it eq

-	vstmdbeq r0!, {s16-s31}					/* Store the additional FP context registers which are not saved automatically. */

-#endif /* configENABLE_FPU || configENABLE_MVE */

-#if ( configENABLE_MPU == 1 )

-	mrs r1, psplim							/* r1 = PSPLIM. */

-	mrs r2, control							/* r2 = CONTROL. */

-	mov r3, lr								/* r3 = LR/EXC_RETURN. */

-	stmdb r0!, {r1-r11}						/* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */

-#else /* configENABLE_MPU */

-	mrs r2, psplim							/* r2 = PSPLIM. */

-	mov r3, lr								/* r3 = LR/EXC_RETURN. */

-	stmdb r0!, {r2-r11}						/* Store on the stack - PSPLIM, LR and registers that are not automatically. */

-#endif /* configENABLE_MPU */

-

-	ldr r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r2]							/* Read pxCurrentTCB. */

-	str r0, [r1]							/* Save the new top of stack in TCB. */

-

-	mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-	msr basepri, r0							/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */

-	dsb

-	isb

-	bl vTaskSwitchContext

-	mov r0, #0								/* r0 = 0. */

-	msr basepri, r0							/* Enable interrupts. */

-

-	ldr r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r2]							/* Read pxCurrentTCB. */

-	ldr r0, [r1]							/* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */

-

-#if ( configENABLE_MPU == 1 )

-	dmb										/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	bic r4, r4, #1							/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */

-	str r4, [r2]							/* Disable MPU. */

-

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */

-	ldr r3, [r1]							/* r3 = *r1 i.e. r3 = MAIR0. */

-	ldr r2, =0xe000edc0						/* r2 = 0xe000edc0 [Location of MAIR0]. */

-	str r3, [r2]							/* Program MAIR0. */

-	ldr r2, =0xe000ed98						/* r2 = 0xe000ed98 [Location of RNR]. */

-	movs r3, #4								/* r3 = 4. */

-	str r3, [r2]							/* Program RNR = 4. */

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */

-	ldr r2, =0xe000ed9c						/* r2 = 0xe000ed9c [Location of RBAR]. */

-	ldmia r1!, {r4-r11}						/* Read 4 sets of RBAR/RLAR registers from TCB. */

-	stmia r2!, {r4-r11}						/* Write 4 set of RBAR/RLAR registers using alias registers. */

-

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	orr r4, r4, #1							/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */

-	str r4, [r2]							/* Enable MPU. */

-	dsb										/* Force memory writes before continuing. */

-#endif /* configENABLE_MPU */

-

-#if ( configENABLE_MPU == 1 )

-	ldmia r0!, {r1-r11}						/* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */

-#else /* configENABLE_MPU */

-	ldmia r0!, {r2-r11}						/* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */

-#endif /* configENABLE_MPU */

-

-#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )

-	tst r3, #0x10							/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */

-	it eq

-	vldmiaeq r0!, {s16-s31}					/* Restore the additional FP context registers which are not restored automatically. */

-#endif /* configENABLE_FPU || configENABLE_MVE */

-

- #if ( configENABLE_MPU == 1 )

-	msr psplim, r1							/* Restore the PSPLIM register value for the task. */

-	msr control, r2							/* Restore the CONTROL register value for the task. */

-#else /* configENABLE_MPU */

-	msr psplim, r2							/* Restore the PSPLIM register value for the task. */

-#endif /* configENABLE_MPU */

-	msr psp, r0								/* Remember the new top of stack for the task. */

-	bx r3

-/*-----------------------------------------------------------*/

-

-SVC_Handler:

-	tst lr, #4

-	ite eq

-	mrseq r0, msp

-	mrsne r0, psp

-	b vPortSVCHandler_C

-/*-----------------------------------------------------------*/

-

-	END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+/* Including FreeRTOSConfig.h here will cause build errors if the header file
+contains code not understood by the assembler - for example the 'extern' keyword.
+To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
+the code is included in C files but excluded by the preprocessor in assembly
+files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
+#include "FreeRTOSConfig.h"
+
+    EXTERN pxCurrentTCB
+    EXTERN vTaskSwitchContext
+    EXTERN vPortSVCHandler_C
+
+    PUBLIC xIsPrivileged
+    PUBLIC vResetPrivilege
+    PUBLIC vRestoreContextOfFirstTask
+    PUBLIC vRaisePrivilege
+    PUBLIC vStartFirstTask
+    PUBLIC ulSetInterruptMask
+    PUBLIC vClearInterruptMask
+    PUBLIC PendSV_Handler
+    PUBLIC SVC_Handler
+/*-----------------------------------------------------------*/
+
+/*---------------- Unprivileged Functions -------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+xIsPrivileged:
+    mrs r0, control                         /* r0 = CONTROL. */
+    tst r0, #1                              /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
+    ite ne
+    movne r0, #0                            /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
+    moveq r0, #1                            /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+vResetPrivilege:
+    mrs r0, control                         /* r0 = CONTROL. */
+    orr r0, r0, #1                          /* r0 = r0 | 1. */
+    msr control, r0                         /* CONTROL = r0. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+/*----------------- Privileged Functions --------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION privileged_functions:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+vRestoreContextOfFirstTask:
+    ldr  r2, =pxCurrentTCB                  /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr  r1, [r2]                           /* Read pxCurrentTCB. */
+    ldr  r0, [r1]                           /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
+
+#if ( configENABLE_MPU == 1 )
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    bic r4, r4, #1                          /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+    str r4, [r2]                            /* Disable MPU. */
+
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+    ldr r3, [r1]                            /* r3 = *r1 i.e. r3 = MAIR0. */
+    ldr r2, =0xe000edc0                     /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str r3, [r2]                            /* Program MAIR0. */
+    ldr r2, =0xe000ed98                     /* r2 = 0xe000ed98 [Location of RNR]. */
+    movs r3, #4                             /* r3 = 4. */
+    str r3, [r2]                            /* Program RNR = 4. */
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+    ldr r2, =0xe000ed9c                     /* r2 = 0xe000ed9c [Location of RBAR]. */
+    ldmia r1!, {r4-r11}                     /* Read 4 sets of RBAR/RLAR registers from TCB. */
+    stmia r2!, {r4-r11}                     /* Write 4 set of RBAR/RLAR registers using alias registers. */
+
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    orr r4, r4, #1                          /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+    str r4, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
+#endif /* configENABLE_MPU */
+
+#if ( configENABLE_MPU == 1 )
+    ldm  r0!, {r1-r3}                       /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */
+    msr  psplim, r1                         /* Set this task's PSPLIM value. */
+    msr  control, r2                        /* Set this task's CONTROL value. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r3                                 /* Finally, branch to EXC_RETURN. */
+#else /* configENABLE_MPU */
+    ldm  r0!, {r1-r2}                       /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
+    msr  psplim, r1                         /* Set this task's PSPLIM value. */
+    movs r1, #2                             /* r1 = 2. */
+    msr  CONTROL, r1                        /* Switch to use PSP in the thread mode. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r2                                 /* Finally, branch to EXC_RETURN. */
+#endif /* configENABLE_MPU */
+/*-----------------------------------------------------------*/
+
+vRaisePrivilege:
+    mrs  r0, control                        /* Read the CONTROL register. */
+    bic r0, r0, #1                          /* Clear the bit 0. */
+    msr  control, r0                        /* Write back the new CONTROL value. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+vStartFirstTask:
+    ldr r0, =0xe000ed08                     /* Use the NVIC offset register to locate the stack. */
+    ldr r0, [r0]                            /* Read the VTOR register which gives the address of vector table. */
+    ldr r0, [r0]                            /* The first entry in vector table is stack pointer. */
+    msr msp, r0                             /* Set the MSP back to the start of the stack. */
+    cpsie i                                 /* Globally enable interrupts. */
+    cpsie f
+    dsb
+    isb
+    svc 2                                   /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
+/*-----------------------------------------------------------*/
+
+ulSetInterruptMask:
+    mrs r0, basepri                         /* r0 = basepri. Return original basepri value. */
+    mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r1                         /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+vClearInterruptMask:
+    msr basepri, r0                         /* basepri = ulMask. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+PendSV_Handler:
+    mrs r0, psp                             /* Read PSP in r0. */
+#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+    tst lr, #0x10                           /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+    it eq
+    vstmdbeq r0!, {s16-s31}                 /* Store the additional FP context registers which are not saved automatically. */
+#endif /* configENABLE_FPU || configENABLE_MVE */
+#if ( configENABLE_MPU == 1 )
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mrs r2, control                         /* r2 = CONTROL. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmdb r0!, {r1-r11}                     /* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */
+#else /* configENABLE_MPU */
+    mrs r2, psplim                          /* r2 = PSPLIM. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmdb r0!, {r2-r11}                     /* Store on the stack - PSPLIM, LR and registers that are not automatically. */
+#endif /* configENABLE_MPU */
+
+    ldr r2, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r2]                            /* Read pxCurrentTCB. */
+    str r0, [r1]                            /* Save the new top of stack in TCB. */
+
+    mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r0                         /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+    dsb
+    isb
+    bl vTaskSwitchContext
+    mov r0, #0                              /* r0 = 0. */
+    msr basepri, r0                         /* Enable interrupts. */
+
+    ldr r2, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r2]                            /* Read pxCurrentTCB. */
+    ldr r0, [r1]                            /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
+
+#if ( configENABLE_MPU == 1 )
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    bic r4, r4, #1                          /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+    str r4, [r2]                            /* Disable MPU. */
+
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+    ldr r3, [r1]                            /* r3 = *r1 i.e. r3 = MAIR0. */
+    ldr r2, =0xe000edc0                     /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str r3, [r2]                            /* Program MAIR0. */
+    ldr r2, =0xe000ed98                     /* r2 = 0xe000ed98 [Location of RNR]. */
+    movs r3, #4                             /* r3 = 4. */
+    str r3, [r2]                            /* Program RNR = 4. */
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+    ldr r2, =0xe000ed9c                     /* r2 = 0xe000ed9c [Location of RBAR]. */
+    ldmia r1!, {r4-r11}                     /* Read 4 sets of RBAR/RLAR registers from TCB. */
+    stmia r2!, {r4-r11}                     /* Write 4 set of RBAR/RLAR registers using alias registers. */
+
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    orr r4, r4, #1                          /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+    str r4, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
+#endif /* configENABLE_MPU */
+
+#if ( configENABLE_MPU == 1 )
+    ldmia r0!, {r1-r11}                     /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */
+#else /* configENABLE_MPU */
+    ldmia r0!, {r2-r11}                     /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
+#endif /* configENABLE_MPU */
+
+#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+    tst r3, #0x10                           /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+    it eq
+    vldmiaeq r0!, {s16-s31}                 /* Restore the additional FP context registers which are not restored automatically. */
+#endif /* configENABLE_FPU || configENABLE_MVE */
+
+ #if ( configENABLE_MPU == 1 )
+    msr psplim, r1                          /* Restore the PSPLIM register value for the task. */
+    msr control, r2                         /* Restore the CONTROL register value for the task. */
+#else /* configENABLE_MPU */
+    msr psplim, r2                          /* Restore the PSPLIM register value for the task. */
+#endif /* configENABLE_MPU */
+    msr psp, r0                             /* Remember the new top of stack for the task. */
+    bx r3
+/*-----------------------------------------------------------*/
+
+SVC_Handler:
+    tst lr, #4
+    ite eq
+    mrseq r0, msp
+    mrsne r0, psp
+    b vPortSVCHandler_C
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h b/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h
index 5e5b20c..b6df20e 100644
--- a/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h
+++ b/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h
@@ -1,78 +1,78 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#ifdef __cplusplus

-    extern "C" {

-#endif

-

-#include "portmacrocommon.h"

-

-/*------------------------------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the given hardware

- * and compiler.

- *

- * These settings should not be altered.

- *------------------------------------------------------------------------------

- */

-

-/**

- * Architecture specifics.

- */

-#define portARCH_NAME                       "Cortex-M33"

-#define portDONT_DISCARD                    __root

-/*-----------------------------------------------------------*/

-

-#if( configTOTAL_MPU_REGIONS == 16 )

-    #error 16 MPU regions are not yet supported for this port.

-#endif

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Critical section management.

- */

-#define portDISABLE_INTERRUPTS()            ulSetInterruptMask()

-#define portENABLE_INTERRUPTS()             vClearInterruptMask( 0 )

-/*-----------------------------------------------------------*/

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

- * the source code because to do so would cause other compilers to generate

- * warnings. */

-#pragma diag_suppress=Be006

-#pragma diag_suppress=Pa082

-/*-----------------------------------------------------------*/

-

-#ifdef __cplusplus

-    }

-#endif

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#ifdef __cplusplus
+    extern "C" {
+#endif
+
+#include "portmacrocommon.h"
+
+/*------------------------------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the given hardware
+ * and compiler.
+ *
+ * These settings should not be altered.
+ *------------------------------------------------------------------------------
+ */
+
+/**
+ * Architecture specifics.
+ */
+#define portARCH_NAME                       "Cortex-M33"
+#define portDONT_DISCARD                    __root
+/*-----------------------------------------------------------*/
+
+#if( configTOTAL_MPU_REGIONS == 16 )
+    #error 16 MPU regions are not yet supported for this port.
+#endif
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Critical section management.
+ */
+#define portDISABLE_INTERRUPTS()            ulSetInterruptMask()
+#define portENABLE_INTERRUPTS()             vClearInterruptMask( 0 )
+/*-----------------------------------------------------------*/
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+ * the source code because to do so would cause other compilers to generate
+ * warnings. */
+#pragma diag_suppress=Be006
+#pragma diag_suppress=Pa082
+/*-----------------------------------------------------------*/
+
+#ifdef __cplusplus
+    }
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h b/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h
index 4b1f99b..51e21ea 100644
--- a/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h
+++ b/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h
@@ -155,9 +155,9 @@
  * 8-bit values encoded as follows:
  *  Bit[7:4] - 0000 - Device Memory
  *  Bit[3:2] - 00 --> Device-nGnRnE
- *				01 --> Device-nGnRE
- *				10 --> Device-nGRE
- *				11 --> Device-GRE
+ *              01 --> Device-nGnRE
+ *              10 --> Device-nGRE
+ *              11 --> Device-GRE
  *  Bit[1:0] - 00, Reserved.
  */
     #define portMPU_DEVICE_MEMORY_nGnRnE                  ( 0x00 )   /* 0000 0000 */
diff --git a/portable/IAR/ARM_CM4F/port.c b/portable/IAR/ARM_CM4F/port.c
index 3c9e006..243d057 100644
--- a/portable/IAR/ARM_CM4F/port.c
+++ b/portable/IAR/ARM_CM4F/port.c
@@ -1,701 +1,701 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

-* Implementation of functions defined in portable.h for the ARM CM4F port.

-*----------------------------------------------------------*/

-

-/* IAR includes. */

-#include <intrinsics.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-#ifndef __ARMVFP__

-    #error This port can only be used when the project options are configured to enable hardware floating point support.

-#endif

-

-#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )

-    #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */

-#endif

-

-/* Constants required to manipulate the core.  Registers first... */

-#define portNVIC_SYSTICK_CTRL_REG             ( *( ( volatile uint32_t * ) 0xe000e010 ) )

-#define portNVIC_SYSTICK_LOAD_REG             ( *( ( volatile uint32_t * ) 0xe000e014 ) )

-#define portNVIC_SYSTICK_CURRENT_VALUE_REG    ( *( ( volatile uint32_t * ) 0xe000e018 ) )

-#define portNVIC_SHPR3_REG                    ( *( ( volatile uint32_t * ) 0xe000ed20 ) )

-/* ...then bits in the registers. */

-#define portNVIC_SYSTICK_CLK_BIT              ( 1UL << 2UL )

-#define portNVIC_SYSTICK_INT_BIT              ( 1UL << 1UL )

-#define portNVIC_SYSTICK_ENABLE_BIT           ( 1UL << 0UL )

-#define portNVIC_SYSTICK_COUNT_FLAG_BIT       ( 1UL << 16UL )

-#define portNVIC_PENDSVCLEAR_BIT              ( 1UL << 27UL )

-#define portNVIC_PEND_SYSTICK_SET_BIT         ( 1UL << 26UL )

-#define portNVIC_PEND_SYSTICK_CLEAR_BIT       ( 1UL << 25UL )

-

-/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7

- * r0p1 port. */

-#define portCPUID                             ( *( ( volatile uint32_t * ) 0xE000ed00 ) )

-#define portCORTEX_M7_r0p1_ID                 ( 0x410FC271UL )

-#define portCORTEX_M7_r0p0_ID                 ( 0x410FC270UL )

-

-#define portNVIC_PENDSV_PRI                   ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )

-#define portNVIC_SYSTICK_PRI                  ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )

-

-/* Constants required to check the validity of an interrupt priority. */

-#define portFIRST_USER_INTERRUPT_NUMBER       ( 16 )

-#define portNVIC_IP_REGISTERS_OFFSET_16       ( 0xE000E3F0 )

-#define portAIRCR_REG                         ( *( ( volatile uint32_t * ) 0xE000ED0C ) )

-#define portMAX_8_BIT_VALUE                   ( ( uint8_t ) 0xff )

-#define portTOP_BIT_OF_BYTE                   ( ( uint8_t ) 0x80 )

-#define portMAX_PRIGROUP_BITS                 ( ( uint8_t ) 7 )

-#define portPRIORITY_GROUP_MASK               ( 0x07UL << 8UL )

-#define portPRIGROUP_SHIFT                    ( 8UL )

-

-/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */

-#define portVECTACTIVE_MASK                   ( 0xFFUL )

-

-/* Constants required to manipulate the VFP. */

-#define portFPCCR                             ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */

-#define portASPEN_AND_LSPEN_BITS              ( 0x3UL << 30UL )

-

-/* Constants required to set up the initial stack. */

-#define portINITIAL_XPSR                      ( 0x01000000 )

-#define portINITIAL_EXC_RETURN                ( 0xfffffffd )

-

-/* The systick is a 24-bit counter. */

-#define portMAX_24_BIT_NUMBER                 ( 0xffffffUL )

-

-/* A fiddle factor to estimate the number of SysTick counts that would have

- * occurred while the SysTick counter is stopped during tickless idle

- * calculations. */

-#define portMISSED_COUNTS_FACTOR              ( 94UL )

-

-/* For strict compliance with the Cortex-M spec the task start address should

- * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */

-#define portSTART_ADDRESS_MASK                ( ( StackType_t ) 0xfffffffeUL )

-

-/* Let the user override the default SysTick clock rate.  If defined by the

- * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the

- * configuration register. */

-#ifndef configSYSTICK_CLOCK_HZ

-    #define configSYSTICK_CLOCK_HZ             ( configCPU_CLOCK_HZ )

-    /* Ensure the SysTick is clocked at the same frequency as the core. */

-    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( portNVIC_SYSTICK_CLK_BIT )

-#else

-    /* Select the option to clock SysTick not at the same frequency as the core. */

-    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( 0 )

-#endif

-

-/*

- * Setup the timer to generate the tick interrupts.  The implementation in this

- * file is weak to allow application writers to change the timer used to

- * generate the tick interrupt.

- */

-void vPortSetupTimerInterrupt( void );

-

-/*

- * Exception handlers.

- */

-void xPortSysTickHandler( void );

-

-/*

- * Start first task is a separate function so it can be tested in isolation.

- */

-extern void vPortStartFirstTask( void );

-

-/*

- * Turn the VFP on.

- */

-extern void vPortEnableVFP( void );

-

-/*

- * Used to catch tasks that attempt to return from their implementing function.

- */

-static void prvTaskExitError( void );

-

-/*-----------------------------------------------------------*/

-

-/* Each task maintains its own interrupt status in the critical nesting

- * variable. */

-static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;

-

-/*

- * The number of SysTick increments that make up one tick period.

- */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t ulTimerCountsForOneTick = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/*

- * The maximum number of tick periods that can be suppressed is limited by the

- * 24 bit resolution of the SysTick timer.

- */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t xMaximumPossibleSuppressedTicks = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/*

- * Compensate for the CPU cycles that pass while the SysTick is stopped (low

- * power functionality only.

- */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t ulStoppedTimerCompensation = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/*

- * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure

- * FreeRTOS API functions are not called from interrupts that have been assigned

- * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.

- */

-#if ( configASSERT_DEFINED == 1 )

-    static uint8_t ucMaxSysCallPriority = 0;

-    static uint32_t ulMaxPRIGROUPValue = 0;

-    static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;

-#endif /* configASSERT_DEFINED */

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,

-                                     TaskFunction_t pxCode,

-                                     void * pvParameters )

-{

-    /* Simulate the stack frame as it would be created by a context switch

-     * interrupt. */

-

-    /* Offset added to account for the way the MCU uses the stack on entry/exit

-     * of interrupts, and to ensure alignment. */

-    pxTopOfStack--;

-

-    *pxTopOfStack = portINITIAL_XPSR;                                    /* xPSR */

-    pxTopOfStack--;

-    *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */

-    pxTopOfStack--;

-    *pxTopOfStack = ( StackType_t ) prvTaskExitError;                    /* LR */

-

-    /* Save code space by skipping register initialisation. */

-    pxTopOfStack -= 5;                            /* R12, R3, R2 and R1. */

-    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-

-    /* A save method is being used that requires each task to maintain its

-     * own exec return value. */

-    pxTopOfStack--;

-    *pxTopOfStack = portINITIAL_EXC_RETURN;

-

-    pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */

-

-    return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-static void prvTaskExitError( void )

-{

-    /* A function that implements a task must not exit or attempt to return to

-     * its caller as there is nothing to return to.  If a task wants to exit it

-     * should instead call vTaskDelete( NULL ).

-     *

-     * Artificially force an assert() to be triggered if configASSERT() is

-     * defined, then stop here so application writers can catch the error. */

-    configASSERT( uxCriticalNesting == ~0UL );

-    portDISABLE_INTERRUPTS();

-

-    for( ; ; )

-    {

-    }

-}

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-BaseType_t xPortStartScheduler( void )

-{

-    /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.

-     * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */

-    configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );

-

-    /* This port can be used on all revisions of the Cortex-M7 core other than

-     * the r0p1 parts.  r0p1 parts should use the port from the

-     * /source/portable/GCC/ARM_CM7/r0p1 directory. */

-    configASSERT( portCPUID != portCORTEX_M7_r0p1_ID );

-    configASSERT( portCPUID != portCORTEX_M7_r0p0_ID );

-

-    #if ( configASSERT_DEFINED == 1 )

-    {

-        volatile uint32_t ulOriginalPriority;

-        volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );

-        volatile uint8_t ucMaxPriorityValue;

-

-        /* Determine the maximum priority from which ISR safe FreeRTOS API

-         * functions can be called.  ISR safe functions are those that end in

-         * "FromISR".  FreeRTOS maintains separate thread and ISR API functions to

-         * ensure interrupt entry is as fast and simple as possible.

-         *

-         * Save the interrupt priority value that is about to be clobbered. */

-        ulOriginalPriority = *pucFirstUserPriorityRegister;

-

-        /* Determine the number of priority bits available.  First write to all

-         * possible bits. */

-        *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;

-

-        /* Read the value back to see how many bits stuck. */

-        ucMaxPriorityValue = *pucFirstUserPriorityRegister;

-

-        /* Use the same mask on the maximum system call priority. */

-        ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;

-

-        /* Calculate the maximum acceptable priority group value for the number

-         * of bits read back. */

-        ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;

-

-        while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )

-        {

-            ulMaxPRIGROUPValue--;

-            ucMaxPriorityValue <<= ( uint8_t ) 0x01;

-        }

-

-        #ifdef __NVIC_PRIO_BITS

-        {

-            /* Check the CMSIS configuration that defines the number of

-             * priority bits matches the number of priority bits actually queried

-             * from the hardware. */

-            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );

-        }

-        #endif

-

-        #ifdef configPRIO_BITS

-        {

-            /* Check the FreeRTOS configuration that defines the number of

-             * priority bits matches the number of priority bits actually queried

-             * from the hardware. */

-            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );

-        }

-        #endif

-

-        /* Shift the priority group value back to its position within the AIRCR

-         * register. */

-        ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;

-        ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;

-

-        /* Restore the clobbered interrupt priority register to its original

-         * value. */

-        *pucFirstUserPriorityRegister = ulOriginalPriority;

-    }

-    #endif /* configASSERT_DEFINED */

-

-    /* Make PendSV and SysTick the lowest priority interrupts. */

-    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;

-    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;

-

-    /* Start the timer that generates the tick ISR.  Interrupts are disabled

-     * here already. */

-    vPortSetupTimerInterrupt();

-

-    /* Initialise the critical nesting count ready for the first task. */

-    uxCriticalNesting = 0;

-

-    /* Ensure the VFP is enabled - it should be anyway. */

-    vPortEnableVFP();

-

-    /* Lazy save always. */

-    *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;

-

-    /* Start the first task. */

-    vPortStartFirstTask();

-

-    /* Should not get here! */

-    return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-    /* Not implemented in ports where there is nothing to return to.

-     * Artificially force an assert. */

-    configASSERT( uxCriticalNesting == 1000UL );

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-    portDISABLE_INTERRUPTS();

-    uxCriticalNesting++;

-

-    /* This is not the interrupt safe version of the enter critical function so

-     * assert() if it is being called from an interrupt context.  Only API

-     * functions that end in "FromISR" can be used in an interrupt.  Only assert if

-     * the critical nesting count is 1 to protect against recursive calls if the

-     * assert function also uses a critical section. */

-    if( uxCriticalNesting == 1 )

-    {

-        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );

-    }

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-    configASSERT( uxCriticalNesting );

-    uxCriticalNesting--;

-

-    if( uxCriticalNesting == 0 )

-    {

-        portENABLE_INTERRUPTS();

-    }

-}

-/*-----------------------------------------------------------*/

-

-void xPortSysTickHandler( void )

-{

-    /* The SysTick runs at the lowest interrupt priority, so when this interrupt

-     * executes all interrupts must be unmasked.  There is therefore no need to

-     * save and then restore the interrupt mask value as its value is already

-     * known. */

-    portDISABLE_INTERRUPTS();

-    {

-        /* Increment the RTOS tick. */

-        if( xTaskIncrementTick() != pdFALSE )

-        {

-            /* A context switch is required.  Context switching is performed in

-             * the PendSV interrupt.  Pend the PendSV interrupt. */

-            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;

-        }

-    }

-    portENABLE_INTERRUPTS();

-}

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TICKLESS_IDLE == 1 )

-

-    __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )

-    {

-        uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft;

-        TickType_t xModifiableIdleTime;

-

-        /* Make sure the SysTick reload value does not overflow the counter. */

-        if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )

-        {

-            xExpectedIdleTime = xMaximumPossibleSuppressedTicks;

-        }

-

-        /* Enter a critical section but don't use the taskENTER_CRITICAL()

-         * method as that will mask interrupts that should exit sleep mode. */

-        __disable_interrupt();

-        __DSB();

-        __ISB();

-

-        /* If a context switch is pending or a task is waiting for the scheduler

-         * to be unsuspended then abandon the low power entry. */

-        if( eTaskConfirmSleepModeStatus() == eAbortSleep )

-        {

-            /* Re-enable interrupts - see comments above the __disable_interrupt()

-             * call above. */

-            __enable_interrupt();

-        }

-        else

-        {

-            /* Stop the SysTick momentarily.  The time the SysTick is stopped for

-             * is accounted for as best it can be, but using the tickless mode will

-             * inevitably result in some tiny drift of the time maintained by the

-             * kernel with respect to calendar time. */

-            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );

-

-            /* Use the SysTick current-value register to determine the number of

-             * SysTick decrements remaining until the next tick interrupt.  If the

-             * current-value register is zero, then there are actually

-             * ulTimerCountsForOneTick decrements remaining, not zero, because the

-             * SysTick requests the interrupt when decrementing from 1 to 0. */

-            ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;

-

-            if( ulSysTickDecrementsLeft == 0 )

-            {

-                ulSysTickDecrementsLeft = ulTimerCountsForOneTick;

-            }

-

-            /* Calculate the reload value required to wait xExpectedIdleTime

-             * tick periods.  -1 is used because this code normally executes part

-             * way through the first tick period.  But if the SysTick IRQ is now

-             * pending, then clear the IRQ, suppressing the first tick, and correct

-             * the reload value to reflect that the second tick period is already

-             * underway.  The expected idle time is always at least two ticks. */

-            ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );

-

-            if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 )

-            {

-                portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT;

-                ulReloadValue -= ulTimerCountsForOneTick;

-            }

-

-            if( ulReloadValue > ulStoppedTimerCompensation )

-            {

-                ulReloadValue -= ulStoppedTimerCompensation;

-            }

-

-            /* Set the new reload value. */

-            portNVIC_SYSTICK_LOAD_REG = ulReloadValue;

-

-            /* Clear the SysTick count flag and set the count value back to

-             * zero. */

-            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-

-            /* Restart SysTick. */

-            portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;

-

-            /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can

-             * set its parameter to 0 to indicate that its implementation contains

-             * its own wait for interrupt or wait for event instruction, and so wfi

-             * should not be executed again.  However, the original expected idle

-             * time variable must remain unmodified, so a copy is taken. */

-            xModifiableIdleTime = xExpectedIdleTime;

-            configPRE_SLEEP_PROCESSING( xModifiableIdleTime );

-

-            if( xModifiableIdleTime > 0 )

-            {

-                __DSB();

-                __WFI();

-                __ISB();

-            }

-

-            configPOST_SLEEP_PROCESSING( xExpectedIdleTime );

-

-            /* Re-enable interrupts to allow the interrupt that brought the MCU

-             * out of sleep mode to execute immediately.  See comments above

-             * the __disable_interrupt() call above. */

-            __enable_interrupt();

-            __DSB();

-            __ISB();

-

-            /* Disable interrupts again because the clock is about to be stopped

-             * and interrupts that execute while the clock is stopped will increase

-             * any slippage between the time maintained by the RTOS and calendar

-             * time. */

-            __disable_interrupt();

-            __DSB();

-            __ISB();

-

-            /* Disable the SysTick clock without reading the

-             * portNVIC_SYSTICK_CTRL_REG register to ensure the

-             * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,

-             * the time the SysTick is stopped for is accounted for as best it can

-             * be, but using the tickless mode will inevitably result in some tiny

-             * drift of the time maintained by the kernel with respect to calendar

-             * time*/

-            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );

-

-            /* Determine whether the SysTick has already counted to zero. */

-            if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )

-            {

-                uint32_t ulCalculatedLoadValue;

-

-                /* The tick interrupt ended the sleep (or is now pending), and

-                 * a new tick period has started.  Reset portNVIC_SYSTICK_LOAD_REG

-                 * with whatever remains of the new tick period. */

-                ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );

-

-                /* Don't allow a tiny value, or values that have somehow

-                 * underflowed because the post sleep hook did something

-                 * that took too long or because the SysTick current-value register

-                 * is zero. */

-                if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )

-                {

-                    ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );

-                }

-

-                portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;

-

-                /* As the pending tick will be processed as soon as this

-                 * function exits, the tick value maintained by the tick is stepped

-                 * forward by one less than the time spent waiting. */

-                ulCompleteTickPeriods = xExpectedIdleTime - 1UL;

-            }

-            else

-            {

-                /* Something other than the tick interrupt ended the sleep. */

-

-                /* Use the SysTick current-value register to determine the

-                 * number of SysTick decrements remaining until the expected idle

-                 * time would have ended. */

-                ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;

-                #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT )

-                {

-                    /* If the SysTick is not using the core clock, the current-

-                     * value register might still be zero here.  In that case, the

-                     * SysTick didn't load from the reload register, and there are

-                     * ulReloadValue decrements remaining in the expected idle

-                     * time, not zero. */

-                    if( ulSysTickDecrementsLeft == 0 )

-                    {

-                        ulSysTickDecrementsLeft = ulReloadValue;

-                    }

-                }

-                #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */

-

-                /* Work out how long the sleep lasted rounded to complete tick

-                 * periods (not the ulReload value which accounted for part

-                 * ticks). */

-                ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft;

-

-                /* How many complete tick periods passed while the processor

-                 * was waiting? */

-                ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;

-

-                /* The reload value is set to whatever fraction of a single tick

-                 * period remains. */

-                portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;

-            }

-

-            /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again,

-             * then set portNVIC_SYSTICK_LOAD_REG back to its standard value.  If

-             * the SysTick is not using the core clock, temporarily configure it to

-             * use the core clock.  This configuration forces the SysTick to load

-             * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next

-             * cycle of the other clock.  Then portNVIC_SYSTICK_LOAD_REG is ready

-             * to receive the standard value immediately. */

-            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-            portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;

-            #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT )

-            {

-                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

-            }

-            #else

-            {

-                /* The temporary usage of the core clock has served its purpose,

-                 * as described above.  Resume usage of the other clock. */

-                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT;

-

-                if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )

-                {

-                    /* The partial tick period already ended.  Be sure the SysTick

-                     * counts it only once. */

-                    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0;

-                }

-

-                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

-                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;

-            }

-            #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */

-

-            /* Step the tick to account for any tick periods that elapsed. */

-            vTaskStepTick( ulCompleteTickPeriods );

-

-            /* Exit with interrupts enabled. */

-            __enable_interrupt();

-        }

-    }

-

-#endif /* configUSE_TICKLESS_IDLE */

-/*-----------------------------------------------------------*/

-

-/*

- * Setup the systick timer to generate the tick interrupts at the required

- * frequency.

- */

-__weak void vPortSetupTimerInterrupt( void )

-{

-    /* Calculate the constants required to configure the tick interrupt. */

-    #if ( configUSE_TICKLESS_IDLE == 1 )

-    {

-        ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );

-        xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;

-        ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );

-    }

-    #endif /* configUSE_TICKLESS_IDLE */

-

-    /* Stop and clear the SysTick. */

-    portNVIC_SYSTICK_CTRL_REG = 0UL;

-    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-

-    /* Configure SysTick to interrupt at the requested rate. */

-    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;

-    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );

-}

-/*-----------------------------------------------------------*/

-

-#if ( configASSERT_DEFINED == 1 )

-

-    void vPortValidateInterruptPriority( void )

-    {

-        uint32_t ulCurrentInterrupt;

-        uint8_t ucCurrentPriority;

-

-        /* Obtain the number of the currently executing interrupt. */

-        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );

-

-        /* Is the interrupt number a user defined interrupt? */

-        if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )

-        {

-            /* Look up the interrupt's priority. */

-            ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];

-

-            /* The following assertion will fail if a service routine (ISR) for

-             * an interrupt that has been assigned a priority above

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API

-             * function.  ISR safe FreeRTOS API functions must *only* be called

-             * from interrupts that have been assigned a priority at or below

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY.

-             *

-             * Numerically low interrupt priority numbers represent logically high

-             * interrupt priorities, therefore the priority of the interrupt must

-             * be set to a value equal to or numerically *higher* than

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY.

-             *

-             * Interrupts that	use the FreeRTOS API must not be left at their

-             * default priority of	zero as that is the highest possible priority,

-             * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,

-             * and	therefore also guaranteed to be invalid.

-             *

-             * FreeRTOS maintains separate thread and ISR API functions to ensure

-             * interrupt entry is as fast and simple as possible.

-             *

-             * The following links provide detailed information:

-             * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html

-             * https://www.FreeRTOS.org/FAQHelp.html */

-            configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

-        }

-

-        /* Priority grouping:  The interrupt controller (NVIC) allows the bits

-         * that define each interrupt's priority to be split between bits that

-         * define the interrupt's pre-emption priority bits and bits that define

-         * the interrupt's sub-priority.  For simplicity all bits must be defined

-         * to be pre-emption priority bits.  The following assertion will fail if

-         * this is not the case (if some bits represent a sub-priority).

-         *

-         * If the application only uses CMSIS libraries for interrupt

-         * configuration then the correct setting can be achieved on all Cortex-M

-         * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the

-         * scheduler.  Note however that some vendor specific peripheral libraries

-         * assume a non-zero priority group setting, in which cases using a value

-         * of zero will result in unpredictable behaviour. */

-        configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );

-    }

-

-#endif /* configASSERT_DEFINED */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+* Implementation of functions defined in portable.h for the ARM CM4F port.
+*----------------------------------------------------------*/
+
+/* IAR includes. */
+#include <intrinsics.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+#ifndef __ARMVFP__
+    #error This port can only be used when the project options are configured to enable hardware floating point support.
+#endif
+
+#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )
+    #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
+#endif
+
+/* Constants required to manipulate the core.  Registers first... */
+#define portNVIC_SYSTICK_CTRL_REG             ( *( ( volatile uint32_t * ) 0xe000e010 ) )
+#define portNVIC_SYSTICK_LOAD_REG             ( *( ( volatile uint32_t * ) 0xe000e014 ) )
+#define portNVIC_SYSTICK_CURRENT_VALUE_REG    ( *( ( volatile uint32_t * ) 0xe000e018 ) )
+#define portNVIC_SHPR3_REG                    ( *( ( volatile uint32_t * ) 0xe000ed20 ) )
+/* ...then bits in the registers. */
+#define portNVIC_SYSTICK_CLK_BIT              ( 1UL << 2UL )
+#define portNVIC_SYSTICK_INT_BIT              ( 1UL << 1UL )
+#define portNVIC_SYSTICK_ENABLE_BIT           ( 1UL << 0UL )
+#define portNVIC_SYSTICK_COUNT_FLAG_BIT       ( 1UL << 16UL )
+#define portNVIC_PENDSVCLEAR_BIT              ( 1UL << 27UL )
+#define portNVIC_PEND_SYSTICK_SET_BIT         ( 1UL << 26UL )
+#define portNVIC_PEND_SYSTICK_CLEAR_BIT       ( 1UL << 25UL )
+
+/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7
+ * r0p1 port. */
+#define portCPUID                             ( *( ( volatile uint32_t * ) 0xE000ed00 ) )
+#define portCORTEX_M7_r0p1_ID                 ( 0x410FC271UL )
+#define portCORTEX_M7_r0p0_ID                 ( 0x410FC270UL )
+
+#define portNVIC_PENDSV_PRI                   ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
+#define portNVIC_SYSTICK_PRI                  ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )
+
+/* Constants required to check the validity of an interrupt priority. */
+#define portFIRST_USER_INTERRUPT_NUMBER       ( 16 )
+#define portNVIC_IP_REGISTERS_OFFSET_16       ( 0xE000E3F0 )
+#define portAIRCR_REG                         ( *( ( volatile uint32_t * ) 0xE000ED0C ) )
+#define portMAX_8_BIT_VALUE                   ( ( uint8_t ) 0xff )
+#define portTOP_BIT_OF_BYTE                   ( ( uint8_t ) 0x80 )
+#define portMAX_PRIGROUP_BITS                 ( ( uint8_t ) 7 )
+#define portPRIORITY_GROUP_MASK               ( 0x07UL << 8UL )
+#define portPRIGROUP_SHIFT                    ( 8UL )
+
+/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */
+#define portVECTACTIVE_MASK                   ( 0xFFUL )
+
+/* Constants required to manipulate the VFP. */
+#define portFPCCR                             ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */
+#define portASPEN_AND_LSPEN_BITS              ( 0x3UL << 30UL )
+
+/* Constants required to set up the initial stack. */
+#define portINITIAL_XPSR                      ( 0x01000000 )
+#define portINITIAL_EXC_RETURN                ( 0xfffffffd )
+
+/* The systick is a 24-bit counter. */
+#define portMAX_24_BIT_NUMBER                 ( 0xffffffUL )
+
+/* A fiddle factor to estimate the number of SysTick counts that would have
+ * occurred while the SysTick counter is stopped during tickless idle
+ * calculations. */
+#define portMISSED_COUNTS_FACTOR              ( 94UL )
+
+/* For strict compliance with the Cortex-M spec the task start address should
+ * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */
+#define portSTART_ADDRESS_MASK                ( ( StackType_t ) 0xfffffffeUL )
+
+/* Let the user override the default SysTick clock rate.  If defined by the
+ * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the
+ * configuration register. */
+#ifndef configSYSTICK_CLOCK_HZ
+    #define configSYSTICK_CLOCK_HZ             ( configCPU_CLOCK_HZ )
+    /* Ensure the SysTick is clocked at the same frequency as the core. */
+    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( portNVIC_SYSTICK_CLK_BIT )
+#else
+    /* Select the option to clock SysTick not at the same frequency as the core. */
+    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( 0 )
+#endif
+
+/*
+ * Setup the timer to generate the tick interrupts.  The implementation in this
+ * file is weak to allow application writers to change the timer used to
+ * generate the tick interrupt.
+ */
+void vPortSetupTimerInterrupt( void );
+
+/*
+ * Exception handlers.
+ */
+void xPortSysTickHandler( void );
+
+/*
+ * Start first task is a separate function so it can be tested in isolation.
+ */
+extern void vPortStartFirstTask( void );
+
+/*
+ * Turn the VFP on.
+ */
+extern void vPortEnableVFP( void );
+
+/*
+ * Used to catch tasks that attempt to return from their implementing function.
+ */
+static void prvTaskExitError( void );
+
+/*-----------------------------------------------------------*/
+
+/* Each task maintains its own interrupt status in the critical nesting
+ * variable. */
+static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
+
+/*
+ * The number of SysTick increments that make up one tick period.
+ */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t ulTimerCountsForOneTick = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/*
+ * The maximum number of tick periods that can be suppressed is limited by the
+ * 24 bit resolution of the SysTick timer.
+ */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t xMaximumPossibleSuppressedTicks = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/*
+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low
+ * power functionality only.
+ */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t ulStoppedTimerCompensation = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/*
+ * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure
+ * FreeRTOS API functions are not called from interrupts that have been assigned
+ * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.
+ */
+#if ( configASSERT_DEFINED == 1 )
+    static uint8_t ucMaxSysCallPriority = 0;
+    static uint32_t ulMaxPRIGROUPValue = 0;
+    static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;
+#endif /* configASSERT_DEFINED */
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
+                                     TaskFunction_t pxCode,
+                                     void * pvParameters )
+{
+    /* Simulate the stack frame as it would be created by a context switch
+     * interrupt. */
+
+    /* Offset added to account for the way the MCU uses the stack on entry/exit
+     * of interrupts, and to ensure alignment. */
+    pxTopOfStack--;
+
+    *pxTopOfStack = portINITIAL_XPSR;                                    /* xPSR */
+    pxTopOfStack--;
+    *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) prvTaskExitError;                    /* LR */
+
+    /* Save code space by skipping register initialisation. */
+    pxTopOfStack -= 5;                            /* R12, R3, R2 and R1. */
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+
+    /* A save method is being used that requires each task to maintain its
+     * own exec return value. */
+    pxTopOfStack--;
+    *pxTopOfStack = portINITIAL_EXC_RETURN;
+
+    pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+static void prvTaskExitError( void )
+{
+    /* A function that implements a task must not exit or attempt to return to
+     * its caller as there is nothing to return to.  If a task wants to exit it
+     * should instead call vTaskDelete( NULL ).
+     *
+     * Artificially force an assert() to be triggered if configASSERT() is
+     * defined, then stop here so application writers can catch the error. */
+    configASSERT( uxCriticalNesting == ~0UL );
+    portDISABLE_INTERRUPTS();
+
+    for( ; ; )
+    {
+    }
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+BaseType_t xPortStartScheduler( void )
+{
+    /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.
+     * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
+    configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );
+
+    /* This port can be used on all revisions of the Cortex-M7 core other than
+     * the r0p1 parts.  r0p1 parts should use the port from the
+     * /source/portable/GCC/ARM_CM7/r0p1 directory. */
+    configASSERT( portCPUID != portCORTEX_M7_r0p1_ID );
+    configASSERT( portCPUID != portCORTEX_M7_r0p0_ID );
+
+    #if ( configASSERT_DEFINED == 1 )
+    {
+        volatile uint32_t ulOriginalPriority;
+        volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );
+        volatile uint8_t ucMaxPriorityValue;
+
+        /* Determine the maximum priority from which ISR safe FreeRTOS API
+         * functions can be called.  ISR safe functions are those that end in
+         * "FromISR".  FreeRTOS maintains separate thread and ISR API functions to
+         * ensure interrupt entry is as fast and simple as possible.
+         *
+         * Save the interrupt priority value that is about to be clobbered. */
+        ulOriginalPriority = *pucFirstUserPriorityRegister;
+
+        /* Determine the number of priority bits available.  First write to all
+         * possible bits. */
+        *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
+
+        /* Read the value back to see how many bits stuck. */
+        ucMaxPriorityValue = *pucFirstUserPriorityRegister;
+
+        /* Use the same mask on the maximum system call priority. */
+        ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
+
+        /* Calculate the maximum acceptable priority group value for the number
+         * of bits read back. */
+        ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
+
+        while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
+        {
+            ulMaxPRIGROUPValue--;
+            ucMaxPriorityValue <<= ( uint8_t ) 0x01;
+        }
+
+        #ifdef __NVIC_PRIO_BITS
+        {
+            /* Check the CMSIS configuration that defines the number of
+             * priority bits matches the number of priority bits actually queried
+             * from the hardware. */
+            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );
+        }
+        #endif
+
+        #ifdef configPRIO_BITS
+        {
+            /* Check the FreeRTOS configuration that defines the number of
+             * priority bits matches the number of priority bits actually queried
+             * from the hardware. */
+            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
+        }
+        #endif
+
+        /* Shift the priority group value back to its position within the AIRCR
+         * register. */
+        ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
+        ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
+
+        /* Restore the clobbered interrupt priority register to its original
+         * value. */
+        *pucFirstUserPriorityRegister = ulOriginalPriority;
+    }
+    #endif /* configASSERT_DEFINED */
+
+    /* Make PendSV and SysTick the lowest priority interrupts. */
+    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
+    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+     * here already. */
+    vPortSetupTimerInterrupt();
+
+    /* Initialise the critical nesting count ready for the first task. */
+    uxCriticalNesting = 0;
+
+    /* Ensure the VFP is enabled - it should be anyway. */
+    vPortEnableVFP();
+
+    /* Lazy save always. */
+    *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+     * Artificially force an assert. */
+    configASSERT( uxCriticalNesting == 1000UL );
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    portDISABLE_INTERRUPTS();
+    uxCriticalNesting++;
+
+    /* This is not the interrupt safe version of the enter critical function so
+     * assert() if it is being called from an interrupt context.  Only API
+     * functions that end in "FromISR" can be used in an interrupt.  Only assert if
+     * the critical nesting count is 1 to protect against recursive calls if the
+     * assert function also uses a critical section. */
+    if( uxCriticalNesting == 1 )
+    {
+        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
+    }
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    configASSERT( uxCriticalNesting );
+    uxCriticalNesting--;
+
+    if( uxCriticalNesting == 0 )
+    {
+        portENABLE_INTERRUPTS();
+    }
+}
+/*-----------------------------------------------------------*/
+
+void xPortSysTickHandler( void )
+{
+    /* The SysTick runs at the lowest interrupt priority, so when this interrupt
+     * executes all interrupts must be unmasked.  There is therefore no need to
+     * save and then restore the interrupt mask value as its value is already
+     * known. */
+    portDISABLE_INTERRUPTS();
+    {
+        /* Increment the RTOS tick. */
+        if( xTaskIncrementTick() != pdFALSE )
+        {
+            /* A context switch is required.  Context switching is performed in
+             * the PendSV interrupt.  Pend the PendSV interrupt. */
+            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
+        }
+    }
+    portENABLE_INTERRUPTS();
+}
+/*-----------------------------------------------------------*/
+
+#if ( configUSE_TICKLESS_IDLE == 1 )
+
+    __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
+    {
+        uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft;
+        TickType_t xModifiableIdleTime;
+
+        /* Make sure the SysTick reload value does not overflow the counter. */
+        if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )
+        {
+            xExpectedIdleTime = xMaximumPossibleSuppressedTicks;
+        }
+
+        /* Enter a critical section but don't use the taskENTER_CRITICAL()
+         * method as that will mask interrupts that should exit sleep mode. */
+        __disable_interrupt();
+        __DSB();
+        __ISB();
+
+        /* If a context switch is pending or a task is waiting for the scheduler
+         * to be unsuspended then abandon the low power entry. */
+        if( eTaskConfirmSleepModeStatus() == eAbortSleep )
+        {
+            /* Re-enable interrupts - see comments above the __disable_interrupt()
+             * call above. */
+            __enable_interrupt();
+        }
+        else
+        {
+            /* Stop the SysTick momentarily.  The time the SysTick is stopped for
+             * is accounted for as best it can be, but using the tickless mode will
+             * inevitably result in some tiny drift of the time maintained by the
+             * kernel with respect to calendar time. */
+            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );
+
+            /* Use the SysTick current-value register to determine the number of
+             * SysTick decrements remaining until the next tick interrupt.  If the
+             * current-value register is zero, then there are actually
+             * ulTimerCountsForOneTick decrements remaining, not zero, because the
+             * SysTick requests the interrupt when decrementing from 1 to 0. */
+            ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;
+
+            if( ulSysTickDecrementsLeft == 0 )
+            {
+                ulSysTickDecrementsLeft = ulTimerCountsForOneTick;
+            }
+
+            /* Calculate the reload value required to wait xExpectedIdleTime
+             * tick periods.  -1 is used because this code normally executes part
+             * way through the first tick period.  But if the SysTick IRQ is now
+             * pending, then clear the IRQ, suppressing the first tick, and correct
+             * the reload value to reflect that the second tick period is already
+             * underway.  The expected idle time is always at least two ticks. */
+            ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
+
+            if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 )
+            {
+                portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT;
+                ulReloadValue -= ulTimerCountsForOneTick;
+            }
+
+            if( ulReloadValue > ulStoppedTimerCompensation )
+            {
+                ulReloadValue -= ulStoppedTimerCompensation;
+            }
+
+            /* Set the new reload value. */
+            portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
+
+            /* Clear the SysTick count flag and set the count value back to
+             * zero. */
+            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+
+            /* Restart SysTick. */
+            portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
+
+            /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can
+             * set its parameter to 0 to indicate that its implementation contains
+             * its own wait for interrupt or wait for event instruction, and so wfi
+             * should not be executed again.  However, the original expected idle
+             * time variable must remain unmodified, so a copy is taken. */
+            xModifiableIdleTime = xExpectedIdleTime;
+            configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
+
+            if( xModifiableIdleTime > 0 )
+            {
+                __DSB();
+                __WFI();
+                __ISB();
+            }
+
+            configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
+
+            /* Re-enable interrupts to allow the interrupt that brought the MCU
+             * out of sleep mode to execute immediately.  See comments above
+             * the __disable_interrupt() call above. */
+            __enable_interrupt();
+            __DSB();
+            __ISB();
+
+            /* Disable interrupts again because the clock is about to be stopped
+             * and interrupts that execute while the clock is stopped will increase
+             * any slippage between the time maintained by the RTOS and calendar
+             * time. */
+            __disable_interrupt();
+            __DSB();
+            __ISB();
+
+            /* Disable the SysTick clock without reading the
+             * portNVIC_SYSTICK_CTRL_REG register to ensure the
+             * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,
+             * the time the SysTick is stopped for is accounted for as best it can
+             * be, but using the tickless mode will inevitably result in some tiny
+             * drift of the time maintained by the kernel with respect to calendar
+             * time*/
+            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );
+
+            /* Determine whether the SysTick has already counted to zero. */
+            if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
+            {
+                uint32_t ulCalculatedLoadValue;
+
+                /* The tick interrupt ended the sleep (or is now pending), and
+                 * a new tick period has started.  Reset portNVIC_SYSTICK_LOAD_REG
+                 * with whatever remains of the new tick period. */
+                ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
+
+                /* Don't allow a tiny value, or values that have somehow
+                 * underflowed because the post sleep hook did something
+                 * that took too long or because the SysTick current-value register
+                 * is zero. */
+                if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
+                {
+                    ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
+                }
+
+                portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
+
+                /* As the pending tick will be processed as soon as this
+                 * function exits, the tick value maintained by the tick is stepped
+                 * forward by one less than the time spent waiting. */
+                ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
+            }
+            else
+            {
+                /* Something other than the tick interrupt ended the sleep. */
+
+                /* Use the SysTick current-value register to determine the
+                 * number of SysTick decrements remaining until the expected idle
+                 * time would have ended. */
+                ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;
+                #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT )
+                {
+                    /* If the SysTick is not using the core clock, the current-
+                     * value register might still be zero here.  In that case, the
+                     * SysTick didn't load from the reload register, and there are
+                     * ulReloadValue decrements remaining in the expected idle
+                     * time, not zero. */
+                    if( ulSysTickDecrementsLeft == 0 )
+                    {
+                        ulSysTickDecrementsLeft = ulReloadValue;
+                    }
+                }
+                #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */
+
+                /* Work out how long the sleep lasted rounded to complete tick
+                 * periods (not the ulReload value which accounted for part
+                 * ticks). */
+                ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft;
+
+                /* How many complete tick periods passed while the processor
+                 * was waiting? */
+                ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
+
+                /* The reload value is set to whatever fraction of a single tick
+                 * period remains. */
+                portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
+            }
+
+            /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again,
+             * then set portNVIC_SYSTICK_LOAD_REG back to its standard value.  If
+             * the SysTick is not using the core clock, temporarily configure it to
+             * use the core clock.  This configuration forces the SysTick to load
+             * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next
+             * cycle of the other clock.  Then portNVIC_SYSTICK_LOAD_REG is ready
+             * to receive the standard value immediately. */
+            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+            portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
+            #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT )
+            {
+                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+            }
+            #else
+            {
+                /* The temporary usage of the core clock has served its purpose,
+                 * as described above.  Resume usage of the other clock. */
+                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT;
+
+                if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
+                {
+                    /* The partial tick period already ended.  Be sure the SysTick
+                     * counts it only once. */
+                    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0;
+                }
+
+                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
+            }
+            #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */
+
+            /* Step the tick to account for any tick periods that elapsed. */
+            vTaskStepTick( ulCompleteTickPeriods );
+
+            /* Exit with interrupts enabled. */
+            __enable_interrupt();
+        }
+    }
+
+#endif /* configUSE_TICKLESS_IDLE */
+/*-----------------------------------------------------------*/
+
+/*
+ * Setup the systick timer to generate the tick interrupts at the required
+ * frequency.
+ */
+__weak void vPortSetupTimerInterrupt( void )
+{
+    /* Calculate the constants required to configure the tick interrupt. */
+    #if ( configUSE_TICKLESS_IDLE == 1 )
+    {
+        ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
+        xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
+        ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
+    }
+    #endif /* configUSE_TICKLESS_IDLE */
+
+    /* Stop and clear the SysTick. */
+    portNVIC_SYSTICK_CTRL_REG = 0UL;
+    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+
+    /* Configure SysTick to interrupt at the requested rate. */
+    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
+    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
+}
+/*-----------------------------------------------------------*/
+
+#if ( configASSERT_DEFINED == 1 )
+
+    void vPortValidateInterruptPriority( void )
+    {
+        uint32_t ulCurrentInterrupt;
+        uint8_t ucCurrentPriority;
+
+        /* Obtain the number of the currently executing interrupt. */
+        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );
+
+        /* Is the interrupt number a user defined interrupt? */
+        if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
+        {
+            /* Look up the interrupt's priority. */
+            ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
+
+            /* The following assertion will fail if a service routine (ISR) for
+             * an interrupt that has been assigned a priority above
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API
+             * function.  ISR safe FreeRTOS API functions must *only* be called
+             * from interrupts that have been assigned a priority at or below
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY.
+             *
+             * Numerically low interrupt priority numbers represent logically high
+             * interrupt priorities, therefore the priority of the interrupt must
+             * be set to a value equal to or numerically *higher* than
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY.
+             *
+             * Interrupts that  use the FreeRTOS API must not be left at their
+             * default priority of  zero as that is the highest possible priority,
+             * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,
+             * and  therefore also guaranteed to be invalid.
+             *
+             * FreeRTOS maintains separate thread and ISR API functions to ensure
+             * interrupt entry is as fast and simple as possible.
+             *
+             * The following links provide detailed information:
+             * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
+             * https://www.FreeRTOS.org/FAQHelp.html */
+            configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
+        }
+
+        /* Priority grouping:  The interrupt controller (NVIC) allows the bits
+         * that define each interrupt's priority to be split between bits that
+         * define the interrupt's pre-emption priority bits and bits that define
+         * the interrupt's sub-priority.  For simplicity all bits must be defined
+         * to be pre-emption priority bits.  The following assertion will fail if
+         * this is not the case (if some bits represent a sub-priority).
+         *
+         * If the application only uses CMSIS libraries for interrupt
+         * configuration then the correct setting can be achieved on all Cortex-M
+         * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
+         * scheduler.  Note however that some vendor specific peripheral libraries
+         * assume a non-zero priority group setting, in which cases using a value
+         * of zero will result in unpredictable behaviour. */
+        configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
+    }
+
+#endif /* configASSERT_DEFINED */
diff --git a/portable/IAR/ARM_CM4F/portasm.s b/portable/IAR/ARM_CM4F/portasm.s
index 19e596f..f4caf80 100644
--- a/portable/IAR/ARM_CM4F/portasm.s
+++ b/portable/IAR/ARM_CM4F/portasm.s
@@ -1,150 +1,149 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#include <FreeRTOSConfig.h>

-

-	RSEG    CODE:CODE(2)

-	thumb

-

-	EXTERN pxCurrentTCB

-	EXTERN vTaskSwitchContext

-

-	PUBLIC xPortPendSVHandler

-	PUBLIC vPortSVCHandler

-	PUBLIC vPortStartFirstTask

-	PUBLIC vPortEnableVFP

-

-

-/*-----------------------------------------------------------*/

-

-xPortPendSVHandler:

-	mrs r0, psp

-	isb

-	/* Get the location of the current TCB. */

-	ldr	r3, =pxCurrentTCB

-	ldr	r2, [r3]

-

-	/* Is the task using the FPU context?  If so, push high vfp registers. */

-	tst r14, #0x10

-	it eq

-	vstmdbeq r0!, {s16-s31}

-

-	/* Save the core registers. */

-	stmdb r0!, {r4-r11, r14}

-

-	/* Save the new top of stack into the first member of the TCB. */

-	str r0, [r2]

-

-	stmdb sp!, {r0, r3}

-	mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-	msr basepri, r0

-	dsb

-	isb

-	bl vTaskSwitchContext

-	mov r0, #0

-	msr basepri, r0

-	ldmia sp!, {r0, r3}

-

-	/* The first item in pxCurrentTCB is the task top of stack. */

-	ldr r1, [r3]

-	ldr r0, [r1]

-

-	/* Pop the core registers. */

-	ldmia r0!, {r4-r11, r14}

-

-	/* Is the task using the FPU context?  If so, pop the high vfp registers

-	too. */

-	tst r14, #0x10

-	it eq

-	vldmiaeq r0!, {s16-s31}

-

-	msr psp, r0

-	isb

-	#ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */

-		#if WORKAROUND_PMU_CM001 == 1

-			push { r14 }

-			pop { pc }

-		#endif

-	#endif

-

-	bx r14

-

-

-/*-----------------------------------------------------------*/

-

-vPortSVCHandler:

-	/* Get the location of the current TCB. */

-	ldr	r3, =pxCurrentTCB

-	ldr r1, [r3]

-	ldr r0, [r1]

-	/* Pop the core registers. */

-	ldmia r0!, {r4-r11, r14}

-	msr psp, r0

-	isb

-	mov r0, #0

-	msr	basepri, r0

-	bx r14

-

-/*-----------------------------------------------------------*/

-

-vPortStartFirstTask

-	/* Use the NVIC offset register to locate the stack. */

-	ldr r0, =0xE000ED08

-	ldr r0, [r0]

-	ldr r0, [r0]

-	/* Set the msp back to the start of the stack. */

-	msr msp, r0

-	/* Clear the bit that indicates the FPU is in use in case the FPU was used

-	before the scheduler was started - which would otherwise result in the

-	unnecessary leaving of space in the SVC stack for lazy saving of FPU

-	registers. */

-	mov r0, #0

-	msr control, r0

-	/* Call SVC to start the first task. */

-	cpsie i

-	cpsie f

-	dsb

-	isb

-	svc 0

-

-/*-----------------------------------------------------------*/

-

-vPortEnableVFP:

-	/* The FPU enable bits are in the CPACR. */

-	ldr.w r0, =0xE000ED88

-	ldr	r1, [r0]

-

-	/* Enable CP10 and CP11 coprocessors, then save back. */

-	orr	r1, r1, #( 0xf << 20 )

-	str r1, [r0]

-	bx	r14

-

-

-

-	END

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#include <FreeRTOSConfig.h>
+
+    RSEG    CODE:CODE(2)
+    thumb
+
+    EXTERN pxCurrentTCB
+    EXTERN vTaskSwitchContext
+
+    PUBLIC xPortPendSVHandler
+    PUBLIC vPortSVCHandler
+    PUBLIC vPortStartFirstTask
+    PUBLIC vPortEnableVFP
+
+
+/*-----------------------------------------------------------*/
+
+xPortPendSVHandler:
+    mrs r0, psp
+    isb
+    /* Get the location of the current TCB. */
+    ldr r3, =pxCurrentTCB
+    ldr r2, [r3]
+
+    /* Is the task using the FPU context?  If so, push high vfp registers. */
+    tst r14, #0x10
+    it eq
+    vstmdbeq r0!, {s16-s31}
+
+    /* Save the core registers. */
+    stmdb r0!, {r4-r11, r14}
+
+    /* Save the new top of stack into the first member of the TCB. */
+    str r0, [r2]
+
+    stmdb sp!, {r0, r3}
+    mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r0
+    dsb
+    isb
+    bl vTaskSwitchContext
+    mov r0, #0
+    msr basepri, r0
+    ldmia sp!, {r0, r3}
+
+    /* The first item in pxCurrentTCB is the task top of stack. */
+    ldr r1, [r3]
+    ldr r0, [r1]
+
+    /* Pop the core registers. */
+    ldmia r0!, {r4-r11, r14}
+
+    /* Is the task using the FPU context?  If so, pop the high vfp registers
+    too. */
+    tst r14, #0x10
+    it eq
+    vldmiaeq r0!, {s16-s31}
+
+    msr psp, r0
+    isb
+    #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */
+        #if WORKAROUND_PMU_CM001 == 1
+            push { r14 }
+            pop { pc }
+        #endif
+    #endif
+
+    bx r14
+
+
+/*-----------------------------------------------------------*/
+
+vPortSVCHandler:
+    /* Get the location of the current TCB. */
+    ldr r3, =pxCurrentTCB
+    ldr r1, [r3]
+    ldr r0, [r1]
+    /* Pop the core registers. */
+    ldmia r0!, {r4-r11, r14}
+    msr psp, r0
+    isb
+    mov r0, #0
+    msr basepri, r0
+    bx r14
+
+/*-----------------------------------------------------------*/
+
+vPortStartFirstTask
+    /* Use the NVIC offset register to locate the stack. */
+    ldr r0, =0xE000ED08
+    ldr r0, [r0]
+    ldr r0, [r0]
+    /* Set the msp back to the start of the stack. */
+    msr msp, r0
+    /* Clear the bit that indicates the FPU is in use in case the FPU was used
+    before the scheduler was started - which would otherwise result in the
+    unnecessary leaving of space in the SVC stack for lazy saving of FPU
+    registers. */
+    mov r0, #0
+    msr control, r0
+    /* Call SVC to start the first task. */
+    cpsie i
+    cpsie f
+    dsb
+    isb
+    svc 0
+
+/*-----------------------------------------------------------*/
+
+vPortEnableVFP:
+    /* The FPU enable bits are in the CPACR. */
+    ldr.w r0, =0xE000ED88
+    ldr r1, [r0]
+
+    /* Enable CP10 and CP11 coprocessors, then save back. */
+    orr r1, r1, #( 0xf << 20 )
+    str r1, [r0]
+    bx  r14
+
+
+
+    END
diff --git a/portable/IAR/ARM_CM4F/portmacro.h b/portable/IAR/ARM_CM4F/portmacro.h
index bbe9dfe..e6c8726 100644
--- a/portable/IAR/ARM_CM4F/portmacro.h
+++ b/portable/IAR/ARM_CM4F/portmacro.h
@@ -1,207 +1,207 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-    #define PORTMACRO_H

-

-    #ifdef __cplusplus

-        extern "C" {

-    #endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* IAR includes. */

-    #include <intrinsics.h>

-

-/* Type definitions. */

-    #define portCHAR          char

-    #define portFLOAT         float

-    #define portDOUBLE        double

-    #define portLONG          long

-    #define portSHORT         short

-    #define portSTACK_TYPE    uint32_t

-    #define portBASE_TYPE     long

-

-    typedef portSTACK_TYPE   StackType_t;

-    typedef long             BaseType_t;

-    typedef unsigned long    UBaseType_t;

-

-    #if ( configUSE_16_BIT_TICKS == 1 )

-        typedef uint16_t     TickType_t;

-        #define portMAX_DELAY              ( TickType_t ) 0xffff

-    #else

-        typedef uint32_t     TickType_t;

-        #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL

-

-/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

- * not need to be guarded with a critical section. */

-        #define portTICK_TYPE_IS_ATOMIC    1

-    #endif

-/*-----------------------------------------------------------*/

-

-/* Architecture specifics. */

-    #define portSTACK_GROWTH      ( -1 )

-    #define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-    #define portBYTE_ALIGNMENT    8

-/*-----------------------------------------------------------*/

-

-/* Compiler directives. */

-    #define portWEAK_SYMBOL    __attribute__( ( weak ) )

-

-/*-----------------------------------------------------------*/

-

-

-/* Scheduler utilities. */

-    #define portYIELD()                                 \

-    {                                                   \

-        /* Set a PendSV to request a context switch. */ \

-        portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \

-        __DSB();                                        \

-        __ISB();                                        \

-    }

-

-    #define portNVIC_INT_CTRL_REG     ( *( ( volatile uint32_t * ) 0xe000ed04 ) )

-    #define portNVIC_PENDSVSET_BIT    ( 1UL << 28UL )

-    #define portEND_SWITCHING_ISR( xSwitchRequired )    do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 )

-    #define portYIELD_FROM_ISR( x )                     portEND_SWITCHING_ISR( x )

-

-/*-----------------------------------------------------------*/

-

-/* Architecture specific optimisations. */

-    #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

-        #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1

-    #endif

-

-    #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )

-

-/* Check the configuration. */

-        #if ( configMAX_PRIORITIES > 32 )

-            #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.

-        #endif

-

-/* Store/clear the ready priorities in a bit map. */

-        #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )    ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

-        #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities )     ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

-

-/*-----------------------------------------------------------*/

-

-        #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )    uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) )

-

-    #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-/*-----------------------------------------------------------*/

-

-/* Critical section management. */

-    extern void vPortEnterCritical( void );

-    extern void vPortExitCritical( void );

-

-    #define portDISABLE_INTERRUPTS()                           \

-    {                                                          \

-        __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \

-        __DSB();                                               \

-        __ISB();                                               \

-    }

-

-    #define portENABLE_INTERRUPTS()                   __set_BASEPRI( 0 )

-    #define portENTER_CRITICAL()                      vPortEnterCritical()

-    #define portEXIT_CRITICAL()                       vPortExitCritical()

-    #define portSET_INTERRUPT_MASK_FROM_ISR()         __get_BASEPRI(); portDISABLE_INTERRUPTS()

-    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    __set_BASEPRI( x )

-/*-----------------------------------------------------------*/

-

-/* Tickless idle/low power functionality. */

-    #ifndef portSUPPRESS_TICKS_AND_SLEEP

-        extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );

-        #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )    vPortSuppressTicksAndSleep( xExpectedIdleTime )

-    #endif

-

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site.  These are

- * not necessary for to use this port.  They are defined so the common demo files

- * (which build with all the ports) will build. */

-    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )

-    #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )

-/*-----------------------------------------------------------*/

-

-    #ifdef configASSERT

-        void vPortValidateInterruptPriority( void );

-        #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()    vPortValidateInterruptPriority()

-    #endif

-

-/* portNOP() is not required by this port. */

-    #define portNOP()

-

-    #define portINLINE              __inline

-

-    #ifndef portFORCE_INLINE

-        #define portFORCE_INLINE    inline __attribute__( ( always_inline ) )

-    #endif

-

-/*-----------------------------------------------------------*/

-

-    portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )

-    {

-        uint32_t ulCurrentInterrupt;

-        BaseType_t xReturn;

-

-        /* Obtain the number of the currently executing interrupt. */

-        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );

-

-        if( ulCurrentInterrupt == 0 )

-        {

-            xReturn = pdFALSE;

-        }

-        else

-        {

-            xReturn = pdTRUE;

-        }

-

-        return xReturn;

-    }

-

-/*-----------------------------------------------------------*/

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

- * the source code because to do so would cause other compilers to generate

- * warnings. */

-    #pragma diag_suppress=Pe191

-    #pragma diag_suppress=Pa082

-

-    #ifdef __cplusplus

-        }

-    #endif

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+    #define PORTMACRO_H
+
+    #ifdef __cplusplus
+        extern "C" {
+    #endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* IAR includes. */
+    #include <intrinsics.h>
+
+/* Type definitions. */
+    #define portCHAR          char
+    #define portFLOAT         float
+    #define portDOUBLE        double
+    #define portLONG          long
+    #define portSHORT         short
+    #define portSTACK_TYPE    uint32_t
+    #define portBASE_TYPE     long
+
+    typedef portSTACK_TYPE   StackType_t;
+    typedef long             BaseType_t;
+    typedef unsigned long    UBaseType_t;
+
+    #if ( configUSE_16_BIT_TICKS == 1 )
+        typedef uint16_t     TickType_t;
+        #define portMAX_DELAY              ( TickType_t ) 0xffff
+    #else
+        typedef uint32_t     TickType_t;
+        #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL
+
+/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+ * not need to be guarded with a critical section. */
+        #define portTICK_TYPE_IS_ATOMIC    1
+    #endif
+/*-----------------------------------------------------------*/
+
+/* Architecture specifics. */
+    #define portSTACK_GROWTH      ( -1 )
+    #define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+    #define portBYTE_ALIGNMENT    8
+/*-----------------------------------------------------------*/
+
+/* Compiler directives. */
+    #define portWEAK_SYMBOL    __attribute__( ( weak ) )
+
+/*-----------------------------------------------------------*/
+
+
+/* Scheduler utilities. */
+    #define portYIELD()                                 \
+    {                                                   \
+        /* Set a PendSV to request a context switch. */ \
+        portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \
+        __DSB();                                        \
+        __ISB();                                        \
+    }
+
+    #define portNVIC_INT_CTRL_REG     ( *( ( volatile uint32_t * ) 0xe000ed04 ) )
+    #define portNVIC_PENDSVSET_BIT    ( 1UL << 28UL )
+    #define portEND_SWITCHING_ISR( xSwitchRequired )    do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 )
+    #define portYIELD_FROM_ISR( x )                     portEND_SWITCHING_ISR( x )
+
+/*-----------------------------------------------------------*/
+
+/* Architecture specific optimisations. */
+    #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
+        #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1
+    #endif
+
+    #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )
+
+/* Check the configuration. */
+        #if ( configMAX_PRIORITIES > 32 )
+            #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.
+        #endif
+
+/* Store/clear the ready priorities in a bit map. */
+        #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )    ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
+        #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities )     ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
+
+/*-----------------------------------------------------------*/
+
+        #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )    uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) )
+
+    #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+/*-----------------------------------------------------------*/
+
+/* Critical section management. */
+    extern void vPortEnterCritical( void );
+    extern void vPortExitCritical( void );
+
+    #define portDISABLE_INTERRUPTS()                           \
+    {                                                          \
+        __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \
+        __DSB();                                               \
+        __ISB();                                               \
+    }
+
+    #define portENABLE_INTERRUPTS()                   __set_BASEPRI( 0 )
+    #define portENTER_CRITICAL()                      vPortEnterCritical()
+    #define portEXIT_CRITICAL()                       vPortExitCritical()
+    #define portSET_INTERRUPT_MASK_FROM_ISR()         __get_BASEPRI(); portDISABLE_INTERRUPTS()
+    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    __set_BASEPRI( x )
+/*-----------------------------------------------------------*/
+
+/* Tickless idle/low power functionality. */
+    #ifndef portSUPPRESS_TICKS_AND_SLEEP
+        extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
+        #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )    vPortSuppressTicksAndSleep( xExpectedIdleTime )
+    #endif
+
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site.  These are
+ * not necessary for to use this port.  They are defined so the common demo files
+ * (which build with all the ports) will build. */
+    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )
+    #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )
+/*-----------------------------------------------------------*/
+
+    #ifdef configASSERT
+        void vPortValidateInterruptPriority( void );
+        #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()    vPortValidateInterruptPriority()
+    #endif
+
+/* portNOP() is not required by this port. */
+    #define portNOP()
+
+    #define portINLINE              __inline
+
+    #ifndef portFORCE_INLINE
+        #define portFORCE_INLINE    inline __attribute__( ( always_inline ) )
+    #endif
+
+/*-----------------------------------------------------------*/
+
+    portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
+    {
+        uint32_t ulCurrentInterrupt;
+        BaseType_t xReturn;
+
+        /* Obtain the number of the currently executing interrupt. */
+        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );
+
+        if( ulCurrentInterrupt == 0 )
+        {
+            xReturn = pdFALSE;
+        }
+        else
+        {
+            xReturn = pdTRUE;
+        }
+
+        return xReturn;
+    }
+
+/*-----------------------------------------------------------*/
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+ * the source code because to do so would cause other compilers to generate
+ * warnings. */
+    #pragma diag_suppress=Pe191
+    #pragma diag_suppress=Pa082
+
+    #ifdef __cplusplus
+        }
+    #endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CM4F_MPU/port.c b/portable/IAR/ARM_CM4F_MPU/port.c
index 3a9eb7b..2f4d1b9 100644
--- a/portable/IAR/ARM_CM4F_MPU/port.c
+++ b/portable/IAR/ARM_CM4F_MPU/port.c
@@ -1,837 +1,837 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

-* Implementation of functions defined in portable.h for the ARM CM4F MPU port.

-*----------------------------------------------------------*/

-

-/* IAR includes. */

-#include <intrinsics.h>

-

-/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining

- * all the API functions to use the MPU wrappers.  That should only be done when

- * task.h is included from an application file. */

-#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-#ifndef __ARMVFP__

-    #error This port can only be used when the project options are configured to enable hardware floating point support.

-#endif

-

-#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )

-    #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */

-#endif

-

-#ifndef configSYSTICK_CLOCK_HZ

-    #define configSYSTICK_CLOCK_HZ      configCPU_CLOCK_HZ

-    /* Ensure the SysTick is clocked at the same frequency as the core. */

-    #define portNVIC_SYSTICK_CLK_BIT    ( 1UL << 2UL )

-#else

-

-/* The way the SysTick is clocked is not modified in case it is not the same

- * as the core. */

-    #define portNVIC_SYSTICK_CLK_BIT    ( 0 )

-#endif

-

-#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS

-    #warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security."

-    #define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS    1

-#endif

-

-/* Constants required to manipulate the core.  Registers first... */

-#define portNVIC_SYSTICK_CTRL_REG                 ( *( ( volatile uint32_t * ) 0xe000e010 ) )

-#define portNVIC_SYSTICK_LOAD_REG                 ( *( ( volatile uint32_t * ) 0xe000e014 ) )

-#define portNVIC_SYSTICK_CURRENT_VALUE_REG        ( *( ( volatile uint32_t * ) 0xe000e018 ) )

-#define portNVIC_SHPR3_REG                        ( *( ( volatile uint32_t * ) 0xe000ed20 ) )

-#define portNVIC_SHPR2_REG                        ( *( ( volatile uint32_t * ) 0xe000ed1c ) )

-#define portNVIC_SYS_CTRL_STATE_REG               ( *( ( volatile uint32_t * ) 0xe000ed24 ) )

-#define portNVIC_MEM_FAULT_ENABLE                 ( 1UL << 16UL )

-

-/* Constants required to access and manipulate the MPU. */

-#define portMPU_TYPE_REG                          ( *( ( volatile uint32_t * ) 0xe000ed90 ) )

-#define portMPU_REGION_BASE_ADDRESS_REG           ( *( ( volatile uint32_t * ) 0xe000ed9C ) )

-#define portMPU_REGION_ATTRIBUTE_REG              ( *( ( volatile uint32_t * ) 0xe000edA0 ) )

-#define portMPU_CTRL_REG                          ( *( ( volatile uint32_t * ) 0xe000ed94 ) )

-#define portEXPECTED_MPU_TYPE_VALUE               ( configTOTAL_MPU_REGIONS << 8UL )

-#define portMPU_ENABLE                            ( 0x01UL )

-#define portMPU_BACKGROUND_ENABLE                 ( 1UL << 2UL )

-#define portPRIVILEGED_EXECUTION_START_ADDRESS    ( 0UL )

-#define portMPU_REGION_VALID                      ( 0x10UL )

-#define portMPU_REGION_ENABLE                     ( 0x01UL )

-#define portPERIPHERALS_START_ADDRESS             0x40000000UL

-#define portPERIPHERALS_END_ADDRESS               0x5FFFFFFFUL

-

-/* ...then bits in the registers. */

-#define portNVIC_SYSTICK_INT_BIT                  ( 1UL << 1UL )

-#define portNVIC_SYSTICK_ENABLE_BIT               ( 1UL << 0UL )

-#define portNVIC_SYSTICK_COUNT_FLAG_BIT           ( 1UL << 16UL )

-#define portNVIC_PENDSVCLEAR_BIT                  ( 1UL << 27UL )

-#define portNVIC_PEND_SYSTICK_CLEAR_BIT           ( 1UL << 25UL )

-

-/* Constants used to detect Cortex-M7 r0p0 and r0p1 cores, and ensure

- * that a work around is active for errata 837070. */

-#define portCPUID                                 ( *( ( volatile uint32_t * ) 0xE000ed00 ) )

-#define portCORTEX_M7_r0p1_ID                     ( 0x410FC271UL )

-#define portCORTEX_M7_r0p0_ID                     ( 0x410FC270UL )

-

-#define portNVIC_PENDSV_PRI                       ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )

-#define portNVIC_SYSTICK_PRI                      ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )

-#define portNVIC_SVC_PRI                          ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL )

-

-/* Constants required to check the validity of an interrupt priority. */

-#define portFIRST_USER_INTERRUPT_NUMBER           ( 16 )

-#define portNVIC_IP_REGISTERS_OFFSET_16           ( 0xE000E3F0 )

-#define portAIRCR_REG                             ( *( ( volatile uint32_t * ) 0xE000ED0C ) )

-#define portMAX_8_BIT_VALUE                       ( ( uint8_t ) 0xff )

-#define portTOP_BIT_OF_BYTE                       ( ( uint8_t ) 0x80 )

-#define portMAX_PRIGROUP_BITS                     ( ( uint8_t ) 7 )

-#define portPRIORITY_GROUP_MASK                   ( 0x07UL << 8UL )

-#define portPRIGROUP_SHIFT                        ( 8UL )

-

-/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */

-#define portVECTACTIVE_MASK                       ( 0xFFUL )

-

-/* Constants required to manipulate the VFP. */

-#define portFPCCR                                 ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */

-#define portASPEN_AND_LSPEN_BITS                  ( 0x3UL << 30UL )

-

-/* Constants required to set up the initial stack. */

-#define portINITIAL_XPSR                          ( 0x01000000 )

-#define portINITIAL_EXC_RETURN                    ( 0xfffffffd )

-#define portINITIAL_CONTROL_IF_UNPRIVILEGED       ( 0x03 )

-#define portINITIAL_CONTROL_IF_PRIVILEGED         ( 0x02 )

-

-/* Offsets in the stack to the parameters when inside the SVC handler. */

-#define portOFFSET_TO_PC                          ( 6 )

-

-/* The systick is a 24-bit counter. */

-#define portMAX_24_BIT_NUMBER                     ( 0xffffffUL )

-

-/* A fiddle factor to estimate the number of SysTick counts that would have

- * occurred while the SysTick counter is stopped during tickless idle

- * calculations. */

-#define portMISSED_COUNTS_FACTOR                  ( 45UL )

-

-/* For strict compliance with the Cortex-M spec the task start address should

- * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */

-#define portSTART_ADDRESS_MASK                    ( ( StackType_t ) 0xfffffffeUL )

-

-/*

- * Configure a number of standard MPU regions that are used by all tasks.

- */

-static void prvSetupMPU( void ) PRIVILEGED_FUNCTION;

-

-/*

- * Return the smallest MPU region size that a given number of bytes will fit

- * into.  The region size is returned as the value that should be programmed

- * into the region attribute register for that region.

- */

-static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION;

-

-/*

- * Setup the timer to generate the tick interrupts.  The implementation in this

- * file is weak to allow application writers to change the timer used to

- * generate the tick interrupt.

- */

-void vPortSetupTimerInterrupt( void );

-

-/*

- * Exception handlers.

- */

-void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION;

-

-/*

- * Start first task is a separate function so it can be tested in isolation.

- */

-extern void vPortStartFirstTask( void ) PRIVILEGED_FUNCTION;

-

-/*

- * Turn the VFP on.

- */

-extern void vPortEnableVFP( void );

-

-/*

- * The C portion of the SVC handler.

- */

-void vPortSVCHandler_C( uint32_t * pulParam );

-

-/*

- * Called from the SVC handler used to start the scheduler.

- */

-extern void vPortRestoreContextOfFirstTask( void ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Enter critical section.

- */

-#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )

-    void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL;

-#else

-    void vPortEnterCritical( void ) PRIVILEGED_FUNCTION;

-#endif

-

-/**

- * @brief Exit from critical section.

- */

-#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )

-    void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL;

-#else

-    void vPortExitCritical( void ) PRIVILEGED_FUNCTION;

-#endif

-/*-----------------------------------------------------------*/

-

-/* Each task maintains its own interrupt status in the critical nesting

- * variable. */

-static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;

-

-/*

- * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure

- * FreeRTOS API functions are not called from interrupts that have been assigned

- * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.

- */

-#if ( configASSERT_DEFINED == 1 )

-    static uint8_t ucMaxSysCallPriority = 0;

-    static uint32_t ulMaxPRIGROUPValue = 0;

-    static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;

-#endif /* configASSERT_DEFINED */

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,

-                                     TaskFunction_t pxCode,

-                                     void * pvParameters,

-                                     BaseType_t xRunPrivileged )

-{

-    /* Simulate the stack frame as it would be created by a context switch

-     * interrupt. */

-

-    /* Offset added to account for the way the MCU uses the stack on entry/exit

-     * of interrupts, and to ensure alignment. */

-    pxTopOfStack--;

-

-    *pxTopOfStack = portINITIAL_XPSR;                                    /* xPSR */

-    pxTopOfStack--;

-    *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */

-    pxTopOfStack--;

-    *pxTopOfStack = ( StackType_t ) 0;                                   /* LR */

-

-    /* Save code space by skipping register initialisation. */

-    pxTopOfStack -= 5;                            /* R12, R3, R2 and R1. */

-    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-

-    /* A save method is being used that requires each task to maintain its

-     * own exec return value. */

-    pxTopOfStack--;

-    *pxTopOfStack = portINITIAL_EXC_RETURN;

-

-    pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */

-

-    if( xRunPrivileged == pdTRUE )

-    {

-        *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED;

-    }

-    else

-    {

-        *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED;

-    }

-

-    return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-void vPortSVCHandler_C( uint32_t * pulParam )

-{

-    uint8_t ucSVCNumber;

-    uint32_t ulPC;

-

-    #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )

-        extern uint32_t __syscalls_flash_start__[];

-        extern uint32_t __syscalls_flash_end__[];

-    #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */

-

-    /* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first

-     * argument (r0) is pulParam[ 0 ]. */

-    ulPC = pulParam[ portOFFSET_TO_PC ];

-    ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ];

-

-    switch( ucSVCNumber )

-    {

-        case portSVC_START_SCHEDULER:

-            portNVIC_SHPR2_REG |= portNVIC_SVC_PRI;

-            vPortRestoreContextOfFirstTask();

-            break;

-

-        case portSVC_YIELD:

-            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;

-

-            /* Barriers are normally not required

-             * but do ensure the code is completely

-             * within the specified behaviour for the

-             * architecture. */

-            __asm volatile ( "dsb" ::: "memory" );

-            __asm volatile ( "isb" );

-

-            break;

-

-            #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )

-                case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the

-                                               * svc was raised from any of the

-                                               * system calls. */

-

-                    if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) &&

-                        ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) )

-                    {

-                        __asm volatile

-                        (

-                            "	mrs r1, control		\n"/* Obtain current control value. */

-                            "	bic r1, r1, #1		\n"/* Set privilege bit. */

-                            "	msr control, r1		\n"/* Write back new control value. */

-                            ::: "r1", "memory"

-                        );

-                    }

-

-                    break;

-            #else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */

-                case portSVC_RAISE_PRIVILEGE:

-                    __asm volatile

-                    (

-                        "	mrs r1, control		\n"/* Obtain current control value. */

-                        "	bic r1, r1, #1		\n"/* Set privilege bit. */

-                        "	msr control, r1		\n"/* Write back new control value. */

-                        ::: "r1", "memory"

-                    );

-                    break;

-                    #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */

-

-                default: /* Unknown SVC call. */

-                    break;

-    }

-}

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-BaseType_t xPortStartScheduler( void )

-{

-    /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.

-     * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */

-    configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );

-

-    /* Errata 837070 workaround must only be enabled on Cortex-M7 r0p0

-     * and r0p1 cores. */

-    #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 )

-        configASSERT( ( portCPUID == portCORTEX_M7_r0p1_ID ) || ( portCPUID == portCORTEX_M7_r0p0_ID ) );

-    #else

-        /* When using this port on a Cortex-M7 r0p0 or r0p1 core, define

-         * configENABLE_ERRATA_837070_WORKAROUND to 1 in your

-         * FreeRTOSConfig.h. */

-        configASSERT( portCPUID != portCORTEX_M7_r0p1_ID );

-        configASSERT( portCPUID != portCORTEX_M7_r0p0_ID );

-    #endif

-

-    #if ( configASSERT_DEFINED == 1 )

-        {

-            volatile uint32_t ulOriginalPriority;

-            volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );

-            volatile uint8_t ucMaxPriorityValue;

-

-            /* Determine the maximum priority from which ISR safe FreeRTOS API

-             * functions can be called.  ISR safe functions are those that end in

-             * "FromISR".  FreeRTOS maintains separate thread and ISR API functions to

-             * ensure interrupt entry is as fast and simple as possible.

-             *

-             * Save the interrupt priority value that is about to be clobbered. */

-            ulOriginalPriority = *pucFirstUserPriorityRegister;

-

-            /* Determine the number of priority bits available.  First write to all

-             * possible bits. */

-            *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;

-

-            /* Read the value back to see how many bits stuck. */

-            ucMaxPriorityValue = *pucFirstUserPriorityRegister;

-

-            /* Use the same mask on the maximum system call priority. */

-            ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;

-

-            /* Calculate the maximum acceptable priority group value for the number

-             * of bits read back. */

-            ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;

-

-            while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )

-            {

-                ulMaxPRIGROUPValue--;

-                ucMaxPriorityValue <<= ( uint8_t ) 0x01;

-            }

-

-            #ifdef __NVIC_PRIO_BITS

-                {

-                    /* Check the CMSIS configuration that defines the number of

-                     * priority bits matches the number of priority bits actually queried

-                     * from the hardware. */

-                    configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );

-                }

-            #endif

-

-            #ifdef configPRIO_BITS

-                {

-                    /* Check the FreeRTOS configuration that defines the number of

-                     * priority bits matches the number of priority bits actually queried

-                     * from the hardware. */

-                    configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );

-                }

-            #endif

-

-            /* Shift the priority group value back to its position within the AIRCR

-             * register. */

-            ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;

-            ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;

-

-            /* Restore the clobbered interrupt priority register to its original

-             * value. */

-            *pucFirstUserPriorityRegister = ulOriginalPriority;

-        }

-    #endif /* configASSERT_DEFINED */

-

-    /* Make PendSV and SysTick the lowest priority interrupts. */

-    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;

-    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;

-

-    /* Configure the regions in the MPU that are common to all tasks. */

-    prvSetupMPU();

-

-    /* Start the timer that generates the tick ISR.  Interrupts are disabled

-     * here already. */

-    vPortSetupTimerInterrupt();

-

-    /* Initialise the critical nesting count ready for the first task. */

-    uxCriticalNesting = 0;

-

-    /* Ensure the VFP is enabled - it should be anyway. */

-    vPortEnableVFP();

-

-    /* Lazy save always. */

-    *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;

-

-    /* Start the first task. */

-    vPortStartFirstTask();

-

-    /* Should not get here! */

-    return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-    /* Not implemented in ports where there is nothing to return to.

-     * Artificially force an assert. */

-    configASSERT( uxCriticalNesting == 1000UL );

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )

-    if( portIS_PRIVILEGED() == pdFALSE )

-    {

-        portRAISE_PRIVILEGE();

-        portMEMORY_BARRIER();

-

-        portDISABLE_INTERRUPTS();

-        uxCriticalNesting++;

-        /* This is not the interrupt safe version of the enter critical function so

-         * assert() if it is being called from an interrupt context.  Only API

-         * functions that end in "FromISR" can be used in an interrupt.  Only assert if

-         * the critical nesting count is 1 to protect against recursive calls if the

-         * assert function also uses a critical section. */

-        if( uxCriticalNesting == 1 )

-        {

-            configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );

-        }

-        portMEMORY_BARRIER();

-

-        portRESET_PRIVILEGE();

-        portMEMORY_BARRIER();

-    }

-    else

-    {

-        portDISABLE_INTERRUPTS();

-        uxCriticalNesting++;

-        /* This is not the interrupt safe version of the enter critical function so

-         * assert() if it is being called from an interrupt context.  Only API

-         * functions that end in "FromISR" can be used in an interrupt.  Only assert if

-         * the critical nesting count is 1 to protect against recursive calls if the

-         * assert function also uses a critical section. */

-        if( uxCriticalNesting == 1 )

-        {

-            configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );

-        }

-    }

-#else

-    portDISABLE_INTERRUPTS();

-    uxCriticalNesting++;

-    /* This is not the interrupt safe version of the enter critical function so

-     * assert() if it is being called from an interrupt context.  Only API

-     * functions that end in "FromISR" can be used in an interrupt.  Only assert if

-     * the critical nesting count is 1 to protect against recursive calls if the

-     * assert function also uses a critical section. */

-    if( uxCriticalNesting == 1 )

-    {

-        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );

-    }

-#endif

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )

-    if( portIS_PRIVILEGED() == pdFALSE )

-    {

-        portRAISE_PRIVILEGE();

-        portMEMORY_BARRIER();

-

-        configASSERT( uxCriticalNesting );

-        uxCriticalNesting--;

-

-        if( uxCriticalNesting == 0 )

-        {

-            portENABLE_INTERRUPTS();

-        }

-        portMEMORY_BARRIER();

-

-        portRESET_PRIVILEGE();

-        portMEMORY_BARRIER();

-    }

-    else

-    {

-        configASSERT( uxCriticalNesting );

-        uxCriticalNesting--;

-

-        if( uxCriticalNesting == 0 )

-        {

-            portENABLE_INTERRUPTS();

-        }

-    }

-#else

-    configASSERT( uxCriticalNesting );

-    uxCriticalNesting--;

-

-    if( uxCriticalNesting == 0 )

-    {

-        portENABLE_INTERRUPTS();

-    }

-#endif

-}

-/*-----------------------------------------------------------*/

-

-void xPortSysTickHandler( void )

-{

-    /* The SysTick runs at the lowest interrupt priority, so when this interrupt

-     * executes all interrupts must be unmasked.  There is therefore no need to

-     * save and then restore the interrupt mask value as its value is already

-     * known. */

-    portDISABLE_INTERRUPTS();

-    {

-        /* Increment the RTOS tick. */

-        if( xTaskIncrementTick() != pdFALSE )

-        {

-            /* A context switch is required.  Context switching is performed in

-             * the PendSV interrupt.  Pend the PendSV interrupt. */

-            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;

-        }

-    }

-    portENABLE_INTERRUPTS();

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Setup the systick timer to generate the tick interrupts at the required

- * frequency.

- */

-__weak void vPortSetupTimerInterrupt( void )

-{

-    /* Stop and clear the SysTick. */

-    portNVIC_SYSTICK_CTRL_REG = 0UL;

-    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-

-    /* Configure SysTick to interrupt at the requested rate. */

-    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;

-    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );

-}

-/*-----------------------------------------------------------*/

-

-static void prvSetupMPU( void )

-{

-    extern uint32_t __privileged_functions_start__[];

-    extern uint32_t __privileged_functions_end__[];

-    extern uint32_t __FLASH_segment_start__[];

-    extern uint32_t __FLASH_segment_end__[];

-    extern uint32_t __privileged_data_start__[];

-    extern uint32_t __privileged_data_end__[];

-

-    /* The only permitted number of regions are 8 or 16. */

-    configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) );

-

-    /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */

-    configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE );

-

-    /* Check the expected MPU is present. */

-    if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE )

-    {

-        /* First setup the unprivileged flash for unprivileged read only access. */

-        portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */

-                                          ( portMPU_REGION_VALID ) |

-                                          ( portUNPRIVILEGED_FLASH_REGION );

-

-        portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) |

-                                       ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) |

-                                       ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) |

-                                       ( portMPU_REGION_ENABLE );

-

-        /* Setup the privileged flash for privileged only access.  This is where

-         * the kernel code is placed. */

-        portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_functions_start__ ) | /* Base address. */

-                                          ( portMPU_REGION_VALID ) |

-                                          ( portPRIVILEGED_FLASH_REGION );

-

-        portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) |

-                                       ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) |

-                                       ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __privileged_functions_start__ ) ) |

-                                       ( portMPU_REGION_ENABLE );

-

-        /* Setup the privileged data RAM region.  This is where the kernel data

-         * is placed. */

-        portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */

-                                          ( portMPU_REGION_VALID ) |

-                                          ( portPRIVILEGED_RAM_REGION );

-

-        portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) |

-                                       ( portMPU_REGION_EXECUTE_NEVER ) |

-                                       ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) |

-                                       prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) |

-                                       ( portMPU_REGION_ENABLE );

-

-        /* By default allow everything to access the general peripherals.  The

-         * system peripherals and registers are protected. */

-        portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) |

-                                          ( portMPU_REGION_VALID ) |

-                                          ( portGENERAL_PERIPHERALS_REGION );

-

-        portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) |

-                                       ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) |

-                                       ( portMPU_REGION_ENABLE );

-

-        /* Enable the memory fault exception. */

-        portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE;

-

-        /* Enable the MPU with the background region configured. */

-        portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE );

-    }

-}

-/*-----------------------------------------------------------*/

-

-static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes )

-{

-    uint32_t ulRegionSize, ulReturnValue = 4;

-

-    /* 32 is the smallest region size, 31 is the largest valid value for

-     * ulReturnValue. */

-    for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) )

-    {

-        if( ulActualSizeInBytes <= ulRegionSize )

-        {

-            break;

-        }

-        else

-        {

-            ulReturnValue++;

-        }

-    }

-

-    /* Shift the code by one before returning so it can be written directly

-     * into the the correct bit position of the attribute register. */

-    return( ulReturnValue << 1UL );

-}

-/*-----------------------------------------------------------*/

-

-void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,

-                                const struct xMEMORY_REGION * const xRegions,

-                                StackType_t * pxBottomOfStack,

-                                uint32_t ulStackDepth )

-{

-    extern uint32_t __SRAM_segment_start__[];

-    extern uint32_t __SRAM_segment_end__[];

-    extern uint32_t __privileged_data_start__[];

-    extern uint32_t __privileged_data_end__[];

-    int32_t lIndex;

-    uint32_t ul;

-

-    if( xRegions == NULL )

-    {

-        /* No MPU regions are specified so allow access to all RAM. */

-        xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress =

-            ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */

-            ( portMPU_REGION_VALID ) |

-            ( portSTACK_REGION ); /* Region number. */

-

-        xMPUSettings->xRegion[ 0 ].ulRegionAttribute =

-            ( portMPU_REGION_READ_WRITE ) |

-            ( portMPU_REGION_EXECUTE_NEVER ) |

-            ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) |

-            ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) |

-            ( portMPU_REGION_ENABLE );

-

-        /* Invalidate user configurable regions. */

-        for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ )

-        {

-            xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID );

-            xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL;

-        }

-    }

-    else

-    {

-        /* This function is called automatically when the task is created - in

-         * which case the stack region parameters will be valid.  At all other

-         * times the stack parameters will not be valid and it is assumed that the

-         * stack region has already been configured. */

-        if( ulStackDepth > 0 )

-        {

-            /* Define the region that allows access to the stack. */

-            xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress =

-                ( ( uint32_t ) pxBottomOfStack ) |

-                ( portMPU_REGION_VALID ) |

-                ( portSTACK_REGION ); /* Region number. */

-

-            xMPUSettings->xRegion[ 0 ].ulRegionAttribute =

-                ( portMPU_REGION_READ_WRITE ) |

-                ( portMPU_REGION_EXECUTE_NEVER ) |

-                ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) |

-                ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) |

-                ( portMPU_REGION_ENABLE );

-        }

-

-        lIndex = 0;

-

-        for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ )

-        {

-            if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL )

-            {

-                /* Translate the generic region definition contained in

-                 * xRegions into the CM4 specific MPU settings that are then

-                 * stored in xMPUSettings. */

-                xMPUSettings->xRegion[ ul ].ulRegionBaseAddress =

-                    ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) |

-                    ( portMPU_REGION_VALID ) |

-                    ( ul - 1UL ); /* Region number. */

-

-                xMPUSettings->xRegion[ ul ].ulRegionAttribute =

-                    ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) |

-                    ( xRegions[ lIndex ].ulParameters ) |

-                    ( portMPU_REGION_ENABLE );

-            }

-            else

-            {

-                /* Invalidate the region. */

-                xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID );

-                xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL;

-            }

-

-            lIndex++;

-        }

-    }

-}

-/*-----------------------------------------------------------*/

-

-#if ( configASSERT_DEFINED == 1 )

-

-    void vPortValidateInterruptPriority( void )

-    {

-        uint32_t ulCurrentInterrupt;

-        uint8_t ucCurrentPriority;

-

-        /* Obtain the number of the currently executing interrupt. */

-        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );

-

-        /* Is the interrupt number a user defined interrupt? */

-        if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )

-        {

-            /* Look up the interrupt's priority. */

-            ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];

-

-            /* The following assertion will fail if a service routine (ISR) for

-             * an interrupt that has been assigned a priority above

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API

-             * function.  ISR safe FreeRTOS API functions must *only* be called

-             * from interrupts that have been assigned a priority at or below

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY.

-             *

-             * Numerically low interrupt priority numbers represent logically high

-             * interrupt priorities, therefore the priority of the interrupt must

-             * be set to a value equal to or numerically *higher* than

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY.

-             *

-             * Interrupts that	use the FreeRTOS API must not be left at their

-             * default priority of	zero as that is the highest possible priority,

-             * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,

-             * and	therefore also guaranteed to be invalid.

-             *

-             * FreeRTOS maintains separate thread and ISR API functions to ensure

-             * interrupt entry is as fast and simple as possible.

-             *

-             * The following links provide detailed information:

-             * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html

-             * https://www.FreeRTOS.org/FAQHelp.html */

-            configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

-        }

-

-        /* Priority grouping:  The interrupt controller (NVIC) allows the bits

-         * that define each interrupt's priority to be split between bits that

-         * define the interrupt's pre-emption priority bits and bits that define

-         * the interrupt's sub-priority.  For simplicity all bits must be defined

-         * to be pre-emption priority bits.  The following assertion will fail if

-         * this is not the case (if some bits represent a sub-priority).

-         *

-         * If the application only uses CMSIS libraries for interrupt

-         * configuration then the correct setting can be achieved on all Cortex-M

-         * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the

-         * scheduler.  Note however that some vendor specific peripheral libraries

-         * assume a non-zero priority group setting, in which cases using a value

-         * of zero will result in unpredictable behaviour. */

-        configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );

-    }

-

-#endif /* configASSERT_DEFINED */

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+* Implementation of functions defined in portable.h for the ARM CM4F MPU port.
+*----------------------------------------------------------*/
+
+/* IAR includes. */
+#include <intrinsics.h>
+
+/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
+ * all the API functions to use the MPU wrappers.  That should only be done when
+ * task.h is included from an application file. */
+#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
+
+#ifndef __ARMVFP__
+    #error This port can only be used when the project options are configured to enable hardware floating point support.
+#endif
+
+#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )
+    #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
+#endif
+
+#ifndef configSYSTICK_CLOCK_HZ
+    #define configSYSTICK_CLOCK_HZ      configCPU_CLOCK_HZ
+    /* Ensure the SysTick is clocked at the same frequency as the core. */
+    #define portNVIC_SYSTICK_CLK_BIT    ( 1UL << 2UL )
+#else
+
+/* The way the SysTick is clocked is not modified in case it is not the same
+ * as the core. */
+    #define portNVIC_SYSTICK_CLK_BIT    ( 0 )
+#endif
+
+#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS
+    #warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security."
+    #define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS    1
+#endif
+
+/* Constants required to manipulate the core.  Registers first... */
+#define portNVIC_SYSTICK_CTRL_REG                 ( *( ( volatile uint32_t * ) 0xe000e010 ) )
+#define portNVIC_SYSTICK_LOAD_REG                 ( *( ( volatile uint32_t * ) 0xe000e014 ) )
+#define portNVIC_SYSTICK_CURRENT_VALUE_REG        ( *( ( volatile uint32_t * ) 0xe000e018 ) )
+#define portNVIC_SHPR3_REG                        ( *( ( volatile uint32_t * ) 0xe000ed20 ) )
+#define portNVIC_SHPR2_REG                        ( *( ( volatile uint32_t * ) 0xe000ed1c ) )
+#define portNVIC_SYS_CTRL_STATE_REG               ( *( ( volatile uint32_t * ) 0xe000ed24 ) )
+#define portNVIC_MEM_FAULT_ENABLE                 ( 1UL << 16UL )
+
+/* Constants required to access and manipulate the MPU. */
+#define portMPU_TYPE_REG                          ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
+#define portMPU_REGION_BASE_ADDRESS_REG           ( *( ( volatile uint32_t * ) 0xe000ed9C ) )
+#define portMPU_REGION_ATTRIBUTE_REG              ( *( ( volatile uint32_t * ) 0xe000edA0 ) )
+#define portMPU_CTRL_REG                          ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
+#define portEXPECTED_MPU_TYPE_VALUE               ( configTOTAL_MPU_REGIONS << 8UL )
+#define portMPU_ENABLE                            ( 0x01UL )
+#define portMPU_BACKGROUND_ENABLE                 ( 1UL << 2UL )
+#define portPRIVILEGED_EXECUTION_START_ADDRESS    ( 0UL )
+#define portMPU_REGION_VALID                      ( 0x10UL )
+#define portMPU_REGION_ENABLE                     ( 0x01UL )
+#define portPERIPHERALS_START_ADDRESS             0x40000000UL
+#define portPERIPHERALS_END_ADDRESS               0x5FFFFFFFUL
+
+/* ...then bits in the registers. */
+#define portNVIC_SYSTICK_INT_BIT                  ( 1UL << 1UL )
+#define portNVIC_SYSTICK_ENABLE_BIT               ( 1UL << 0UL )
+#define portNVIC_SYSTICK_COUNT_FLAG_BIT           ( 1UL << 16UL )
+#define portNVIC_PENDSVCLEAR_BIT                  ( 1UL << 27UL )
+#define portNVIC_PEND_SYSTICK_CLEAR_BIT           ( 1UL << 25UL )
+
+/* Constants used to detect Cortex-M7 r0p0 and r0p1 cores, and ensure
+ * that a work around is active for errata 837070. */
+#define portCPUID                                 ( *( ( volatile uint32_t * ) 0xE000ed00 ) )
+#define portCORTEX_M7_r0p1_ID                     ( 0x410FC271UL )
+#define portCORTEX_M7_r0p0_ID                     ( 0x410FC270UL )
+
+#define portNVIC_PENDSV_PRI                       ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
+#define portNVIC_SYSTICK_PRI                      ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )
+#define portNVIC_SVC_PRI                          ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL )
+
+/* Constants required to check the validity of an interrupt priority. */
+#define portFIRST_USER_INTERRUPT_NUMBER           ( 16 )
+#define portNVIC_IP_REGISTERS_OFFSET_16           ( 0xE000E3F0 )
+#define portAIRCR_REG                             ( *( ( volatile uint32_t * ) 0xE000ED0C ) )
+#define portMAX_8_BIT_VALUE                       ( ( uint8_t ) 0xff )
+#define portTOP_BIT_OF_BYTE                       ( ( uint8_t ) 0x80 )
+#define portMAX_PRIGROUP_BITS                     ( ( uint8_t ) 7 )
+#define portPRIORITY_GROUP_MASK                   ( 0x07UL << 8UL )
+#define portPRIGROUP_SHIFT                        ( 8UL )
+
+/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */
+#define portVECTACTIVE_MASK                       ( 0xFFUL )
+
+/* Constants required to manipulate the VFP. */
+#define portFPCCR                                 ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */
+#define portASPEN_AND_LSPEN_BITS                  ( 0x3UL << 30UL )
+
+/* Constants required to set up the initial stack. */
+#define portINITIAL_XPSR                          ( 0x01000000 )
+#define portINITIAL_EXC_RETURN                    ( 0xfffffffd )
+#define portINITIAL_CONTROL_IF_UNPRIVILEGED       ( 0x03 )
+#define portINITIAL_CONTROL_IF_PRIVILEGED         ( 0x02 )
+
+/* Offsets in the stack to the parameters when inside the SVC handler. */
+#define portOFFSET_TO_PC                          ( 6 )
+
+/* The systick is a 24-bit counter. */
+#define portMAX_24_BIT_NUMBER                     ( 0xffffffUL )
+
+/* A fiddle factor to estimate the number of SysTick counts that would have
+ * occurred while the SysTick counter is stopped during tickless idle
+ * calculations. */
+#define portMISSED_COUNTS_FACTOR                  ( 45UL )
+
+/* For strict compliance with the Cortex-M spec the task start address should
+ * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */
+#define portSTART_ADDRESS_MASK                    ( ( StackType_t ) 0xfffffffeUL )
+
+/*
+ * Configure a number of standard MPU regions that are used by all tasks.
+ */
+static void prvSetupMPU( void ) PRIVILEGED_FUNCTION;
+
+/*
+ * Return the smallest MPU region size that a given number of bytes will fit
+ * into.  The region size is returned as the value that should be programmed
+ * into the region attribute register for that region.
+ */
+static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION;
+
+/*
+ * Setup the timer to generate the tick interrupts.  The implementation in this
+ * file is weak to allow application writers to change the timer used to
+ * generate the tick interrupt.
+ */
+void vPortSetupTimerInterrupt( void );
+
+/*
+ * Exception handlers.
+ */
+void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION;
+
+/*
+ * Start first task is a separate function so it can be tested in isolation.
+ */
+extern void vPortStartFirstTask( void ) PRIVILEGED_FUNCTION;
+
+/*
+ * Turn the VFP on.
+ */
+extern void vPortEnableVFP( void );
+
+/*
+ * The C portion of the SVC handler.
+ */
+void vPortSVCHandler_C( uint32_t * pulParam );
+
+/*
+ * Called from the SVC handler used to start the scheduler.
+ */
+extern void vPortRestoreContextOfFirstTask( void ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Enter critical section.
+ */
+#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
+    void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL;
+#else
+    void vPortEnterCritical( void ) PRIVILEGED_FUNCTION;
+#endif
+
+/**
+ * @brief Exit from critical section.
+ */
+#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
+    void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL;
+#else
+    void vPortExitCritical( void ) PRIVILEGED_FUNCTION;
+#endif
+/*-----------------------------------------------------------*/
+
+/* Each task maintains its own interrupt status in the critical nesting
+ * variable. */
+static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
+
+/*
+ * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure
+ * FreeRTOS API functions are not called from interrupts that have been assigned
+ * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.
+ */
+#if ( configASSERT_DEFINED == 1 )
+    static uint8_t ucMaxSysCallPriority = 0;
+    static uint32_t ulMaxPRIGROUPValue = 0;
+    static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;
+#endif /* configASSERT_DEFINED */
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
+                                     TaskFunction_t pxCode,
+                                     void * pvParameters,
+                                     BaseType_t xRunPrivileged )
+{
+    /* Simulate the stack frame as it would be created by a context switch
+     * interrupt. */
+
+    /* Offset added to account for the way the MCU uses the stack on entry/exit
+     * of interrupts, and to ensure alignment. */
+    pxTopOfStack--;
+
+    *pxTopOfStack = portINITIAL_XPSR;                                    /* xPSR */
+    pxTopOfStack--;
+    *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0;                                   /* LR */
+
+    /* Save code space by skipping register initialisation. */
+    pxTopOfStack -= 5;                            /* R12, R3, R2 and R1. */
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+
+    /* A save method is being used that requires each task to maintain its
+     * own exec return value. */
+    pxTopOfStack--;
+    *pxTopOfStack = portINITIAL_EXC_RETURN;
+
+    pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */
+
+    if( xRunPrivileged == pdTRUE )
+    {
+        *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED;
+    }
+    else
+    {
+        *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED;
+    }
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+void vPortSVCHandler_C( uint32_t * pulParam )
+{
+    uint8_t ucSVCNumber;
+    uint32_t ulPC;
+
+    #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
+        extern uint32_t __syscalls_flash_start__[];
+        extern uint32_t __syscalls_flash_end__[];
+    #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
+
+    /* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first
+     * argument (r0) is pulParam[ 0 ]. */
+    ulPC = pulParam[ portOFFSET_TO_PC ];
+    ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ];
+
+    switch( ucSVCNumber )
+    {
+        case portSVC_START_SCHEDULER:
+            portNVIC_SHPR2_REG |= portNVIC_SVC_PRI;
+            vPortRestoreContextOfFirstTask();
+            break;
+
+        case portSVC_YIELD:
+            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
+
+            /* Barriers are normally not required
+             * but do ensure the code is completely
+             * within the specified behaviour for the
+             * architecture. */
+            __asm volatile ( "dsb" ::: "memory" );
+            __asm volatile ( "isb" );
+
+            break;
+
+            #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
+                case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the
+                                               * svc was raised from any of the
+                                               * system calls. */
+
+                    if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) &&
+                        ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) )
+                    {
+                        __asm volatile
+                        (
+                            "   mrs r1, control     \n"/* Obtain current control value. */
+                            "   bic r1, r1, #1      \n"/* Set privilege bit. */
+                            "   msr control, r1     \n"/* Write back new control value. */
+                            ::: "r1", "memory"
+                        );
+                    }
+
+                    break;
+            #else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
+                case portSVC_RAISE_PRIVILEGE:
+                    __asm volatile
+                    (
+                        "   mrs r1, control     \n"/* Obtain current control value. */
+                        "   bic r1, r1, #1      \n"/* Set privilege bit. */
+                        "   msr control, r1     \n"/* Write back new control value. */
+                        ::: "r1", "memory"
+                    );
+                    break;
+                    #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
+
+                default: /* Unknown SVC call. */
+                    break;
+    }
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+BaseType_t xPortStartScheduler( void )
+{
+    /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.
+     * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
+    configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );
+
+    /* Errata 837070 workaround must only be enabled on Cortex-M7 r0p0
+     * and r0p1 cores. */
+    #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 )
+        configASSERT( ( portCPUID == portCORTEX_M7_r0p1_ID ) || ( portCPUID == portCORTEX_M7_r0p0_ID ) );
+    #else
+        /* When using this port on a Cortex-M7 r0p0 or r0p1 core, define
+         * configENABLE_ERRATA_837070_WORKAROUND to 1 in your
+         * FreeRTOSConfig.h. */
+        configASSERT( portCPUID != portCORTEX_M7_r0p1_ID );
+        configASSERT( portCPUID != portCORTEX_M7_r0p0_ID );
+    #endif
+
+    #if ( configASSERT_DEFINED == 1 )
+        {
+            volatile uint32_t ulOriginalPriority;
+            volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );
+            volatile uint8_t ucMaxPriorityValue;
+
+            /* Determine the maximum priority from which ISR safe FreeRTOS API
+             * functions can be called.  ISR safe functions are those that end in
+             * "FromISR".  FreeRTOS maintains separate thread and ISR API functions to
+             * ensure interrupt entry is as fast and simple as possible.
+             *
+             * Save the interrupt priority value that is about to be clobbered. */
+            ulOriginalPriority = *pucFirstUserPriorityRegister;
+
+            /* Determine the number of priority bits available.  First write to all
+             * possible bits. */
+            *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
+
+            /* Read the value back to see how many bits stuck. */
+            ucMaxPriorityValue = *pucFirstUserPriorityRegister;
+
+            /* Use the same mask on the maximum system call priority. */
+            ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
+
+            /* Calculate the maximum acceptable priority group value for the number
+             * of bits read back. */
+            ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
+
+            while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
+            {
+                ulMaxPRIGROUPValue--;
+                ucMaxPriorityValue <<= ( uint8_t ) 0x01;
+            }
+
+            #ifdef __NVIC_PRIO_BITS
+                {
+                    /* Check the CMSIS configuration that defines the number of
+                     * priority bits matches the number of priority bits actually queried
+                     * from the hardware. */
+                    configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );
+                }
+            #endif
+
+            #ifdef configPRIO_BITS
+                {
+                    /* Check the FreeRTOS configuration that defines the number of
+                     * priority bits matches the number of priority bits actually queried
+                     * from the hardware. */
+                    configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
+                }
+            #endif
+
+            /* Shift the priority group value back to its position within the AIRCR
+             * register. */
+            ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
+            ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
+
+            /* Restore the clobbered interrupt priority register to its original
+             * value. */
+            *pucFirstUserPriorityRegister = ulOriginalPriority;
+        }
+    #endif /* configASSERT_DEFINED */
+
+    /* Make PendSV and SysTick the lowest priority interrupts. */
+    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
+    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
+
+    /* Configure the regions in the MPU that are common to all tasks. */
+    prvSetupMPU();
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+     * here already. */
+    vPortSetupTimerInterrupt();
+
+    /* Initialise the critical nesting count ready for the first task. */
+    uxCriticalNesting = 0;
+
+    /* Ensure the VFP is enabled - it should be anyway. */
+    vPortEnableVFP();
+
+    /* Lazy save always. */
+    *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+     * Artificially force an assert. */
+    configASSERT( uxCriticalNesting == 1000UL );
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
+    if( portIS_PRIVILEGED() == pdFALSE )
+    {
+        portRAISE_PRIVILEGE();
+        portMEMORY_BARRIER();
+
+        portDISABLE_INTERRUPTS();
+        uxCriticalNesting++;
+        /* This is not the interrupt safe version of the enter critical function so
+         * assert() if it is being called from an interrupt context.  Only API
+         * functions that end in "FromISR" can be used in an interrupt.  Only assert if
+         * the critical nesting count is 1 to protect against recursive calls if the
+         * assert function also uses a critical section. */
+        if( uxCriticalNesting == 1 )
+        {
+            configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
+        }
+        portMEMORY_BARRIER();
+
+        portRESET_PRIVILEGE();
+        portMEMORY_BARRIER();
+    }
+    else
+    {
+        portDISABLE_INTERRUPTS();
+        uxCriticalNesting++;
+        /* This is not the interrupt safe version of the enter critical function so
+         * assert() if it is being called from an interrupt context.  Only API
+         * functions that end in "FromISR" can be used in an interrupt.  Only assert if
+         * the critical nesting count is 1 to protect against recursive calls if the
+         * assert function also uses a critical section. */
+        if( uxCriticalNesting == 1 )
+        {
+            configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
+        }
+    }
+#else
+    portDISABLE_INTERRUPTS();
+    uxCriticalNesting++;
+    /* This is not the interrupt safe version of the enter critical function so
+     * assert() if it is being called from an interrupt context.  Only API
+     * functions that end in "FromISR" can be used in an interrupt.  Only assert if
+     * the critical nesting count is 1 to protect against recursive calls if the
+     * assert function also uses a critical section. */
+    if( uxCriticalNesting == 1 )
+    {
+        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
+    }
+#endif
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
+    if( portIS_PRIVILEGED() == pdFALSE )
+    {
+        portRAISE_PRIVILEGE();
+        portMEMORY_BARRIER();
+
+        configASSERT( uxCriticalNesting );
+        uxCriticalNesting--;
+
+        if( uxCriticalNesting == 0 )
+        {
+            portENABLE_INTERRUPTS();
+        }
+        portMEMORY_BARRIER();
+
+        portRESET_PRIVILEGE();
+        portMEMORY_BARRIER();
+    }
+    else
+    {
+        configASSERT( uxCriticalNesting );
+        uxCriticalNesting--;
+
+        if( uxCriticalNesting == 0 )
+        {
+            portENABLE_INTERRUPTS();
+        }
+    }
+#else
+    configASSERT( uxCriticalNesting );
+    uxCriticalNesting--;
+
+    if( uxCriticalNesting == 0 )
+    {
+        portENABLE_INTERRUPTS();
+    }
+#endif
+}
+/*-----------------------------------------------------------*/
+
+void xPortSysTickHandler( void )
+{
+    /* The SysTick runs at the lowest interrupt priority, so when this interrupt
+     * executes all interrupts must be unmasked.  There is therefore no need to
+     * save and then restore the interrupt mask value as its value is already
+     * known. */
+    portDISABLE_INTERRUPTS();
+    {
+        /* Increment the RTOS tick. */
+        if( xTaskIncrementTick() != pdFALSE )
+        {
+            /* A context switch is required.  Context switching is performed in
+             * the PendSV interrupt.  Pend the PendSV interrupt. */
+            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
+        }
+    }
+    portENABLE_INTERRUPTS();
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * Setup the systick timer to generate the tick interrupts at the required
+ * frequency.
+ */
+__weak void vPortSetupTimerInterrupt( void )
+{
+    /* Stop and clear the SysTick. */
+    portNVIC_SYSTICK_CTRL_REG = 0UL;
+    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+
+    /* Configure SysTick to interrupt at the requested rate. */
+    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
+    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupMPU( void )
+{
+    extern uint32_t __privileged_functions_start__[];
+    extern uint32_t __privileged_functions_end__[];
+    extern uint32_t __FLASH_segment_start__[];
+    extern uint32_t __FLASH_segment_end__[];
+    extern uint32_t __privileged_data_start__[];
+    extern uint32_t __privileged_data_end__[];
+
+    /* The only permitted number of regions are 8 or 16. */
+    configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) );
+
+    /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */
+    configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE );
+
+    /* Check the expected MPU is present. */
+    if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE )
+    {
+        /* First setup the unprivileged flash for unprivileged read only access. */
+        portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
+                                          ( portMPU_REGION_VALID ) |
+                                          ( portUNPRIVILEGED_FLASH_REGION );
+
+        portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) |
+                                       ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) |
+                                       ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) |
+                                       ( portMPU_REGION_ENABLE );
+
+        /* Setup the privileged flash for privileged only access.  This is where
+         * the kernel code is placed. */
+        portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_functions_start__ ) | /* Base address. */
+                                          ( portMPU_REGION_VALID ) |
+                                          ( portPRIVILEGED_FLASH_REGION );
+
+        portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) |
+                                       ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) |
+                                       ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __privileged_functions_start__ ) ) |
+                                       ( portMPU_REGION_ENABLE );
+
+        /* Setup the privileged data RAM region.  This is where the kernel data
+         * is placed. */
+        portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */
+                                          ( portMPU_REGION_VALID ) |
+                                          ( portPRIVILEGED_RAM_REGION );
+
+        portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) |
+                                       ( portMPU_REGION_EXECUTE_NEVER ) |
+                                       ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) |
+                                       prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) |
+                                       ( portMPU_REGION_ENABLE );
+
+        /* By default allow everything to access the general peripherals.  The
+         * system peripherals and registers are protected. */
+        portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) |
+                                          ( portMPU_REGION_VALID ) |
+                                          ( portGENERAL_PERIPHERALS_REGION );
+
+        portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) |
+                                       ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) |
+                                       ( portMPU_REGION_ENABLE );
+
+        /* Enable the memory fault exception. */
+        portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE;
+
+        /* Enable the MPU with the background region configured. */
+        portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE );
+    }
+}
+/*-----------------------------------------------------------*/
+
+static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes )
+{
+    uint32_t ulRegionSize, ulReturnValue = 4;
+
+    /* 32 is the smallest region size, 31 is the largest valid value for
+     * ulReturnValue. */
+    for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) )
+    {
+        if( ulActualSizeInBytes <= ulRegionSize )
+        {
+            break;
+        }
+        else
+        {
+            ulReturnValue++;
+        }
+    }
+
+    /* Shift the code by one before returning so it can be written directly
+     * into the the correct bit position of the attribute register. */
+    return( ulReturnValue << 1UL );
+}
+/*-----------------------------------------------------------*/
+
+void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,
+                                const struct xMEMORY_REGION * const xRegions,
+                                StackType_t * pxBottomOfStack,
+                                uint32_t ulStackDepth )
+{
+    extern uint32_t __SRAM_segment_start__[];
+    extern uint32_t __SRAM_segment_end__[];
+    extern uint32_t __privileged_data_start__[];
+    extern uint32_t __privileged_data_end__[];
+    int32_t lIndex;
+    uint32_t ul;
+
+    if( xRegions == NULL )
+    {
+        /* No MPU regions are specified so allow access to all RAM. */
+        xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress =
+            ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */
+            ( portMPU_REGION_VALID ) |
+            ( portSTACK_REGION ); /* Region number. */
+
+        xMPUSettings->xRegion[ 0 ].ulRegionAttribute =
+            ( portMPU_REGION_READ_WRITE ) |
+            ( portMPU_REGION_EXECUTE_NEVER ) |
+            ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) |
+            ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) |
+            ( portMPU_REGION_ENABLE );
+
+        /* Invalidate user configurable regions. */
+        for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ )
+        {
+            xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID );
+            xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL;
+        }
+    }
+    else
+    {
+        /* This function is called automatically when the task is created - in
+         * which case the stack region parameters will be valid.  At all other
+         * times the stack parameters will not be valid and it is assumed that the
+         * stack region has already been configured. */
+        if( ulStackDepth > 0 )
+        {
+            /* Define the region that allows access to the stack. */
+            xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress =
+                ( ( uint32_t ) pxBottomOfStack ) |
+                ( portMPU_REGION_VALID ) |
+                ( portSTACK_REGION ); /* Region number. */
+
+            xMPUSettings->xRegion[ 0 ].ulRegionAttribute =
+                ( portMPU_REGION_READ_WRITE ) |
+                ( portMPU_REGION_EXECUTE_NEVER ) |
+                ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) |
+                ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) |
+                ( portMPU_REGION_ENABLE );
+        }
+
+        lIndex = 0;
+
+        for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ )
+        {
+            if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL )
+            {
+                /* Translate the generic region definition contained in
+                 * xRegions into the CM4 specific MPU settings that are then
+                 * stored in xMPUSettings. */
+                xMPUSettings->xRegion[ ul ].ulRegionBaseAddress =
+                    ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) |
+                    ( portMPU_REGION_VALID ) |
+                    ( ul - 1UL ); /* Region number. */
+
+                xMPUSettings->xRegion[ ul ].ulRegionAttribute =
+                    ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) |
+                    ( xRegions[ lIndex ].ulParameters ) |
+                    ( portMPU_REGION_ENABLE );
+            }
+            else
+            {
+                /* Invalidate the region. */
+                xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID );
+                xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL;
+            }
+
+            lIndex++;
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+#if ( configASSERT_DEFINED == 1 )
+
+    void vPortValidateInterruptPriority( void )
+    {
+        uint32_t ulCurrentInterrupt;
+        uint8_t ucCurrentPriority;
+
+        /* Obtain the number of the currently executing interrupt. */
+        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );
+
+        /* Is the interrupt number a user defined interrupt? */
+        if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
+        {
+            /* Look up the interrupt's priority. */
+            ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
+
+            /* The following assertion will fail if a service routine (ISR) for
+             * an interrupt that has been assigned a priority above
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API
+             * function.  ISR safe FreeRTOS API functions must *only* be called
+             * from interrupts that have been assigned a priority at or below
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY.
+             *
+             * Numerically low interrupt priority numbers represent logically high
+             * interrupt priorities, therefore the priority of the interrupt must
+             * be set to a value equal to or numerically *higher* than
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY.
+             *
+             * Interrupts that  use the FreeRTOS API must not be left at their
+             * default priority of  zero as that is the highest possible priority,
+             * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,
+             * and  therefore also guaranteed to be invalid.
+             *
+             * FreeRTOS maintains separate thread and ISR API functions to ensure
+             * interrupt entry is as fast and simple as possible.
+             *
+             * The following links provide detailed information:
+             * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
+             * https://www.FreeRTOS.org/FAQHelp.html */
+            configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
+        }
+
+        /* Priority grouping:  The interrupt controller (NVIC) allows the bits
+         * that define each interrupt's priority to be split between bits that
+         * define the interrupt's pre-emption priority bits and bits that define
+         * the interrupt's sub-priority.  For simplicity all bits must be defined
+         * to be pre-emption priority bits.  The following assertion will fail if
+         * this is not the case (if some bits represent a sub-priority).
+         *
+         * If the application only uses CMSIS libraries for interrupt
+         * configuration then the correct setting can be achieved on all Cortex-M
+         * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
+         * scheduler.  Note however that some vendor specific peripheral libraries
+         * assume a non-zero priority group setting, in which cases using a value
+         * of zero will result in unpredictable behaviour. */
+        configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
+    }
+
+#endif /* configASSERT_DEFINED */
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CM4F_MPU/portasm.s b/portable/IAR/ARM_CM4F_MPU/portasm.s
index f37912b..db751f6 100644
--- a/portable/IAR/ARM_CM4F_MPU/portasm.s
+++ b/portable/IAR/ARM_CM4F_MPU/portasm.s
@@ -1,264 +1,264 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-/* Including FreeRTOSConfig.h here will cause build errors if the header file

-contains code not understood by the assembler - for example the 'extern' keyword.

-To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so

-the code is included in C files but excluded by the preprocessor in assembly

-files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */

-#include <FreeRTOSConfig.h>

-

-	RSEG    CODE:CODE(2)

-	thumb

-

-	EXTERN pxCurrentTCB

-	EXTERN vTaskSwitchContext

-	EXTERN vPortSVCHandler_C

-

-	PUBLIC xPortPendSVHandler

-	PUBLIC vPortSVCHandler

-	PUBLIC vPortStartFirstTask

-	PUBLIC vPortEnableVFP

-	PUBLIC vPortRestoreContextOfFirstTask

-	PUBLIC xIsPrivileged

-	PUBLIC vResetPrivilege

-

-/*-----------------------------------------------------------*/

-

-xPortPendSVHandler:

-	mrs r0, psp

-	isb

-	/* Get the location of the current TCB. */

-	ldr	r3, =pxCurrentTCB

-	ldr	r2, [r3]

-

-	/* Is the task using the FPU context?  If so, push high vfp registers. */

-	tst r14, #0x10

-	it eq

-	vstmdbeq r0!, {s16-s31}

-

-	/* Save the core registers. */

-	mrs r1, control

-	stmdb r0!, {r1, r4-r11, r14}

-

-	/* Save the new top of stack into the first member of the TCB. */

-	str r0, [r2]

-

-	stmdb sp!, {r0, r3}

-	mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-	#if ( configENABLE_ERRATA_837070_WORKAROUND == 1 )

-		cpsid i /* ARM Cortex-M7 r0p1 Errata 837070 workaround. */

-	#endif

-	msr basepri, r0

-	dsb

-	isb

-	#if ( configENABLE_ERRATA_837070_WORKAROUND == 1 )

-		cpsie i /* ARM Cortex-M7 r0p1 Errata 837070 workaround. */

-	#endif

-	bl vTaskSwitchContext

-	mov r0, #0

-	msr basepri, r0

-	ldmia sp!, {r0, r3}

-

-	/* The first item in pxCurrentTCB is the task top of stack. */

-	ldr r1, [r3]

-	ldr r0, [r1]

-	/* Move onto the second item in the TCB... */

-	add r1, r1, #4

-

-	dmb					/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94	/* MPU_CTRL register. */

-	ldr r3, [r2]		/* Read the value of MPU_CTRL. */

-	bic r3, r3, #1		/* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */

-	str r3, [r2]		/* Disable MPU. */

-

-	/* Region Base Address register. */

-	ldr r2, =0xe000ed9c

-	/* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */

-	ldmia r1!, {r4-r11}

-	/* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */

-	stmia r2, {r4-r11}

-

-	#ifdef configTOTAL_MPU_REGIONS

-		#if ( configTOTAL_MPU_REGIONS == 16 )

-			/* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */

-			ldmia r1!, {r4-r11}

-			/* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */

-			stmia r2, {r4-r11}

-			/* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */

-			ldmia r1!, {r4-r11}

-			/* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */

-			stmia r2, {r4-r11}

-		#endif /* configTOTAL_MPU_REGIONS == 16. */

-	#endif /* configTOTAL_MPU_REGIONS */

-

-	ldr r2, =0xe000ed94	/* MPU_CTRL register. */

-	ldr r3, [r2]		/* Read the value of MPU_CTRL. */

-	orr r3, r3, #1		/* r3 = r3 | 1 i.e. Set the bit 0 in r3. */

-	str r3, [r2]		/* Enable MPU. */

-	dsb					/* Force memory writes before continuing. */

-

-	/* Pop the registers that are not automatically saved on exception entry. */

-	ldmia r0!, {r3-r11, r14}

-	msr control, r3

-

-	/* Is the task using the FPU context?  If so, pop the high vfp registers

-	too. */

-	tst r14, #0x10

-	it eq

-	vldmiaeq r0!, {s16-s31}

-

-	msr psp, r0

-	isb

-

-	bx r14

-

-

-/*-----------------------------------------------------------*/

-

-vPortSVCHandler:

-	#ifndef USE_PROCESS_STACK	/* Code should not be required if a main() is using the process stack. */

-		tst lr, #4

-		ite eq

-		mrseq r0, msp

-		mrsne r0, psp

-	#else

-		mrs r0, psp

-	#endif

-		b vPortSVCHandler_C

-

-/*-----------------------------------------------------------*/

-

-vPortStartFirstTask:

-	/* Use the NVIC offset register to locate the stack. */

-	ldr r0, =0xE000ED08

-	ldr r0, [r0]

-	ldr r0, [r0]

-	/* Set the msp back to the start of the stack. */

-	msr msp, r0

-	/* Clear the bit that indicates the FPU is in use in case the FPU was used

-	before the scheduler was started - which would otherwise result in the

-	unnecessary leaving of space in the SVC stack for lazy saving of FPU

-	registers. */

-	mov r0, #0

-	msr control, r0

-	/* Call SVC to start the first task. */

-	cpsie i

-	cpsie f

-	dsb

-	isb

-	svc 0

-

-/*-----------------------------------------------------------*/

-

-vPortRestoreContextOfFirstTask:

-	/* Use the NVIC offset register to locate the stack. */

-	ldr r0, =0xE000ED08

-	ldr r0, [r0]

-	ldr r0, [r0]

-	/* Set the msp back to the start of the stack. */

-	msr msp, r0

-	/* Restore the context. */

-	ldr	r3, =pxCurrentTCB

-	ldr r1, [r3]

-	/* The first item in the TCB is the task top of stack. */

-	ldr r0, [r1]

-	/* Move onto the second item in the TCB... */

-	add r1, r1, #4

-

-	dmb					/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94	/* MPU_CTRL register. */

-	ldr r3, [r2]		/* Read the value of MPU_CTRL. */

-	bic r3, r3, #1		/* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */

-	str r3, [r2]		/* Disable MPU. */

-

-	/* Region Base Address register. */

-	ldr r2, =0xe000ed9c

-	/* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */

-	ldmia r1!, {r4-r11}

-	/* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */

-	stmia r2, {r4-r11}

-

-	#ifdef configTOTAL_MPU_REGIONS

-		#if ( configTOTAL_MPU_REGIONS == 16 )

-			/* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */

-			ldmia r1!, {r4-r11}

-			/* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */

-			stmia r2, {r4-r11}

-			/* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */

-			ldmia r1!, {r4-r11}

-			/* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */

-			stmia r2, {r4-r11}

-		#endif /* configTOTAL_MPU_REGIONS == 16. */

-	#endif /* configTOTAL_MPU_REGIONS */

-

-	ldr r2, =0xe000ed94	/* MPU_CTRL register. */

-	ldr r3, [r2]		/* Read the value of MPU_CTRL. */

-	orr r3, r3, #1		/* r3 = r3 | 1 i.e. Set the bit 0 in r3. */

-	str r3, [r2]		/* Enable MPU. */

-	dsb					/* Force memory writes before continuing. */

-

-	/* Pop the registers that are not automatically saved on exception entry. */

-	ldmia r0!, {r3-r11, r14}

-	msr control, r3

-	/* Restore the task stack pointer. */

-	msr psp, r0

-	mov r0, #0

-	msr	basepri, r0

-	bx r14

-

-/*-----------------------------------------------------------*/

-

-vPortEnableVFP:

-	/* The FPU enable bits are in the CPACR. */

-	ldr.w r0, =0xE000ED88

-	ldr	r1, [r0]

-

-	/* Enable CP10 and CP11 coprocessors, then save back. */

-	orr	r1, r1, #( 0xf << 20 )

-	str r1, [r0]

-	bx	r14

-

-/*-----------------------------------------------------------*/

-

-xIsPrivileged:

-	mrs r0, control		/* r0 = CONTROL. */

-	tst r0, #1			/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */

-	ite ne

-	movne r0, #0		/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */

-	moveq r0, #1		/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */

-	bx lr				/* Return. */

-/*-----------------------------------------------------------*/

-

-vResetPrivilege:

-	mrs r0, control		/* r0 = CONTROL. */

-	orr r0, r0, #1		/* r0 = r0 | 1. */

-	msr control, r0		/* CONTROL = r0. */

-	bx lr				/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-	END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+/* Including FreeRTOSConfig.h here will cause build errors if the header file
+contains code not understood by the assembler - for example the 'extern' keyword.
+To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
+the code is included in C files but excluded by the preprocessor in assembly
+files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
+#include <FreeRTOSConfig.h>
+
+    RSEG    CODE:CODE(2)
+    thumb
+
+    EXTERN pxCurrentTCB
+    EXTERN vTaskSwitchContext
+    EXTERN vPortSVCHandler_C
+
+    PUBLIC xPortPendSVHandler
+    PUBLIC vPortSVCHandler
+    PUBLIC vPortStartFirstTask
+    PUBLIC vPortEnableVFP
+    PUBLIC vPortRestoreContextOfFirstTask
+    PUBLIC xIsPrivileged
+    PUBLIC vResetPrivilege
+
+/*-----------------------------------------------------------*/
+
+xPortPendSVHandler:
+    mrs r0, psp
+    isb
+    /* Get the location of the current TCB. */
+    ldr r3, =pxCurrentTCB
+    ldr r2, [r3]
+
+    /* Is the task using the FPU context?  If so, push high vfp registers. */
+    tst r14, #0x10
+    it eq
+    vstmdbeq r0!, {s16-s31}
+
+    /* Save the core registers. */
+    mrs r1, control
+    stmdb r0!, {r1, r4-r11, r14}
+
+    /* Save the new top of stack into the first member of the TCB. */
+    str r0, [r2]
+
+    stmdb sp!, {r0, r3}
+    mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 )
+        cpsid i /* ARM Cortex-M7 r0p1 Errata 837070 workaround. */
+    #endif
+    msr basepri, r0
+    dsb
+    isb
+    #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 )
+        cpsie i /* ARM Cortex-M7 r0p1 Errata 837070 workaround. */
+    #endif
+    bl vTaskSwitchContext
+    mov r0, #0
+    msr basepri, r0
+    ldmia sp!, {r0, r3}
+
+    /* The first item in pxCurrentTCB is the task top of stack. */
+    ldr r1, [r3]
+    ldr r0, [r1]
+    /* Move onto the second item in the TCB... */
+    add r1, r1, #4
+
+    dmb                 /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94 /* MPU_CTRL register. */
+    ldr r3, [r2]        /* Read the value of MPU_CTRL. */
+    bic r3, r3, #1      /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */
+    str r3, [r2]        /* Disable MPU. */
+
+    /* Region Base Address register. */
+    ldr r2, =0xe000ed9c
+    /* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */
+    ldmia r1!, {r4-r11}
+    /* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */
+    stmia r2, {r4-r11}
+
+    #ifdef configTOTAL_MPU_REGIONS
+        #if ( configTOTAL_MPU_REGIONS == 16 )
+            /* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */
+            ldmia r1!, {r4-r11}
+            /* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */
+            stmia r2, {r4-r11}
+            /* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */
+            ldmia r1!, {r4-r11}
+            /* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */
+            stmia r2, {r4-r11}
+        #endif /* configTOTAL_MPU_REGIONS == 16. */
+    #endif /* configTOTAL_MPU_REGIONS */
+
+    ldr r2, =0xe000ed94 /* MPU_CTRL register. */
+    ldr r3, [r2]        /* Read the value of MPU_CTRL. */
+    orr r3, r3, #1      /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */
+    str r3, [r2]        /* Enable MPU. */
+    dsb                 /* Force memory writes before continuing. */
+
+    /* Pop the registers that are not automatically saved on exception entry. */
+    ldmia r0!, {r3-r11, r14}
+    msr control, r3
+
+    /* Is the task using the FPU context?  If so, pop the high vfp registers
+    too. */
+    tst r14, #0x10
+    it eq
+    vldmiaeq r0!, {s16-s31}
+
+    msr psp, r0
+    isb
+
+    bx r14
+
+
+/*-----------------------------------------------------------*/
+
+vPortSVCHandler:
+    #ifndef USE_PROCESS_STACK   /* Code should not be required if a main() is using the process stack. */
+        tst lr, #4
+        ite eq
+        mrseq r0, msp
+        mrsne r0, psp
+    #else
+        mrs r0, psp
+    #endif
+        b vPortSVCHandler_C
+
+/*-----------------------------------------------------------*/
+
+vPortStartFirstTask:
+    /* Use the NVIC offset register to locate the stack. */
+    ldr r0, =0xE000ED08
+    ldr r0, [r0]
+    ldr r0, [r0]
+    /* Set the msp back to the start of the stack. */
+    msr msp, r0
+    /* Clear the bit that indicates the FPU is in use in case the FPU was used
+    before the scheduler was started - which would otherwise result in the
+    unnecessary leaving of space in the SVC stack for lazy saving of FPU
+    registers. */
+    mov r0, #0
+    msr control, r0
+    /* Call SVC to start the first task. */
+    cpsie i
+    cpsie f
+    dsb
+    isb
+    svc 0
+
+/*-----------------------------------------------------------*/
+
+vPortRestoreContextOfFirstTask:
+    /* Use the NVIC offset register to locate the stack. */
+    ldr r0, =0xE000ED08
+    ldr r0, [r0]
+    ldr r0, [r0]
+    /* Set the msp back to the start of the stack. */
+    msr msp, r0
+    /* Restore the context. */
+    ldr r3, =pxCurrentTCB
+    ldr r1, [r3]
+    /* The first item in the TCB is the task top of stack. */
+    ldr r0, [r1]
+    /* Move onto the second item in the TCB... */
+    add r1, r1, #4
+
+    dmb                 /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94 /* MPU_CTRL register. */
+    ldr r3, [r2]        /* Read the value of MPU_CTRL. */
+    bic r3, r3, #1      /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */
+    str r3, [r2]        /* Disable MPU. */
+
+    /* Region Base Address register. */
+    ldr r2, =0xe000ed9c
+    /* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */
+    ldmia r1!, {r4-r11}
+    /* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */
+    stmia r2, {r4-r11}
+
+    #ifdef configTOTAL_MPU_REGIONS
+        #if ( configTOTAL_MPU_REGIONS == 16 )
+            /* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */
+            ldmia r1!, {r4-r11}
+            /* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */
+            stmia r2, {r4-r11}
+            /* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */
+            ldmia r1!, {r4-r11}
+            /* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */
+            stmia r2, {r4-r11}
+        #endif /* configTOTAL_MPU_REGIONS == 16. */
+    #endif /* configTOTAL_MPU_REGIONS */
+
+    ldr r2, =0xe000ed94 /* MPU_CTRL register. */
+    ldr r3, [r2]        /* Read the value of MPU_CTRL. */
+    orr r3, r3, #1      /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */
+    str r3, [r2]        /* Enable MPU. */
+    dsb                 /* Force memory writes before continuing. */
+
+    /* Pop the registers that are not automatically saved on exception entry. */
+    ldmia r0!, {r3-r11, r14}
+    msr control, r3
+    /* Restore the task stack pointer. */
+    msr psp, r0
+    mov r0, #0
+    msr basepri, r0
+    bx r14
+
+/*-----------------------------------------------------------*/
+
+vPortEnableVFP:
+    /* The FPU enable bits are in the CPACR. */
+    ldr.w r0, =0xE000ED88
+    ldr r1, [r0]
+
+    /* Enable CP10 and CP11 coprocessors, then save back. */
+    orr r1, r1, #( 0xf << 20 )
+    str r1, [r0]
+    bx  r14
+
+/*-----------------------------------------------------------*/
+
+xIsPrivileged:
+    mrs r0, control     /* r0 = CONTROL. */
+    tst r0, #1          /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
+    ite ne
+    movne r0, #0        /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
+    moveq r0, #1        /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
+    bx lr               /* Return. */
+/*-----------------------------------------------------------*/
+
+vResetPrivilege:
+    mrs r0, control     /* r0 = CONTROL. */
+    orr r0, r0, #1      /* r0 = r0 | 1. */
+    msr control, r0     /* CONTROL = r0. */
+    bx lr               /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/ARM_CM4F_MPU/portmacro.h b/portable/IAR/ARM_CM4F_MPU/portmacro.h
index 896c939..1e44234 100644
--- a/portable/IAR/ARM_CM4F_MPU/portmacro.h
+++ b/portable/IAR/ARM_CM4F_MPU/portmacro.h
@@ -1,369 +1,369 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-/* *INDENT-OFF* */

-#ifdef __cplusplus

-    extern "C" {

-#endif

-/* *INDENT-ON* */

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* IAR includes. */

-#include <intrinsics.h>

-

-/* Type definitions. */

-#define portCHAR          char

-#define portFLOAT         float

-#define portDOUBLE        double

-#define portLONG          long

-#define portSHORT         short

-#define portSTACK_TYPE    uint32_t

-#define portBASE_TYPE     long

-

-typedef portSTACK_TYPE   StackType_t;

-typedef long             BaseType_t;

-typedef unsigned long    UBaseType_t;

-

-#if ( configUSE_16_BIT_TICKS == 1 )

-    typedef uint16_t     TickType_t;

-    #define portMAX_DELAY              ( TickType_t ) 0xffff

-#else

-    typedef uint32_t     TickType_t;

-    #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL

-

-/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

- * not need to be guarded with a critical section. */

-    #define portTICK_TYPE_IS_ATOMIC    1

-#endif

-

-/*-----------------------------------------------------------*/

-

-/* MPU specific constants. */

-#define portUSING_MPU_WRAPPERS                                   1

-#define portPRIVILEGE_BIT                                        ( 0x80000000UL )

-

-#define portMPU_REGION_READ_WRITE                                ( 0x03UL << 24UL )

-#define portMPU_REGION_PRIVILEGED_READ_ONLY                      ( 0x05UL << 24UL )

-#define portMPU_REGION_READ_ONLY                                 ( 0x06UL << 24UL )

-#define portMPU_REGION_PRIVILEGED_READ_WRITE                     ( 0x01UL << 24UL )

-#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY    ( 0x02UL << 24UL )

-#define portMPU_REGION_CACHEABLE_BUFFERABLE                      ( 0x07UL << 16UL )

-#define portMPU_REGION_EXECUTE_NEVER                             ( 0x01UL << 28UL )

-

-/* Location of the TEX,S,C,B bits in the MPU Region Attribute and Size

- * Register (RASR). */

-#define portMPU_RASR_TEX_S_C_B_LOCATION                          ( 16UL )

-#define portMPU_RASR_TEX_S_C_B_MASK                              ( 0x3FUL )

-

-/* MPU settings that can be overriden in FreeRTOSConfig.h. */

-#ifndef configTOTAL_MPU_REGIONS

-    /* Define to 8 for backward compatibility. */

-    #define configTOTAL_MPU_REGIONS    ( 8UL )

-#endif

-

-/*

- * The TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits define the

- * memory type, and where necessary the cacheable and shareable properties

- * of the memory region.

- *

- * The TEX, C, and B bits together indicate the memory type of the region,

- * and:

- * - For Normal memory, the cacheable properties of the region.

- * - For Device memory, whether the region is shareable.

- *

- * For Normal memory regions, the S bit indicates whether the region is

- * shareable. For Strongly-ordered and Device memory, the S bit is ignored.

- *

- * See the following two tables for setting TEX, S, C and B bits for

- * unprivileged flash, privileged flash and privileged RAM regions.

- *

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | TEX | C | B | Memory type            |  Description or Normal region cacheability             |  Shareable?             |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 000 | 0 | 0 | Strongly-ordered       |  Strongly ordered                                      |  Shareable              |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 000 | 0 | 1 | Device                 |  Shared device                                         |  Shareable              |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 000 | 1 | 0 | Normal                 |  Outer and inner   write-through; no write allocate    |  S bit                  |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 000 | 1 | 1 | Normal                 |  Outer and inner   write-back; no write allocate       |  S bit                  |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 001 | 0 | 0 | Normal                 |  Outer and inner   Non-cacheable                       |  S bit                  |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 001 | 0 | 1 | Reserved               |  Reserved                                              |  Reserved               |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 001 | 1 | 0 | IMPLEMENTATION DEFINED |  IMPLEMENTATION DEFINED                                |  IMPLEMENTATION DEFINED |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 001 | 1 | 1 | Normal                 |  Outer and inner   write-back; write and read allocate |  S bit                  |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 010 | 0 | 0 | Device                 |  Non-shared device                                     |  Not shareable          |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 010 | 0 | 1 | Reserved               |  Reserved                                              |  Reserved               |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 010 | 1 | X | Reserved               |  Reserved                                              |  Reserved               |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 011 | X | X | Reserved               |  Reserved                                              |  Reserved               |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- | 1BB | A | A | Normal                 | Cached memory, with AA and BB indicating the inner and |  Reserved               |

- |     |   |   |                        | outer cacheability rules that must be exported on the  |                         |

- |     |   |   |                        | bus. See the table below for the cacheability policy   |                         |

- |     |   |   |                        | encoding. memory, BB=Outer policy, AA=Inner policy.    |                         |

- +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+

- |

- +-----------------------------------------+----------------------------------------+

- | AA or BB subfield of {TEX,C,B} encoding |  Cacheability policy                   |

- +-----------------------------------------+----------------------------------------+

- | 00                                      |  Non-cacheable                         |

- +-----------------------------------------+----------------------------------------+

- | 01                                      |  Write-back, write and   read allocate |

- +-----------------------------------------+----------------------------------------+

- | 10                                      |  Write-through, no write   allocate    |

- +-----------------------------------------+----------------------------------------+

- | 11                                      |  Write-back, no write   allocate       |

- +-----------------------------------------+----------------------------------------+

- */

-

-/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for flash

- * region. */

-#ifndef configTEX_S_C_B_FLASH

-    /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */

-    #define configTEX_S_C_B_FLASH    ( 0x07UL )

-#endif

-

-/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for RAM

- * region. */

-#ifndef configTEX_S_C_B_SRAM

-    /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */

-    #define configTEX_S_C_B_SRAM          ( 0x07UL )

-#endif

-

-#define portGENERAL_PERIPHERALS_REGION    ( configTOTAL_MPU_REGIONS - 5UL )

-#define portSTACK_REGION                  ( configTOTAL_MPU_REGIONS - 4UL )

-#define portUNPRIVILEGED_FLASH_REGION     ( configTOTAL_MPU_REGIONS - 3UL )

-#define portPRIVILEGED_FLASH_REGION       ( configTOTAL_MPU_REGIONS - 2UL )

-#define portPRIVILEGED_RAM_REGION         ( configTOTAL_MPU_REGIONS - 1UL )

-#define portFIRST_CONFIGURABLE_REGION     ( 0UL )

-#define portLAST_CONFIGURABLE_REGION      ( configTOTAL_MPU_REGIONS - 6UL )

-#define portNUM_CONFIGURABLE_REGIONS      ( configTOTAL_MPU_REGIONS - 5UL )

-#define portTOTAL_NUM_REGIONS_IN_TCB      ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus 1 to create space for the stack region. */

-

-#define portSWITCH_TO_USER_MODE()    __asm volatile ( " mrs r0, control \n orr r0, r0, #1 \n msr control, r0 " ::: "r0", "memory" )

-

-typedef struct MPU_REGION_REGISTERS

-{

-    uint32_t ulRegionBaseAddress;

-    uint32_t ulRegionAttribute;

-} xMPU_REGION_REGISTERS;

-

-typedef struct MPU_SETTINGS

-{

-    xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS_IN_TCB ];

-} xMPU_SETTINGS;

-

-/* Architecture specifics. */

-#define portSTACK_GROWTH      ( -1 )

-#define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portBYTE_ALIGNMENT    8

-/*-----------------------------------------------------------*/

-

-/* SVC numbers for various services. */

-#define portSVC_START_SCHEDULER    0

-#define portSVC_YIELD              1

-#define portSVC_RAISE_PRIVILEGE    2

-

-/* Scheduler utilities. */

-

-#define portYIELD()    __asm volatile ( "	SVC	%0	\n"::"i" ( portSVC_YIELD ) : "memory" )

-#define portYIELD_WITHIN_API()                          \

-    {                                                   \

-        /* Set a PendSV to request a context switch. */ \

-        portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \

-        __DSB();                                        \

-        __ISB();                                        \

-    }

-

-#define portNVIC_INT_CTRL_REG     ( *( ( volatile uint32_t * ) 0xe000ed04 ) )

-#define portNVIC_PENDSVSET_BIT    ( 1UL << 28UL )

-#define portEND_SWITCHING_ISR( xSwitchRequired )    do { if( xSwitchRequired != pdFALSE ) portYIELD_WITHIN_API(); } while( 0 )

-#define portYIELD_FROM_ISR( x )                     portEND_SWITCHING_ISR( x )

-/*-----------------------------------------------------------*/

-

-/* Architecture specific optimisations. */

-#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

-    #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1

-#endif

-

-#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )

-

-/* Check the configuration. */

-    #if ( configMAX_PRIORITIES > 32 )

-        #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.

-    #endif

-

-/* Store/clear the ready priorities in a bit map. */

-    #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )    ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

-    #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities )     ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

-

-/*-----------------------------------------------------------*/

-

-    #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )    uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) )

-

-#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-/*-----------------------------------------------------------*/

-

-/* Critical section management. */

-extern void vPortEnterCritical( void );

-extern void vPortExitCritical( void );

-

-#if( configENABLE_ERRATA_837070_WORKAROUND == 1 )

-    #define portDISABLE_INTERRUPTS()                               \

-        {                                                          \

-            __disable_interrupt();                                 \

-            __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \

-            __DSB();                                               \

-            __ISB();                                               \

-            __enable_interrupt();                                  \

-        }

-#else

-    #define portDISABLE_INTERRUPTS()                               \

-        {                                                          \

-            __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \

-            __DSB();                                               \

-            __ISB();                                               \

-        }

-#endif

-

-#define portENABLE_INTERRUPTS()                   __set_BASEPRI( 0 )

-#define portENTER_CRITICAL()                      vPortEnterCritical()

-#define portEXIT_CRITICAL()                       vPortExitCritical()

-#define portSET_INTERRUPT_MASK_FROM_ISR()         __get_BASEPRI(); portDISABLE_INTERRUPTS()

-#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    __set_BASEPRI( x )

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site.  These are

- * not necessary for to use this port.  They are defined so the common demo files

- * (which build with all the ports) will build. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )

-/*-----------------------------------------------------------*/

-

-#ifdef configASSERT

-    void vPortValidateInterruptPriority( void );

-    #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()    vPortValidateInterruptPriority()

-#endif

-

-/* portNOP() is not required by this port. */

-#define portNOP()

-

-#define portINLINE              __inline

-

-#ifndef portFORCE_INLINE

-    #define portFORCE_INLINE    inline __attribute__( ( always_inline ) )

-#endif

-

-/*-----------------------------------------------------------*/

-

-portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )

-{

-    uint32_t ulCurrentInterrupt;

-    BaseType_t xReturn;

-

-    /* Obtain the number of the currently executing interrupt. */

-    __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );

-

-    if( ulCurrentInterrupt == 0 )

-    {

-        xReturn = pdFALSE;

-    }

-    else

-    {

-        xReturn = pdTRUE;

-    }

-

-    return xReturn;

-}

-

-

-/*-----------------------------------------------------------*/

-

-extern BaseType_t xIsPrivileged( void );

-extern void vResetPrivilege( void );

-

-/**

- * @brief Checks whether or not the processor is privileged.

- *

- * @return 1 if the processor is already privileged, 0 otherwise.

- */

-#define portIS_PRIVILEGED()      xIsPrivileged()

-

-/**

- * @brief Raise an SVC request to raise privilege.

- */

-#define portRAISE_PRIVILEGE()    __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" );

-

-/**

- * @brief Lowers the privilege level by setting the bit 0 of the CONTROL

- * register.

- */

-#define portRESET_PRIVILEGE()    vResetPrivilege()

-/*-----------------------------------------------------------*/

-

-#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY

-    #warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html"

-    #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY    0

-#endif

-/*-----------------------------------------------------------*/

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

- * the source code because to do so would cause other compilers to generate

- * warnings. */

-#pragma diag_suppress=Pe191

-#pragma diag_suppress=Pa082

-#pragma diag_suppress=Be006

-/*-----------------------------------------------------------*/

-

-/* *INDENT-OFF* */

-#ifdef __cplusplus

-    }

-#endif

-/* *INDENT-ON* */

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+    extern "C" {
+#endif
+/* *INDENT-ON* */
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* IAR includes. */
+#include <intrinsics.h>
+
+/* Type definitions. */
+#define portCHAR          char
+#define portFLOAT         float
+#define portDOUBLE        double
+#define portLONG          long
+#define portSHORT         short
+#define portSTACK_TYPE    uint32_t
+#define portBASE_TYPE     long
+
+typedef portSTACK_TYPE   StackType_t;
+typedef long             BaseType_t;
+typedef unsigned long    UBaseType_t;
+
+#if ( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t     TickType_t;
+    #define portMAX_DELAY              ( TickType_t ) 0xffff
+#else
+    typedef uint32_t     TickType_t;
+    #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL
+
+/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+ * not need to be guarded with a critical section. */
+    #define portTICK_TYPE_IS_ATOMIC    1
+#endif
+
+/*-----------------------------------------------------------*/
+
+/* MPU specific constants. */
+#define portUSING_MPU_WRAPPERS                                   1
+#define portPRIVILEGE_BIT                                        ( 0x80000000UL )
+
+#define portMPU_REGION_READ_WRITE                                ( 0x03UL << 24UL )
+#define portMPU_REGION_PRIVILEGED_READ_ONLY                      ( 0x05UL << 24UL )
+#define portMPU_REGION_READ_ONLY                                 ( 0x06UL << 24UL )
+#define portMPU_REGION_PRIVILEGED_READ_WRITE                     ( 0x01UL << 24UL )
+#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY    ( 0x02UL << 24UL )
+#define portMPU_REGION_CACHEABLE_BUFFERABLE                      ( 0x07UL << 16UL )
+#define portMPU_REGION_EXECUTE_NEVER                             ( 0x01UL << 28UL )
+
+/* Location of the TEX,S,C,B bits in the MPU Region Attribute and Size
+ * Register (RASR). */
+#define portMPU_RASR_TEX_S_C_B_LOCATION                          ( 16UL )
+#define portMPU_RASR_TEX_S_C_B_MASK                              ( 0x3FUL )
+
+/* MPU settings that can be overriden in FreeRTOSConfig.h. */
+#ifndef configTOTAL_MPU_REGIONS
+    /* Define to 8 for backward compatibility. */
+    #define configTOTAL_MPU_REGIONS    ( 8UL )
+#endif
+
+/*
+ * The TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits define the
+ * memory type, and where necessary the cacheable and shareable properties
+ * of the memory region.
+ *
+ * The TEX, C, and B bits together indicate the memory type of the region,
+ * and:
+ * - For Normal memory, the cacheable properties of the region.
+ * - For Device memory, whether the region is shareable.
+ *
+ * For Normal memory regions, the S bit indicates whether the region is
+ * shareable. For Strongly-ordered and Device memory, the S bit is ignored.
+ *
+ * See the following two tables for setting TEX, S, C and B bits for
+ * unprivileged flash, privileged flash and privileged RAM regions.
+ *
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | TEX | C | B | Memory type            |  Description or Normal region cacheability             |  Shareable?             |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 000 | 0 | 0 | Strongly-ordered       |  Strongly ordered                                      |  Shareable              |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 000 | 0 | 1 | Device                 |  Shared device                                         |  Shareable              |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 000 | 1 | 0 | Normal                 |  Outer and inner   write-through; no write allocate    |  S bit                  |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 000 | 1 | 1 | Normal                 |  Outer and inner   write-back; no write allocate       |  S bit                  |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 001 | 0 | 0 | Normal                 |  Outer and inner   Non-cacheable                       |  S bit                  |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 001 | 0 | 1 | Reserved               |  Reserved                                              |  Reserved               |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 001 | 1 | 0 | IMPLEMENTATION DEFINED |  IMPLEMENTATION DEFINED                                |  IMPLEMENTATION DEFINED |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 001 | 1 | 1 | Normal                 |  Outer and inner   write-back; write and read allocate |  S bit                  |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 010 | 0 | 0 | Device                 |  Non-shared device                                     |  Not shareable          |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 010 | 0 | 1 | Reserved               |  Reserved                                              |  Reserved               |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 010 | 1 | X | Reserved               |  Reserved                                              |  Reserved               |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 011 | X | X | Reserved               |  Reserved                                              |  Reserved               |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ | 1BB | A | A | Normal                 | Cached memory, with AA and BB indicating the inner and |  Reserved               |
+ |     |   |   |                        | outer cacheability rules that must be exported on the  |                         |
+ |     |   |   |                        | bus. See the table below for the cacheability policy   |                         |
+ |     |   |   |                        | encoding. memory, BB=Outer policy, AA=Inner policy.    |                         |
+ +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+
+ |
+ +-----------------------------------------+----------------------------------------+
+ | AA or BB subfield of {TEX,C,B} encoding |  Cacheability policy                   |
+ +-----------------------------------------+----------------------------------------+
+ | 00                                      |  Non-cacheable                         |
+ +-----------------------------------------+----------------------------------------+
+ | 01                                      |  Write-back, write and   read allocate |
+ +-----------------------------------------+----------------------------------------+
+ | 10                                      |  Write-through, no write   allocate    |
+ +-----------------------------------------+----------------------------------------+
+ | 11                                      |  Write-back, no write   allocate       |
+ +-----------------------------------------+----------------------------------------+
+ */
+
+/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for flash
+ * region. */
+#ifndef configTEX_S_C_B_FLASH
+    /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */
+    #define configTEX_S_C_B_FLASH    ( 0x07UL )
+#endif
+
+/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for RAM
+ * region. */
+#ifndef configTEX_S_C_B_SRAM
+    /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */
+    #define configTEX_S_C_B_SRAM          ( 0x07UL )
+#endif
+
+#define portGENERAL_PERIPHERALS_REGION    ( configTOTAL_MPU_REGIONS - 5UL )
+#define portSTACK_REGION                  ( configTOTAL_MPU_REGIONS - 4UL )
+#define portUNPRIVILEGED_FLASH_REGION     ( configTOTAL_MPU_REGIONS - 3UL )
+#define portPRIVILEGED_FLASH_REGION       ( configTOTAL_MPU_REGIONS - 2UL )
+#define portPRIVILEGED_RAM_REGION         ( configTOTAL_MPU_REGIONS - 1UL )
+#define portFIRST_CONFIGURABLE_REGION     ( 0UL )
+#define portLAST_CONFIGURABLE_REGION      ( configTOTAL_MPU_REGIONS - 6UL )
+#define portNUM_CONFIGURABLE_REGIONS      ( configTOTAL_MPU_REGIONS - 5UL )
+#define portTOTAL_NUM_REGIONS_IN_TCB      ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus 1 to create space for the stack region. */
+
+#define portSWITCH_TO_USER_MODE()    __asm volatile ( " mrs r0, control \n orr r0, r0, #1 \n msr control, r0 " ::: "r0", "memory" )
+
+typedef struct MPU_REGION_REGISTERS
+{
+    uint32_t ulRegionBaseAddress;
+    uint32_t ulRegionAttribute;
+} xMPU_REGION_REGISTERS;
+
+typedef struct MPU_SETTINGS
+{
+    xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS_IN_TCB ];
+} xMPU_SETTINGS;
+
+/* Architecture specifics. */
+#define portSTACK_GROWTH      ( -1 )
+#define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT    8
+/*-----------------------------------------------------------*/
+
+/* SVC numbers for various services. */
+#define portSVC_START_SCHEDULER    0
+#define portSVC_YIELD              1
+#define portSVC_RAISE_PRIVILEGE    2
+
+/* Scheduler utilities. */
+
+#define portYIELD()    __asm volatile ( "   SVC %0  \n"::"i" ( portSVC_YIELD ) : "memory" )
+#define portYIELD_WITHIN_API()                          \
+    {                                                   \
+        /* Set a PendSV to request a context switch. */ \
+        portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \
+        __DSB();                                        \
+        __ISB();                                        \
+    }
+
+#define portNVIC_INT_CTRL_REG     ( *( ( volatile uint32_t * ) 0xe000ed04 ) )
+#define portNVIC_PENDSVSET_BIT    ( 1UL << 28UL )
+#define portEND_SWITCHING_ISR( xSwitchRequired )    do { if( xSwitchRequired != pdFALSE ) portYIELD_WITHIN_API(); } while( 0 )
+#define portYIELD_FROM_ISR( x )                     portEND_SWITCHING_ISR( x )
+/*-----------------------------------------------------------*/
+
+/* Architecture specific optimisations. */
+#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
+    #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1
+#endif
+
+#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )
+
+/* Check the configuration. */
+    #if ( configMAX_PRIORITIES > 32 )
+        #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.
+    #endif
+
+/* Store/clear the ready priorities in a bit map. */
+    #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )    ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
+    #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities )     ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
+
+/*-----------------------------------------------------------*/
+
+    #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )    uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) )
+
+#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+/*-----------------------------------------------------------*/
+
+/* Critical section management. */
+extern void vPortEnterCritical( void );
+extern void vPortExitCritical( void );
+
+#if( configENABLE_ERRATA_837070_WORKAROUND == 1 )
+    #define portDISABLE_INTERRUPTS()                               \
+        {                                                          \
+            __disable_interrupt();                                 \
+            __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \
+            __DSB();                                               \
+            __ISB();                                               \
+            __enable_interrupt();                                  \
+        }
+#else
+    #define portDISABLE_INTERRUPTS()                               \
+        {                                                          \
+            __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \
+            __DSB();                                               \
+            __ISB();                                               \
+        }
+#endif
+
+#define portENABLE_INTERRUPTS()                   __set_BASEPRI( 0 )
+#define portENTER_CRITICAL()                      vPortEnterCritical()
+#define portEXIT_CRITICAL()                       vPortExitCritical()
+#define portSET_INTERRUPT_MASK_FROM_ISR()         __get_BASEPRI(); portDISABLE_INTERRUPTS()
+#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    __set_BASEPRI( x )
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site.  These are
+ * not necessary for to use this port.  They are defined so the common demo files
+ * (which build with all the ports) will build. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )
+/*-----------------------------------------------------------*/
+
+#ifdef configASSERT
+    void vPortValidateInterruptPriority( void );
+    #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()    vPortValidateInterruptPriority()
+#endif
+
+/* portNOP() is not required by this port. */
+#define portNOP()
+
+#define portINLINE              __inline
+
+#ifndef portFORCE_INLINE
+    #define portFORCE_INLINE    inline __attribute__( ( always_inline ) )
+#endif
+
+/*-----------------------------------------------------------*/
+
+portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
+{
+    uint32_t ulCurrentInterrupt;
+    BaseType_t xReturn;
+
+    /* Obtain the number of the currently executing interrupt. */
+    __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );
+
+    if( ulCurrentInterrupt == 0 )
+    {
+        xReturn = pdFALSE;
+    }
+    else
+    {
+        xReturn = pdTRUE;
+    }
+
+    return xReturn;
+}
+
+
+/*-----------------------------------------------------------*/
+
+extern BaseType_t xIsPrivileged( void );
+extern void vResetPrivilege( void );
+
+/**
+ * @brief Checks whether or not the processor is privileged.
+ *
+ * @return 1 if the processor is already privileged, 0 otherwise.
+ */
+#define portIS_PRIVILEGED()      xIsPrivileged()
+
+/**
+ * @brief Raise an SVC request to raise privilege.
+ */
+#define portRAISE_PRIVILEGE()    __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" );
+
+/**
+ * @brief Lowers the privilege level by setting the bit 0 of the CONTROL
+ * register.
+ */
+#define portRESET_PRIVILEGE()    vResetPrivilege()
+/*-----------------------------------------------------------*/
+
+#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY
+    #warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html"
+    #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY    0
+#endif
+/*-----------------------------------------------------------*/
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+ * the source code because to do so would cause other compilers to generate
+ * warnings. */
+#pragma diag_suppress=Pe191
+#pragma diag_suppress=Pa082
+#pragma diag_suppress=Be006
+/*-----------------------------------------------------------*/
+
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+    }
+#endif
+/* *INDENT-ON* */
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CM55/non_secure/portasm.s b/portable/IAR/ARM_CM55/non_secure/portasm.s
index 33817d0..a193cd7 100644
--- a/portable/IAR/ARM_CM55/non_secure/portasm.s
+++ b/portable/IAR/ARM_CM55/non_secure/portasm.s
@@ -32,322 +32,322 @@
 files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
 #include "FreeRTOSConfig.h"
 
-	EXTERN pxCurrentTCB
-	EXTERN xSecureContext
-	EXTERN vTaskSwitchContext
-	EXTERN vPortSVCHandler_C
-	EXTERN SecureContext_SaveContext
-	EXTERN SecureContext_LoadContext
+    EXTERN pxCurrentTCB
+    EXTERN xSecureContext
+    EXTERN vTaskSwitchContext
+    EXTERN vPortSVCHandler_C
+    EXTERN SecureContext_SaveContext
+    EXTERN SecureContext_LoadContext
 
-	PUBLIC xIsPrivileged
-	PUBLIC vResetPrivilege
-	PUBLIC vPortAllocateSecureContext
-	PUBLIC vRestoreContextOfFirstTask
-	PUBLIC vRaisePrivilege
-	PUBLIC vStartFirstTask
-	PUBLIC ulSetInterruptMask
-	PUBLIC vClearInterruptMask
-	PUBLIC PendSV_Handler
-	PUBLIC SVC_Handler
-	PUBLIC vPortFreeSecureContext
+    PUBLIC xIsPrivileged
+    PUBLIC vResetPrivilege
+    PUBLIC vPortAllocateSecureContext
+    PUBLIC vRestoreContextOfFirstTask
+    PUBLIC vRaisePrivilege
+    PUBLIC vStartFirstTask
+    PUBLIC ulSetInterruptMask
+    PUBLIC vClearInterruptMask
+    PUBLIC PendSV_Handler
+    PUBLIC SVC_Handler
+    PUBLIC vPortFreeSecureContext
 /*-----------------------------------------------------------*/
 
 /*---------------- Unprivileged Functions -------------------*/
 
 /*-----------------------------------------------------------*/
 
-	SECTION .text:CODE:NOROOT(2)
-	THUMB
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
 /*-----------------------------------------------------------*/
 
 xIsPrivileged:
-	mrs r0, control							/* r0 = CONTROL. */
-	tst r0, #1								/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
-	ite ne
-	movne r0, #0							/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
-	moveq r0, #1							/* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */
-	bx lr									/* Return. */
+    mrs r0, control                         /* r0 = CONTROL. */
+    tst r0, #1                              /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
+    ite ne
+    movne r0, #0                            /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
+    moveq r0, #1                            /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */
+    bx lr                                   /* Return. */
 /*-----------------------------------------------------------*/
 
 vResetPrivilege:
-	mrs r0, control							/* r0 = CONTROL. */
-	orr r0, r0, #1							/* r0 = r0 | 1. */
-	msr control, r0							/* CONTROL = r0. */
-	bx lr									/* Return to the caller. */
+    mrs r0, control                         /* r0 = CONTROL. */
+    orr r0, r0, #1                          /* r0 = r0 | 1. */
+    msr control, r0                         /* CONTROL = r0. */
+    bx lr                                   /* Return to the caller. */
 /*-----------------------------------------------------------*/
 
 vPortAllocateSecureContext:
-	svc 0									/* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */
-	bx lr									/* Return. */
+    svc 0                                   /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */
+    bx lr                                   /* Return. */
 /*-----------------------------------------------------------*/
 
 /*----------------- Privileged Functions --------------------*/
 
 /*-----------------------------------------------------------*/
 
-	SECTION privileged_functions:CODE:NOROOT(2)
-	THUMB
+    SECTION privileged_functions:CODE:NOROOT(2)
+    THUMB
 /*-----------------------------------------------------------*/
 
 vRestoreContextOfFirstTask:
-	ldr  r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
-	ldr  r3, [r2]							/* Read pxCurrentTCB. */
-	ldr  r0, [r3]							/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
+    ldr  r2, =pxCurrentTCB                  /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr  r3, [r2]                           /* Read pxCurrentTCB. */
+    ldr  r0, [r3]                           /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
 
 #if ( configENABLE_MPU == 1 )
-	dmb										/* Complete outstanding transfers before disabling MPU. */
-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */
-	bic r4, r4, #1							/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
-	str r4, [r2]							/* Disable MPU. */
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    bic r4, r4, #1                          /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+    str r4, [r2]                            /* Disable MPU. */
 
-	adds r3, #4								/* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
-	ldr  r4, [r3]							/* r4 = *r3 i.e. r4 = MAIR0. */
-	ldr  r2, =0xe000edc0					/* r2 = 0xe000edc0 [Location of MAIR0]. */
-	str  r4, [r2]							/* Program MAIR0. */
-	ldr  r2, =0xe000ed98					/* r2 = 0xe000ed98 [Location of RNR]. */
-	movs r4, #4								/* r4 = 4. */
-	str  r4, [r2]							/* Program RNR = 4. */
-	adds r3, #4								/* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
-	ldr  r2, =0xe000ed9c					/* r2 = 0xe000ed9c [Location of RBAR]. */
-	ldmia r3!, {r4-r11}						/* Read 4 set of RBAR/RLAR registers from TCB. */
-	stmia r2!, {r4-r11}						/* Write 4 set of RBAR/RLAR registers using alias registers. */
+    adds r3, #4                             /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
+    ldr  r4, [r3]                           /* r4 = *r3 i.e. r4 = MAIR0. */
+    ldr  r2, =0xe000edc0                    /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str  r4, [r2]                           /* Program MAIR0. */
+    ldr  r2, =0xe000ed98                    /* r2 = 0xe000ed98 [Location of RNR]. */
+    movs r4, #4                             /* r4 = 4. */
+    str  r4, [r2]                           /* Program RNR = 4. */
+    adds r3, #4                             /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
+    ldr  r2, =0xe000ed9c                    /* r2 = 0xe000ed9c [Location of RBAR]. */
+    ldmia r3!, {r4-r11}                     /* Read 4 set of RBAR/RLAR registers from TCB. */
+    stmia r2!, {r4-r11}                     /* Write 4 set of RBAR/RLAR registers using alias registers. */
 
-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */
-	orr r4, r4, #1							/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
-	str r4, [r2]							/* Enable MPU. */
-	dsb										/* Force memory writes before continuing. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    orr r4, r4, #1                          /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+    str r4, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
 #endif /* configENABLE_MPU */
 
 #if ( configENABLE_MPU == 1 )
-	ldm  r0!, {r1-r4}						/* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */
-	ldr  r5, =xSecureContext
-	str  r1, [r5]							/* Set xSecureContext to this task's value for the same. */
-	msr  psplim, r2							/* Set this task's PSPLIM value. */
-	msr  control, r3						/* Set this task's CONTROL value. */
-	adds r0, #32							/* Discard everything up to r0. */
-	msr  psp, r0							/* This is now the new top of stack to use in the task. */
-	isb
-	mov  r0, #0
-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */
-	bx   r4									/* Finally, branch to EXC_RETURN. */
+    ldm  r0!, {r1-r4}                       /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */
+    ldr  r5, =xSecureContext
+    str  r1, [r5]                           /* Set xSecureContext to this task's value for the same. */
+    msr  psplim, r2                         /* Set this task's PSPLIM value. */
+    msr  control, r3                        /* Set this task's CONTROL value. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r4                                 /* Finally, branch to EXC_RETURN. */
 #else /* configENABLE_MPU */
-	ldm  r0!, {r1-r3}						/* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
-	ldr  r4, =xSecureContext
-	str  r1, [r4]							/* Set xSecureContext to this task's value for the same. */
-	msr  psplim, r2							/* Set this task's PSPLIM value. */
-	movs r1, #2								/* r1 = 2. */
-	msr  CONTROL, r1						/* Switch to use PSP in the thread mode. */
-	adds r0, #32							/* Discard everything up to r0. */
-	msr  psp, r0							/* This is now the new top of stack to use in the task. */
-	isb
-	mov  r0, #0
-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */
-	bx   r3									/* Finally, branch to EXC_RETURN. */
+    ldm  r0!, {r1-r3}                       /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
+    ldr  r4, =xSecureContext
+    str  r1, [r4]                           /* Set xSecureContext to this task's value for the same. */
+    msr  psplim, r2                         /* Set this task's PSPLIM value. */
+    movs r1, #2                             /* r1 = 2. */
+    msr  CONTROL, r1                        /* Switch to use PSP in the thread mode. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r3                                 /* Finally, branch to EXC_RETURN. */
 #endif /* configENABLE_MPU */
 /*-----------------------------------------------------------*/
 
 vRaisePrivilege:
-	mrs  r0, control						/* Read the CONTROL register. */
-	bic r0, r0, #1							/* Clear the bit 0. */
-	msr  control, r0						/* Write back the new CONTROL value. */
-	bx lr									/* Return to the caller. */
+    mrs  r0, control                        /* Read the CONTROL register. */
+    bic r0, r0, #1                          /* Clear the bit 0. */
+    msr  control, r0                        /* Write back the new CONTROL value. */
+    bx lr                                   /* Return to the caller. */
 /*-----------------------------------------------------------*/
 
 vStartFirstTask:
-	ldr r0, =0xe000ed08						/* Use the NVIC offset register to locate the stack. */
-	ldr r0, [r0]							/* Read the VTOR register which gives the address of vector table. */
-	ldr r0, [r0]							/* The first entry in vector table is stack pointer. */
-	msr msp, r0								/* Set the MSP back to the start of the stack. */
-	cpsie i									/* Globally enable interrupts. */
-	cpsie f
-	dsb
-	isb
-	svc 2									/* System call to start the first task. portSVC_START_SCHEDULER = 2. */
+    ldr r0, =0xe000ed08                     /* Use the NVIC offset register to locate the stack. */
+    ldr r0, [r0]                            /* Read the VTOR register which gives the address of vector table. */
+    ldr r0, [r0]                            /* The first entry in vector table is stack pointer. */
+    msr msp, r0                             /* Set the MSP back to the start of the stack. */
+    cpsie i                                 /* Globally enable interrupts. */
+    cpsie f
+    dsb
+    isb
+    svc 2                                   /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
 /*-----------------------------------------------------------*/
 
 ulSetInterruptMask:
-	mrs r0, basepri							/* r0 = basepri. Return original basepri value. */
-	mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
-	msr basepri, r1							/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
-	dsb
-	isb
-	bx lr									/* Return. */
+    mrs r0, basepri                         /* r0 = basepri. Return original basepri value. */
+    mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r1                         /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
 /*-----------------------------------------------------------*/
 
 vClearInterruptMask:
-	msr basepri, r0							/* basepri = ulMask. */
-	dsb
-	isb
-	bx lr									/* Return. */
+    msr basepri, r0                         /* basepri = ulMask. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
 /*-----------------------------------------------------------*/
 
 PendSV_Handler:
-	ldr r3, =xSecureContext					/* Read the location of xSecureContext i.e. &( xSecureContext ). */
-	ldr r0, [r3]							/* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */
-	ldr r3, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
-	ldr r1, [r3]							/* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */
-	mrs r2, psp								/* Read PSP in r2. */
+    ldr r3, =xSecureContext                 /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+    ldr r0, [r3]                            /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */
+    ldr r3, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r3]                            /* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */
+    mrs r2, psp                             /* Read PSP in r2. */
 
-	cbz r0, save_ns_context					/* No secure context to save. */
-	push {r0-r2, r14}
-	bl SecureContext_SaveContext			/* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
-	pop {r0-r3}								/* LR is now in r3. */
-	mov lr, r3								/* LR = r3. */
-	lsls r1, r3, #25						/* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
-	bpl save_ns_context						/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+    cbz r0, save_ns_context                 /* No secure context to save. */
+    push {r0-r2, r14}
+    bl SecureContext_SaveContext            /* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+    pop {r0-r3}                             /* LR is now in r3. */
+    mov lr, r3                              /* LR = r3. */
+    lsls r1, r3, #25                        /* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+    bpl save_ns_context                     /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
 
-	ldr r3, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
-	ldr r1, [r3]							/* Read pxCurrentTCB. */
+    ldr r3, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r3]                            /* Read pxCurrentTCB. */
 #if ( configENABLE_MPU == 1 )
-	subs r2, r2, #16						/* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */
-	str r2, [r1]							/* Save the new top of stack in TCB. */
-	mrs r1, psplim							/* r1 = PSPLIM. */
-	mrs r3, control							/* r3 = CONTROL. */
-	mov r4, lr								/* r4 = LR/EXC_RETURN. */
-	stmia r2!, {r0, r1, r3, r4}				/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+    subs r2, r2, #16                        /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+    str r2, [r1]                            /* Save the new top of stack in TCB. */
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mrs r3, control                         /* r3 = CONTROL. */
+    mov r4, lr                              /* r4 = LR/EXC_RETURN. */
+    stmia r2!, {r0, r1, r3, r4}             /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
 #else /* configENABLE_MPU */
-	subs r2, r2, #12						/* Make space for xSecureContext, PSPLIM and LR on the stack. */
-	str r2, [r1]							/* Save the new top of stack in TCB. */
-	mrs r1, psplim							/* r1 = PSPLIM. */
-	mov r3, lr								/* r3 = LR/EXC_RETURN. */
-	stmia r2!, {r0, r1, r3}					/* Store xSecureContext, PSPLIM and LR on the stack. */
+    subs r2, r2, #12                        /* Make space for xSecureContext, PSPLIM and LR on the stack. */
+    str r2, [r1]                            /* Save the new top of stack in TCB. */
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmia r2!, {r0, r1, r3}                 /* Store xSecureContext, PSPLIM and LR on the stack. */
 #endif /* configENABLE_MPU */
-	b select_next_task
+    b select_next_task
 
-	save_ns_context:
-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
-		ldr r1, [r3]						/* Read pxCurrentTCB. */
-	#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
-		tst lr, #0x10						/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
-		it eq
-		vstmdbeq r2!, {s16-s31}				/* Store the additional FP context registers which are not saved automatically. */
-	#endif /* configENABLE_FPU || configENABLE_MVE */
-	#if ( configENABLE_MPU == 1 )
-		subs r2, r2, #48					/* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */
-		str r2, [r1]						/* Save the new top of stack in TCB. */
-		adds r2, r2, #16					/* r2 = r2 + 16. */
-		stm r2, {r4-r11}					/* Store the registers that are not saved automatically. */
-		mrs r1, psplim						/* r1 = PSPLIM. */
-		mrs r3, control						/* r3 = CONTROL. */
-		mov r4, lr							/* r4 = LR/EXC_RETURN. */
-		subs r2, r2, #16					/* r2 = r2 - 16. */
-		stmia r2!, {r0, r1, r3, r4}			/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
-	#else /* configENABLE_MPU */
-		subs r2, r2, #44					/* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */
-		str r2, [r1]						/* Save the new top of stack in TCB. */
-		adds r2, r2, #12					/* r2 = r2 + 12. */
-		stm r2, {r4-r11}					/* Store the registers that are not saved automatically. */
-		mrs r1, psplim						/* r1 = PSPLIM. */
-		mov r3, lr							/* r3 = LR/EXC_RETURN. */
-		subs r2, r2, #12					/* r2 = r2 - 12. */
-		stmia r2!, {r0, r1, r3}				/* Store xSecureContext, PSPLIM and LR on the stack. */
-	#endif /* configENABLE_MPU */
+    save_ns_context:
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+    #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+        tst lr, #0x10                       /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+        it eq
+        vstmdbeq r2!, {s16-s31}             /* Store the additional FP context registers which are not saved automatically. */
+    #endif /* configENABLE_FPU || configENABLE_MVE */
+    #if ( configENABLE_MPU == 1 )
+        subs r2, r2, #48                    /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */
+        str r2, [r1]                        /* Save the new top of stack in TCB. */
+        adds r2, r2, #16                    /* r2 = r2 + 16. */
+        stm r2, {r4-r11}                    /* Store the registers that are not saved automatically. */
+        mrs r1, psplim                      /* r1 = PSPLIM. */
+        mrs r3, control                     /* r3 = CONTROL. */
+        mov r4, lr                          /* r4 = LR/EXC_RETURN. */
+        subs r2, r2, #16                    /* r2 = r2 - 16. */
+        stmia r2!, {r0, r1, r3, r4}         /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+    #else /* configENABLE_MPU */
+        subs r2, r2, #44                    /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */
+        str r2, [r1]                        /* Save the new top of stack in TCB. */
+        adds r2, r2, #12                    /* r2 = r2 + 12. */
+        stm r2, {r4-r11}                    /* Store the registers that are not saved automatically. */
+        mrs r1, psplim                      /* r1 = PSPLIM. */
+        mov r3, lr                          /* r3 = LR/EXC_RETURN. */
+        subs r2, r2, #12                    /* r2 = r2 - 12. */
+        stmia r2!, {r0, r1, r3}             /* Store xSecureContext, PSPLIM and LR on the stack. */
+    #endif /* configENABLE_MPU */
 
-	select_next_task:
-		mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
-		msr basepri, r0						/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
-		dsb
-		isb
-		bl vTaskSwitchContext
-		mov r0, #0							/* r0 = 0. */
-		msr basepri, r0						/* Enable interrupts. */
+    select_next_task:
+        mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+        msr basepri, r0                     /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+        dsb
+        isb
+        bl vTaskSwitchContext
+        mov r0, #0                          /* r0 = 0. */
+        msr basepri, r0                     /* Enable interrupts. */
 
-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
-		ldr r1, [r3]						/* Read pxCurrentTCB. */
-		ldr r2, [r1]						/* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        ldr r2, [r1]                        /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
 
-	#if ( configENABLE_MPU == 1 )
-		dmb									/* Complete outstanding transfers before disabling MPU. */
-		ldr r3, =0xe000ed94					/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */
-		ldr r4, [r3]						/* Read the value of MPU_CTRL. */
-		bic r4, r4, #1						/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
-		str r4, [r3]						/* Disable MPU. */
+    #if ( configENABLE_MPU == 1 )
+        dmb                                 /* Complete outstanding transfers before disabling MPU. */
+        ldr r3, =0xe000ed94                 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */
+        ldr r4, [r3]                        /* Read the value of MPU_CTRL. */
+        bic r4, r4, #1                      /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+        str r4, [r3]                        /* Disable MPU. */
 
-		adds r1, #4							/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
-		ldr r4, [r1]						/* r4 = *r1 i.e. r4 = MAIR0. */
-		ldr r3, =0xe000edc0					/* r3 = 0xe000edc0 [Location of MAIR0]. */
-		str r4, [r3]						/* Program MAIR0. */
-		ldr r3, =0xe000ed98					/* r3 = 0xe000ed98 [Location of RNR]. */
-		movs r4, #4							/* r4 = 4. */
-		str r4, [r3]						/* Program RNR = 4. */
-		adds r1, #4							/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
-		ldr  r3, =0xe000ed9c				/* r3 = 0xe000ed9c [Location of RBAR]. */
-		ldmia r1!, {r4-r11}					/* Read 4 sets of RBAR/RLAR registers from TCB. */
-		stmia r3!, {r4-r11}					/* Write 4 set of RBAR/RLAR registers using alias registers. */
+        adds r1, #4                         /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+        ldr r4, [r1]                        /* r4 = *r1 i.e. r4 = MAIR0. */
+        ldr r3, =0xe000edc0                 /* r3 = 0xe000edc0 [Location of MAIR0]. */
+        str r4, [r3]                        /* Program MAIR0. */
+        ldr r3, =0xe000ed98                 /* r3 = 0xe000ed98 [Location of RNR]. */
+        movs r4, #4                         /* r4 = 4. */
+        str r4, [r3]                        /* Program RNR = 4. */
+        adds r1, #4                         /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+        ldr  r3, =0xe000ed9c                /* r3 = 0xe000ed9c [Location of RBAR]. */
+        ldmia r1!, {r4-r11}                 /* Read 4 sets of RBAR/RLAR registers from TCB. */
+        stmia r3!, {r4-r11}                 /* Write 4 set of RBAR/RLAR registers using alias registers. */
 
-		ldr r3, =0xe000ed94					/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */
-		ldr r4, [r3]						/* Read the value of MPU_CTRL. */
-		orr r4, r4, #1						/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
-		str r4, [r3]						/* Enable MPU. */
-		dsb									/* Force memory writes before continuing. */
-	#endif /* configENABLE_MPU */
+        ldr r3, =0xe000ed94                 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */
+        ldr r4, [r3]                        /* Read the value of MPU_CTRL. */
+        orr r4, r4, #1                      /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+        str r4, [r3]                        /* Enable MPU. */
+        dsb                                 /* Force memory writes before continuing. */
+    #endif /* configENABLE_MPU */
 
-	#if ( configENABLE_MPU == 1 )
-		ldmia r2!, {r0, r1, r3, r4}			/* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */
-		msr psplim, r1						/* Restore the PSPLIM register value for the task. */
-		msr control, r3						/* Restore the CONTROL register value for the task. */
-		mov lr, r4							/* LR = r4. */
-		ldr r3, =xSecureContext				/* Read the location of xSecureContext i.e. &( xSecureContext ). */
-		str r0, [r3]						/* Restore the task's xSecureContext. */
-		cbz r0, restore_ns_context			/* If there is no secure context for the task, restore the non-secure context. */
-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
-		ldr r1, [r3]						/* Read pxCurrentTCB. */
-		push {r2, r4}
-		bl SecureContext_LoadContext		/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
-		pop {r2, r4}
-		mov lr, r4							/* LR = r4. */
-		lsls r1, r4, #25					/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
-		bpl restore_ns_context				/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
-		msr psp, r2							/* Remember the new top of stack for the task. */
-		bx lr
-	#else /* configENABLE_MPU */
-		ldmia r2!, {r0, r1, r4}				/* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */
-		msr psplim, r1						/* Restore the PSPLIM register value for the task. */
-		mov lr, r4							/* LR = r4. */
-		ldr r3, =xSecureContext				/* Read the location of xSecureContext i.e. &( xSecureContext ). */
-		str r0, [r3]						/* Restore the task's xSecureContext. */
-		cbz r0, restore_ns_context			/* If there is no secure context for the task, restore the non-secure context. */
-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
-		ldr r1, [r3]						/* Read pxCurrentTCB. */
-		push {r2, r4}
-		bl SecureContext_LoadContext		/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
-		pop {r2, r4}
-		mov lr, r4							/* LR = r4. */
-		lsls r1, r4, #25					/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
-		bpl restore_ns_context				/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
-		msr psp, r2							/* Remember the new top of stack for the task. */
-		bx lr
-	#endif /* configENABLE_MPU */
+    #if ( configENABLE_MPU == 1 )
+        ldmia r2!, {r0, r1, r3, r4}         /* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */
+        msr psplim, r1                      /* Restore the PSPLIM register value for the task. */
+        msr control, r3                     /* Restore the CONTROL register value for the task. */
+        mov lr, r4                          /* LR = r4. */
+        ldr r3, =xSecureContext             /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+        str r0, [r3]                        /* Restore the task's xSecureContext. */
+        cbz r0, restore_ns_context          /* If there is no secure context for the task, restore the non-secure context. */
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        push {r2, r4}
+        bl SecureContext_LoadContext        /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+        pop {r2, r4}
+        mov lr, r4                          /* LR = r4. */
+        lsls r1, r4, #25                    /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+        bpl restore_ns_context              /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
+    #else /* configENABLE_MPU */
+        ldmia r2!, {r0, r1, r4}             /* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */
+        msr psplim, r1                      /* Restore the PSPLIM register value for the task. */
+        mov lr, r4                          /* LR = r4. */
+        ldr r3, =xSecureContext             /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+        str r0, [r3]                        /* Restore the task's xSecureContext. */
+        cbz r0, restore_ns_context          /* If there is no secure context for the task, restore the non-secure context. */
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        push {r2, r4}
+        bl SecureContext_LoadContext        /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+        pop {r2, r4}
+        mov lr, r4                          /* LR = r4. */
+        lsls r1, r4, #25                    /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+        bpl restore_ns_context              /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
+    #endif /* configENABLE_MPU */
 
-	restore_ns_context:
-		ldmia r2!, {r4-r11}					/* Restore the registers that are not automatically restored. */
-	#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
-		tst lr, #0x10						/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
-		it eq
-		vldmiaeq r2!, {s16-s31}				/* Restore the additional FP context registers which are not restored automatically. */
-	#endif /* configENABLE_FPU || configENABLE_MVE */
-		msr psp, r2							/* Remember the new top of stack for the task. */
-		bx lr
+    restore_ns_context:
+        ldmia r2!, {r4-r11}                 /* Restore the registers that are not automatically restored. */
+    #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+        tst lr, #0x10                       /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+        it eq
+        vldmiaeq r2!, {s16-s31}             /* Restore the additional FP context registers which are not restored automatically. */
+    #endif /* configENABLE_FPU || configENABLE_MVE */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
 /*-----------------------------------------------------------*/
 
 SVC_Handler:
-	tst lr, #4
-	ite eq
-	mrseq r0, msp
-	mrsne r0, psp
-	b vPortSVCHandler_C
+    tst lr, #4
+    ite eq
+    mrseq r0, msp
+    mrsne r0, psp
+    b vPortSVCHandler_C
 /*-----------------------------------------------------------*/
 
 vPortFreeSecureContext:
-	/* r0 = uint32_t *pulTCB. */
-	ldr r2, [r0]							/* The first item in the TCB is the top of the stack. */
-	ldr r1, [r2]							/* The first item on the stack is the task's xSecureContext. */
-	cmp r1, #0								/* Raise svc if task's xSecureContext is not NULL. */
-	it ne
-	svcne 1									/* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */
-	bx lr									/* Return. */
+    /* r0 = uint32_t *pulTCB. */
+    ldr r2, [r0]                            /* The first item in the TCB is the top of the stack. */
+    ldr r1, [r2]                            /* The first item on the stack is the task's xSecureContext. */
+    cmp r1, #0                              /* Raise svc if task's xSecureContext is not NULL. */
+    it ne
+    svcne 1                                 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */
+    bx lr                                   /* Return. */
 /*-----------------------------------------------------------*/
 
-	END
+    END
diff --git a/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h b/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h
index 4b1f99b..51e21ea 100644
--- a/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h
+++ b/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h
@@ -155,9 +155,9 @@
  * 8-bit values encoded as follows:
  *  Bit[7:4] - 0000 - Device Memory
  *  Bit[3:2] - 00 --> Device-nGnRnE
- *				01 --> Device-nGnRE
- *				10 --> Device-nGRE
- *				11 --> Device-GRE
+ *              01 --> Device-nGnRE
+ *              10 --> Device-nGRE
+ *              11 --> Device-GRE
  *  Bit[1:0] - 00, Reserved.
  */
     #define portMPU_DEVICE_MEMORY_nGnRnE                  ( 0x00 )   /* 0000 0000 */
diff --git a/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s b/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s
index 93b58da..581b84d 100644
--- a/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s
+++ b/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s
@@ -32,231 +32,231 @@
 files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
 #include "FreeRTOSConfig.h"
 
-	EXTERN pxCurrentTCB
-	EXTERN vTaskSwitchContext
-	EXTERN vPortSVCHandler_C
+    EXTERN pxCurrentTCB
+    EXTERN vTaskSwitchContext
+    EXTERN vPortSVCHandler_C
 
-	PUBLIC xIsPrivileged
-	PUBLIC vResetPrivilege
-	PUBLIC vRestoreContextOfFirstTask
-	PUBLIC vRaisePrivilege
-	PUBLIC vStartFirstTask
-	PUBLIC ulSetInterruptMask
-	PUBLIC vClearInterruptMask
-	PUBLIC PendSV_Handler
-	PUBLIC SVC_Handler
+    PUBLIC xIsPrivileged
+    PUBLIC vResetPrivilege
+    PUBLIC vRestoreContextOfFirstTask
+    PUBLIC vRaisePrivilege
+    PUBLIC vStartFirstTask
+    PUBLIC ulSetInterruptMask
+    PUBLIC vClearInterruptMask
+    PUBLIC PendSV_Handler
+    PUBLIC SVC_Handler
 /*-----------------------------------------------------------*/
 
 /*---------------- Unprivileged Functions -------------------*/
 
 /*-----------------------------------------------------------*/
 
-	SECTION .text:CODE:NOROOT(2)
-	THUMB
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
 /*-----------------------------------------------------------*/
 
 xIsPrivileged:
-	mrs r0, control							/* r0 = CONTROL. */
-	tst r0, #1								/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
-	ite ne
-	movne r0, #0							/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
-	moveq r0, #1							/* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */
-	bx lr									/* Return. */
+    mrs r0, control                         /* r0 = CONTROL. */
+    tst r0, #1                              /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
+    ite ne
+    movne r0, #0                            /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
+    moveq r0, #1                            /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */
+    bx lr                                   /* Return. */
 /*-----------------------------------------------------------*/
 
 vResetPrivilege:
-	mrs r0, control							/* r0 = CONTROL. */
-	orr r0, r0, #1							/* r0 = r0 | 1. */
-	msr control, r0							/* CONTROL = r0. */
-	bx lr									/* Return to the caller. */
+    mrs r0, control                         /* r0 = CONTROL. */
+    orr r0, r0, #1                          /* r0 = r0 | 1. */
+    msr control, r0                         /* CONTROL = r0. */
+    bx lr                                   /* Return to the caller. */
 /*-----------------------------------------------------------*/
 
 /*----------------- Privileged Functions --------------------*/
 
 /*-----------------------------------------------------------*/
 
-	SECTION privileged_functions:CODE:NOROOT(2)
-	THUMB
+    SECTION privileged_functions:CODE:NOROOT(2)
+    THUMB
 /*-----------------------------------------------------------*/
 
 vRestoreContextOfFirstTask:
-	ldr  r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
-	ldr  r1, [r2]							/* Read pxCurrentTCB. */
-	ldr  r0, [r1]							/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
+    ldr  r2, =pxCurrentTCB                  /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr  r1, [r2]                           /* Read pxCurrentTCB. */
+    ldr  r0, [r1]                           /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
 
 #if ( configENABLE_MPU == 1 )
-	dmb										/* Complete outstanding transfers before disabling MPU. */
-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */
-	bic r4, r4, #1							/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
-	str r4, [r2]							/* Disable MPU. */
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    bic r4, r4, #1                          /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+    str r4, [r2]                            /* Disable MPU. */
 
-	adds r1, #4								/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
-	ldr r3, [r1]							/* r3 = *r1 i.e. r3 = MAIR0. */
-	ldr r2, =0xe000edc0						/* r2 = 0xe000edc0 [Location of MAIR0]. */
-	str r3, [r2]							/* Program MAIR0. */
-	ldr r2, =0xe000ed98						/* r2 = 0xe000ed98 [Location of RNR]. */
-	movs r3, #4								/* r3 = 4. */
-	str r3, [r2]							/* Program RNR = 4. */
-	adds r1, #4								/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
-	ldr r2, =0xe000ed9c						/* r2 = 0xe000ed9c [Location of RBAR]. */
-	ldmia r1!, {r4-r11}						/* Read 4 sets of RBAR/RLAR registers from TCB. */
-	stmia r2!, {r4-r11}						/* Write 4 set of RBAR/RLAR registers using alias registers. */
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+    ldr r3, [r1]                            /* r3 = *r1 i.e. r3 = MAIR0. */
+    ldr r2, =0xe000edc0                     /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str r3, [r2]                            /* Program MAIR0. */
+    ldr r2, =0xe000ed98                     /* r2 = 0xe000ed98 [Location of RNR]. */
+    movs r3, #4                             /* r3 = 4. */
+    str r3, [r2]                            /* Program RNR = 4. */
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+    ldr r2, =0xe000ed9c                     /* r2 = 0xe000ed9c [Location of RBAR]. */
+    ldmia r1!, {r4-r11}                     /* Read 4 sets of RBAR/RLAR registers from TCB. */
+    stmia r2!, {r4-r11}                     /* Write 4 set of RBAR/RLAR registers using alias registers. */
 
-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */
-	orr r4, r4, #1							/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
-	str r4, [r2]							/* Enable MPU. */
-	dsb										/* Force memory writes before continuing. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    orr r4, r4, #1                          /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+    str r4, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
 #endif /* configENABLE_MPU */
 
 #if ( configENABLE_MPU == 1 )
-	ldm  r0!, {r1-r3}						/* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */
-	msr  psplim, r1							/* Set this task's PSPLIM value. */
-	msr  control, r2						/* Set this task's CONTROL value. */
-	adds r0, #32							/* Discard everything up to r0. */
-	msr  psp, r0							/* This is now the new top of stack to use in the task. */
-	isb
-	mov  r0, #0
-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */
-	bx   r3									/* Finally, branch to EXC_RETURN. */
+    ldm  r0!, {r1-r3}                       /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */
+    msr  psplim, r1                         /* Set this task's PSPLIM value. */
+    msr  control, r2                        /* Set this task's CONTROL value. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r3                                 /* Finally, branch to EXC_RETURN. */
 #else /* configENABLE_MPU */
-	ldm  r0!, {r1-r2}						/* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
-	msr  psplim, r1							/* Set this task's PSPLIM value. */
-	movs r1, #2								/* r1 = 2. */
-	msr  CONTROL, r1						/* Switch to use PSP in the thread mode. */
-	adds r0, #32							/* Discard everything up to r0. */
-	msr  psp, r0							/* This is now the new top of stack to use in the task. */
-	isb
-	mov  r0, #0
-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */
-	bx   r2									/* Finally, branch to EXC_RETURN. */
+    ldm  r0!, {r1-r2}                       /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
+    msr  psplim, r1                         /* Set this task's PSPLIM value. */
+    movs r1, #2                             /* r1 = 2. */
+    msr  CONTROL, r1                        /* Switch to use PSP in the thread mode. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r2                                 /* Finally, branch to EXC_RETURN. */
 #endif /* configENABLE_MPU */
 /*-----------------------------------------------------------*/
 
 vRaisePrivilege:
-	mrs  r0, control						/* Read the CONTROL register. */
-	bic r0, r0, #1							/* Clear the bit 0. */
-	msr  control, r0						/* Write back the new CONTROL value. */
-	bx lr									/* Return to the caller. */
+    mrs  r0, control                        /* Read the CONTROL register. */
+    bic r0, r0, #1                          /* Clear the bit 0. */
+    msr  control, r0                        /* Write back the new CONTROL value. */
+    bx lr                                   /* Return to the caller. */
 /*-----------------------------------------------------------*/
 
 vStartFirstTask:
-	ldr r0, =0xe000ed08						/* Use the NVIC offset register to locate the stack. */
-	ldr r0, [r0]							/* Read the VTOR register which gives the address of vector table. */
-	ldr r0, [r0]							/* The first entry in vector table is stack pointer. */
-	msr msp, r0								/* Set the MSP back to the start of the stack. */
-	cpsie i									/* Globally enable interrupts. */
-	cpsie f
-	dsb
-	isb
-	svc 2									/* System call to start the first task. portSVC_START_SCHEDULER = 2. */
+    ldr r0, =0xe000ed08                     /* Use the NVIC offset register to locate the stack. */
+    ldr r0, [r0]                            /* Read the VTOR register which gives the address of vector table. */
+    ldr r0, [r0]                            /* The first entry in vector table is stack pointer. */
+    msr msp, r0                             /* Set the MSP back to the start of the stack. */
+    cpsie i                                 /* Globally enable interrupts. */
+    cpsie f
+    dsb
+    isb
+    svc 2                                   /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
 /*-----------------------------------------------------------*/
 
 ulSetInterruptMask:
-	mrs r0, basepri							/* r0 = basepri. Return original basepri value. */
-	mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
-	msr basepri, r1							/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
-	dsb
-	isb
-	bx lr									/* Return. */
+    mrs r0, basepri                         /* r0 = basepri. Return original basepri value. */
+    mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r1                         /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
 /*-----------------------------------------------------------*/
 
 vClearInterruptMask:
-	msr basepri, r0							/* basepri = ulMask. */
-	dsb
-	isb
-	bx lr									/* Return. */
+    msr basepri, r0                         /* basepri = ulMask. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
 /*-----------------------------------------------------------*/
 
 PendSV_Handler:
-	mrs r0, psp								/* Read PSP in r0. */
+    mrs r0, psp                             /* Read PSP in r0. */
 #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
-	tst lr, #0x10							/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
-	it eq
-	vstmdbeq r0!, {s16-s31}					/* Store the additional FP context registers which are not saved automatically. */
+    tst lr, #0x10                           /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+    it eq
+    vstmdbeq r0!, {s16-s31}                 /* Store the additional FP context registers which are not saved automatically. */
 #endif /* configENABLE_FPU || configENABLE_MVE */
 #if ( configENABLE_MPU == 1 )
-	mrs r1, psplim							/* r1 = PSPLIM. */
-	mrs r2, control							/* r2 = CONTROL. */
-	mov r3, lr								/* r3 = LR/EXC_RETURN. */
-	stmdb r0!, {r1-r11}						/* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mrs r2, control                         /* r2 = CONTROL. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmdb r0!, {r1-r11}                     /* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */
 #else /* configENABLE_MPU */
-	mrs r2, psplim							/* r2 = PSPLIM. */
-	mov r3, lr								/* r3 = LR/EXC_RETURN. */
-	stmdb r0!, {r2-r11}						/* Store on the stack - PSPLIM, LR and registers that are not automatically. */
+    mrs r2, psplim                          /* r2 = PSPLIM. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmdb r0!, {r2-r11}                     /* Store on the stack - PSPLIM, LR and registers that are not automatically. */
 #endif /* configENABLE_MPU */
 
-	ldr r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
-	ldr r1, [r2]							/* Read pxCurrentTCB. */
-	str r0, [r1]							/* Save the new top of stack in TCB. */
+    ldr r2, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r2]                            /* Read pxCurrentTCB. */
+    str r0, [r1]                            /* Save the new top of stack in TCB. */
 
-	mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
-	msr basepri, r0							/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
-	dsb
-	isb
-	bl vTaskSwitchContext
-	mov r0, #0								/* r0 = 0. */
-	msr basepri, r0							/* Enable interrupts. */
+    mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r0                         /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+    dsb
+    isb
+    bl vTaskSwitchContext
+    mov r0, #0                              /* r0 = 0. */
+    msr basepri, r0                         /* Enable interrupts. */
 
-	ldr r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
-	ldr r1, [r2]							/* Read pxCurrentTCB. */
-	ldr r0, [r1]							/* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
+    ldr r2, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r2]                            /* Read pxCurrentTCB. */
+    ldr r0, [r1]                            /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
 
 #if ( configENABLE_MPU == 1 )
-	dmb										/* Complete outstanding transfers before disabling MPU. */
-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */
-	bic r4, r4, #1							/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
-	str r4, [r2]							/* Disable MPU. */
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    bic r4, r4, #1                          /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+    str r4, [r2]                            /* Disable MPU. */
 
-	adds r1, #4								/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
-	ldr r3, [r1]							/* r3 = *r1 i.e. r3 = MAIR0. */
-	ldr r2, =0xe000edc0						/* r2 = 0xe000edc0 [Location of MAIR0]. */
-	str r3, [r2]							/* Program MAIR0. */
-	ldr r2, =0xe000ed98						/* r2 = 0xe000ed98 [Location of RNR]. */
-	movs r3, #4								/* r3 = 4. */
-	str r3, [r2]							/* Program RNR = 4. */
-	adds r1, #4								/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
-	ldr r2, =0xe000ed9c						/* r2 = 0xe000ed9c [Location of RBAR]. */
-	ldmia r1!, {r4-r11}						/* Read 4 sets of RBAR/RLAR registers from TCB. */
-	stmia r2!, {r4-r11}						/* Write 4 set of RBAR/RLAR registers using alias registers. */
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+    ldr r3, [r1]                            /* r3 = *r1 i.e. r3 = MAIR0. */
+    ldr r2, =0xe000edc0                     /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str r3, [r2]                            /* Program MAIR0. */
+    ldr r2, =0xe000ed98                     /* r2 = 0xe000ed98 [Location of RNR]. */
+    movs r3, #4                             /* r3 = 4. */
+    str r3, [r2]                            /* Program RNR = 4. */
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+    ldr r2, =0xe000ed9c                     /* r2 = 0xe000ed9c [Location of RBAR]. */
+    ldmia r1!, {r4-r11}                     /* Read 4 sets of RBAR/RLAR registers from TCB. */
+    stmia r2!, {r4-r11}                     /* Write 4 set of RBAR/RLAR registers using alias registers. */
 
-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */
-	orr r4, r4, #1							/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
-	str r4, [r2]							/* Enable MPU. */
-	dsb										/* Force memory writes before continuing. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    orr r4, r4, #1                          /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+    str r4, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
 #endif /* configENABLE_MPU */
 
 #if ( configENABLE_MPU == 1 )
-	ldmia r0!, {r1-r11}						/* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */
+    ldmia r0!, {r1-r11}                     /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */
 #else /* configENABLE_MPU */
-	ldmia r0!, {r2-r11}						/* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
+    ldmia r0!, {r2-r11}                     /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
 #endif /* configENABLE_MPU */
 
 #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
-	tst r3, #0x10							/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
-	it eq
-	vldmiaeq r0!, {s16-s31}					/* Restore the additional FP context registers which are not restored automatically. */
+    tst r3, #0x10                           /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+    it eq
+    vldmiaeq r0!, {s16-s31}                 /* Restore the additional FP context registers which are not restored automatically. */
 #endif /* configENABLE_FPU || configENABLE_MVE */
 
  #if ( configENABLE_MPU == 1 )
-	msr psplim, r1							/* Restore the PSPLIM register value for the task. */
-	msr control, r2							/* Restore the CONTROL register value for the task. */
+    msr psplim, r1                          /* Restore the PSPLIM register value for the task. */
+    msr control, r2                         /* Restore the CONTROL register value for the task. */
 #else /* configENABLE_MPU */
-	msr psplim, r2							/* Restore the PSPLIM register value for the task. */
+    msr psplim, r2                          /* Restore the PSPLIM register value for the task. */
 #endif /* configENABLE_MPU */
-	msr psp, r0								/* Remember the new top of stack for the task. */
-	bx r3
+    msr psp, r0                             /* Remember the new top of stack for the task. */
+    bx r3
 /*-----------------------------------------------------------*/
 
 SVC_Handler:
-	tst lr, #4
-	ite eq
-	mrseq r0, msp
-	mrsne r0, psp
-	b vPortSVCHandler_C
+    tst lr, #4
+    ite eq
+    mrseq r0, msp
+    mrsne r0, psp
+    b vPortSVCHandler_C
 /*-----------------------------------------------------------*/
 
-	END
+    END
diff --git a/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h b/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h
index 4b1f99b..51e21ea 100644
--- a/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h
+++ b/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h
@@ -155,9 +155,9 @@
  * 8-bit values encoded as follows:
  *  Bit[7:4] - 0000 - Device Memory
  *  Bit[3:2] - 00 --> Device-nGnRnE
- *				01 --> Device-nGnRE
- *				10 --> Device-nGRE
- *				11 --> Device-GRE
+ *              01 --> Device-nGnRE
+ *              10 --> Device-nGRE
+ *              11 --> Device-GRE
  *  Bit[1:0] - 00, Reserved.
  */
     #define portMPU_DEVICE_MEMORY_nGnRnE                  ( 0x00 )   /* 0000 0000 */
diff --git a/portable/IAR/ARM_CM7/ReadMe.txt b/portable/IAR/ARM_CM7/ReadMe.txt
index 2116456..9cc851e 100644
--- a/portable/IAR/ARM_CM7/ReadMe.txt
+++ b/portable/IAR/ARM_CM7/ReadMe.txt
@@ -1,18 +1,18 @@
-There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers.

-The best option depends on the revision of the ARM Cortex-M7 core in use.  The

-revision is specified by an 'r' number, and a 'p' number, so will look something

-like 'r0p1'.  Check the documentation for the microcontroller in use to find the 

-revision of the Cortex-M7 core used in that microcontroller.  If in doubt, use 

-the FreeRTOS port provided specifically for r0p1 revisions, as that can be used

-with all core revisions.

-

-The first option is to use the ARM Cortex-M4F port, and the second option is to

-use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround.

-

-If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be

-used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in 

-the /FreeRTOS/Source/portable/IAR/ARM_CM4F directory.

-

-If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM

-Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1

-directory.
\ No newline at end of file
+There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers.
+The best option depends on the revision of the ARM Cortex-M7 core in use.  The
+revision is specified by an 'r' number, and a 'p' number, so will look something
+like 'r0p1'.  Check the documentation for the microcontroller in use to find the
+revision of the Cortex-M7 core used in that microcontroller.  If in doubt, use
+the FreeRTOS port provided specifically for r0p1 revisions, as that can be used
+with all core revisions.
+
+The first option is to use the ARM Cortex-M4F port, and the second option is to
+use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround.
+
+If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be
+used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in
+the /FreeRTOS/Source/portable/IAR/ARM_CM4F directory.
+
+If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM
+Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1
+directory.
diff --git a/portable/IAR/ARM_CM7/r0p1/port.c b/portable/IAR/ARM_CM7/r0p1/port.c
index a7300b2..207f0b3 100644
--- a/portable/IAR/ARM_CM7/r0p1/port.c
+++ b/portable/IAR/ARM_CM7/r0p1/port.c
@@ -1,689 +1,689 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

-* Implementation of functions defined in portable.h for the ARM CM7 port.

-*----------------------------------------------------------*/

-

-/* IAR includes. */

-#include <intrinsics.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-#ifndef __ARMVFP__

-    #error This port can only be used when the project options are configured to enable hardware floating point support.

-#endif

-

-#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )

-    #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */

-#endif

-

-/* Constants required to manipulate the core.  Registers first... */

-#define portNVIC_SYSTICK_CTRL_REG             ( *( ( volatile uint32_t * ) 0xe000e010 ) )

-#define portNVIC_SYSTICK_LOAD_REG             ( *( ( volatile uint32_t * ) 0xe000e014 ) )

-#define portNVIC_SYSTICK_CURRENT_VALUE_REG    ( *( ( volatile uint32_t * ) 0xe000e018 ) )

-#define portNVIC_SHPR3_REG                    ( *( ( volatile uint32_t * ) 0xe000ed20 ) )

-/* ...then bits in the registers. */

-#define portNVIC_SYSTICK_CLK_BIT              ( 1UL << 2UL )

-#define portNVIC_SYSTICK_INT_BIT              ( 1UL << 1UL )

-#define portNVIC_SYSTICK_ENABLE_BIT           ( 1UL << 0UL )

-#define portNVIC_SYSTICK_COUNT_FLAG_BIT       ( 1UL << 16UL )

-#define portNVIC_PENDSVCLEAR_BIT              ( 1UL << 27UL )

-#define portNVIC_PEND_SYSTICK_SET_BIT         ( 1UL << 26UL )

-#define portNVIC_PEND_SYSTICK_CLEAR_BIT       ( 1UL << 25UL )

-

-#define portNVIC_PENDSV_PRI                   ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )

-#define portNVIC_SYSTICK_PRI                  ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )

-

-/* Constants required to check the validity of an interrupt priority. */

-#define portFIRST_USER_INTERRUPT_NUMBER       ( 16 )

-#define portNVIC_IP_REGISTERS_OFFSET_16       ( 0xE000E3F0 )

-#define portAIRCR_REG                         ( *( ( volatile uint32_t * ) 0xE000ED0C ) )

-#define portMAX_8_BIT_VALUE                   ( ( uint8_t ) 0xff )

-#define portTOP_BIT_OF_BYTE                   ( ( uint8_t ) 0x80 )

-#define portMAX_PRIGROUP_BITS                 ( ( uint8_t ) 7 )

-#define portPRIORITY_GROUP_MASK               ( 0x07UL << 8UL )

-#define portPRIGROUP_SHIFT                    ( 8UL )

-

-/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */

-#define portVECTACTIVE_MASK                   ( 0xFFUL )

-

-/* Constants required to manipulate the VFP. */

-#define portFPCCR                             ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */

-#define portASPEN_AND_LSPEN_BITS              ( 0x3UL << 30UL )

-

-/* Constants required to set up the initial stack. */

-#define portINITIAL_XPSR                      ( 0x01000000 )

-#define portINITIAL_EXC_RETURN                ( 0xfffffffd )

-

-/* The systick is a 24-bit counter. */

-#define portMAX_24_BIT_NUMBER                 ( 0xffffffUL )

-

-/* A fiddle factor to estimate the number of SysTick counts that would have

- * occurred while the SysTick counter is stopped during tickless idle

- * calculations. */

-#define portMISSED_COUNTS_FACTOR              ( 94UL )

-

-/* For strict compliance with the Cortex-M spec the task start address should

- * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */

-#define portSTART_ADDRESS_MASK                ( ( StackType_t ) 0xfffffffeUL )

-

-/* Let the user override the default SysTick clock rate.  If defined by the

- * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the

- * configuration register. */

-#ifndef configSYSTICK_CLOCK_HZ

-    #define configSYSTICK_CLOCK_HZ             ( configCPU_CLOCK_HZ )

-    /* Ensure the SysTick is clocked at the same frequency as the core. */

-    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( portNVIC_SYSTICK_CLK_BIT )

-#else

-    /* Select the option to clock SysTick not at the same frequency as the core. */

-    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( 0 )

-#endif

-

-/*

- * Setup the timer to generate the tick interrupts.  The implementation in this

- * file is weak to allow application writers to change the timer used to

- * generate the tick interrupt.

- */

-void vPortSetupTimerInterrupt( void );

-

-/*

- * Exception handlers.

- */

-void xPortSysTickHandler( void );

-

-/*

- * Start first task is a separate function so it can be tested in isolation.

- */

-extern void vPortStartFirstTask( void );

-

-/*

- * Turn the VFP on.

- */

-extern void vPortEnableVFP( void );

-

-/*

- * Used to catch tasks that attempt to return from their implementing function.

- */

-static void prvTaskExitError( void );

-

-/*-----------------------------------------------------------*/

-

-/* Each task maintains its own interrupt status in the critical nesting

- * variable. */

-static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;

-

-/*

- * The number of SysTick increments that make up one tick period.

- */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t ulTimerCountsForOneTick = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/*

- * The maximum number of tick periods that can be suppressed is limited by the

- * 24 bit resolution of the SysTick timer.

- */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t xMaximumPossibleSuppressedTicks = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/*

- * Compensate for the CPU cycles that pass while the SysTick is stopped (low

- * power functionality only.

- */

-#if ( configUSE_TICKLESS_IDLE == 1 )

-    static uint32_t ulStoppedTimerCompensation = 0;

-#endif /* configUSE_TICKLESS_IDLE */

-

-/*

- * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure

- * FreeRTOS API functions are not called from interrupts that have been assigned

- * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.

- */

-#if ( configASSERT_DEFINED == 1 )

-    static uint8_t ucMaxSysCallPriority = 0;

-    static uint32_t ulMaxPRIGROUPValue = 0;

-    static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;

-#endif /* configASSERT_DEFINED */

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,

-                                     TaskFunction_t pxCode,

-                                     void * pvParameters )

-{

-    /* Simulate the stack frame as it would be created by a context switch

-     * interrupt. */

-

-    /* Offset added to account for the way the MCU uses the stack on entry/exit

-     * of interrupts, and to ensure alignment. */

-    pxTopOfStack--;

-

-    *pxTopOfStack = portINITIAL_XPSR;                                    /* xPSR */

-    pxTopOfStack--;

-    *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */

-    pxTopOfStack--;

-    *pxTopOfStack = ( StackType_t ) prvTaskExitError;                    /* LR */

-

-    /* Save code space by skipping register initialisation. */

-    pxTopOfStack -= 5;                            /* R12, R3, R2 and R1. */

-    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-

-    /* A save method is being used that requires each task to maintain its

-     * own exec return value. */

-    pxTopOfStack--;

-    *pxTopOfStack = portINITIAL_EXC_RETURN;

-

-    pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */

-

-    return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-static void prvTaskExitError( void )

-{

-    /* A function that implements a task must not exit or attempt to return to

-     * its caller as there is nothing to return to.  If a task wants to exit it

-     * should instead call vTaskDelete( NULL ).

-     *

-     * Artificially force an assert() to be triggered if configASSERT() is

-     * defined, then stop here so application writers can catch the error. */

-    configASSERT( uxCriticalNesting == ~0UL );

-    portDISABLE_INTERRUPTS();

-

-    for( ; ; )

-    {

-    }

-}

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-BaseType_t xPortStartScheduler( void )

-{

-    /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.

-     * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */

-    configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );

-

-    #if ( configASSERT_DEFINED == 1 )

-    {

-        volatile uint32_t ulOriginalPriority;

-        volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );

-        volatile uint8_t ucMaxPriorityValue;

-

-        /* Determine the maximum priority from which ISR safe FreeRTOS API

-         * functions can be called.  ISR safe functions are those that end in

-         * "FromISR".  FreeRTOS maintains separate thread and ISR API functions to

-         * ensure interrupt entry is as fast and simple as possible.

-         *

-         * Save the interrupt priority value that is about to be clobbered. */

-        ulOriginalPriority = *pucFirstUserPriorityRegister;

-

-        /* Determine the number of priority bits available.  First write to all

-         * possible bits. */

-        *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;

-

-        /* Read the value back to see how many bits stuck. */

-        ucMaxPriorityValue = *pucFirstUserPriorityRegister;

-

-        /* Use the same mask on the maximum system call priority. */

-        ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;

-

-        /* Calculate the maximum acceptable priority group value for the number

-         * of bits read back. */

-        ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;

-

-        while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )

-        {

-            ulMaxPRIGROUPValue--;

-            ucMaxPriorityValue <<= ( uint8_t ) 0x01;

-        }

-

-        #ifdef __NVIC_PRIO_BITS

-        {

-            /* Check the CMSIS configuration that defines the number of

-             * priority bits matches the number of priority bits actually queried

-             * from the hardware. */

-            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );

-        }

-        #endif

-

-        #ifdef configPRIO_BITS

-        {

-            /* Check the FreeRTOS configuration that defines the number of

-             * priority bits matches the number of priority bits actually queried

-             * from the hardware. */

-            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );

-        }

-        #endif

-

-        /* Shift the priority group value back to its position within the AIRCR

-         * register. */

-        ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;

-        ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;

-

-        /* Restore the clobbered interrupt priority register to its original

-         * value. */

-        *pucFirstUserPriorityRegister = ulOriginalPriority;

-    }

-    #endif /* configASSERT_DEFINED */

-

-    /* Make PendSV and SysTick the lowest priority interrupts. */

-    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;

-    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;

-

-    /* Start the timer that generates the tick ISR.  Interrupts are disabled

-     * here already. */

-    vPortSetupTimerInterrupt();

-

-    /* Initialise the critical nesting count ready for the first task. */

-    uxCriticalNesting = 0;

-

-    /* Ensure the VFP is enabled - it should be anyway. */

-    vPortEnableVFP();

-

-    /* Lazy save always. */

-    *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;

-

-    /* Start the first task. */

-    vPortStartFirstTask();

-

-    /* Should not get here! */

-    return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-    /* Not implemented in ports where there is nothing to return to.

-     * Artificially force an assert. */

-    configASSERT( uxCriticalNesting == 1000UL );

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-    portDISABLE_INTERRUPTS();

-    uxCriticalNesting++;

-

-    /* This is not the interrupt safe version of the enter critical function so

-     * assert() if it is being called from an interrupt context.  Only API

-     * functions that end in "FromISR" can be used in an interrupt.  Only assert if

-     * the critical nesting count is 1 to protect against recursive calls if the

-     * assert function also uses a critical section. */

-    if( uxCriticalNesting == 1 )

-    {

-        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );

-    }

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-    configASSERT( uxCriticalNesting );

-    uxCriticalNesting--;

-

-    if( uxCriticalNesting == 0 )

-    {

-        portENABLE_INTERRUPTS();

-    }

-}

-/*-----------------------------------------------------------*/

-

-void xPortSysTickHandler( void )

-{

-    /* The SysTick runs at the lowest interrupt priority, so when this interrupt

-     * executes all interrupts must be unmasked.  There is therefore no need to

-     * save and then restore the interrupt mask value as its value is already

-     * known. */

-    portDISABLE_INTERRUPTS();

-    {

-        /* Increment the RTOS tick. */

-        if( xTaskIncrementTick() != pdFALSE )

-        {

-            /* A context switch is required.  Context switching is performed in

-             * the PendSV interrupt.  Pend the PendSV interrupt. */

-            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;

-        }

-    }

-    portENABLE_INTERRUPTS();

-}

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TICKLESS_IDLE == 1 )

-

-    __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )

-    {

-        uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft;

-        TickType_t xModifiableIdleTime;

-

-        /* Make sure the SysTick reload value does not overflow the counter. */

-        if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )

-        {

-            xExpectedIdleTime = xMaximumPossibleSuppressedTicks;

-        }

-

-        /* Enter a critical section but don't use the taskENTER_CRITICAL()

-         * method as that will mask interrupts that should exit sleep mode. */

-        __disable_interrupt();

-        __DSB();

-        __ISB();

-

-        /* If a context switch is pending or a task is waiting for the scheduler

-         * to be unsuspended then abandon the low power entry. */

-        if( eTaskConfirmSleepModeStatus() == eAbortSleep )

-        {

-            /* Re-enable interrupts - see comments above the __disable_interrupt()

-             * call above. */

-            __enable_interrupt();

-        }

-        else

-        {

-            /* Stop the SysTick momentarily.  The time the SysTick is stopped for

-             * is accounted for as best it can be, but using the tickless mode will

-             * inevitably result in some tiny drift of the time maintained by the

-             * kernel with respect to calendar time. */

-            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );

-

-            /* Use the SysTick current-value register to determine the number of

-             * SysTick decrements remaining until the next tick interrupt.  If the

-             * current-value register is zero, then there are actually

-             * ulTimerCountsForOneTick decrements remaining, not zero, because the

-             * SysTick requests the interrupt when decrementing from 1 to 0. */

-            ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;

-

-            if( ulSysTickDecrementsLeft == 0 )

-            {

-                ulSysTickDecrementsLeft = ulTimerCountsForOneTick;

-            }

-

-            /* Calculate the reload value required to wait xExpectedIdleTime

-             * tick periods.  -1 is used because this code normally executes part

-             * way through the first tick period.  But if the SysTick IRQ is now

-             * pending, then clear the IRQ, suppressing the first tick, and correct

-             * the reload value to reflect that the second tick period is already

-             * underway.  The expected idle time is always at least two ticks. */

-            ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );

-

-            if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 )

-            {

-                portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT;

-                ulReloadValue -= ulTimerCountsForOneTick;

-            }

-

-            if( ulReloadValue > ulStoppedTimerCompensation )

-            {

-                ulReloadValue -= ulStoppedTimerCompensation;

-            }

-

-            /* Set the new reload value. */

-            portNVIC_SYSTICK_LOAD_REG = ulReloadValue;

-

-            /* Clear the SysTick count flag and set the count value back to

-             * zero. */

-            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-

-            /* Restart SysTick. */

-            portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;

-

-            /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can

-             * set its parameter to 0 to indicate that its implementation contains

-             * its own wait for interrupt or wait for event instruction, and so wfi

-             * should not be executed again.  However, the original expected idle

-             * time variable must remain unmodified, so a copy is taken. */

-            xModifiableIdleTime = xExpectedIdleTime;

-            configPRE_SLEEP_PROCESSING( xModifiableIdleTime );

-

-            if( xModifiableIdleTime > 0 )

-            {

-                __DSB();

-                __WFI();

-                __ISB();

-            }

-

-            configPOST_SLEEP_PROCESSING( xExpectedIdleTime );

-

-            /* Re-enable interrupts to allow the interrupt that brought the MCU

-             * out of sleep mode to execute immediately.  See comments above

-             * the __disable_interrupt() call above. */

-            __enable_interrupt();

-            __DSB();

-            __ISB();

-

-            /* Disable interrupts again because the clock is about to be stopped

-             * and interrupts that execute while the clock is stopped will increase

-             * any slippage between the time maintained by the RTOS and calendar

-             * time. */

-            __disable_interrupt();

-            __DSB();

-            __ISB();

-

-            /* Disable the SysTick clock without reading the

-             * portNVIC_SYSTICK_CTRL_REG register to ensure the

-             * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,

-             * the time the SysTick is stopped for is accounted for as best it can

-             * be, but using the tickless mode will inevitably result in some tiny

-             * drift of the time maintained by the kernel with respect to calendar

-             * time*/

-            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );

-

-            /* Determine whether the SysTick has already counted to zero. */

-            if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )

-            {

-                uint32_t ulCalculatedLoadValue;

-

-                /* The tick interrupt ended the sleep (or is now pending), and

-                 * a new tick period has started.  Reset portNVIC_SYSTICK_LOAD_REG

-                 * with whatever remains of the new tick period. */

-                ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );

-

-                /* Don't allow a tiny value, or values that have somehow

-                 * underflowed because the post sleep hook did something

-                 * that took too long or because the SysTick current-value register

-                 * is zero. */

-                if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )

-                {

-                    ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );

-                }

-

-                portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;

-

-                /* As the pending tick will be processed as soon as this

-                 * function exits, the tick value maintained by the tick is stepped

-                 * forward by one less than the time spent waiting. */

-                ulCompleteTickPeriods = xExpectedIdleTime - 1UL;

-            }

-            else

-            {

-                /* Something other than the tick interrupt ended the sleep. */

-

-                /* Use the SysTick current-value register to determine the

-                 * number of SysTick decrements remaining until the expected idle

-                 * time would have ended. */

-                ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;

-                #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT )

-                {

-                    /* If the SysTick is not using the core clock, the current-

-                     * value register might still be zero here.  In that case, the

-                     * SysTick didn't load from the reload register, and there are

-                     * ulReloadValue decrements remaining in the expected idle

-                     * time, not zero. */

-                    if( ulSysTickDecrementsLeft == 0 )

-                    {

-                        ulSysTickDecrementsLeft = ulReloadValue;

-                    }

-                }

-                #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */

-

-                /* Work out how long the sleep lasted rounded to complete tick

-                 * periods (not the ulReload value which accounted for part

-                 * ticks). */

-                ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft;

-

-                /* How many complete tick periods passed while the processor

-                 * was waiting? */

-                ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;

-

-                /* The reload value is set to whatever fraction of a single tick

-                 * period remains. */

-                portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;

-            }

-

-            /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again,

-             * then set portNVIC_SYSTICK_LOAD_REG back to its standard value.  If

-             * the SysTick is not using the core clock, temporarily configure it to

-             * use the core clock.  This configuration forces the SysTick to load

-             * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next

-             * cycle of the other clock.  Then portNVIC_SYSTICK_LOAD_REG is ready

-             * to receive the standard value immediately. */

-            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-            portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;

-            #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT )

-            {

-                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

-            }

-            #else

-            {

-                /* The temporary usage of the core clock has served its purpose,

-                 * as described above.  Resume usage of the other clock. */

-                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT;

-

-                if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )

-                {

-                    /* The partial tick period already ended.  Be sure the SysTick

-                     * counts it only once. */

-                    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0;

-                }

-

-                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

-                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;

-            }

-            #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */

-

-            /* Step the tick to account for any tick periods that elapsed. */

-            vTaskStepTick( ulCompleteTickPeriods );

-

-            /* Exit with interrupts enabled. */

-            __enable_interrupt();

-        }

-    }

-

-#endif /* configUSE_TICKLESS_IDLE */

-/*-----------------------------------------------------------*/

-

-/*

- * Setup the systick timer to generate the tick interrupts at the required

- * frequency.

- */

-__weak void vPortSetupTimerInterrupt( void )

-{

-    /* Calculate the constants required to configure the tick interrupt. */

-    #if ( configUSE_TICKLESS_IDLE == 1 )

-    {

-        ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );

-        xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;

-        ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );

-    }

-    #endif /* configUSE_TICKLESS_IDLE */

-

-    /* Stop and clear the SysTick. */

-    portNVIC_SYSTICK_CTRL_REG = 0UL;

-    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

-

-    /* Configure SysTick to interrupt at the requested rate. */

-    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;

-    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );

-}

-/*-----------------------------------------------------------*/

-

-#if ( configASSERT_DEFINED == 1 )

-

-    void vPortValidateInterruptPriority( void )

-    {

-        uint32_t ulCurrentInterrupt;

-        uint8_t ucCurrentPriority;

-

-        /* Obtain the number of the currently executing interrupt. */

-        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );

-

-        /* Is the interrupt number a user defined interrupt? */

-        if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )

-        {

-            /* Look up the interrupt's priority. */

-            ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];

-

-            /* The following assertion will fail if a service routine (ISR) for

-             * an interrupt that has been assigned a priority above

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API

-             * function.  ISR safe FreeRTOS API functions must *only* be called

-             * from interrupts that have been assigned a priority at or below

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY.

-             *

-             * Numerically low interrupt priority numbers represent logically high

-             * interrupt priorities, therefore the priority of the interrupt must

-             * be set to a value equal to or numerically *higher* than

-             * configMAX_SYSCALL_INTERRUPT_PRIORITY.

-             *

-             * Interrupts that	use the FreeRTOS API must not be left at their

-             * default priority of	zero as that is the highest possible priority,

-             * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,

-             * and	therefore also guaranteed to be invalid.

-             *

-             * FreeRTOS maintains separate thread and ISR API functions to ensure

-             * interrupt entry is as fast and simple as possible.

-             *

-             * The following links provide detailed information:

-             * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html

-             * https://www.FreeRTOS.org/FAQHelp.html */

-            configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

-        }

-

-        /* Priority grouping:  The interrupt controller (NVIC) allows the bits

-         * that define each interrupt's priority to be split between bits that

-         * define the interrupt's pre-emption priority bits and bits that define

-         * the interrupt's sub-priority.  For simplicity all bits must be defined

-         * to be pre-emption priority bits.  The following assertion will fail if

-         * this is not the case (if some bits represent a sub-priority).

-         *

-         * If the application only uses CMSIS libraries for interrupt

-         * configuration then the correct setting can be achieved on all Cortex-M

-         * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the

-         * scheduler.  Note however that some vendor specific peripheral libraries

-         * assume a non-zero priority group setting, in which cases using a value

-         * of zero will result in unpredictable behaviour. */

-        configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );

-    }

-

-#endif /* configASSERT_DEFINED */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+* Implementation of functions defined in portable.h for the ARM CM7 port.
+*----------------------------------------------------------*/
+
+/* IAR includes. */
+#include <intrinsics.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+#ifndef __ARMVFP__
+    #error This port can only be used when the project options are configured to enable hardware floating point support.
+#endif
+
+#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )
+    #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
+#endif
+
+/* Constants required to manipulate the core.  Registers first... */
+#define portNVIC_SYSTICK_CTRL_REG             ( *( ( volatile uint32_t * ) 0xe000e010 ) )
+#define portNVIC_SYSTICK_LOAD_REG             ( *( ( volatile uint32_t * ) 0xe000e014 ) )
+#define portNVIC_SYSTICK_CURRENT_VALUE_REG    ( *( ( volatile uint32_t * ) 0xe000e018 ) )
+#define portNVIC_SHPR3_REG                    ( *( ( volatile uint32_t * ) 0xe000ed20 ) )
+/* ...then bits in the registers. */
+#define portNVIC_SYSTICK_CLK_BIT              ( 1UL << 2UL )
+#define portNVIC_SYSTICK_INT_BIT              ( 1UL << 1UL )
+#define portNVIC_SYSTICK_ENABLE_BIT           ( 1UL << 0UL )
+#define portNVIC_SYSTICK_COUNT_FLAG_BIT       ( 1UL << 16UL )
+#define portNVIC_PENDSVCLEAR_BIT              ( 1UL << 27UL )
+#define portNVIC_PEND_SYSTICK_SET_BIT         ( 1UL << 26UL )
+#define portNVIC_PEND_SYSTICK_CLEAR_BIT       ( 1UL << 25UL )
+
+#define portNVIC_PENDSV_PRI                   ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
+#define portNVIC_SYSTICK_PRI                  ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )
+
+/* Constants required to check the validity of an interrupt priority. */
+#define portFIRST_USER_INTERRUPT_NUMBER       ( 16 )
+#define portNVIC_IP_REGISTERS_OFFSET_16       ( 0xE000E3F0 )
+#define portAIRCR_REG                         ( *( ( volatile uint32_t * ) 0xE000ED0C ) )
+#define portMAX_8_BIT_VALUE                   ( ( uint8_t ) 0xff )
+#define portTOP_BIT_OF_BYTE                   ( ( uint8_t ) 0x80 )
+#define portMAX_PRIGROUP_BITS                 ( ( uint8_t ) 7 )
+#define portPRIORITY_GROUP_MASK               ( 0x07UL << 8UL )
+#define portPRIGROUP_SHIFT                    ( 8UL )
+
+/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */
+#define portVECTACTIVE_MASK                   ( 0xFFUL )
+
+/* Constants required to manipulate the VFP. */
+#define portFPCCR                             ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */
+#define portASPEN_AND_LSPEN_BITS              ( 0x3UL << 30UL )
+
+/* Constants required to set up the initial stack. */
+#define portINITIAL_XPSR                      ( 0x01000000 )
+#define portINITIAL_EXC_RETURN                ( 0xfffffffd )
+
+/* The systick is a 24-bit counter. */
+#define portMAX_24_BIT_NUMBER                 ( 0xffffffUL )
+
+/* A fiddle factor to estimate the number of SysTick counts that would have
+ * occurred while the SysTick counter is stopped during tickless idle
+ * calculations. */
+#define portMISSED_COUNTS_FACTOR              ( 94UL )
+
+/* For strict compliance with the Cortex-M spec the task start address should
+ * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */
+#define portSTART_ADDRESS_MASK                ( ( StackType_t ) 0xfffffffeUL )
+
+/* Let the user override the default SysTick clock rate.  If defined by the
+ * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the
+ * configuration register. */
+#ifndef configSYSTICK_CLOCK_HZ
+    #define configSYSTICK_CLOCK_HZ             ( configCPU_CLOCK_HZ )
+    /* Ensure the SysTick is clocked at the same frequency as the core. */
+    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( portNVIC_SYSTICK_CLK_BIT )
+#else
+    /* Select the option to clock SysTick not at the same frequency as the core. */
+    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( 0 )
+#endif
+
+/*
+ * Setup the timer to generate the tick interrupts.  The implementation in this
+ * file is weak to allow application writers to change the timer used to
+ * generate the tick interrupt.
+ */
+void vPortSetupTimerInterrupt( void );
+
+/*
+ * Exception handlers.
+ */
+void xPortSysTickHandler( void );
+
+/*
+ * Start first task is a separate function so it can be tested in isolation.
+ */
+extern void vPortStartFirstTask( void );
+
+/*
+ * Turn the VFP on.
+ */
+extern void vPortEnableVFP( void );
+
+/*
+ * Used to catch tasks that attempt to return from their implementing function.
+ */
+static void prvTaskExitError( void );
+
+/*-----------------------------------------------------------*/
+
+/* Each task maintains its own interrupt status in the critical nesting
+ * variable. */
+static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
+
+/*
+ * The number of SysTick increments that make up one tick period.
+ */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t ulTimerCountsForOneTick = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/*
+ * The maximum number of tick periods that can be suppressed is limited by the
+ * 24 bit resolution of the SysTick timer.
+ */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t xMaximumPossibleSuppressedTicks = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/*
+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low
+ * power functionality only.
+ */
+#if ( configUSE_TICKLESS_IDLE == 1 )
+    static uint32_t ulStoppedTimerCompensation = 0;
+#endif /* configUSE_TICKLESS_IDLE */
+
+/*
+ * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure
+ * FreeRTOS API functions are not called from interrupts that have been assigned
+ * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.
+ */
+#if ( configASSERT_DEFINED == 1 )
+    static uint8_t ucMaxSysCallPriority = 0;
+    static uint32_t ulMaxPRIGROUPValue = 0;
+    static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;
+#endif /* configASSERT_DEFINED */
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
+                                     TaskFunction_t pxCode,
+                                     void * pvParameters )
+{
+    /* Simulate the stack frame as it would be created by a context switch
+     * interrupt. */
+
+    /* Offset added to account for the way the MCU uses the stack on entry/exit
+     * of interrupts, and to ensure alignment. */
+    pxTopOfStack--;
+
+    *pxTopOfStack = portINITIAL_XPSR;                                    /* xPSR */
+    pxTopOfStack--;
+    *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) prvTaskExitError;                    /* LR */
+
+    /* Save code space by skipping register initialisation. */
+    pxTopOfStack -= 5;                            /* R12, R3, R2 and R1. */
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+
+    /* A save method is being used that requires each task to maintain its
+     * own exec return value. */
+    pxTopOfStack--;
+    *pxTopOfStack = portINITIAL_EXC_RETURN;
+
+    pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+static void prvTaskExitError( void )
+{
+    /* A function that implements a task must not exit or attempt to return to
+     * its caller as there is nothing to return to.  If a task wants to exit it
+     * should instead call vTaskDelete( NULL ).
+     *
+     * Artificially force an assert() to be triggered if configASSERT() is
+     * defined, then stop here so application writers can catch the error. */
+    configASSERT( uxCriticalNesting == ~0UL );
+    portDISABLE_INTERRUPTS();
+
+    for( ; ; )
+    {
+    }
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+BaseType_t xPortStartScheduler( void )
+{
+    /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.
+     * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
+    configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );
+
+    #if ( configASSERT_DEFINED == 1 )
+    {
+        volatile uint32_t ulOriginalPriority;
+        volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );
+        volatile uint8_t ucMaxPriorityValue;
+
+        /* Determine the maximum priority from which ISR safe FreeRTOS API
+         * functions can be called.  ISR safe functions are those that end in
+         * "FromISR".  FreeRTOS maintains separate thread and ISR API functions to
+         * ensure interrupt entry is as fast and simple as possible.
+         *
+         * Save the interrupt priority value that is about to be clobbered. */
+        ulOriginalPriority = *pucFirstUserPriorityRegister;
+
+        /* Determine the number of priority bits available.  First write to all
+         * possible bits. */
+        *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
+
+        /* Read the value back to see how many bits stuck. */
+        ucMaxPriorityValue = *pucFirstUserPriorityRegister;
+
+        /* Use the same mask on the maximum system call priority. */
+        ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
+
+        /* Calculate the maximum acceptable priority group value for the number
+         * of bits read back. */
+        ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
+
+        while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
+        {
+            ulMaxPRIGROUPValue--;
+            ucMaxPriorityValue <<= ( uint8_t ) 0x01;
+        }
+
+        #ifdef __NVIC_PRIO_BITS
+        {
+            /* Check the CMSIS configuration that defines the number of
+             * priority bits matches the number of priority bits actually queried
+             * from the hardware. */
+            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );
+        }
+        #endif
+
+        #ifdef configPRIO_BITS
+        {
+            /* Check the FreeRTOS configuration that defines the number of
+             * priority bits matches the number of priority bits actually queried
+             * from the hardware. */
+            configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
+        }
+        #endif
+
+        /* Shift the priority group value back to its position within the AIRCR
+         * register. */
+        ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
+        ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
+
+        /* Restore the clobbered interrupt priority register to its original
+         * value. */
+        *pucFirstUserPriorityRegister = ulOriginalPriority;
+    }
+    #endif /* configASSERT_DEFINED */
+
+    /* Make PendSV and SysTick the lowest priority interrupts. */
+    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
+    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+     * here already. */
+    vPortSetupTimerInterrupt();
+
+    /* Initialise the critical nesting count ready for the first task. */
+    uxCriticalNesting = 0;
+
+    /* Ensure the VFP is enabled - it should be anyway. */
+    vPortEnableVFP();
+
+    /* Lazy save always. */
+    *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+     * Artificially force an assert. */
+    configASSERT( uxCriticalNesting == 1000UL );
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    portDISABLE_INTERRUPTS();
+    uxCriticalNesting++;
+
+    /* This is not the interrupt safe version of the enter critical function so
+     * assert() if it is being called from an interrupt context.  Only API
+     * functions that end in "FromISR" can be used in an interrupt.  Only assert if
+     * the critical nesting count is 1 to protect against recursive calls if the
+     * assert function also uses a critical section. */
+    if( uxCriticalNesting == 1 )
+    {
+        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
+    }
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    configASSERT( uxCriticalNesting );
+    uxCriticalNesting--;
+
+    if( uxCriticalNesting == 0 )
+    {
+        portENABLE_INTERRUPTS();
+    }
+}
+/*-----------------------------------------------------------*/
+
+void xPortSysTickHandler( void )
+{
+    /* The SysTick runs at the lowest interrupt priority, so when this interrupt
+     * executes all interrupts must be unmasked.  There is therefore no need to
+     * save and then restore the interrupt mask value as its value is already
+     * known. */
+    portDISABLE_INTERRUPTS();
+    {
+        /* Increment the RTOS tick. */
+        if( xTaskIncrementTick() != pdFALSE )
+        {
+            /* A context switch is required.  Context switching is performed in
+             * the PendSV interrupt.  Pend the PendSV interrupt. */
+            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
+        }
+    }
+    portENABLE_INTERRUPTS();
+}
+/*-----------------------------------------------------------*/
+
+#if ( configUSE_TICKLESS_IDLE == 1 )
+
+    __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
+    {
+        uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft;
+        TickType_t xModifiableIdleTime;
+
+        /* Make sure the SysTick reload value does not overflow the counter. */
+        if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )
+        {
+            xExpectedIdleTime = xMaximumPossibleSuppressedTicks;
+        }
+
+        /* Enter a critical section but don't use the taskENTER_CRITICAL()
+         * method as that will mask interrupts that should exit sleep mode. */
+        __disable_interrupt();
+        __DSB();
+        __ISB();
+
+        /* If a context switch is pending or a task is waiting for the scheduler
+         * to be unsuspended then abandon the low power entry. */
+        if( eTaskConfirmSleepModeStatus() == eAbortSleep )
+        {
+            /* Re-enable interrupts - see comments above the __disable_interrupt()
+             * call above. */
+            __enable_interrupt();
+        }
+        else
+        {
+            /* Stop the SysTick momentarily.  The time the SysTick is stopped for
+             * is accounted for as best it can be, but using the tickless mode will
+             * inevitably result in some tiny drift of the time maintained by the
+             * kernel with respect to calendar time. */
+            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );
+
+            /* Use the SysTick current-value register to determine the number of
+             * SysTick decrements remaining until the next tick interrupt.  If the
+             * current-value register is zero, then there are actually
+             * ulTimerCountsForOneTick decrements remaining, not zero, because the
+             * SysTick requests the interrupt when decrementing from 1 to 0. */
+            ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;
+
+            if( ulSysTickDecrementsLeft == 0 )
+            {
+                ulSysTickDecrementsLeft = ulTimerCountsForOneTick;
+            }
+
+            /* Calculate the reload value required to wait xExpectedIdleTime
+             * tick periods.  -1 is used because this code normally executes part
+             * way through the first tick period.  But if the SysTick IRQ is now
+             * pending, then clear the IRQ, suppressing the first tick, and correct
+             * the reload value to reflect that the second tick period is already
+             * underway.  The expected idle time is always at least two ticks. */
+            ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
+
+            if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 )
+            {
+                portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT;
+                ulReloadValue -= ulTimerCountsForOneTick;
+            }
+
+            if( ulReloadValue > ulStoppedTimerCompensation )
+            {
+                ulReloadValue -= ulStoppedTimerCompensation;
+            }
+
+            /* Set the new reload value. */
+            portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
+
+            /* Clear the SysTick count flag and set the count value back to
+             * zero. */
+            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+
+            /* Restart SysTick. */
+            portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
+
+            /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can
+             * set its parameter to 0 to indicate that its implementation contains
+             * its own wait for interrupt or wait for event instruction, and so wfi
+             * should not be executed again.  However, the original expected idle
+             * time variable must remain unmodified, so a copy is taken. */
+            xModifiableIdleTime = xExpectedIdleTime;
+            configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
+
+            if( xModifiableIdleTime > 0 )
+            {
+                __DSB();
+                __WFI();
+                __ISB();
+            }
+
+            configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
+
+            /* Re-enable interrupts to allow the interrupt that brought the MCU
+             * out of sleep mode to execute immediately.  See comments above
+             * the __disable_interrupt() call above. */
+            __enable_interrupt();
+            __DSB();
+            __ISB();
+
+            /* Disable interrupts again because the clock is about to be stopped
+             * and interrupts that execute while the clock is stopped will increase
+             * any slippage between the time maintained by the RTOS and calendar
+             * time. */
+            __disable_interrupt();
+            __DSB();
+            __ISB();
+
+            /* Disable the SysTick clock without reading the
+             * portNVIC_SYSTICK_CTRL_REG register to ensure the
+             * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,
+             * the time the SysTick is stopped for is accounted for as best it can
+             * be, but using the tickless mode will inevitably result in some tiny
+             * drift of the time maintained by the kernel with respect to calendar
+             * time*/
+            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );
+
+            /* Determine whether the SysTick has already counted to zero. */
+            if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
+            {
+                uint32_t ulCalculatedLoadValue;
+
+                /* The tick interrupt ended the sleep (or is now pending), and
+                 * a new tick period has started.  Reset portNVIC_SYSTICK_LOAD_REG
+                 * with whatever remains of the new tick period. */
+                ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
+
+                /* Don't allow a tiny value, or values that have somehow
+                 * underflowed because the post sleep hook did something
+                 * that took too long or because the SysTick current-value register
+                 * is zero. */
+                if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
+                {
+                    ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
+                }
+
+                portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
+
+                /* As the pending tick will be processed as soon as this
+                 * function exits, the tick value maintained by the tick is stepped
+                 * forward by one less than the time spent waiting. */
+                ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
+            }
+            else
+            {
+                /* Something other than the tick interrupt ended the sleep. */
+
+                /* Use the SysTick current-value register to determine the
+                 * number of SysTick decrements remaining until the expected idle
+                 * time would have ended. */
+                ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;
+                #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT )
+                {
+                    /* If the SysTick is not using the core clock, the current-
+                     * value register might still be zero here.  In that case, the
+                     * SysTick didn't load from the reload register, and there are
+                     * ulReloadValue decrements remaining in the expected idle
+                     * time, not zero. */
+                    if( ulSysTickDecrementsLeft == 0 )
+                    {
+                        ulSysTickDecrementsLeft = ulReloadValue;
+                    }
+                }
+                #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */
+
+                /* Work out how long the sleep lasted rounded to complete tick
+                 * periods (not the ulReload value which accounted for part
+                 * ticks). */
+                ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft;
+
+                /* How many complete tick periods passed while the processor
+                 * was waiting? */
+                ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
+
+                /* The reload value is set to whatever fraction of a single tick
+                 * period remains. */
+                portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
+            }
+
+            /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again,
+             * then set portNVIC_SYSTICK_LOAD_REG back to its standard value.  If
+             * the SysTick is not using the core clock, temporarily configure it to
+             * use the core clock.  This configuration forces the SysTick to load
+             * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next
+             * cycle of the other clock.  Then portNVIC_SYSTICK_LOAD_REG is ready
+             * to receive the standard value immediately. */
+            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+            portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
+            #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT )
+            {
+                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+            }
+            #else
+            {
+                /* The temporary usage of the core clock has served its purpose,
+                 * as described above.  Resume usage of the other clock. */
+                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT;
+
+                if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
+                {
+                    /* The partial tick period already ended.  Be sure the SysTick
+                     * counts it only once. */
+                    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0;
+                }
+
+                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
+            }
+            #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */
+
+            /* Step the tick to account for any tick periods that elapsed. */
+            vTaskStepTick( ulCompleteTickPeriods );
+
+            /* Exit with interrupts enabled. */
+            __enable_interrupt();
+        }
+    }
+
+#endif /* configUSE_TICKLESS_IDLE */
+/*-----------------------------------------------------------*/
+
+/*
+ * Setup the systick timer to generate the tick interrupts at the required
+ * frequency.
+ */
+__weak void vPortSetupTimerInterrupt( void )
+{
+    /* Calculate the constants required to configure the tick interrupt. */
+    #if ( configUSE_TICKLESS_IDLE == 1 )
+    {
+        ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
+        xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
+        ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
+    }
+    #endif /* configUSE_TICKLESS_IDLE */
+
+    /* Stop and clear the SysTick. */
+    portNVIC_SYSTICK_CTRL_REG = 0UL;
+    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+
+    /* Configure SysTick to interrupt at the requested rate. */
+    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
+    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
+}
+/*-----------------------------------------------------------*/
+
+#if ( configASSERT_DEFINED == 1 )
+
+    void vPortValidateInterruptPriority( void )
+    {
+        uint32_t ulCurrentInterrupt;
+        uint8_t ucCurrentPriority;
+
+        /* Obtain the number of the currently executing interrupt. */
+        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );
+
+        /* Is the interrupt number a user defined interrupt? */
+        if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
+        {
+            /* Look up the interrupt's priority. */
+            ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
+
+            /* The following assertion will fail if a service routine (ISR) for
+             * an interrupt that has been assigned a priority above
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API
+             * function.  ISR safe FreeRTOS API functions must *only* be called
+             * from interrupts that have been assigned a priority at or below
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY.
+             *
+             * Numerically low interrupt priority numbers represent logically high
+             * interrupt priorities, therefore the priority of the interrupt must
+             * be set to a value equal to or numerically *higher* than
+             * configMAX_SYSCALL_INTERRUPT_PRIORITY.
+             *
+             * Interrupts that  use the FreeRTOS API must not be left at their
+             * default priority of  zero as that is the highest possible priority,
+             * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,
+             * and  therefore also guaranteed to be invalid.
+             *
+             * FreeRTOS maintains separate thread and ISR API functions to ensure
+             * interrupt entry is as fast and simple as possible.
+             *
+             * The following links provide detailed information:
+             * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
+             * https://www.FreeRTOS.org/FAQHelp.html */
+            configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
+        }
+
+        /* Priority grouping:  The interrupt controller (NVIC) allows the bits
+         * that define each interrupt's priority to be split between bits that
+         * define the interrupt's pre-emption priority bits and bits that define
+         * the interrupt's sub-priority.  For simplicity all bits must be defined
+         * to be pre-emption priority bits.  The following assertion will fail if
+         * this is not the case (if some bits represent a sub-priority).
+         *
+         * If the application only uses CMSIS libraries for interrupt
+         * configuration then the correct setting can be achieved on all Cortex-M
+         * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
+         * scheduler.  Note however that some vendor specific peripheral libraries
+         * assume a non-zero priority group setting, in which cases using a value
+         * of zero will result in unpredictable behaviour. */
+        configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
+    }
+
+#endif /* configASSERT_DEFINED */
diff --git a/portable/IAR/ARM_CM7/r0p1/portasm.s b/portable/IAR/ARM_CM7/r0p1/portasm.s
index 8607be2..483178d 100644
--- a/portable/IAR/ARM_CM7/r0p1/portasm.s
+++ b/portable/IAR/ARM_CM7/r0p1/portasm.s
@@ -1,152 +1,151 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#include <FreeRTOSConfig.h>

-

-	RSEG    CODE:CODE(2)

-	thumb

-

-	EXTERN pxCurrentTCB

-	EXTERN vTaskSwitchContext

-

-	PUBLIC xPortPendSVHandler

-	PUBLIC vPortSVCHandler

-	PUBLIC vPortStartFirstTask

-	PUBLIC vPortEnableVFP

-

-

-/*-----------------------------------------------------------*/

-

-xPortPendSVHandler:

-	mrs r0, psp

-	isb

-	/* Get the location of the current TCB. */

-	ldr	r3, =pxCurrentTCB

-	ldr	r2, [r3]

-

-	/* Is the task using the FPU context?  If so, push high vfp registers. */

-	tst r14, #0x10

-	it eq

-	vstmdbeq r0!, {s16-s31}

-

-	/* Save the core registers. */

-	stmdb r0!, {r4-r11, r14}

-

-	/* Save the new top of stack into the first member of the TCB. */

-	str r0, [r2]

-

-	stmdb sp!, {r0, r3}

-	mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-	cpsid i

-	msr basepri, r0

-	dsb

-	isb

-	cpsie i

-	bl vTaskSwitchContext

-	mov r0, #0

-	msr basepri, r0

-	ldmia sp!, {r0, r3}

-

-	/* The first item in pxCurrentTCB is the task top of stack. */

-	ldr r1, [r3]

-	ldr r0, [r1]

-

-	/* Pop the core registers. */

-	ldmia r0!, {r4-r11, r14}

-

-	/* Is the task using the FPU context?  If so, pop the high vfp registers

-	too. */

-	tst r14, #0x10

-	it eq

-	vldmiaeq r0!, {s16-s31}

-

-	msr psp, r0

-	isb

-	#ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */

-		#if WORKAROUND_PMU_CM001 == 1

-			push { r14 }

-			pop { pc }

-		#endif

-	#endif

-

-	bx r14

-

-

-/*-----------------------------------------------------------*/

-

-vPortSVCHandler:

-	/* Get the location of the current TCB. */

-	ldr	r3, =pxCurrentTCB

-	ldr r1, [r3]

-	ldr r0, [r1]

-	/* Pop the core registers. */

-	ldmia r0!, {r4-r11, r14}

-	msr psp, r0

-	isb

-	mov r0, #0

-	msr	basepri, r0

-	bx r14

-

-/*-----------------------------------------------------------*/

-

-vPortStartFirstTask

-	/* Use the NVIC offset register to locate the stack. */

-	ldr r0, =0xE000ED08

-	ldr r0, [r0]

-	ldr r0, [r0]

-	/* Set the msp back to the start of the stack. */

-	msr msp, r0

-	/* Clear the bit that indicates the FPU is in use in case the FPU was used

-	before the scheduler was started - which would otherwise result in the

-	unnecessary leaving of space in the SVC stack for lazy saving of FPU

-	registers. */

-	mov r0, #0

-	msr control, r0

-	/* Call SVC to start the first task. */

-	cpsie i

-	cpsie f

-	dsb

-	isb

-	svc 0

-

-/*-----------------------------------------------------------*/

-

-vPortEnableVFP:

-	/* The FPU enable bits are in the CPACR. */

-	ldr.w r0, =0xE000ED88

-	ldr	r1, [r0]

-

-	/* Enable CP10 and CP11 coprocessors, then save back. */

-	orr	r1, r1, #( 0xf << 20 )

-	str r1, [r0]

-	bx	r14

-

-

-

-	END

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#include <FreeRTOSConfig.h>
+
+    RSEG    CODE:CODE(2)
+    thumb
+
+    EXTERN pxCurrentTCB
+    EXTERN vTaskSwitchContext
+
+    PUBLIC xPortPendSVHandler
+    PUBLIC vPortSVCHandler
+    PUBLIC vPortStartFirstTask
+    PUBLIC vPortEnableVFP
+
+
+/*-----------------------------------------------------------*/
+
+xPortPendSVHandler:
+    mrs r0, psp
+    isb
+    /* Get the location of the current TCB. */
+    ldr r3, =pxCurrentTCB
+    ldr r2, [r3]
+
+    /* Is the task using the FPU context?  If so, push high vfp registers. */
+    tst r14, #0x10
+    it eq
+    vstmdbeq r0!, {s16-s31}
+
+    /* Save the core registers. */
+    stmdb r0!, {r4-r11, r14}
+
+    /* Save the new top of stack into the first member of the TCB. */
+    str r0, [r2]
+
+    stmdb sp!, {r0, r3}
+    mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    cpsid i
+    msr basepri, r0
+    dsb
+    isb
+    cpsie i
+    bl vTaskSwitchContext
+    mov r0, #0
+    msr basepri, r0
+    ldmia sp!, {r0, r3}
+
+    /* The first item in pxCurrentTCB is the task top of stack. */
+    ldr r1, [r3]
+    ldr r0, [r1]
+
+    /* Pop the core registers. */
+    ldmia r0!, {r4-r11, r14}
+
+    /* Is the task using the FPU context?  If so, pop the high vfp registers
+    too. */
+    tst r14, #0x10
+    it eq
+    vldmiaeq r0!, {s16-s31}
+
+    msr psp, r0
+    isb
+    #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */
+        #if WORKAROUND_PMU_CM001 == 1
+            push { r14 }
+            pop { pc }
+        #endif
+    #endif
+
+    bx r14
+
+
+/*-----------------------------------------------------------*/
+
+vPortSVCHandler:
+    /* Get the location of the current TCB. */
+    ldr r3, =pxCurrentTCB
+    ldr r1, [r3]
+    ldr r0, [r1]
+    /* Pop the core registers. */
+    ldmia r0!, {r4-r11, r14}
+    msr psp, r0
+    isb
+    mov r0, #0
+    msr basepri, r0
+    bx r14
+
+/*-----------------------------------------------------------*/
+
+vPortStartFirstTask
+    /* Use the NVIC offset register to locate the stack. */
+    ldr r0, =0xE000ED08
+    ldr r0, [r0]
+    ldr r0, [r0]
+    /* Set the msp back to the start of the stack. */
+    msr msp, r0
+    /* Clear the bit that indicates the FPU is in use in case the FPU was used
+    before the scheduler was started - which would otherwise result in the
+    unnecessary leaving of space in the SVC stack for lazy saving of FPU
+    registers. */
+    mov r0, #0
+    msr control, r0
+    /* Call SVC to start the first task. */
+    cpsie i
+    cpsie f
+    dsb
+    isb
+    svc 0
+
+/*-----------------------------------------------------------*/
+
+vPortEnableVFP:
+    /* The FPU enable bits are in the CPACR. */
+    ldr.w r0, =0xE000ED88
+    ldr r1, [r0]
+
+    /* Enable CP10 and CP11 coprocessors, then save back. */
+    orr r1, r1, #( 0xf << 20 )
+    str r1, [r0]
+    bx  r14
+
+
+
+    END
diff --git a/portable/IAR/ARM_CM7/r0p1/portmacro.h b/portable/IAR/ARM_CM7/r0p1/portmacro.h
index 047f4c1..813cc54 100644
--- a/portable/IAR/ARM_CM7/r0p1/portmacro.h
+++ b/portable/IAR/ARM_CM7/r0p1/portmacro.h
@@ -1,210 +1,210 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-    #define PORTMACRO_H

-

-    #ifdef __cplusplus

-        extern "C" {

-    #endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* IAR includes. */

-    #include <intrinsics.h>

-

-/* Type definitions. */

-    #define portCHAR          char

-    #define portFLOAT         float

-    #define portDOUBLE        double

-    #define portLONG          long

-    #define portSHORT         short

-    #define portSTACK_TYPE    uint32_t

-    #define portBASE_TYPE     long

-

-    typedef portSTACK_TYPE   StackType_t;

-    typedef long             BaseType_t;

-    typedef unsigned long    UBaseType_t;

-

-    #if ( configUSE_16_BIT_TICKS == 1 )

-        typedef uint16_t     TickType_t;

-        #define portMAX_DELAY              ( TickType_t ) 0xffff

-    #else

-        typedef uint32_t     TickType_t;

-        #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL

-

-/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

- * not need to be guarded with a critical section. */

-        #define portTICK_TYPE_IS_ATOMIC    1

-    #endif

-/*-----------------------------------------------------------*/

-

-/* Architecture specifics. */

-    #define portSTACK_GROWTH      ( -1 )

-    #define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-    #define portBYTE_ALIGNMENT    8

-/*-----------------------------------------------------------*/

-

-/* Compiler directives. */

-    #define portWEAK_SYMBOL    __attribute__( ( weak ) )

-

-/*-----------------------------------------------------------*/

-

-

-/* Scheduler utilities. */

-    #define portYIELD()                                 \

-    {                                                   \

-        /* Set a PendSV to request a context switch. */ \

-        portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \

-        __DSB();                                        \

-        __ISB();                                        \

-    }

-

-    #define portNVIC_INT_CTRL_REG     ( *( ( volatile uint32_t * ) 0xe000ed04 ) )

-    #define portNVIC_PENDSVSET_BIT    ( 1UL << 28UL )

-    #define portEND_SWITCHING_ISR( xSwitchRequired )    do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 )

-    #define portYIELD_FROM_ISR( x )                     portEND_SWITCHING_ISR( x )

-

-/*-----------------------------------------------------------*/

-

-/* Architecture specific optimisations. */

-    #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

-        #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1

-    #endif

-

-    #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )

-

-/* Check the configuration. */

-        #if ( configMAX_PRIORITIES > 32 )

-            #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.

-        #endif

-

-/* Store/clear the ready priorities in a bit map. */

-        #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )    ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

-        #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities )     ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

-

-/*-----------------------------------------------------------*/

-

-        #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )    uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) )

-

-    #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-/*-----------------------------------------------------------*/

-

-/* Critical section management. */

-    extern void vPortEnterCritical( void );

-    extern void vPortExitCritical( void );

-

-    #define portDISABLE_INTERRUPTS()                           \

-    {                                                          \

-        /* Errata work around. */                              \

-        __disable_interrupt();                                 \

-        __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \

-        __DSB();                                               \

-        __ISB();                                               \

-        __enable_interrupt();                                  \

-    }

-

-    #define portENABLE_INTERRUPTS()                   __set_BASEPRI( 0 )

-    #define portENTER_CRITICAL()                      vPortEnterCritical()

-    #define portEXIT_CRITICAL()                       vPortExitCritical()

-    #define portSET_INTERRUPT_MASK_FROM_ISR()         __get_BASEPRI(); portDISABLE_INTERRUPTS()

-    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    __set_BASEPRI( x )

-/*-----------------------------------------------------------*/

-

-/* Tickless idle/low power functionality. */

-    #ifndef portSUPPRESS_TICKS_AND_SLEEP

-        extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );

-        #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )    vPortSuppressTicksAndSleep( xExpectedIdleTime )

-    #endif

-

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site.  These are

- * not necessary for to use this port.  They are defined so the common demo files

- * (which build with all the ports) will build. */

-    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )

-    #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )

-/*-----------------------------------------------------------*/

-

-    #ifdef configASSERT

-        void vPortValidateInterruptPriority( void );

-        #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()    vPortValidateInterruptPriority()

-    #endif

-

-/* portNOP() is not required by this port. */

-    #define portNOP()

-

-    #define portINLINE              __inline

-

-    #ifndef portFORCE_INLINE

-        #define portFORCE_INLINE    inline __attribute__( ( always_inline ) )

-    #endif

-

-/*-----------------------------------------------------------*/

-

-    portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )

-    {

-        uint32_t ulCurrentInterrupt;

-        BaseType_t xReturn;

-

-        /* Obtain the number of the currently executing interrupt. */

-        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );

-

-        if( ulCurrentInterrupt == 0 )

-        {

-            xReturn = pdFALSE;

-        }

-        else

-        {

-            xReturn = pdTRUE;

-        }

-

-        return xReturn;

-    }

-

-/*-----------------------------------------------------------*/

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

- * the source code because to do so would cause other compilers to generate

- * warnings. */

-    #pragma diag_suppress=Pe191

-    #pragma diag_suppress=Pa082

-

-    #ifdef __cplusplus

-        }

-    #endif

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+    #define PORTMACRO_H
+
+    #ifdef __cplusplus
+        extern "C" {
+    #endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* IAR includes. */
+    #include <intrinsics.h>
+
+/* Type definitions. */
+    #define portCHAR          char
+    #define portFLOAT         float
+    #define portDOUBLE        double
+    #define portLONG          long
+    #define portSHORT         short
+    #define portSTACK_TYPE    uint32_t
+    #define portBASE_TYPE     long
+
+    typedef portSTACK_TYPE   StackType_t;
+    typedef long             BaseType_t;
+    typedef unsigned long    UBaseType_t;
+
+    #if ( configUSE_16_BIT_TICKS == 1 )
+        typedef uint16_t     TickType_t;
+        #define portMAX_DELAY              ( TickType_t ) 0xffff
+    #else
+        typedef uint32_t     TickType_t;
+        #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL
+
+/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+ * not need to be guarded with a critical section. */
+        #define portTICK_TYPE_IS_ATOMIC    1
+    #endif
+/*-----------------------------------------------------------*/
+
+/* Architecture specifics. */
+    #define portSTACK_GROWTH      ( -1 )
+    #define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+    #define portBYTE_ALIGNMENT    8
+/*-----------------------------------------------------------*/
+
+/* Compiler directives. */
+    #define portWEAK_SYMBOL    __attribute__( ( weak ) )
+
+/*-----------------------------------------------------------*/
+
+
+/* Scheduler utilities. */
+    #define portYIELD()                                 \
+    {                                                   \
+        /* Set a PendSV to request a context switch. */ \
+        portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \
+        __DSB();                                        \
+        __ISB();                                        \
+    }
+
+    #define portNVIC_INT_CTRL_REG     ( *( ( volatile uint32_t * ) 0xe000ed04 ) )
+    #define portNVIC_PENDSVSET_BIT    ( 1UL << 28UL )
+    #define portEND_SWITCHING_ISR( xSwitchRequired )    do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 )
+    #define portYIELD_FROM_ISR( x )                     portEND_SWITCHING_ISR( x )
+
+/*-----------------------------------------------------------*/
+
+/* Architecture specific optimisations. */
+    #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
+        #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1
+    #endif
+
+    #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )
+
+/* Check the configuration. */
+        #if ( configMAX_PRIORITIES > 32 )
+            #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.
+        #endif
+
+/* Store/clear the ready priorities in a bit map. */
+        #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )    ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
+        #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities )     ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
+
+/*-----------------------------------------------------------*/
+
+        #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )    uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) )
+
+    #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+/*-----------------------------------------------------------*/
+
+/* Critical section management. */
+    extern void vPortEnterCritical( void );
+    extern void vPortExitCritical( void );
+
+    #define portDISABLE_INTERRUPTS()                           \
+    {                                                          \
+        /* Errata work around. */                              \
+        __disable_interrupt();                                 \
+        __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \
+        __DSB();                                               \
+        __ISB();                                               \
+        __enable_interrupt();                                  \
+    }
+
+    #define portENABLE_INTERRUPTS()                   __set_BASEPRI( 0 )
+    #define portENTER_CRITICAL()                      vPortEnterCritical()
+    #define portEXIT_CRITICAL()                       vPortExitCritical()
+    #define portSET_INTERRUPT_MASK_FROM_ISR()         __get_BASEPRI(); portDISABLE_INTERRUPTS()
+    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    __set_BASEPRI( x )
+/*-----------------------------------------------------------*/
+
+/* Tickless idle/low power functionality. */
+    #ifndef portSUPPRESS_TICKS_AND_SLEEP
+        extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
+        #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )    vPortSuppressTicksAndSleep( xExpectedIdleTime )
+    #endif
+
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site.  These are
+ * not necessary for to use this port.  They are defined so the common demo files
+ * (which build with all the ports) will build. */
+    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )
+    #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )
+/*-----------------------------------------------------------*/
+
+    #ifdef configASSERT
+        void vPortValidateInterruptPriority( void );
+        #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()    vPortValidateInterruptPriority()
+    #endif
+
+/* portNOP() is not required by this port. */
+    #define portNOP()
+
+    #define portINLINE              __inline
+
+    #ifndef portFORCE_INLINE
+        #define portFORCE_INLINE    inline __attribute__( ( always_inline ) )
+    #endif
+
+/*-----------------------------------------------------------*/
+
+    portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
+    {
+        uint32_t ulCurrentInterrupt;
+        BaseType_t xReturn;
+
+        /* Obtain the number of the currently executing interrupt. */
+        __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );
+
+        if( ulCurrentInterrupt == 0 )
+        {
+            xReturn = pdFALSE;
+        }
+        else
+        {
+            xReturn = pdTRUE;
+        }
+
+        return xReturn;
+    }
+
+/*-----------------------------------------------------------*/
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+ * the source code because to do so would cause other compilers to generate
+ * warnings. */
+    #pragma diag_suppress=Pe191
+    #pragma diag_suppress=Pa082
+
+    #ifdef __cplusplus
+        }
+    #endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ARM_CM85/non_secure/portasm.h b/portable/IAR/ARM_CM85/non_secure/portasm.h
index b37f6d1..ecd86b9 100644
--- a/portable/IAR/ARM_CM85/non_secure/portasm.h
+++ b/portable/IAR/ARM_CM85/non_secure/portasm.h
@@ -1,114 +1,114 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __PORT_ASM_H__

-#define __PORT_ASM_H__

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-

-/* MPU wrappers includes. */

-#include "mpu_wrappers.h"

-

-/**

- * @brief Restore the context of the first task so that the first task starts

- * executing.

- */

-void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Checks whether or not the processor is privileged.

- *

- * @return 1 if the processor is already privileged, 0 otherwise.

- */

-BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Raises the privilege level by clearing the bit 0 of the CONTROL

- * register.

- *

- * @note This is a privileged function and should only be called from the kenrel

- * code.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Lowers the privilege level by setting the bit 0 of the CONTROL

- * register.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vResetPrivilege( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Starts the first task.

- */

-void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Disables interrupts.

- */

-uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Enables interrupts.

- */

-void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief PendSV Exception handler.

- */

-void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief SVC Handler.

- */

-void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Allocate a Secure context for the calling task.

- *

- * @param[in] ulSecureStackSize The size of the stack to be allocated on the

- * secure side for the calling task.

- */

-void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );

-

-/**

- * @brief Free the task's secure context.

- *

- * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.

- */

-void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-#endif /* __PORT_ASM_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __PORT_ASM_H__
+#define __PORT_ASM_H__
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+
+/* MPU wrappers includes. */
+#include "mpu_wrappers.h"
+
+/**
+ * @brief Restore the context of the first task so that the first task starts
+ * executing.
+ */
+void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Checks whether or not the processor is privileged.
+ *
+ * @return 1 if the processor is already privileged, 0 otherwise.
+ */
+BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Raises the privilege level by clearing the bit 0 of the CONTROL
+ * register.
+ *
+ * @note This is a privileged function and should only be called from the kenrel
+ * code.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Lowers the privilege level by setting the bit 0 of the CONTROL
+ * register.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vResetPrivilege( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Starts the first task.
+ */
+void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Disables interrupts.
+ */
+uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Enables interrupts.
+ */
+void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief PendSV Exception handler.
+ */
+void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief SVC Handler.
+ */
+void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Allocate a Secure context for the calling task.
+ *
+ * @param[in] ulSecureStackSize The size of the stack to be allocated on the
+ * secure side for the calling task.
+ */
+void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );
+
+/**
+ * @brief Free the task's secure context.
+ *
+ * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
+ */
+void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+#endif /* __PORT_ASM_H__ */
diff --git a/portable/IAR/ARM_CM85/non_secure/portasm.s b/portable/IAR/ARM_CM85/non_secure/portasm.s
index 44cd8d0..a193cd7 100644
--- a/portable/IAR/ARM_CM85/non_secure/portasm.s
+++ b/portable/IAR/ARM_CM85/non_secure/portasm.s
@@ -1,353 +1,353 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-/* Including FreeRTOSConfig.h here will cause build errors if the header file

-contains code not understood by the assembler - for example the 'extern' keyword.

-To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so

-the code is included in C files but excluded by the preprocessor in assembly

-files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */

-#include "FreeRTOSConfig.h"

-

-	EXTERN pxCurrentTCB

-	EXTERN xSecureContext

-	EXTERN vTaskSwitchContext

-	EXTERN vPortSVCHandler_C

-	EXTERN SecureContext_SaveContext

-	EXTERN SecureContext_LoadContext

-

-	PUBLIC xIsPrivileged

-	PUBLIC vResetPrivilege

-	PUBLIC vPortAllocateSecureContext

-	PUBLIC vRestoreContextOfFirstTask

-	PUBLIC vRaisePrivilege

-	PUBLIC vStartFirstTask

-	PUBLIC ulSetInterruptMask

-	PUBLIC vClearInterruptMask

-	PUBLIC PendSV_Handler

-	PUBLIC SVC_Handler

-	PUBLIC vPortFreeSecureContext

-/*-----------------------------------------------------------*/

-

-/*---------------- Unprivileged Functions -------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION .text:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-xIsPrivileged:

-	mrs r0, control							/* r0 = CONTROL. */

-	tst r0, #1								/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */

-	ite ne

-	movne r0, #0							/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */

-	moveq r0, #1							/* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-vResetPrivilege:

-	mrs r0, control							/* r0 = CONTROL. */

-	orr r0, r0, #1							/* r0 = r0 | 1. */

-	msr control, r0							/* CONTROL = r0. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-vPortAllocateSecureContext:

-	svc 0									/* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-/*----------------- Privileged Functions --------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION privileged_functions:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-vRestoreContextOfFirstTask:

-	ldr  r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr  r3, [r2]							/* Read pxCurrentTCB. */

-	ldr  r0, [r3]							/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */

-

-#if ( configENABLE_MPU == 1 )

-	dmb										/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	bic r4, r4, #1							/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */

-	str r4, [r2]							/* Disable MPU. */

-

-	adds r3, #4								/* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */

-	ldr  r4, [r3]							/* r4 = *r3 i.e. r4 = MAIR0. */

-	ldr  r2, =0xe000edc0					/* r2 = 0xe000edc0 [Location of MAIR0]. */

-	str  r4, [r2]							/* Program MAIR0. */

-	ldr  r2, =0xe000ed98					/* r2 = 0xe000ed98 [Location of RNR]. */

-	movs r4, #4								/* r4 = 4. */

-	str  r4, [r2]							/* Program RNR = 4. */

-	adds r3, #4								/* r3 = r3 + 4. r3 now points to first RBAR in TCB. */

-	ldr  r2, =0xe000ed9c					/* r2 = 0xe000ed9c [Location of RBAR]. */

-	ldmia r3!, {r4-r11}						/* Read 4 set of RBAR/RLAR registers from TCB. */

-	stmia r2!, {r4-r11}						/* Write 4 set of RBAR/RLAR registers using alias registers. */

-

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	orr r4, r4, #1							/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */

-	str r4, [r2]							/* Enable MPU. */

-	dsb										/* Force memory writes before continuing. */

-#endif /* configENABLE_MPU */

-

-#if ( configENABLE_MPU == 1 )

-	ldm  r0!, {r1-r4}						/* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */

-	ldr  r5, =xSecureContext

-	str  r1, [r5]							/* Set xSecureContext to this task's value for the same. */

-	msr  psplim, r2							/* Set this task's PSPLIM value. */

-	msr  control, r3						/* Set this task's CONTROL value. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	mov  r0, #0

-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */

-	bx   r4									/* Finally, branch to EXC_RETURN. */

-#else /* configENABLE_MPU */

-	ldm  r0!, {r1-r3}						/* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */

-	ldr  r4, =xSecureContext

-	str  r1, [r4]							/* Set xSecureContext to this task's value for the same. */

-	msr  psplim, r2							/* Set this task's PSPLIM value. */

-	movs r1, #2								/* r1 = 2. */

-	msr  CONTROL, r1						/* Switch to use PSP in the thread mode. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	mov  r0, #0

-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */

-	bx   r3									/* Finally, branch to EXC_RETURN. */

-#endif /* configENABLE_MPU */

-/*-----------------------------------------------------------*/

-

-vRaisePrivilege:

-	mrs  r0, control						/* Read the CONTROL register. */

-	bic r0, r0, #1							/* Clear the bit 0. */

-	msr  control, r0						/* Write back the new CONTROL value. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-vStartFirstTask:

-	ldr r0, =0xe000ed08						/* Use the NVIC offset register to locate the stack. */

-	ldr r0, [r0]							/* Read the VTOR register which gives the address of vector table. */

-	ldr r0, [r0]							/* The first entry in vector table is stack pointer. */

-	msr msp, r0								/* Set the MSP back to the start of the stack. */

-	cpsie i									/* Globally enable interrupts. */

-	cpsie f

-	dsb

-	isb

-	svc 2									/* System call to start the first task. portSVC_START_SCHEDULER = 2. */

-/*-----------------------------------------------------------*/

-

-ulSetInterruptMask:

-	mrs r0, basepri							/* r0 = basepri. Return original basepri value. */

-	mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-	msr basepri, r1							/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */

-	dsb

-	isb

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-vClearInterruptMask:

-	msr basepri, r0							/* basepri = ulMask. */

-	dsb

-	isb

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-PendSV_Handler:

-	ldr r3, =xSecureContext					/* Read the location of xSecureContext i.e. &( xSecureContext ). */

-	ldr r0, [r3]							/* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */

-	ldr r3, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r3]							/* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */

-	mrs r2, psp								/* Read PSP in r2. */

-

-	cbz r0, save_ns_context					/* No secure context to save. */

-	push {r0-r2, r14}

-	bl SecureContext_SaveContext			/* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */

-	pop {r0-r3}								/* LR is now in r3. */

-	mov lr, r3								/* LR = r3. */

-	lsls r1, r3, #25						/* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */

-	bpl save_ns_context						/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */

-

-	ldr r3, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r3]							/* Read pxCurrentTCB. */

-#if ( configENABLE_MPU == 1 )

-	subs r2, r2, #16						/* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */

-	str r2, [r1]							/* Save the new top of stack in TCB. */

-	mrs r1, psplim							/* r1 = PSPLIM. */

-	mrs r3, control							/* r3 = CONTROL. */

-	mov r4, lr								/* r4 = LR/EXC_RETURN. */

-	stmia r2!, {r0, r1, r3, r4}				/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */

-#else /* configENABLE_MPU */

-	subs r2, r2, #12						/* Make space for xSecureContext, PSPLIM and LR on the stack. */

-	str r2, [r1]							/* Save the new top of stack in TCB. */

-	mrs r1, psplim							/* r1 = PSPLIM. */

-	mov r3, lr								/* r3 = LR/EXC_RETURN. */

-	stmia r2!, {r0, r1, r3}					/* Store xSecureContext, PSPLIM and LR on the stack. */

-#endif /* configENABLE_MPU */

-	b select_next_task

-

-	save_ns_context:

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-	#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )

-		tst lr, #0x10						/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */

-		it eq

-		vstmdbeq r2!, {s16-s31}				/* Store the additional FP context registers which are not saved automatically. */

-	#endif /* configENABLE_FPU || configENABLE_MVE */

-	#if ( configENABLE_MPU == 1 )

-		subs r2, r2, #48					/* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */

-		str r2, [r1]						/* Save the new top of stack in TCB. */

-		adds r2, r2, #16					/* r2 = r2 + 16. */

-		stm r2, {r4-r11}					/* Store the registers that are not saved automatically. */

-		mrs r1, psplim						/* r1 = PSPLIM. */

-		mrs r3, control						/* r3 = CONTROL. */

-		mov r4, lr							/* r4 = LR/EXC_RETURN. */

-		subs r2, r2, #16					/* r2 = r2 - 16. */

-		stmia r2!, {r0, r1, r3, r4}			/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */

-	#else /* configENABLE_MPU */

-		subs r2, r2, #44					/* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */

-		str r2, [r1]						/* Save the new top of stack in TCB. */

-		adds r2, r2, #12					/* r2 = r2 + 12. */

-		stm r2, {r4-r11}					/* Store the registers that are not saved automatically. */

-		mrs r1, psplim						/* r1 = PSPLIM. */

-		mov r3, lr							/* r3 = LR/EXC_RETURN. */

-		subs r2, r2, #12					/* r2 = r2 - 12. */

-		stmia r2!, {r0, r1, r3}				/* Store xSecureContext, PSPLIM and LR on the stack. */

-	#endif /* configENABLE_MPU */

-

-	select_next_task:

-		mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-		msr basepri, r0						/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */

-		dsb

-		isb

-		bl vTaskSwitchContext

-		mov r0, #0							/* r0 = 0. */

-		msr basepri, r0						/* Enable interrupts. */

-

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-		ldr r2, [r1]						/* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */

-

-	#if ( configENABLE_MPU == 1 )

-		dmb									/* Complete outstanding transfers before disabling MPU. */

-		ldr r3, =0xe000ed94					/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */

-		ldr r4, [r3]						/* Read the value of MPU_CTRL. */

-		bic r4, r4, #1						/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */

-		str r4, [r3]						/* Disable MPU. */

-

-		adds r1, #4							/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */

-		ldr r4, [r1]						/* r4 = *r1 i.e. r4 = MAIR0. */

-		ldr r3, =0xe000edc0					/* r3 = 0xe000edc0 [Location of MAIR0]. */

-		str r4, [r3]						/* Program MAIR0. */

-		ldr r3, =0xe000ed98					/* r3 = 0xe000ed98 [Location of RNR]. */

-		movs r4, #4							/* r4 = 4. */

-		str r4, [r3]						/* Program RNR = 4. */

-		adds r1, #4							/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */

-		ldr  r3, =0xe000ed9c				/* r3 = 0xe000ed9c [Location of RBAR]. */

-		ldmia r1!, {r4-r11}					/* Read 4 sets of RBAR/RLAR registers from TCB. */

-		stmia r3!, {r4-r11}					/* Write 4 set of RBAR/RLAR registers using alias registers. */

-

-		ldr r3, =0xe000ed94					/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */

-		ldr r4, [r3]						/* Read the value of MPU_CTRL. */

-		orr r4, r4, #1						/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */

-		str r4, [r3]						/* Enable MPU. */

-		dsb									/* Force memory writes before continuing. */

-	#endif /* configENABLE_MPU */

-

-	#if ( configENABLE_MPU == 1 )

-		ldmia r2!, {r0, r1, r3, r4}			/* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */

-		msr psplim, r1						/* Restore the PSPLIM register value for the task. */

-		msr control, r3						/* Restore the CONTROL register value for the task. */

-		mov lr, r4							/* LR = r4. */

-		ldr r3, =xSecureContext				/* Read the location of xSecureContext i.e. &( xSecureContext ). */

-		str r0, [r3]						/* Restore the task's xSecureContext. */

-		cbz r0, restore_ns_context			/* If there is no secure context for the task, restore the non-secure context. */

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-		push {r2, r4}

-		bl SecureContext_LoadContext		/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */

-		pop {r2, r4}

-		mov lr, r4							/* LR = r4. */

-		lsls r1, r4, #25					/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */

-		bpl restore_ns_context				/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */

-		msr psp, r2							/* Remember the new top of stack for the task. */

-		bx lr

-	#else /* configENABLE_MPU */

-		ldmia r2!, {r0, r1, r4}				/* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */

-		msr psplim, r1						/* Restore the PSPLIM register value for the task. */

-		mov lr, r4							/* LR = r4. */

-		ldr r3, =xSecureContext				/* Read the location of xSecureContext i.e. &( xSecureContext ). */

-		str r0, [r3]						/* Restore the task's xSecureContext. */

-		cbz r0, restore_ns_context			/* If there is no secure context for the task, restore the non-secure context. */

-		ldr r3, =pxCurrentTCB				/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-		ldr r1, [r3]						/* Read pxCurrentTCB. */

-		push {r2, r4}

-		bl SecureContext_LoadContext		/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */

-		pop {r2, r4}

-		mov lr, r4							/* LR = r4. */

-		lsls r1, r4, #25					/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */

-		bpl restore_ns_context				/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */

-		msr psp, r2							/* Remember the new top of stack for the task. */

-		bx lr

-	#endif /* configENABLE_MPU */

-

-	restore_ns_context:

-		ldmia r2!, {r4-r11}					/* Restore the registers that are not automatically restored. */

-	#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )

-		tst lr, #0x10						/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */

-		it eq

-		vldmiaeq r2!, {s16-s31}				/* Restore the additional FP context registers which are not restored automatically. */

-	#endif /* configENABLE_FPU || configENABLE_MVE */

-		msr psp, r2							/* Remember the new top of stack for the task. */

-		bx lr

-/*-----------------------------------------------------------*/

-

-SVC_Handler:

-	tst lr, #4

-	ite eq

-	mrseq r0, msp

-	mrsne r0, psp

-	b vPortSVCHandler_C

-/*-----------------------------------------------------------*/

-

-vPortFreeSecureContext:

-	/* r0 = uint32_t *pulTCB. */

-	ldr r2, [r0]							/* The first item in the TCB is the top of the stack. */

-	ldr r1, [r2]							/* The first item on the stack is the task's xSecureContext. */

-	cmp r1, #0								/* Raise svc if task's xSecureContext is not NULL. */

-	it ne

-	svcne 1									/* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-	END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+/* Including FreeRTOSConfig.h here will cause build errors if the header file
+contains code not understood by the assembler - for example the 'extern' keyword.
+To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
+the code is included in C files but excluded by the preprocessor in assembly
+files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
+#include "FreeRTOSConfig.h"
+
+    EXTERN pxCurrentTCB
+    EXTERN xSecureContext
+    EXTERN vTaskSwitchContext
+    EXTERN vPortSVCHandler_C
+    EXTERN SecureContext_SaveContext
+    EXTERN SecureContext_LoadContext
+
+    PUBLIC xIsPrivileged
+    PUBLIC vResetPrivilege
+    PUBLIC vPortAllocateSecureContext
+    PUBLIC vRestoreContextOfFirstTask
+    PUBLIC vRaisePrivilege
+    PUBLIC vStartFirstTask
+    PUBLIC ulSetInterruptMask
+    PUBLIC vClearInterruptMask
+    PUBLIC PendSV_Handler
+    PUBLIC SVC_Handler
+    PUBLIC vPortFreeSecureContext
+/*-----------------------------------------------------------*/
+
+/*---------------- Unprivileged Functions -------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+xIsPrivileged:
+    mrs r0, control                         /* r0 = CONTROL. */
+    tst r0, #1                              /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
+    ite ne
+    movne r0, #0                            /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
+    moveq r0, #1                            /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+vResetPrivilege:
+    mrs r0, control                         /* r0 = CONTROL. */
+    orr r0, r0, #1                          /* r0 = r0 | 1. */
+    msr control, r0                         /* CONTROL = r0. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+vPortAllocateSecureContext:
+    svc 0                                   /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+/*----------------- Privileged Functions --------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION privileged_functions:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+vRestoreContextOfFirstTask:
+    ldr  r2, =pxCurrentTCB                  /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr  r3, [r2]                           /* Read pxCurrentTCB. */
+    ldr  r0, [r3]                           /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
+
+#if ( configENABLE_MPU == 1 )
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    bic r4, r4, #1                          /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+    str r4, [r2]                            /* Disable MPU. */
+
+    adds r3, #4                             /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
+    ldr  r4, [r3]                           /* r4 = *r3 i.e. r4 = MAIR0. */
+    ldr  r2, =0xe000edc0                    /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str  r4, [r2]                           /* Program MAIR0. */
+    ldr  r2, =0xe000ed98                    /* r2 = 0xe000ed98 [Location of RNR]. */
+    movs r4, #4                             /* r4 = 4. */
+    str  r4, [r2]                           /* Program RNR = 4. */
+    adds r3, #4                             /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
+    ldr  r2, =0xe000ed9c                    /* r2 = 0xe000ed9c [Location of RBAR]. */
+    ldmia r3!, {r4-r11}                     /* Read 4 set of RBAR/RLAR registers from TCB. */
+    stmia r2!, {r4-r11}                     /* Write 4 set of RBAR/RLAR registers using alias registers. */
+
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    orr r4, r4, #1                          /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+    str r4, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
+#endif /* configENABLE_MPU */
+
+#if ( configENABLE_MPU == 1 )
+    ldm  r0!, {r1-r4}                       /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */
+    ldr  r5, =xSecureContext
+    str  r1, [r5]                           /* Set xSecureContext to this task's value for the same. */
+    msr  psplim, r2                         /* Set this task's PSPLIM value. */
+    msr  control, r3                        /* Set this task's CONTROL value. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r4                                 /* Finally, branch to EXC_RETURN. */
+#else /* configENABLE_MPU */
+    ldm  r0!, {r1-r3}                       /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
+    ldr  r4, =xSecureContext
+    str  r1, [r4]                           /* Set xSecureContext to this task's value for the same. */
+    msr  psplim, r2                         /* Set this task's PSPLIM value. */
+    movs r1, #2                             /* r1 = 2. */
+    msr  CONTROL, r1                        /* Switch to use PSP in the thread mode. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r3                                 /* Finally, branch to EXC_RETURN. */
+#endif /* configENABLE_MPU */
+/*-----------------------------------------------------------*/
+
+vRaisePrivilege:
+    mrs  r0, control                        /* Read the CONTROL register. */
+    bic r0, r0, #1                          /* Clear the bit 0. */
+    msr  control, r0                        /* Write back the new CONTROL value. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+vStartFirstTask:
+    ldr r0, =0xe000ed08                     /* Use the NVIC offset register to locate the stack. */
+    ldr r0, [r0]                            /* Read the VTOR register which gives the address of vector table. */
+    ldr r0, [r0]                            /* The first entry in vector table is stack pointer. */
+    msr msp, r0                             /* Set the MSP back to the start of the stack. */
+    cpsie i                                 /* Globally enable interrupts. */
+    cpsie f
+    dsb
+    isb
+    svc 2                                   /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
+/*-----------------------------------------------------------*/
+
+ulSetInterruptMask:
+    mrs r0, basepri                         /* r0 = basepri. Return original basepri value. */
+    mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r1                         /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+vClearInterruptMask:
+    msr basepri, r0                         /* basepri = ulMask. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+PendSV_Handler:
+    ldr r3, =xSecureContext                 /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+    ldr r0, [r3]                            /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */
+    ldr r3, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r3]                            /* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */
+    mrs r2, psp                             /* Read PSP in r2. */
+
+    cbz r0, save_ns_context                 /* No secure context to save. */
+    push {r0-r2, r14}
+    bl SecureContext_SaveContext            /* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+    pop {r0-r3}                             /* LR is now in r3. */
+    mov lr, r3                              /* LR = r3. */
+    lsls r1, r3, #25                        /* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+    bpl save_ns_context                     /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+
+    ldr r3, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r3]                            /* Read pxCurrentTCB. */
+#if ( configENABLE_MPU == 1 )
+    subs r2, r2, #16                        /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+    str r2, [r1]                            /* Save the new top of stack in TCB. */
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mrs r3, control                         /* r3 = CONTROL. */
+    mov r4, lr                              /* r4 = LR/EXC_RETURN. */
+    stmia r2!, {r0, r1, r3, r4}             /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+#else /* configENABLE_MPU */
+    subs r2, r2, #12                        /* Make space for xSecureContext, PSPLIM and LR on the stack. */
+    str r2, [r1]                            /* Save the new top of stack in TCB. */
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmia r2!, {r0, r1, r3}                 /* Store xSecureContext, PSPLIM and LR on the stack. */
+#endif /* configENABLE_MPU */
+    b select_next_task
+
+    save_ns_context:
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+    #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+        tst lr, #0x10                       /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+        it eq
+        vstmdbeq r2!, {s16-s31}             /* Store the additional FP context registers which are not saved automatically. */
+    #endif /* configENABLE_FPU || configENABLE_MVE */
+    #if ( configENABLE_MPU == 1 )
+        subs r2, r2, #48                    /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */
+        str r2, [r1]                        /* Save the new top of stack in TCB. */
+        adds r2, r2, #16                    /* r2 = r2 + 16. */
+        stm r2, {r4-r11}                    /* Store the registers that are not saved automatically. */
+        mrs r1, psplim                      /* r1 = PSPLIM. */
+        mrs r3, control                     /* r3 = CONTROL. */
+        mov r4, lr                          /* r4 = LR/EXC_RETURN. */
+        subs r2, r2, #16                    /* r2 = r2 - 16. */
+        stmia r2!, {r0, r1, r3, r4}         /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
+    #else /* configENABLE_MPU */
+        subs r2, r2, #44                    /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */
+        str r2, [r1]                        /* Save the new top of stack in TCB. */
+        adds r2, r2, #12                    /* r2 = r2 + 12. */
+        stm r2, {r4-r11}                    /* Store the registers that are not saved automatically. */
+        mrs r1, psplim                      /* r1 = PSPLIM. */
+        mov r3, lr                          /* r3 = LR/EXC_RETURN. */
+        subs r2, r2, #12                    /* r2 = r2 - 12. */
+        stmia r2!, {r0, r1, r3}             /* Store xSecureContext, PSPLIM and LR on the stack. */
+    #endif /* configENABLE_MPU */
+
+    select_next_task:
+        mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+        msr basepri, r0                     /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+        dsb
+        isb
+        bl vTaskSwitchContext
+        mov r0, #0                          /* r0 = 0. */
+        msr basepri, r0                     /* Enable interrupts. */
+
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        ldr r2, [r1]                        /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
+
+    #if ( configENABLE_MPU == 1 )
+        dmb                                 /* Complete outstanding transfers before disabling MPU. */
+        ldr r3, =0xe000ed94                 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */
+        ldr r4, [r3]                        /* Read the value of MPU_CTRL. */
+        bic r4, r4, #1                      /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+        str r4, [r3]                        /* Disable MPU. */
+
+        adds r1, #4                         /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+        ldr r4, [r1]                        /* r4 = *r1 i.e. r4 = MAIR0. */
+        ldr r3, =0xe000edc0                 /* r3 = 0xe000edc0 [Location of MAIR0]. */
+        str r4, [r3]                        /* Program MAIR0. */
+        ldr r3, =0xe000ed98                 /* r3 = 0xe000ed98 [Location of RNR]. */
+        movs r4, #4                         /* r4 = 4. */
+        str r4, [r3]                        /* Program RNR = 4. */
+        adds r1, #4                         /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+        ldr  r3, =0xe000ed9c                /* r3 = 0xe000ed9c [Location of RBAR]. */
+        ldmia r1!, {r4-r11}                 /* Read 4 sets of RBAR/RLAR registers from TCB. */
+        stmia r3!, {r4-r11}                 /* Write 4 set of RBAR/RLAR registers using alias registers. */
+
+        ldr r3, =0xe000ed94                 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */
+        ldr r4, [r3]                        /* Read the value of MPU_CTRL. */
+        orr r4, r4, #1                      /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+        str r4, [r3]                        /* Enable MPU. */
+        dsb                                 /* Force memory writes before continuing. */
+    #endif /* configENABLE_MPU */
+
+    #if ( configENABLE_MPU == 1 )
+        ldmia r2!, {r0, r1, r3, r4}         /* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */
+        msr psplim, r1                      /* Restore the PSPLIM register value for the task. */
+        msr control, r3                     /* Restore the CONTROL register value for the task. */
+        mov lr, r4                          /* LR = r4. */
+        ldr r3, =xSecureContext             /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+        str r0, [r3]                        /* Restore the task's xSecureContext. */
+        cbz r0, restore_ns_context          /* If there is no secure context for the task, restore the non-secure context. */
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        push {r2, r4}
+        bl SecureContext_LoadContext        /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+        pop {r2, r4}
+        mov lr, r4                          /* LR = r4. */
+        lsls r1, r4, #25                    /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+        bpl restore_ns_context              /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
+    #else /* configENABLE_MPU */
+        ldmia r2!, {r0, r1, r4}             /* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */
+        msr psplim, r1                      /* Restore the PSPLIM register value for the task. */
+        mov lr, r4                          /* LR = r4. */
+        ldr r3, =xSecureContext             /* Read the location of xSecureContext i.e. &( xSecureContext ). */
+        str r0, [r3]                        /* Restore the task's xSecureContext. */
+        cbz r0, restore_ns_context          /* If there is no secure context for the task, restore the non-secure context. */
+        ldr r3, =pxCurrentTCB               /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+        ldr r1, [r3]                        /* Read pxCurrentTCB. */
+        push {r2, r4}
+        bl SecureContext_LoadContext        /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */
+        pop {r2, r4}
+        mov lr, r4                          /* LR = r4. */
+        lsls r1, r4, #25                    /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
+        bpl restore_ns_context              /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
+    #endif /* configENABLE_MPU */
+
+    restore_ns_context:
+        ldmia r2!, {r4-r11}                 /* Restore the registers that are not automatically restored. */
+    #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+        tst lr, #0x10                       /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+        it eq
+        vldmiaeq r2!, {s16-s31}             /* Restore the additional FP context registers which are not restored automatically. */
+    #endif /* configENABLE_FPU || configENABLE_MVE */
+        msr psp, r2                         /* Remember the new top of stack for the task. */
+        bx lr
+/*-----------------------------------------------------------*/
+
+SVC_Handler:
+    tst lr, #4
+    ite eq
+    mrseq r0, msp
+    mrsne r0, psp
+    b vPortSVCHandler_C
+/*-----------------------------------------------------------*/
+
+vPortFreeSecureContext:
+    /* r0 = uint32_t *pulTCB. */
+    ldr r2, [r0]                            /* The first item in the TCB is the top of the stack. */
+    ldr r1, [r2]                            /* The first item on the stack is the task's xSecureContext. */
+    cmp r1, #0                              /* Raise svc if task's xSecureContext is not NULL. */
+    it ne
+    svcne 1                                 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h b/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h
index 4b1f99b..51e21ea 100644
--- a/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h
+++ b/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h
@@ -155,9 +155,9 @@
  * 8-bit values encoded as follows:
  *  Bit[7:4] - 0000 - Device Memory
  *  Bit[3:2] - 00 --> Device-nGnRnE
- *				01 --> Device-nGnRE
- *				10 --> Device-nGRE
- *				11 --> Device-GRE
+ *              01 --> Device-nGnRE
+ *              10 --> Device-nGRE
+ *              11 --> Device-GRE
  *  Bit[1:0] - 00, Reserved.
  */
     #define portMPU_DEVICE_MEMORY_nGnRnE                  ( 0x00 )   /* 0000 0000 */
diff --git a/portable/IAR/ARM_CM85/secure/secure_context.c b/portable/IAR/ARM_CM85/secure/secure_context.c
index b1d5503..0730d57 100644
--- a/portable/IAR/ARM_CM85/secure/secure_context.c
+++ b/portable/IAR/ARM_CM85/secure/secure_context.c
@@ -1,351 +1,351 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Secure context includes. */

-#include "secure_context.h"

-

-/* Secure heap includes. */

-#include "secure_heap.h"

-

-/* Secure port macros. */

-#include "secure_port_macros.h"

-

-/**

- * @brief CONTROL value for privileged tasks.

- *

- * Bit[0] - 0 --> Thread mode is privileged.

- * Bit[1] - 1 --> Thread mode uses PSP.

- */

-#define securecontextCONTROL_VALUE_PRIVILEGED      0x02

-

-/**

- * @brief CONTROL value for un-privileged tasks.

- *

- * Bit[0] - 1 --> Thread mode is un-privileged.

- * Bit[1] - 1 --> Thread mode uses PSP.

- */

-#define securecontextCONTROL_VALUE_UNPRIVILEGED    0x03

-

-/**

- * @brief Size of stack seal values in bytes.

- */

-#define securecontextSTACK_SEAL_SIZE               8

-

-/**

- * @brief Stack seal value as recommended by ARM.

- */

-#define securecontextSTACK_SEAL_VALUE              0xFEF5EDA5

-

-/**

- * @brief Maximum number of secure contexts.

- */

-#ifndef secureconfigMAX_SECURE_CONTEXTS

-    #define secureconfigMAX_SECURE_CONTEXTS        8UL

-#endif

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Pre-allocated array of secure contexts.

- */

-SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ];

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Get a free secure context for a task from the secure context pool (xSecureContexts).

- *

- * This function ensures that only one secure context is allocated for a task.

- *

- * @param[in] pvTaskHandle The task handle for which the secure context is allocated.

- *

- * @return Index of a free secure context in the xSecureContexts array.

- */

-static uint32_t ulGetSecureContext( void * pvTaskHandle );

-

-/**

- * @brief Return the secure context to the secure context pool (xSecureContexts).

- *

- * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array.

- */

-static void vReturnSecureContext( uint32_t ulSecureContextIndex );

-

-/* These are implemented in assembly. */

-extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext );

-extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext );

-/*-----------------------------------------------------------*/

-

-static uint32_t ulGetSecureContext( void * pvTaskHandle )

-{

-    /* Start with invalid index. */

-    uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;

-

-    for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )

-    {

-        if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) &&

-            ( xSecureContexts[ i ].pucStackLimit == NULL ) &&

-            ( xSecureContexts[ i ].pucStackStart == NULL ) &&

-            ( xSecureContexts[ i ].pvTaskHandle == NULL ) &&

-            ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) )

-        {

-            ulSecureContextIndex = i;

-        }

-        else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle )

-        {

-            /* A task can only have one secure context. Do not allocate a second

-             * context for the same task. */

-            ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;

-            break;

-        }

-    }

-

-    return ulSecureContextIndex;

-}

-/*-----------------------------------------------------------*/

-

-static void vReturnSecureContext( uint32_t ulSecureContextIndex )

-{

-    xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL;

-    xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL;

-    xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL;

-    xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL;

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_Init( void )

-{

-    uint32_t ulIPSR, i;

-    static uint32_t ulSecureContextsInitialized = 0;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) )

-    {

-        /* Ensure to initialize secure contexts only once. */

-        ulSecureContextsInitialized = 1;

-

-        /* No stack for thread mode until a task's context is loaded. */

-        secureportSET_PSPLIM( securecontextNO_STACK );

-        secureportSET_PSP( securecontextNO_STACK );

-

-        /* Initialize all secure contexts. */

-        for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )

-        {

-            xSecureContexts[ i ].pucCurrentStackPointer = NULL;

-            xSecureContexts[ i ].pucStackLimit = NULL;

-            xSecureContexts[ i ].pucStackStart = NULL;

-            xSecureContexts[ i ].pvTaskHandle = NULL;

-        }

-

-        #if ( configENABLE_MPU == 1 )

-            {

-                /* Configure thread mode to use PSP and to be unprivileged. */

-                secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED );

-            }

-        #else /* configENABLE_MPU */

-            {

-                /* Configure thread mode to use PSP and to be privileged. */

-                secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED );

-            }

-        #endif /* configENABLE_MPU */

-    }

-}

-/*-----------------------------------------------------------*/

-

-#if ( configENABLE_MPU == 1 )

-    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                                                       uint32_t ulIsTaskPrivileged,

-                                                                                       void * pvTaskHandle )

-#else /* configENABLE_MPU */

-    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                                                       void * pvTaskHandle )

-#endif /* configENABLE_MPU */

-{

-    uint8_t * pucStackMemory = NULL;

-    uint8_t * pucStackLimit;

-    uint32_t ulIPSR, ulSecureContextIndex;

-    SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID;

-

-    #if ( configENABLE_MPU == 1 )

-        uint32_t * pulCurrentStackPointer = NULL;

-    #endif /* configENABLE_MPU */

-

-    /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit

-     * Register (PSPLIM) value. */

-    secureportREAD_IPSR( ulIPSR );

-    secureportREAD_PSPLIM( pucStackLimit );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode.

-     * Also do nothing, if a secure context us already loaded. PSPLIM is set to

-     * securecontextNO_STACK when no secure context is loaded. */

-    if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) )

-    {

-        /* Ontain a free secure context. */

-        ulSecureContextIndex = ulGetSecureContext( pvTaskHandle );

-

-        /* Were we able to get a free context? */

-        if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS )

-        {

-            /* Allocate the stack space. */

-            pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE );

-

-            if( pucStackMemory != NULL )

-            {

-                /* Since stack grows down, the starting point will be the last

-                 * location. Note that this location is next to the last

-                 * allocated byte for stack (excluding the space for seal values)

-                 * because the hardware decrements the stack pointer before

-                 * writing i.e. if stack pointer is 0x2, a push operation will

-                 * decrement the stack pointer to 0x1 and then write at 0x1. */

-                xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize;

-

-                /* Seal the created secure process stack. */

-                *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE;

-                *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE;

-

-                /* The stack cannot go beyond this location. This value is

-                 * programmed in the PSPLIM register on context switch.*/

-                xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory;

-

-                xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle;

-

-                #if ( configENABLE_MPU == 1 )

-                    {

-                        /* Store the correct CONTROL value for the task on the stack.

-                         * This value is programmed in the CONTROL register on

-                         * context switch. */

-                        pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart;

-                        pulCurrentStackPointer--;

-

-                        if( ulIsTaskPrivileged )

-                        {

-                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;

-                        }

-                        else

-                        {

-                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED;

-                        }

-

-                        /* Store the current stack pointer. This value is programmed in

-                         * the PSP register on context switch. */

-                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer;

-                    }

-                #else /* configENABLE_MPU */

-                    {

-                        /* Current SP is set to the starting of the stack. This

-                         * value programmed in the PSP register on context switch. */

-                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart;

-                    }

-                #endif /* configENABLE_MPU */

-

-                /* Ensure to never return 0 as a valid context handle. */

-                xSecureContextHandle = ulSecureContextIndex + 1UL;

-            }

-        }

-    }

-

-    return xSecureContextHandle;

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )

-{

-    uint32_t ulIPSR, ulSecureContextIndex;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ulIPSR != 0 )

-    {

-        /* Only free if a valid context handle is passed. */

-        if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )

-        {

-            ulSecureContextIndex = xSecureContextHandle - 1UL;

-

-            /* Ensure that the secure context being deleted is associated with

-             * the task. */

-            if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle )

-            {

-                /* Free the stack space. */

-                vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit );

-

-                /* Return the secure context back to the free secure contexts pool. */

-                vReturnSecureContext( ulSecureContextIndex );

-            }

-        }

-    }

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )

-{

-    uint8_t * pucStackLimit;

-    uint32_t ulSecureContextIndex;

-

-    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )

-    {

-        ulSecureContextIndex = xSecureContextHandle - 1UL;

-

-        secureportREAD_PSPLIM( pucStackLimit );

-

-        /* Ensure that no secure context is loaded and the task is loading it's

-         * own context. */

-        if( ( pucStackLimit == securecontextNO_STACK ) &&

-            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )

-        {

-            SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );

-        }

-    }

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )

-{

-    uint8_t * pucStackLimit;

-    uint32_t ulSecureContextIndex;

-

-    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )

-    {

-        ulSecureContextIndex = xSecureContextHandle - 1UL;

-

-        secureportREAD_PSPLIM( pucStackLimit );

-

-        /* Ensure that task's context is loaded and the task is saving it's own

-         * context. */

-        if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) &&

-            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )

-        {

-            SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );

-        }

-    }

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Secure context includes. */
+#include "secure_context.h"
+
+/* Secure heap includes. */
+#include "secure_heap.h"
+
+/* Secure port macros. */
+#include "secure_port_macros.h"
+
+/**
+ * @brief CONTROL value for privileged tasks.
+ *
+ * Bit[0] - 0 --> Thread mode is privileged.
+ * Bit[1] - 1 --> Thread mode uses PSP.
+ */
+#define securecontextCONTROL_VALUE_PRIVILEGED      0x02
+
+/**
+ * @brief CONTROL value for un-privileged tasks.
+ *
+ * Bit[0] - 1 --> Thread mode is un-privileged.
+ * Bit[1] - 1 --> Thread mode uses PSP.
+ */
+#define securecontextCONTROL_VALUE_UNPRIVILEGED    0x03
+
+/**
+ * @brief Size of stack seal values in bytes.
+ */
+#define securecontextSTACK_SEAL_SIZE               8
+
+/**
+ * @brief Stack seal value as recommended by ARM.
+ */
+#define securecontextSTACK_SEAL_VALUE              0xFEF5EDA5
+
+/**
+ * @brief Maximum number of secure contexts.
+ */
+#ifndef secureconfigMAX_SECURE_CONTEXTS
+    #define secureconfigMAX_SECURE_CONTEXTS        8UL
+#endif
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Pre-allocated array of secure contexts.
+ */
+SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ];
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Get a free secure context for a task from the secure context pool (xSecureContexts).
+ *
+ * This function ensures that only one secure context is allocated for a task.
+ *
+ * @param[in] pvTaskHandle The task handle for which the secure context is allocated.
+ *
+ * @return Index of a free secure context in the xSecureContexts array.
+ */
+static uint32_t ulGetSecureContext( void * pvTaskHandle );
+
+/**
+ * @brief Return the secure context to the secure context pool (xSecureContexts).
+ *
+ * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array.
+ */
+static void vReturnSecureContext( uint32_t ulSecureContextIndex );
+
+/* These are implemented in assembly. */
+extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext );
+extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext );
+/*-----------------------------------------------------------*/
+
+static uint32_t ulGetSecureContext( void * pvTaskHandle )
+{
+    /* Start with invalid index. */
+    uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;
+
+    for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )
+    {
+        if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) &&
+            ( xSecureContexts[ i ].pucStackLimit == NULL ) &&
+            ( xSecureContexts[ i ].pucStackStart == NULL ) &&
+            ( xSecureContexts[ i ].pvTaskHandle == NULL ) &&
+            ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) )
+        {
+            ulSecureContextIndex = i;
+        }
+        else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle )
+        {
+            /* A task can only have one secure context. Do not allocate a second
+             * context for the same task. */
+            ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS;
+            break;
+        }
+    }
+
+    return ulSecureContextIndex;
+}
+/*-----------------------------------------------------------*/
+
+static void vReturnSecureContext( uint32_t ulSecureContextIndex )
+{
+    xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL;
+    xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL;
+    xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL;
+    xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL;
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_Init( void )
+{
+    uint32_t ulIPSR, i;
+    static uint32_t ulSecureContextsInitialized = 0;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) )
+    {
+        /* Ensure to initialize secure contexts only once. */
+        ulSecureContextsInitialized = 1;
+
+        /* No stack for thread mode until a task's context is loaded. */
+        secureportSET_PSPLIM( securecontextNO_STACK );
+        secureportSET_PSP( securecontextNO_STACK );
+
+        /* Initialize all secure contexts. */
+        for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ )
+        {
+            xSecureContexts[ i ].pucCurrentStackPointer = NULL;
+            xSecureContexts[ i ].pucStackLimit = NULL;
+            xSecureContexts[ i ].pucStackStart = NULL;
+            xSecureContexts[ i ].pvTaskHandle = NULL;
+        }
+
+        #if ( configENABLE_MPU == 1 )
+            {
+                /* Configure thread mode to use PSP and to be unprivileged. */
+                secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED );
+            }
+        #else /* configENABLE_MPU */
+            {
+                /* Configure thread mode to use PSP and to be privileged. */
+                secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED );
+            }
+        #endif /* configENABLE_MPU */
+    }
+}
+/*-----------------------------------------------------------*/
+
+#if ( configENABLE_MPU == 1 )
+    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                                                       uint32_t ulIsTaskPrivileged,
+                                                                                       void * pvTaskHandle )
+#else /* configENABLE_MPU */
+    secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                                                       void * pvTaskHandle )
+#endif /* configENABLE_MPU */
+{
+    uint8_t * pucStackMemory = NULL;
+    uint8_t * pucStackLimit;
+    uint32_t ulIPSR, ulSecureContextIndex;
+    SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID;
+
+    #if ( configENABLE_MPU == 1 )
+        uint32_t * pulCurrentStackPointer = NULL;
+    #endif /* configENABLE_MPU */
+
+    /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit
+     * Register (PSPLIM) value. */
+    secureportREAD_IPSR( ulIPSR );
+    secureportREAD_PSPLIM( pucStackLimit );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode.
+     * Also do nothing, if a secure context us already loaded. PSPLIM is set to
+     * securecontextNO_STACK when no secure context is loaded. */
+    if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) )
+    {
+        /* Ontain a free secure context. */
+        ulSecureContextIndex = ulGetSecureContext( pvTaskHandle );
+
+        /* Were we able to get a free context? */
+        if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS )
+        {
+            /* Allocate the stack space. */
+            pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE );
+
+            if( pucStackMemory != NULL )
+            {
+                /* Since stack grows down, the starting point will be the last
+                 * location. Note that this location is next to the last
+                 * allocated byte for stack (excluding the space for seal values)
+                 * because the hardware decrements the stack pointer before
+                 * writing i.e. if stack pointer is 0x2, a push operation will
+                 * decrement the stack pointer to 0x1 and then write at 0x1. */
+                xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize;
+
+                /* Seal the created secure process stack. */
+                *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE;
+                *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE;
+
+                /* The stack cannot go beyond this location. This value is
+                 * programmed in the PSPLIM register on context switch.*/
+                xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory;
+
+                xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle;
+
+                #if ( configENABLE_MPU == 1 )
+                    {
+                        /* Store the correct CONTROL value for the task on the stack.
+                         * This value is programmed in the CONTROL register on
+                         * context switch. */
+                        pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart;
+                        pulCurrentStackPointer--;
+
+                        if( ulIsTaskPrivileged )
+                        {
+                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;
+                        }
+                        else
+                        {
+                            *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED;
+                        }
+
+                        /* Store the current stack pointer. This value is programmed in
+                         * the PSP register on context switch. */
+                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer;
+                    }
+                #else /* configENABLE_MPU */
+                    {
+                        /* Current SP is set to the starting of the stack. This
+                         * value programmed in the PSP register on context switch. */
+                        xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart;
+                    }
+                #endif /* configENABLE_MPU */
+
+                /* Ensure to never return 0 as a valid context handle. */
+                xSecureContextHandle = ulSecureContextIndex + 1UL;
+            }
+        }
+    }
+
+    return xSecureContextHandle;
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )
+{
+    uint32_t ulIPSR, ulSecureContextIndex;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ulIPSR != 0 )
+    {
+        /* Only free if a valid context handle is passed. */
+        if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )
+        {
+            ulSecureContextIndex = xSecureContextHandle - 1UL;
+
+            /* Ensure that the secure context being deleted is associated with
+             * the task. */
+            if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle )
+            {
+                /* Free the stack space. */
+                vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit );
+
+                /* Return the secure context back to the free secure contexts pool. */
+                vReturnSecureContext( ulSecureContextIndex );
+            }
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )
+{
+    uint8_t * pucStackLimit;
+    uint32_t ulSecureContextIndex;
+
+    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )
+    {
+        ulSecureContextIndex = xSecureContextHandle - 1UL;
+
+        secureportREAD_PSPLIM( pucStackLimit );
+
+        /* Ensure that no secure context is loaded and the task is loading it's
+         * own context. */
+        if( ( pucStackLimit == securecontextNO_STACK ) &&
+            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )
+        {
+            SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle )
+{
+    uint8_t * pucStackLimit;
+    uint32_t ulSecureContextIndex;
+
+    if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) )
+    {
+        ulSecureContextIndex = xSecureContextHandle - 1UL;
+
+        secureportREAD_PSPLIM( pucStackLimit );
+
+        /* Ensure that task's context is loaded and the task is saving it's own
+         * context. */
+        if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) &&
+            ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) )
+        {
+            SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) );
+        }
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CM85/secure/secure_context.h b/portable/IAR/ARM_CM85/secure/secure_context.h
index 57e390c..d0adbaf 100644
--- a/portable/IAR/ARM_CM85/secure/secure_context.h
+++ b/portable/IAR/ARM_CM85/secure/secure_context.h
@@ -1,135 +1,135 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_CONTEXT_H__

-#define __SECURE_CONTEXT_H__

-

-/* Standard includes. */

-#include <stdint.h>

-

-/* FreeRTOS includes. */

-#include "FreeRTOSConfig.h"

-

-/**

- * @brief PSP value when no secure context is loaded.

- */

-#define securecontextNO_STACK               0x0

-

-/**

- * @brief Invalid context ID.

- */

-#define securecontextINVALID_CONTEXT_ID     0UL

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Structure to represent a secure context.

- *

- * @note Since stack grows down, pucStackStart is the highest address while

- * pucStackLimit is the first address of the allocated memory.

- */

-typedef struct SecureContext

-{

-    uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */

-    uint8_t * pucStackLimit;          /**< Last location of the stack memory (PSPLIM). */

-    uint8_t * pucStackStart;          /**< First location of the stack memory. */

-    void * pvTaskHandle;              /**< Task handle of the task this context is associated with. */

-} SecureContext_t;

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Opaque handle for a secure context.

- */

-typedef uint32_t SecureContextHandle_t;

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Initializes the secure context management system.

- *

- * PSP is set to NULL and therefore a task must allocate and load a context

- * before calling any secure side function in the thread mode.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- */

-void SecureContext_Init( void );

-

-/**

- * @brief Allocates a context on the secure side.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] ulSecureStackSize Size of the stack to allocate on secure side.

- * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise.

- *

- * @return Opaque context handle if context is successfully allocated, NULL

- * otherwise.

- */

-#if ( configENABLE_MPU == 1 )

-    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                         uint32_t ulIsTaskPrivileged,

-                                                         void * pvTaskHandle );

-#else /* configENABLE_MPU */

-    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,

-                                                         void * pvTaskHandle );

-#endif /* configENABLE_MPU */

-

-/**

- * @brief Frees the given context.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] xSecureContextHandle Context handle corresponding to the

- * context to be freed.

- */

-void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );

-

-/**

- * @brief Loads the given context.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] xSecureContextHandle Context handle corresponding to the context

- * to be loaded.

- */

-void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );

-

-/**

- * @brief Saves the given context.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- *

- * @param[in] xSecureContextHandle Context handle corresponding to the context

- * to be saved.

- */

-void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );

-

-#endif /* __SECURE_CONTEXT_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_CONTEXT_H__
+#define __SECURE_CONTEXT_H__
+
+/* Standard includes. */
+#include <stdint.h>
+
+/* FreeRTOS includes. */
+#include "FreeRTOSConfig.h"
+
+/**
+ * @brief PSP value when no secure context is loaded.
+ */
+#define securecontextNO_STACK               0x0
+
+/**
+ * @brief Invalid context ID.
+ */
+#define securecontextINVALID_CONTEXT_ID     0UL
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Structure to represent a secure context.
+ *
+ * @note Since stack grows down, pucStackStart is the highest address while
+ * pucStackLimit is the first address of the allocated memory.
+ */
+typedef struct SecureContext
+{
+    uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */
+    uint8_t * pucStackLimit;          /**< Last location of the stack memory (PSPLIM). */
+    uint8_t * pucStackStart;          /**< First location of the stack memory. */
+    void * pvTaskHandle;              /**< Task handle of the task this context is associated with. */
+} SecureContext_t;
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Opaque handle for a secure context.
+ */
+typedef uint32_t SecureContextHandle_t;
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Initializes the secure context management system.
+ *
+ * PSP is set to NULL and therefore a task must allocate and load a context
+ * before calling any secure side function in the thread mode.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ */
+void SecureContext_Init( void );
+
+/**
+ * @brief Allocates a context on the secure side.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] ulSecureStackSize Size of the stack to allocate on secure side.
+ * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise.
+ *
+ * @return Opaque context handle if context is successfully allocated, NULL
+ * otherwise.
+ */
+#if ( configENABLE_MPU == 1 )
+    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                         uint32_t ulIsTaskPrivileged,
+                                                         void * pvTaskHandle );
+#else /* configENABLE_MPU */
+    SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
+                                                         void * pvTaskHandle );
+#endif /* configENABLE_MPU */
+
+/**
+ * @brief Frees the given context.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] xSecureContextHandle Context handle corresponding to the
+ * context to be freed.
+ */
+void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );
+
+/**
+ * @brief Loads the given context.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] xSecureContextHandle Context handle corresponding to the context
+ * to be loaded.
+ */
+void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );
+
+/**
+ * @brief Saves the given context.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ *
+ * @param[in] xSecureContextHandle Context handle corresponding to the context
+ * to be saved.
+ */
+void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle );
+
+#endif /* __SECURE_CONTEXT_H__ */
diff --git a/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s b/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s
index 99240ca..400bd01 100644
--- a/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s
+++ b/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s
@@ -1,86 +1,86 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-    SECTION .text:CODE:NOROOT(2)

-    THUMB

-

-/* Including FreeRTOSConfig.h here will cause build errors if the header file

-contains code not understood by the assembler - for example the 'extern' keyword.

-To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so

-the code is included in C files but excluded by the preprocessor in assembly

-files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */

-#include "FreeRTOSConfig.h"

-

-    PUBLIC SecureContext_LoadContextAsm

-    PUBLIC SecureContext_SaveContextAsm

-/*-----------------------------------------------------------*/

-

-SecureContext_LoadContextAsm:

-    /* pxSecureContext value is in r0. */

-    mrs r1, ipsr                        /* r1 = IPSR. */

-    cbz r1, load_ctx_therad_mode        /* Do nothing if the processor is running in the Thread Mode. */

-    ldmia r0!, {r1, r2}                 /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */

-

-#if ( configENABLE_MPU == 1 )

-    ldmia r1!, {r3}                     /* Read CONTROL register value from task's stack. r3 = CONTROL. */

-    msr control, r3                     /* CONTROL = r3. */

-#endif /* configENABLE_MPU */

-

-    msr psplim, r2                      /* PSPLIM = r2. */

-    msr psp, r1                         /* PSP = r1. */

-

-    load_ctx_therad_mode:

-        bx lr

-/*-----------------------------------------------------------*/

-

-SecureContext_SaveContextAsm:

-    /* pxSecureContext value is in r0. */

-    mrs r1, ipsr                        /* r1 = IPSR. */

-    cbz r1, save_ctx_therad_mode        /* Do nothing if the processor is running in the Thread Mode. */

-    mrs r1, psp                         /* r1 = PSP. */

-

-#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )

-    vstmdb r1!, {s0}                    /* Trigger the deferred stacking of FPU registers. */

-    vldmia r1!, {s0}                    /* Nullify the effect of the previous statement. */

-#endif /* configENABLE_FPU || configENABLE_MVE */

-

-#if ( configENABLE_MPU == 1 )

-    mrs r2, control                     /* r2 = CONTROL. */

-    stmdb r1!, {r2}                     /* Store CONTROL value on the stack. */

-#endif /* configENABLE_MPU */

-

-    str r1, [r0]                        /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */

-    movs r1, #0                         /* r1 = securecontextNO_STACK. */

-    msr psplim, r1                      /* PSPLIM = securecontextNO_STACK. */

-    msr psp, r1                         /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */

-

-    save_ctx_therad_mode:

-        bx lr

-/*-----------------------------------------------------------*/

-

-    END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
+
+/* Including FreeRTOSConfig.h here will cause build errors if the header file
+contains code not understood by the assembler - for example the 'extern' keyword.
+To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
+the code is included in C files but excluded by the preprocessor in assembly
+files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
+#include "FreeRTOSConfig.h"
+
+    PUBLIC SecureContext_LoadContextAsm
+    PUBLIC SecureContext_SaveContextAsm
+/*-----------------------------------------------------------*/
+
+SecureContext_LoadContextAsm:
+    /* pxSecureContext value is in r0. */
+    mrs r1, ipsr                        /* r1 = IPSR. */
+    cbz r1, load_ctx_therad_mode        /* Do nothing if the processor is running in the Thread Mode. */
+    ldmia r0!, {r1, r2}                 /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */
+
+#if ( configENABLE_MPU == 1 )
+    ldmia r1!, {r3}                     /* Read CONTROL register value from task's stack. r3 = CONTROL. */
+    msr control, r3                     /* CONTROL = r3. */
+#endif /* configENABLE_MPU */
+
+    msr psplim, r2                      /* PSPLIM = r2. */
+    msr psp, r1                         /* PSP = r1. */
+
+    load_ctx_therad_mode:
+        bx lr
+/*-----------------------------------------------------------*/
+
+SecureContext_SaveContextAsm:
+    /* pxSecureContext value is in r0. */
+    mrs r1, ipsr                        /* r1 = IPSR. */
+    cbz r1, save_ctx_therad_mode        /* Do nothing if the processor is running in the Thread Mode. */
+    mrs r1, psp                         /* r1 = PSP. */
+
+#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+    vstmdb r1!, {s0}                    /* Trigger the deferred stacking of FPU registers. */
+    vldmia r1!, {s0}                    /* Nullify the effect of the previous statement. */
+#endif /* configENABLE_FPU || configENABLE_MVE */
+
+#if ( configENABLE_MPU == 1 )
+    mrs r2, control                     /* r2 = CONTROL. */
+    stmdb r1!, {r2}                     /* Store CONTROL value on the stack. */
+#endif /* configENABLE_MPU */
+
+    str r1, [r0]                        /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */
+    movs r1, #0                         /* r1 = securecontextNO_STACK. */
+    msr psplim, r1                      /* PSPLIM = securecontextNO_STACK. */
+    msr psp, r1                         /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */
+
+    save_ctx_therad_mode:
+        bx lr
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/ARM_CM85/secure/secure_heap.c b/portable/IAR/ARM_CM85/secure/secure_heap.c
index 741b463..157fdbf 100644
--- a/portable/IAR/ARM_CM85/secure/secure_heap.c
+++ b/portable/IAR/ARM_CM85/secure/secure_heap.c
@@ -1,454 +1,454 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Standard includes. */

-#include <stdint.h>

-

-/* Secure context heap includes. */

-#include "secure_heap.h"

-

-/* Secure port macros. */

-#include "secure_port_macros.h"

-

-/**

- * @brief Total heap size.

- */

-#ifndef secureconfigTOTAL_HEAP_SIZE

-    #define secureconfigTOTAL_HEAP_SIZE    ( ( ( size_t ) ( 10 * 1024 ) ) )

-#endif

-

-/* No test marker by default. */

-#ifndef mtCOVERAGE_TEST_MARKER

-    #define mtCOVERAGE_TEST_MARKER()

-#endif

-

-/* No tracing by default. */

-#ifndef traceMALLOC

-    #define traceMALLOC( pvReturn, xWantedSize )

-#endif

-

-/* No tracing by default. */

-#ifndef traceFREE

-    #define traceFREE( pv, xBlockSize )

-#endif

-

-/* Block sizes must not get too small. */

-#define secureheapMINIMUM_BLOCK_SIZE    ( ( size_t ) ( xHeapStructSize << 1 ) )

-

-/* Assumes 8bit bytes! */

-#define secureheapBITS_PER_BYTE         ( ( size_t ) 8 )

-/*-----------------------------------------------------------*/

-

-/* Allocate the memory for the heap. */

-#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )

-

-/* The application writer has already defined the array used for the RTOS

-* heap - probably so it can be placed in a special segment or address. */

-    extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];

-#else /* configAPPLICATION_ALLOCATED_HEAP */

-    static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];

-#endif /* configAPPLICATION_ALLOCATED_HEAP */

-

-/**

- * @brief The linked list structure.

- *

- * This is used to link free blocks in order of their memory address.

- */

-typedef struct A_BLOCK_LINK

-{

-    struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */

-    size_t xBlockSize;                     /**< The size of the free block. */

-} BlockLink_t;

-/*-----------------------------------------------------------*/

-

-/**

- * @brief Called automatically to setup the required heap structures the first

- * time pvPortMalloc() is called.

- */

-static void prvHeapInit( void );

-

-/**

- * @brief Inserts a block of memory that is being freed into the correct

- * position in the list of free memory blocks.

- *

- * The block being freed will be merged with the block in front it and/or the

- * block behind it if the memory blocks are adjacent to each other.

- *

- * @param[in] pxBlockToInsert The block being freed.

- */

-static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert );

-/*-----------------------------------------------------------*/

-

-/**

- * @brief The size of the structure placed at the beginning of each allocated

- * memory block must by correctly byte aligned.

- */

-static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );

-

-/**

- * @brief Create a couple of list links to mark the start and end of the list.

- */

-static BlockLink_t xStart;

-static BlockLink_t * pxEnd = NULL;

-

-/**

- * @brief Keeps track of the number of free bytes remaining, but says nothing

- * about fragmentation.

- */

-static size_t xFreeBytesRemaining = 0U;

-static size_t xMinimumEverFreeBytesRemaining = 0U;

-

-/**

- * @brief Gets set to the top bit of an size_t type.

- *

- * When this bit in the xBlockSize member of an BlockLink_t structure is set

- * then the block belongs to the application. When the bit is free the block is

- * still part of the free heap space.

- */

-static size_t xBlockAllocatedBit = 0;

-/*-----------------------------------------------------------*/

-

-static void prvHeapInit( void )

-{

-    BlockLink_t * pxFirstFreeBlock;

-    uint8_t * pucAlignedHeap;

-    size_t uxAddress;

-    size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE;

-

-    /* Ensure the heap starts on a correctly aligned boundary. */

-    uxAddress = ( size_t ) ucHeap;

-

-    if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 )

-    {

-        uxAddress += ( secureportBYTE_ALIGNMENT - 1 );

-        uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );

-        xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;

-    }

-

-    pucAlignedHeap = ( uint8_t * ) uxAddress;

-

-    /* xStart is used to hold a pointer to the first item in the list of free

-     * blocks.  The void cast is used to prevent compiler warnings. */

-    xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;

-    xStart.xBlockSize = ( size_t ) 0;

-

-    /* pxEnd is used to mark the end of the list of free blocks and is inserted

-     * at the end of the heap space. */

-    uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;

-    uxAddress -= xHeapStructSize;

-    uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );

-    pxEnd = ( void * ) uxAddress;

-    pxEnd->xBlockSize = 0;

-    pxEnd->pxNextFreeBlock = NULL;

-

-    /* To start with there is a single free block that is sized to take up the

-     * entire heap space, minus the space taken by pxEnd. */

-    pxFirstFreeBlock = ( void * ) pucAlignedHeap;

-    pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;

-    pxFirstFreeBlock->pxNextFreeBlock = pxEnd;

-

-    /* Only one block exists - and it covers the entire usable heap space. */

-    xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;

-    xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;

-

-    /* Work out the position of the top bit in a size_t variable. */

-    xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 );

-}

-/*-----------------------------------------------------------*/

-

-static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert )

-{

-    BlockLink_t * pxIterator;

-    uint8_t * puc;

-

-    /* Iterate through the list until a block is found that has a higher address

-     * than the block being inserted. */

-    for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )

-    {

-        /* Nothing to do here, just iterate to the right position. */

-    }

-

-    /* Do the block being inserted, and the block it is being inserted after

-     * make a contiguous block of memory? */

-    puc = ( uint8_t * ) pxIterator;

-

-    if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )

-    {

-        pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;

-        pxBlockToInsert = pxIterator;

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-

-    /* Do the block being inserted, and the block it is being inserted before

-     * make a contiguous block of memory? */

-    puc = ( uint8_t * ) pxBlockToInsert;

-

-    if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )

-    {

-        if( pxIterator->pxNextFreeBlock != pxEnd )

-        {

-            /* Form one big block from the two blocks. */

-            pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;

-            pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;

-        }

-        else

-        {

-            pxBlockToInsert->pxNextFreeBlock = pxEnd;

-        }

-    }

-    else

-    {

-        pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;

-    }

-

-    /* If the block being inserted plugged a gab, so was merged with the block

-     * before and the block after, then it's pxNextFreeBlock pointer will have

-     * already been set, and should not be set here as that would make it point

-     * to itself. */

-    if( pxIterator != pxBlockToInsert )

-    {

-        pxIterator->pxNextFreeBlock = pxBlockToInsert;

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-}

-/*-----------------------------------------------------------*/

-

-void * pvPortMalloc( size_t xWantedSize )

-{

-    BlockLink_t * pxBlock;

-    BlockLink_t * pxPreviousBlock;

-    BlockLink_t * pxNewBlockLink;

-    void * pvReturn = NULL;

-

-    /* If this is the first call to malloc then the heap will require

-     * initialisation to setup the list of free blocks. */

-    if( pxEnd == NULL )

-    {

-        prvHeapInit();

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-

-    /* Check the requested block size is not so large that the top bit is set.

-     * The top bit of the block size member of the BlockLink_t structure is used

-     * to determine who owns the block - the application or the kernel, so it

-     * must be free. */

-    if( ( xWantedSize & xBlockAllocatedBit ) == 0 )

-    {

-        /* The wanted size is increased so it can contain a BlockLink_t

-         * structure in addition to the requested amount of bytes. */

-        if( xWantedSize > 0 )

-        {

-            xWantedSize += xHeapStructSize;

-

-            /* Ensure that blocks are always aligned to the required number of

-             * bytes. */

-            if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 )

-            {

-                /* Byte alignment required. */

-                xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) );

-                secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 );

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-        else

-        {

-            mtCOVERAGE_TEST_MARKER();

-        }

-

-        if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )

-        {

-            /* Traverse the list from the start (lowest address) block until

-             * one of adequate size is found. */

-            pxPreviousBlock = &xStart;

-            pxBlock = xStart.pxNextFreeBlock;

-

-            while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )

-            {

-                pxPreviousBlock = pxBlock;

-                pxBlock = pxBlock->pxNextFreeBlock;

-            }

-

-            /* If the end marker was reached then a block of adequate size was

-             * not found. */

-            if( pxBlock != pxEnd )

-            {

-                /* Return the memory space pointed to - jumping over the

-                 * BlockLink_t structure at its start. */

-                pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );

-

-                /* This block is being returned for use so must be taken out

-                 * of the list of free blocks. */

-                pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;

-

-                /* If the block is larger than required it can be split into

-                 * two. */

-                if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE )

-                {

-                    /* This block is to be split into two.  Create a new

-                     * block following the number of bytes requested. The void

-                     * cast is used to prevent byte alignment warnings from the

-                     * compiler. */

-                    pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );

-                    secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 );

-

-                    /* Calculate the sizes of two blocks split from the single

-                     * block. */

-                    pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;

-                    pxBlock->xBlockSize = xWantedSize;

-

-                    /* Insert the new block into the list of free blocks. */

-                    prvInsertBlockIntoFreeList( pxNewBlockLink );

-                }

-                else

-                {

-                    mtCOVERAGE_TEST_MARKER();

-                }

-

-                xFreeBytesRemaining -= pxBlock->xBlockSize;

-

-                if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )

-                {

-                    xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;

-                }

-                else

-                {

-                    mtCOVERAGE_TEST_MARKER();

-                }

-

-                /* The block is being returned - it is allocated and owned by

-                 * the application and has no "next" block. */

-                pxBlock->xBlockSize |= xBlockAllocatedBit;

-                pxBlock->pxNextFreeBlock = NULL;

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-        else

-        {

-            mtCOVERAGE_TEST_MARKER();

-        }

-    }

-    else

-    {

-        mtCOVERAGE_TEST_MARKER();

-    }

-

-    traceMALLOC( pvReturn, xWantedSize );

-

-    #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 )

-        {

-            if( pvReturn == NULL )

-            {

-                extern void vApplicationMallocFailedHook( void );

-                vApplicationMallocFailedHook();

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-    #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */

-

-    secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );

-    return pvReturn;

-}

-/*-----------------------------------------------------------*/

-

-void vPortFree( void * pv )

-{

-    uint8_t * puc = ( uint8_t * ) pv;

-    BlockLink_t * pxLink;

-

-    if( pv != NULL )

-    {

-        /* The memory being freed will have an BlockLink_t structure immediately

-         * before it. */

-        puc -= xHeapStructSize;

-

-        /* This casting is to keep the compiler from issuing warnings. */

-        pxLink = ( void * ) puc;

-

-        /* Check the block is actually allocated. */

-        secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );

-        secureportASSERT( pxLink->pxNextFreeBlock == NULL );

-

-        if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )

-        {

-            if( pxLink->pxNextFreeBlock == NULL )

-            {

-                /* The block is being returned to the heap - it is no longer

-                 * allocated. */

-                pxLink->xBlockSize &= ~xBlockAllocatedBit;

-

-                secureportDISABLE_NON_SECURE_INTERRUPTS();

-                {

-                    /* Add this block to the list of free blocks. */

-                    xFreeBytesRemaining += pxLink->xBlockSize;

-                    traceFREE( pv, pxLink->xBlockSize );

-                    prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );

-                }

-                secureportENABLE_NON_SECURE_INTERRUPTS();

-            }

-            else

-            {

-                mtCOVERAGE_TEST_MARKER();

-            }

-        }

-        else

-        {

-            mtCOVERAGE_TEST_MARKER();

-        }

-    }

-}

-/*-----------------------------------------------------------*/

-

-size_t xPortGetFreeHeapSize( void )

-{

-    return xFreeBytesRemaining;

-}

-/*-----------------------------------------------------------*/

-

-size_t xPortGetMinimumEverFreeHeapSize( void )

-{

-    return xMinimumEverFreeBytesRemaining;

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Standard includes. */
+#include <stdint.h>
+
+/* Secure context heap includes. */
+#include "secure_heap.h"
+
+/* Secure port macros. */
+#include "secure_port_macros.h"
+
+/**
+ * @brief Total heap size.
+ */
+#ifndef secureconfigTOTAL_HEAP_SIZE
+    #define secureconfigTOTAL_HEAP_SIZE    ( ( ( size_t ) ( 10 * 1024 ) ) )
+#endif
+
+/* No test marker by default. */
+#ifndef mtCOVERAGE_TEST_MARKER
+    #define mtCOVERAGE_TEST_MARKER()
+#endif
+
+/* No tracing by default. */
+#ifndef traceMALLOC
+    #define traceMALLOC( pvReturn, xWantedSize )
+#endif
+
+/* No tracing by default. */
+#ifndef traceFREE
+    #define traceFREE( pv, xBlockSize )
+#endif
+
+/* Block sizes must not get too small. */
+#define secureheapMINIMUM_BLOCK_SIZE    ( ( size_t ) ( xHeapStructSize << 1 ) )
+
+/* Assumes 8bit bytes! */
+#define secureheapBITS_PER_BYTE         ( ( size_t ) 8 )
+/*-----------------------------------------------------------*/
+
+/* Allocate the memory for the heap. */
+#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )
+
+/* The application writer has already defined the array used for the RTOS
+* heap - probably so it can be placed in a special segment or address. */
+    extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
+#else /* configAPPLICATION_ALLOCATED_HEAP */
+    static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
+#endif /* configAPPLICATION_ALLOCATED_HEAP */
+
+/**
+ * @brief The linked list structure.
+ *
+ * This is used to link free blocks in order of their memory address.
+ */
+typedef struct A_BLOCK_LINK
+{
+    struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */
+    size_t xBlockSize;                     /**< The size of the free block. */
+} BlockLink_t;
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Called automatically to setup the required heap structures the first
+ * time pvPortMalloc() is called.
+ */
+static void prvHeapInit( void );
+
+/**
+ * @brief Inserts a block of memory that is being freed into the correct
+ * position in the list of free memory blocks.
+ *
+ * The block being freed will be merged with the block in front it and/or the
+ * block behind it if the memory blocks are adjacent to each other.
+ *
+ * @param[in] pxBlockToInsert The block being freed.
+ */
+static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert );
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief The size of the structure placed at the beginning of each allocated
+ * memory block must by correctly byte aligned.
+ */
+static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
+
+/**
+ * @brief Create a couple of list links to mark the start and end of the list.
+ */
+static BlockLink_t xStart;
+static BlockLink_t * pxEnd = NULL;
+
+/**
+ * @brief Keeps track of the number of free bytes remaining, but says nothing
+ * about fragmentation.
+ */
+static size_t xFreeBytesRemaining = 0U;
+static size_t xMinimumEverFreeBytesRemaining = 0U;
+
+/**
+ * @brief Gets set to the top bit of an size_t type.
+ *
+ * When this bit in the xBlockSize member of an BlockLink_t structure is set
+ * then the block belongs to the application. When the bit is free the block is
+ * still part of the free heap space.
+ */
+static size_t xBlockAllocatedBit = 0;
+/*-----------------------------------------------------------*/
+
+static void prvHeapInit( void )
+{
+    BlockLink_t * pxFirstFreeBlock;
+    uint8_t * pucAlignedHeap;
+    size_t uxAddress;
+    size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE;
+
+    /* Ensure the heap starts on a correctly aligned boundary. */
+    uxAddress = ( size_t ) ucHeap;
+
+    if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 )
+    {
+        uxAddress += ( secureportBYTE_ALIGNMENT - 1 );
+        uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
+        xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;
+    }
+
+    pucAlignedHeap = ( uint8_t * ) uxAddress;
+
+    /* xStart is used to hold a pointer to the first item in the list of free
+     * blocks.  The void cast is used to prevent compiler warnings. */
+    xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
+    xStart.xBlockSize = ( size_t ) 0;
+
+    /* pxEnd is used to mark the end of the list of free blocks and is inserted
+     * at the end of the heap space. */
+    uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;
+    uxAddress -= xHeapStructSize;
+    uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
+    pxEnd = ( void * ) uxAddress;
+    pxEnd->xBlockSize = 0;
+    pxEnd->pxNextFreeBlock = NULL;
+
+    /* To start with there is a single free block that is sized to take up the
+     * entire heap space, minus the space taken by pxEnd. */
+    pxFirstFreeBlock = ( void * ) pucAlignedHeap;
+    pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;
+    pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
+
+    /* Only one block exists - and it covers the entire usable heap space. */
+    xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
+    xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
+
+    /* Work out the position of the top bit in a size_t variable. */
+    xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 );
+}
+/*-----------------------------------------------------------*/
+
+static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert )
+{
+    BlockLink_t * pxIterator;
+    uint8_t * puc;
+
+    /* Iterate through the list until a block is found that has a higher address
+     * than the block being inserted. */
+    for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
+    {
+        /* Nothing to do here, just iterate to the right position. */
+    }
+
+    /* Do the block being inserted, and the block it is being inserted after
+     * make a contiguous block of memory? */
+    puc = ( uint8_t * ) pxIterator;
+
+    if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
+    {
+        pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
+        pxBlockToInsert = pxIterator;
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+
+    /* Do the block being inserted, and the block it is being inserted before
+     * make a contiguous block of memory? */
+    puc = ( uint8_t * ) pxBlockToInsert;
+
+    if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
+    {
+        if( pxIterator->pxNextFreeBlock != pxEnd )
+        {
+            /* Form one big block from the two blocks. */
+            pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
+            pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
+        }
+        else
+        {
+            pxBlockToInsert->pxNextFreeBlock = pxEnd;
+        }
+    }
+    else
+    {
+        pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
+    }
+
+    /* If the block being inserted plugged a gab, so was merged with the block
+     * before and the block after, then it's pxNextFreeBlock pointer will have
+     * already been set, and should not be set here as that would make it point
+     * to itself. */
+    if( pxIterator != pxBlockToInsert )
+    {
+        pxIterator->pxNextFreeBlock = pxBlockToInsert;
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+}
+/*-----------------------------------------------------------*/
+
+void * pvPortMalloc( size_t xWantedSize )
+{
+    BlockLink_t * pxBlock;
+    BlockLink_t * pxPreviousBlock;
+    BlockLink_t * pxNewBlockLink;
+    void * pvReturn = NULL;
+
+    /* If this is the first call to malloc then the heap will require
+     * initialisation to setup the list of free blocks. */
+    if( pxEnd == NULL )
+    {
+        prvHeapInit();
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+
+    /* Check the requested block size is not so large that the top bit is set.
+     * The top bit of the block size member of the BlockLink_t structure is used
+     * to determine who owns the block - the application or the kernel, so it
+     * must be free. */
+    if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
+    {
+        /* The wanted size is increased so it can contain a BlockLink_t
+         * structure in addition to the requested amount of bytes. */
+        if( xWantedSize > 0 )
+        {
+            xWantedSize += xHeapStructSize;
+
+            /* Ensure that blocks are always aligned to the required number of
+             * bytes. */
+            if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 )
+            {
+                /* Byte alignment required. */
+                xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) );
+                secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 );
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+        else
+        {
+            mtCOVERAGE_TEST_MARKER();
+        }
+
+        if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
+        {
+            /* Traverse the list from the start (lowest address) block until
+             * one of adequate size is found. */
+            pxPreviousBlock = &xStart;
+            pxBlock = xStart.pxNextFreeBlock;
+
+            while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
+            {
+                pxPreviousBlock = pxBlock;
+                pxBlock = pxBlock->pxNextFreeBlock;
+            }
+
+            /* If the end marker was reached then a block of adequate size was
+             * not found. */
+            if( pxBlock != pxEnd )
+            {
+                /* Return the memory space pointed to - jumping over the
+                 * BlockLink_t structure at its start. */
+                pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
+
+                /* This block is being returned for use so must be taken out
+                 * of the list of free blocks. */
+                pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
+
+                /* If the block is larger than required it can be split into
+                 * two. */
+                if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE )
+                {
+                    /* This block is to be split into two.  Create a new
+                     * block following the number of bytes requested. The void
+                     * cast is used to prevent byte alignment warnings from the
+                     * compiler. */
+                    pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
+                    secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 );
+
+                    /* Calculate the sizes of two blocks split from the single
+                     * block. */
+                    pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
+                    pxBlock->xBlockSize = xWantedSize;
+
+                    /* Insert the new block into the list of free blocks. */
+                    prvInsertBlockIntoFreeList( pxNewBlockLink );
+                }
+                else
+                {
+                    mtCOVERAGE_TEST_MARKER();
+                }
+
+                xFreeBytesRemaining -= pxBlock->xBlockSize;
+
+                if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
+                {
+                    xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
+                }
+                else
+                {
+                    mtCOVERAGE_TEST_MARKER();
+                }
+
+                /* The block is being returned - it is allocated and owned by
+                 * the application and has no "next" block. */
+                pxBlock->xBlockSize |= xBlockAllocatedBit;
+                pxBlock->pxNextFreeBlock = NULL;
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+        else
+        {
+            mtCOVERAGE_TEST_MARKER();
+        }
+    }
+    else
+    {
+        mtCOVERAGE_TEST_MARKER();
+    }
+
+    traceMALLOC( pvReturn, xWantedSize );
+
+    #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 )
+        {
+            if( pvReturn == NULL )
+            {
+                extern void vApplicationMallocFailedHook( void );
+                vApplicationMallocFailedHook();
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+    #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */
+
+    secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );
+    return pvReturn;
+}
+/*-----------------------------------------------------------*/
+
+void vPortFree( void * pv )
+{
+    uint8_t * puc = ( uint8_t * ) pv;
+    BlockLink_t * pxLink;
+
+    if( pv != NULL )
+    {
+        /* The memory being freed will have an BlockLink_t structure immediately
+         * before it. */
+        puc -= xHeapStructSize;
+
+        /* This casting is to keep the compiler from issuing warnings. */
+        pxLink = ( void * ) puc;
+
+        /* Check the block is actually allocated. */
+        secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
+        secureportASSERT( pxLink->pxNextFreeBlock == NULL );
+
+        if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )
+        {
+            if( pxLink->pxNextFreeBlock == NULL )
+            {
+                /* The block is being returned to the heap - it is no longer
+                 * allocated. */
+                pxLink->xBlockSize &= ~xBlockAllocatedBit;
+
+                secureportDISABLE_NON_SECURE_INTERRUPTS();
+                {
+                    /* Add this block to the list of free blocks. */
+                    xFreeBytesRemaining += pxLink->xBlockSize;
+                    traceFREE( pv, pxLink->xBlockSize );
+                    prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
+                }
+                secureportENABLE_NON_SECURE_INTERRUPTS();
+            }
+            else
+            {
+                mtCOVERAGE_TEST_MARKER();
+            }
+        }
+        else
+        {
+            mtCOVERAGE_TEST_MARKER();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+size_t xPortGetFreeHeapSize( void )
+{
+    return xFreeBytesRemaining;
+}
+/*-----------------------------------------------------------*/
+
+size_t xPortGetMinimumEverFreeHeapSize( void )
+{
+    return xMinimumEverFreeBytesRemaining;
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CM85/secure/secure_heap.h b/portable/IAR/ARM_CM85/secure/secure_heap.h
index bd42ff9..c13590f 100644
--- a/portable/IAR/ARM_CM85/secure/secure_heap.h
+++ b/portable/IAR/ARM_CM85/secure/secure_heap.h
@@ -1,66 +1,66 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_HEAP_H__

-#define __SECURE_HEAP_H__

-

-/* Standard includes. */

-#include <stdlib.h>

-

-/**

- * @brief Allocates memory from heap.

- *

- * @param[in] xWantedSize The size of the memory to be allocated.

- *

- * @return Pointer to the memory region if the allocation is successful, NULL

- * otherwise.

- */

-void * pvPortMalloc( size_t xWantedSize );

-

-/**

- * @brief Frees the previously allocated memory.

- *

- * @param[in] pv Pointer to the memory to be freed.

- */

-void vPortFree( void * pv );

-

-/**

- * @brief Get the free heap size.

- *

- * @return Free heap size.

- */

-size_t xPortGetFreeHeapSize( void );

-

-/**

- * @brief Get the minimum ever free heap size.

- *

- * @return Minimum ever free heap size.

- */

-size_t xPortGetMinimumEverFreeHeapSize( void );

-

-#endif /* __SECURE_HEAP_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_HEAP_H__
+#define __SECURE_HEAP_H__
+
+/* Standard includes. */
+#include <stdlib.h>
+
+/**
+ * @brief Allocates memory from heap.
+ *
+ * @param[in] xWantedSize The size of the memory to be allocated.
+ *
+ * @return Pointer to the memory region if the allocation is successful, NULL
+ * otherwise.
+ */
+void * pvPortMalloc( size_t xWantedSize );
+
+/**
+ * @brief Frees the previously allocated memory.
+ *
+ * @param[in] pv Pointer to the memory to be freed.
+ */
+void vPortFree( void * pv );
+
+/**
+ * @brief Get the free heap size.
+ *
+ * @return Free heap size.
+ */
+size_t xPortGetFreeHeapSize( void );
+
+/**
+ * @brief Get the minimum ever free heap size.
+ *
+ * @return Minimum ever free heap size.
+ */
+size_t xPortGetMinimumEverFreeHeapSize( void );
+
+#endif /* __SECURE_HEAP_H__ */
diff --git a/portable/IAR/ARM_CM85/secure/secure_init.c b/portable/IAR/ARM_CM85/secure/secure_init.c
index d91695b..dc19ebc 100644
--- a/portable/IAR/ARM_CM85/secure/secure_init.c
+++ b/portable/IAR/ARM_CM85/secure/secure_init.c
@@ -1,106 +1,106 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Standard includes. */

-#include <stdint.h>

-

-/* Secure init includes. */

-#include "secure_init.h"

-

-/* Secure port macros. */

-#include "secure_port_macros.h"

-

-/**

- * @brief Constants required to manipulate the SCB.

- */

-#define secureinitSCB_AIRCR                 ( ( volatile uint32_t * ) 0xe000ed0c )  /* Application Interrupt and Reset Control Register. */

-#define secureinitSCB_AIRCR_VECTKEY_POS     ( 16UL )

-#define secureinitSCB_AIRCR_VECTKEY_MASK    ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS )

-#define secureinitSCB_AIRCR_PRIS_POS        ( 14UL )

-#define secureinitSCB_AIRCR_PRIS_MASK       ( 1UL << secureinitSCB_AIRCR_PRIS_POS )

-

-/**

- * @brief Constants required to manipulate the FPU.

- */

-#define secureinitFPCCR                     ( ( volatile uint32_t * ) 0xe000ef34 )  /* Floating Point Context Control Register. */

-#define secureinitFPCCR_LSPENS_POS          ( 29UL )

-#define secureinitFPCCR_LSPENS_MASK         ( 1UL << secureinitFPCCR_LSPENS_POS )

-#define secureinitFPCCR_TS_POS              ( 26UL )

-#define secureinitFPCCR_TS_MASK             ( 1UL << secureinitFPCCR_TS_POS )

-

-#define secureinitNSACR                     ( ( volatile uint32_t * ) 0xe000ed8c )  /* Non-secure Access Control Register. */

-#define secureinitNSACR_CP10_POS            ( 10UL )

-#define secureinitNSACR_CP10_MASK           ( 1UL << secureinitNSACR_CP10_POS )

-#define secureinitNSACR_CP11_POS            ( 11UL )

-#define secureinitNSACR_CP11_MASK           ( 1UL << secureinitNSACR_CP11_POS )

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void )

-{

-    uint32_t ulIPSR;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ulIPSR != 0 )

-    {

-        *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) |

-                                   ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) |

-                                   ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK );

-    }

-}

-/*-----------------------------------------------------------*/

-

-secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void )

-{

-    uint32_t ulIPSR;

-

-    /* Read the Interrupt Program Status Register (IPSR) value. */

-    secureportREAD_IPSR( ulIPSR );

-

-    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero

-     * when the processor is running in the Thread Mode. */

-    if( ulIPSR != 0 )

-    {

-        /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is

-         * permitted. CP11 should be programmed to the same value as CP10. */

-        *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK );

-

-        /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures

-         * that we can enable/disable lazy stacking in port.c file. */

-        *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK );

-

-        /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP

-         * registers (S16-S31) are also pushed to stack on exception entry and

-         * restored on exception return. */

-        *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK );

-    }

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Standard includes. */
+#include <stdint.h>
+
+/* Secure init includes. */
+#include "secure_init.h"
+
+/* Secure port macros. */
+#include "secure_port_macros.h"
+
+/**
+ * @brief Constants required to manipulate the SCB.
+ */
+#define secureinitSCB_AIRCR                 ( ( volatile uint32_t * ) 0xe000ed0c )  /* Application Interrupt and Reset Control Register. */
+#define secureinitSCB_AIRCR_VECTKEY_POS     ( 16UL )
+#define secureinitSCB_AIRCR_VECTKEY_MASK    ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS )
+#define secureinitSCB_AIRCR_PRIS_POS        ( 14UL )
+#define secureinitSCB_AIRCR_PRIS_MASK       ( 1UL << secureinitSCB_AIRCR_PRIS_POS )
+
+/**
+ * @brief Constants required to manipulate the FPU.
+ */
+#define secureinitFPCCR                     ( ( volatile uint32_t * ) 0xe000ef34 )  /* Floating Point Context Control Register. */
+#define secureinitFPCCR_LSPENS_POS          ( 29UL )
+#define secureinitFPCCR_LSPENS_MASK         ( 1UL << secureinitFPCCR_LSPENS_POS )
+#define secureinitFPCCR_TS_POS              ( 26UL )
+#define secureinitFPCCR_TS_MASK             ( 1UL << secureinitFPCCR_TS_POS )
+
+#define secureinitNSACR                     ( ( volatile uint32_t * ) 0xe000ed8c )  /* Non-secure Access Control Register. */
+#define secureinitNSACR_CP10_POS            ( 10UL )
+#define secureinitNSACR_CP10_MASK           ( 1UL << secureinitNSACR_CP10_POS )
+#define secureinitNSACR_CP11_POS            ( 11UL )
+#define secureinitNSACR_CP11_MASK           ( 1UL << secureinitNSACR_CP11_POS )
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void )
+{
+    uint32_t ulIPSR;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ulIPSR != 0 )
+    {
+        *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) |
+                                   ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) |
+                                   ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK );
+    }
+}
+/*-----------------------------------------------------------*/
+
+secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void )
+{
+    uint32_t ulIPSR;
+
+    /* Read the Interrupt Program Status Register (IPSR) value. */
+    secureportREAD_IPSR( ulIPSR );
+
+    /* Do nothing if the processor is running in the Thread Mode. IPSR is zero
+     * when the processor is running in the Thread Mode. */
+    if( ulIPSR != 0 )
+    {
+        /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is
+         * permitted. CP11 should be programmed to the same value as CP10. */
+        *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK );
+
+        /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures
+         * that we can enable/disable lazy stacking in port.c file. */
+        *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK );
+
+        /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP
+         * registers (S16-S31) are also pushed to stack on exception entry and
+         * restored on exception return. */
+        *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK );
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CM85/secure/secure_init.h b/portable/IAR/ARM_CM85/secure/secure_init.h
index e18ba44..21daeda 100644
--- a/portable/IAR/ARM_CM85/secure/secure_init.h
+++ b/portable/IAR/ARM_CM85/secure/secure_init.h
@@ -1,54 +1,54 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_INIT_H__

-#define __SECURE_INIT_H__

-

-/**

- * @brief De-prioritizes the non-secure exceptions.

- *

- * This is needed to ensure that the non-secure PendSV runs at the lowest

- * priority. Context switch is done in the non-secure PendSV handler.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- */

-void SecureInit_DePrioritizeNSExceptions( void );

-

-/**

- * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access.

- *

- * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point

- * Registers are not leaked to the non-secure side.

- *

- * @note This function must be called in the handler mode. It is no-op if called

- * in the thread mode.

- */

-void SecureInit_EnableNSFPUAccess( void );

-

-#endif /* __SECURE_INIT_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_INIT_H__
+#define __SECURE_INIT_H__
+
+/**
+ * @brief De-prioritizes the non-secure exceptions.
+ *
+ * This is needed to ensure that the non-secure PendSV runs at the lowest
+ * priority. Context switch is done in the non-secure PendSV handler.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ */
+void SecureInit_DePrioritizeNSExceptions( void );
+
+/**
+ * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access.
+ *
+ * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point
+ * Registers are not leaked to the non-secure side.
+ *
+ * @note This function must be called in the handler mode. It is no-op if called
+ * in the thread mode.
+ */
+void SecureInit_EnableNSFPUAccess( void );
+
+#endif /* __SECURE_INIT_H__ */
diff --git a/portable/IAR/ARM_CM85/secure/secure_port_macros.h b/portable/IAR/ARM_CM85/secure/secure_port_macros.h
index 5499054..304913b 100644
--- a/portable/IAR/ARM_CM85/secure/secure_port_macros.h
+++ b/portable/IAR/ARM_CM85/secure/secure_port_macros.h
@@ -1,140 +1,140 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __SECURE_PORT_MACROS_H__

-#define __SECURE_PORT_MACROS_H__

-

-/**

- * @brief Byte alignment requirements.

- */

-#define secureportBYTE_ALIGNMENT         8

-#define secureportBYTE_ALIGNMENT_MASK    ( 0x0007 )

-

-/**

- * @brief Macro to declare a function as non-secure callable.

- */

-#if defined( __IAR_SYSTEMS_ICC__ )

-    #define secureportNON_SECURE_CALLABLE    __cmse_nonsecure_entry __root

-#else

-    #define secureportNON_SECURE_CALLABLE    __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) )

-#endif

-

-/**

- * @brief Set the secure PRIMASK value.

- */

-#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \

-    __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" )

-

-/**

- * @brief Set the non-secure PRIMASK value.

- */

-#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \

-    __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" )

-

-/**

- * @brief Read the PSP value in the given variable.

- */

-#define secureportREAD_PSP( pucOutCurrentStackPointer ) \

-    __asm volatile ( "mrs %0, psp"  : "=r" ( pucOutCurrentStackPointer ) )

-

-/**

- * @brief Set the PSP to the given value.

- */

-#define secureportSET_PSP( pucCurrentStackPointer ) \

-    __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) )

-

-/**

- * @brief Read the PSPLIM value in the given variable.

- */

-#define secureportREAD_PSPLIM( pucOutStackLimit ) \

-    __asm volatile ( "mrs %0, psplim"  : "=r" ( pucOutStackLimit ) )

-

-/**

- * @brief Set the PSPLIM to the given value.

- */

-#define secureportSET_PSPLIM( pucStackLimit ) \

-    __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) )

-

-/**

- * @brief Set the NonSecure MSP to the given value.

- */

-#define secureportSET_MSP_NS( pucMainStackPointer ) \

-    __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) )

-

-/**

- * @brief Set the CONTROL register to the given value.

- */

-#define secureportSET_CONTROL( ulControl ) \

-    __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" )

-

-/**

- * @brief Read the Interrupt Program Status Register (IPSR) value in the given

- * variable.

- */

-#define secureportREAD_IPSR( ulIPSR ) \

-    __asm volatile ( "mrs %0, ipsr"  : "=r" ( ulIPSR ) )

-

-/**

- * @brief PRIMASK value to enable interrupts.

- */

-#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL     0

-

-/**

- * @brief PRIMASK value to disable interrupts.

- */

-#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL    1

-

-/**

- * @brief Disable secure interrupts.

- */

-#define secureportDISABLE_SECURE_INTERRUPTS()        secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )

-

-/**

- * @brief Disable non-secure interrupts.

- *

- * This effectively disables context switches.

- */

-#define secureportDISABLE_NON_SECURE_INTERRUPTS()    secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )

-

-/**

- * @brief Enable non-secure interrupts.

- */

-#define secureportENABLE_NON_SECURE_INTERRUPTS()     secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL )

-

-/**

- * @brief Assert definition.

- */

-#define secureportASSERT( x )                      \

-    if( ( x ) == 0 )                               \

-    {                                              \

-        secureportDISABLE_SECURE_INTERRUPTS();     \

-        secureportDISABLE_NON_SECURE_INTERRUPTS(); \

-        for( ; ; ) {; }                            \

-    }

-

-#endif /* __SECURE_PORT_MACROS_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __SECURE_PORT_MACROS_H__
+#define __SECURE_PORT_MACROS_H__
+
+/**
+ * @brief Byte alignment requirements.
+ */
+#define secureportBYTE_ALIGNMENT         8
+#define secureportBYTE_ALIGNMENT_MASK    ( 0x0007 )
+
+/**
+ * @brief Macro to declare a function as non-secure callable.
+ */
+#if defined( __IAR_SYSTEMS_ICC__ )
+    #define secureportNON_SECURE_CALLABLE    __cmse_nonsecure_entry __root
+#else
+    #define secureportNON_SECURE_CALLABLE    __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) )
+#endif
+
+/**
+ * @brief Set the secure PRIMASK value.
+ */
+#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \
+    __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" )
+
+/**
+ * @brief Set the non-secure PRIMASK value.
+ */
+#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \
+    __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" )
+
+/**
+ * @brief Read the PSP value in the given variable.
+ */
+#define secureportREAD_PSP( pucOutCurrentStackPointer ) \
+    __asm volatile ( "mrs %0, psp"  : "=r" ( pucOutCurrentStackPointer ) )
+
+/**
+ * @brief Set the PSP to the given value.
+ */
+#define secureportSET_PSP( pucCurrentStackPointer ) \
+    __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) )
+
+/**
+ * @brief Read the PSPLIM value in the given variable.
+ */
+#define secureportREAD_PSPLIM( pucOutStackLimit ) \
+    __asm volatile ( "mrs %0, psplim"  : "=r" ( pucOutStackLimit ) )
+
+/**
+ * @brief Set the PSPLIM to the given value.
+ */
+#define secureportSET_PSPLIM( pucStackLimit ) \
+    __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) )
+
+/**
+ * @brief Set the NonSecure MSP to the given value.
+ */
+#define secureportSET_MSP_NS( pucMainStackPointer ) \
+    __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) )
+
+/**
+ * @brief Set the CONTROL register to the given value.
+ */
+#define secureportSET_CONTROL( ulControl ) \
+    __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" )
+
+/**
+ * @brief Read the Interrupt Program Status Register (IPSR) value in the given
+ * variable.
+ */
+#define secureportREAD_IPSR( ulIPSR ) \
+    __asm volatile ( "mrs %0, ipsr"  : "=r" ( ulIPSR ) )
+
+/**
+ * @brief PRIMASK value to enable interrupts.
+ */
+#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL     0
+
+/**
+ * @brief PRIMASK value to disable interrupts.
+ */
+#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL    1
+
+/**
+ * @brief Disable secure interrupts.
+ */
+#define secureportDISABLE_SECURE_INTERRUPTS()        secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
+
+/**
+ * @brief Disable non-secure interrupts.
+ *
+ * This effectively disables context switches.
+ */
+#define secureportDISABLE_NON_SECURE_INTERRUPTS()    secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
+
+/**
+ * @brief Enable non-secure interrupts.
+ */
+#define secureportENABLE_NON_SECURE_INTERRUPTS()     secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL )
+
+/**
+ * @brief Assert definition.
+ */
+#define secureportASSERT( x )                      \
+    if( ( x ) == 0 )                               \
+    {                                              \
+        secureportDISABLE_SECURE_INTERRUPTS();     \
+        secureportDISABLE_NON_SECURE_INTERRUPTS(); \
+        for( ; ; ) {; }                            \
+    }
+
+#endif /* __SECURE_PORT_MACROS_H__ */
diff --git a/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h b/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h
index b37f6d1..ecd86b9 100644
--- a/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h
+++ b/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h
@@ -1,114 +1,114 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef __PORT_ASM_H__

-#define __PORT_ASM_H__

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-

-/* MPU wrappers includes. */

-#include "mpu_wrappers.h"

-

-/**

- * @brief Restore the context of the first task so that the first task starts

- * executing.

- */

-void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Checks whether or not the processor is privileged.

- *

- * @return 1 if the processor is already privileged, 0 otherwise.

- */

-BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Raises the privilege level by clearing the bit 0 of the CONTROL

- * register.

- *

- * @note This is a privileged function and should only be called from the kenrel

- * code.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Lowers the privilege level by setting the bit 0 of the CONTROL

- * register.

- *

- * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.

- *  Bit[0] = 0 --> The processor is running privileged

- *  Bit[0] = 1 --> The processor is running unprivileged.

- */

-void vResetPrivilege( void ) __attribute__( ( naked ) );

-

-/**

- * @brief Starts the first task.

- */

-void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Disables interrupts.

- */

-uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Enables interrupts.

- */

-void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief PendSV Exception handler.

- */

-void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief SVC Handler.

- */

-void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-/**

- * @brief Allocate a Secure context for the calling task.

- *

- * @param[in] ulSecureStackSize The size of the stack to be allocated on the

- * secure side for the calling task.

- */

-void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );

-

-/**

- * @brief Free the task's secure context.

- *

- * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.

- */

-void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;

-

-#endif /* __PORT_ASM_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef __PORT_ASM_H__
+#define __PORT_ASM_H__
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+
+/* MPU wrappers includes. */
+#include "mpu_wrappers.h"
+
+/**
+ * @brief Restore the context of the first task so that the first task starts
+ * executing.
+ */
+void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Checks whether or not the processor is privileged.
+ *
+ * @return 1 if the processor is already privileged, 0 otherwise.
+ */
+BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Raises the privilege level by clearing the bit 0 of the CONTROL
+ * register.
+ *
+ * @note This is a privileged function and should only be called from the kenrel
+ * code.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Lowers the privilege level by setting the bit 0 of the CONTROL
+ * register.
+ *
+ * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
+ *  Bit[0] = 0 --> The processor is running privileged
+ *  Bit[0] = 1 --> The processor is running unprivileged.
+ */
+void vResetPrivilege( void ) __attribute__( ( naked ) );
+
+/**
+ * @brief Starts the first task.
+ */
+void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Disables interrupts.
+ */
+uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Enables interrupts.
+ */
+void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief PendSV Exception handler.
+ */
+void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief SVC Handler.
+ */
+void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+/**
+ * @brief Allocate a Secure context for the calling task.
+ *
+ * @param[in] ulSecureStackSize The size of the stack to be allocated on the
+ * secure side for the calling task.
+ */
+void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );
+
+/**
+ * @brief Free the task's secure context.
+ *
+ * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
+ */
+void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
+
+#endif /* __PORT_ASM_H__ */
diff --git a/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s b/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s
index 9e9970c..581b84d 100644
--- a/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s
+++ b/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s
@@ -1,262 +1,262 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-/* Including FreeRTOSConfig.h here will cause build errors if the header file

-contains code not understood by the assembler - for example the 'extern' keyword.

-To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so

-the code is included in C files but excluded by the preprocessor in assembly

-files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */

-#include "FreeRTOSConfig.h"

-

-	EXTERN pxCurrentTCB

-	EXTERN vTaskSwitchContext

-	EXTERN vPortSVCHandler_C

-

-	PUBLIC xIsPrivileged

-	PUBLIC vResetPrivilege

-	PUBLIC vRestoreContextOfFirstTask

-	PUBLIC vRaisePrivilege

-	PUBLIC vStartFirstTask

-	PUBLIC ulSetInterruptMask

-	PUBLIC vClearInterruptMask

-	PUBLIC PendSV_Handler

-	PUBLIC SVC_Handler

-/*-----------------------------------------------------------*/

-

-/*---------------- Unprivileged Functions -------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION .text:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-xIsPrivileged:

-	mrs r0, control							/* r0 = CONTROL. */

-	tst r0, #1								/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */

-	ite ne

-	movne r0, #0							/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */

-	moveq r0, #1							/* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-vResetPrivilege:

-	mrs r0, control							/* r0 = CONTROL. */

-	orr r0, r0, #1							/* r0 = r0 | 1. */

-	msr control, r0							/* CONTROL = r0. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-/*----------------- Privileged Functions --------------------*/

-

-/*-----------------------------------------------------------*/

-

-	SECTION privileged_functions:CODE:NOROOT(2)

-	THUMB

-/*-----------------------------------------------------------*/

-

-vRestoreContextOfFirstTask:

-	ldr  r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr  r1, [r2]							/* Read pxCurrentTCB. */

-	ldr  r0, [r1]							/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */

-

-#if ( configENABLE_MPU == 1 )

-	dmb										/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	bic r4, r4, #1							/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */

-	str r4, [r2]							/* Disable MPU. */

-

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */

-	ldr r3, [r1]							/* r3 = *r1 i.e. r3 = MAIR0. */

-	ldr r2, =0xe000edc0						/* r2 = 0xe000edc0 [Location of MAIR0]. */

-	str r3, [r2]							/* Program MAIR0. */

-	ldr r2, =0xe000ed98						/* r2 = 0xe000ed98 [Location of RNR]. */

-	movs r3, #4								/* r3 = 4. */

-	str r3, [r2]							/* Program RNR = 4. */

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */

-	ldr r2, =0xe000ed9c						/* r2 = 0xe000ed9c [Location of RBAR]. */

-	ldmia r1!, {r4-r11}						/* Read 4 sets of RBAR/RLAR registers from TCB. */

-	stmia r2!, {r4-r11}						/* Write 4 set of RBAR/RLAR registers using alias registers. */

-

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	orr r4, r4, #1							/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */

-	str r4, [r2]							/* Enable MPU. */

-	dsb										/* Force memory writes before continuing. */

-#endif /* configENABLE_MPU */

-

-#if ( configENABLE_MPU == 1 )

-	ldm  r0!, {r1-r3}						/* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */

-	msr  psplim, r1							/* Set this task's PSPLIM value. */

-	msr  control, r2						/* Set this task's CONTROL value. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	mov  r0, #0

-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */

-	bx   r3									/* Finally, branch to EXC_RETURN. */

-#else /* configENABLE_MPU */

-	ldm  r0!, {r1-r2}						/* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */

-	msr  psplim, r1							/* Set this task's PSPLIM value. */

-	movs r1, #2								/* r1 = 2. */

-	msr  CONTROL, r1						/* Switch to use PSP in the thread mode. */

-	adds r0, #32							/* Discard everything up to r0. */

-	msr  psp, r0							/* This is now the new top of stack to use in the task. */

-	isb

-	mov  r0, #0

-	msr  basepri, r0						/* Ensure that interrupts are enabled when the first task starts. */

-	bx   r2									/* Finally, branch to EXC_RETURN. */

-#endif /* configENABLE_MPU */

-/*-----------------------------------------------------------*/

-

-vRaisePrivilege:

-	mrs  r0, control						/* Read the CONTROL register. */

-	bic r0, r0, #1							/* Clear the bit 0. */

-	msr  control, r0						/* Write back the new CONTROL value. */

-	bx lr									/* Return to the caller. */

-/*-----------------------------------------------------------*/

-

-vStartFirstTask:

-	ldr r0, =0xe000ed08						/* Use the NVIC offset register to locate the stack. */

-	ldr r0, [r0]							/* Read the VTOR register which gives the address of vector table. */

-	ldr r0, [r0]							/* The first entry in vector table is stack pointer. */

-	msr msp, r0								/* Set the MSP back to the start of the stack. */

-	cpsie i									/* Globally enable interrupts. */

-	cpsie f

-	dsb

-	isb

-	svc 2									/* System call to start the first task. portSVC_START_SCHEDULER = 2. */

-/*-----------------------------------------------------------*/

-

-ulSetInterruptMask:

-	mrs r0, basepri							/* r0 = basepri. Return original basepri value. */

-	mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-	msr basepri, r1							/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */

-	dsb

-	isb

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-vClearInterruptMask:

-	msr basepri, r0							/* basepri = ulMask. */

-	dsb

-	isb

-	bx lr									/* Return. */

-/*-----------------------------------------------------------*/

-

-PendSV_Handler:

-	mrs r0, psp								/* Read PSP in r0. */

-#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )

-	tst lr, #0x10							/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */

-	it eq

-	vstmdbeq r0!, {s16-s31}					/* Store the additional FP context registers which are not saved automatically. */

-#endif /* configENABLE_FPU || configENABLE_MVE */

-#if ( configENABLE_MPU == 1 )

-	mrs r1, psplim							/* r1 = PSPLIM. */

-	mrs r2, control							/* r2 = CONTROL. */

-	mov r3, lr								/* r3 = LR/EXC_RETURN. */

-	stmdb r0!, {r1-r11}						/* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */

-#else /* configENABLE_MPU */

-	mrs r2, psplim							/* r2 = PSPLIM. */

-	mov r3, lr								/* r3 = LR/EXC_RETURN. */

-	stmdb r0!, {r2-r11}						/* Store on the stack - PSPLIM, LR and registers that are not automatically. */

-#endif /* configENABLE_MPU */

-

-	ldr r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r2]							/* Read pxCurrentTCB. */

-	str r0, [r1]							/* Save the new top of stack in TCB. */

-

-	mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY

-	msr basepri, r0							/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */

-	dsb

-	isb

-	bl vTaskSwitchContext

-	mov r0, #0								/* r0 = 0. */

-	msr basepri, r0							/* Enable interrupts. */

-

-	ldr r2, =pxCurrentTCB					/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */

-	ldr r1, [r2]							/* Read pxCurrentTCB. */

-	ldr r0, [r1]							/* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */

-

-#if ( configENABLE_MPU == 1 )

-	dmb										/* Complete outstanding transfers before disabling MPU. */

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	bic r4, r4, #1							/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */

-	str r4, [r2]							/* Disable MPU. */

-

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */

-	ldr r3, [r1]							/* r3 = *r1 i.e. r3 = MAIR0. */

-	ldr r2, =0xe000edc0						/* r2 = 0xe000edc0 [Location of MAIR0]. */

-	str r3, [r2]							/* Program MAIR0. */

-	ldr r2, =0xe000ed98						/* r2 = 0xe000ed98 [Location of RNR]. */

-	movs r3, #4								/* r3 = 4. */

-	str r3, [r2]							/* Program RNR = 4. */

-	adds r1, #4								/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */

-	ldr r2, =0xe000ed9c						/* r2 = 0xe000ed9c [Location of RBAR]. */

-	ldmia r1!, {r4-r11}						/* Read 4 sets of RBAR/RLAR registers from TCB. */

-	stmia r2!, {r4-r11}						/* Write 4 set of RBAR/RLAR registers using alias registers. */

-

-	ldr r2, =0xe000ed94						/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */

-	ldr r4, [r2]							/* Read the value of MPU_CTRL. */

-	orr r4, r4, #1							/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */

-	str r4, [r2]							/* Enable MPU. */

-	dsb										/* Force memory writes before continuing. */

-#endif /* configENABLE_MPU */

-

-#if ( configENABLE_MPU == 1 )

-	ldmia r0!, {r1-r11}						/* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */

-#else /* configENABLE_MPU */

-	ldmia r0!, {r2-r11}						/* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */

-#endif /* configENABLE_MPU */

-

-#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )

-	tst r3, #0x10							/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */

-	it eq

-	vldmiaeq r0!, {s16-s31}					/* Restore the additional FP context registers which are not restored automatically. */

-#endif /* configENABLE_FPU || configENABLE_MVE */

-

- #if ( configENABLE_MPU == 1 )

-	msr psplim, r1							/* Restore the PSPLIM register value for the task. */

-	msr control, r2							/* Restore the CONTROL register value for the task. */

-#else /* configENABLE_MPU */

-	msr psplim, r2							/* Restore the PSPLIM register value for the task. */

-#endif /* configENABLE_MPU */

-	msr psp, r0								/* Remember the new top of stack for the task. */

-	bx r3

-/*-----------------------------------------------------------*/

-

-SVC_Handler:

-	tst lr, #4

-	ite eq

-	mrseq r0, msp

-	mrsne r0, psp

-	b vPortSVCHandler_C

-/*-----------------------------------------------------------*/

-

-	END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+/* Including FreeRTOSConfig.h here will cause build errors if the header file
+contains code not understood by the assembler - for example the 'extern' keyword.
+To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
+the code is included in C files but excluded by the preprocessor in assembly
+files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
+#include "FreeRTOSConfig.h"
+
+    EXTERN pxCurrentTCB
+    EXTERN vTaskSwitchContext
+    EXTERN vPortSVCHandler_C
+
+    PUBLIC xIsPrivileged
+    PUBLIC vResetPrivilege
+    PUBLIC vRestoreContextOfFirstTask
+    PUBLIC vRaisePrivilege
+    PUBLIC vStartFirstTask
+    PUBLIC ulSetInterruptMask
+    PUBLIC vClearInterruptMask
+    PUBLIC PendSV_Handler
+    PUBLIC SVC_Handler
+/*-----------------------------------------------------------*/
+
+/*---------------- Unprivileged Functions -------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION .text:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+xIsPrivileged:
+    mrs r0, control                         /* r0 = CONTROL. */
+    tst r0, #1                              /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
+    ite ne
+    movne r0, #0                            /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
+    moveq r0, #1                            /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+vResetPrivilege:
+    mrs r0, control                         /* r0 = CONTROL. */
+    orr r0, r0, #1                          /* r0 = r0 | 1. */
+    msr control, r0                         /* CONTROL = r0. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+/*----------------- Privileged Functions --------------------*/
+
+/*-----------------------------------------------------------*/
+
+    SECTION privileged_functions:CODE:NOROOT(2)
+    THUMB
+/*-----------------------------------------------------------*/
+
+vRestoreContextOfFirstTask:
+    ldr  r2, =pxCurrentTCB                  /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr  r1, [r2]                           /* Read pxCurrentTCB. */
+    ldr  r0, [r1]                           /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
+
+#if ( configENABLE_MPU == 1 )
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    bic r4, r4, #1                          /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+    str r4, [r2]                            /* Disable MPU. */
+
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+    ldr r3, [r1]                            /* r3 = *r1 i.e. r3 = MAIR0. */
+    ldr r2, =0xe000edc0                     /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str r3, [r2]                            /* Program MAIR0. */
+    ldr r2, =0xe000ed98                     /* r2 = 0xe000ed98 [Location of RNR]. */
+    movs r3, #4                             /* r3 = 4. */
+    str r3, [r2]                            /* Program RNR = 4. */
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+    ldr r2, =0xe000ed9c                     /* r2 = 0xe000ed9c [Location of RBAR]. */
+    ldmia r1!, {r4-r11}                     /* Read 4 sets of RBAR/RLAR registers from TCB. */
+    stmia r2!, {r4-r11}                     /* Write 4 set of RBAR/RLAR registers using alias registers. */
+
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    orr r4, r4, #1                          /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+    str r4, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
+#endif /* configENABLE_MPU */
+
+#if ( configENABLE_MPU == 1 )
+    ldm  r0!, {r1-r3}                       /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */
+    msr  psplim, r1                         /* Set this task's PSPLIM value. */
+    msr  control, r2                        /* Set this task's CONTROL value. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r3                                 /* Finally, branch to EXC_RETURN. */
+#else /* configENABLE_MPU */
+    ldm  r0!, {r1-r2}                       /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
+    msr  psplim, r1                         /* Set this task's PSPLIM value. */
+    movs r1, #2                             /* r1 = 2. */
+    msr  CONTROL, r1                        /* Switch to use PSP in the thread mode. */
+    adds r0, #32                            /* Discard everything up to r0. */
+    msr  psp, r0                            /* This is now the new top of stack to use in the task. */
+    isb
+    mov  r0, #0
+    msr  basepri, r0                        /* Ensure that interrupts are enabled when the first task starts. */
+    bx   r2                                 /* Finally, branch to EXC_RETURN. */
+#endif /* configENABLE_MPU */
+/*-----------------------------------------------------------*/
+
+vRaisePrivilege:
+    mrs  r0, control                        /* Read the CONTROL register. */
+    bic r0, r0, #1                          /* Clear the bit 0. */
+    msr  control, r0                        /* Write back the new CONTROL value. */
+    bx lr                                   /* Return to the caller. */
+/*-----------------------------------------------------------*/
+
+vStartFirstTask:
+    ldr r0, =0xe000ed08                     /* Use the NVIC offset register to locate the stack. */
+    ldr r0, [r0]                            /* Read the VTOR register which gives the address of vector table. */
+    ldr r0, [r0]                            /* The first entry in vector table is stack pointer. */
+    msr msp, r0                             /* Set the MSP back to the start of the stack. */
+    cpsie i                                 /* Globally enable interrupts. */
+    cpsie f
+    dsb
+    isb
+    svc 2                                   /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
+/*-----------------------------------------------------------*/
+
+ulSetInterruptMask:
+    mrs r0, basepri                         /* r0 = basepri. Return original basepri value. */
+    mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r1                         /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+vClearInterruptMask:
+    msr basepri, r0                         /* basepri = ulMask. */
+    dsb
+    isb
+    bx lr                                   /* Return. */
+/*-----------------------------------------------------------*/
+
+PendSV_Handler:
+    mrs r0, psp                             /* Read PSP in r0. */
+#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+    tst lr, #0x10                           /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+    it eq
+    vstmdbeq r0!, {s16-s31}                 /* Store the additional FP context registers which are not saved automatically. */
+#endif /* configENABLE_FPU || configENABLE_MVE */
+#if ( configENABLE_MPU == 1 )
+    mrs r1, psplim                          /* r1 = PSPLIM. */
+    mrs r2, control                         /* r2 = CONTROL. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmdb r0!, {r1-r11}                     /* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */
+#else /* configENABLE_MPU */
+    mrs r2, psplim                          /* r2 = PSPLIM. */
+    mov r3, lr                              /* r3 = LR/EXC_RETURN. */
+    stmdb r0!, {r2-r11}                     /* Store on the stack - PSPLIM, LR and registers that are not automatically. */
+#endif /* configENABLE_MPU */
+
+    ldr r2, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r2]                            /* Read pxCurrentTCB. */
+    str r0, [r1]                            /* Save the new top of stack in TCB. */
+
+    mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
+    msr basepri, r0                         /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
+    dsb
+    isb
+    bl vTaskSwitchContext
+    mov r0, #0                              /* r0 = 0. */
+    msr basepri, r0                         /* Enable interrupts. */
+
+    ldr r2, =pxCurrentTCB                   /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
+    ldr r1, [r2]                            /* Read pxCurrentTCB. */
+    ldr r0, [r1]                            /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
+
+#if ( configENABLE_MPU == 1 )
+    dmb                                     /* Complete outstanding transfers before disabling MPU. */
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    bic r4, r4, #1                          /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
+    str r4, [r2]                            /* Disable MPU. */
+
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
+    ldr r3, [r1]                            /* r3 = *r1 i.e. r3 = MAIR0. */
+    ldr r2, =0xe000edc0                     /* r2 = 0xe000edc0 [Location of MAIR0]. */
+    str r3, [r2]                            /* Program MAIR0. */
+    ldr r2, =0xe000ed98                     /* r2 = 0xe000ed98 [Location of RNR]. */
+    movs r3, #4                             /* r3 = 4. */
+    str r3, [r2]                            /* Program RNR = 4. */
+    adds r1, #4                             /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
+    ldr r2, =0xe000ed9c                     /* r2 = 0xe000ed9c [Location of RBAR]. */
+    ldmia r1!, {r4-r11}                     /* Read 4 sets of RBAR/RLAR registers from TCB. */
+    stmia r2!, {r4-r11}                     /* Write 4 set of RBAR/RLAR registers using alias registers. */
+
+    ldr r2, =0xe000ed94                     /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
+    ldr r4, [r2]                            /* Read the value of MPU_CTRL. */
+    orr r4, r4, #1                          /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
+    str r4, [r2]                            /* Enable MPU. */
+    dsb                                     /* Force memory writes before continuing. */
+#endif /* configENABLE_MPU */
+
+#if ( configENABLE_MPU == 1 )
+    ldmia r0!, {r1-r11}                     /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */
+#else /* configENABLE_MPU */
+    ldmia r0!, {r2-r11}                     /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
+#endif /* configENABLE_MPU */
+
+#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
+    tst r3, #0x10                           /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
+    it eq
+    vldmiaeq r0!, {s16-s31}                 /* Restore the additional FP context registers which are not restored automatically. */
+#endif /* configENABLE_FPU || configENABLE_MVE */
+
+ #if ( configENABLE_MPU == 1 )
+    msr psplim, r1                          /* Restore the PSPLIM register value for the task. */
+    msr control, r2                         /* Restore the CONTROL register value for the task. */
+#else /* configENABLE_MPU */
+    msr psplim, r2                          /* Restore the PSPLIM register value for the task. */
+#endif /* configENABLE_MPU */
+    msr psp, r0                             /* Remember the new top of stack for the task. */
+    bx r3
+/*-----------------------------------------------------------*/
+
+SVC_Handler:
+    tst lr, #4
+    ite eq
+    mrseq r0, msp
+    mrsne r0, psp
+    b vPortSVCHandler_C
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h b/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h
index 4b1f99b..51e21ea 100644
--- a/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h
+++ b/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h
@@ -155,9 +155,9 @@
  * 8-bit values encoded as follows:
  *  Bit[7:4] - 0000 - Device Memory
  *  Bit[3:2] - 00 --> Device-nGnRnE
- *				01 --> Device-nGnRE
- *				10 --> Device-nGRE
- *				11 --> Device-GRE
+ *              01 --> Device-nGnRE
+ *              10 --> Device-nGRE
+ *              11 --> Device-GRE
  *  Bit[1:0] - 00, Reserved.
  */
     #define portMPU_DEVICE_MEMORY_nGnRnE                  ( 0x00 )   /* 0000 0000 */
diff --git a/portable/IAR/ARM_CRx_No_GIC/port.c b/portable/IAR/ARM_CRx_No_GIC/port.c
index 07623cf..799a20e 100644
--- a/portable/IAR/ARM_CRx_No_GIC/port.c
+++ b/portable/IAR/ARM_CRx_No_GIC/port.c
@@ -1,317 +1,315 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Standard includes. */

-#include <stdlib.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1

-	/* Check the configuration. */

-	#if( configMAX_PRIORITIES > 32 )

-		#error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.

-	#endif

-#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-

-#ifndef configSETUP_TICK_INTERRUPT

-	#error configSETUP_TICK_INTERRUPT() must be defined in FreeRTOSConfig.h to call the function that sets up the tick interrupt.

-#endif

-

-#ifndef configCLEAR_TICK_INTERRUPT

-	#error configCLEAR_TICK_INTERRUPT must be defined in FreeRTOSConfig.h to clear which ever interrupt was used to generate the tick interrupt.

-#endif

-

-/* A critical section is exited when the critical section nesting count reaches

-this value. */

-#define portNO_CRITICAL_NESTING			( ( uint32_t ) 0 )

-

-/* Tasks are not created with a floating point context, but can be given a

-floating point context after they have been created.  A variable is stored as

-part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task

-does not have an FPU context, or any other value if the task does have an FPU

-context. */

-#define portNO_FLOATING_POINT_CONTEXT	( ( StackType_t ) 0 )

-

-/* Constants required to setup the initial task context. */

-#define portINITIAL_SPSR				( ( StackType_t ) 0x1f ) /* System mode, ARM mode, IRQ enabled FIQ enabled. */

-#define portTHUMB_MODE_BIT				( ( StackType_t ) 0x20 )

-#define portTHUMB_MODE_ADDRESS			( 0x01UL )

-

-/* Masks all bits in the APSR other than the mode bits. */

-#define portAPSR_MODE_BITS_MASK			( 0x1F )

-

-/* The value of the mode bits in the APSR when the CPU is executing in user

-mode. */

-#define portAPSR_USER_MODE				( 0x10 )

-

-/* Let the user override the pre-loading of the initial LR with the address of

-prvTaskExitError() in case it messes up unwinding of the stack in the

-debugger. */

-#ifdef configTASK_RETURN_ADDRESS

-	#define portTASK_RETURN_ADDRESS	configTASK_RETURN_ADDRESS

-#else

-	#define portTASK_RETURN_ADDRESS	prvTaskExitError

-#endif

-

-/*-----------------------------------------------------------*/

-

-/*

- * Starts the first task executing.  This function is necessarily written in

- * assembly code so is implemented in portASM.s.

- */

-extern void vPortRestoreTaskContext( void );

-

-/*

- * Used to catch tasks that attempt to return from their implementing function.

- */

-static void prvTaskExitError( void );

-

-/*-----------------------------------------------------------*/

-

-/* A variable is used to keep track of the critical section nesting.  This

-variable has to be stored as part of the task context and must be initialised to

-a non zero value to ensure interrupts don't inadvertently become unmasked before

-the scheduler starts.  As it is stored as part of the task context it will

-automatically be set to 0 when the first task is started. */

-volatile uint32_t ulCriticalNesting = 9999UL;

-

-/* Saved as part of the task context.  If ulPortTaskHasFPUContext is non-zero then

-a floating point context must be saved and restored for the task. */

-volatile uint32_t ulPortTaskHasFPUContext = pdFALSE;

-

-/* Set to 1 to pend a context switch from an ISR. */

-volatile uint32_t ulPortYieldRequired = pdFALSE;

-

-/* Counts the interrupt nesting depth.  A context switch is only performed if

-if the nesting depth is 0. */

-volatile uint32_t ulPortInterruptNesting = 0UL;

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-	/* Setup the initial stack of the task.  The stack is set exactly as

-	expected by the portRESTORE_CONTEXT() macro.

-

-	The fist real value on the stack is the status register, which is set for

-	system mode, with interrupts enabled.  A few NULLs are added first to ensure

-	GDB does not try decoding a non-existent return address. */

-	*pxTopOfStack = ( StackType_t ) NULL;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) NULL;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) NULL;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;

-

-	if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL )

-	{

-		/* The task will start in THUMB mode. */

-		*pxTopOfStack |= portTHUMB_MODE_BIT;

-	}

-

-	pxTopOfStack--;

-

-	/* Next the return address, which in this case is the start of the task. */

-	*pxTopOfStack = ( StackType_t ) pxCode;

-	pxTopOfStack--;

-

-	/* Next all the registers other than the stack pointer. */

-	*pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS;	/* R14 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12121212;	/* R12 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x11111111;	/* R11 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x10101010;	/* R10 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x09090909;	/* R9 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x08080808;	/* R8 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x07070707;	/* R7 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x06060606;	/* R6 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x05050505;	/* R5 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x04040404;	/* R4 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x03030303;	/* R3 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x02020202;	/* R2 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x01010101;	/* R1 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-	pxTopOfStack--;

-

-	/* The task will start with a critical nesting count of 0 as interrupts are

-	enabled. */

-	*pxTopOfStack = portNO_CRITICAL_NESTING;

-	pxTopOfStack--;

-

-	/* The task will start without a floating point context.  A task that uses

-	the floating point hardware must call vPortTaskUsesFPU() before executing

-	any floating point instructions. */

-	*pxTopOfStack = portNO_FLOATING_POINT_CONTEXT;

-

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-static void prvTaskExitError( void )

-{

-	/* A function that implements a task must not exit or attempt to return to

-	its caller as there is nothing to return to.  If a task wants to exit it

-	should instead call vTaskDelete( NULL ).

-

-	Artificially force an assert() to be triggered if configASSERT() is

-	defined, then stop here so application writers can catch the error. */

-	configASSERT( ulPortInterruptNesting == ~0UL );

-	portDISABLE_INTERRUPTS();

-	for( ;; );

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-uint32_t ulAPSR;

-

-	/* Only continue if the CPU is not in User mode.  The CPU must be in a

-	Privileged mode for the scheduler to start. */

-	__asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) );

-	ulAPSR &= portAPSR_MODE_BITS_MASK;

-	configASSERT( ulAPSR != portAPSR_USER_MODE );

-

-	if( ulAPSR != portAPSR_USER_MODE )

-	{

-		/* Start the timer that generates the tick ISR. */

-		portDISABLE_INTERRUPTS();

-		configSETUP_TICK_INTERRUPT();

-

-		/* Start the first task executing. */

-		vPortRestoreTaskContext();

-	}

-

-	/* Will only get here if vTaskStartScheduler() was called with the CPU in

-	a non-privileged mode or the binary point register was not set to its lowest

-	possible value.  prvTaskExitError() is referenced to prevent a compiler

-	warning about it being defined but not referenced in the case that the user

-	defines their own exit address. */

-	( void ) prvTaskExitError;

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* Not implemented in ports where there is nothing to return to.

-	Artificially force an assert. */

-	configASSERT( ulCriticalNesting == 1000UL );

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-	portDISABLE_INTERRUPTS();

-

-	/* Now interrupts are disabled ulCriticalNesting can be accessed

-	directly.  Increment ulCriticalNesting to keep a count of how many times

-	portENTER_CRITICAL() has been called. */

-	ulCriticalNesting++;

-

-	/* This is not the interrupt safe version of the enter critical function so

-	assert() if it is being called from an interrupt context.  Only API

-	functions that end in "FromISR" can be used in an interrupt.  Only assert if

-	the critical nesting count is 1 to protect against recursive calls if the

-	assert function also uses a critical section. */

-	if( ulCriticalNesting == 1 )

-	{

-		configASSERT( ulPortInterruptNesting == 0 );

-	}

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-	if( ulCriticalNesting > portNO_CRITICAL_NESTING )

-	{

-		/* Decrement the nesting count as the critical section is being

-		exited. */

-		ulCriticalNesting--;

-

-		/* If the nesting level has reached zero then all interrupt

-		priorities must be re-enabled. */

-		if( ulCriticalNesting == portNO_CRITICAL_NESTING )

-		{

-			/* Critical nesting has reached zero so all interrupt priorities

-			should be unmasked. */

-			portENABLE_INTERRUPTS();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-void FreeRTOS_Tick_Handler( void )

-{

-uint32_t ulInterruptStatus;

-

-	ulInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();

-

-	/* Increment the RTOS tick. */

-	if( xTaskIncrementTick() != pdFALSE )

-	{

-		ulPortYieldRequired = pdTRUE;

-	}

-

-	portCLEAR_INTERRUPT_MASK_FROM_ISR( ulInterruptStatus );

-

-	configCLEAR_TICK_INTERRUPT();

-}

-/*-----------------------------------------------------------*/

-

-void vPortTaskUsesFPU( void )

-{

-uint32_t ulInitialFPSCR = 0;

-

-	/* A task is registering the fact that it needs an FPU context.  Set the

-	FPU flag (which is saved as part of the task context). */

-	ulPortTaskHasFPUContext = pdTRUE;

-

-	/* Initialise the floating point status register. */

-	__asm volatile ( "FMXR 	FPSCR, %0" :: "r" (ulInitialFPSCR) );

-}

-/*-----------------------------------------------------------*/

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Standard includes. */
+#include <stdlib.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
+    /* Check the configuration. */
+    #if( configMAX_PRIORITIES > 32 )
+        #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.
+    #endif
+#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+
+#ifndef configSETUP_TICK_INTERRUPT
+    #error configSETUP_TICK_INTERRUPT() must be defined in FreeRTOSConfig.h to call the function that sets up the tick interrupt.
+#endif
+
+#ifndef configCLEAR_TICK_INTERRUPT
+    #error configCLEAR_TICK_INTERRUPT must be defined in FreeRTOSConfig.h to clear which ever interrupt was used to generate the tick interrupt.
+#endif
+
+/* A critical section is exited when the critical section nesting count reaches
+this value. */
+#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
+
+/* Tasks are not created with a floating point context, but can be given a
+floating point context after they have been created.  A variable is stored as
+part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task
+does not have an FPU context, or any other value if the task does have an FPU
+context. */
+#define portNO_FLOATING_POINT_CONTEXT   ( ( StackType_t ) 0 )
+
+/* Constants required to setup the initial task context. */
+#define portINITIAL_SPSR                ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, IRQ enabled FIQ enabled. */
+#define portTHUMB_MODE_BIT              ( ( StackType_t ) 0x20 )
+#define portTHUMB_MODE_ADDRESS          ( 0x01UL )
+
+/* Masks all bits in the APSR other than the mode bits. */
+#define portAPSR_MODE_BITS_MASK         ( 0x1F )
+
+/* The value of the mode bits in the APSR when the CPU is executing in user
+mode. */
+#define portAPSR_USER_MODE              ( 0x10 )
+
+/* Let the user override the pre-loading of the initial LR with the address of
+prvTaskExitError() in case it messes up unwinding of the stack in the
+debugger. */
+#ifdef configTASK_RETURN_ADDRESS
+    #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS
+#else
+    #define portTASK_RETURN_ADDRESS prvTaskExitError
+#endif
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Starts the first task executing.  This function is necessarily written in
+ * assembly code so is implemented in portASM.s.
+ */
+extern void vPortRestoreTaskContext( void );
+
+/*
+ * Used to catch tasks that attempt to return from their implementing function.
+ */
+static void prvTaskExitError( void );
+
+/*-----------------------------------------------------------*/
+
+/* A variable is used to keep track of the critical section nesting.  This
+variable has to be stored as part of the task context and must be initialised to
+a non zero value to ensure interrupts don't inadvertently become unmasked before
+the scheduler starts.  As it is stored as part of the task context it will
+automatically be set to 0 when the first task is started. */
+volatile uint32_t ulCriticalNesting = 9999UL;
+
+/* Saved as part of the task context.  If ulPortTaskHasFPUContext is non-zero then
+a floating point context must be saved and restored for the task. */
+volatile uint32_t ulPortTaskHasFPUContext = pdFALSE;
+
+/* Set to 1 to pend a context switch from an ISR. */
+volatile uint32_t ulPortYieldRequired = pdFALSE;
+
+/* Counts the interrupt nesting depth.  A context switch is only performed if
+if the nesting depth is 0. */
+volatile uint32_t ulPortInterruptNesting = 0UL;
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+    /* Setup the initial stack of the task.  The stack is set exactly as
+    expected by the portRESTORE_CONTEXT() macro.
+
+    The fist real value on the stack is the status register, which is set for
+    system mode, with interrupts enabled.  A few NULLs are added first to ensure
+    GDB does not try decoding a non-existent return address. */
+    *pxTopOfStack = ( StackType_t ) NULL;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) NULL;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) NULL;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;
+
+    if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL )
+    {
+        /* The task will start in THUMB mode. */
+        *pxTopOfStack |= portTHUMB_MODE_BIT;
+    }
+
+    pxTopOfStack--;
+
+    /* Next the return address, which in this case is the start of the task. */
+    *pxTopOfStack = ( StackType_t ) pxCode;
+    pxTopOfStack--;
+
+    /* Next all the registers other than the stack pointer. */
+    *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS;    /* R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+    pxTopOfStack--;
+
+    /* The task will start with a critical nesting count of 0 as interrupts are
+    enabled. */
+    *pxTopOfStack = portNO_CRITICAL_NESTING;
+    pxTopOfStack--;
+
+    /* The task will start without a floating point context.  A task that uses
+    the floating point hardware must call vPortTaskUsesFPU() before executing
+    any floating point instructions. */
+    *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT;
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+static void prvTaskExitError( void )
+{
+    /* A function that implements a task must not exit or attempt to return to
+    its caller as there is nothing to return to.  If a task wants to exit it
+    should instead call vTaskDelete( NULL ).
+
+    Artificially force an assert() to be triggered if configASSERT() is
+    defined, then stop here so application writers can catch the error. */
+    configASSERT( ulPortInterruptNesting == ~0UL );
+    portDISABLE_INTERRUPTS();
+    for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+uint32_t ulAPSR;
+
+    /* Only continue if the CPU is not in User mode.  The CPU must be in a
+    Privileged mode for the scheduler to start. */
+    __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) );
+    ulAPSR &= portAPSR_MODE_BITS_MASK;
+    configASSERT( ulAPSR != portAPSR_USER_MODE );
+
+    if( ulAPSR != portAPSR_USER_MODE )
+    {
+        /* Start the timer that generates the tick ISR. */
+        portDISABLE_INTERRUPTS();
+        configSETUP_TICK_INTERRUPT();
+
+        /* Start the first task executing. */
+        vPortRestoreTaskContext();
+    }
+
+    /* Will only get here if vTaskStartScheduler() was called with the CPU in
+    a non-privileged mode or the binary point register was not set to its lowest
+    possible value.  prvTaskExitError() is referenced to prevent a compiler
+    warning about it being defined but not referenced in the case that the user
+    defines their own exit address. */
+    ( void ) prvTaskExitError;
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+    Artificially force an assert. */
+    configASSERT( ulCriticalNesting == 1000UL );
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    portDISABLE_INTERRUPTS();
+
+    /* Now interrupts are disabled ulCriticalNesting can be accessed
+    directly.  Increment ulCriticalNesting to keep a count of how many times
+    portENTER_CRITICAL() has been called. */
+    ulCriticalNesting++;
+
+    /* This is not the interrupt safe version of the enter critical function so
+    assert() if it is being called from an interrupt context.  Only API
+    functions that end in "FromISR" can be used in an interrupt.  Only assert if
+    the critical nesting count is 1 to protect against recursive calls if the
+    assert function also uses a critical section. */
+    if( ulCriticalNesting == 1 )
+    {
+        configASSERT( ulPortInterruptNesting == 0 );
+    }
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
+    {
+        /* Decrement the nesting count as the critical section is being
+        exited. */
+        ulCriticalNesting--;
+
+        /* If the nesting level has reached zero then all interrupt
+        priorities must be re-enabled. */
+        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
+        {
+            /* Critical nesting has reached zero so all interrupt priorities
+            should be unmasked. */
+            portENABLE_INTERRUPTS();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+void FreeRTOS_Tick_Handler( void )
+{
+uint32_t ulInterruptStatus;
+
+    ulInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
+
+    /* Increment the RTOS tick. */
+    if( xTaskIncrementTick() != pdFALSE )
+    {
+        ulPortYieldRequired = pdTRUE;
+    }
+
+    portCLEAR_INTERRUPT_MASK_FROM_ISR( ulInterruptStatus );
+
+    configCLEAR_TICK_INTERRUPT();
+}
+/*-----------------------------------------------------------*/
+
+void vPortTaskUsesFPU( void )
+{
+uint32_t ulInitialFPSCR = 0;
+
+    /* A task is registering the fact that it needs an FPU context.  Set the
+    FPU flag (which is saved as part of the task context). */
+    ulPortTaskHasFPUContext = pdTRUE;
+
+    /* Initialise the floating point status register. */
+    __asm volatile ( "FMXR  FPSCR, %0" :: "r" (ulInitialFPSCR) );
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/ARM_CRx_No_GIC/portASM.s b/portable/IAR/ARM_CRx_No_GIC/portASM.s
index 8663d11..6883cce 100644
--- a/portable/IAR/ARM_CRx_No_GIC/portASM.s
+++ b/portable/IAR/ARM_CRx_No_GIC/portASM.s
@@ -1,248 +1,243 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-#include "FreeRTOSConfig.h"

-

-	SECTION .text:CODE:ROOT(2)

-	arm

-

-	/* Variables and functions. */

-	EXTERN pxCurrentTCB

-	EXTERN vTaskSwitchContext

-	EXTERN vApplicationIRQHandler

-	EXTERN ulPortInterruptNesting

-	EXTERN ulPortTaskHasFPUContext

-	EXTERN ulPortYieldRequired

-	EXTERN ulCriticalNesting

-

-	PUBLIC FreeRTOS_IRQ_Handler

-	PUBLIC FreeRTOS_SVC_Handler

-	PUBLIC vPortRestoreTaskContext

-

-SYS_MODE			EQU		0x1f

-SVC_MODE			EQU		0x13

-IRQ_MODE			EQU		0x12

-

-portSAVE_CONTEXT MACRO

-

-	/* Save the LR and SPSR onto the system mode stack before switching to

-	system mode to save the remaining system mode registers. */

-	SRSDB	sp!, #SYS_MODE

-	CPS		#SYS_MODE

-	PUSH	{R0-R12, R14}

-

-	/* Push the critical nesting count. */

-	LDR		R2, =ulCriticalNesting

-	LDR		R1, [R2]

-	PUSH	{R1}

-

-	/* Does the task have a floating point context that needs saving?  If

-	ulPortTaskHasFPUContext is 0 then no. */

-	LDR		R2, =ulPortTaskHasFPUContext

-	LDR		R3, [R2]

-	CMP		R3, #0

-

-	/* Save the floating point context, if any. */

-	FMRXNE  R1,  FPSCR

-	VPUSHNE {D0-D15}

-#if configFPU_D32 == 1

-	VPUSHNE	{D16-D31}

-#endif /* configFPU_D32 */

-	PUSHNE	{R1}

-

-	/* Save ulPortTaskHasFPUContext itself. */

-	PUSH	{R3}

-

-	/* Save the stack pointer in the TCB. */

-	LDR		R0, =pxCurrentTCB

-	LDR		R1, [R0]

-	STR		SP, [R1]

-

-	ENDM

-

-; /**********************************************************************/

-

-portRESTORE_CONTEXT MACRO

-

-	/* Set the SP to point to the stack of the task being restored. */

-	LDR		R0, =pxCurrentTCB

-	LDR		R1, [R0]

-	LDR		SP, [R1]

-

-	/* Is there a floating point context to restore?  If the restored

-	ulPortTaskHasFPUContext is zero then no. */

-	LDR		R0, =ulPortTaskHasFPUContext

-	POP		{R1}

-	STR		R1, [R0]

-	CMP		R1, #0

-

-	/* Restore the floating point context, if any. */

-	POPNE 	{R0}

-#if configFPU_D32 == 1

-	VPOPNE	{D16-D31}

-#endif /* configFPU_D32 */

-	VPOPNE	{D0-D15}

-	VMSRNE  FPSCR, R0

-

-	/* Restore the critical section nesting depth. */

-	LDR		R0, =ulCriticalNesting

-	POP		{R1}

-	STR		R1, [R0]

-

-	/* Restore all system mode registers other than the SP (which is already

-	being used). */

-	POP		{R0-R12, R14}

-

-	/* Return to the task code, loading CPSR on the way. */

-	RFEIA	sp!

-

-	ENDM

-

-

-

-

-/******************************************************************************

- * SVC handler is used to yield.

- *****************************************************************************/

-FreeRTOS_SVC_Handler:

-	/* Save the context of the current task and select a new task to run. */

-	portSAVE_CONTEXT

-	LDR R0, =vTaskSwitchContext

-	BLX	R0

-	portRESTORE_CONTEXT

-

-

-/******************************************************************************

- * vPortRestoreTaskContext is used to start the scheduler.

- *****************************************************************************/

-vPortRestoreTaskContext:

-	/* Switch to system mode. */

-	CPS		#SYS_MODE

-	portRESTORE_CONTEXT

-

-FreeRTOS_IRQ_Handler:

-	/* Return to the interrupted instruction. */

-	SUB		lr, lr, #4

-

-	/* Push the return address and SPSR. */

-	PUSH	{lr}

-	MRS		lr, SPSR

-	PUSH	{lr}

-

-	/* Change to supervisor mode to allow reentry. */

-	CPS		#SVC_MODE

-

-	/* Push used registers. */

-	PUSH	{r0-r3, r12}

-

-	/* Increment nesting count.  r3 holds the address of ulPortInterruptNesting

-	for future use.  r1 holds the original ulPortInterruptNesting value for

-	future use. */

-	LDR		r3, =ulPortInterruptNesting

-	LDR		r1, [r3]

-	ADD		r0, r1, #1

-	STR		r0, [r3]

-

-	/* Ensure bit 2 of the stack pointer is clear.  r2 holds the bit 2 value for

-	future use. */

-	MOV		r0, sp

-	AND		r2, r0, #4

-	SUB		sp, sp, r2

-

-	/* Call the interrupt handler. */

-	PUSH	{r0-r3, lr}

-	LDR		r1, =vApplicationIRQHandler

-	BLX		r1

-	POP		{r0-r3, lr}

-	ADD		sp, sp, r2

-

-	CPSID	i

-	DSB

-	ISB

-

-	/* Write to the EOI register. */

-	LDR 	r2, =configEOI_ADDRESS

-	STR		r0, [r2]

-

-	/* Restore the old nesting count. */

-	STR		r1, [r3]

-

-	/* A context switch is never performed if the nesting count is not 0. */

-	CMP		r1, #0

-	BNE		exit_without_switch

-

-	/* Did the interrupt request a context switch?  r1 holds the address of

-	ulPortYieldRequired and r0 the value of ulPortYieldRequired for future

-	use. */

-	LDR		r1, =ulPortYieldRequired

-	LDR		r0, [r1]

-	CMP		r0, #0

-	BNE		switch_before_exit

-

-exit_without_switch:

-	/* No context switch.  Restore used registers, LR_irq and SPSR before

-	returning. */

-	POP		{r0-r3, r12}

-	CPS		#IRQ_MODE

-	POP		{LR}

-	MSR		SPSR_cxsf, LR

-	POP		{LR}

-	MOVS	PC, LR

-

-switch_before_exit:

-	/* A context swtich is to be performed.  Clear the context switch pending

-	flag. */

-	MOV		r0, #0

-	STR		r0, [r1]

-

-	/* Restore used registers, LR-irq and SPSR before saving the context

-	to the task stack. */

-	POP		{r0-r3, r12}

-	CPS		#IRQ_MODE

-	POP		{LR}

-	MSR		SPSR_cxsf, LR

-	POP		{LR}

-	portSAVE_CONTEXT

-

-	/* Call the function that selects the new task to execute.

-	vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD

-	instructions, or 8 byte aligned stack allocated data.  LR does not need

-	saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */

-	LDR		R0, =vTaskSwitchContext

-	BLX		R0

-

-	/* Restore the context of, and branch to, the task selected to execute

-	next. */

-	portRESTORE_CONTEXT

-

-	END

-

-

-

-

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+#include "FreeRTOSConfig.h"
+
+    SECTION .text:CODE:ROOT(2)
+    arm
+
+    /* Variables and functions. */
+    EXTERN pxCurrentTCB
+    EXTERN vTaskSwitchContext
+    EXTERN vApplicationIRQHandler
+    EXTERN ulPortInterruptNesting
+    EXTERN ulPortTaskHasFPUContext
+    EXTERN ulPortYieldRequired
+    EXTERN ulCriticalNesting
+
+    PUBLIC FreeRTOS_IRQ_Handler
+    PUBLIC FreeRTOS_SVC_Handler
+    PUBLIC vPortRestoreTaskContext
+
+SYS_MODE            EQU     0x1f
+SVC_MODE            EQU     0x13
+IRQ_MODE            EQU     0x12
+
+portSAVE_CONTEXT MACRO
+
+    /* Save the LR and SPSR onto the system mode stack before switching to
+    system mode to save the remaining system mode registers. */
+    SRSDB   sp!, #SYS_MODE
+    CPS     #SYS_MODE
+    PUSH    {R0-R12, R14}
+
+    /* Push the critical nesting count. */
+    LDR     R2, =ulCriticalNesting
+    LDR     R1, [R2]
+    PUSH    {R1}
+
+    /* Does the task have a floating point context that needs saving?  If
+    ulPortTaskHasFPUContext is 0 then no. */
+    LDR     R2, =ulPortTaskHasFPUContext
+    LDR     R3, [R2]
+    CMP     R3, #0
+
+    /* Save the floating point context, if any. */
+    FMRXNE  R1,  FPSCR
+    VPUSHNE {D0-D15}
+#if configFPU_D32 == 1
+    VPUSHNE {D16-D31}
+#endif /* configFPU_D32 */
+    PUSHNE  {R1}
+
+    /* Save ulPortTaskHasFPUContext itself. */
+    PUSH    {R3}
+
+    /* Save the stack pointer in the TCB. */
+    LDR     R0, =pxCurrentTCB
+    LDR     R1, [R0]
+    STR     SP, [R1]
+
+    ENDM
+
+; /**********************************************************************/
+
+portRESTORE_CONTEXT MACRO
+
+    /* Set the SP to point to the stack of the task being restored. */
+    LDR     R0, =pxCurrentTCB
+    LDR     R1, [R0]
+    LDR     SP, [R1]
+
+    /* Is there a floating point context to restore?  If the restored
+    ulPortTaskHasFPUContext is zero then no. */
+    LDR     R0, =ulPortTaskHasFPUContext
+    POP     {R1}
+    STR     R1, [R0]
+    CMP     R1, #0
+
+    /* Restore the floating point context, if any. */
+    POPNE   {R0}
+#if configFPU_D32 == 1
+    VPOPNE  {D16-D31}
+#endif /* configFPU_D32 */
+    VPOPNE  {D0-D15}
+    VMSRNE  FPSCR, R0
+
+    /* Restore the critical section nesting depth. */
+    LDR     R0, =ulCriticalNesting
+    POP     {R1}
+    STR     R1, [R0]
+
+    /* Restore all system mode registers other than the SP (which is already
+    being used). */
+    POP     {R0-R12, R14}
+
+    /* Return to the task code, loading CPSR on the way. */
+    RFEIA   sp!
+
+    ENDM
+
+
+
+
+/******************************************************************************
+ * SVC handler is used to yield.
+ *****************************************************************************/
+FreeRTOS_SVC_Handler:
+    /* Save the context of the current task and select a new task to run. */
+    portSAVE_CONTEXT
+    LDR R0, =vTaskSwitchContext
+    BLX R0
+    portRESTORE_CONTEXT
+
+
+/******************************************************************************
+ * vPortRestoreTaskContext is used to start the scheduler.
+ *****************************************************************************/
+vPortRestoreTaskContext:
+    /* Switch to system mode. */
+    CPS     #SYS_MODE
+    portRESTORE_CONTEXT
+
+FreeRTOS_IRQ_Handler:
+    /* Return to the interrupted instruction. */
+    SUB     lr, lr, #4
+
+    /* Push the return address and SPSR. */
+    PUSH    {lr}
+    MRS     lr, SPSR
+    PUSH    {lr}
+
+    /* Change to supervisor mode to allow reentry. */
+    CPS     #SVC_MODE
+
+    /* Push used registers. */
+    PUSH    {r0-r3, r12}
+
+    /* Increment nesting count.  r3 holds the address of ulPortInterruptNesting
+    for future use.  r1 holds the original ulPortInterruptNesting value for
+    future use. */
+    LDR     r3, =ulPortInterruptNesting
+    LDR     r1, [r3]
+    ADD     r0, r1, #1
+    STR     r0, [r3]
+
+    /* Ensure bit 2 of the stack pointer is clear.  r2 holds the bit 2 value for
+    future use. */
+    MOV     r0, sp
+    AND     r2, r0, #4
+    SUB     sp, sp, r2
+
+    /* Call the interrupt handler. */
+    PUSH    {r0-r3, lr}
+    LDR     r1, =vApplicationIRQHandler
+    BLX     r1
+    POP     {r0-r3, lr}
+    ADD     sp, sp, r2
+
+    CPSID   i
+    DSB
+    ISB
+
+    /* Write to the EOI register. */
+    LDR     r2, =configEOI_ADDRESS
+    STR     r0, [r2]
+
+    /* Restore the old nesting count. */
+    STR     r1, [r3]
+
+    /* A context switch is never performed if the nesting count is not 0. */
+    CMP     r1, #0
+    BNE     exit_without_switch
+
+    /* Did the interrupt request a context switch?  r1 holds the address of
+    ulPortYieldRequired and r0 the value of ulPortYieldRequired for future
+    use. */
+    LDR     r1, =ulPortYieldRequired
+    LDR     r0, [r1]
+    CMP     r0, #0
+    BNE     switch_before_exit
+
+exit_without_switch:
+    /* No context switch.  Restore used registers, LR_irq and SPSR before
+    returning. */
+    POP     {r0-r3, r12}
+    CPS     #IRQ_MODE
+    POP     {LR}
+    MSR     SPSR_cxsf, LR
+    POP     {LR}
+    MOVS    PC, LR
+
+switch_before_exit:
+    /* A context swtich is to be performed.  Clear the context switch pending
+    flag. */
+    MOV     r0, #0
+    STR     r0, [r1]
+
+    /* Restore used registers, LR-irq and SPSR before saving the context
+    to the task stack. */
+    POP     {r0-r3, r12}
+    CPS     #IRQ_MODE
+    POP     {LR}
+    MSR     SPSR_cxsf, LR
+    POP     {LR}
+    portSAVE_CONTEXT
+
+    /* Call the function that selects the new task to execute.
+    vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD
+    instructions, or 8 byte aligned stack allocated data.  LR does not need
+    saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */
+    LDR     R0, =vTaskSwitchContext
+    BLX     R0
+
+    /* Restore the context of, and branch to, the task selected to execute
+    next. */
+    portRESTORE_CONTEXT
+
+    END
diff --git a/portable/IAR/ARM_CRx_No_GIC/portmacro.h b/portable/IAR/ARM_CRx_No_GIC/portmacro.h
index 33de54d..fbe4e16 100644
--- a/portable/IAR/ARM_CRx_No_GIC/portmacro.h
+++ b/portable/IAR/ARM_CRx_No_GIC/portmacro.h
@@ -1,182 +1,181 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#include <intrinsics.h>

-

-#ifdef __cplusplus

-	extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the given hardware

- * and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		short

-#define portSTACK_TYPE	uint32_t

-#define portBASE_TYPE	long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-typedef uint32_t TickType_t;

-#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-

-/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

-not need to be guarded with a critical section. */

-#define portTICK_TYPE_IS_ATOMIC 1

-

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portBYTE_ALIGNMENT			8

-

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-

-/* Called at the end of an ISR that can cause a context switch. */

-#define portEND_SWITCHING_ISR( xSwitchRequired )\

-{												\

-extern volatile uint32_t ulPortYieldRequired;	\

-												\

-	if( xSwitchRequired != pdFALSE )			\

-	{											\

-		ulPortYieldRequired = pdTRUE;			\

-	}											\

-}

-

-#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )

-#define portYIELD() __asm volatile ( "SWI 0		\n"				\

-									 "ISB		  " );

-

-

-/*-----------------------------------------------------------

- * Critical section control

- *----------------------------------------------------------*/

-

-extern void vPortEnterCritical( void );

-extern void vPortExitCritical( void );

-extern uint32_t ulPortSetInterruptMask( void );

-extern void vPortClearInterruptMask( uint32_t ulNewMaskValue );

-extern void vPortInstallFreeRTOSVectorTable( void );

-

-/* The I bit within the CPSR. */

-#define portINTERRUPT_ENABLE_BIT	( 1 << 7 )

-

-/* In the absence of a priority mask register, these functions and macros

-globally enable and disable interrupts. */

-#define portENTER_CRITICAL()		vPortEnterCritical();

-#define portEXIT_CRITICAL()			vPortExitCritical();

-#define portENABLE_INTERRUPTS()		__asm volatile ( "CPSIE i 	\n"	);

-#define portDISABLE_INTERRUPTS()	__asm volatile ( "CPSID i 	\n"		\

-													 "DSB		\n"		\

-													 "ISB		  " );

-#pragma inline

-static inline uint32_t portINLINE_SET_INTERRUPT_MASK_FROM_ISR( void )

-{

-volatile uint32_t ulCPSR;

-

-	__asm volatile ( "MRS %0, CPSR" : "=r" (ulCPSR) );

-	ulCPSR &= portINTERRUPT_ENABLE_BIT;

-	portDISABLE_INTERRUPTS();

-	return ulCPSR;

-}

-

-#define portSET_INTERRUPT_MASK_FROM_ISR() portINLINE_SET_INTERRUPT_MASK_FROM_ISR()

-#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)	do { if( x == 0 ) portENABLE_INTERRUPTS(); } while( 0 )

-

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site.  These are

-not required for this port but included in case common demo code that uses these

-macros is used. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters )	void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters )	void vFunction( void *pvParameters )

-

-/* Prototype of the FreeRTOS tick handler.  This must be installed as the

-handler for whichever peripheral is used to generate the RTOS tick. */

-void FreeRTOS_Tick_Handler( void );

-

-/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU()

-before any floating point instructions are executed. */

-void vPortTaskUsesFPU( void );

-#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU()

-

-#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL )

-#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL )

-

-/* Architecture specific optimisations. */

-#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

-	#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1

-#endif

-

-#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1

-

-	/* Store/clear the ready priorities in a bit map. */

-	#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

-	#define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

-

-	/*-----------------------------------------------------------*/

-

-	#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __CLZ( uxReadyPriorities ) )

-

-#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-

-#define portNOP() __asm volatile( "NOP" )

-#define portINLINE inline

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

-the source code because to do so would cause other compilers to generate

-warnings. */

-#pragma diag_suppress=Pe191

-#pragma diag_suppress=Pa082

-

-#ifdef __cplusplus

-	} /* extern C */

-#endif

-

-

-#endif /* PORTMACRO_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#include <intrinsics.h>
+
+#ifdef __cplusplus
+    extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the given hardware
+ * and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint32_t
+#define portBASE_TYPE   long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+typedef uint32_t TickType_t;
+#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+
+/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+not need to be guarded with a critical section. */
+#define portTICK_TYPE_IS_ATOMIC 1
+
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT          8
+
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+
+/* Called at the end of an ISR that can cause a context switch. */
+#define portEND_SWITCHING_ISR( xSwitchRequired )\
+{                                               \
+extern volatile uint32_t ulPortYieldRequired;   \
+                                                \
+    if( xSwitchRequired != pdFALSE )            \
+    {                                           \
+        ulPortYieldRequired = pdTRUE;           \
+    }                                           \
+}
+
+#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
+#define portYIELD() __asm volatile ( "SWI 0     \n"             \
+                                     "ISB         " );
+
+
+/*-----------------------------------------------------------
+ * Critical section control
+ *----------------------------------------------------------*/
+
+extern void vPortEnterCritical( void );
+extern void vPortExitCritical( void );
+extern uint32_t ulPortSetInterruptMask( void );
+extern void vPortClearInterruptMask( uint32_t ulNewMaskValue );
+extern void vPortInstallFreeRTOSVectorTable( void );
+
+/* The I bit within the CPSR. */
+#define portINTERRUPT_ENABLE_BIT    ( 1 << 7 )
+
+/* In the absence of a priority mask register, these functions and macros
+globally enable and disable interrupts. */
+#define portENTER_CRITICAL()        vPortEnterCritical();
+#define portEXIT_CRITICAL()         vPortExitCritical();
+#define portENABLE_INTERRUPTS()     __asm volatile ( "CPSIE i   \n" );
+#define portDISABLE_INTERRUPTS()    __asm volatile ( "CPSID i   \n"     \
+                                                     "DSB       \n"     \
+                                                     "ISB         " );
+#pragma inline
+static inline uint32_t portINLINE_SET_INTERRUPT_MASK_FROM_ISR( void )
+{
+volatile uint32_t ulCPSR;
+
+    __asm volatile ( "MRS %0, CPSR" : "=r" (ulCPSR) );
+    ulCPSR &= portINTERRUPT_ENABLE_BIT;
+    portDISABLE_INTERRUPTS();
+    return ulCPSR;
+}
+
+#define portSET_INTERRUPT_MASK_FROM_ISR() portINLINE_SET_INTERRUPT_MASK_FROM_ISR()
+#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)    do { if( x == 0 ) portENABLE_INTERRUPTS(); } while( 0 )
+
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site.  These are
+not required for this port but included in case common demo code that uses these
+macros is used. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters )  void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters )    void vFunction( void *pvParameters )
+
+/* Prototype of the FreeRTOS tick handler.  This must be installed as the
+handler for whichever peripheral is used to generate the RTOS tick. */
+void FreeRTOS_Tick_Handler( void );
+
+/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU()
+before any floating point instructions are executed. */
+void vPortTaskUsesFPU( void );
+#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU()
+
+#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL )
+#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL )
+
+/* Architecture specific optimisations. */
+#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
+    #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
+#endif
+
+#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
+
+    /* Store/clear the ready priorities in a bit map. */
+    #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
+    #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
+
+    /*-----------------------------------------------------------*/
+
+    #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __CLZ( uxReadyPriorities ) )
+
+#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+
+#define portNOP() __asm volatile( "NOP" )
+#define portINLINE inline
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+the source code because to do so would cause other compilers to generate
+warnings. */
+#pragma diag_suppress=Pe191
+#pragma diag_suppress=Pa082
+
+#ifdef __cplusplus
+    } /* extern C */
+#endif
+
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ATMega323/port.c b/portable/IAR/ATMega323/port.c
index 7b7504b..19aac24 100644
--- a/portable/IAR/ATMega323/port.c
+++ b/portable/IAR/ATMega323/port.c
@@ -1,340 +1,338 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#include <stdlib.h>

-

-#include "FreeRTOS.h"

-#include "task.h"

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the AVR/IAR port.

- *----------------------------------------------------------*/

-

-/* Start tasks with interrupts enables. */

-#define portFLAGS_INT_ENABLED					( ( StackType_t ) 0x80 )

-

-/* Hardware constants for timer 1. */

-#define portCLEAR_COUNTER_ON_MATCH				( ( uint8_t ) 0x08 )

-#define portPRESCALE_64							( ( uint8_t ) 0x03 )

-#define portCLOCK_PRESCALER						( ( uint32_t ) 64 )

-#define portCOMPARE_MATCH_A_INTERRUPT_ENABLE	( ( uint8_t ) 0x10 )

-

-/* The number of bytes used on the hardware stack by the task start address. */

-#define portBYTES_USED_BY_RETURN_ADDRESS		( 2 )

-/*-----------------------------------------------------------*/

-

-/* Stores the critical section nesting.  This must not be initialised to 0.

-It will be initialised when a task starts. */

-#define portNO_CRITICAL_NESTING					( ( UBaseType_t ) 0 )

-UBaseType_t uxCriticalNesting = 0x50;

-

-

-/*

- * Perform hardware setup to enable ticks from timer 1, compare match A.

- */

-static void prvSetupTimerInterrupt( void );

-

-/*

- * The IAR compiler does not have full support for inline assembler, so

- * these are defined in the portmacro assembler file.

- */

-extern void vPortYieldFromTick( void );

-extern void vPortStart( void );

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-uint16_t usAddress;

-StackType_t *pxTopOfHardwareStack;

-

-	/* Place a few bytes of known values on the bottom of the stack.

-	This is just useful for debugging. */

-

-	*pxTopOfStack = 0x11;

-	pxTopOfStack--;

-	*pxTopOfStack = 0x22;

-	pxTopOfStack--;

-	*pxTopOfStack = 0x33;

-	pxTopOfStack--;

-

-	/* Remember where the top of the hardware stack is - this is required

-	below. */

-	pxTopOfHardwareStack = pxTopOfStack;

-

-

-	/* Simulate how the stack would look after a call to vPortYield(). */

-

-	/*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */

-

-

-

-	/* The IAR compiler requires two stacks per task.  First there is the

-	hardware call stack which uses the AVR stack pointer.  Second there is the

-	software stack (local variables, parameter passing, etc.) which uses the

-	AVR Y register.

-

-	This function places both stacks within the memory block passed in as the

-	first parameter.  The hardware stack is placed at the bottom of the memory

-	block.  A gap is then left for the hardware stack to grow.  Next the software

-	stack is placed.  The amount of space between the software and hardware

-	stacks is defined by configCALL_STACK_SIZE.

-

-

-

-	The first part of the stack is the hardware stack.  Place the start

-	address of the task on the hardware stack. */

-	usAddress = ( uint16_t ) pxCode;

-	*pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );

-	pxTopOfStack--;

-

-	usAddress >>= 8;

-	*pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );

-	pxTopOfStack--;

-

-

-	/* Leave enough space for the hardware stack before starting the software

-	stack.  The '- 2' is because we have already used two spaces for the

-	address of the start of the task. */

-	pxTopOfStack -= ( configCALL_STACK_SIZE - 2 );

-

-

-

-	/* Next simulate the stack as if after a call to portSAVE_CONTEXT().

-	portSAVE_CONTEXT places the flags on the stack immediately after r0

-	to ensure the interrupts get disabled as soon as possible, and so ensuring

-	the stack use is minimal should a context switch interrupt occur. */

-	*pxTopOfStack = ( StackType_t ) 0x00;	/* R0 */

-	pxTopOfStack--;

-	*pxTopOfStack = portFLAGS_INT_ENABLED;

-	pxTopOfStack--;

-

-	/* Next place the address of the hardware stack.  This is required so

-	the AVR stack pointer can be restored to point to the hardware stack. */

-	pxTopOfHardwareStack -= portBYTES_USED_BY_RETURN_ADDRESS;

-	usAddress = ( uint16_t ) pxTopOfHardwareStack;

-

-	/* SPL */

-	*pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );

-	pxTopOfStack--;

-

-	/* SPH */

-	usAddress >>= 8;

-	*pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );

-	pxTopOfStack--;

-

-

-

-

-	/* Now the remaining registers. */

-	*pxTopOfStack = ( StackType_t ) 0x01;	/* R1 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x02;	/* R2 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x03;	/* R3 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x04;	/* R4 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x05;	/* R5 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x06;	/* R6 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x07;	/* R7 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x08;	/* R8 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x09;	/* R9 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x10;	/* R10 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x11;	/* R11 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12;	/* R12 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x13;	/* R13 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x14;	/* R14 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x15;	/* R15 */

-	pxTopOfStack--;

-

-	/* Place the parameter on the stack in the expected location. */

-	usAddress = ( uint16_t ) pvParameters;

-	*pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );

-	pxTopOfStack--;

-

-	usAddress >>= 8;

-	*pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );

-	pxTopOfStack--;

-

-	*pxTopOfStack = ( StackType_t ) 0x18;	/* R18 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x19;	/* R19 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x20;	/* R20 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x21;	/* R21 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x22;	/* R22 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x23;	/* R23 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x24;	/* R24 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x25;	/* R25 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x26;	/* R26 X */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x27;	/* R27 */

-	pxTopOfStack--;

-

-	/* The Y register is not stored as it is used as the software stack and

-	gets saved into the task control block. */

-

-	*pxTopOfStack = ( StackType_t ) 0x30;	/* R30 Z */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x031;	/* R31 */

-

-	pxTopOfStack--;

-	*pxTopOfStack = portNO_CRITICAL_NESTING;	/* Critical nesting is zero when the task starts. */

-

-	/*lint +e950 +e611 +e923 */

-

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-	/* Setup the hardware to generate the tick. */

-	prvSetupTimerInterrupt();

-

-	/* Restore the context of the first task that is going to run.

-	Normally we would just call portRESTORE_CONTEXT() here, but as the IAR

-	compiler does not fully support inline assembler we have to make a call.*/

-	vPortStart();

-

-	/* Should not get here! */

-	return pdTRUE;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the AVR port will get stopped.  If required simply

-	disable the tick interrupt here. */

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Setup timer 1 compare match A to generate a tick interrupt.

- */

-static void prvSetupTimerInterrupt( void )

-{

-uint32_t ulCompareMatch;

-uint8_t ucHighByte, ucLowByte;

-

-	/* Using 16bit timer 1 to generate the tick.  Correct fuses must be

-	selected for the configCPU_CLOCK_HZ clock. */

-

-	ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ;

-

-	/* We only have 16 bits so have to scale to get our required tick rate. */

-	ulCompareMatch /= portCLOCK_PRESCALER;

-

-	/* Adjust for correct value. */

-	ulCompareMatch -= ( uint32_t ) 1;

-

-	/* Setup compare match value for compare match A.  Interrupts are disabled

-	before this is called so we need not worry here. */

-	ucLowByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff );

-	ulCompareMatch >>= 8;

-	ucHighByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff );

-	OCR1AH = ucHighByte;

-	OCR1AL = ucLowByte;

-

-	/* Setup clock source and compare match behaviour. */

-	ucLowByte = portCLEAR_COUNTER_ON_MATCH | portPRESCALE_64;

-	TCCR1B = ucLowByte;

-

-	/* Enable the interrupt - this is okay as interrupt are currently globally

-	disabled. */

-	TIMSK |= portCOMPARE_MATCH_A_INTERRUPT_ENABLE;

-}

-/*-----------------------------------------------------------*/

-

-#if configUSE_PREEMPTION == 1

-

-	/*

-	 * Tick ISR for preemptive scheduler.  We can use a __task attribute as

-	 * the context is saved at the start of vPortYieldFromTick().  The tick

-	 * count is incremented after the context is saved.

-	 */

-	__task void SIG_OUTPUT_COMPARE1A( void )

-	{

-		vPortYieldFromTick();

-		asm( "reti" );

-	}

-

-#else

-

-	/*

-	 * Tick ISR for the cooperative scheduler.  All this does is increment the

-	 * tick count.  We don't need to switch context, this can only be done by

-	 * manual calls to taskYIELD();

-	 *

-	 * THE INTERRUPT VECTOR IS POPULATED IN portmacro.s90.  DO NOT INSTALL

-	 * IT HERE USING THE USUAL PRAGMA.

-	 */

-	__interrupt void SIG_OUTPUT_COMPARE1A( void )

-	{

-		xTaskIncrementTick();

-	}

-#endif

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-	portDISABLE_INTERRUPTS();

-	uxCriticalNesting++;

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-	uxCriticalNesting--;

-	if( uxCriticalNesting == portNO_CRITICAL_NESTING )

-	{

-		portENABLE_INTERRUPTS();

-	}

-}

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#include <stdlib.h>
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the AVR/IAR port.
+ *----------------------------------------------------------*/
+
+/* Start tasks with interrupts enables. */
+#define portFLAGS_INT_ENABLED                   ( ( StackType_t ) 0x80 )
+
+/* Hardware constants for timer 1. */
+#define portCLEAR_COUNTER_ON_MATCH              ( ( uint8_t ) 0x08 )
+#define portPRESCALE_64                         ( ( uint8_t ) 0x03 )
+#define portCLOCK_PRESCALER                     ( ( uint32_t ) 64 )
+#define portCOMPARE_MATCH_A_INTERRUPT_ENABLE    ( ( uint8_t ) 0x10 )
+
+/* The number of bytes used on the hardware stack by the task start address. */
+#define portBYTES_USED_BY_RETURN_ADDRESS        ( 2 )
+/*-----------------------------------------------------------*/
+
+/* Stores the critical section nesting.  This must not be initialised to 0.
+It will be initialised when a task starts. */
+#define portNO_CRITICAL_NESTING                 ( ( UBaseType_t ) 0 )
+UBaseType_t uxCriticalNesting = 0x50;
+
+
+/*
+ * Perform hardware setup to enable ticks from timer 1, compare match A.
+ */
+static void prvSetupTimerInterrupt( void );
+
+/*
+ * The IAR compiler does not have full support for inline assembler, so
+ * these are defined in the portmacro assembler file.
+ */
+extern void vPortYieldFromTick( void );
+extern void vPortStart( void );
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+uint16_t usAddress;
+StackType_t *pxTopOfHardwareStack;
+
+    /* Place a few bytes of known values on the bottom of the stack.
+    This is just useful for debugging. */
+
+    *pxTopOfStack = 0x11;
+    pxTopOfStack--;
+    *pxTopOfStack = 0x22;
+    pxTopOfStack--;
+    *pxTopOfStack = 0x33;
+    pxTopOfStack--;
+
+    /* Remember where the top of the hardware stack is - this is required
+    below. */
+    pxTopOfHardwareStack = pxTopOfStack;
+
+
+    /* Simulate how the stack would look after a call to vPortYield(). */
+
+    /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */
+
+
+
+    /* The IAR compiler requires two stacks per task.  First there is the
+    hardware call stack which uses the AVR stack pointer.  Second there is the
+    software stack (local variables, parameter passing, etc.) which uses the
+    AVR Y register.
+
+    This function places both stacks within the memory block passed in as the
+    first parameter.  The hardware stack is placed at the bottom of the memory
+    block.  A gap is then left for the hardware stack to grow.  Next the software
+    stack is placed.  The amount of space between the software and hardware
+    stacks is defined by configCALL_STACK_SIZE.
+
+
+
+    The first part of the stack is the hardware stack.  Place the start
+    address of the task on the hardware stack. */
+    usAddress = ( uint16_t ) pxCode;
+    *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );
+    pxTopOfStack--;
+
+    usAddress >>= 8;
+    *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );
+    pxTopOfStack--;
+
+
+    /* Leave enough space for the hardware stack before starting the software
+    stack.  The '- 2' is because we have already used two spaces for the
+    address of the start of the task. */
+    pxTopOfStack -= ( configCALL_STACK_SIZE - 2 );
+
+
+
+    /* Next simulate the stack as if after a call to portSAVE_CONTEXT().
+    portSAVE_CONTEXT places the flags on the stack immediately after r0
+    to ensure the interrupts get disabled as soon as possible, and so ensuring
+    the stack use is minimal should a context switch interrupt occur. */
+    *pxTopOfStack = ( StackType_t ) 0x00;   /* R0 */
+    pxTopOfStack--;
+    *pxTopOfStack = portFLAGS_INT_ENABLED;
+    pxTopOfStack--;
+
+    /* Next place the address of the hardware stack.  This is required so
+    the AVR stack pointer can be restored to point to the hardware stack. */
+    pxTopOfHardwareStack -= portBYTES_USED_BY_RETURN_ADDRESS;
+    usAddress = ( uint16_t ) pxTopOfHardwareStack;
+
+    /* SPL */
+    *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );
+    pxTopOfStack--;
+
+    /* SPH */
+    usAddress >>= 8;
+    *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );
+    pxTopOfStack--;
+
+
+
+
+    /* Now the remaining registers. */
+    *pxTopOfStack = ( StackType_t ) 0x01;   /* R1 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x02;   /* R2 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x03;   /* R3 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x04;   /* R4 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x05;   /* R5 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x06;   /* R6 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x07;   /* R7 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x08;   /* R8 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x09;   /* R9 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10;   /* R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11;   /* R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12;   /* R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x13;   /* R13 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x14;   /* R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x15;   /* R15 */
+    pxTopOfStack--;
+
+    /* Place the parameter on the stack in the expected location. */
+    usAddress = ( uint16_t ) pvParameters;
+    *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );
+    pxTopOfStack--;
+
+    usAddress >>= 8;
+    *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff );
+    pxTopOfStack--;
+
+    *pxTopOfStack = ( StackType_t ) 0x18;   /* R18 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x19;   /* R19 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x20;   /* R20 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x21;   /* R21 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x22;   /* R22 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x23;   /* R23 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x24;   /* R24 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x25;   /* R25 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x26;   /* R26 X */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x27;   /* R27 */
+    pxTopOfStack--;
+
+    /* The Y register is not stored as it is used as the software stack and
+    gets saved into the task control block. */
+
+    *pxTopOfStack = ( StackType_t ) 0x30;   /* R30 Z */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x031;  /* R31 */
+
+    pxTopOfStack--;
+    *pxTopOfStack = portNO_CRITICAL_NESTING;    /* Critical nesting is zero when the task starts. */
+
+    /*lint +e950 +e611 +e923 */
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+    /* Setup the hardware to generate the tick. */
+    prvSetupTimerInterrupt();
+
+    /* Restore the context of the first task that is going to run.
+    Normally we would just call portRESTORE_CONTEXT() here, but as the IAR
+    compiler does not fully support inline assembler we have to make a call.*/
+    vPortStart();
+
+    /* Should not get here! */
+    return pdTRUE;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the AVR port will get stopped.  If required simply
+    disable the tick interrupt here. */
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * Setup timer 1 compare match A to generate a tick interrupt.
+ */
+static void prvSetupTimerInterrupt( void )
+{
+uint32_t ulCompareMatch;
+uint8_t ucHighByte, ucLowByte;
+
+    /* Using 16bit timer 1 to generate the tick.  Correct fuses must be
+    selected for the configCPU_CLOCK_HZ clock. */
+
+    ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ;
+
+    /* We only have 16 bits so have to scale to get our required tick rate. */
+    ulCompareMatch /= portCLOCK_PRESCALER;
+
+    /* Adjust for correct value. */
+    ulCompareMatch -= ( uint32_t ) 1;
+
+    /* Setup compare match value for compare match A.  Interrupts are disabled
+    before this is called so we need not worry here. */
+    ucLowByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff );
+    ulCompareMatch >>= 8;
+    ucHighByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff );
+    OCR1AH = ucHighByte;
+    OCR1AL = ucLowByte;
+
+    /* Setup clock source and compare match behaviour. */
+    ucLowByte = portCLEAR_COUNTER_ON_MATCH | portPRESCALE_64;
+    TCCR1B = ucLowByte;
+
+    /* Enable the interrupt - this is okay as interrupt are currently globally
+    disabled. */
+    TIMSK |= portCOMPARE_MATCH_A_INTERRUPT_ENABLE;
+}
+/*-----------------------------------------------------------*/
+
+#if configUSE_PREEMPTION == 1
+
+    /*
+     * Tick ISR for preemptive scheduler.  We can use a __task attribute as
+     * the context is saved at the start of vPortYieldFromTick().  The tick
+     * count is incremented after the context is saved.
+     */
+    __task void SIG_OUTPUT_COMPARE1A( void )
+    {
+        vPortYieldFromTick();
+        asm( "reti" );
+    }
+
+#else
+
+    /*
+     * Tick ISR for the cooperative scheduler.  All this does is increment the
+     * tick count.  We don't need to switch context, this can only be done by
+     * manual calls to taskYIELD();
+     *
+     * THE INTERRUPT VECTOR IS POPULATED IN portmacro.s90.  DO NOT INSTALL
+     * IT HERE USING THE USUAL PRAGMA.
+     */
+    __interrupt void SIG_OUTPUT_COMPARE1A( void )
+    {
+        xTaskIncrementTick();
+    }
+#endif
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    portDISABLE_INTERRUPTS();
+    uxCriticalNesting++;
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    uxCriticalNesting--;
+    if( uxCriticalNesting == portNO_CRITICAL_NESTING )
+    {
+        portENABLE_INTERRUPTS();
+    }
+}
diff --git a/portable/IAR/ATMega323/portmacro.h b/portable/IAR/ATMega323/portmacro.h
index f118783..973d6d9 100644
--- a/portable/IAR/ATMega323/portmacro.h
+++ b/portable/IAR/ATMega323/portmacro.h
@@ -1,113 +1,111 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*

-Changes from V1.2.3

-

-	+ portCPU_CLOSK_HZ definition changed to 8MHz base 10, previously it

-	  base 16.

-*/

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		int

-#define portSTACK_TYPE	uint8_t

-#define portBASE_TYPE	char

-#define portPOINTER_SIZE_TYPE uint16_t

-

-typedef portSTACK_TYPE StackType_t;

-typedef signed char BaseType_t;

-typedef unsigned char UBaseType_t;

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-

-/*-----------------------------------------------------------*/

-

-/* Critical section management. */

-extern void vPortEnterCritical( void );

-extern void vPortExitCritical( void );

-#define portENTER_CRITICAL()	vPortEnterCritical()

-#define portEXIT_CRITICAL()		vPortExitCritical()

-

-#define portDISABLE_INTERRUPTS()	asm( "cli" )

-#define portENABLE_INTERRUPTS()		asm( "sei" )

-/*-----------------------------------------------------------*/

-

-/* Architecture specifics. */

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portBYTE_ALIGNMENT			1

-#define portNOP()					asm( "nop" )

-/*-----------------------------------------------------------*/

-

-/* Kernel utilities. */

-void vPortYield( void );

-#define portYIELD()	vPortYield()

-

-#ifdef IAR_MEGA_AVR

-	#define outb( PORT, VALUE ) PORT = VALUE

-#endif

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*
+Changes from V1.2.3
+
+    + portCPU_CLOSK_HZ definition changed to 8MHz base 10, previously it
+      base 16.
+*/
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       int
+#define portSTACK_TYPE  uint8_t
+#define portBASE_TYPE   char
+#define portPOINTER_SIZE_TYPE uint16_t
+
+typedef portSTACK_TYPE StackType_t;
+typedef signed char BaseType_t;
+typedef unsigned char UBaseType_t;
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+
+/*-----------------------------------------------------------*/
+
+/* Critical section management. */
+extern void vPortEnterCritical( void );
+extern void vPortExitCritical( void );
+#define portENTER_CRITICAL()    vPortEnterCritical()
+#define portEXIT_CRITICAL()     vPortExitCritical()
+
+#define portDISABLE_INTERRUPTS()    asm( "cli" )
+#define portENABLE_INTERRUPTS()     asm( "sei" )
+/*-----------------------------------------------------------*/
+
+/* Architecture specifics. */
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT          1
+#define portNOP()                   asm( "nop" )
+/*-----------------------------------------------------------*/
+
+/* Kernel utilities. */
+void vPortYield( void );
+#define portYIELD() vPortYield()
+
+#ifdef IAR_MEGA_AVR
+    #define outb( PORT, VALUE ) PORT = VALUE
+#endif
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/ATMega323/portmacro.s90 b/portable/IAR/ATMega323/portmacro.s90
index 71eb692..8c72f41 100644
--- a/portable/IAR/ATMega323/portmacro.s90
+++ b/portable/IAR/ATMega323/portmacro.s90
@@ -1,246 +1,245 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-#include <iom323.h>

-

-; Declare all extern symbols here - including any ISRs that are referenced in

-; the vector table.

-

-; ISR functions

-; -------------

-EXTERN SIG_OUTPUT_COMPARE1A

-EXTERN SIG_UART_RECV

-EXTERN SIG_UART_DATA

-

-

-; Functions used by scheduler

-; ---------------------------

-EXTERN vTaskSwitchContext

-EXTERN pxCurrentTCB

-EXTERN xTaskIncrementTick

-EXTERN uxCriticalNesting

-

-; Functions implemented in this file

-; ----------------------------------

-PUBLIC vPortYield

-PUBLIC vPortYieldFromTick

-PUBLIC vPortStart

-

-

-; Interrupt vector table.

-; -----------------------

-;

-; For simplicity the RTOS tick interrupt routine uses the __task keyword.

-; As the IAR compiler does not permit a function to be declared using both

-; __task and __interrupt, the use of __task necessitates that the interrupt

-; vector table be setup manually.

-;

-; To write an ISR, implement the ISR function using the __interrupt keyword

-; but do not install the interrupt using the "#pragma vector=ABC" method.

-; Instead manually place the name of the ISR in the vector table using an

-; ORG and jmp instruction as demonstrated below.

-; You will also have to add an EXTERN statement at the top of the file.

-

-	ASEG

-

-

-	ORG TIMER1_COMPA_vect				; Vector address

-		jmp SIG_OUTPUT_COMPARE1A		; ISR

-

-	ORG USART_RXC_vect					; Vector address

-		jmp SIG_UART_RECV				; ISR

-

-	ORG USART_UDRE_vect					; Vector address

-		jmp SIG_UART_DATA				; ISR

-

-

-	RSEG CODE

-

-

-

-; Saving and Restoring a Task Context and Task Switching

-; ------------------------------------------------------

-;

-; The IAR compiler does not fully support inline assembler, so saving and

-; restoring a task context has to be written in an asm file.

-;

-; vPortYield() and vPortYieldFromTick() are usually written in C.  Doing

-; so in this case would required calls to be made to portSAVE_CONTEXT() and

-; portRESTORE_CONTEXT().  This is dis-advantageous as the context switch

-; function would require two extra jump and return instructions over the

-; WinAVR equivalent.

-;

-; To avoid this I have opted to implement both vPortYield() and

-; vPortYieldFromTick() in this assembly file.  For convenience

-; portSAVE_CONTEXT and portRESTORE_CONTEXT are implemented as macros.

-

-portSAVE_CONTEXT MACRO

-	st	-y, r0			; First save the r0 register - we need to use this.

-	in	r0, SREG		; Obtain the SREG value so we can disable interrupts...

-	cli					; ... as soon as possible.

-	st	-y, r0			; Store the SREG as it was before we disabled interrupts.

-

-	in	r0, SPL			; Next store the hardware stack pointer.  The IAR...

-	st	-y, r0			; ... compiler uses the hardware stack as a call stack ...

-	in	r0, SPH			; ...  only.

-	st	-y, r0

-

-	st	-y, r1			; Now store the rest of the registers.  Dont store the ...

-	st	-y, r2			; ... the Y register here as it is used as the software

-	st	-y, r3			; stack pointer and will get saved into the TCB.

-	st	-y, r4

-	st	-y, r5

-	st	-y, r6

-	st	-y, r7

-	st	-y, r8

-	st	-y, r9

-	st	-y, r10

-	st	-y, r11

-	st	-y, r12

-	st	-y, r13

-	st	-y, r14

-	st	-y, r15

-	st	-y, r16

-	st	-y, r17

-	st	-y, r18

-	st	-y, r19

-	st	-y, r20

-	st	-y, r21

-	st	-y, r22

-	st	-y, r23

-	st	-y, r24

-	st	-y, r25

-	st	-y, r26

-	st	-y, r27

-	st	-y, r30

-	st	-y, r31

-	lds r0, uxCriticalNesting

-	st	-y, r0					; Store the critical nesting counter.

-

-	lds	r26, pxCurrentTCB		; Finally save the software stack pointer (Y ...

-	lds	r27, pxCurrentTCB + 1	; ... register) into the TCB.

-	st	x+, r28

-	st	x+, r29

-

-	ENDM

-

-

-portRESTORE_CONTEXT MACRO

-	lds	r26, pxCurrentTCB

-	lds	r27, pxCurrentTCB + 1	; Restore the software stack pointer from ...

-	ld	r28, x+					; the TCB into the software stack pointer (...

-	ld	r29, x+					; ... the Y register).

-

-	ld	r0, y+

-	sts	uxCriticalNesting, r0

-	ld	r31, y+					; Restore the registers down to R0.  The Y

-	ld	r30, y+					; register is missing from this list as it

-	ld	r27, y+					; has already been restored.

-	ld	r26, y+

-	ld	r25, y+

-	ld	r24, y+

-	ld	r23, y+

-	ld	r22, y+

-	ld	r21, y+

-	ld	r20, y+

-	ld	r19, y+

-	ld	r18, y+

-	ld	r17, y+

-	ld	r16, y+

-	ld	r15, y+

-	ld	r14, y+

-	ld	r13, y+

-	ld	r12, y+

-	ld	r11, y+

-	ld	r10, y+

-	ld	r9, y+

-	ld	r8, y+

-	ld	r7, y+

-	ld	r6, y+

-	ld	r5, y+

-	ld	r4, y+

-	ld	r3, y+

-	ld	r2, y+

-	ld	r1, y+

-

-	ld	r0, y+					; The next thing on the stack is the ...

-	out	SPH, r0					; ... hardware stack pointer.

-	ld	r0, y+

-	out	SPL, r0

-

-	ld	r0, y+					; Next there is the SREG register.

-	out SREG, r0

-

-	ld	r0, y+					; Finally we have finished with r0, so restore r0.

-

-	ENDM

-

-

-

-; vPortYield() and vPortYieldFromTick()

-; -------------------------------------

-;

-; Manual and preemptive context switch functions respectively.

-; The IAR compiler does not fully support inline assembler,

-; so these are implemented here rather than the more usually

-; place of within port.c.

-

-vPortYield:

-	portSAVE_CONTEXT			; Save the context of the current task.

-	call vTaskSwitchContext		; Call the scheduler.

-	portRESTORE_CONTEXT			; Restore the context of whichever task the ...

-	ret							; ... scheduler decided should run.

-

-vPortYieldFromTick:

-	portSAVE_CONTEXT			; Save the context of the current task.

-	call xTaskIncrementTick		; Call the timer tick function.

-	tst r16

-	breq SkipTaskSwitch

-	call vTaskSwitchContext		; Call the scheduler.

-SkipTaskSwitch:

-	portRESTORE_CONTEXT			; Restore the context of whichever task the ...

-	ret							; ... scheduler decided should run.

-

-; vPortStart()

-; ------------

-;

-; Again due to the lack of inline assembler, this is required

-; to get access to the portRESTORE_CONTEXT macro.

-

-vPortStart:

-	portRESTORE_CONTEXT

-	ret

-

-

-; Just a filler for unused interrupt vectors.

-vNoISR:

-	reti

-

-

-	END

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+#include <iom323.h>
+
+; Declare all extern symbols here - including any ISRs that are referenced in
+; the vector table.
+
+; ISR functions
+; -------------
+EXTERN SIG_OUTPUT_COMPARE1A
+EXTERN SIG_UART_RECV
+EXTERN SIG_UART_DATA
+
+
+; Functions used by scheduler
+; ---------------------------
+EXTERN vTaskSwitchContext
+EXTERN pxCurrentTCB
+EXTERN xTaskIncrementTick
+EXTERN uxCriticalNesting
+
+; Functions implemented in this file
+; ----------------------------------
+PUBLIC vPortYield
+PUBLIC vPortYieldFromTick
+PUBLIC vPortStart
+
+
+; Interrupt vector table.
+; -----------------------
+;
+; For simplicity the RTOS tick interrupt routine uses the __task keyword.
+; As the IAR compiler does not permit a function to be declared using both
+; __task and __interrupt, the use of __task necessitates that the interrupt
+; vector table be setup manually.
+;
+; To write an ISR, implement the ISR function using the __interrupt keyword
+; but do not install the interrupt using the "#pragma vector=ABC" method.
+; Instead manually place the name of the ISR in the vector table using an
+; ORG and jmp instruction as demonstrated below.
+; You will also have to add an EXTERN statement at the top of the file.
+
+    ASEG
+
+
+    ORG TIMER1_COMPA_vect               ; Vector address
+        jmp SIG_OUTPUT_COMPARE1A        ; ISR
+
+    ORG USART_RXC_vect                  ; Vector address
+        jmp SIG_UART_RECV               ; ISR
+
+    ORG USART_UDRE_vect                 ; Vector address
+        jmp SIG_UART_DATA               ; ISR
+
+
+    RSEG CODE
+
+
+
+; Saving and Restoring a Task Context and Task Switching
+; ------------------------------------------------------
+;
+; The IAR compiler does not fully support inline assembler, so saving and
+; restoring a task context has to be written in an asm file.
+;
+; vPortYield() and vPortYieldFromTick() are usually written in C.  Doing
+; so in this case would required calls to be made to portSAVE_CONTEXT() and
+; portRESTORE_CONTEXT().  This is dis-advantageous as the context switch
+; function would require two extra jump and return instructions over the
+; WinAVR equivalent.
+;
+; To avoid this I have opted to implement both vPortYield() and
+; vPortYieldFromTick() in this assembly file.  For convenience
+; portSAVE_CONTEXT and portRESTORE_CONTEXT are implemented as macros.
+
+portSAVE_CONTEXT MACRO
+    st  -y, r0          ; First save the r0 register - we need to use this.
+    in  r0, SREG        ; Obtain the SREG value so we can disable interrupts...
+    cli                 ; ... as soon as possible.
+    st  -y, r0          ; Store the SREG as it was before we disabled interrupts.
+
+    in  r0, SPL         ; Next store the hardware stack pointer.  The IAR...
+    st  -y, r0          ; ... compiler uses the hardware stack as a call stack ...
+    in  r0, SPH         ; ...  only.
+    st  -y, r0
+
+    st  -y, r1          ; Now store the rest of the registers.  Dont store the ...
+    st  -y, r2          ; ... the Y register here as it is used as the software
+    st  -y, r3          ; stack pointer and will get saved into the TCB.
+    st  -y, r4
+    st  -y, r5
+    st  -y, r6
+    st  -y, r7
+    st  -y, r8
+    st  -y, r9
+    st  -y, r10
+    st  -y, r11
+    st  -y, r12
+    st  -y, r13
+    st  -y, r14
+    st  -y, r15
+    st  -y, r16
+    st  -y, r17
+    st  -y, r18
+    st  -y, r19
+    st  -y, r20
+    st  -y, r21
+    st  -y, r22
+    st  -y, r23
+    st  -y, r24
+    st  -y, r25
+    st  -y, r26
+    st  -y, r27
+    st  -y, r30
+    st  -y, r31
+    lds r0, uxCriticalNesting
+    st  -y, r0                  ; Store the critical nesting counter.
+
+    lds r26, pxCurrentTCB       ; Finally save the software stack pointer (Y ...
+    lds r27, pxCurrentTCB + 1   ; ... register) into the TCB.
+    st  x+, r28
+    st  x+, r29
+
+    ENDM
+
+
+portRESTORE_CONTEXT MACRO
+    lds r26, pxCurrentTCB
+    lds r27, pxCurrentTCB + 1   ; Restore the software stack pointer from ...
+    ld  r28, x+                 ; the TCB into the software stack pointer (...
+    ld  r29, x+                 ; ... the Y register).
+
+    ld  r0, y+
+    sts uxCriticalNesting, r0
+    ld  r31, y+                 ; Restore the registers down to R0.  The Y
+    ld  r30, y+                 ; register is missing from this list as it
+    ld  r27, y+                 ; has already been restored.
+    ld  r26, y+
+    ld  r25, y+
+    ld  r24, y+
+    ld  r23, y+
+    ld  r22, y+
+    ld  r21, y+
+    ld  r20, y+
+    ld  r19, y+
+    ld  r18, y+
+    ld  r17, y+
+    ld  r16, y+
+    ld  r15, y+
+    ld  r14, y+
+    ld  r13, y+
+    ld  r12, y+
+    ld  r11, y+
+    ld  r10, y+
+    ld  r9, y+
+    ld  r8, y+
+    ld  r7, y+
+    ld  r6, y+
+    ld  r5, y+
+    ld  r4, y+
+    ld  r3, y+
+    ld  r2, y+
+    ld  r1, y+
+
+    ld  r0, y+                  ; The next thing on the stack is the ...
+    out SPH, r0                 ; ... hardware stack pointer.
+    ld  r0, y+
+    out SPL, r0
+
+    ld  r0, y+                  ; Next there is the SREG register.
+    out SREG, r0
+
+    ld  r0, y+                  ; Finally we have finished with r0, so restore r0.
+
+    ENDM
+
+
+
+; vPortYield() and vPortYieldFromTick()
+; -------------------------------------
+;
+; Manual and preemptive context switch functions respectively.
+; The IAR compiler does not fully support inline assembler,
+; so these are implemented here rather than the more usually
+; place of within port.c.
+
+vPortYield:
+    portSAVE_CONTEXT            ; Save the context of the current task.
+    call vTaskSwitchContext     ; Call the scheduler.
+    portRESTORE_CONTEXT         ; Restore the context of whichever task the ...
+    ret                         ; ... scheduler decided should run.
+
+vPortYieldFromTick:
+    portSAVE_CONTEXT            ; Save the context of the current task.
+    call xTaskIncrementTick     ; Call the timer tick function.
+    tst r16
+    breq SkipTaskSwitch
+    call vTaskSwitchContext     ; Call the scheduler.
+SkipTaskSwitch:
+    portRESTORE_CONTEXT         ; Restore the context of whichever task the ...
+    ret                         ; ... scheduler decided should run.
+
+; vPortStart()
+; ------------
+;
+; Again due to the lack of inline assembler, this is required
+; to get access to the portRESTORE_CONTEXT macro.
+
+vPortStart:
+    portRESTORE_CONTEXT
+    ret
+
+
+; Just a filler for unused interrupt vectors.
+vNoISR:
+    reti
+
+
+    END
diff --git a/portable/IAR/AVR32_UC3/exception.s82 b/portable/IAR/AVR32_UC3/exception.s82
index 1c9a83a..12012e4 100644
--- a/portable/IAR/AVR32_UC3/exception.s82
+++ b/portable/IAR/AVR32_UC3/exception.s82
@@ -1,340 +1,340 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT AND BSD-3-Clause

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*This file is prepared for Doxygen automatic documentation generation.*/

-/*! \file *********************************************************************

- *

- * \brief Exception and interrupt vectors.

- *

- * This file maps all events supported by an AVR32UC.

- *

- * - Compiler:           IAR EWAVR32

- * - Supported devices:  All AVR32UC devices with an INTC module can be used.

- * - AppNote:

- *

- * \author               Atmel Corporation (Now Microchip):

-                                          https://www.microchip.com \n

- *                       Support and FAQ: https://www.microchip.com/support

- *

- ******************************************************************************/

-

-/*

- * Copyright (c) 2007, Atmel Corporation All rights reserved.

- *

- * Redistribution and use in source and binary forms, with or without

- * modification, are permitted provided that the following conditions are met:

- *

- * 1. Redistributions of source code must retain the above copyright notice,

- * this list of conditions and the following disclaimer.

- *

- * 2. Redistributions in binary form must reproduce the above copyright notice,

- * this list of conditions and the following disclaimer in the documentation

- * and/or other materials provided with the distribution.

- *

- * 3. The name of ATMEL may not be used to endorse or promote products derived

- * from this software without specific prior written permission.

- *

- * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED

- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND

- * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,

- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES

- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND

- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

- */

-

-

-#include <avr32/io.h>

-#include "intc.h"

-

-

-//! @{

-//! \verbatim

-

-

-// Start of Exception Vector Table.

-

-  // EVBA must be aligned with a power of two strictly greater than the EVBA-

-  // relative offset of the last vector.

-  COMMON  EVTAB:CODE:ROOT(9)

-

-

-  // Force EVBA initialization.

-  EXTERN  ??init_EVBA

-  REQUIRE ??init_EVBA

-

-  // Export symbol.

-  PUBLIC  ??EVBA

-  PUBLIC  _evba

-??EVBA:

-_evba:

-

-        ORG 0x000

-        // Unrecoverable Exception.

-_handle_Unrecoverable_Exception:

-        rjmp $

-

-        ORG 0x004

-        // TLB Multiple Hit: UNUSED IN AVR32UC.

-_handle_TLB_Multiple_Hit:

-        rjmp $

-

-        ORG 0x008

-        // Bus Error Data Fetch.

-_handle_Bus_Error_Data_Fetch:

-        rjmp $

-

-        ORG 0x00C

-         // Bus Error Instruction Fetch.

-_handle_Bus_Error_Instruction_Fetch:

-        rjmp $

-

-        ORG 0x010

-        // NMI.

-_handle_NMI:

-        rjmp $

-

-        ORG 0x014

-        // Instruction Address.

-_handle_Instruction_Address:

-        rjmp $

-

-        ORG 0x018

-        // ITLB Protection.

-_handle_ITLB_Protection:

-        rjmp $

-

-        ORG 0x01C

-        // Breakpoint.

-_handle_Breakpoint:

-        rjmp $

-

-        ORG 0x020

-        // Illegal Opcode.

-_handle_Illegal_Opcode:

-        rjmp $

-

-        ORG 0x024

-        // Unimplemented Instruction.

-_handle_Unimplemented_Instruction:

-        rjmp $

-

-        ORG 0x028

-        // Privilege Violation.

-_handle_Privilege_Violation:

-        rjmp $

-

-        ORG 0x02C

-        // Floating-Point: UNUSED IN AVR32UC.

-_handle_Floating_Point:

-        rjmp $

-

-        ORG 0x030

-        // Coprocessor Absent: UNUSED IN AVR32UC.

-_handle_Coprocessor_Absent:

-        rjmp $

-

-        ORG 0x034

-        // Data Address (Read).

-_handle_Data_Address_Read:

-        rjmp $

-

-        ORG 0x038

-        // Data Address (Write).

-_handle_Data_Address_Write:

-        rjmp $

-

-        ORG 0x03C

-        // DTLB Protection (Read).

-_handle_DTLB_Protection_Read:

-        rjmp $

-

-        ORG 0x040

-        // DTLB Protection (Write).

-_handle_DTLB_Protection_Write:

-        rjmp $

-

-        ORG 0x044

-        // DTLB Modified: UNUSED IN AVR32UC.

-_handle_DTLB_Modified:

-        rjmp $

-

-        ORG 0x050

-        // ITLB Miss: UNUSED IN AVR32UC.

-_handle_ITLB_Miss:

-        rjmp $

-

-        ORG 0x060

-        // DTLB Miss (Read): UNUSED IN AVR32UC.

-_handle_DTLB_Miss_Read:

-        rjmp $

-

-        ORG 0x070

-        // DTLB Miss (Write): UNUSED IN AVR32UC.

-_handle_DTLB_Miss_Write:

-        rjmp $

-

-        ORG 0x100

-        // Supervisor Call.

-_handle_Supervisor_Call:

-        lddpc   pc, __SCALLYield

-

-

-// Interrupt support.

-// The interrupt controller must provide the offset address relative to EVBA.

-// Important note:

-//   All interrupts call a C function named _get_interrupt_handler.

-//   This function will read group and interrupt line number to then return in

-//   R12 a pointer to a user-provided interrupt handler.

-

-  ALIGN 2

-

-_int0:

-  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the

-  // CPU upon interrupt entry.

-#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.

-  mfsr    r12, AVR32_SR

-  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE

-  cp.w    r12, 110b

-  brlo    _int0_normal

-  lddsp   r12, sp[0 * 4]

-  stdsp   sp[6 * 4], r12

-  lddsp   r12, sp[1 * 4]

-  stdsp   sp[7 * 4], r12

-  lddsp   r12, sp[3 * 4]

-  sub     sp, -6 * 4

-  rete

-_int0_normal:

-#endif

-  mov     r12, 0  // Pass the int_lev parameter to the _get_interrupt_handler function.

-  mcall   __get_interrupt_handler

-  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.

-  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.

-  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.

-

-_int1:

-  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the

-  // CPU upon interrupt entry.

-#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.

-  mfsr    r12, AVR32_SR

-  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE

-  cp.w    r12, 110b

-  brlo    _int1_normal

-  lddsp   r12, sp[0 * 4]

-  stdsp   sp[6 * 4], r12

-  lddsp   r12, sp[1 * 4]

-  stdsp   sp[7 * 4], r12

-  lddsp   r12, sp[3 * 4]

-  sub     sp, -6 * 4

-  rete

-_int1_normal:

-#endif

-  mov     r12, 1  // Pass the int_lev parameter to the _get_interrupt_handler function.

-  mcall   __get_interrupt_handler

-  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.

-  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.

-  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.

-

-_int2:

-  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the

-  // CPU upon interrupt entry.

-#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.

-  mfsr    r12, AVR32_SR

-  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE

-  cp.w    r12, 110b

-  brlo    _int2_normal

-  lddsp   r12, sp[0 * 4]

-  stdsp   sp[6 * 4], r12

-  lddsp   r12, sp[1 * 4]

-  stdsp   sp[7 * 4], r12

-  lddsp   r12, sp[3 * 4]

-  sub     sp, -6 * 4

-  rete

-_int2_normal:

-#endif

-  mov     r12, 2  // Pass the int_lev parameter to the _get_interrupt_handler function.

-  mcall   __get_interrupt_handler

-  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.

-  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.

-  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.

-

-_int3:

-  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the

-  // CPU upon interrupt entry.

-#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.

-  mfsr    r12, AVR32_SR

-  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE

-  cp.w    r12, 110b

-  brlo    _int3_normal

-  lddsp   r12, sp[0 * 4]

-  stdsp   sp[6 * 4], r12

-  lddsp   r12, sp[1 * 4]

-  stdsp   sp[7 * 4], r12

-  lddsp   r12, sp[3 * 4]

-  sub     sp, -6 * 4

-  rete

-_int3_normal:

-#endif

-  mov     r12, 3  // Pass the int_lev parameter to the _get_interrupt_handler function.

-  mcall   __get_interrupt_handler

-  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.

-  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.

-  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.

-

-

-// Constant data area.

-

-  ALIGN 2

-

-  // Import symbols.

-  EXTERN  SCALLYield

-  EXTERN  _get_interrupt_handler

-__SCALLYield:

-  DC32  SCALLYield

-__get_interrupt_handler:

-  DC32  _get_interrupt_handler

-

-  // Values to store in the interrupt priority registers for the various interrupt priority levels.

-  // The interrupt priority registers contain the interrupt priority level and

-  // the EVBA-relative interrupt vector offset.

-  PUBLIC  ipr_val

-ipr_val:

-  DC32  (INT0 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int0 - _evba),\

-        (INT1 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int1 - _evba),\

-        (INT2 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int2 - _evba),\

-        (INT3 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int3 - _evba)

-

-

-  END

-

-

-//! \endverbatim

-//! @}

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT AND BSD-3-Clause
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*This file is prepared for Doxygen automatic documentation generation.*/
+/*! \file *********************************************************************
+ *
+ * \brief Exception and interrupt vectors.
+ *
+ * This file maps all events supported by an AVR32UC.
+ *
+ * - Compiler:           IAR EWAVR32
+ * - Supported devices:  All AVR32UC devices with an INTC module can be used.
+ * - AppNote:
+ *
+ * \author               Atmel Corporation (Now Microchip):
+                                          https://www.microchip.com \n
+ *                       Support and FAQ: https://www.microchip.com/support
+ *
+ ******************************************************************************/
+
+/*
+ * Copyright (c) 2007, Atmel Corporation All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of ATMEL may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
+ * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#include <avr32/io.h>
+#include "intc.h"
+
+
+//! @{
+//! \verbatim
+
+
+// Start of Exception Vector Table.
+
+  // EVBA must be aligned with a power of two strictly greater than the EVBA-
+  // relative offset of the last vector.
+  COMMON  EVTAB:CODE:ROOT(9)
+
+
+  // Force EVBA initialization.
+  EXTERN  ??init_EVBA
+  REQUIRE ??init_EVBA
+
+  // Export symbol.
+  PUBLIC  ??EVBA
+  PUBLIC  _evba
+??EVBA:
+_evba:
+
+        ORG 0x000
+        // Unrecoverable Exception.
+_handle_Unrecoverable_Exception:
+        rjmp $
+
+        ORG 0x004
+        // TLB Multiple Hit: UNUSED IN AVR32UC.
+_handle_TLB_Multiple_Hit:
+        rjmp $
+
+        ORG 0x008
+        // Bus Error Data Fetch.
+_handle_Bus_Error_Data_Fetch:
+        rjmp $
+
+        ORG 0x00C
+         // Bus Error Instruction Fetch.
+_handle_Bus_Error_Instruction_Fetch:
+        rjmp $
+
+        ORG 0x010
+        // NMI.
+_handle_NMI:
+        rjmp $
+
+        ORG 0x014
+        // Instruction Address.
+_handle_Instruction_Address:
+        rjmp $
+
+        ORG 0x018
+        // ITLB Protection.
+_handle_ITLB_Protection:
+        rjmp $
+
+        ORG 0x01C
+        // Breakpoint.
+_handle_Breakpoint:
+        rjmp $
+
+        ORG 0x020
+        // Illegal Opcode.
+_handle_Illegal_Opcode:
+        rjmp $
+
+        ORG 0x024
+        // Unimplemented Instruction.
+_handle_Unimplemented_Instruction:
+        rjmp $
+
+        ORG 0x028
+        // Privilege Violation.
+_handle_Privilege_Violation:
+        rjmp $
+
+        ORG 0x02C
+        // Floating-Point: UNUSED IN AVR32UC.
+_handle_Floating_Point:
+        rjmp $
+
+        ORG 0x030
+        // Coprocessor Absent: UNUSED IN AVR32UC.
+_handle_Coprocessor_Absent:
+        rjmp $
+
+        ORG 0x034
+        // Data Address (Read).
+_handle_Data_Address_Read:
+        rjmp $
+
+        ORG 0x038
+        // Data Address (Write).
+_handle_Data_Address_Write:
+        rjmp $
+
+        ORG 0x03C
+        // DTLB Protection (Read).
+_handle_DTLB_Protection_Read:
+        rjmp $
+
+        ORG 0x040
+        // DTLB Protection (Write).
+_handle_DTLB_Protection_Write:
+        rjmp $
+
+        ORG 0x044
+        // DTLB Modified: UNUSED IN AVR32UC.
+_handle_DTLB_Modified:
+        rjmp $
+
+        ORG 0x050
+        // ITLB Miss: UNUSED IN AVR32UC.
+_handle_ITLB_Miss:
+        rjmp $
+
+        ORG 0x060
+        // DTLB Miss (Read): UNUSED IN AVR32UC.
+_handle_DTLB_Miss_Read:
+        rjmp $
+
+        ORG 0x070
+        // DTLB Miss (Write): UNUSED IN AVR32UC.
+_handle_DTLB_Miss_Write:
+        rjmp $
+
+        ORG 0x100
+        // Supervisor Call.
+_handle_Supervisor_Call:
+        lddpc   pc, __SCALLYield
+
+
+// Interrupt support.
+// The interrupt controller must provide the offset address relative to EVBA.
+// Important note:
+//   All interrupts call a C function named _get_interrupt_handler.
+//   This function will read group and interrupt line number to then return in
+//   R12 a pointer to a user-provided interrupt handler.
+
+  ALIGN 2
+
+_int0:
+  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the
+  // CPU upon interrupt entry.
+#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.
+  mfsr    r12, AVR32_SR
+  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE
+  cp.w    r12, 110b
+  brlo    _int0_normal
+  lddsp   r12, sp[0 * 4]
+  stdsp   sp[6 * 4], r12
+  lddsp   r12, sp[1 * 4]
+  stdsp   sp[7 * 4], r12
+  lddsp   r12, sp[3 * 4]
+  sub     sp, -6 * 4
+  rete
+_int0_normal:
+#endif
+  mov     r12, 0  // Pass the int_lev parameter to the _get_interrupt_handler function.
+  mcall   __get_interrupt_handler
+  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.
+  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.
+  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.
+
+_int1:
+  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the
+  // CPU upon interrupt entry.
+#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.
+  mfsr    r12, AVR32_SR
+  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE
+  cp.w    r12, 110b
+  brlo    _int1_normal
+  lddsp   r12, sp[0 * 4]
+  stdsp   sp[6 * 4], r12
+  lddsp   r12, sp[1 * 4]
+  stdsp   sp[7 * 4], r12
+  lddsp   r12, sp[3 * 4]
+  sub     sp, -6 * 4
+  rete
+_int1_normal:
+#endif
+  mov     r12, 1  // Pass the int_lev parameter to the _get_interrupt_handler function.
+  mcall   __get_interrupt_handler
+  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.
+  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.
+  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.
+
+_int2:
+  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the
+  // CPU upon interrupt entry.
+#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.
+  mfsr    r12, AVR32_SR
+  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE
+  cp.w    r12, 110b
+  brlo    _int2_normal
+  lddsp   r12, sp[0 * 4]
+  stdsp   sp[6 * 4], r12
+  lddsp   r12, sp[1 * 4]
+  stdsp   sp[7 * 4], r12
+  lddsp   r12, sp[3 * 4]
+  sub     sp, -6 * 4
+  rete
+_int2_normal:
+#endif
+  mov     r12, 2  // Pass the int_lev parameter to the _get_interrupt_handler function.
+  mcall   __get_interrupt_handler
+  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.
+  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.
+  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.
+
+_int3:
+  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the
+  // CPU upon interrupt entry.
+#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.
+  mfsr    r12, AVR32_SR
+  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE
+  cp.w    r12, 110b
+  brlo    _int3_normal
+  lddsp   r12, sp[0 * 4]
+  stdsp   sp[6 * 4], r12
+  lddsp   r12, sp[1 * 4]
+  stdsp   sp[7 * 4], r12
+  lddsp   r12, sp[3 * 4]
+  sub     sp, -6 * 4
+  rete
+_int3_normal:
+#endif
+  mov     r12, 3  // Pass the int_lev parameter to the _get_interrupt_handler function.
+  mcall   __get_interrupt_handler
+  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.
+  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.
+  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.
+
+
+// Constant data area.
+
+  ALIGN 2
+
+  // Import symbols.
+  EXTERN  SCALLYield
+  EXTERN  _get_interrupt_handler
+__SCALLYield:
+  DC32  SCALLYield
+__get_interrupt_handler:
+  DC32  _get_interrupt_handler
+
+  // Values to store in the interrupt priority registers for the various interrupt priority levels.
+  // The interrupt priority registers contain the interrupt priority level and
+  // the EVBA-relative interrupt vector offset.
+  PUBLIC  ipr_val
+ipr_val:
+  DC32  (INT0 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int0 - _evba),\
+        (INT1 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int1 - _evba),\
+        (INT2 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int2 - _evba),\
+        (INT3 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int3 - _evba)
+
+
+  END
+
+
+//! \endverbatim
+//! @}
diff --git a/portable/IAR/AVR32_UC3/port.c b/portable/IAR/AVR32_UC3/port.c
index 3cf4f0c..00d51af 100644
--- a/portable/IAR/AVR32_UC3/port.c
+++ b/portable/IAR/AVR32_UC3/port.c
@@ -1,435 +1,435 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT AND BSD-3-Clause

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*This file has been prepared for Doxygen automatic documentation generation.*/

-/*! \file *********************************************************************

- *

- * \brief FreeRTOS port source for AVR32 UC3.

- *

- * - Compiler:           IAR EWAVR32

- * - Supported devices:  All AVR32 devices can be used.

- * - AppNote:

- *

- * \author               Atmel Corporation (Now Microchip):

- *                                        https://www.microchip.com \n

- *                       Support and FAQ: https://www.microchip.com/support/

- *

- *****************************************************************************/

-

-/*

- * Copyright (c) 2007, Atmel Corporation All rights reserved.

- *

- * Redistribution and use in source and binary forms, with or without

- * modification, are permitted provided that the following conditions are met:

- *

- * 1. Redistributions of source code must retain the above copyright notice,

- * this list of conditions and the following disclaimer.

- *

- * 2. Redistributions in binary form must reproduce the above copyright notice,

- * this list of conditions and the following disclaimer in the documentation

- * and/or other materials provided with the distribution.

- *

- * 3. The name of ATMEL may not be used to endorse or promote products derived

- * from this software without specific prior written permission.

- *

- * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED

- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND

- * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,

- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES

- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND

- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

- */

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* AVR32 UC3 includes. */

-#include <avr32/io.h>

-#include <intrinsics.h>

-#include "gpio.h"

-

-#if configDBG

-	#include "usart.h"

-#endif

-

-#if( configTICK_USE_TC==1 )

-	#include "tc.h"

-#endif

-

-

-/* Constants required to setup the task context. */

-#define portINITIAL_SR            ( ( StackType_t ) 0x00400000 ) /* AVR32 : [M2:M0]=001 I1M=0 I0M=0, GM=0 */

-#define portINSTRUCTION_SIZE      ( ( StackType_t ) 0 )

-

-/* Each task maintains its own critical nesting variable. */

-#define portNO_CRITICAL_NESTING   ( ( uint32_t ) 0 )

-volatile uint32_t ulCriticalNesting = 9999UL;

-

-#if( configTICK_USE_TC==0 )

-	static void prvScheduleNextTick( void );

-#else

-	static void prvClearTcInt( void );

-#endif

-

-/* Setup the timer to generate the tick interrupts. */

-static void prvSetupTimerInterrupt( void );

-

-/*-----------------------------------------------------------*/

-

-/*

- * Low-level initialization routine called during startup, before the main

- * function.

- */

-int __low_level_init(void)

-{

-	#if configHEAP_INIT

-		#pragma segment = "HEAP"

-		BaseType_t *pxMem;

-	#endif

-

-	/* Enable exceptions. */

-	ENABLE_ALL_EXCEPTIONS();

-

-	/* Initialize interrupt handling. */

-	INTC_init_interrupts();

-

-	#if configHEAP_INIT

-	{

-		/* Initialize the heap used by malloc. */

-		for( pxMem = __segment_begin( "HEAP" ); pxMem < ( BaseType_t * ) __segment_end( "HEAP" ); )

-		{

-			*pxMem++ = 0xA5A5A5A5;

-		}

-	}

-	#endif

-

-	/* Code section present if and only if the debug trace is activated. */

-	#if configDBG

-	{

-		static const gpio_map_t DBG_USART_GPIO_MAP =

-		{

-			{ configDBG_USART_RX_PIN, configDBG_USART_RX_FUNCTION },

-			{ configDBG_USART_TX_PIN, configDBG_USART_TX_FUNCTION }

-		};

-

-		static const usart_options_t DBG_USART_OPTIONS =

-		{

-			.baudrate = configDBG_USART_BAUDRATE,

-			.charlength = 8,

-			.paritytype = USART_NO_PARITY,

-			.stopbits = USART_1_STOPBIT,

-			.channelmode = USART_NORMAL_CHMODE

-		};

-

-		/* Initialize the USART used for the debug trace with the configured parameters. */

-		extern volatile avr32_usart_t *volatile stdio_usart_base;

-		stdio_usart_base = configDBG_USART;

-		gpio_enable_module( DBG_USART_GPIO_MAP,

-		                    sizeof( DBG_USART_GPIO_MAP ) / sizeof( DBG_USART_GPIO_MAP[0] ) );

-		usart_init_rs232(configDBG_USART, &DBG_USART_OPTIONS, configCPU_CLOCK_HZ);

-	}

-	#endif

-

-	/* Request initialization of data segments. */

-	return 1;

-}

-/*-----------------------------------------------------------*/

-

-/* Added as there is no such function in FreeRTOS. */

-void *pvPortRealloc( void *pv, size_t xWantedSize )

-{

-void *pvReturn;

-

-	vTaskSuspendAll();

-	{

-		pvReturn = realloc( pv, xWantedSize );

-	}

-	xTaskResumeAll();

-

-	return pvReturn;

-}

-/*-----------------------------------------------------------*/

-

-/* The cooperative scheduler requires a normal IRQ service routine to

-simply increment the system tick. */

-/* The preemptive scheduler is defined as "naked" as the full context is saved

-on entry as part of the context switch. */

-#pragma shadow_registers = full   // Naked.

-static void vTick( void )

-{

-	/* Save the context of the interrupted task. */

-	portSAVE_CONTEXT_OS_INT();

-

-	#if( configTICK_USE_TC==1 )

-		/* Clear the interrupt flag. */

-		prvClearTcInt();

-	#else

-		/* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ)

-		clock cycles from now. */

-		prvScheduleNextTick();

-	#endif

-

-	/* Because FreeRTOS is not supposed to run with nested interrupts, put all OS

-	calls in a critical section . */

-	portENTER_CRITICAL();

-		xTaskIncrementTick();

-	portEXIT_CRITICAL();

-

-	/* Restore the context of the "elected task". */

-	portRESTORE_CONTEXT_OS_INT();

-}

-/*-----------------------------------------------------------*/

-

-#pragma shadow_registers = full   // Naked.

-void SCALLYield( void )

-{

-	/* Save the context of the interrupted task. */

-	portSAVE_CONTEXT_SCALL();

-	vTaskSwitchContext();

-	portRESTORE_CONTEXT_SCALL();

-}

-/*-----------------------------------------------------------*/

-

-/* The code generated by the GCC compiler uses the stack in different ways at

-different optimisation levels.  The interrupt flags can therefore not always

-be saved to the stack.  Instead the critical section nesting level is stored

-in a variable, which is then saved as part of the stack context. */

-#pragma optimize = no_inline

-void vPortEnterCritical( void )

-{

-	/* Disable interrupts */

-	portDISABLE_INTERRUPTS();

-

-	/* Now interrupts are disabled ulCriticalNesting can be accessed

-	 directly.  Increment ulCriticalNesting to keep a count of how many times

-	 portENTER_CRITICAL() has been called. */

-	ulCriticalNesting++;

-}

-/*-----------------------------------------------------------*/

-

-#pragma optimize = no_inline

-void vPortExitCritical( void )

-{

-	if(ulCriticalNesting > portNO_CRITICAL_NESTING)

-	{

-		ulCriticalNesting--;

-		if( ulCriticalNesting == portNO_CRITICAL_NESTING )

-		{

-			/* Enable all interrupt/exception. */

-			portENABLE_INTERRUPTS();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-	/* Setup the initial stack of the task.  The stack is set exactly as

-	expected by the portRESTORE_CONTEXT() macro. */

-

-	/* When the task starts, it will expect to find the function parameter in R12. */

-	pxTopOfStack--;

-	*pxTopOfStack-- = ( StackType_t ) 0x08080808;					/* R8 */

-	*pxTopOfStack-- = ( StackType_t ) 0x09090909;					/* R9 */

-	*pxTopOfStack-- = ( StackType_t ) 0x0A0A0A0A;					/* R10 */

-	*pxTopOfStack-- = ( StackType_t ) 0x0B0B0B0B;					/* R11 */

-	*pxTopOfStack-- = ( StackType_t ) pvParameters;					/* R12 */

-	*pxTopOfStack-- = ( StackType_t ) 0xDEADBEEF;					/* R14/LR */

-	*pxTopOfStack-- = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; /* R15/PC */

-	*pxTopOfStack-- = ( StackType_t ) portINITIAL_SR;				/* SR */

-	*pxTopOfStack-- = ( StackType_t ) 0xFF0000FF;					/* R0 */

-	*pxTopOfStack-- = ( StackType_t ) 0x01010101;					/* R1 */

-	*pxTopOfStack-- = ( StackType_t ) 0x02020202;					/* R2 */

-	*pxTopOfStack-- = ( StackType_t ) 0x03030303;					/* R3 */

-	*pxTopOfStack-- = ( StackType_t ) 0x04040404;					/* R4 */

-	*pxTopOfStack-- = ( StackType_t ) 0x05050505;					/* R5 */

-	*pxTopOfStack-- = ( StackType_t ) 0x06060606;					/* R6 */

-	*pxTopOfStack-- = ( StackType_t ) 0x07070707;					/* R7 */

-	*pxTopOfStack = ( StackType_t ) portNO_CRITICAL_NESTING;			/* ulCriticalNesting */

-

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-	/* Start the timer that generates the tick ISR.  Interrupts are disabled

-	here already. */

-	prvSetupTimerInterrupt();

-

-	/* Start the first task. */

-	portRESTORE_CONTEXT();

-

-	/* Should not get here! */

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the AVR32 port will require this function as there

-	is nothing to return to.  */

-}

-/*-----------------------------------------------------------*/

-

-/* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ)

-clock cycles from now. */

-#if( configTICK_USE_TC==0 )

-	static void prvScheduleFirstTick(void)

-	{

-		uint32_t lCycles;

-

-		lCycles = Get_system_register(AVR32_COUNT);

-		lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ);

-		// If lCycles ends up to be 0, make it 1 so that the COMPARE and exception

-		// generation feature does not get disabled.

-		if(0 == lCycles)

-		{

-			lCycles++;

-		}

-		Set_system_register(AVR32_COMPARE, lCycles);

-	}

-

-	#pragma optimize = no_inline

-	static void prvScheduleNextTick(void)

-	{

-		uint32_t lCycles, lCount;

-

-		lCycles = Get_system_register(AVR32_COMPARE);

-		lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ);

-		// If lCycles ends up to be 0, make it 1 so that the COMPARE and exception

-		// generation feature does not get disabled.

-		if(0 == lCycles)

-		{

-			lCycles++;

-		}

-		lCount = Get_system_register(AVR32_COUNT);

-		if( lCycles < lCount )

-		{		// We missed a tick, recover for the next.

-			lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ);

-		}

-		Set_system_register(AVR32_COMPARE, lCycles);

-	}

-#else

-	#pragma optimize = no_inline

-	static void prvClearTcInt(void)

-	{

-		AVR32_TC.channel[configTICK_TC_CHANNEL].sr;

-	}

-#endif

-/*-----------------------------------------------------------*/

-

-/* Setup the timer to generate the tick interrupts. */

-static void prvSetupTimerInterrupt(void)

-{

-	#if( configTICK_USE_TC==1 )

-

-		volatile avr32_tc_t *tc = &AVR32_TC;

-

-		// Options for waveform genration.

-		tc_waveform_opt_t waveform_opt =

-		{

-		.channel  = configTICK_TC_CHANNEL,             /* Channel selection. */

-

-		.bswtrg   = TC_EVT_EFFECT_NOOP,                /* Software trigger effect on TIOB. */

-		.beevt    = TC_EVT_EFFECT_NOOP,                /* External event effect on TIOB. */

-		.bcpc     = TC_EVT_EFFECT_NOOP,                /* RC compare effect on TIOB. */

-		.bcpb     = TC_EVT_EFFECT_NOOP,                /* RB compare effect on TIOB. */

-

-		.aswtrg   = TC_EVT_EFFECT_NOOP,                /* Software trigger effect on TIOA. */

-		.aeevt    = TC_EVT_EFFECT_NOOP,                /* External event effect on TIOA. */

-		.acpc     = TC_EVT_EFFECT_NOOP,                /* RC compare effect on TIOA: toggle. */

-		.acpa     = TC_EVT_EFFECT_NOOP,                /* RA compare effect on TIOA: toggle (other possibilities are none, set and clear). */

-

-		.wavsel   = TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER,/* Waveform selection: Up mode without automatic trigger on RC compare. */

-		.enetrg   = FALSE,                             /* External event trigger enable. */

-		.eevt     = 0,                                 /* External event selection. */

-		.eevtedg  = TC_SEL_NO_EDGE,                    /* External event edge selection. */

-		.cpcdis   = FALSE,                             /* Counter disable when RC compare. */

-		.cpcstop  = FALSE,                             /* Counter clock stopped with RC compare. */

-

-		.burst    = FALSE,                             /* Burst signal selection. */

-		.clki     = FALSE,                             /* Clock inversion. */

-		.tcclks   = TC_CLOCK_SOURCE_TC2                /* Internal source clock 2. */

-		};

-

-		tc_interrupt_t tc_interrupt =

-		{

-			.etrgs=0,

-			.ldrbs=0,

-			.ldras=0,

-			.cpcs =1,

-			.cpbs =0,

-			.cpas =0,

-			.lovrs=0,

-			.covfs=0,

-		};

-

-	#endif

-

-	/* Disable all interrupt/exception. */

-	portDISABLE_INTERRUPTS();

-

-	/* Register the compare interrupt handler to the interrupt controller and

-	enable the compare interrupt. */

-

-	#if( configTICK_USE_TC==1 )

-	{

-		INTC_register_interrupt((__int_handler)&vTick, configTICK_TC_IRQ, INT0);

-

-		/* Initialize the timer/counter. */

-		tc_init_waveform(tc, &waveform_opt);

-

-		/* Set the compare triggers.

-		Remember TC counter is 16-bits, so counting second is not possible!

-		That's why we configure it to count ms. */

-		tc_write_rc( tc, configTICK_TC_CHANNEL, ( configPBA_CLOCK_HZ / 4) / configTICK_RATE_HZ );

-

-		tc_configure_interrupts( tc, configTICK_TC_CHANNEL, &tc_interrupt );

-

-		/* Start the timer/counter. */

-		tc_start(tc, configTICK_TC_CHANNEL);

-	}

-	#else

-	{

-		INTC_register_interrupt((__int_handler)&vTick, AVR32_CORE_COMPARE_IRQ, INT0);

-		prvScheduleFirstTick();

-	}

-	#endif

-}

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT AND BSD-3-Clause
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*This file has been prepared for Doxygen automatic documentation generation.*/
+/*! \file *********************************************************************
+ *
+ * \brief FreeRTOS port source for AVR32 UC3.
+ *
+ * - Compiler:           IAR EWAVR32
+ * - Supported devices:  All AVR32 devices can be used.
+ * - AppNote:
+ *
+ * \author               Atmel Corporation (Now Microchip):
+ *                                        https://www.microchip.com \n
+ *                       Support and FAQ: https://www.microchip.com/support/
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (c) 2007, Atmel Corporation All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of ATMEL may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
+ * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* AVR32 UC3 includes. */
+#include <avr32/io.h>
+#include <intrinsics.h>
+#include "gpio.h"
+
+#if configDBG
+    #include "usart.h"
+#endif
+
+#if( configTICK_USE_TC==1 )
+    #include "tc.h"
+#endif
+
+
+/* Constants required to setup the task context. */
+#define portINITIAL_SR            ( ( StackType_t ) 0x00400000 ) /* AVR32 : [M2:M0]=001 I1M=0 I0M=0, GM=0 */
+#define portINSTRUCTION_SIZE      ( ( StackType_t ) 0 )
+
+/* Each task maintains its own critical nesting variable. */
+#define portNO_CRITICAL_NESTING   ( ( uint32_t ) 0 )
+volatile uint32_t ulCriticalNesting = 9999UL;
+
+#if( configTICK_USE_TC==0 )
+    static void prvScheduleNextTick( void );
+#else
+    static void prvClearTcInt( void );
+#endif
+
+/* Setup the timer to generate the tick interrupts. */
+static void prvSetupTimerInterrupt( void );
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Low-level initialization routine called during startup, before the main
+ * function.
+ */
+int __low_level_init(void)
+{
+    #if configHEAP_INIT
+        #pragma segment = "HEAP"
+        BaseType_t *pxMem;
+    #endif
+
+    /* Enable exceptions. */
+    ENABLE_ALL_EXCEPTIONS();
+
+    /* Initialize interrupt handling. */
+    INTC_init_interrupts();
+
+    #if configHEAP_INIT
+    {
+        /* Initialize the heap used by malloc. */
+        for( pxMem = __segment_begin( "HEAP" ); pxMem < ( BaseType_t * ) __segment_end( "HEAP" ); )
+        {
+            *pxMem++ = 0xA5A5A5A5;
+        }
+    }
+    #endif
+
+    /* Code section present if and only if the debug trace is activated. */
+    #if configDBG
+    {
+        static const gpio_map_t DBG_USART_GPIO_MAP =
+        {
+            { configDBG_USART_RX_PIN, configDBG_USART_RX_FUNCTION },
+            { configDBG_USART_TX_PIN, configDBG_USART_TX_FUNCTION }
+        };
+
+        static const usart_options_t DBG_USART_OPTIONS =
+        {
+            .baudrate = configDBG_USART_BAUDRATE,
+            .charlength = 8,
+            .paritytype = USART_NO_PARITY,
+            .stopbits = USART_1_STOPBIT,
+            .channelmode = USART_NORMAL_CHMODE
+        };
+
+        /* Initialize the USART used for the debug trace with the configured parameters. */
+        extern volatile avr32_usart_t *volatile stdio_usart_base;
+        stdio_usart_base = configDBG_USART;
+        gpio_enable_module( DBG_USART_GPIO_MAP,
+                            sizeof( DBG_USART_GPIO_MAP ) / sizeof( DBG_USART_GPIO_MAP[0] ) );
+        usart_init_rs232(configDBG_USART, &DBG_USART_OPTIONS, configCPU_CLOCK_HZ);
+    }
+    #endif
+
+    /* Request initialization of data segments. */
+    return 1;
+}
+/*-----------------------------------------------------------*/
+
+/* Added as there is no such function in FreeRTOS. */
+void *pvPortRealloc( void *pv, size_t xWantedSize )
+{
+void *pvReturn;
+
+    vTaskSuspendAll();
+    {
+        pvReturn = realloc( pv, xWantedSize );
+    }
+    xTaskResumeAll();
+
+    return pvReturn;
+}
+/*-----------------------------------------------------------*/
+
+/* The cooperative scheduler requires a normal IRQ service routine to
+simply increment the system tick. */
+/* The preemptive scheduler is defined as "naked" as the full context is saved
+on entry as part of the context switch. */
+#pragma shadow_registers = full   // Naked.
+static void vTick( void )
+{
+    /* Save the context of the interrupted task. */
+    portSAVE_CONTEXT_OS_INT();
+
+    #if( configTICK_USE_TC==1 )
+        /* Clear the interrupt flag. */
+        prvClearTcInt();
+    #else
+        /* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ)
+        clock cycles from now. */
+        prvScheduleNextTick();
+    #endif
+
+    /* Because FreeRTOS is not supposed to run with nested interrupts, put all OS
+    calls in a critical section . */
+    portENTER_CRITICAL();
+        xTaskIncrementTick();
+    portEXIT_CRITICAL();
+
+    /* Restore the context of the "elected task". */
+    portRESTORE_CONTEXT_OS_INT();
+}
+/*-----------------------------------------------------------*/
+
+#pragma shadow_registers = full   // Naked.
+void SCALLYield( void )
+{
+    /* Save the context of the interrupted task. */
+    portSAVE_CONTEXT_SCALL();
+    vTaskSwitchContext();
+    portRESTORE_CONTEXT_SCALL();
+}
+/*-----------------------------------------------------------*/
+
+/* The code generated by the GCC compiler uses the stack in different ways at
+different optimisation levels.  The interrupt flags can therefore not always
+be saved to the stack.  Instead the critical section nesting level is stored
+in a variable, which is then saved as part of the stack context. */
+#pragma optimize = no_inline
+void vPortEnterCritical( void )
+{
+    /* Disable interrupts */
+    portDISABLE_INTERRUPTS();
+
+    /* Now interrupts are disabled ulCriticalNesting can be accessed
+     directly.  Increment ulCriticalNesting to keep a count of how many times
+     portENTER_CRITICAL() has been called. */
+    ulCriticalNesting++;
+}
+/*-----------------------------------------------------------*/
+
+#pragma optimize = no_inline
+void vPortExitCritical( void )
+{
+    if(ulCriticalNesting > portNO_CRITICAL_NESTING)
+    {
+        ulCriticalNesting--;
+        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
+        {
+            /* Enable all interrupt/exception. */
+            portENABLE_INTERRUPTS();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+    /* Setup the initial stack of the task.  The stack is set exactly as
+    expected by the portRESTORE_CONTEXT() macro. */
+
+    /* When the task starts, it will expect to find the function parameter in R12. */
+    pxTopOfStack--;
+    *pxTopOfStack-- = ( StackType_t ) 0x08080808;                   /* R8 */
+    *pxTopOfStack-- = ( StackType_t ) 0x09090909;                   /* R9 */
+    *pxTopOfStack-- = ( StackType_t ) 0x0A0A0A0A;                   /* R10 */
+    *pxTopOfStack-- = ( StackType_t ) 0x0B0B0B0B;                   /* R11 */
+    *pxTopOfStack-- = ( StackType_t ) pvParameters;                 /* R12 */
+    *pxTopOfStack-- = ( StackType_t ) 0xDEADBEEF;                   /* R14/LR */
+    *pxTopOfStack-- = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; /* R15/PC */
+    *pxTopOfStack-- = ( StackType_t ) portINITIAL_SR;               /* SR */
+    *pxTopOfStack-- = ( StackType_t ) 0xFF0000FF;                   /* R0 */
+    *pxTopOfStack-- = ( StackType_t ) 0x01010101;                   /* R1 */
+    *pxTopOfStack-- = ( StackType_t ) 0x02020202;                   /* R2 */
+    *pxTopOfStack-- = ( StackType_t ) 0x03030303;                   /* R3 */
+    *pxTopOfStack-- = ( StackType_t ) 0x04040404;                   /* R4 */
+    *pxTopOfStack-- = ( StackType_t ) 0x05050505;                   /* R5 */
+    *pxTopOfStack-- = ( StackType_t ) 0x06060606;                   /* R6 */
+    *pxTopOfStack-- = ( StackType_t ) 0x07070707;                   /* R7 */
+    *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_NESTING;            /* ulCriticalNesting */
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+    here already. */
+    prvSetupTimerInterrupt();
+
+    /* Start the first task. */
+    portRESTORE_CONTEXT();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the AVR32 port will require this function as there
+    is nothing to return to.  */
+}
+/*-----------------------------------------------------------*/
+
+/* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ)
+clock cycles from now. */
+#if( configTICK_USE_TC==0 )
+    static void prvScheduleFirstTick(void)
+    {
+        uint32_t lCycles;
+
+        lCycles = Get_system_register(AVR32_COUNT);
+        lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ);
+        // If lCycles ends up to be 0, make it 1 so that the COMPARE and exception
+        // generation feature does not get disabled.
+        if(0 == lCycles)
+        {
+            lCycles++;
+        }
+        Set_system_register(AVR32_COMPARE, lCycles);
+    }
+
+    #pragma optimize = no_inline
+    static void prvScheduleNextTick(void)
+    {
+        uint32_t lCycles, lCount;
+
+        lCycles = Get_system_register(AVR32_COMPARE);
+        lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ);
+        // If lCycles ends up to be 0, make it 1 so that the COMPARE and exception
+        // generation feature does not get disabled.
+        if(0 == lCycles)
+        {
+            lCycles++;
+        }
+        lCount = Get_system_register(AVR32_COUNT);
+        if( lCycles < lCount )
+        {       // We missed a tick, recover for the next.
+            lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ);
+        }
+        Set_system_register(AVR32_COMPARE, lCycles);
+    }
+#else
+    #pragma optimize = no_inline
+    static void prvClearTcInt(void)
+    {
+        AVR32_TC.channel[configTICK_TC_CHANNEL].sr;
+    }
+#endif
+/*-----------------------------------------------------------*/
+
+/* Setup the timer to generate the tick interrupts. */
+static void prvSetupTimerInterrupt(void)
+{
+    #if( configTICK_USE_TC==1 )
+
+        volatile avr32_tc_t *tc = &AVR32_TC;
+
+        // Options for waveform genration.
+        tc_waveform_opt_t waveform_opt =
+        {
+        .channel  = configTICK_TC_CHANNEL,             /* Channel selection. */
+
+        .bswtrg   = TC_EVT_EFFECT_NOOP,                /* Software trigger effect on TIOB. */
+        .beevt    = TC_EVT_EFFECT_NOOP,                /* External event effect on TIOB. */
+        .bcpc     = TC_EVT_EFFECT_NOOP,                /* RC compare effect on TIOB. */
+        .bcpb     = TC_EVT_EFFECT_NOOP,                /* RB compare effect on TIOB. */
+
+        .aswtrg   = TC_EVT_EFFECT_NOOP,                /* Software trigger effect on TIOA. */
+        .aeevt    = TC_EVT_EFFECT_NOOP,                /* External event effect on TIOA. */
+        .acpc     = TC_EVT_EFFECT_NOOP,                /* RC compare effect on TIOA: toggle. */
+        .acpa     = TC_EVT_EFFECT_NOOP,                /* RA compare effect on TIOA: toggle (other possibilities are none, set and clear). */
+
+        .wavsel   = TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER,/* Waveform selection: Up mode without automatic trigger on RC compare. */
+        .enetrg   = FALSE,                             /* External event trigger enable. */
+        .eevt     = 0,                                 /* External event selection. */
+        .eevtedg  = TC_SEL_NO_EDGE,                    /* External event edge selection. */
+        .cpcdis   = FALSE,                             /* Counter disable when RC compare. */
+        .cpcstop  = FALSE,                             /* Counter clock stopped with RC compare. */
+
+        .burst    = FALSE,                             /* Burst signal selection. */
+        .clki     = FALSE,                             /* Clock inversion. */
+        .tcclks   = TC_CLOCK_SOURCE_TC2                /* Internal source clock 2. */
+        };
+
+        tc_interrupt_t tc_interrupt =
+        {
+            .etrgs=0,
+            .ldrbs=0,
+            .ldras=0,
+            .cpcs =1,
+            .cpbs =0,
+            .cpas =0,
+            .lovrs=0,
+            .covfs=0,
+        };
+
+    #endif
+
+    /* Disable all interrupt/exception. */
+    portDISABLE_INTERRUPTS();
+
+    /* Register the compare interrupt handler to the interrupt controller and
+    enable the compare interrupt. */
+
+    #if( configTICK_USE_TC==1 )
+    {
+        INTC_register_interrupt((__int_handler)&vTick, configTICK_TC_IRQ, INT0);
+
+        /* Initialize the timer/counter. */
+        tc_init_waveform(tc, &waveform_opt);
+
+        /* Set the compare triggers.
+        Remember TC counter is 16-bits, so counting second is not possible!
+        That's why we configure it to count ms. */
+        tc_write_rc( tc, configTICK_TC_CHANNEL, ( configPBA_CLOCK_HZ / 4) / configTICK_RATE_HZ );
+
+        tc_configure_interrupts( tc, configTICK_TC_CHANNEL, &tc_interrupt );
+
+        /* Start the timer/counter. */
+        tc_start(tc, configTICK_TC_CHANNEL);
+    }
+    #else
+    {
+        INTC_register_interrupt((__int_handler)&vTick, AVR32_CORE_COMPARE_IRQ, INT0);
+        prvScheduleFirstTick();
+    }
+    #endif
+}
diff --git a/portable/IAR/AVR32_UC3/portmacro.h b/portable/IAR/AVR32_UC3/portmacro.h
index d7a2d93..f2d02e2 100644
--- a/portable/IAR/AVR32_UC3/portmacro.h
+++ b/portable/IAR/AVR32_UC3/portmacro.h
@@ -1,684 +1,684 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT AND BSD-3-Clause

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*This file has been prepared for Doxygen automatic documentation generation.*/

-/*! \file *********************************************************************

- *

- * \brief FreeRTOS port header for AVR32 UC3.

- *

- * - Compiler:           IAR EWAVR32

- * - Supported devices:  All AVR32 devices can be used.

- * - AppNote:

- *

- * \author               Atmel Corporation (Now Microchip):

- *                                        https://www.microchip.com

- *                       Support and FAQ: https://www.microchip.com/support

- *

- *****************************************************************************/

-

-/*

- * Copyright (c) 2007, Atmel Corporation All rights reserved.

- *

- * Redistribution and use in source and binary forms, with or without

- * modification, are permitted provided that the following conditions are met:

- *

- * 1. Redistributions of source code must retain the above copyright notice,

- * this list of conditions and the following disclaimer.

- *

- * 2. Redistributions in binary form must reproduce the above copyright notice,

- * this list of conditions and the following disclaimer in the documentation

- * and/or other materials provided with the distribution.

- *

- * 3. The name of ATMEL may not be used to endorse or promote products derived

- * from this software without specific prior written permission.

- *

- * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED

- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND

- * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,

- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES

- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND

- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

- */

-

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-#include <avr32/io.h>

-#include "intc.h"

-#include "compiler.h"

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-

-/* Type definitions. */

-#define portCHAR        char

-#define portFLOAT       float

-#define portDOUBLE      double

-#define portLONG        long

-#define portSHORT       short

-#define portSTACK_TYPE  uint32_t

-#define portBASE_TYPE   long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-

-#define TASK_DELAY_MS(x)   ( (x)        /portTICK_PERIOD_MS )

-#define TASK_DELAY_S(x)    ( (x)*1000   /portTICK_PERIOD_MS )

-#define TASK_DELAY_MIN(x)  ( (x)*60*1000/portTICK_PERIOD_MS )

-

-#define configTICK_TC_IRQ             ATPASTE2(AVR32_TC_IRQ, configTICK_TC_CHANNEL)

-

-#if( configUSE_16_BIT_TICKS == 1 )

-  typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-  typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-/*-----------------------------------------------------------*/

-

-/* Architecture specifics. */

-#define portSTACK_GROWTH      ( -1 )

-#define portTICK_PERIOD_MS      ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portBYTE_ALIGNMENT       4

-#define portNOP()             {__asm__ __volatile__ ("nop");}

-/*-----------------------------------------------------------*/

-

-

-/*-----------------------------------------------------------*/

-

-/* INTC-specific. */

-#define DISABLE_ALL_EXCEPTIONS()    Disable_global_exception()

-#define ENABLE_ALL_EXCEPTIONS()     Enable_global_exception()

-

-#define DISABLE_ALL_INTERRUPTS()    Disable_global_interrupt()

-#define ENABLE_ALL_INTERRUPTS()     Enable_global_interrupt()

-

-#define DISABLE_INT_LEVEL(int_lev)  Disable_interrupt_level(int_lev)

-#define ENABLE_INT_LEVEL(int_lev)   Enable_interrupt_level(int_lev)

-

-

-/*

- * Debug trace.

- * Activated if and only if configDBG is nonzero.

- * Prints a formatted string to stdout.

- * The current source file name and line number are output with a colon before

- * the formatted string.

- * A carriage return and a linefeed are appended to the output.

- * stdout is redirected to the USART configured by configDBG_USART.

- * The parameters are the same as for the standard printf function.

- * There is no return value.

- * SHALL NOT BE CALLED FROM WITHIN AN INTERRUPT as fputs and printf use malloc,

- * which is interrupt-unsafe with the current __malloc_lock and __malloc_unlock.

- */

-#if configDBG

-	#define portDBG_TRACE(...)												\

-	{																		\

-	  fputs(__FILE__ ":" ASTRINGZ(__LINE__) ": ", stdout);					\

-	  printf(__VA_ARGS__);													\

-	  fputs("\r\n", stdout);												\

-	}

-#else

-	#define portDBG_TRACE(...)

-#endif

-

-

-/* Critical section management. */

-#define portDISABLE_INTERRUPTS()  DISABLE_ALL_INTERRUPTS()

-#define portENABLE_INTERRUPTS()   ENABLE_ALL_INTERRUPTS()

-

-

-extern void vPortEnterCritical( void );

-extern void vPortExitCritical( void );

-

-#define portENTER_CRITICAL()      vPortEnterCritical();

-#define portEXIT_CRITICAL()       vPortExitCritical();

-

-

-/* Added as there is no such function in FreeRTOS. */

-extern void *pvPortRealloc( void *pv, size_t xSize );

-/*-----------------------------------------------------------*/

-

-

-/*=============================================================================================*/

-

-/*

- * Restore Context for cases other than INTi.

- */

-#define portRESTORE_CONTEXT()																\

-{																							\

-  extern volatile uint32_t ulCriticalNesting;										\

-  extern volatile void *volatile pxCurrentTCB;												\

-																							\

-  __asm__ __volatile__ (																	\

-    /* Set SP to point to new stack */														\

-    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")												\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")												\n\t"\

-    "ld.w    r0, r8[0]																		\n\t"\

-    "ld.w    sp, r0[0]																		\n\t"\

-																							\

-    /* Restore ulCriticalNesting variable */												\

-    "ld.w    r0, sp++																		\n\t"\

-    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")										\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")										\n\t"\

-    "st.w    r8[0], r0																		\n\t"\

-																							\

-    /* Restore R0..R7 */																	\

-    "ldm     sp++, r0-r7																	\n\t"\

-    /* R0-R7 should not be used below this line */											\

-    /* Skip PC and SR (will do it at the end) */											\

-    "sub     sp, -2*4																		\n\t"\

-    /* Restore R8..R12 and LR */															\

-    "ldm     sp++, r8-r12, lr																\n\t"\

-    /* Restore SR */																		\

-    "ld.w    r0, sp[-8*4]																	\n\t" /* R0 is modified, is restored later. */\

-    "mtsr    "ASTRINGZ(AVR32_SR)", r0														\n\t"\

-    /* Restore r0 */																		\

-    "ld.w    r0, sp[-9*4]																	\n\t"\

-    /* Restore PC */																		\

-    "ld.w    pc, sp[-7*4]" /* Get PC from stack - PC is the 7th register saved */			\

-  );																						\

-																							\

-  /* Force import of global symbols from assembly */										\

-  ulCriticalNesting;																		\

-  pxCurrentTCB;																				\

-}

-

-

-/*

- * portSAVE_CONTEXT_INT() and portRESTORE_CONTEXT_INT(): for INT0..3 exceptions.

- * portSAVE_CONTEXT_SCALL() and portRESTORE_CONTEXT_SCALL(): for the scall exception.

- *

- * Had to make different versions because registers saved on the system stack

- * are not the same between INT0..3 exceptions and the scall exception.

- */

-

-// Task context stack layout:

-  // R8  (*)

-  // R9  (*)

-  // R10 (*)

-  // R11 (*)

-  // R12 (*)

-  // R14/LR (*)

-  // R15/PC (*)

-  // SR (*)

-  // R0

-  // R1

-  // R2

-  // R3

-  // R4

-  // R5

-  // R6

-  // R7

-  // ulCriticalNesting

-// (*) automatically done for INT0..INT3, but not for SCALL

-

-/*

- * The ISR used for the scheduler tick depends on whether the cooperative or

- * the preemptive scheduler is being used.

- */

-#if configUSE_PREEMPTION == 0

-

-/*

- * portSAVE_CONTEXT_OS_INT() for OS Tick exception.

- */

-#define portSAVE_CONTEXT_OS_INT()															\

-{																							\

-  /* Save R0..R7 */																			\

-  __asm__ __volatile__ ("stm     --sp, r0-r7");												\

-																							\

-  /* With the cooperative scheduler, as there is no context switch by interrupt, */			\

-  /* there is also no context save. */														\

-}

-

-/*

- * portRESTORE_CONTEXT_OS_INT() for Tick exception.

- */

-#define portRESTORE_CONTEXT_OS_INT()														\

-{																							\

-  __asm__ __volatile__ (																	\

-    /* Restore R0..R7 */																	\

-    "ldm     sp++, r0-r7																	\n\t"\

-																							\

-    /* With the cooperative scheduler, as there is no context switch by interrupt, */		\

-    /* there is also no context restore. */													\

-    "rete"																					\

-  );																						\

-}

-

-#else

-

-/*

- * portSAVE_CONTEXT_OS_INT() for OS Tick exception.

- */

-#define portSAVE_CONTEXT_OS_INT()																	\

-{																									\

-  extern volatile uint32_t ulCriticalNesting;												\

-  extern volatile void *volatile pxCurrentTCB;														\

-																									\

-  /* When we come here */																			\

-  /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */					\

-																									\

-  __asm__ __volatile__ (																			\

-    /* Save R0..R7 */																				\

-    "stm     --sp, r0-r7																			\n\t"\

-																									\

-    /* Save ulCriticalNesting variable  - R0 is overwritten */										\

-    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "ld.w    r0, r8[0]																				\n\t"\

-    "st.w    --sp, r0																				\n\t"\

-																									\

-    /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */	\

-    /* interrupt handler (which was of a higher priority level but decided to lower its priority */	\

-    /* level and allow other lower interrupt level to occur). */									\

-    /* In this case we don't want to do a task switch because we don't know what the stack */		\

-    /* currently looks like (we don't know what the interrupted interrupt handler was doing). */	\

-    /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */		\

-    /* will just be restoring the interrupt handler, no way!!! */									\

-    /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */					\

-    "ld.w    r0, sp[9*4]																			\n\t" /* Read SR in stack */\

-    "bfextu  r0, r0, 22, 3																			\n\t" /* Extract the mode bits to R0. */\

-    "cp.w    r0, 1																					\n\t" /* Compare the mode bits with supervisor mode(b'001) */\

-    "brhi    LABEL_INT_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)"										\n\t"\

-																									\

-    /* Store SP in the first member of the structure pointed to by pxCurrentTCB */					\

-    /* NOTE: we don't enter a critical section here because all interrupt handlers */				\

-    /* MUST perform a SAVE_CONTEXT/RESTORE_CONTEXT in the same way as */							\

-    /* portSAVE_CONTEXT_OS_INT/port_RESTORE_CONTEXT_OS_INT if they call OS functions. */			\

-    /* => all interrupt handlers must use portENTER_SWITCHING_ISR/portEXIT_SWITCHING_ISR. */		\

-    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "ld.w    r0, r8[0]																				\n\t"\

-    "st.w    r0[0], sp																				\n"\

-																									\

-    "LABEL_INT_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)":"												\

-  );																								\

-}

-

-/*

- * portRESTORE_CONTEXT_OS_INT() for Tick exception.

- */

-#define portRESTORE_CONTEXT_OS_INT()																\

-{																									\

-  extern volatile uint32_t ulCriticalNesting;												\

-  extern volatile void *volatile pxCurrentTCB;														\

-																									\

-  /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */		\

-  /* interrupt handler (which was of a higher priority level but decided to lower its priority */	\

-  /* level and allow other lower interrupt level to occur). */										\

-  /* In this case we don't want to do a task switch because we don't know what the stack */			\

-  /* currently looks like (we don't know what the interrupted interrupt handler was doing). */		\

-  /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */			\

-  /* will just be restoring the interrupt handler, no way!!! */										\

-  __asm__ __volatile__ (																			\

-    "ld.w    r0, sp[9*4]																			\n\t" /* Read SR in stack */\

-    "bfextu  r0, r0, 22, 3																			\n\t" /* Extract the mode bits to R0. */\

-    "cp.w    r0, 1																					\n\t" /* Compare the mode bits with supervisor mode(b'001) */\

-    "brhi    LABEL_INT_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)										\

-  );																								\

-																									\

-  /* Else */																						\

-  /* because it is here safe, always call vTaskSwitchContext() since an OS tick occurred. */		\

-  /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */\

-  portENTER_CRITICAL();																				\

-  vTaskSwitchContext();																				\

-  portEXIT_CRITICAL();																				\

-																									\

-  /* Restore all registers */																		\

-																									\

-  __asm__ __volatile__ (																			\

-    /* Set SP to point to new stack */																\

-    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "ld.w    r0, r8[0]																				\n\t"\

-    "ld.w    sp, r0[0]																				\n"\

-																									\

-    "LABEL_INT_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)":											\n\t"\

-																									\

-    /* Restore ulCriticalNesting variable */														\

-    "ld.w    r0, sp++																				\n\t"\

-    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "st.w    r8[0], r0																				\n\t"\

-																									\

-    /* Restore R0..R7 */																			\

-    "ldm     sp++, r0-r7																			\n\t"\

-																									\

-    /* Now, the stack should be R8..R12, LR, PC and SR */											\

-    "rete"																							\

-  );																								\

-																									\

-  /* Force import of global symbols from assembly */												\

-  ulCriticalNesting;																				\

-  pxCurrentTCB;																						\

-}

-

-#endif

-

-

-/*

- * portSAVE_CONTEXT_SCALL() for SupervisorCALL exception.

- *

- * NOTE: taskYIELD()(== SCALL) MUST NOT be called in a mode > supervisor mode.

- *

- */

-#define portSAVE_CONTEXT_SCALL()																	\

-{																									\

-  extern volatile uint32_t ulCriticalNesting;												\

-  extern volatile void *volatile pxCurrentTCB;														\

-																									\

-  /* Warning: the stack layout after SCALL doesn't match the one after an interrupt. */				\

-  /* If SR[M2:M0] == 001 */																			\

-  /*    PC and SR are on the stack.  */																\

-  /* Else (other modes) */																			\

-  /*    Nothing on the stack. */																	\

-																									\

-  /* WARNING NOTE: the else case cannot happen as it is strictly forbidden to call */				\

-  /* vTaskDelay() and vTaskDelayUntil() OS functions (that result in a taskYield()) */				\

-  /* in an interrupt|exception handler. */															\

-																									\

-  __asm__ __volatile__ (																			\

-    /* in order to save R0-R7 */																	\

-    "sub     sp, 6*4																				\n\t"\

-    /* Save R0..R7 */																				\

-    "stm     --sp, r0-r7																			\n\t"\

-																									\

-    /* in order to save R8-R12 and LR */															\

-    /* do not use SP if interrupts occurs, SP must be left at bottom of stack */					\

-    "sub     r7, sp,-16*4																			\n\t"\

-    /* Copy PC and SR in other places in the stack. */												\

-    "ld.w    r0, r7[-2*4]																			\n\t" /* Read SR */\

-    "st.w    r7[-8*4], r0																			\n\t" /* Copy SR */\

-    "ld.w    r0, r7[-1*4]																			\n\t" /* Read PC */\

-    "st.w    r7[-7*4], r0																			\n\t" /* Copy PC */\

-																									\

-    /* Save R8..R12 and LR on the stack. */															\

-    "stm     --r7, r8-r12, lr																		\n\t"\

-																									\

-    /* Arriving here we have the following stack organizations: */									\

-    /* R8..R12, LR, PC, SR, R0..R7. */																\

-																									\

-    /* Now we can finalize the save. */																\

-																									\

-    /* Save ulCriticalNesting variable  - R0 is overwritten */										\

-    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "ld.w    r0, r8[0]																				\n\t"\

-    "st.w    --sp, r0"																				\

-  );																								\

-																									\

-  /* Disable the its which may cause a context switch (i.e. cause a change of */					\

-  /* pxCurrentTCB). */																				\

-  /* Basically, all accesses to the pxCurrentTCB structure should be put in a */					\

-  /* critical section because it is a global structure. */											\

-  portENTER_CRITICAL();																				\

-																									\

-  /* Store SP in the first member of the structure pointed to by pxCurrentTCB */					\

-  __asm__ __volatile__ (																			\

-    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "ld.w    r0, r8[0]																				\n\t"\

-    "st.w    r0[0], sp"																				\

-  );																								\

-}

-

-/*

- * portRESTORE_CONTEXT() for SupervisorCALL exception.

- */

-#define portRESTORE_CONTEXT_SCALL()																	\

-{																									\

-  extern volatile uint32_t ulCriticalNesting;												\

-  extern volatile void *volatile pxCurrentTCB;														\

-																									\

-  /* Restore all registers */																		\

-																									\

-  /* Set SP to point to new stack */																\

-  __asm__ __volatile__ (																			\

-    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "ld.w    r0, r8[0]																				\n\t"\

-    "ld.w    sp, r0[0]"																				\

-  );																								\

-																									\

-  /* Leave pxCurrentTCB variable access critical section */											\

-  portEXIT_CRITICAL();																				\

-																									\

-  __asm__ __volatile__ (																			\

-    /* Restore ulCriticalNesting variable */														\

-    "ld.w    r0, sp++																				\n\t"\

-    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "st.w    r8[0], r0																				\n\t"\

-																									\

-    /* skip PC and SR */																			\

-    /* do not use SP if interrupts occurs, SP must be left at bottom of stack */					\

-    "sub     r7, sp, -10*4																			\n\t"\

-    /* Restore r8-r12 and LR */																		\

-    "ldm     r7++, r8-r12, lr																		\n\t"\

-																									\

-    /* RETS will take care of the extra PC and SR restore. */										\

-    /* So, we have to prepare the stack for this. */												\

-    "ld.w    r0, r7[-8*4]																			\n\t" /* Read SR */\

-    "st.w    r7[-2*4], r0																			\n\t" /* Copy SR */\

-    "ld.w    r0, r7[-7*4]																			\n\t" /* Read PC */\

-    "st.w    r7[-1*4], r0																			\n\t" /* Copy PC */\

-																									\

-    /* Restore R0..R7 */																			\

-    "ldm     sp++, r0-r7																			\n\t"\

-																									\

-    "sub     sp, -6*4																				\n\t"\

-																									\

-    "rets"																							\

-  );																								\

-																									\

-  /* Force import of global symbols from assembly */												\

-  ulCriticalNesting;																				\

-  pxCurrentTCB;																						\

-}

-

-

-/*

- * The ISR used depends on whether the cooperative or

- * the preemptive scheduler is being used.

- */

-#if configUSE_PREEMPTION == 0

-

-/*

- * ISR entry and exit macros.  These are only required if a task switch

- * is required from the ISR.

- */

-#define portENTER_SWITCHING_ISR()																	\

-{																									\

-  /* Save R0..R7 */																					\

-  __asm__ __volatile__ ("stm     --sp, r0-r7");														\

-																									\

-  /* With the cooperative scheduler, as there is no context switch by interrupt, */					\

-  /* there is also no context save. */																\

-}

-

-/*

- * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1

- */

-#define portEXIT_SWITCHING_ISR()																	\

-{																									\

-  __asm__ __volatile__ (																			\

-    /* Restore R0..R7 */																			\

-    "ldm     sp++, r0-r7																			\n\t"\

-																									\

-    /* With the cooperative scheduler, as there is no context switch by interrupt, */				\

-    /* there is also no context restore. */															\

-    "rete"																							\

-  );																								\

-}

-

-#else

-

-/*

- * ISR entry and exit macros.  These are only required if a task switch

- * is required from the ISR.

- */

-#define portENTER_SWITCHING_ISR()																	\

-{																									\

-  extern volatile uint32_t ulCriticalNesting;												\

-  extern volatile void *volatile pxCurrentTCB;														\

-																									\

-  /* When we come here */																			\

-  /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */					\

-																									\

-  __asm__ __volatile__ (																			\

-    /* Save R0..R7 */																				\

-    "stm     --sp, r0-r7																			\n\t"\

-																									\

-    /* Save ulCriticalNesting variable  - R0 is overwritten */										\

-    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "ld.w    r0, r8[0]																				\n\t"\

-    "st.w    --sp, r0																				\n\t"\

-																									\

-    /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */	\

-    /* interrupt handler (which was of a higher priority level but decided to lower its priority */	\

-    /* level and allow other lower interrupt level to occur). */									\

-    /* In this case we don't want to do a task switch because we don't know what the stack */		\

-    /* currently looks like (we don't know what the interrupted interrupt handler was doing). */	\

-    /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */		\

-    /* will just be restoring the interrupt handler, no way!!! */									\

-    /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */					\

-    "ld.w    r0, sp[9*4]																			\n\t" /* Read SR in stack */\

-    "bfextu  r0, r0, 22, 3																			\n\t" /* Extract the mode bits to R0. */\

-    "cp.w    r0, 1																					\n\t" /* Compare the mode bits with supervisor mode(b'001) */\

-    "brhi    LABEL_ISR_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)"										\n\t"\

-																									\

-    /* Store SP in the first member of the structure pointed to by pxCurrentTCB */					\

-    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "ld.w    r0, r8[0]																				\n\t"\

-    "st.w    r0[0], sp																				\n"\

-																									\

-    "LABEL_ISR_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)":"												\

-  );																								\

-}

-

-

-/*

- * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1

- */

-#define portEXIT_SWITCHING_ISR()																	\

-{																									\

-  extern volatile uint32_t ulCriticalNesting;												\

-  extern volatile void *volatile pxCurrentTCB;														\

-																									\

-  __asm__ __volatile__ (																			\

-    /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */	\

-    /* interrupt handler (which was of a higher priority level but decided to lower its priority */	\

-    /* level and allow other lower interrupt level to occur). */									\

-    /* In this case it's of no use to switch context and restore a new SP because we purposedly */	\

-    /* did not previously save SP in its TCB. */													\

-    "ld.w    r0, sp[9*4]																			\n\t" /* Read SR in stack */\

-    "bfextu  r0, r0, 22, 3																			\n\t" /* Extract the mode bits to R0. */\

-    "cp.w    r0, 1																					\n\t" /* Compare the mode bits with supervisor mode(b'001) */\

-    "brhi    LABEL_ISR_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)"									\n\t"\

-																									\

-    /* If a switch is required then we just need to call */											\

-    /* vTaskSwitchContext() as the context has already been */										\

-    /* saved. */																					\

-    "cp.w    r12, 1																					\n\t" /* Check if Switch context is required. */\

-    "brne    LABEL_ISR_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)":C"										\

-  );																								\

-																									\

-  /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */\

-  portENTER_CRITICAL();																				\

-  vTaskSwitchContext();																				\

-  portEXIT_CRITICAL();																				\

-																									\

-  __asm__ __volatile__ (																			\

-    "LABEL_ISR_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)":												\n\t"\

-    /* Restore the context of which ever task is now the highest */									\

-    /* priority that is ready to run. */															\

-																									\

-    /* Restore all registers */																		\

-																									\

-    /* Set SP to point to new stack */																\

-    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")														\n\t"\

-    "ld.w    r0, r8[0]																				\n\t"\

-    "ld.w    sp, r0[0]																				\n"\

-																									\

-    "LABEL_ISR_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)":											\n\t"\

-																									\

-    /* Restore ulCriticalNesting variable */														\

-    "ld.w    r0, sp++																				\n\t"\

-    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")												\n\t"\

-    "st.w    r8[0], r0																				\n\t"\

-																									\

-    /* Restore R0..R7 */																			\

-    "ldm     sp++, r0-r7																			\n\t"\

-																									\

-    /* Now, the stack should be R8..R12, LR, PC and SR  */											\

-    "rete"																							\

-  );																								\

-																									\

-  /* Force import of global symbols from assembly */												\

-  ulCriticalNesting;																				\

-  pxCurrentTCB;																						\

-}

-

-#endif

-

-

-#define portYIELD()                 {__asm__ __volatile__ ("scall");}

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT AND BSD-3-Clause
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*This file has been prepared for Doxygen automatic documentation generation.*/
+/*! \file *********************************************************************
+ *
+ * \brief FreeRTOS port header for AVR32 UC3.
+ *
+ * - Compiler:           IAR EWAVR32
+ * - Supported devices:  All AVR32 devices can be used.
+ * - AppNote:
+ *
+ * \author               Atmel Corporation (Now Microchip):
+ *                                        https://www.microchip.com
+ *                       Support and FAQ: https://www.microchip.com/support
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (c) 2007, Atmel Corporation All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of ATMEL may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
+ * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+#include <avr32/io.h>
+#include "intc.h"
+#include "compiler.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint32_t
+#define portBASE_TYPE   long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+
+#define TASK_DELAY_MS(x)   ( (x)        /portTICK_PERIOD_MS )
+#define TASK_DELAY_S(x)    ( (x)*1000   /portTICK_PERIOD_MS )
+#define TASK_DELAY_MIN(x)  ( (x)*60*1000/portTICK_PERIOD_MS )
+
+#define configTICK_TC_IRQ             ATPASTE2(AVR32_TC_IRQ, configTICK_TC_CHANNEL)
+
+#if( configUSE_16_BIT_TICKS == 1 )
+  typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+  typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+/*-----------------------------------------------------------*/
+
+/* Architecture specifics. */
+#define portSTACK_GROWTH      ( -1 )
+#define portTICK_PERIOD_MS      ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT       4
+#define portNOP()             {__asm__ __volatile__ ("nop");}
+/*-----------------------------------------------------------*/
+
+
+/*-----------------------------------------------------------*/
+
+/* INTC-specific. */
+#define DISABLE_ALL_EXCEPTIONS()    Disable_global_exception()
+#define ENABLE_ALL_EXCEPTIONS()     Enable_global_exception()
+
+#define DISABLE_ALL_INTERRUPTS()    Disable_global_interrupt()
+#define ENABLE_ALL_INTERRUPTS()     Enable_global_interrupt()
+
+#define DISABLE_INT_LEVEL(int_lev)  Disable_interrupt_level(int_lev)
+#define ENABLE_INT_LEVEL(int_lev)   Enable_interrupt_level(int_lev)
+
+
+/*
+ * Debug trace.
+ * Activated if and only if configDBG is nonzero.
+ * Prints a formatted string to stdout.
+ * The current source file name and line number are output with a colon before
+ * the formatted string.
+ * A carriage return and a linefeed are appended to the output.
+ * stdout is redirected to the USART configured by configDBG_USART.
+ * The parameters are the same as for the standard printf function.
+ * There is no return value.
+ * SHALL NOT BE CALLED FROM WITHIN AN INTERRUPT as fputs and printf use malloc,
+ * which is interrupt-unsafe with the current __malloc_lock and __malloc_unlock.
+ */
+#if configDBG
+    #define portDBG_TRACE(...)                                              \
+    {                                                                       \
+      fputs(__FILE__ ":" ASTRINGZ(__LINE__) ": ", stdout);                  \
+      printf(__VA_ARGS__);                                                  \
+      fputs("\r\n", stdout);                                                \
+    }
+#else
+    #define portDBG_TRACE(...)
+#endif
+
+
+/* Critical section management. */
+#define portDISABLE_INTERRUPTS()  DISABLE_ALL_INTERRUPTS()
+#define portENABLE_INTERRUPTS()   ENABLE_ALL_INTERRUPTS()
+
+
+extern void vPortEnterCritical( void );
+extern void vPortExitCritical( void );
+
+#define portENTER_CRITICAL()      vPortEnterCritical();
+#define portEXIT_CRITICAL()       vPortExitCritical();
+
+
+/* Added as there is no such function in FreeRTOS. */
+extern void *pvPortRealloc( void *pv, size_t xSize );
+/*-----------------------------------------------------------*/
+
+
+/*=============================================================================================*/
+
+/*
+ * Restore Context for cases other than INTi.
+ */
+#define portRESTORE_CONTEXT()                                                               \
+{                                                                                           \
+  extern volatile uint32_t ulCriticalNesting;                                       \
+  extern volatile void *volatile pxCurrentTCB;                                              \
+                                                                                            \
+  __asm__ __volatile__ (                                                                    \
+    /* Set SP to point to new stack */                                                      \
+    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")                                             \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")                                             \n\t"\
+    "ld.w    r0, r8[0]                                                                      \n\t"\
+    "ld.w    sp, r0[0]                                                                      \n\t"\
+                                                                                            \
+    /* Restore ulCriticalNesting variable */                                                \
+    "ld.w    r0, sp++                                                                       \n\t"\
+    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")                                        \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")                                        \n\t"\
+    "st.w    r8[0], r0                                                                      \n\t"\
+                                                                                            \
+    /* Restore R0..R7 */                                                                    \
+    "ldm     sp++, r0-r7                                                                    \n\t"\
+    /* R0-R7 should not be used below this line */                                          \
+    /* Skip PC and SR (will do it at the end) */                                            \
+    "sub     sp, -2*4                                                                       \n\t"\
+    /* Restore R8..R12 and LR */                                                            \
+    "ldm     sp++, r8-r12, lr                                                               \n\t"\
+    /* Restore SR */                                                                        \
+    "ld.w    r0, sp[-8*4]                                                                   \n\t" /* R0 is modified, is restored later. */\
+    "mtsr    "ASTRINGZ(AVR32_SR)", r0                                                       \n\t"\
+    /* Restore r0 */                                                                        \
+    "ld.w    r0, sp[-9*4]                                                                   \n\t"\
+    /* Restore PC */                                                                        \
+    "ld.w    pc, sp[-7*4]" /* Get PC from stack - PC is the 7th register saved */           \
+  );                                                                                        \
+                                                                                            \
+  /* Force import of global symbols from assembly */                                        \
+  ulCriticalNesting;                                                                        \
+  pxCurrentTCB;                                                                             \
+}
+
+
+/*
+ * portSAVE_CONTEXT_INT() and portRESTORE_CONTEXT_INT(): for INT0..3 exceptions.
+ * portSAVE_CONTEXT_SCALL() and portRESTORE_CONTEXT_SCALL(): for the scall exception.
+ *
+ * Had to make different versions because registers saved on the system stack
+ * are not the same between INT0..3 exceptions and the scall exception.
+ */
+
+// Task context stack layout:
+  // R8  (*)
+  // R9  (*)
+  // R10 (*)
+  // R11 (*)
+  // R12 (*)
+  // R14/LR (*)
+  // R15/PC (*)
+  // SR (*)
+  // R0
+  // R1
+  // R2
+  // R3
+  // R4
+  // R5
+  // R6
+  // R7
+  // ulCriticalNesting
+// (*) automatically done for INT0..INT3, but not for SCALL
+
+/*
+ * The ISR used for the scheduler tick depends on whether the cooperative or
+ * the preemptive scheduler is being used.
+ */
+#if configUSE_PREEMPTION == 0
+
+/*
+ * portSAVE_CONTEXT_OS_INT() for OS Tick exception.
+ */
+#define portSAVE_CONTEXT_OS_INT()                                                           \
+{                                                                                           \
+  /* Save R0..R7 */                                                                         \
+  __asm__ __volatile__ ("stm     --sp, r0-r7");                                             \
+                                                                                            \
+  /* With the cooperative scheduler, as there is no context switch by interrupt, */         \
+  /* there is also no context save. */                                                      \
+}
+
+/*
+ * portRESTORE_CONTEXT_OS_INT() for Tick exception.
+ */
+#define portRESTORE_CONTEXT_OS_INT()                                                        \
+{                                                                                           \
+  __asm__ __volatile__ (                                                                    \
+    /* Restore R0..R7 */                                                                    \
+    "ldm     sp++, r0-r7                                                                    \n\t"\
+                                                                                            \
+    /* With the cooperative scheduler, as there is no context switch by interrupt, */       \
+    /* there is also no context restore. */                                                 \
+    "rete"                                                                                  \
+  );                                                                                        \
+}
+
+#else
+
+/*
+ * portSAVE_CONTEXT_OS_INT() for OS Tick exception.
+ */
+#define portSAVE_CONTEXT_OS_INT()                                                                   \
+{                                                                                                   \
+  extern volatile uint32_t ulCriticalNesting;                                               \
+  extern volatile void *volatile pxCurrentTCB;                                                      \
+                                                                                                    \
+  /* When we come here */                                                                           \
+  /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */                    \
+                                                                                                    \
+  __asm__ __volatile__ (                                                                            \
+    /* Save R0..R7 */                                                                               \
+    "stm     --sp, r0-r7                                                                            \n\t"\
+                                                                                                    \
+    /* Save ulCriticalNesting variable  - R0 is overwritten */                                      \
+    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "ld.w    r0, r8[0]                                                                              \n\t"\
+    "st.w    --sp, r0                                                                               \n\t"\
+                                                                                                    \
+    /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */    \
+    /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \
+    /* level and allow other lower interrupt level to occur). */                                    \
+    /* In this case we don't want to do a task switch because we don't know what the stack */       \
+    /* currently looks like (we don't know what the interrupted interrupt handler was doing). */    \
+    /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */       \
+    /* will just be restoring the interrupt handler, no way!!! */                                   \
+    /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */                  \
+    "ld.w    r0, sp[9*4]                                                                            \n\t" /* Read SR in stack */\
+    "bfextu  r0, r0, 22, 3                                                                          \n\t" /* Extract the mode bits to R0. */\
+    "cp.w    r0, 1                                                                                  \n\t" /* Compare the mode bits with supervisor mode(b'001) */\
+    "brhi    LABEL_INT_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)"                                       \n\t"\
+                                                                                                    \
+    /* Store SP in the first member of the structure pointed to by pxCurrentTCB */                  \
+    /* NOTE: we don't enter a critical section here because all interrupt handlers */               \
+    /* MUST perform a SAVE_CONTEXT/RESTORE_CONTEXT in the same way as */                            \
+    /* portSAVE_CONTEXT_OS_INT/port_RESTORE_CONTEXT_OS_INT if they call OS functions. */            \
+    /* => all interrupt handlers must use portENTER_SWITCHING_ISR/portEXIT_SWITCHING_ISR. */        \
+    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "ld.w    r0, r8[0]                                                                              \n\t"\
+    "st.w    r0[0], sp                                                                              \n"\
+                                                                                                    \
+    "LABEL_INT_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)":"                                             \
+  );                                                                                                \
+}
+
+/*
+ * portRESTORE_CONTEXT_OS_INT() for Tick exception.
+ */
+#define portRESTORE_CONTEXT_OS_INT()                                                                \
+{                                                                                                   \
+  extern volatile uint32_t ulCriticalNesting;                                               \
+  extern volatile void *volatile pxCurrentTCB;                                                      \
+                                                                                                    \
+  /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */      \
+  /* interrupt handler (which was of a higher priority level but decided to lower its priority */   \
+  /* level and allow other lower interrupt level to occur). */                                      \
+  /* In this case we don't want to do a task switch because we don't know what the stack */         \
+  /* currently looks like (we don't know what the interrupted interrupt handler was doing). */      \
+  /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */         \
+  /* will just be restoring the interrupt handler, no way!!! */                                     \
+  __asm__ __volatile__ (                                                                            \
+    "ld.w    r0, sp[9*4]                                                                            \n\t" /* Read SR in stack */\
+    "bfextu  r0, r0, 22, 3                                                                          \n\t" /* Extract the mode bits to R0. */\
+    "cp.w    r0, 1                                                                                  \n\t" /* Compare the mode bits with supervisor mode(b'001) */\
+    "brhi    LABEL_INT_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)                                     \
+  );                                                                                                \
+                                                                                                    \
+  /* Else */                                                                                        \
+  /* because it is here safe, always call vTaskSwitchContext() since an OS tick occurred. */        \
+  /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */\
+  portENTER_CRITICAL();                                                                             \
+  vTaskSwitchContext();                                                                             \
+  portEXIT_CRITICAL();                                                                              \
+                                                                                                    \
+  /* Restore all registers */                                                                       \
+                                                                                                    \
+  __asm__ __volatile__ (                                                                            \
+    /* Set SP to point to new stack */                                                              \
+    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "ld.w    r0, r8[0]                                                                              \n\t"\
+    "ld.w    sp, r0[0]                                                                              \n"\
+                                                                                                    \
+    "LABEL_INT_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)":                                           \n\t"\
+                                                                                                    \
+    /* Restore ulCriticalNesting variable */                                                        \
+    "ld.w    r0, sp++                                                                               \n\t"\
+    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "st.w    r8[0], r0                                                                              \n\t"\
+                                                                                                    \
+    /* Restore R0..R7 */                                                                            \
+    "ldm     sp++, r0-r7                                                                            \n\t"\
+                                                                                                    \
+    /* Now, the stack should be R8..R12, LR, PC and SR */                                           \
+    "rete"                                                                                          \
+  );                                                                                                \
+                                                                                                    \
+  /* Force import of global symbols from assembly */                                                \
+  ulCriticalNesting;                                                                                \
+  pxCurrentTCB;                                                                                     \
+}
+
+#endif
+
+
+/*
+ * portSAVE_CONTEXT_SCALL() for SupervisorCALL exception.
+ *
+ * NOTE: taskYIELD()(== SCALL) MUST NOT be called in a mode > supervisor mode.
+ *
+ */
+#define portSAVE_CONTEXT_SCALL()                                                                    \
+{                                                                                                   \
+  extern volatile uint32_t ulCriticalNesting;                                               \
+  extern volatile void *volatile pxCurrentTCB;                                                      \
+                                                                                                    \
+  /* Warning: the stack layout after SCALL doesn't match the one after an interrupt. */             \
+  /* If SR[M2:M0] == 001 */                                                                         \
+  /*    PC and SR are on the stack.  */                                                             \
+  /* Else (other modes) */                                                                          \
+  /*    Nothing on the stack. */                                                                    \
+                                                                                                    \
+  /* WARNING NOTE: the else case cannot happen as it is strictly forbidden to call */               \
+  /* vTaskDelay() and vTaskDelayUntil() OS functions (that result in a taskYield()) */              \
+  /* in an interrupt|exception handler. */                                                          \
+                                                                                                    \
+  __asm__ __volatile__ (                                                                            \
+    /* in order to save R0-R7 */                                                                    \
+    "sub     sp, 6*4                                                                                \n\t"\
+    /* Save R0..R7 */                                                                               \
+    "stm     --sp, r0-r7                                                                            \n\t"\
+                                                                                                    \
+    /* in order to save R8-R12 and LR */                                                            \
+    /* do not use SP if interrupts occurs, SP must be left at bottom of stack */                    \
+    "sub     r7, sp,-16*4                                                                           \n\t"\
+    /* Copy PC and SR in other places in the stack. */                                              \
+    "ld.w    r0, r7[-2*4]                                                                           \n\t" /* Read SR */\
+    "st.w    r7[-8*4], r0                                                                           \n\t" /* Copy SR */\
+    "ld.w    r0, r7[-1*4]                                                                           \n\t" /* Read PC */\
+    "st.w    r7[-7*4], r0                                                                           \n\t" /* Copy PC */\
+                                                                                                    \
+    /* Save R8..R12 and LR on the stack. */                                                         \
+    "stm     --r7, r8-r12, lr                                                                       \n\t"\
+                                                                                                    \
+    /* Arriving here we have the following stack organizations: */                                  \
+    /* R8..R12, LR, PC, SR, R0..R7. */                                                              \
+                                                                                                    \
+    /* Now we can finalize the save. */                                                             \
+                                                                                                    \
+    /* Save ulCriticalNesting variable  - R0 is overwritten */                                      \
+    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "ld.w    r0, r8[0]                                                                              \n\t"\
+    "st.w    --sp, r0"                                                                              \
+  );                                                                                                \
+                                                                                                    \
+  /* Disable the its which may cause a context switch (i.e. cause a change of */                    \
+  /* pxCurrentTCB). */                                                                              \
+  /* Basically, all accesses to the pxCurrentTCB structure should be put in a */                    \
+  /* critical section because it is a global structure. */                                          \
+  portENTER_CRITICAL();                                                                             \
+                                                                                                    \
+  /* Store SP in the first member of the structure pointed to by pxCurrentTCB */                    \
+  __asm__ __volatile__ (                                                                            \
+    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "ld.w    r0, r8[0]                                                                              \n\t"\
+    "st.w    r0[0], sp"                                                                             \
+  );                                                                                                \
+}
+
+/*
+ * portRESTORE_CONTEXT() for SupervisorCALL exception.
+ */
+#define portRESTORE_CONTEXT_SCALL()                                                                 \
+{                                                                                                   \
+  extern volatile uint32_t ulCriticalNesting;                                               \
+  extern volatile void *volatile pxCurrentTCB;                                                      \
+                                                                                                    \
+  /* Restore all registers */                                                                       \
+                                                                                                    \
+  /* Set SP to point to new stack */                                                                \
+  __asm__ __volatile__ (                                                                            \
+    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "ld.w    r0, r8[0]                                                                              \n\t"\
+    "ld.w    sp, r0[0]"                                                                             \
+  );                                                                                                \
+                                                                                                    \
+  /* Leave pxCurrentTCB variable access critical section */                                         \
+  portEXIT_CRITICAL();                                                                              \
+                                                                                                    \
+  __asm__ __volatile__ (                                                                            \
+    /* Restore ulCriticalNesting variable */                                                        \
+    "ld.w    r0, sp++                                                                               \n\t"\
+    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "st.w    r8[0], r0                                                                              \n\t"\
+                                                                                                    \
+    /* skip PC and SR */                                                                            \
+    /* do not use SP if interrupts occurs, SP must be left at bottom of stack */                    \
+    "sub     r7, sp, -10*4                                                                          \n\t"\
+    /* Restore r8-r12 and LR */                                                                     \
+    "ldm     r7++, r8-r12, lr                                                                       \n\t"\
+                                                                                                    \
+    /* RETS will take care of the extra PC and SR restore. */                                       \
+    /* So, we have to prepare the stack for this. */                                                \
+    "ld.w    r0, r7[-8*4]                                                                           \n\t" /* Read SR */\
+    "st.w    r7[-2*4], r0                                                                           \n\t" /* Copy SR */\
+    "ld.w    r0, r7[-7*4]                                                                           \n\t" /* Read PC */\
+    "st.w    r7[-1*4], r0                                                                           \n\t" /* Copy PC */\
+                                                                                                    \
+    /* Restore R0..R7 */                                                                            \
+    "ldm     sp++, r0-r7                                                                            \n\t"\
+                                                                                                    \
+    "sub     sp, -6*4                                                                               \n\t"\
+                                                                                                    \
+    "rets"                                                                                          \
+  );                                                                                                \
+                                                                                                    \
+  /* Force import of global symbols from assembly */                                                \
+  ulCriticalNesting;                                                                                \
+  pxCurrentTCB;                                                                                     \
+}
+
+
+/*
+ * The ISR used depends on whether the cooperative or
+ * the preemptive scheduler is being used.
+ */
+#if configUSE_PREEMPTION == 0
+
+/*
+ * ISR entry and exit macros.  These are only required if a task switch
+ * is required from the ISR.
+ */
+#define portENTER_SWITCHING_ISR()                                                                   \
+{                                                                                                   \
+  /* Save R0..R7 */                                                                                 \
+  __asm__ __volatile__ ("stm     --sp, r0-r7");                                                     \
+                                                                                                    \
+  /* With the cooperative scheduler, as there is no context switch by interrupt, */                 \
+  /* there is also no context save. */                                                              \
+}
+
+/*
+ * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1
+ */
+#define portEXIT_SWITCHING_ISR()                                                                    \
+{                                                                                                   \
+  __asm__ __volatile__ (                                                                            \
+    /* Restore R0..R7 */                                                                            \
+    "ldm     sp++, r0-r7                                                                            \n\t"\
+                                                                                                    \
+    /* With the cooperative scheduler, as there is no context switch by interrupt, */               \
+    /* there is also no context restore. */                                                         \
+    "rete"                                                                                          \
+  );                                                                                                \
+}
+
+#else
+
+/*
+ * ISR entry and exit macros.  These are only required if a task switch
+ * is required from the ISR.
+ */
+#define portENTER_SWITCHING_ISR()                                                                   \
+{                                                                                                   \
+  extern volatile uint32_t ulCriticalNesting;                                               \
+  extern volatile void *volatile pxCurrentTCB;                                                      \
+                                                                                                    \
+  /* When we come here */                                                                           \
+  /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */                    \
+                                                                                                    \
+  __asm__ __volatile__ (                                                                            \
+    /* Save R0..R7 */                                                                               \
+    "stm     --sp, r0-r7                                                                            \n\t"\
+                                                                                                    \
+    /* Save ulCriticalNesting variable  - R0 is overwritten */                                      \
+    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "ld.w    r0, r8[0]                                                                              \n\t"\
+    "st.w    --sp, r0                                                                               \n\t"\
+                                                                                                    \
+    /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */    \
+    /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \
+    /* level and allow other lower interrupt level to occur). */                                    \
+    /* In this case we don't want to do a task switch because we don't know what the stack */       \
+    /* currently looks like (we don't know what the interrupted interrupt handler was doing). */    \
+    /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */       \
+    /* will just be restoring the interrupt handler, no way!!! */                                   \
+    /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */                  \
+    "ld.w    r0, sp[9*4]                                                                            \n\t" /* Read SR in stack */\
+    "bfextu  r0, r0, 22, 3                                                                          \n\t" /* Extract the mode bits to R0. */\
+    "cp.w    r0, 1                                                                                  \n\t" /* Compare the mode bits with supervisor mode(b'001) */\
+    "brhi    LABEL_ISR_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)"                                       \n\t"\
+                                                                                                    \
+    /* Store SP in the first member of the structure pointed to by pxCurrentTCB */                  \
+    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "ld.w    r0, r8[0]                                                                              \n\t"\
+    "st.w    r0[0], sp                                                                              \n"\
+                                                                                                    \
+    "LABEL_ISR_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)":"                                             \
+  );                                                                                                \
+}
+
+
+/*
+ * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1
+ */
+#define portEXIT_SWITCHING_ISR()                                                                    \
+{                                                                                                   \
+  extern volatile uint32_t ulCriticalNesting;                                               \
+  extern volatile void *volatile pxCurrentTCB;                                                      \
+                                                                                                    \
+  __asm__ __volatile__ (                                                                            \
+    /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */    \
+    /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \
+    /* level and allow other lower interrupt level to occur). */                                    \
+    /* In this case it's of no use to switch context and restore a new SP because we purposedly */  \
+    /* did not previously save SP in its TCB. */                                                    \
+    "ld.w    r0, sp[9*4]                                                                            \n\t" /* Read SR in stack */\
+    "bfextu  r0, r0, 22, 3                                                                          \n\t" /* Extract the mode bits to R0. */\
+    "cp.w    r0, 1                                                                                  \n\t" /* Compare the mode bits with supervisor mode(b'001) */\
+    "brhi    LABEL_ISR_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)"                                    \n\t"\
+                                                                                                    \
+    /* If a switch is required then we just need to call */                                         \
+    /* vTaskSwitchContext() as the context has already been */                                      \
+    /* saved. */                                                                                    \
+    "cp.w    r12, 1                                                                                 \n\t" /* Check if Switch context is required. */\
+    "brne    LABEL_ISR_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)":C"                                      \
+  );                                                                                                \
+                                                                                                    \
+  /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */\
+  portENTER_CRITICAL();                                                                             \
+  vTaskSwitchContext();                                                                             \
+  portEXIT_CRITICAL();                                                                              \
+                                                                                                    \
+  __asm__ __volatile__ (                                                                            \
+    "LABEL_ISR_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)":                                                \n\t"\
+    /* Restore the context of which ever task is now the highest */                                 \
+    /* priority that is ready to run. */                                                            \
+                                                                                                    \
+    /* Restore all registers */                                                                     \
+                                                                                                    \
+    /* Set SP to point to new stack */                                                              \
+    "mov     r8, LWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(pxCurrentTCB)")                                                     \n\t"\
+    "ld.w    r0, r8[0]                                                                              \n\t"\
+    "ld.w    sp, r0[0]                                                                              \n"\
+                                                                                                    \
+    "LABEL_ISR_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)":                                           \n\t"\
+                                                                                                    \
+    /* Restore ulCriticalNesting variable */                                                        \
+    "ld.w    r0, sp++                                                                               \n\t"\
+    "mov     r8, LWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "orh     r8, HWRD("ASTRINGZ(ulCriticalNesting)")                                                \n\t"\
+    "st.w    r8[0], r0                                                                              \n\t"\
+                                                                                                    \
+    /* Restore R0..R7 */                                                                            \
+    "ldm     sp++, r0-r7                                                                            \n\t"\
+                                                                                                    \
+    /* Now, the stack should be R8..R12, LR, PC and SR  */                                          \
+    "rete"                                                                                          \
+  );                                                                                                \
+                                                                                                    \
+  /* Force import of global symbols from assembly */                                                \
+  ulCriticalNesting;                                                                                \
+  pxCurrentTCB;                                                                                     \
+}
+
+#endif
+
+
+#define portYIELD()                 {__asm__ __volatile__ ("scall");}
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/AVR32_UC3/read.c b/portable/IAR/AVR32_UC3/read.c
index 3e7cc76..e0fbed0 100644
--- a/portable/IAR/AVR32_UC3/read.c
+++ b/portable/IAR/AVR32_UC3/read.c
@@ -1,123 +1,123 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT AND BSD-3-Clause

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*This file is prepared for Doxygen automatic documentation generation.*/

-/*! \file *********************************************************************

- *

- * \brief System-specific implementation of the \ref __read function used by

-          the standard library.

- *

- * - Compiler:           IAR EWAVR32

- * - Supported devices:  All AVR32 devices with a USART module can be used.

- * - AppNote:

- *

- * \author               Atmel Corporation (Now Microchip):

- *                                        https://www.microchip.com \n

- *                       Support and FAQ: https://www.microchip.com/support/

- *

- ******************************************************************************/

-

-/*

- * Copyright (c) 2007, Atmel Corporation All rights reserved.

- *

- * Redistribution and use in source and binary forms, with or without

- * modification, are permitted provided that the following conditions are met:

- *

- * 1. Redistributions of source code must retain the above copyright notice,

- * this list of conditions and the following disclaimer.

- *

- * 2. Redistributions in binary form must reproduce the above copyright notice,

- * this list of conditions and the following disclaimer in the documentation

- * and/or other materials provided with the distribution.

- *

- * 3. The name of ATMEL may not be used to endorse or promote products derived

- * from this software without specific prior written permission.

- *

- * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED

- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND

- * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,

- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES

- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND

- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

- */

-

-

-#include <yfuns.h>

-#include <avr32/io.h>

-#include "usart.h"

-

-

-_STD_BEGIN

-

-

-#pragma module_name = "?__read"

-

-

-extern volatile avr32_usart_t *volatile stdio_usart_base;

-

-

-/*! \brief Reads a number of bytes, at most \a size, into the memory area

- *         pointed to by \a buffer.

- *

- * \param handle File handle to read from.

- * \param buffer Pointer to buffer to write read bytes to.

- * \param size Number of bytes to read.

- *

- * \return The number of bytes read, \c 0 at the end of the file, or

- *         \c _LLIO_ERROR on failure.

- */

-size_t __read(int handle, uint8_t *buffer, size_t size)

-{

-  int nChars = 0;

-

-  // This implementation only reads from stdin.

-  // For all other file handles, it returns failure.

-  if (handle != _LLIO_STDIN)

-  {

-    return _LLIO_ERROR;

-  }

-

-  for (; size > 0; --size)

-  {

-    int c = usart_getchar(stdio_usart_base);

-    if (c < 0)

-      break;

-

-    *buffer++ = c;

-    ++nChars;

-  }

-

-  return nChars;

-}

-

-

-_STD_END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT AND BSD-3-Clause
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*This file is prepared for Doxygen automatic documentation generation.*/
+/*! \file *********************************************************************
+ *
+ * \brief System-specific implementation of the \ref __read function used by
+          the standard library.
+ *
+ * - Compiler:           IAR EWAVR32
+ * - Supported devices:  All AVR32 devices with a USART module can be used.
+ * - AppNote:
+ *
+ * \author               Atmel Corporation (Now Microchip):
+ *                                        https://www.microchip.com \n
+ *                       Support and FAQ: https://www.microchip.com/support/
+ *
+ ******************************************************************************/
+
+/*
+ * Copyright (c) 2007, Atmel Corporation All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of ATMEL may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
+ * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#include <yfuns.h>
+#include <avr32/io.h>
+#include "usart.h"
+
+
+_STD_BEGIN
+
+
+#pragma module_name = "?__read"
+
+
+extern volatile avr32_usart_t *volatile stdio_usart_base;
+
+
+/*! \brief Reads a number of bytes, at most \a size, into the memory area
+ *         pointed to by \a buffer.
+ *
+ * \param handle File handle to read from.
+ * \param buffer Pointer to buffer to write read bytes to.
+ * \param size Number of bytes to read.
+ *
+ * \return The number of bytes read, \c 0 at the end of the file, or
+ *         \c _LLIO_ERROR on failure.
+ */
+size_t __read(int handle, uint8_t *buffer, size_t size)
+{
+  int nChars = 0;
+
+  // This implementation only reads from stdin.
+  // For all other file handles, it returns failure.
+  if (handle != _LLIO_STDIN)
+  {
+    return _LLIO_ERROR;
+  }
+
+  for (; size > 0; --size)
+  {
+    int c = usart_getchar(stdio_usart_base);
+    if (c < 0)
+      break;
+
+    *buffer++ = c;
+    ++nChars;
+  }
+
+  return nChars;
+}
+
+
+_STD_END
diff --git a/portable/IAR/AVR32_UC3/write.c b/portable/IAR/AVR32_UC3/write.c
index fc2d766..c6e9429 100644
--- a/portable/IAR/AVR32_UC3/write.c
+++ b/portable/IAR/AVR32_UC3/write.c
@@ -1,133 +1,133 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT AND BSD-3-Clause

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*This file is prepared for Doxygen automatic documentation generation.*/

-/*! \file *********************************************************************

- *

- * \brief System-specific implementation of the \ref __write function used by

-          the standard library.

- *

- * - Compiler:           IAR EWAVR32

- * - Supported devices:  All AVR32 devices with a USART module can be used.

- * - AppNote:

- *

- * \author               Atmel Corporation (Now Microchip):

- *                                        https://www.microchip.com \n

- *                       Support and FAQ: https://www.microchip.com/support

- *

- ******************************************************************************/

-

-/*

- * Copyright (c) 2007, Atmel Corporation All rights reserved.

- *

- * Redistribution and use in source and binary forms, with or without

- * modification, are permitted provided that the following conditions are met:

- *

- * 1. Redistributions of source code must retain the above copyright notice,

- * this list of conditions and the following disclaimer.

- *

- * 2. Redistributions in binary form must reproduce the above copyright notice,

- * this list of conditions and the following disclaimer in the documentation

- * and/or other materials provided with the distribution.

- *

- * 3. The name of ATMEL may not be used to endorse or promote products derived

- * from this software without specific prior written permission.

- *

- * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED

- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND

- * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,

- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES

- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND

- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

- */

-

-

-#include <yfuns.h>

-#include <avr32/io.h>

-#include "usart.h"

-

-

-_STD_BEGIN

-

-

-#pragma module_name = "?__write"

-

-

-//! Pointer to the base of the USART module instance to use for stdio.

-__no_init volatile avr32_usart_t *volatile stdio_usart_base;

-

-

-/*! \brief Writes a number of bytes, at most \a size, from the memory area

- *         pointed to by \a buffer.

- *

- * If \a buffer is zero then \ref __write performs flushing of internal buffers,

- * if any. In this case, \a handle can be \c -1 to indicate that all handles

- * should be flushed.

- *

- * \param handle File handle to write to.

- * \param buffer Pointer to buffer to read bytes to write from.

- * \param size Number of bytes to write.

- *

- * \return The number of bytes written, or \c _LLIO_ERROR on failure.

- */

-size_t __write(int handle, const uint8_t *buffer, size_t size)

-{

-  size_t nChars = 0;

-

-  if (buffer == 0)

-  {

-    // This means that we should flush internal buffers.

-    return 0;

-  }

-

-  // This implementation only writes to stdout and stderr.

-  // For all other file handles, it returns failure.

-  if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR)

-  {

-    return _LLIO_ERROR;

-  }

-

-  for (; size != 0; --size)

-  {

-    if (usart_putchar(stdio_usart_base, *buffer++) < 0)

-    {

-      return _LLIO_ERROR;

-    }

-

-    ++nChars;

-  }

-

-  return nChars;

-}

-

-

-_STD_END

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT AND BSD-3-Clause
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*This file is prepared for Doxygen automatic documentation generation.*/
+/*! \file *********************************************************************
+ *
+ * \brief System-specific implementation of the \ref __write function used by
+          the standard library.
+ *
+ * - Compiler:           IAR EWAVR32
+ * - Supported devices:  All AVR32 devices with a USART module can be used.
+ * - AppNote:
+ *
+ * \author               Atmel Corporation (Now Microchip):
+ *                                        https://www.microchip.com \n
+ *                       Support and FAQ: https://www.microchip.com/support
+ *
+ ******************************************************************************/
+
+/*
+ * Copyright (c) 2007, Atmel Corporation All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of ATMEL may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
+ * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#include <yfuns.h>
+#include <avr32/io.h>
+#include "usart.h"
+
+
+_STD_BEGIN
+
+
+#pragma module_name = "?__write"
+
+
+//! Pointer to the base of the USART module instance to use for stdio.
+__no_init volatile avr32_usart_t *volatile stdio_usart_base;
+
+
+/*! \brief Writes a number of bytes, at most \a size, from the memory area
+ *         pointed to by \a buffer.
+ *
+ * If \a buffer is zero then \ref __write performs flushing of internal buffers,
+ * if any. In this case, \a handle can be \c -1 to indicate that all handles
+ * should be flushed.
+ *
+ * \param handle File handle to write to.
+ * \param buffer Pointer to buffer to read bytes to write from.
+ * \param size Number of bytes to write.
+ *
+ * \return The number of bytes written, or \c _LLIO_ERROR on failure.
+ */
+size_t __write(int handle, const uint8_t *buffer, size_t size)
+{
+  size_t nChars = 0;
+
+  if (buffer == 0)
+  {
+    // This means that we should flush internal buffers.
+    return 0;
+  }
+
+  // This implementation only writes to stdout and stderr.
+  // For all other file handles, it returns failure.
+  if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR)
+  {
+    return _LLIO_ERROR;
+  }
+
+  for (; size != 0; --size)
+  {
+    if (usart_putchar(stdio_usart_base, *buffer++) < 0)
+    {
+      return _LLIO_ERROR;
+    }
+
+    ++nChars;
+  }
+
+  return nChars;
+}
+
+
+_STD_END
diff --git a/portable/IAR/AVR_AVRDx/portmacro.s90 b/portable/IAR/AVR_AVRDx/portmacro.s90
index d5daa29..dc72ccf 100644
--- a/portable/IAR/AVR_AVRDx/portmacro.s90
+++ b/portable/IAR/AVR_AVRDx/portmacro.s90
@@ -75,7 +75,7 @@
         ldi r16, FLAG_MASK
         sts FLAG_REG, r16
         ld r16, y+
-        
+
         ENDM
 
 ; Saving and Restoring a Task Context and Task Switching
@@ -222,7 +222,7 @@
 vPortYieldFromTick:
     CLR_INT INT_FLAGS, INT_MASK     ; Clear tick interrupt flag
 
-    portSAVE_CONTEXT                ; Save the context of the current task.    
+    portSAVE_CONTEXT                ; Save the context of the current task.
     call xTaskIncrementTick         ; Call the timer tick function.
     tst r16
     breq SkipTaskSwitch
diff --git a/portable/IAR/AVR_Mega0/portmacro.s90 b/portable/IAR/AVR_Mega0/portmacro.s90
index 7ec1aee..2e50463 100644
--- a/portable/IAR/AVR_Mega0/portmacro.s90
+++ b/portable/IAR/AVR_Mega0/portmacro.s90
@@ -75,7 +75,7 @@
     ldi r16, FLAG_MASK
     sts FLAG_REG, r16
     ld r16, y+
-        
+
     ENDM
 
 ; Saving and Restoring a Task Context and Task Switching
@@ -134,7 +134,7 @@
     st  -y, r27
     st  -y, r30
     st  -y, r31
-        
+
     lds r0, uxCriticalNesting
     st  -y, r0                  ; Store the critical nesting counter.
 
@@ -215,7 +215,7 @@
 
 vPortYieldFromTick:
     CLR_INT INT_FLAGS, INT_MASK     ; Clear tick interrupt flag
- 
+
     portSAVE_CONTEXT                ; Save the context of the current task.
     call xTaskIncrementTick         ; Call the timer tick function.
     tst r16
diff --git a/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h b/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h
index 8f9ddb4..1077547 100644
--- a/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h
+++ b/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h
@@ -1,1914 +1,1914 @@
-// ----------------------------------------------------------------------------

-//          ATMEL Microcontroller Software Support  -  ROUSSET  -

-// ----------------------------------------------------------------------------

-//  The software is delivered "AS IS" without warranty or condition of any

-//  kind, either express, implied or statutory. This includes without

-//  limitation any warranty or condition with respect to merchantability or

-//  fitness for any particular purpose, or against the infringements of

-//  intellectual property rights of others.

-// ----------------------------------------------------------------------------

-// File Name           : AT91SAM7S64.h

-// Object              : AT91SAM7S64 definitions

-// Generated           : AT91 SW Application Group  07/16/2004 (07:43:08)

-// 

-// CVS Reference       : /AT91SAM7S64.pl/1.12/Mon Jul 12 13:02:30 2004//

-// CVS Reference       : /SYSC_SAM7Sxx.pl/1.5/Mon Jul 12 16:22:12 2004//

-// CVS Reference       : /MC_SAM02.pl/1.3/Wed Mar 10 08:37:04 2004//

-// CVS Reference       : /UDP_1765B.pl/1.3/Fri Aug  2 14:45:38 2002//

-// CVS Reference       : /AIC_1796B.pl/1.1.1.1/Fri Jun 28 09:36:48 2002//

-// CVS Reference       : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004//

-// CVS Reference       : /PIO_1725D.pl/1.1.1.1/Fri Jun 28 09:36:48 2002//

-// CVS Reference       : /DBGU_1754A.pl/1.4/Fri Jan 31 12:18:24 2003//

-// CVS Reference       : /US_1739C.pl/1.2/Mon Jul 12 17:26:24 2004//

-// CVS Reference       : /SPI2.pl/1.2/Fri Oct 17 08:13:40 2003//

-// CVS Reference       : /SSC_1762A.pl/1.2/Fri Nov  8 13:26:40 2002//

-// CVS Reference       : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003//

-// CVS Reference       : /TWI_1761B.pl/1.4/Fri Feb  7 10:30:08 2003//

-// CVS Reference       : /PDC_1734B.pl/1.2/Thu Nov 21 16:38:24 2002//

-// CVS Reference       : /ADC_SAM.pl/1.7/Fri Oct 17 08:12:38 2003//

-// CVS Reference       : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004//

-// ----------------------------------------------------------------------------

-

-#ifndef AT91SAM7S64_H

-#define AT91SAM7S64_H

-

-typedef volatile unsigned int AT91_REG;// Hardware register definition

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR System Peripherals

-// *****************************************************************************

-typedef struct _AT91S_SYSC {

-	AT91_REG	 SYSC_AIC_SMR[32]; 	// Source Mode Register

-	AT91_REG	 SYSC_AIC_SVR[32]; 	// Source Vector Register

-	AT91_REG	 SYSC_AIC_IVR; 	// IRQ Vector Register

-	AT91_REG	 SYSC_AIC_FVR; 	// FIQ Vector Register

-	AT91_REG	 SYSC_AIC_ISR; 	// Interrupt Status Register

-	AT91_REG	 SYSC_AIC_IPR; 	// Interrupt Pending Register

-	AT91_REG	 SYSC_AIC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 SYSC_AIC_CISR; 	// Core Interrupt Status Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 SYSC_AIC_IECR; 	// Interrupt Enable Command Register

-	AT91_REG	 SYSC_AIC_IDCR; 	// Interrupt Disable Command Register

-	AT91_REG	 SYSC_AIC_ICCR; 	// Interrupt Clear Command Register

-	AT91_REG	 SYSC_AIC_ISCR; 	// Interrupt Set Command Register

-	AT91_REG	 SYSC_AIC_EOICR; 	// End of Interrupt Command Register

-	AT91_REG	 SYSC_AIC_SPU; 	// Spurious Vector Register

-	AT91_REG	 SYSC_AIC_DCR; 	// Debug Control Register (Protect)

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 SYSC_AIC_FFER; 	// Fast Forcing Enable Register

-	AT91_REG	 SYSC_AIC_FFDR; 	// Fast Forcing Disable Register

-	AT91_REG	 SYSC_AIC_FFSR; 	// Fast Forcing Status Register

-	AT91_REG	 Reserved2[45]; 	// 

-	AT91_REG	 SYSC_DBGU_CR; 	// Control Register

-	AT91_REG	 SYSC_DBGU_MR; 	// Mode Register

-	AT91_REG	 SYSC_DBGU_IER; 	// Interrupt Enable Register

-	AT91_REG	 SYSC_DBGU_IDR; 	// Interrupt Disable Register

-	AT91_REG	 SYSC_DBGU_IMR; 	// Interrupt Mask Register

-	AT91_REG	 SYSC_DBGU_CSR; 	// Channel Status Register

-	AT91_REG	 SYSC_DBGU_RHR; 	// Receiver Holding Register

-	AT91_REG	 SYSC_DBGU_THR; 	// Transmitter Holding Register

-	AT91_REG	 SYSC_DBGU_BRGR; 	// Baud Rate Generator Register

-	AT91_REG	 Reserved3[7]; 	// 

-	AT91_REG	 SYSC_DBGU_C1R; 	// Chip ID1 Register

-	AT91_REG	 SYSC_DBGU_C2R; 	// Chip ID2 Register

-	AT91_REG	 SYSC_DBGU_FNTR; 	// Force NTRST Register

-	AT91_REG	 Reserved4[45]; 	// 

-	AT91_REG	 SYSC_DBGU_RPR; 	// Receive Pointer Register

-	AT91_REG	 SYSC_DBGU_RCR; 	// Receive Counter Register

-	AT91_REG	 SYSC_DBGU_TPR; 	// Transmit Pointer Register

-	AT91_REG	 SYSC_DBGU_TCR; 	// Transmit Counter Register

-	AT91_REG	 SYSC_DBGU_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 SYSC_DBGU_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 SYSC_DBGU_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 SYSC_DBGU_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 SYSC_DBGU_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 SYSC_DBGU_PTSR; 	// PDC Transfer Status Register

-	AT91_REG	 Reserved5[54]; 	// 

-	AT91_REG	 SYSC_PIOA_PER; 	// PIO Enable Register

-	AT91_REG	 SYSC_PIOA_PDR; 	// PIO Disable Register

-	AT91_REG	 SYSC_PIOA_PSR; 	// PIO Status Register

-	AT91_REG	 Reserved6[1]; 	// 

-	AT91_REG	 SYSC_PIOA_OER; 	// Output Enable Register

-	AT91_REG	 SYSC_PIOA_ODR; 	// Output Disable Registerr

-	AT91_REG	 SYSC_PIOA_OSR; 	// Output Status Register

-	AT91_REG	 Reserved7[1]; 	// 

-	AT91_REG	 SYSC_PIOA_IFER; 	// Input Filter Enable Register

-	AT91_REG	 SYSC_PIOA_IFDR; 	// Input Filter Disable Register

-	AT91_REG	 SYSC_PIOA_IFSR; 	// Input Filter Status Register

-	AT91_REG	 Reserved8[1]; 	// 

-	AT91_REG	 SYSC_PIOA_SODR; 	// Set Output Data Register

-	AT91_REG	 SYSC_PIOA_CODR; 	// Clear Output Data Register

-	AT91_REG	 SYSC_PIOA_ODSR; 	// Output Data Status Register

-	AT91_REG	 SYSC_PIOA_PDSR; 	// Pin Data Status Register

-	AT91_REG	 SYSC_PIOA_IER; 	// Interrupt Enable Register

-	AT91_REG	 SYSC_PIOA_IDR; 	// Interrupt Disable Register

-	AT91_REG	 SYSC_PIOA_IMR; 	// Interrupt Mask Register

-	AT91_REG	 SYSC_PIOA_ISR; 	// Interrupt Status Register

-	AT91_REG	 SYSC_PIOA_MDER; 	// Multi-driver Enable Register

-	AT91_REG	 SYSC_PIOA_MDDR; 	// Multi-driver Disable Register

-	AT91_REG	 SYSC_PIOA_MDSR; 	// Multi-driver Status Register

-	AT91_REG	 Reserved9[1]; 	// 

-	AT91_REG	 SYSC_PIOA_PPUDR; 	// Pull-up Disable Register

-	AT91_REG	 SYSC_PIOA_PPUER; 	// Pull-up Enable Register

-	AT91_REG	 SYSC_PIOA_PPUSR; 	// Pad Pull-up Status Register

-	AT91_REG	 Reserved10[1]; 	// 

-	AT91_REG	 SYSC_PIOA_ASR; 	// Select A Register

-	AT91_REG	 SYSC_PIOA_BSR; 	// Select B Register

-	AT91_REG	 SYSC_PIOA_ABSR; 	// AB Select Status Register

-	AT91_REG	 Reserved11[9]; 	// 

-	AT91_REG	 SYSC_PIOA_OWER; 	// Output Write Enable Register

-	AT91_REG	 SYSC_PIOA_OWDR; 	// Output Write Disable Register

-	AT91_REG	 SYSC_PIOA_OWSR; 	// Output Write Status Register

-	AT91_REG	 Reserved12[469]; 	// 

-	AT91_REG	 SYSC_PMC_SCER; 	// System Clock Enable Register

-	AT91_REG	 SYSC_PMC_SCDR; 	// System Clock Disable Register

-	AT91_REG	 SYSC_PMC_SCSR; 	// System Clock Status Register

-	AT91_REG	 Reserved13[1]; 	// 

-	AT91_REG	 SYSC_PMC_PCER; 	// Peripheral Clock Enable Register

-	AT91_REG	 SYSC_PMC_PCDR; 	// Peripheral Clock Disable Register

-	AT91_REG	 SYSC_PMC_PCSR; 	// Peripheral Clock Status Register

-	AT91_REG	 Reserved14[1]; 	// 

-	AT91_REG	 SYSC_PMC_MOR; 	// Main Oscillator Register

-	AT91_REG	 SYSC_PMC_MCFR; 	// Main Clock  Frequency Register

-	AT91_REG	 Reserved15[1]; 	// 

-	AT91_REG	 SYSC_PMC_PLLR; 	// PLL Register

-	AT91_REG	 SYSC_PMC_MCKR; 	// Master Clock Register

-	AT91_REG	 Reserved16[3]; 	// 

-	AT91_REG	 SYSC_PMC_PCKR[8]; 	// Programmable Clock Register

-	AT91_REG	 SYSC_PMC_IER; 	// Interrupt Enable Register

-	AT91_REG	 SYSC_PMC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 SYSC_PMC_SR; 	// Status Register

-	AT91_REG	 SYSC_PMC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 Reserved17[36]; 	// 

-	AT91_REG	 SYSC_RSTC_RCR; 	// Reset Control Register

-	AT91_REG	 SYSC_RSTC_RSR; 	// Reset Status Register

-	AT91_REG	 SYSC_RSTC_RMR; 	// Reset Mode Register

-	AT91_REG	 Reserved18[5]; 	// 

-	AT91_REG	 SYSC_RTTC_RTMR; 	// Real-time Mode Register

-	AT91_REG	 SYSC_RTTC_RTAR; 	// Real-time Alarm Register

-	AT91_REG	 SYSC_RTTC_RTVR; 	// Real-time Value Register

-	AT91_REG	 SYSC_RTTC_RTSR; 	// Real-time Status Register

-	AT91_REG	 SYSC_PITC_PIMR; 	// Period Interval Mode Register

-	AT91_REG	 SYSC_PITC_PISR; 	// Period Interval Status Register

-	AT91_REG	 SYSC_PITC_PIVR; 	// Period Interval Value Register

-	AT91_REG	 SYSC_PITC_PIIR; 	// Period Interval Image Register

-	AT91_REG	 SYSC_WDTC_WDCR; 	// Watchdog Control Register

-	AT91_REG	 SYSC_WDTC_WDMR; 	// Watchdog Mode Register

-	AT91_REG	 SYSC_WDTC_WDSR; 	// Watchdog Status Register

-	AT91_REG	 Reserved19[5]; 	// 

-	AT91_REG	 SYSC_SYSC_VRPM; 	// Voltage Regulator Power Mode Register

-} AT91S_SYSC, *AT91PS_SYSC;

-

-// -------- VRPM : (SYSC Offset: 0xd60) Voltage Regulator Power Mode Register -------- 

-#define AT91C_SYSC_PSTDBY     ((unsigned int) 0x1 <<  0) // (SYSC) Voltage Regulator Power Mode

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller

-// *****************************************************************************

-typedef struct _AT91S_AIC {

-	AT91_REG	 AIC_SMR[32]; 	// Source Mode Register

-	AT91_REG	 AIC_SVR[32]; 	// Source Vector Register

-	AT91_REG	 AIC_IVR; 	// IRQ Vector Register

-	AT91_REG	 AIC_FVR; 	// FIQ Vector Register

-	AT91_REG	 AIC_ISR; 	// Interrupt Status Register

-	AT91_REG	 AIC_IPR; 	// Interrupt Pending Register

-	AT91_REG	 AIC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 AIC_CISR; 	// Core Interrupt Status Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 AIC_IECR; 	// Interrupt Enable Command Register

-	AT91_REG	 AIC_IDCR; 	// Interrupt Disable Command Register

-	AT91_REG	 AIC_ICCR; 	// Interrupt Clear Command Register

-	AT91_REG	 AIC_ISCR; 	// Interrupt Set Command Register

-	AT91_REG	 AIC_EOICR; 	// End of Interrupt Command Register

-	AT91_REG	 AIC_SPU; 	// Spurious Vector Register

-	AT91_REG	 AIC_DCR; 	// Debug Control Register (Protect)

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 AIC_FFER; 	// Fast Forcing Enable Register

-	AT91_REG	 AIC_FFDR; 	// Fast Forcing Disable Register

-	AT91_REG	 AIC_FFSR; 	// Fast Forcing Status Register

-} AT91S_AIC, *AT91PS_AIC;

-

-// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- 

-#define AT91C_AIC_PRIOR       ((unsigned int) 0x7 <<  0) // (AIC) Priority Level

-#define 	AT91C_AIC_PRIOR_LOWEST               ((unsigned int) 0x0) // (AIC) Lowest priority level

-#define 	AT91C_AIC_PRIOR_HIGHEST              ((unsigned int) 0x7) // (AIC) Highest priority level

-#define AT91C_AIC_SRCTYPE     ((unsigned int) 0x3 <<  5) // (AIC) Interrupt Source Type

-#define 	AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE  ((unsigned int) 0x0 <<  5) // (AIC) Internal Sources Code Label Level Sensitive

-#define 	AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED   ((unsigned int) 0x1 <<  5) // (AIC) Internal Sources Code Label Edge triggered

-#define 	AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL       ((unsigned int) 0x2 <<  5) // (AIC) External Sources Code Label High-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE    ((unsigned int) 0x3 <<  5) // (AIC) External Sources Code Label Positive Edge triggered

-// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- 

-#define AT91C_AIC_NFIQ        ((unsigned int) 0x1 <<  0) // (AIC) NFIQ Status

-#define AT91C_AIC_NIRQ        ((unsigned int) 0x1 <<  1) // (AIC) NIRQ Status

-// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- 

-#define AT91C_AIC_DCR_PROT    ((unsigned int) 0x1 <<  0) // (AIC) Protection Mode

-#define AT91C_AIC_DCR_GMSK    ((unsigned int) 0x1 <<  1) // (AIC) General Mask

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Debug Unit

-// *****************************************************************************

-typedef struct _AT91S_DBGU {

-	AT91_REG	 DBGU_CR; 	// Control Register

-	AT91_REG	 DBGU_MR; 	// Mode Register

-	AT91_REG	 DBGU_IER; 	// Interrupt Enable Register

-	AT91_REG	 DBGU_IDR; 	// Interrupt Disable Register

-	AT91_REG	 DBGU_IMR; 	// Interrupt Mask Register

-	AT91_REG	 DBGU_CSR; 	// Channel Status Register

-	AT91_REG	 DBGU_RHR; 	// Receiver Holding Register

-	AT91_REG	 DBGU_THR; 	// Transmitter Holding Register

-	AT91_REG	 DBGU_BRGR; 	// Baud Rate Generator Register

-	AT91_REG	 Reserved0[7]; 	// 

-	AT91_REG	 DBGU_C1R; 	// Chip ID1 Register

-	AT91_REG	 DBGU_C2R; 	// Chip ID2 Register

-	AT91_REG	 DBGU_FNTR; 	// Force NTRST Register

-	AT91_REG	 Reserved1[45]; 	// 

-	AT91_REG	 DBGU_RPR; 	// Receive Pointer Register

-	AT91_REG	 DBGU_RCR; 	// Receive Counter Register

-	AT91_REG	 DBGU_TPR; 	// Transmit Pointer Register

-	AT91_REG	 DBGU_TCR; 	// Transmit Counter Register

-	AT91_REG	 DBGU_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 DBGU_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 DBGU_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 DBGU_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 DBGU_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 DBGU_PTSR; 	// PDC Transfer Status Register

-} AT91S_DBGU, *AT91PS_DBGU;

-

-// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_RSTRX        ((unsigned int) 0x1 <<  2) // (DBGU) Reset Receiver

-#define AT91C_US_RSTTX        ((unsigned int) 0x1 <<  3) // (DBGU) Reset Transmitter

-#define AT91C_US_RXEN         ((unsigned int) 0x1 <<  4) // (DBGU) Receiver Enable

-#define AT91C_US_RXDIS        ((unsigned int) 0x1 <<  5) // (DBGU) Receiver Disable

-#define AT91C_US_TXEN         ((unsigned int) 0x1 <<  6) // (DBGU) Transmitter Enable

-#define AT91C_US_TXDIS        ((unsigned int) 0x1 <<  7) // (DBGU) Transmitter Disable

-// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_PAR          ((unsigned int) 0x7 <<  9) // (DBGU) Parity type

-#define 	AT91C_US_PAR_EVEN                 ((unsigned int) 0x0 <<  9) // (DBGU) Even Parity

-#define 	AT91C_US_PAR_ODD                  ((unsigned int) 0x1 <<  9) // (DBGU) Odd Parity

-#define 	AT91C_US_PAR_SPACE                ((unsigned int) 0x2 <<  9) // (DBGU) Parity forced to 0 (Space)

-#define 	AT91C_US_PAR_MARK                 ((unsigned int) 0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)

-#define 	AT91C_US_PAR_NONE                 ((unsigned int) 0x4 <<  9) // (DBGU) No Parity

-#define 	AT91C_US_PAR_MULTI_DROP           ((unsigned int) 0x6 <<  9) // (DBGU) Multi-drop mode

-#define AT91C_US_CHMODE       ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode

-#define 	AT91C_US_CHMODE_NORMAL               ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.

-#define 	AT91C_US_CHMODE_AUTO                 ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.

-#define 	AT91C_US_CHMODE_LOCAL                ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.

-#define 	AT91C_US_CHMODE_REMOTE               ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.

-// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXRDY        ((unsigned int) 0x1 <<  0) // (DBGU) RXRDY Interrupt

-#define AT91C_US_TXRDY        ((unsigned int) 0x1 <<  1) // (DBGU) TXRDY Interrupt

-#define AT91C_US_ENDRX        ((unsigned int) 0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt

-#define AT91C_US_ENDTX        ((unsigned int) 0x1 <<  4) // (DBGU) End of Transmit Interrupt

-#define AT91C_US_OVRE         ((unsigned int) 0x1 <<  5) // (DBGU) Overrun Interrupt

-#define AT91C_US_FRAME        ((unsigned int) 0x1 <<  6) // (DBGU) Framing Error Interrupt

-#define AT91C_US_PARE         ((unsigned int) 0x1 <<  7) // (DBGU) Parity Error Interrupt

-#define AT91C_US_TXEMPTY      ((unsigned int) 0x1 <<  9) // (DBGU) TXEMPTY Interrupt

-#define AT91C_US_TXBUFE       ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt

-#define AT91C_US_RXBUFF       ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt

-#define AT91C_US_COMM_TX      ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt

-#define AT91C_US_COMM_RX      ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt

-// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- 

-// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- 

-#define AT91C_US_FORCE_NTRST  ((unsigned int) 0x1 <<  0) // (DBGU) Force NTRST in JTAG

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Peripheral Data Controller

-// *****************************************************************************

-typedef struct _AT91S_PDC {

-	AT91_REG	 PDC_RPR; 	// Receive Pointer Register

-	AT91_REG	 PDC_RCR; 	// Receive Counter Register

-	AT91_REG	 PDC_TPR; 	// Transmit Pointer Register

-	AT91_REG	 PDC_TCR; 	// Transmit Counter Register

-	AT91_REG	 PDC_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 PDC_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 PDC_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 PDC_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 PDC_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 PDC_PTSR; 	// PDC Transfer Status Register

-} AT91S_PDC, *AT91PS_PDC;

-

-// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- 

-#define AT91C_PDC_RXTEN       ((unsigned int) 0x1 <<  0) // (PDC) Receiver Transfer Enable

-#define AT91C_PDC_RXTDIS      ((unsigned int) 0x1 <<  1) // (PDC) Receiver Transfer Disable

-#define AT91C_PDC_TXTEN       ((unsigned int) 0x1 <<  8) // (PDC) Transmitter Transfer Enable

-#define AT91C_PDC_TXTDIS      ((unsigned int) 0x1 <<  9) // (PDC) Transmitter Transfer Disable

-// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler

-// *****************************************************************************

-typedef struct _AT91S_PIO {

-	AT91_REG	 PIO_PER; 	// PIO Enable Register

-	AT91_REG	 PIO_PDR; 	// PIO Disable Register

-	AT91_REG	 PIO_PSR; 	// PIO Status Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 PIO_OER; 	// Output Enable Register

-	AT91_REG	 PIO_ODR; 	// Output Disable Registerr

-	AT91_REG	 PIO_OSR; 	// Output Status Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 PIO_IFER; 	// Input Filter Enable Register

-	AT91_REG	 PIO_IFDR; 	// Input Filter Disable Register

-	AT91_REG	 PIO_IFSR; 	// Input Filter Status Register

-	AT91_REG	 Reserved2[1]; 	// 

-	AT91_REG	 PIO_SODR; 	// Set Output Data Register

-	AT91_REG	 PIO_CODR; 	// Clear Output Data Register

-	AT91_REG	 PIO_ODSR; 	// Output Data Status Register

-	AT91_REG	 PIO_PDSR; 	// Pin Data Status Register

-	AT91_REG	 PIO_IER; 	// Interrupt Enable Register

-	AT91_REG	 PIO_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PIO_IMR; 	// Interrupt Mask Register

-	AT91_REG	 PIO_ISR; 	// Interrupt Status Register

-	AT91_REG	 PIO_MDER; 	// Multi-driver Enable Register

-	AT91_REG	 PIO_MDDR; 	// Multi-driver Disable Register

-	AT91_REG	 PIO_MDSR; 	// Multi-driver Status Register

-	AT91_REG	 Reserved3[1]; 	// 

-	AT91_REG	 PIO_PPUDR; 	// Pull-up Disable Register

-	AT91_REG	 PIO_PPUER; 	// Pull-up Enable Register

-	AT91_REG	 PIO_PPUSR; 	// Pad Pull-up Status Register

-	AT91_REG	 Reserved4[1]; 	// 

-	AT91_REG	 PIO_ASR; 	// Select A Register

-	AT91_REG	 PIO_BSR; 	// Select B Register

-	AT91_REG	 PIO_ABSR; 	// AB Select Status Register

-	AT91_REG	 Reserved5[9]; 	// 

-	AT91_REG	 PIO_OWER; 	// Output Write Enable Register

-	AT91_REG	 PIO_OWDR; 	// Output Write Disable Register

-	AT91_REG	 PIO_OWSR; 	// Output Write Status Register

-} AT91S_PIO, *AT91PS_PIO;

-

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Clock Generator Controler

-// *****************************************************************************

-typedef struct _AT91S_CKGR {

-	AT91_REG	 CKGR_MOR; 	// Main Oscillator Register

-	AT91_REG	 CKGR_MCFR; 	// Main Clock  Frequency Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 CKGR_PLLR; 	// PLL Register

-} AT91S_CKGR, *AT91PS_CKGR;

-

-// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- 

-#define AT91C_CKGR_MOSCEN     ((unsigned int) 0x1 <<  0) // (CKGR) Main Oscillator Enable

-#define AT91C_CKGR_OSCBYPASS  ((unsigned int) 0x1 <<  1) // (CKGR) Main Oscillator Bypass

-#define AT91C_CKGR_OSCOUNT    ((unsigned int) 0xFF <<  8) // (CKGR) Main Oscillator Start-up Time

-// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- 

-#define AT91C_CKGR_MAINF      ((unsigned int) 0xFFFF <<  0) // (CKGR) Main Clock Frequency

-#define AT91C_CKGR_MAINRDY    ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready

-// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- 

-#define AT91C_CKGR_DIV        ((unsigned int) 0xFF <<  0) // (CKGR) Divider Selected

-#define 	AT91C_CKGR_DIV_0                    ((unsigned int) 0x0) // (CKGR) Divider output is 0

-#define 	AT91C_CKGR_DIV_BYPASS               ((unsigned int) 0x1) // (CKGR) Divider is bypassed

-#define AT91C_CKGR_PLLCOUNT   ((unsigned int) 0x3F <<  8) // (CKGR) PLL Counter

-#define AT91C_CKGR_OUT        ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range

-#define 	AT91C_CKGR_OUT_0                    ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_1                    ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_2                    ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_3                    ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet

-#define AT91C_CKGR_MUL        ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier

-#define AT91C_CKGR_USBDIV     ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks

-#define 	AT91C_CKGR_USBDIV_0                    ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output

-#define 	AT91C_CKGR_USBDIV_1                    ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2

-#define 	AT91C_CKGR_USBDIV_2                    ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Power Management Controler

-// *****************************************************************************

-typedef struct _AT91S_PMC {

-	AT91_REG	 PMC_SCER; 	// System Clock Enable Register

-	AT91_REG	 PMC_SCDR; 	// System Clock Disable Register

-	AT91_REG	 PMC_SCSR; 	// System Clock Status Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 PMC_PCER; 	// Peripheral Clock Enable Register

-	AT91_REG	 PMC_PCDR; 	// Peripheral Clock Disable Register

-	AT91_REG	 PMC_PCSR; 	// Peripheral Clock Status Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 PMC_MOR; 	// Main Oscillator Register

-	AT91_REG	 PMC_MCFR; 	// Main Clock  Frequency Register

-	AT91_REG	 Reserved2[1]; 	// 

-	AT91_REG	 PMC_PLLR; 	// PLL Register

-	AT91_REG	 PMC_MCKR; 	// Master Clock Register

-	AT91_REG	 Reserved3[3]; 	// 

-	AT91_REG	 PMC_PCKR[8]; 	// Programmable Clock Register

-	AT91_REG	 PMC_IER; 	// Interrupt Enable Register

-	AT91_REG	 PMC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PMC_SR; 	// Status Register

-	AT91_REG	 PMC_IMR; 	// Interrupt Mask Register

-} AT91S_PMC, *AT91PS_PMC;

-

-// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- 

-#define AT91C_PMC_PCK         ((unsigned int) 0x1 <<  0) // (PMC) Processor Clock

-#define AT91C_PMC_UDP         ((unsigned int) 0x1 <<  7) // (PMC) USB Device Port Clock

-#define AT91C_PMC_PCK0        ((unsigned int) 0x1 <<  8) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK1        ((unsigned int) 0x1 <<  9) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK2        ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK3        ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output

-// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- 

-// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- 

-// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- 

-// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- 

-// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- 

-// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- 

-#define AT91C_PMC_CSS         ((unsigned int) 0x3 <<  0) // (PMC) Programmable Clock Selection

-#define 	AT91C_PMC_CSS_SLOW_CLK             ((unsigned int) 0x0) // (PMC) Slow Clock is selected

-#define 	AT91C_PMC_CSS_MAIN_CLK             ((unsigned int) 0x1) // (PMC) Main Clock is selected

-#define 	AT91C_PMC_CSS_PLL_CLK              ((unsigned int) 0x3) // (PMC) Clock from PLL is selected

-#define AT91C_PMC_PRES        ((unsigned int) 0x7 <<  2) // (PMC) Programmable Clock Prescaler

-#define 	AT91C_PMC_PRES_CLK                  ((unsigned int) 0x0 <<  2) // (PMC) Selected clock

-#define 	AT91C_PMC_PRES_CLK_2                ((unsigned int) 0x1 <<  2) // (PMC) Selected clock divided by 2

-#define 	AT91C_PMC_PRES_CLK_4                ((unsigned int) 0x2 <<  2) // (PMC) Selected clock divided by 4

-#define 	AT91C_PMC_PRES_CLK_8                ((unsigned int) 0x3 <<  2) // (PMC) Selected clock divided by 8

-#define 	AT91C_PMC_PRES_CLK_16               ((unsigned int) 0x4 <<  2) // (PMC) Selected clock divided by 16

-#define 	AT91C_PMC_PRES_CLK_32               ((unsigned int) 0x5 <<  2) // (PMC) Selected clock divided by 32

-#define 	AT91C_PMC_PRES_CLK_64               ((unsigned int) 0x6 <<  2) // (PMC) Selected clock divided by 64

-// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- 

-// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- 

-#define AT91C_PMC_MOSCS       ((unsigned int) 0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask

-#define AT91C_PMC_LOCK        ((unsigned int) 0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask

-#define AT91C_PMC_MCKRDY      ((unsigned int) 0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK0RDY     ((unsigned int) 0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK1RDY     ((unsigned int) 0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK2RDY     ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK3RDY     ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask

-// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- 

-// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- 

-// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Reset Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_RSTC {

-	AT91_REG	 RSTC_RCR; 	// Reset Control Register

-	AT91_REG	 RSTC_RSR; 	// Reset Status Register

-	AT91_REG	 RSTC_RMR; 	// Reset Mode Register

-} AT91S_RSTC, *AT91PS_RSTC;

-

-// -------- SYSC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- 

-#define AT91C_SYSC_PROCRST    ((unsigned int) 0x1 <<  0) // (RSTC) Processor Reset

-#define AT91C_SYSC_ICERST     ((unsigned int) 0x1 <<  1) // (RSTC) ICE Interface Reset

-#define AT91C_SYSC_PERRST     ((unsigned int) 0x1 <<  2) // (RSTC) Peripheral Reset

-#define AT91C_SYSC_EXTRST     ((unsigned int) 0x1 <<  3) // (RSTC) External Reset

-#define AT91C_SYSC_KEY        ((unsigned int) 0xFF << 24) // (RSTC) Password

-// -------- SYSC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- 

-#define AT91C_SYSC_URSTS      ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Status

-#define AT91C_SYSC_BODSTS     ((unsigned int) 0x1 <<  1) // (RSTC) Brown-out Detection Status

-#define AT91C_SYSC_RSTTYP     ((unsigned int) 0x7 <<  8) // (RSTC) Reset Type

-#define 	AT91C_SYSC_RSTTYP_POWERUP              ((unsigned int) 0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.

-#define 	AT91C_SYSC_RSTTYP_WATCHDOG             ((unsigned int) 0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.

-#define 	AT91C_SYSC_RSTTYP_SOFTWARE             ((unsigned int) 0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.

-#define 	AT91C_SYSC_RSTTYP_USER                 ((unsigned int) 0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.

-#define 	AT91C_SYSC_RSTTYP_BROWNOUT             ((unsigned int) 0x5 <<  8) // (RSTC) Brown-out Reset.

-#define AT91C_SYSC_NRSTL      ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level

-#define AT91C_SYSC_SRCMP      ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress.

-// -------- SYSC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- 

-#define AT91C_SYSC_URSTEN     ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Enable

-#define AT91C_SYSC_URSTIEN    ((unsigned int) 0x1 <<  4) // (RSTC) User Reset Interrupt Enable

-#define AT91C_SYSC_ERSTL      ((unsigned int) 0xF <<  8) // (RSTC) User Reset Enable

-#define AT91C_SYSC_BODIEN     ((unsigned int) 0x1 << 16) // (RSTC) Brown-out Detection Interrupt Enable

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_RTTC {

-	AT91_REG	 RTTC_RTMR; 	// Real-time Mode Register

-	AT91_REG	 RTTC_RTAR; 	// Real-time Alarm Register

-	AT91_REG	 RTTC_RTVR; 	// Real-time Value Register

-	AT91_REG	 RTTC_RTSR; 	// Real-time Status Register

-} AT91S_RTTC, *AT91PS_RTTC;

-

-// -------- SYSC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- 

-#define AT91C_SYSC_RTPRES     ((unsigned int) 0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value

-#define AT91C_SYSC_ALMIEN     ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable

-#define AT91C_SYSC_RTTINCIEN  ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable

-#define AT91C_SYSC_RTTRST     ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart

-// -------- SYSC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- 

-#define AT91C_SYSC_ALMV       ((unsigned int) 0x0 <<  0) // (RTTC) Alarm Value

-// -------- SYSC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- 

-#define AT91C_SYSC_CRTV       ((unsigned int) 0x0 <<  0) // (RTTC) Current Real-time Value

-// -------- SYSC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- 

-#define AT91C_SYSC_ALMS       ((unsigned int) 0x1 <<  0) // (RTTC) Real-time Alarm Status

-#define AT91C_SYSC_RTTINC     ((unsigned int) 0x1 <<  1) // (RTTC) Real-time Timer Increment

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_PITC {

-	AT91_REG	 PITC_PIMR; 	// Period Interval Mode Register

-	AT91_REG	 PITC_PISR; 	// Period Interval Status Register

-	AT91_REG	 PITC_PIVR; 	// Period Interval Value Register

-	AT91_REG	 PITC_PIIR; 	// Period Interval Image Register

-} AT91S_PITC, *AT91PS_PITC;

-

-// -------- SYSC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- 

-#define AT91C_SYSC_PIV        ((unsigned int) 0xFFFFF <<  0) // (PITC) Periodic Interval Value

-#define AT91C_SYSC_PITEN      ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled

-#define AT91C_SYSC_PITIEN     ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable

-// -------- SYSC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- 

-#define AT91C_SYSC_PITS       ((unsigned int) 0x1 <<  0) // (PITC) Periodic Interval Timer Status

-// -------- SYSC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- 

-#define AT91C_SYSC_CPIV       ((unsigned int) 0xFFFFF <<  0) // (PITC) Current Periodic Interval Value

-#define AT91C_SYSC_PICNT      ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter

-// -------- SYSC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_WDTC {

-	AT91_REG	 WDTC_WDCR; 	// Watchdog Control Register

-	AT91_REG	 WDTC_WDMR; 	// Watchdog Mode Register

-	AT91_REG	 WDTC_WDSR; 	// Watchdog Status Register

-} AT91S_WDTC, *AT91PS_WDTC;

-

-// -------- SYSC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- 

-#define AT91C_SYSC_WDRSTT     ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Restart

-// -------- SYSC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- 

-#define AT91C_SYSC_WDV        ((unsigned int) 0xFFF <<  0) // (WDTC) Watchdog Timer Restart

-#define AT91C_SYSC_WDFIEN     ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable

-#define AT91C_SYSC_WDRSTEN    ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable

-#define AT91C_SYSC_WDRPROC    ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart

-#define AT91C_SYSC_WDDIS      ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable

-#define AT91C_SYSC_WDD        ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value

-#define AT91C_SYSC_WDDBGHLT   ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt

-#define AT91C_SYSC_WDIDLEHLT  ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt

-// -------- SYSC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- 

-#define AT91C_SYSC_WDUNF      ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Underflow

-#define AT91C_SYSC_WDERR      ((unsigned int) 0x1 <<  1) // (WDTC) Watchdog Error

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Memory Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_MC {

-	AT91_REG	 MC_RCR; 	// MC Remap Control Register

-	AT91_REG	 MC_ASR; 	// MC Abort Status Register

-	AT91_REG	 MC_AASR; 	// MC Abort Address Status Register

-	AT91_REG	 Reserved0[21]; 	// 

-	AT91_REG	 MC_FMR; 	// MC Flash Mode Register

-	AT91_REG	 MC_FCR; 	// MC Flash Command Register

-	AT91_REG	 MC_FSR; 	// MC Flash Status Register

-} AT91S_MC, *AT91PS_MC;

-

-// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- 

-#define AT91C_MC_RCB          ((unsigned int) 0x1 <<  0) // (MC) Remap Command Bit

-// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- 

-#define AT91C_MC_UNDADD       ((unsigned int) 0x1 <<  0) // (MC) Undefined Addess Abort Status

-#define AT91C_MC_MISADD       ((unsigned int) 0x1 <<  1) // (MC) Misaligned Addess Abort Status

-#define AT91C_MC_ABTSZ        ((unsigned int) 0x3 <<  8) // (MC) Abort Size Status

-#define 	AT91C_MC_ABTSZ_BYTE                 ((unsigned int) 0x0 <<  8) // (MC) Byte

-#define 	AT91C_MC_ABTSZ_HWORD                ((unsigned int) 0x1 <<  8) // (MC) Half-word

-#define 	AT91C_MC_ABTSZ_WORD                 ((unsigned int) 0x2 <<  8) // (MC) Word

-#define AT91C_MC_ABTTYP       ((unsigned int) 0x3 << 10) // (MC) Abort Type Status

-#define 	AT91C_MC_ABTTYP_DATAR                ((unsigned int) 0x0 << 10) // (MC) Data Read

-#define 	AT91C_MC_ABTTYP_DATAW                ((unsigned int) 0x1 << 10) // (MC) Data Write

-#define 	AT91C_MC_ABTTYP_FETCH                ((unsigned int) 0x2 << 10) // (MC) Code Fetch

-#define AT91C_MC_MST0         ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source

-#define AT91C_MC_MST1         ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source

-#define AT91C_MC_SVMST0       ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source

-#define AT91C_MC_SVMST1       ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source

-// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- 

-#define AT91C_MC_FRDY         ((unsigned int) 0x1 <<  0) // (MC) Flash Ready

-#define AT91C_MC_LOCKE        ((unsigned int) 0x1 <<  2) // (MC) Lock Error

-#define AT91C_MC_PROGE        ((unsigned int) 0x1 <<  3) // (MC) Programming Error

-#define AT91C_MC_NEBP         ((unsigned int) 0x1 <<  7) // (MC) No Erase Before Programming

-#define AT91C_MC_FWS          ((unsigned int) 0x3 <<  8) // (MC) Flash Wait State

-#define 	AT91C_MC_FWS_0FWS                 ((unsigned int) 0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations

-#define 	AT91C_MC_FWS_1FWS                 ((unsigned int) 0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations

-#define 	AT91C_MC_FWS_2FWS                 ((unsigned int) 0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations

-#define 	AT91C_MC_FWS_3FWS                 ((unsigned int) 0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations

-#define AT91C_MC_FMCN         ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number

-// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- 

-#define AT91C_MC_FCMD         ((unsigned int) 0xF <<  0) // (MC) Flash Command

-#define 	AT91C_MC_FCMD_START_PROG           ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN.

-#define 	AT91C_MC_FCMD_LOCK                 ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_PROG_AND_LOCK        ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.

-#define 	AT91C_MC_FCMD_UNLOCK               ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_ERASE_ALL            ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.

-#define 	AT91C_MC_FCMD_SET_GP_NVM           ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_CLR_GP_NVM           ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_SET_SECURITY         ((unsigned int) 0xF) // (MC) Set Security Bit.

-#define AT91C_MC_PAGEN        ((unsigned int) 0x3FF <<  8) // (MC) Page Number

-#define AT91C_MC_KEY          ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key

-// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- 

-#define AT91C_MC_SECURITY     ((unsigned int) 0x1 <<  4) // (MC) Security Bit Status

-#define AT91C_MC_GPNVM0       ((unsigned int) 0x1 <<  8) // (MC) Sector 0 Lock Status

-#define AT91C_MC_GPNVM1       ((unsigned int) 0x1 <<  9) // (MC) Sector 1 Lock Status

-#define AT91C_MC_GPNVM2       ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status

-#define AT91C_MC_GPNVM3       ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status

-#define AT91C_MC_GPNVM4       ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status

-#define AT91C_MC_GPNVM5       ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status

-#define AT91C_MC_GPNVM6       ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status

-#define AT91C_MC_GPNVM7       ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS0       ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status

-#define AT91C_MC_LOCKS1       ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status

-#define AT91C_MC_LOCKS2       ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status

-#define AT91C_MC_LOCKS3       ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status

-#define AT91C_MC_LOCKS4       ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status

-#define AT91C_MC_LOCKS5       ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status

-#define AT91C_MC_LOCKS6       ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status

-#define AT91C_MC_LOCKS7       ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS8       ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status

-#define AT91C_MC_LOCKS9       ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status

-#define AT91C_MC_LOCKS10      ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status

-#define AT91C_MC_LOCKS11      ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status

-#define AT91C_MC_LOCKS12      ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status

-#define AT91C_MC_LOCKS13      ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status

-#define AT91C_MC_LOCKS14      ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status

-#define AT91C_MC_LOCKS15      ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface

-// *****************************************************************************

-typedef struct _AT91S_SPI {

-	AT91_REG	 SPI_CR; 	// Control Register

-	AT91_REG	 SPI_MR; 	// Mode Register

-	AT91_REG	 SPI_RDR; 	// Receive Data Register

-	AT91_REG	 SPI_TDR; 	// Transmit Data Register

-	AT91_REG	 SPI_SR; 	// Status Register

-	AT91_REG	 SPI_IER; 	// Interrupt Enable Register

-	AT91_REG	 SPI_IDR; 	// Interrupt Disable Register

-	AT91_REG	 SPI_IMR; 	// Interrupt Mask Register

-	AT91_REG	 Reserved0[4]; 	// 

-	AT91_REG	 SPI_CSR[4]; 	// Chip Select Register

-	AT91_REG	 Reserved1[48]; 	// 

-	AT91_REG	 SPI_RPR; 	// Receive Pointer Register

-	AT91_REG	 SPI_RCR; 	// Receive Counter Register

-	AT91_REG	 SPI_TPR; 	// Transmit Pointer Register

-	AT91_REG	 SPI_TCR; 	// Transmit Counter Register

-	AT91_REG	 SPI_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 SPI_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 SPI_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 SPI_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 SPI_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 SPI_PTSR; 	// PDC Transfer Status Register

-} AT91S_SPI, *AT91PS_SPI;

-

-// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- 

-#define AT91C_SPI_SPIEN       ((unsigned int) 0x1 <<  0) // (SPI) SPI Enable

-#define AT91C_SPI_SPIDIS      ((unsigned int) 0x1 <<  1) // (SPI) SPI Disable

-#define AT91C_SPI_SWRST       ((unsigned int) 0x1 <<  7) // (SPI) SPI Software reset

-#define AT91C_SPI_LASTXFER    ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer

-// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- 

-#define AT91C_SPI_MSTR        ((unsigned int) 0x1 <<  0) // (SPI) Master/Slave Mode

-#define AT91C_SPI_PS          ((unsigned int) 0x1 <<  1) // (SPI) Peripheral Select

-#define 	AT91C_SPI_PS_FIXED                ((unsigned int) 0x0 <<  1) // (SPI) Fixed Peripheral Select

-#define 	AT91C_SPI_PS_VARIABLE             ((unsigned int) 0x1 <<  1) // (SPI) Variable Peripheral Select

-#define AT91C_SPI_PCSDEC      ((unsigned int) 0x1 <<  2) // (SPI) Chip Select Decode

-#define AT91C_SPI_FDIV        ((unsigned int) 0x1 <<  3) // (SPI) Clock Selection

-#define AT91C_SPI_MODFDIS     ((unsigned int) 0x1 <<  4) // (SPI) Mode Fault Detection

-#define AT91C_SPI_LLB         ((unsigned int) 0x1 <<  7) // (SPI) Clock Selection

-#define AT91C_SPI_PCS         ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select

-#define AT91C_SPI_DLYBCS      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects

-// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- 

-#define AT91C_SPI_RD          ((unsigned int) 0xFFFF <<  0) // (SPI) Receive Data

-#define AT91C_SPI_RPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- 

-#define AT91C_SPI_TD          ((unsigned int) 0xFFFF <<  0) // (SPI) Transmit Data

-#define AT91C_SPI_TPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- 

-#define AT91C_SPI_RDRF        ((unsigned int) 0x1 <<  0) // (SPI) Receive Data Register Full

-#define AT91C_SPI_TDRE        ((unsigned int) 0x1 <<  1) // (SPI) Transmit Data Register Empty

-#define AT91C_SPI_MODF        ((unsigned int) 0x1 <<  2) // (SPI) Mode Fault Error

-#define AT91C_SPI_OVRES       ((unsigned int) 0x1 <<  3) // (SPI) Overrun Error Status

-#define AT91C_SPI_ENDRX       ((unsigned int) 0x1 <<  4) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_ENDTX       ((unsigned int) 0x1 <<  5) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_RXBUFF      ((unsigned int) 0x1 <<  6) // (SPI) RXBUFF Interrupt

-#define AT91C_SPI_TXBUFE      ((unsigned int) 0x1 <<  7) // (SPI) TXBUFE Interrupt

-#define AT91C_SPI_NSSR        ((unsigned int) 0x1 <<  8) // (SPI) NSSR Interrupt

-#define AT91C_SPI_TXEMPTY     ((unsigned int) 0x1 <<  9) // (SPI) TXEMPTY Interrupt

-#define AT91C_SPI_SPIENS      ((unsigned int) 0x1 << 16) // (SPI) Enable Status

-// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- 

-// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- 

-// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- 

-// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- 

-#define AT91C_SPI_CPOL        ((unsigned int) 0x1 <<  0) // (SPI) Clock Polarity

-#define AT91C_SPI_NCPHA       ((unsigned int) 0x1 <<  1) // (SPI) Clock Phase

-#define AT91C_SPI_CSAAT       ((unsigned int) 0x1 <<  2) // (SPI) Chip Select Active After Transfer

-#define AT91C_SPI_BITS        ((unsigned int) 0xF <<  4) // (SPI) Bits Per Transfer

-#define 	AT91C_SPI_BITS_8                    ((unsigned int) 0x0 <<  4) // (SPI) 8 Bits Per transfer

-#define 	AT91C_SPI_BITS_9                    ((unsigned int) 0x1 <<  4) // (SPI) 9 Bits Per transfer

-#define 	AT91C_SPI_BITS_10                   ((unsigned int) 0x2 <<  4) // (SPI) 10 Bits Per transfer

-#define 	AT91C_SPI_BITS_11                   ((unsigned int) 0x3 <<  4) // (SPI) 11 Bits Per transfer

-#define 	AT91C_SPI_BITS_12                   ((unsigned int) 0x4 <<  4) // (SPI) 12 Bits Per transfer

-#define 	AT91C_SPI_BITS_13                   ((unsigned int) 0x5 <<  4) // (SPI) 13 Bits Per transfer

-#define 	AT91C_SPI_BITS_14                   ((unsigned int) 0x6 <<  4) // (SPI) 14 Bits Per transfer

-#define 	AT91C_SPI_BITS_15                   ((unsigned int) 0x7 <<  4) // (SPI) 15 Bits Per transfer

-#define 	AT91C_SPI_BITS_16                   ((unsigned int) 0x8 <<  4) // (SPI) 16 Bits Per transfer

-#define AT91C_SPI_SCBR        ((unsigned int) 0xFF <<  8) // (SPI) Serial Clock Baud Rate

-#define AT91C_SPI_DLYBS       ((unsigned int) 0xFF << 16) // (SPI) Serial Clock Baud Rate

-#define AT91C_SPI_DLYBCT      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor

-// *****************************************************************************

-typedef struct _AT91S_ADC {

-	AT91_REG	 ADC_CR; 	// ADC Control Register

-	AT91_REG	 ADC_MR; 	// ADC Mode Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 ADC_CHER; 	// ADC Channel Enable Register

-	AT91_REG	 ADC_CHDR; 	// ADC Channel Disable Register

-	AT91_REG	 ADC_CHSR; 	// ADC Channel Status Register

-	AT91_REG	 ADC_SR; 	// ADC Status Register

-	AT91_REG	 ADC_LCDR; 	// ADC Last Converted Data Register

-	AT91_REG	 ADC_IER; 	// ADC Interrupt Enable Register

-	AT91_REG	 ADC_IDR; 	// ADC Interrupt Disable Register

-	AT91_REG	 ADC_IMR; 	// ADC Interrupt Mask Register

-	AT91_REG	 ADC_CDR0; 	// ADC Channel Data Register 0

-	AT91_REG	 ADC_CDR1; 	// ADC Channel Data Register 1

-	AT91_REG	 ADC_CDR2; 	// ADC Channel Data Register 2

-	AT91_REG	 ADC_CDR3; 	// ADC Channel Data Register 3

-	AT91_REG	 ADC_CDR4; 	// ADC Channel Data Register 4

-	AT91_REG	 ADC_CDR5; 	// ADC Channel Data Register 5

-	AT91_REG	 ADC_CDR6; 	// ADC Channel Data Register 6

-	AT91_REG	 ADC_CDR7; 	// ADC Channel Data Register 7

-	AT91_REG	 Reserved1[44]; 	// 

-	AT91_REG	 ADC_RPR; 	// Receive Pointer Register

-	AT91_REG	 ADC_RCR; 	// Receive Counter Register

-	AT91_REG	 ADC_TPR; 	// Transmit Pointer Register

-	AT91_REG	 ADC_TCR; 	// Transmit Counter Register

-	AT91_REG	 ADC_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 ADC_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 ADC_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 ADC_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 ADC_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 ADC_PTSR; 	// PDC Transfer Status Register

-} AT91S_ADC, *AT91PS_ADC;

-

-// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- 

-#define AT91C_ADC_SWRST       ((unsigned int) 0x1 <<  0) // (ADC) Software Reset

-#define AT91C_ADC_START       ((unsigned int) 0x1 <<  1) // (ADC) Start Conversion

-// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- 

-#define AT91C_ADC_TRGEN       ((unsigned int) 0x1 <<  0) // (ADC) Trigger Enable

-#define 	AT91C_ADC_TRGEN_DIS                  ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software

-#define 	AT91C_ADC_TRGEN_EN                   ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.

-#define AT91C_ADC_TRGSEL      ((unsigned int) 0x7 <<  1) // (ADC) Trigger Selection

-#define 	AT91C_ADC_TRGSEL_TIOA0                ((unsigned int) 0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0

-#define 	AT91C_ADC_TRGSEL_TIOA1                ((unsigned int) 0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1

-#define 	AT91C_ADC_TRGSEL_TIOA2                ((unsigned int) 0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2

-#define 	AT91C_ADC_TRGSEL_TIOA3                ((unsigned int) 0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3

-#define 	AT91C_ADC_TRGSEL_TIOA4                ((unsigned int) 0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4

-#define 	AT91C_ADC_TRGSEL_TIOA5                ((unsigned int) 0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5

-#define 	AT91C_ADC_TRGSEL_EXT                  ((unsigned int) 0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger

-#define AT91C_ADC_LOWRES      ((unsigned int) 0x1 <<  4) // (ADC) Resolution.

-#define 	AT91C_ADC_LOWRES_10_BIT               ((unsigned int) 0x0 <<  4) // (ADC) 10-bit resolution

-#define 	AT91C_ADC_LOWRES_8_BIT                ((unsigned int) 0x1 <<  4) // (ADC) 8-bit resolution

-#define AT91C_ADC_SLEEP       ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode

-#define 	AT91C_ADC_SLEEP_NORMAL_MODE          ((unsigned int) 0x0 <<  5) // (ADC) Normal Mode

-#define 	AT91C_ADC_SLEEP_MODE                 ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode

-#define AT91C_ADC_PRESCAL     ((unsigned int) 0x3F <<  8) // (ADC) Prescaler rate selection

-#define AT91C_ADC_STARTUP     ((unsigned int) 0x1F << 16) // (ADC) Startup Time

-#define AT91C_ADC_SHTIM       ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time

-// -------- 	ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- 

-#define AT91C_ADC_CH0         ((unsigned int) 0x1 <<  0) // (ADC) Channel 0

-#define AT91C_ADC_CH1         ((unsigned int) 0x1 <<  1) // (ADC) Channel 1

-#define AT91C_ADC_CH2         ((unsigned int) 0x1 <<  2) // (ADC) Channel 2

-#define AT91C_ADC_CH3         ((unsigned int) 0x1 <<  3) // (ADC) Channel 3

-#define AT91C_ADC_CH4         ((unsigned int) 0x1 <<  4) // (ADC) Channel 4

-#define AT91C_ADC_CH5         ((unsigned int) 0x1 <<  5) // (ADC) Channel 5

-#define AT91C_ADC_CH6         ((unsigned int) 0x1 <<  6) // (ADC) Channel 6

-#define AT91C_ADC_CH7         ((unsigned int) 0x1 <<  7) // (ADC) Channel 7

-// -------- 	ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- 

-// -------- 	ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- 

-// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- 

-#define AT91C_ADC_EOC0        ((unsigned int) 0x1 <<  0) // (ADC) End of Conversion

-#define AT91C_ADC_EOC1        ((unsigned int) 0x1 <<  1) // (ADC) End of Conversion

-#define AT91C_ADC_EOC2        ((unsigned int) 0x1 <<  2) // (ADC) End of Conversion

-#define AT91C_ADC_EOC3        ((unsigned int) 0x1 <<  3) // (ADC) End of Conversion

-#define AT91C_ADC_EOC4        ((unsigned int) 0x1 <<  4) // (ADC) End of Conversion

-#define AT91C_ADC_EOC5        ((unsigned int) 0x1 <<  5) // (ADC) End of Conversion

-#define AT91C_ADC_EOC6        ((unsigned int) 0x1 <<  6) // (ADC) End of Conversion

-#define AT91C_ADC_EOC7        ((unsigned int) 0x1 <<  7) // (ADC) End of Conversion

-#define AT91C_ADC_OVRE0       ((unsigned int) 0x1 <<  8) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE1       ((unsigned int) 0x1 <<  9) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE2       ((unsigned int) 0x1 << 10) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE3       ((unsigned int) 0x1 << 11) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE4       ((unsigned int) 0x1 << 12) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE5       ((unsigned int) 0x1 << 13) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE6       ((unsigned int) 0x1 << 14) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE7       ((unsigned int) 0x1 << 15) // (ADC) Overrun Error

-#define AT91C_ADC_DRDY        ((unsigned int) 0x1 << 16) // (ADC) Data Ready

-#define AT91C_ADC_GOVRE       ((unsigned int) 0x1 << 17) // (ADC) General Overrun

-#define AT91C_ADC_ENDRX       ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer

-#define AT91C_ADC_RXBUFF      ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt

-// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- 

-#define AT91C_ADC_LDATA       ((unsigned int) 0x3FF <<  0) // (ADC) Last Data Converted

-// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- 

-// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- 

-// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- 

-// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- 

-#define AT91C_ADC_DATA        ((unsigned int) 0x3FF <<  0) // (ADC) Converted Data

-// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- 

-// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- 

-// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- 

-// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- 

-// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- 

-// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- 

-// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_SSC {

-	AT91_REG	 SSC_CR; 	// Control Register

-	AT91_REG	 SSC_CMR; 	// Clock Mode Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 SSC_RCMR; 	// Receive Clock ModeRegister

-	AT91_REG	 SSC_RFMR; 	// Receive Frame Mode Register

-	AT91_REG	 SSC_TCMR; 	// Transmit Clock Mode Register

-	AT91_REG	 SSC_TFMR; 	// Transmit Frame Mode Register

-	AT91_REG	 SSC_RHR; 	// Receive Holding Register

-	AT91_REG	 SSC_THR; 	// Transmit Holding Register

-	AT91_REG	 Reserved1[2]; 	// 

-	AT91_REG	 SSC_RSHR; 	// Receive Sync Holding Register

-	AT91_REG	 SSC_TSHR; 	// Transmit Sync Holding Register

-	AT91_REG	 SSC_RC0R; 	// Receive Compare 0 Register

-	AT91_REG	 SSC_RC1R; 	// Receive Compare 1 Register

-	AT91_REG	 SSC_SR; 	// Status Register

-	AT91_REG	 SSC_IER; 	// Interrupt Enable Register

-	AT91_REG	 SSC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 SSC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 Reserved2[44]; 	// 

-	AT91_REG	 SSC_RPR; 	// Receive Pointer Register

-	AT91_REG	 SSC_RCR; 	// Receive Counter Register

-	AT91_REG	 SSC_TPR; 	// Transmit Pointer Register

-	AT91_REG	 SSC_TCR; 	// Transmit Counter Register

-	AT91_REG	 SSC_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 SSC_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 SSC_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 SSC_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 SSC_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 SSC_PTSR; 	// PDC Transfer Status Register

-} AT91S_SSC, *AT91PS_SSC;

-

-// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- 

-#define AT91C_SSC_RXEN        ((unsigned int) 0x1 <<  0) // (SSC) Receive Enable

-#define AT91C_SSC_RXDIS       ((unsigned int) 0x1 <<  1) // (SSC) Receive Disable

-#define AT91C_SSC_TXEN        ((unsigned int) 0x1 <<  8) // (SSC) Transmit Enable

-#define AT91C_SSC_TXDIS       ((unsigned int) 0x1 <<  9) // (SSC) Transmit Disable

-#define AT91C_SSC_SWRST       ((unsigned int) 0x1 << 15) // (SSC) Software Reset

-// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- 

-#define AT91C_SSC_CKS         ((unsigned int) 0x3 <<  0) // (SSC) Receive/Transmit Clock Selection

-#define 	AT91C_SSC_CKS_DIV                  ((unsigned int) 0x0) // (SSC) Divided Clock

-#define 	AT91C_SSC_CKS_TK                   ((unsigned int) 0x1) // (SSC) TK Clock signal

-#define 	AT91C_SSC_CKS_RK                   ((unsigned int) 0x2) // (SSC) RK pin

-#define AT91C_SSC_CKO         ((unsigned int) 0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection

-#define 	AT91C_SSC_CKO_NONE                 ((unsigned int) 0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only

-#define 	AT91C_SSC_CKO_CONTINOUS            ((unsigned int) 0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output

-#define 	AT91C_SSC_CKO_DATA_TX              ((unsigned int) 0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output

-#define AT91C_SSC_CKI         ((unsigned int) 0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion

-#define AT91C_SSC_CKG         ((unsigned int) 0x3 <<  6) // (SSC) Receive/Transmit Clock Gating Selection

-#define 	AT91C_SSC_CKG_NONE                 ((unsigned int) 0x0 <<  6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock

-#define 	AT91C_SSC_CKG_LOW                  ((unsigned int) 0x1 <<  6) // (SSC) Receive/Transmit Clock enabled only if RF Low

-#define 	AT91C_SSC_CKG_HIGH                 ((unsigned int) 0x2 <<  6) // (SSC) Receive/Transmit Clock enabled only if RF High

-#define AT91C_SSC_START       ((unsigned int) 0xF <<  8) // (SSC) Receive/Transmit Start Selection

-#define 	AT91C_SSC_START_CONTINOUS            ((unsigned int) 0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.

-#define 	AT91C_SSC_START_TX                   ((unsigned int) 0x1 <<  8) // (SSC) Transmit/Receive start

-#define 	AT91C_SSC_START_LOW_RF               ((unsigned int) 0x2 <<  8) // (SSC) Detection of a low level on RF input

-#define 	AT91C_SSC_START_HIGH_RF              ((unsigned int) 0x3 <<  8) // (SSC) Detection of a high level on RF input

-#define 	AT91C_SSC_START_FALL_RF              ((unsigned int) 0x4 <<  8) // (SSC) Detection of a falling edge on RF input

-#define 	AT91C_SSC_START_RISE_RF              ((unsigned int) 0x5 <<  8) // (SSC) Detection of a rising edge on RF input

-#define 	AT91C_SSC_START_LEVEL_RF             ((unsigned int) 0x6 <<  8) // (SSC) Detection of any level change on RF input

-#define 	AT91C_SSC_START_EDGE_RF              ((unsigned int) 0x7 <<  8) // (SSC) Detection of any edge on RF input

-#define 	AT91C_SSC_START_0                    ((unsigned int) 0x8 <<  8) // (SSC) Compare 0

-#define AT91C_SSC_STOP        ((unsigned int) 0x1 << 12) // (SSC) Receive Stop Selection

-#define AT91C_SSC_STTOUT      ((unsigned int) 0x1 << 15) // (SSC) Receive/Transmit Start Output Selection

-#define AT91C_SSC_STTDLY      ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay

-#define AT91C_SSC_PERIOD      ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection

-// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- 

-#define AT91C_SSC_DATLEN      ((unsigned int) 0x1F <<  0) // (SSC) Data Length

-#define AT91C_SSC_LOOP        ((unsigned int) 0x1 <<  5) // (SSC) Loop Mode

-#define AT91C_SSC_MSBF        ((unsigned int) 0x1 <<  7) // (SSC) Most Significant Bit First

-#define AT91C_SSC_DATNB       ((unsigned int) 0xF <<  8) // (SSC) Data Number per Frame

-#define AT91C_SSC_FSLEN       ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length

-#define AT91C_SSC_FSOS        ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection

-#define 	AT91C_SSC_FSOS_NONE                 ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only

-#define 	AT91C_SSC_FSOS_NEGATIVE             ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse

-#define 	AT91C_SSC_FSOS_POSITIVE             ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse

-#define 	AT91C_SSC_FSOS_LOW                  ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer

-#define 	AT91C_SSC_FSOS_HIGH                 ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer

-#define 	AT91C_SSC_FSOS_TOGGLE               ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer

-#define AT91C_SSC_FSEDGE      ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection

-// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- 

-// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- 

-#define AT91C_SSC_DATDEF      ((unsigned int) 0x1 <<  5) // (SSC) Data Default Value

-#define AT91C_SSC_FSDEN       ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable

-// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- 

-#define AT91C_SSC_TXRDY       ((unsigned int) 0x1 <<  0) // (SSC) Transmit Ready

-#define AT91C_SSC_TXEMPTY     ((unsigned int) 0x1 <<  1) // (SSC) Transmit Empty

-#define AT91C_SSC_ENDTX       ((unsigned int) 0x1 <<  2) // (SSC) End Of Transmission

-#define AT91C_SSC_TXBUFE      ((unsigned int) 0x1 <<  3) // (SSC) Transmit Buffer Empty

-#define AT91C_SSC_RXRDY       ((unsigned int) 0x1 <<  4) // (SSC) Receive Ready

-#define AT91C_SSC_OVRUN       ((unsigned int) 0x1 <<  5) // (SSC) Receive Overrun

-#define AT91C_SSC_ENDRX       ((unsigned int) 0x1 <<  6) // (SSC) End of Reception

-#define AT91C_SSC_RXBUFF      ((unsigned int) 0x1 <<  7) // (SSC) Receive Buffer Full

-#define AT91C_SSC_CP0         ((unsigned int) 0x1 <<  8) // (SSC) Compare 0

-#define AT91C_SSC_CP1         ((unsigned int) 0x1 <<  9) // (SSC) Compare 1

-#define AT91C_SSC_TXSYN       ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync

-#define AT91C_SSC_RXSYN       ((unsigned int) 0x1 << 11) // (SSC) Receive Sync

-#define AT91C_SSC_TXENA       ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable

-#define AT91C_SSC_RXENA       ((unsigned int) 0x1 << 17) // (SSC) Receive Enable

-// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- 

-// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- 

-// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Usart

-// *****************************************************************************

-typedef struct _AT91S_USART {

-	AT91_REG	 US_CR; 	// Control Register

-	AT91_REG	 US_MR; 	// Mode Register

-	AT91_REG	 US_IER; 	// Interrupt Enable Register

-	AT91_REG	 US_IDR; 	// Interrupt Disable Register

-	AT91_REG	 US_IMR; 	// Interrupt Mask Register

-	AT91_REG	 US_CSR; 	// Channel Status Register

-	AT91_REG	 US_RHR; 	// Receiver Holding Register

-	AT91_REG	 US_THR; 	// Transmitter Holding Register

-	AT91_REG	 US_BRGR; 	// Baud Rate Generator Register

-	AT91_REG	 US_RTOR; 	// Receiver Time-out Register

-	AT91_REG	 US_TTGR; 	// Transmitter Time-guard Register

-	AT91_REG	 Reserved0[5]; 	// 

-	AT91_REG	 US_FIDI; 	// FI_DI_Ratio Register

-	AT91_REG	 US_NER; 	// Nb Errors Register

-	AT91_REG	 US_XXR; 	// XON_XOFF Register

-	AT91_REG	 US_IF; 	// IRDA_FILTER Register

-	AT91_REG	 Reserved1[44]; 	// 

-	AT91_REG	 US_RPR; 	// Receive Pointer Register

-	AT91_REG	 US_RCR; 	// Receive Counter Register

-	AT91_REG	 US_TPR; 	// Transmit Pointer Register

-	AT91_REG	 US_TCR; 	// Transmit Counter Register

-	AT91_REG	 US_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 US_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 US_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 US_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 US_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 US_PTSR; 	// PDC Transfer Status Register

-} AT91S_USART, *AT91PS_USART;

-

-// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_RSTSTA       ((unsigned int) 0x1 <<  8) // (USART) Reset Status Bits

-#define AT91C_US_STTBRK       ((unsigned int) 0x1 <<  9) // (USART) Start Break

-#define AT91C_US_STPBRK       ((unsigned int) 0x1 << 10) // (USART) Stop Break

-#define AT91C_US_STTTO        ((unsigned int) 0x1 << 11) // (USART) Start Time-out

-#define AT91C_US_SENDA        ((unsigned int) 0x1 << 12) // (USART) Send Address

-#define AT91C_US_RSTIT        ((unsigned int) 0x1 << 13) // (USART) Reset Iterations

-#define AT91C_US_RSTNACK      ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge

-#define AT91C_US_RETTO        ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out

-#define AT91C_US_DTREN        ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable

-#define AT91C_US_DTRDIS       ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable

-#define AT91C_US_RTSEN        ((unsigned int) 0x1 << 18) // (USART) Request to Send enable

-#define AT91C_US_RTSDIS       ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable

-// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_USMODE       ((unsigned int) 0xF <<  0) // (USART) Usart mode

-#define 	AT91C_US_USMODE_NORMAL               ((unsigned int) 0x0) // (USART) Normal

-#define 	AT91C_US_USMODE_RS485                ((unsigned int) 0x1) // (USART) RS485

-#define 	AT91C_US_USMODE_HWHSH                ((unsigned int) 0x2) // (USART) Hardware Handshaking

-#define 	AT91C_US_USMODE_MODEM                ((unsigned int) 0x3) // (USART) Modem

-#define 	AT91C_US_USMODE_ISO7816_0            ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0

-#define 	AT91C_US_USMODE_ISO7816_1            ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1

-#define 	AT91C_US_USMODE_IRDA                 ((unsigned int) 0x8) // (USART) IrDA

-#define 	AT91C_US_USMODE_SWHSH                ((unsigned int) 0xC) // (USART) Software Handshaking

-#define AT91C_US_CLKS         ((unsigned int) 0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CLKS_CLOCK                ((unsigned int) 0x0 <<  4) // (USART) Clock

-#define 	AT91C_US_CLKS_FDIV1                ((unsigned int) 0x1 <<  4) // (USART) fdiv1

-#define 	AT91C_US_CLKS_SLOW                 ((unsigned int) 0x2 <<  4) // (USART) slow_clock (ARM)

-#define 	AT91C_US_CLKS_EXT                  ((unsigned int) 0x3 <<  4) // (USART) External (SCK)

-#define AT91C_US_CHRL         ((unsigned int) 0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CHRL_5_BITS               ((unsigned int) 0x0 <<  6) // (USART) Character Length: 5 bits

-#define 	AT91C_US_CHRL_6_BITS               ((unsigned int) 0x1 <<  6) // (USART) Character Length: 6 bits

-#define 	AT91C_US_CHRL_7_BITS               ((unsigned int) 0x2 <<  6) // (USART) Character Length: 7 bits

-#define 	AT91C_US_CHRL_8_BITS               ((unsigned int) 0x3 <<  6) // (USART) Character Length: 8 bits

-#define AT91C_US_SYNC         ((unsigned int) 0x1 <<  8) // (USART) Synchronous Mode Select

-#define AT91C_US_NBSTOP       ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits

-#define 	AT91C_US_NBSTOP_1_BIT                ((unsigned int) 0x0 << 12) // (USART) 1 stop bit

-#define 	AT91C_US_NBSTOP_15_BIT               ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits

-#define 	AT91C_US_NBSTOP_2_BIT                ((unsigned int) 0x2 << 12) // (USART) 2 stop bits

-#define AT91C_US_MSBF         ((unsigned int) 0x1 << 16) // (USART) Bit Order

-#define AT91C_US_MODE9        ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length

-#define AT91C_US_CKLO         ((unsigned int) 0x1 << 18) // (USART) Clock Output Select

-#define AT91C_US_OVER         ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode

-#define AT91C_US_INACK        ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge

-#define AT91C_US_DSNACK       ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK

-#define AT91C_US_MAX_ITER     ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions

-#define AT91C_US_FILTER       ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter

-// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXBRK        ((unsigned int) 0x1 <<  2) // (USART) Break Received/End of Break

-#define AT91C_US_TIMEOUT      ((unsigned int) 0x1 <<  8) // (USART) Receiver Time-out

-#define AT91C_US_ITERATION    ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached

-#define AT91C_US_NACK         ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge

-#define AT91C_US_RIIC         ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag

-#define AT91C_US_DSRIC        ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag

-#define AT91C_US_DCDIC        ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag

-#define AT91C_US_CTSIC        ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag

-// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- 

-#define AT91C_US_RI           ((unsigned int) 0x1 << 20) // (USART) Image of RI Input

-#define AT91C_US_DSR          ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input

-#define AT91C_US_DCD          ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input

-#define AT91C_US_CTS          ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Two-wire Interface

-// *****************************************************************************

-typedef struct _AT91S_TWI {

-	AT91_REG	 TWI_CR; 	// Control Register

-	AT91_REG	 TWI_MMR; 	// Master Mode Register

-	AT91_REG	 TWI_SMR; 	// Slave Mode Register

-	AT91_REG	 TWI_IADR; 	// Internal Address Register

-	AT91_REG	 TWI_CWGR; 	// Clock Waveform Generator Register

-	AT91_REG	 Reserved0[3]; 	// 

-	AT91_REG	 TWI_SR; 	// Status Register

-	AT91_REG	 TWI_IER; 	// Interrupt Enable Register

-	AT91_REG	 TWI_IDR; 	// Interrupt Disable Register

-	AT91_REG	 TWI_IMR; 	// Interrupt Mask Register

-	AT91_REG	 TWI_RHR; 	// Receive Holding Register

-	AT91_REG	 TWI_THR; 	// Transmit Holding Register

-} AT91S_TWI, *AT91PS_TWI;

-

-// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- 

-#define AT91C_TWI_START       ((unsigned int) 0x1 <<  0) // (TWI) Send a START Condition

-#define AT91C_TWI_STOP        ((unsigned int) 0x1 <<  1) // (TWI) Send a STOP Condition

-#define AT91C_TWI_MSEN        ((unsigned int) 0x1 <<  2) // (TWI) TWI Master Transfer Enabled

-#define AT91C_TWI_MSDIS       ((unsigned int) 0x1 <<  3) // (TWI) TWI Master Transfer Disabled

-#define AT91C_TWI_SVEN        ((unsigned int) 0x1 <<  4) // (TWI) TWI Slave Transfer Enabled

-#define AT91C_TWI_SVDIS       ((unsigned int) 0x1 <<  5) // (TWI) TWI Slave Transfer Disabled

-#define AT91C_TWI_SWRST       ((unsigned int) 0x1 <<  7) // (TWI) Software Reset

-// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- 

-#define AT91C_TWI_IADRSZ      ((unsigned int) 0x3 <<  8) // (TWI) Internal Device Address Size

-#define 	AT91C_TWI_IADRSZ_NO                   ((unsigned int) 0x0 <<  8) // (TWI) No internal device address

-#define 	AT91C_TWI_IADRSZ_1_BYTE               ((unsigned int) 0x1 <<  8) // (TWI) One-byte internal device address

-#define 	AT91C_TWI_IADRSZ_2_BYTE               ((unsigned int) 0x2 <<  8) // (TWI) Two-byte internal device address

-#define 	AT91C_TWI_IADRSZ_3_BYTE               ((unsigned int) 0x3 <<  8) // (TWI) Three-byte internal device address

-#define AT91C_TWI_MREAD       ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction

-#define AT91C_TWI_DADR        ((unsigned int) 0x7F << 16) // (TWI) Device Address

-// -------- TWI_SMR : (TWI Offset: 0x8) TWI Slave Mode Register -------- 

-#define AT91C_TWI_SADR        ((unsigned int) 0x7F << 16) // (TWI) Slave Device Address

-// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- 

-#define AT91C_TWI_CLDIV       ((unsigned int) 0xFF <<  0) // (TWI) Clock Low Divider

-#define AT91C_TWI_CHDIV       ((unsigned int) 0xFF <<  8) // (TWI) Clock High Divider

-#define AT91C_TWI_CKDIV       ((unsigned int) 0x7 << 16) // (TWI) Clock Divider

-// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- 

-#define AT91C_TWI_TXCOMP      ((unsigned int) 0x1 <<  0) // (TWI) Transmission Completed

-#define AT91C_TWI_RXRDY       ((unsigned int) 0x1 <<  1) // (TWI) Receive holding register ReaDY

-#define AT91C_TWI_TXRDY       ((unsigned int) 0x1 <<  2) // (TWI) Transmit holding register ReaDY

-#define AT91C_TWI_SVREAD      ((unsigned int) 0x1 <<  3) // (TWI) Slave Read

-#define AT91C_TWI_SVACC       ((unsigned int) 0x1 <<  4) // (TWI) Slave Access

-#define AT91C_TWI_GCACC       ((unsigned int) 0x1 <<  5) // (TWI) General Call Access

-#define AT91C_TWI_OVRE        ((unsigned int) 0x1 <<  6) // (TWI) Overrun Error

-#define AT91C_TWI_UNRE        ((unsigned int) 0x1 <<  7) // (TWI) Underrun Error

-#define AT91C_TWI_NACK        ((unsigned int) 0x1 <<  8) // (TWI) Not Acknowledged

-#define AT91C_TWI_ARBLST      ((unsigned int) 0x1 <<  9) // (TWI) Arbitration Lost

-// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- 

-// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- 

-// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface

-// *****************************************************************************

-typedef struct _AT91S_TC {

-	AT91_REG	 TC_CCR; 	// Channel Control Register

-	AT91_REG	 TC_CMR; 	// Channel Mode Register (Capture Mode / Waveform Mode)

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 TC_CV; 	// Counter Value

-	AT91_REG	 TC_RA; 	// Register A

-	AT91_REG	 TC_RB; 	// Register B

-	AT91_REG	 TC_RC; 	// Register C

-	AT91_REG	 TC_SR; 	// Status Register

-	AT91_REG	 TC_IER; 	// Interrupt Enable Register

-	AT91_REG	 TC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 TC_IMR; 	// Interrupt Mask Register

-} AT91S_TC, *AT91PS_TC;

-

-// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- 

-#define AT91C_TC_CLKEN        ((unsigned int) 0x1 <<  0) // (TC) Counter Clock Enable Command

-#define AT91C_TC_CLKDIS       ((unsigned int) 0x1 <<  1) // (TC) Counter Clock Disable Command

-#define AT91C_TC_SWTRG        ((unsigned int) 0x1 <<  2) // (TC) Software Trigger Command

-// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- 

-#define AT91C_TC_CLKS         ((unsigned int) 0x7 <<  0) // (TC) Clock Selection

-#define 	AT91C_TC_CLKS_TIMER_DIV1_CLOCK     ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV2_CLOCK     ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV3_CLOCK     ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV4_CLOCK     ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV5_CLOCK     ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK

-#define 	AT91C_TC_CLKS_XC0                  ((unsigned int) 0x5) // (TC) Clock selected: XC0

-#define 	AT91C_TC_CLKS_XC1                  ((unsigned int) 0x6) // (TC) Clock selected: XC1

-#define 	AT91C_TC_CLKS_XC2                  ((unsigned int) 0x7) // (TC) Clock selected: XC2

-#define AT91C_TC_CLKI         ((unsigned int) 0x1 <<  3) // (TC) Clock Invert

-#define AT91C_TC_BURST        ((unsigned int) 0x3 <<  4) // (TC) Burst Signal Selection

-#define 	AT91C_TC_BURST_NONE                 ((unsigned int) 0x0 <<  4) // (TC) The clock is not gated by an external signal

-#define 	AT91C_TC_BURST_XC0                  ((unsigned int) 0x1 <<  4) // (TC) XC0 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC1                  ((unsigned int) 0x2 <<  4) // (TC) XC1 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC2                  ((unsigned int) 0x3 <<  4) // (TC) XC2 is ANDed with the selected clock

-#define AT91C_TC_CPCSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare

-#define AT91C_TC_LDBSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading

-#define AT91C_TC_LDBDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading

-#define AT91C_TC_CPCDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disable with RC Compare

-#define AT91C_TC_ETRGEDG      ((unsigned int) 0x3 <<  8) // (TC) External Trigger Edge Selection

-#define 	AT91C_TC_ETRGEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_ETRGEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_ETRGEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_ETRGEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_EEVTEDG      ((unsigned int) 0x3 <<  8) // (TC) External Event Edge Selection

-#define 	AT91C_TC_EEVTEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_EEVTEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_EEVTEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_EEVTEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_ABETRG       ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection

-#define AT91C_TC_EEVT         ((unsigned int) 0x3 << 10) // (TC) External Event  Selection

-#define 	AT91C_TC_EEVT_NONE                 ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input

-#define 	AT91C_TC_EEVT_RISING               ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output

-#define 	AT91C_TC_EEVT_FALLING              ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output

-#define 	AT91C_TC_EEVT_BOTH                 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output

-#define AT91C_TC_ENETRG       ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable

-#define AT91C_TC_WAVESEL      ((unsigned int) 0x3 << 13) // (TC) Waveform  Selection

-#define 	AT91C_TC_WAVESEL_UP                   ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN               ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UP_AUTO              ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN_AUTO          ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare

-#define AT91C_TC_CPCTRG       ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable

-#define AT91C_TC_WAVE         ((unsigned int) 0x1 << 15) // (TC) 

-#define AT91C_TC_LDRA         ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection

-#define 	AT91C_TC_LDRA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Edge: None

-#define 	AT91C_TC_LDRA_RISING               ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRA_FALLING              ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRA_BOTH                 ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_ACPA         ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA

-#define 	AT91C_TC_ACPA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Effect: none

-#define 	AT91C_TC_ACPA_SET                  ((unsigned int) 0x1 << 16) // (TC) Effect: set

-#define 	AT91C_TC_ACPA_CLEAR                ((unsigned int) 0x2 << 16) // (TC) Effect: clear

-#define 	AT91C_TC_ACPA_TOGGLE               ((unsigned int) 0x3 << 16) // (TC) Effect: toggle

-#define AT91C_TC_LDRB         ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection

-#define 	AT91C_TC_LDRB_NONE                 ((unsigned int) 0x0 << 18) // (TC) Edge: None

-#define 	AT91C_TC_LDRB_RISING               ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRB_FALLING              ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRB_BOTH                 ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_ACPC         ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA

-#define 	AT91C_TC_ACPC_NONE                 ((unsigned int) 0x0 << 18) // (TC) Effect: none

-#define 	AT91C_TC_ACPC_SET                  ((unsigned int) 0x1 << 18) // (TC) Effect: set

-#define 	AT91C_TC_ACPC_CLEAR                ((unsigned int) 0x2 << 18) // (TC) Effect: clear

-#define 	AT91C_TC_ACPC_TOGGLE               ((unsigned int) 0x3 << 18) // (TC) Effect: toggle

-#define AT91C_TC_AEEVT        ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA

-#define 	AT91C_TC_AEEVT_NONE                 ((unsigned int) 0x0 << 20) // (TC) Effect: none

-#define 	AT91C_TC_AEEVT_SET                  ((unsigned int) 0x1 << 20) // (TC) Effect: set

-#define 	AT91C_TC_AEEVT_CLEAR                ((unsigned int) 0x2 << 20) // (TC) Effect: clear

-#define 	AT91C_TC_AEEVT_TOGGLE               ((unsigned int) 0x3 << 20) // (TC) Effect: toggle

-#define AT91C_TC_ASWTRG       ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA

-#define 	AT91C_TC_ASWTRG_NONE                 ((unsigned int) 0x0 << 22) // (TC) Effect: none

-#define 	AT91C_TC_ASWTRG_SET                  ((unsigned int) 0x1 << 22) // (TC) Effect: set

-#define 	AT91C_TC_ASWTRG_CLEAR                ((unsigned int) 0x2 << 22) // (TC) Effect: clear

-#define 	AT91C_TC_ASWTRG_TOGGLE               ((unsigned int) 0x3 << 22) // (TC) Effect: toggle

-#define AT91C_TC_BCPB         ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB

-#define 	AT91C_TC_BCPB_NONE                 ((unsigned int) 0x0 << 24) // (TC) Effect: none

-#define 	AT91C_TC_BCPB_SET                  ((unsigned int) 0x1 << 24) // (TC) Effect: set

-#define 	AT91C_TC_BCPB_CLEAR                ((unsigned int) 0x2 << 24) // (TC) Effect: clear

-#define 	AT91C_TC_BCPB_TOGGLE               ((unsigned int) 0x3 << 24) // (TC) Effect: toggle

-#define AT91C_TC_BCPC         ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB

-#define 	AT91C_TC_BCPC_NONE                 ((unsigned int) 0x0 << 26) // (TC) Effect: none

-#define 	AT91C_TC_BCPC_SET                  ((unsigned int) 0x1 << 26) // (TC) Effect: set

-#define 	AT91C_TC_BCPC_CLEAR                ((unsigned int) 0x2 << 26) // (TC) Effect: clear

-#define 	AT91C_TC_BCPC_TOGGLE               ((unsigned int) 0x3 << 26) // (TC) Effect: toggle

-#define AT91C_TC_BEEVT        ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB

-#define 	AT91C_TC_BEEVT_NONE                 ((unsigned int) 0x0 << 28) // (TC) Effect: none

-#define 	AT91C_TC_BEEVT_SET                  ((unsigned int) 0x1 << 28) // (TC) Effect: set

-#define 	AT91C_TC_BEEVT_CLEAR                ((unsigned int) 0x2 << 28) // (TC) Effect: clear

-#define 	AT91C_TC_BEEVT_TOGGLE               ((unsigned int) 0x3 << 28) // (TC) Effect: toggle

-#define AT91C_TC_BSWTRG       ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB

-#define 	AT91C_TC_BSWTRG_NONE                 ((unsigned int) 0x0 << 30) // (TC) Effect: none

-#define 	AT91C_TC_BSWTRG_SET                  ((unsigned int) 0x1 << 30) // (TC) Effect: set

-#define 	AT91C_TC_BSWTRG_CLEAR                ((unsigned int) 0x2 << 30) // (TC) Effect: clear

-#define 	AT91C_TC_BSWTRG_TOGGLE               ((unsigned int) 0x3 << 30) // (TC) Effect: toggle

-// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- 

-#define AT91C_TC_COVFS        ((unsigned int) 0x1 <<  0) // (TC) Counter Overflow

-#define AT91C_TC_LOVRS        ((unsigned int) 0x1 <<  1) // (TC) Load Overrun

-#define AT91C_TC_CPAS         ((unsigned int) 0x1 <<  2) // (TC) RA Compare

-#define AT91C_TC_CPBS         ((unsigned int) 0x1 <<  3) // (TC) RB Compare

-#define AT91C_TC_CPCS         ((unsigned int) 0x1 <<  4) // (TC) RC Compare

-#define AT91C_TC_LDRAS        ((unsigned int) 0x1 <<  5) // (TC) RA Loading

-#define AT91C_TC_LDRBS        ((unsigned int) 0x1 <<  6) // (TC) RB Loading

-#define AT91C_TC_ETRCS        ((unsigned int) 0x1 <<  7) // (TC) External Trigger

-#define AT91C_TC_ETRGS        ((unsigned int) 0x1 << 16) // (TC) Clock Enabling

-#define AT91C_TC_MTIOA        ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror

-#define AT91C_TC_MTIOB        ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror

-// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- 

-// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- 

-// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Interface

-// *****************************************************************************

-typedef struct _AT91S_TCB {

-	AT91S_TC	 TCB_TC0; 	// TC Channel 0

-	AT91_REG	 Reserved0[4]; 	// 

-	AT91S_TC	 TCB_TC1; 	// TC Channel 1

-	AT91_REG	 Reserved1[4]; 	// 

-	AT91S_TC	 TCB_TC2; 	// TC Channel 2

-	AT91_REG	 Reserved2[4]; 	// 

-	AT91_REG	 TCB_BCR; 	// TC Block Control Register

-	AT91_REG	 TCB_BMR; 	// TC Block Mode Register

-} AT91S_TCB, *AT91PS_TCB;

-

-// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- 

-#define AT91C_TCB_SYNC        ((unsigned int) 0x1 <<  0) // (TCB) Synchro Command

-// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- 

-#define AT91C_TCB_TC0XC0S     ((unsigned int) 0x1 <<  0) // (TCB) External Clock Signal 0 Selection

-#define 	AT91C_TCB_TC0XC0S_TCLK0                ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_NONE                 ((unsigned int) 0x1) // (TCB) None signal connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA1                ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA2                ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0

-#define AT91C_TCB_TC1XC1S     ((unsigned int) 0x1 <<  2) // (TCB) External Clock Signal 1 Selection

-#define 	AT91C_TCB_TC1XC1S_TCLK1                ((unsigned int) 0x0 <<  2) // (TCB) TCLK1 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_NONE                 ((unsigned int) 0x1 <<  2) // (TCB) None signal connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA0                ((unsigned int) 0x2 <<  2) // (TCB) TIOA0 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA2                ((unsigned int) 0x3 <<  2) // (TCB) TIOA2 connected to XC1

-#define AT91C_TCB_TC2XC2S     ((unsigned int) 0x1 <<  4) // (TCB) External Clock Signal 2 Selection

-#define 	AT91C_TCB_TC2XC2S_TCLK2                ((unsigned int) 0x0 <<  4) // (TCB) TCLK2 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_NONE                 ((unsigned int) 0x1 <<  4) // (TCB) None signal connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA0                ((unsigned int) 0x2 <<  4) // (TCB) TIOA0 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA2                ((unsigned int) 0x3 <<  4) // (TCB) TIOA2 connected to XC2

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface

-// *****************************************************************************

-typedef struct _AT91S_PWMC_CH {

-	AT91_REG	 PWMC_CMR; 	// Channel Mode Register

-	AT91_REG	 PWMC_CDTYR; 	// Channel Duty Cycle Register

-	AT91_REG	 PWMC_CPRDR; 	// Channel Period Register

-	AT91_REG	 PWMC_CCNTR; 	// Channel Counter Register

-	AT91_REG	 PWMC_CUPDR; 	// Channel Update Register

-	AT91_REG	 PWMC_Reserved[3]; 	// Reserved

-} AT91S_PWMC_CH, *AT91PS_PWMC_CH;

-

-// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- 

-#define AT91C_PWMC_CPRE       ((unsigned int) 0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx

-#define 	AT91C_PWMC_CPRE_MCK                  ((unsigned int) 0x0) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKA                 ((unsigned int) 0xB) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKB                 ((unsigned int) 0xC) // (PWMC_CH) 

-#define AT91C_PWMC_CALG       ((unsigned int) 0x1 <<  8) // (PWMC_CH) Channel Alignment

-#define AT91C_PWMC_CPOL       ((unsigned int) 0x1 <<  9) // (PWMC_CH) Channel Polarity

-#define AT91C_PWMC_CPD        ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period

-// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- 

-#define AT91C_PWMC_CDTY       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Duty Cycle

-// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- 

-#define AT91C_PWMC_CPRD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Period

-// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- 

-#define AT91C_PWMC_CCNT       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Counter

-// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- 

-#define AT91C_PWMC_CUPD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Update

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_PWMC {

-	AT91_REG	 PWMC_MR; 	// PWMC Mode Register

-	AT91_REG	 PWMC_ENA; 	// PWMC Enable Register

-	AT91_REG	 PWMC_DIS; 	// PWMC Disable Register

-	AT91_REG	 PWMC_SR; 	// PWMC Status Register

-	AT91_REG	 PWMC_IER; 	// PWMC Interrupt Enable Register

-	AT91_REG	 PWMC_IDR; 	// PWMC Interrupt Disable Register

-	AT91_REG	 PWMC_IMR; 	// PWMC Interrupt Mask Register

-	AT91_REG	 PWMC_ISR; 	// PWMC Interrupt Status Register

-	AT91_REG	 Reserved0[55]; 	// 

-	AT91_REG	 PWMC_VR; 	// PWMC Version Register

-	AT91_REG	 Reserved1[64]; 	// 

-	AT91S_PWMC_CH	 PWMC_CH[32]; 	// PWMC Channel 0

-} AT91S_PWMC, *AT91PS_PWMC;

-

-// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- 

-#define AT91C_PWMC_DIVA       ((unsigned int) 0xFF <<  0) // (PWMC) CLKA divide factor.

-#define AT91C_PWMC_PREA       ((unsigned int) 0xF <<  8) // (PWMC) Divider Input Clock Prescaler A

-#define 	AT91C_PWMC_PREA_MCK                  ((unsigned int) 0x0 <<  8) // (PWMC) 

-#define AT91C_PWMC_DIVB       ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor.

-#define AT91C_PWMC_PREB       ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B

-#define 	AT91C_PWMC_PREB_MCK                  ((unsigned int) 0x0 << 24) // (PWMC) 

-// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- 

-#define AT91C_PWMC_CHID0      ((unsigned int) 0x1 <<  0) // (PWMC) Channel ID 0

-#define AT91C_PWMC_CHID1      ((unsigned int) 0x1 <<  1) // (PWMC) Channel ID 1

-#define AT91C_PWMC_CHID2      ((unsigned int) 0x1 <<  2) // (PWMC) Channel ID 2

-#define AT91C_PWMC_CHID3      ((unsigned int) 0x1 <<  3) // (PWMC) Channel ID 3

-#define AT91C_PWMC_CHID4      ((unsigned int) 0x1 <<  4) // (PWMC) Channel ID 4

-#define AT91C_PWMC_CHID5      ((unsigned int) 0x1 <<  5) // (PWMC) Channel ID 5

-#define AT91C_PWMC_CHID6      ((unsigned int) 0x1 <<  6) // (PWMC) Channel ID 6

-#define AT91C_PWMC_CHID7      ((unsigned int) 0x1 <<  7) // (PWMC) Channel ID 7

-// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- 

-// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- 

-// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- 

-// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- 

-// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- 

-// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR USB Device Interface

-// *****************************************************************************

-typedef struct _AT91S_UDP {

-	AT91_REG	 UDP_NUM; 	// Frame Number Register

-	AT91_REG	 UDP_GLBSTATE; 	// Global State Register

-	AT91_REG	 UDP_FADDR; 	// Function Address Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 UDP_IER; 	// Interrupt Enable Register

-	AT91_REG	 UDP_IDR; 	// Interrupt Disable Register

-	AT91_REG	 UDP_IMR; 	// Interrupt Mask Register

-	AT91_REG	 UDP_ISR; 	// Interrupt Status Register

-	AT91_REG	 UDP_ICR; 	// Interrupt Clear Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 UDP_RSTEP; 	// Reset Endpoint Register

-	AT91_REG	 Reserved2[1]; 	// 

-	AT91_REG	 UDP_CSR[8]; 	// Endpoint Control and Status Register

-	AT91_REG	 UDP_FDR[8]; 	// Endpoint FIFO Data Register

-} AT91S_UDP, *AT91PS_UDP;

-

-// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- 

-#define AT91C_UDP_FRM_NUM     ((unsigned int) 0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats

-#define AT91C_UDP_FRM_ERR     ((unsigned int) 0x1 << 16) // (UDP) Frame Error

-#define AT91C_UDP_FRM_OK      ((unsigned int) 0x1 << 17) // (UDP) Frame OK

-// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- 

-#define AT91C_UDP_FADDEN      ((unsigned int) 0x1 <<  0) // (UDP) Function Address Enable

-#define AT91C_UDP_CONFG       ((unsigned int) 0x1 <<  1) // (UDP) Configured

-#define AT91C_UDP_RMWUPE      ((unsigned int) 0x1 <<  2) // (UDP) Remote Wake Up Enable

-#define AT91C_UDP_RSMINPR     ((unsigned int) 0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host

-// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- 

-#define AT91C_UDP_FADD        ((unsigned int) 0xFF <<  0) // (UDP) Function Address Value

-#define AT91C_UDP_FEN         ((unsigned int) 0x1 <<  8) // (UDP) Function Enable

-// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- 

-#define AT91C_UDP_EPINT0      ((unsigned int) 0x1 <<  0) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT1      ((unsigned int) 0x1 <<  1) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT2      ((unsigned int) 0x1 <<  2) // (UDP) Endpoint 2 Interrupt

-#define AT91C_UDP_EPINT3      ((unsigned int) 0x1 <<  3) // (UDP) Endpoint 3 Interrupt

-#define AT91C_UDP_EPINT4      ((unsigned int) 0x1 <<  4) // (UDP) Endpoint 4 Interrupt

-#define AT91C_UDP_EPINT5      ((unsigned int) 0x1 <<  5) // (UDP) Endpoint 5 Interrupt

-#define AT91C_UDP_EPINT6      ((unsigned int) 0x1 <<  6) // (UDP) Endpoint 6 Interrupt

-#define AT91C_UDP_EPINT7      ((unsigned int) 0x1 <<  7) // (UDP) Endpoint 7 Interrupt

-#define AT91C_UDP_RXSUSP      ((unsigned int) 0x1 <<  8) // (UDP) USB Suspend Interrupt

-#define AT91C_UDP_RXRSM       ((unsigned int) 0x1 <<  9) // (UDP) USB Resume Interrupt

-#define AT91C_UDP_EXTRSM      ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt

-#define AT91C_UDP_SOFINT      ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt

-#define AT91C_UDP_WAKEUP      ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt

-// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- 

-// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- 

-// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- 

-#define AT91C_UDP_ENDBUSRES   ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt

-// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- 

-// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- 

-#define AT91C_UDP_EP0         ((unsigned int) 0x1 <<  0) // (UDP) Reset Endpoint 0

-#define AT91C_UDP_EP1         ((unsigned int) 0x1 <<  1) // (UDP) Reset Endpoint 1

-#define AT91C_UDP_EP2         ((unsigned int) 0x1 <<  2) // (UDP) Reset Endpoint 2

-#define AT91C_UDP_EP3         ((unsigned int) 0x1 <<  3) // (UDP) Reset Endpoint 3

-#define AT91C_UDP_EP4         ((unsigned int) 0x1 <<  4) // (UDP) Reset Endpoint 4

-#define AT91C_UDP_EP5         ((unsigned int) 0x1 <<  5) // (UDP) Reset Endpoint 5

-#define AT91C_UDP_EP6         ((unsigned int) 0x1 <<  6) // (UDP) Reset Endpoint 6

-#define AT91C_UDP_EP7         ((unsigned int) 0x1 <<  7) // (UDP) Reset Endpoint 7

-// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- 

-#define AT91C_UDP_TXCOMP      ((unsigned int) 0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR

-#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 <<  1) // (UDP) Receive Data Bank 0

-#define AT91C_UDP_RXSETUP     ((unsigned int) 0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)

-#define AT91C_UDP_ISOERROR    ((unsigned int) 0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)

-#define AT91C_UDP_TXPKTRDY    ((unsigned int) 0x1 <<  4) // (UDP) Transmit Packet Ready

-#define AT91C_UDP_FORCESTALL  ((unsigned int) 0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).

-#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).

-#define AT91C_UDP_DIR         ((unsigned int) 0x1 <<  7) // (UDP) Transfer Direction

-#define AT91C_UDP_EPTYPE      ((unsigned int) 0x7 <<  8) // (UDP) Endpoint type

-#define 	AT91C_UDP_EPTYPE_CTRL                 ((unsigned int) 0x0 <<  8) // (UDP) Control

-#define 	AT91C_UDP_EPTYPE_ISO_OUT              ((unsigned int) 0x1 <<  8) // (UDP) Isochronous OUT

-#define 	AT91C_UDP_EPTYPE_BULK_OUT             ((unsigned int) 0x2 <<  8) // (UDP) Bulk OUT

-#define 	AT91C_UDP_EPTYPE_INT_OUT              ((unsigned int) 0x3 <<  8) // (UDP) Interrupt OUT

-#define 	AT91C_UDP_EPTYPE_ISO_IN               ((unsigned int) 0x5 <<  8) // (UDP) Isochronous IN

-#define 	AT91C_UDP_EPTYPE_BULK_IN              ((unsigned int) 0x6 <<  8) // (UDP) Bulk IN

-#define 	AT91C_UDP_EPTYPE_INT_IN               ((unsigned int) 0x7 <<  8) // (UDP) Interrupt IN

-#define AT91C_UDP_DTGLE       ((unsigned int) 0x1 << 11) // (UDP) Data Toggle

-#define AT91C_UDP_EPEDS       ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable

-#define AT91C_UDP_RXBYTECNT   ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO

-

-// *****************************************************************************

-//               REGISTER ADDRESS DEFINITION FOR AT91SAM7S64

-// *****************************************************************************

-// ========== Register definition for SYSC peripheral ========== 

-#define AT91C_SYSC_SYSC_VRPM ((AT91_REG *) 	0xFFFFFD60) // (SYSC) Voltage Regulator Power Mode Register

-// ========== Register definition for AIC peripheral ========== 

-#define AT91C_AIC_ICCR  ((AT91_REG *) 	0xFFFFF128) // (AIC) Interrupt Clear Command Register

-#define AT91C_AIC_IECR  ((AT91_REG *) 	0xFFFFF120) // (AIC) Interrupt Enable Command Register

-#define AT91C_AIC_SMR   ((AT91_REG *) 	0xFFFFF000) // (AIC) Source Mode Register

-#define AT91C_AIC_ISCR  ((AT91_REG *) 	0xFFFFF12C) // (AIC) Interrupt Set Command Register

-#define AT91C_AIC_EOICR ((AT91_REG *) 	0xFFFFF130) // (AIC) End of Interrupt Command Register

-#define AT91C_AIC_DCR   ((AT91_REG *) 	0xFFFFF138) // (AIC) Debug Control Register (Protect)

-#define AT91C_AIC_FFER  ((AT91_REG *) 	0xFFFFF140) // (AIC) Fast Forcing Enable Register

-#define AT91C_AIC_SVR   ((AT91_REG *) 	0xFFFFF080) // (AIC) Source Vector Register

-#define AT91C_AIC_SPU   ((AT91_REG *) 	0xFFFFF134) // (AIC) Spurious Vector Register

-#define AT91C_AIC_FFDR  ((AT91_REG *) 	0xFFFFF144) // (AIC) Fast Forcing Disable Register

-#define AT91C_AIC_FVR   ((AT91_REG *) 	0xFFFFF104) // (AIC) FIQ Vector Register

-#define AT91C_AIC_FFSR  ((AT91_REG *) 	0xFFFFF148) // (AIC) Fast Forcing Status Register

-#define AT91C_AIC_IMR   ((AT91_REG *) 	0xFFFFF110) // (AIC) Interrupt Mask Register

-#define AT91C_AIC_ISR   ((AT91_REG *) 	0xFFFFF108) // (AIC) Interrupt Status Register

-#define AT91C_AIC_IVR   ((AT91_REG *) 	0xFFFFF100) // (AIC) IRQ Vector Register

-#define AT91C_AIC_IDCR  ((AT91_REG *) 	0xFFFFF124) // (AIC) Interrupt Disable Command Register

-#define AT91C_AIC_CISR  ((AT91_REG *) 	0xFFFFF114) // (AIC) Core Interrupt Status Register

-#define AT91C_AIC_IPR   ((AT91_REG *) 	0xFFFFF10C) // (AIC) Interrupt Pending Register

-// ========== Register definition for DBGU peripheral ========== 

-#define AT91C_DBGU_C2R  ((AT91_REG *) 	0xFFFFF244) // (DBGU) Chip ID2 Register

-#define AT91C_DBGU_THR  ((AT91_REG *) 	0xFFFFF21C) // (DBGU) Transmitter Holding Register

-#define AT91C_DBGU_CSR  ((AT91_REG *) 	0xFFFFF214) // (DBGU) Channel Status Register

-#define AT91C_DBGU_IDR  ((AT91_REG *) 	0xFFFFF20C) // (DBGU) Interrupt Disable Register

-#define AT91C_DBGU_MR   ((AT91_REG *) 	0xFFFFF204) // (DBGU) Mode Register

-#define AT91C_DBGU_FNTR ((AT91_REG *) 	0xFFFFF248) // (DBGU) Force NTRST Register

-#define AT91C_DBGU_C1R  ((AT91_REG *) 	0xFFFFF240) // (DBGU) Chip ID1 Register

-#define AT91C_DBGU_BRGR ((AT91_REG *) 	0xFFFFF220) // (DBGU) Baud Rate Generator Register

-#define AT91C_DBGU_RHR  ((AT91_REG *) 	0xFFFFF218) // (DBGU) Receiver Holding Register

-#define AT91C_DBGU_IMR  ((AT91_REG *) 	0xFFFFF210) // (DBGU) Interrupt Mask Register

-#define AT91C_DBGU_IER  ((AT91_REG *) 	0xFFFFF208) // (DBGU) Interrupt Enable Register

-#define AT91C_DBGU_CR   ((AT91_REG *) 	0xFFFFF200) // (DBGU) Control Register

-// ========== Register definition for PDC_DBGU peripheral ========== 

-#define AT91C_DBGU_TNCR ((AT91_REG *) 	0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register

-#define AT91C_DBGU_RNCR ((AT91_REG *) 	0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register

-#define AT91C_DBGU_PTCR ((AT91_REG *) 	0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register

-#define AT91C_DBGU_PTSR ((AT91_REG *) 	0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register

-#define AT91C_DBGU_RCR  ((AT91_REG *) 	0xFFFFF304) // (PDC_DBGU) Receive Counter Register

-#define AT91C_DBGU_TCR  ((AT91_REG *) 	0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register

-#define AT91C_DBGU_RPR  ((AT91_REG *) 	0xFFFFF300) // (PDC_DBGU) Receive Pointer Register

-#define AT91C_DBGU_TPR  ((AT91_REG *) 	0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register

-#define AT91C_DBGU_RNPR ((AT91_REG *) 	0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register

-#define AT91C_DBGU_TNPR ((AT91_REG *) 	0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register

-// ========== Register definition for PIOA peripheral ========== 

-#define AT91C_PIOA_IMR  ((AT91_REG *) 	0xFFFFF448) // (PIOA) Interrupt Mask Register

-#define AT91C_PIOA_IER  ((AT91_REG *) 	0xFFFFF440) // (PIOA) Interrupt Enable Register

-#define AT91C_PIOA_OWDR ((AT91_REG *) 	0xFFFFF4A4) // (PIOA) Output Write Disable Register

-#define AT91C_PIOA_ISR  ((AT91_REG *) 	0xFFFFF44C) // (PIOA) Interrupt Status Register

-#define AT91C_PIOA_PPUDR ((AT91_REG *) 	0xFFFFF460) // (PIOA) Pull-up Disable Register

-#define AT91C_PIOA_MDSR ((AT91_REG *) 	0xFFFFF458) // (PIOA) Multi-driver Status Register

-#define AT91C_PIOA_MDER ((AT91_REG *) 	0xFFFFF450) // (PIOA) Multi-driver Enable Register

-#define AT91C_PIOA_PER  ((AT91_REG *) 	0xFFFFF400) // (PIOA) PIO Enable Register

-#define AT91C_PIOA_PSR  ((AT91_REG *) 	0xFFFFF408) // (PIOA) PIO Status Register

-#define AT91C_PIOA_OER  ((AT91_REG *) 	0xFFFFF410) // (PIOA) Output Enable Register

-#define AT91C_PIOA_BSR  ((AT91_REG *) 	0xFFFFF474) // (PIOA) Select B Register

-#define AT91C_PIOA_PPUER ((AT91_REG *) 	0xFFFFF464) // (PIOA) Pull-up Enable Register

-#define AT91C_PIOA_MDDR ((AT91_REG *) 	0xFFFFF454) // (PIOA) Multi-driver Disable Register

-#define AT91C_PIOA_PDR  ((AT91_REG *) 	0xFFFFF404) // (PIOA) PIO Disable Register

-#define AT91C_PIOA_ODR  ((AT91_REG *) 	0xFFFFF414) // (PIOA) Output Disable Registerr

-#define AT91C_PIOA_IFDR ((AT91_REG *) 	0xFFFFF424) // (PIOA) Input Filter Disable Register

-#define AT91C_PIOA_ABSR ((AT91_REG *) 	0xFFFFF478) // (PIOA) AB Select Status Register

-#define AT91C_PIOA_ASR  ((AT91_REG *) 	0xFFFFF470) // (PIOA) Select A Register

-#define AT91C_PIOA_PPUSR ((AT91_REG *) 	0xFFFFF468) // (PIOA) Pad Pull-up Status Register

-#define AT91C_PIOA_ODSR ((AT91_REG *) 	0xFFFFF438) // (PIOA) Output Data Status Register

-#define AT91C_PIOA_SODR ((AT91_REG *) 	0xFFFFF430) // (PIOA) Set Output Data Register

-#define AT91C_PIOA_IFSR ((AT91_REG *) 	0xFFFFF428) // (PIOA) Input Filter Status Register

-#define AT91C_PIOA_IFER ((AT91_REG *) 	0xFFFFF420) // (PIOA) Input Filter Enable Register

-#define AT91C_PIOA_OSR  ((AT91_REG *) 	0xFFFFF418) // (PIOA) Output Status Register

-#define AT91C_PIOA_IDR  ((AT91_REG *) 	0xFFFFF444) // (PIOA) Interrupt Disable Register

-#define AT91C_PIOA_PDSR ((AT91_REG *) 	0xFFFFF43C) // (PIOA) Pin Data Status Register

-#define AT91C_PIOA_CODR ((AT91_REG *) 	0xFFFFF434) // (PIOA) Clear Output Data Register

-#define AT91C_PIOA_OWSR ((AT91_REG *) 	0xFFFFF4A8) // (PIOA) Output Write Status Register

-#define AT91C_PIOA_OWER ((AT91_REG *) 	0xFFFFF4A0) // (PIOA) Output Write Enable Register

-// ========== Register definition for CKGR peripheral ========== 

-#define AT91C_CKGR_PLLR ((AT91_REG *) 	0xFFFFFC2C) // (CKGR) PLL Register

-#define AT91C_CKGR_MCFR ((AT91_REG *) 	0xFFFFFC24) // (CKGR) Main Clock  Frequency Register

-#define AT91C_CKGR_MOR  ((AT91_REG *) 	0xFFFFFC20) // (CKGR) Main Oscillator Register

-// ========== Register definition for PMC peripheral ========== 

-#define AT91C_PMC_SCSR  ((AT91_REG *) 	0xFFFFFC08) // (PMC) System Clock Status Register

-#define AT91C_PMC_SCER  ((AT91_REG *) 	0xFFFFFC00) // (PMC) System Clock Enable Register

-#define AT91C_PMC_IMR   ((AT91_REG *) 	0xFFFFFC6C) // (PMC) Interrupt Mask Register

-#define AT91C_PMC_IDR   ((AT91_REG *) 	0xFFFFFC64) // (PMC) Interrupt Disable Register

-#define AT91C_PMC_PCDR  ((AT91_REG *) 	0xFFFFFC14) // (PMC) Peripheral Clock Disable Register

-#define AT91C_PMC_SCDR  ((AT91_REG *) 	0xFFFFFC04) // (PMC) System Clock Disable Register

-#define AT91C_PMC_SR    ((AT91_REG *) 	0xFFFFFC68) // (PMC) Status Register

-#define AT91C_PMC_IER   ((AT91_REG *) 	0xFFFFFC60) // (PMC) Interrupt Enable Register

-#define AT91C_PMC_MCKR  ((AT91_REG *) 	0xFFFFFC30) // (PMC) Master Clock Register

-#define AT91C_PMC_MOR   ((AT91_REG *) 	0xFFFFFC20) // (PMC) Main Oscillator Register

-#define AT91C_PMC_PCER  ((AT91_REG *) 	0xFFFFFC10) // (PMC) Peripheral Clock Enable Register

-#define AT91C_PMC_PCSR  ((AT91_REG *) 	0xFFFFFC18) // (PMC) Peripheral Clock Status Register

-#define AT91C_PMC_PLLR  ((AT91_REG *) 	0xFFFFFC2C) // (PMC) PLL Register

-#define AT91C_PMC_MCFR  ((AT91_REG *) 	0xFFFFFC24) // (PMC) Main Clock  Frequency Register

-#define AT91C_PMC_PCKR  ((AT91_REG *) 	0xFFFFFC40) // (PMC) Programmable Clock Register

-// ========== Register definition for RSTC peripheral ========== 

-#define AT91C_RSTC_RSR  ((AT91_REG *) 	0xFFFFFD04) // (RSTC) Reset Status Register

-#define AT91C_RSTC_RMR  ((AT91_REG *) 	0xFFFFFD08) // (RSTC) Reset Mode Register

-#define AT91C_RSTC_RCR  ((AT91_REG *) 	0xFFFFFD00) // (RSTC) Reset Control Register

-// ========== Register definition for RTTC peripheral ========== 

-#define AT91C_RTTC_RTSR ((AT91_REG *) 	0xFFFFFD2C) // (RTTC) Real-time Status Register

-#define AT91C_RTTC_RTAR ((AT91_REG *) 	0xFFFFFD24) // (RTTC) Real-time Alarm Register

-#define AT91C_RTTC_RTVR ((AT91_REG *) 	0xFFFFFD28) // (RTTC) Real-time Value Register

-#define AT91C_RTTC_RTMR ((AT91_REG *) 	0xFFFFFD20) // (RTTC) Real-time Mode Register

-// ========== Register definition for PITC peripheral ========== 

-#define AT91C_PITC_PIIR ((AT91_REG *) 	0xFFFFFD3C) // (PITC) Period Interval Image Register

-#define AT91C_PITC_PISR ((AT91_REG *) 	0xFFFFFD34) // (PITC) Period Interval Status Register

-#define AT91C_PITC_PIVR ((AT91_REG *) 	0xFFFFFD38) // (PITC) Period Interval Value Register

-#define AT91C_PITC_PIMR ((AT91_REG *) 	0xFFFFFD30) // (PITC) Period Interval Mode Register

-// ========== Register definition for WDTC peripheral ========== 

-#define AT91C_WDTC_WDMR ((AT91_REG *) 	0xFFFFFD44) // (WDTC) Watchdog Mode Register

-#define AT91C_WDTC_WDSR ((AT91_REG *) 	0xFFFFFD48) // (WDTC) Watchdog Status Register

-#define AT91C_WDTC_WDCR ((AT91_REG *) 	0xFFFFFD40) // (WDTC) Watchdog Control Register

-// ========== Register definition for MC peripheral ========== 

-#define AT91C_MC_FCR    ((AT91_REG *) 	0xFFFFFF64) // (MC) MC Flash Command Register

-#define AT91C_MC_ASR    ((AT91_REG *) 	0xFFFFFF04) // (MC) MC Abort Status Register

-#define AT91C_MC_FSR    ((AT91_REG *) 	0xFFFFFF68) // (MC) MC Flash Status Register

-#define AT91C_MC_FMR    ((AT91_REG *) 	0xFFFFFF60) // (MC) MC Flash Mode Register

-#define AT91C_MC_AASR   ((AT91_REG *) 	0xFFFFFF08) // (MC) MC Abort Address Status Register

-#define AT91C_MC_RCR    ((AT91_REG *) 	0xFFFFFF00) // (MC) MC Remap Control Register

-// ========== Register definition for PDC_SPI peripheral ========== 

-#define AT91C_SPI_PTCR  ((AT91_REG *) 	0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register

-#define AT91C_SPI_TNPR  ((AT91_REG *) 	0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register

-#define AT91C_SPI_RNPR  ((AT91_REG *) 	0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register

-#define AT91C_SPI_TPR   ((AT91_REG *) 	0xFFFE0108) // (PDC_SPI) Transmit Pointer Register

-#define AT91C_SPI_RPR   ((AT91_REG *) 	0xFFFE0100) // (PDC_SPI) Receive Pointer Register

-#define AT91C_SPI_PTSR  ((AT91_REG *) 	0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register

-#define AT91C_SPI_TNCR  ((AT91_REG *) 	0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register

-#define AT91C_SPI_RNCR  ((AT91_REG *) 	0xFFFE0114) // (PDC_SPI) Receive Next Counter Register

-#define AT91C_SPI_TCR   ((AT91_REG *) 	0xFFFE010C) // (PDC_SPI) Transmit Counter Register

-#define AT91C_SPI_RCR   ((AT91_REG *) 	0xFFFE0104) // (PDC_SPI) Receive Counter Register

-// ========== Register definition for SPI peripheral ========== 

-#define AT91C_SPI_CSR   ((AT91_REG *) 	0xFFFE0030) // (SPI) Chip Select Register

-#define AT91C_SPI_IDR   ((AT91_REG *) 	0xFFFE0018) // (SPI) Interrupt Disable Register

-#define AT91C_SPI_SR    ((AT91_REG *) 	0xFFFE0010) // (SPI) Status Register

-#define AT91C_SPI_RDR   ((AT91_REG *) 	0xFFFE0008) // (SPI) Receive Data Register

-#define AT91C_SPI_CR    ((AT91_REG *) 	0xFFFE0000) // (SPI) Control Register

-#define AT91C_SPI_IMR   ((AT91_REG *) 	0xFFFE001C) // (SPI) Interrupt Mask Register

-#define AT91C_SPI_IER   ((AT91_REG *) 	0xFFFE0014) // (SPI) Interrupt Enable Register

-#define AT91C_SPI_TDR   ((AT91_REG *) 	0xFFFE000C) // (SPI) Transmit Data Register

-#define AT91C_SPI_MR    ((AT91_REG *) 	0xFFFE0004) // (SPI) Mode Register

-// ========== Register definition for PDC_ADC peripheral ========== 

-#define AT91C_ADC_PTCR  ((AT91_REG *) 	0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register

-#define AT91C_ADC_TNPR  ((AT91_REG *) 	0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register

-#define AT91C_ADC_RNPR  ((AT91_REG *) 	0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register

-#define AT91C_ADC_TPR   ((AT91_REG *) 	0xFFFD8108) // (PDC_ADC) Transmit Pointer Register

-#define AT91C_ADC_RPR   ((AT91_REG *) 	0xFFFD8100) // (PDC_ADC) Receive Pointer Register

-#define AT91C_ADC_PTSR  ((AT91_REG *) 	0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register

-#define AT91C_ADC_TNCR  ((AT91_REG *) 	0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register

-#define AT91C_ADC_RNCR  ((AT91_REG *) 	0xFFFD8114) // (PDC_ADC) Receive Next Counter Register

-#define AT91C_ADC_TCR   ((AT91_REG *) 	0xFFFD810C) // (PDC_ADC) Transmit Counter Register

-#define AT91C_ADC_RCR   ((AT91_REG *) 	0xFFFD8104) // (PDC_ADC) Receive Counter Register

-// ========== Register definition for ADC peripheral ========== 

-#define AT91C_ADC_IMR   ((AT91_REG *) 	0xFFFD802C) // (ADC) ADC Interrupt Mask Register

-#define AT91C_ADC_CDR4  ((AT91_REG *) 	0xFFFD8040) // (ADC) ADC Channel Data Register 4

-#define AT91C_ADC_CDR2  ((AT91_REG *) 	0xFFFD8038) // (ADC) ADC Channel Data Register 2

-#define AT91C_ADC_CDR0  ((AT91_REG *) 	0xFFFD8030) // (ADC) ADC Channel Data Register 0

-#define AT91C_ADC_CDR7  ((AT91_REG *) 	0xFFFD804C) // (ADC) ADC Channel Data Register 7

-#define AT91C_ADC_CDR1  ((AT91_REG *) 	0xFFFD8034) // (ADC) ADC Channel Data Register 1

-#define AT91C_ADC_CDR3  ((AT91_REG *) 	0xFFFD803C) // (ADC) ADC Channel Data Register 3

-#define AT91C_ADC_CDR5  ((AT91_REG *) 	0xFFFD8044) // (ADC) ADC Channel Data Register 5

-#define AT91C_ADC_MR    ((AT91_REG *) 	0xFFFD8004) // (ADC) ADC Mode Register

-#define AT91C_ADC_CDR6  ((AT91_REG *) 	0xFFFD8048) // (ADC) ADC Channel Data Register 6

-#define AT91C_ADC_CR    ((AT91_REG *) 	0xFFFD8000) // (ADC) ADC Control Register

-#define AT91C_ADC_CHER  ((AT91_REG *) 	0xFFFD8010) // (ADC) ADC Channel Enable Register

-#define AT91C_ADC_CHSR  ((AT91_REG *) 	0xFFFD8018) // (ADC) ADC Channel Status Register

-#define AT91C_ADC_IER   ((AT91_REG *) 	0xFFFD8024) // (ADC) ADC Interrupt Enable Register

-#define AT91C_ADC_SR    ((AT91_REG *) 	0xFFFD801C) // (ADC) ADC Status Register

-#define AT91C_ADC_CHDR  ((AT91_REG *) 	0xFFFD8014) // (ADC) ADC Channel Disable Register

-#define AT91C_ADC_IDR   ((AT91_REG *) 	0xFFFD8028) // (ADC) ADC Interrupt Disable Register

-#define AT91C_ADC_LCDR  ((AT91_REG *) 	0xFFFD8020) // (ADC) ADC Last Converted Data Register

-// ========== Register definition for PDC_SSC peripheral ========== 

-#define AT91C_SSC_PTCR  ((AT91_REG *) 	0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register

-#define AT91C_SSC_TNPR  ((AT91_REG *) 	0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register

-#define AT91C_SSC_RNPR  ((AT91_REG *) 	0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register

-#define AT91C_SSC_TPR   ((AT91_REG *) 	0xFFFD4108) // (PDC_SSC) Transmit Pointer Register

-#define AT91C_SSC_RPR   ((AT91_REG *) 	0xFFFD4100) // (PDC_SSC) Receive Pointer Register

-#define AT91C_SSC_PTSR  ((AT91_REG *) 	0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register

-#define AT91C_SSC_TNCR  ((AT91_REG *) 	0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register

-#define AT91C_SSC_RNCR  ((AT91_REG *) 	0xFFFD4114) // (PDC_SSC) Receive Next Counter Register

-#define AT91C_SSC_TCR   ((AT91_REG *) 	0xFFFD410C) // (PDC_SSC) Transmit Counter Register

-#define AT91C_SSC_RCR   ((AT91_REG *) 	0xFFFD4104) // (PDC_SSC) Receive Counter Register

-// ========== Register definition for SSC peripheral ========== 

-#define AT91C_SSC_RFMR  ((AT91_REG *) 	0xFFFD4014) // (SSC) Receive Frame Mode Register

-#define AT91C_SSC_CMR   ((AT91_REG *) 	0xFFFD4004) // (SSC) Clock Mode Register

-#define AT91C_SSC_IDR   ((AT91_REG *) 	0xFFFD4048) // (SSC) Interrupt Disable Register

-#define AT91C_SSC_SR    ((AT91_REG *) 	0xFFFD4040) // (SSC) Status Register

-#define AT91C_SSC_RC0R  ((AT91_REG *) 	0xFFFD4038) // (SSC) Receive Compare 0 Register

-#define AT91C_SSC_RSHR  ((AT91_REG *) 	0xFFFD4030) // (SSC) Receive Sync Holding Register

-#define AT91C_SSC_RHR   ((AT91_REG *) 	0xFFFD4020) // (SSC) Receive Holding Register

-#define AT91C_SSC_TCMR  ((AT91_REG *) 	0xFFFD4018) // (SSC) Transmit Clock Mode Register

-#define AT91C_SSC_RCMR  ((AT91_REG *) 	0xFFFD4010) // (SSC) Receive Clock ModeRegister

-#define AT91C_SSC_CR    ((AT91_REG *) 	0xFFFD4000) // (SSC) Control Register

-#define AT91C_SSC_IMR   ((AT91_REG *) 	0xFFFD404C) // (SSC) Interrupt Mask Register

-#define AT91C_SSC_IER   ((AT91_REG *) 	0xFFFD4044) // (SSC) Interrupt Enable Register

-#define AT91C_SSC_RC1R  ((AT91_REG *) 	0xFFFD403C) // (SSC) Receive Compare 1 Register

-#define AT91C_SSC_TSHR  ((AT91_REG *) 	0xFFFD4034) // (SSC) Transmit Sync Holding Register

-#define AT91C_SSC_THR   ((AT91_REG *) 	0xFFFD4024) // (SSC) Transmit Holding Register

-#define AT91C_SSC_TFMR  ((AT91_REG *) 	0xFFFD401C) // (SSC) Transmit Frame Mode Register

-// ========== Register definition for PDC_US1 peripheral ========== 

-#define AT91C_US1_PTSR  ((AT91_REG *) 	0xFFFC4124) // (PDC_US1) PDC Transfer Status Register

-#define AT91C_US1_TNCR  ((AT91_REG *) 	0xFFFC411C) // (PDC_US1) Transmit Next Counter Register

-#define AT91C_US1_RNCR  ((AT91_REG *) 	0xFFFC4114) // (PDC_US1) Receive Next Counter Register

-#define AT91C_US1_TCR   ((AT91_REG *) 	0xFFFC410C) // (PDC_US1) Transmit Counter Register

-#define AT91C_US1_RCR   ((AT91_REG *) 	0xFFFC4104) // (PDC_US1) Receive Counter Register

-#define AT91C_US1_PTCR  ((AT91_REG *) 	0xFFFC4120) // (PDC_US1) PDC Transfer Control Register

-#define AT91C_US1_TNPR  ((AT91_REG *) 	0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register

-#define AT91C_US1_RNPR  ((AT91_REG *) 	0xFFFC4110) // (PDC_US1) Receive Next Pointer Register

-#define AT91C_US1_TPR   ((AT91_REG *) 	0xFFFC4108) // (PDC_US1) Transmit Pointer Register

-#define AT91C_US1_RPR   ((AT91_REG *) 	0xFFFC4100) // (PDC_US1) Receive Pointer Register

-// ========== Register definition for US1 peripheral ========== 

-#define AT91C_US1_XXR   ((AT91_REG *) 	0xFFFC4048) // (US1) XON_XOFF Register

-#define AT91C_US1_RHR   ((AT91_REG *) 	0xFFFC4018) // (US1) Receiver Holding Register

-#define AT91C_US1_IMR   ((AT91_REG *) 	0xFFFC4010) // (US1) Interrupt Mask Register

-#define AT91C_US1_IER   ((AT91_REG *) 	0xFFFC4008) // (US1) Interrupt Enable Register

-#define AT91C_US1_CR    ((AT91_REG *) 	0xFFFC4000) // (US1) Control Register

-#define AT91C_US1_RTOR  ((AT91_REG *) 	0xFFFC4024) // (US1) Receiver Time-out Register

-#define AT91C_US1_THR   ((AT91_REG *) 	0xFFFC401C) // (US1) Transmitter Holding Register

-#define AT91C_US1_CSR   ((AT91_REG *) 	0xFFFC4014) // (US1) Channel Status Register

-#define AT91C_US1_IDR   ((AT91_REG *) 	0xFFFC400C) // (US1) Interrupt Disable Register

-#define AT91C_US1_FIDI  ((AT91_REG *) 	0xFFFC4040) // (US1) FI_DI_Ratio Register

-#define AT91C_US1_BRGR  ((AT91_REG *) 	0xFFFC4020) // (US1) Baud Rate Generator Register

-#define AT91C_US1_TTGR  ((AT91_REG *) 	0xFFFC4028) // (US1) Transmitter Time-guard Register

-#define AT91C_US1_IF    ((AT91_REG *) 	0xFFFC404C) // (US1) IRDA_FILTER Register

-#define AT91C_US1_NER   ((AT91_REG *) 	0xFFFC4044) // (US1) Nb Errors Register

-#define AT91C_US1_MR    ((AT91_REG *) 	0xFFFC4004) // (US1) Mode Register

-// ========== Register definition for PDC_US0 peripheral ========== 

-#define AT91C_US0_PTCR  ((AT91_REG *) 	0xFFFC0120) // (PDC_US0) PDC Transfer Control Register

-#define AT91C_US0_TNPR  ((AT91_REG *) 	0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register

-#define AT91C_US0_RNPR  ((AT91_REG *) 	0xFFFC0110) // (PDC_US0) Receive Next Pointer Register

-#define AT91C_US0_TPR   ((AT91_REG *) 	0xFFFC0108) // (PDC_US0) Transmit Pointer Register

-#define AT91C_US0_RPR   ((AT91_REG *) 	0xFFFC0100) // (PDC_US0) Receive Pointer Register

-#define AT91C_US0_PTSR  ((AT91_REG *) 	0xFFFC0124) // (PDC_US0) PDC Transfer Status Register

-#define AT91C_US0_TNCR  ((AT91_REG *) 	0xFFFC011C) // (PDC_US0) Transmit Next Counter Register

-#define AT91C_US0_RNCR  ((AT91_REG *) 	0xFFFC0114) // (PDC_US0) Receive Next Counter Register

-#define AT91C_US0_TCR   ((AT91_REG *) 	0xFFFC010C) // (PDC_US0) Transmit Counter Register

-#define AT91C_US0_RCR   ((AT91_REG *) 	0xFFFC0104) // (PDC_US0) Receive Counter Register

-// ========== Register definition for US0 peripheral ========== 

-#define AT91C_US0_TTGR  ((AT91_REG *) 	0xFFFC0028) // (US0) Transmitter Time-guard Register

-#define AT91C_US0_BRGR  ((AT91_REG *) 	0xFFFC0020) // (US0) Baud Rate Generator Register

-#define AT91C_US0_RHR   ((AT91_REG *) 	0xFFFC0018) // (US0) Receiver Holding Register

-#define AT91C_US0_IMR   ((AT91_REG *) 	0xFFFC0010) // (US0) Interrupt Mask Register

-#define AT91C_US0_NER   ((AT91_REG *) 	0xFFFC0044) // (US0) Nb Errors Register

-#define AT91C_US0_RTOR  ((AT91_REG *) 	0xFFFC0024) // (US0) Receiver Time-out Register

-#define AT91C_US0_XXR   ((AT91_REG *) 	0xFFFC0048) // (US0) XON_XOFF Register

-#define AT91C_US0_FIDI  ((AT91_REG *) 	0xFFFC0040) // (US0) FI_DI_Ratio Register

-#define AT91C_US0_CR    ((AT91_REG *) 	0xFFFC0000) // (US0) Control Register

-#define AT91C_US0_IER   ((AT91_REG *) 	0xFFFC0008) // (US0) Interrupt Enable Register

-#define AT91C_US0_IF    ((AT91_REG *) 	0xFFFC004C) // (US0) IRDA_FILTER Register

-#define AT91C_US0_MR    ((AT91_REG *) 	0xFFFC0004) // (US0) Mode Register

-#define AT91C_US0_IDR   ((AT91_REG *) 	0xFFFC000C) // (US0) Interrupt Disable Register

-#define AT91C_US0_CSR   ((AT91_REG *) 	0xFFFC0014) // (US0) Channel Status Register

-#define AT91C_US0_THR   ((AT91_REG *) 	0xFFFC001C) // (US0) Transmitter Holding Register

-// ========== Register definition for TWI peripheral ========== 

-#define AT91C_TWI_RHR   ((AT91_REG *) 	0xFFFB8030) // (TWI) Receive Holding Register

-#define AT91C_TWI_IDR   ((AT91_REG *) 	0xFFFB8028) // (TWI) Interrupt Disable Register

-#define AT91C_TWI_SR    ((AT91_REG *) 	0xFFFB8020) // (TWI) Status Register

-#define AT91C_TWI_CWGR  ((AT91_REG *) 	0xFFFB8010) // (TWI) Clock Waveform Generator Register

-#define AT91C_TWI_SMR   ((AT91_REG *) 	0xFFFB8008) // (TWI) Slave Mode Register

-#define AT91C_TWI_CR    ((AT91_REG *) 	0xFFFB8000) // (TWI) Control Register

-#define AT91C_TWI_THR   ((AT91_REG *) 	0xFFFB8034) // (TWI) Transmit Holding Register

-#define AT91C_TWI_IMR   ((AT91_REG *) 	0xFFFB802C) // (TWI) Interrupt Mask Register

-#define AT91C_TWI_IER   ((AT91_REG *) 	0xFFFB8024) // (TWI) Interrupt Enable Register

-#define AT91C_TWI_IADR  ((AT91_REG *) 	0xFFFB800C) // (TWI) Internal Address Register

-#define AT91C_TWI_MMR   ((AT91_REG *) 	0xFFFB8004) // (TWI) Master Mode Register

-// ========== Register definition for TC2 peripheral ========== 

-#define AT91C_TC2_IMR   ((AT91_REG *) 	0xFFFA00AC) // (TC2) Interrupt Mask Register

-#define AT91C_TC2_IER   ((AT91_REG *) 	0xFFFA00A4) // (TC2) Interrupt Enable Register

-#define AT91C_TC2_RC    ((AT91_REG *) 	0xFFFA009C) // (TC2) Register C

-#define AT91C_TC2_RA    ((AT91_REG *) 	0xFFFA0094) // (TC2) Register A

-#define AT91C_TC2_CMR   ((AT91_REG *) 	0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC2_IDR   ((AT91_REG *) 	0xFFFA00A8) // (TC2) Interrupt Disable Register

-#define AT91C_TC2_SR    ((AT91_REG *) 	0xFFFA00A0) // (TC2) Status Register

-#define AT91C_TC2_RB    ((AT91_REG *) 	0xFFFA0098) // (TC2) Register B

-#define AT91C_TC2_CV    ((AT91_REG *) 	0xFFFA0090) // (TC2) Counter Value

-#define AT91C_TC2_CCR   ((AT91_REG *) 	0xFFFA0080) // (TC2) Channel Control Register

-// ========== Register definition for TC1 peripheral ========== 

-#define AT91C_TC1_IMR   ((AT91_REG *) 	0xFFFA006C) // (TC1) Interrupt Mask Register

-#define AT91C_TC1_IER   ((AT91_REG *) 	0xFFFA0064) // (TC1) Interrupt Enable Register

-#define AT91C_TC1_RC    ((AT91_REG *) 	0xFFFA005C) // (TC1) Register C

-#define AT91C_TC1_RA    ((AT91_REG *) 	0xFFFA0054) // (TC1) Register A

-#define AT91C_TC1_CMR   ((AT91_REG *) 	0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC1_IDR   ((AT91_REG *) 	0xFFFA0068) // (TC1) Interrupt Disable Register

-#define AT91C_TC1_SR    ((AT91_REG *) 	0xFFFA0060) // (TC1) Status Register

-#define AT91C_TC1_RB    ((AT91_REG *) 	0xFFFA0058) // (TC1) Register B

-#define AT91C_TC1_CV    ((AT91_REG *) 	0xFFFA0050) // (TC1) Counter Value

-#define AT91C_TC1_CCR   ((AT91_REG *) 	0xFFFA0040) // (TC1) Channel Control Register

-// ========== Register definition for TC0 peripheral ========== 

-#define AT91C_TC0_IMR   ((AT91_REG *) 	0xFFFA002C) // (TC0) Interrupt Mask Register

-#define AT91C_TC0_IER   ((AT91_REG *) 	0xFFFA0024) // (TC0) Interrupt Enable Register

-#define AT91C_TC0_RC    ((AT91_REG *) 	0xFFFA001C) // (TC0) Register C

-#define AT91C_TC0_RA    ((AT91_REG *) 	0xFFFA0014) // (TC0) Register A

-#define AT91C_TC0_CMR   ((AT91_REG *) 	0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC0_IDR   ((AT91_REG *) 	0xFFFA0028) // (TC0) Interrupt Disable Register

-#define AT91C_TC0_SR    ((AT91_REG *) 	0xFFFA0020) // (TC0) Status Register

-#define AT91C_TC0_RB    ((AT91_REG *) 	0xFFFA0018) // (TC0) Register B

-#define AT91C_TC0_CV    ((AT91_REG *) 	0xFFFA0010) // (TC0) Counter Value

-#define AT91C_TC0_CCR   ((AT91_REG *) 	0xFFFA0000) // (TC0) Channel Control Register

-// ========== Register definition for TCB peripheral ========== 

-#define AT91C_TCB_BMR   ((AT91_REG *) 	0xFFFA00C4) // (TCB) TC Block Mode Register

-#define AT91C_TCB_BCR   ((AT91_REG *) 	0xFFFA00C0) // (TCB) TC Block Control Register

-// ========== Register definition for PWMC_CH3 peripheral ========== 

-#define AT91C_CH3_CUPDR ((AT91_REG *) 	0xFFFCC270) // (PWMC_CH3) Channel Update Register

-#define AT91C_CH3_CPRDR ((AT91_REG *) 	0xFFFCC268) // (PWMC_CH3) Channel Period Register

-#define AT91C_CH3_CMR   ((AT91_REG *) 	0xFFFCC260) // (PWMC_CH3) Channel Mode Register

-#define AT91C_CH3_Reserved ((AT91_REG *) 	0xFFFCC274) // (PWMC_CH3) Reserved

-#define AT91C_CH3_CCNTR ((AT91_REG *) 	0xFFFCC26C) // (PWMC_CH3) Channel Counter Register

-#define AT91C_CH3_CDTYR ((AT91_REG *) 	0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register

-// ========== Register definition for PWMC_CH2 peripheral ========== 

-#define AT91C_CH2_CUPDR ((AT91_REG *) 	0xFFFCC250) // (PWMC_CH2) Channel Update Register

-#define AT91C_CH2_CPRDR ((AT91_REG *) 	0xFFFCC248) // (PWMC_CH2) Channel Period Register

-#define AT91C_CH2_CMR   ((AT91_REG *) 	0xFFFCC240) // (PWMC_CH2) Channel Mode Register

-#define AT91C_CH2_Reserved ((AT91_REG *) 	0xFFFCC254) // (PWMC_CH2) Reserved

-#define AT91C_CH2_CCNTR ((AT91_REG *) 	0xFFFCC24C) // (PWMC_CH2) Channel Counter Register

-#define AT91C_CH2_CDTYR ((AT91_REG *) 	0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register

-// ========== Register definition for PWMC_CH1 peripheral ========== 

-#define AT91C_CH1_CUPDR ((AT91_REG *) 	0xFFFCC230) // (PWMC_CH1) Channel Update Register

-#define AT91C_CH1_CPRDR ((AT91_REG *) 	0xFFFCC228) // (PWMC_CH1) Channel Period Register

-#define AT91C_CH1_CMR   ((AT91_REG *) 	0xFFFCC220) // (PWMC_CH1) Channel Mode Register

-#define AT91C_CH1_Reserved ((AT91_REG *) 	0xFFFCC234) // (PWMC_CH1) Reserved

-#define AT91C_CH1_CCNTR ((AT91_REG *) 	0xFFFCC22C) // (PWMC_CH1) Channel Counter Register

-#define AT91C_CH1_CDTYR ((AT91_REG *) 	0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register

-// ========== Register definition for PWMC_CH0 peripheral ========== 

-#define AT91C_CH0_CUPDR ((AT91_REG *) 	0xFFFCC210) // (PWMC_CH0) Channel Update Register

-#define AT91C_CH0_CPRDR ((AT91_REG *) 	0xFFFCC208) // (PWMC_CH0) Channel Period Register

-#define AT91C_CH0_CMR   ((AT91_REG *) 	0xFFFCC200) // (PWMC_CH0) Channel Mode Register

-#define AT91C_CH0_Reserved ((AT91_REG *) 	0xFFFCC214) // (PWMC_CH0) Reserved

-#define AT91C_CH0_CCNTR ((AT91_REG *) 	0xFFFCC20C) // (PWMC_CH0) Channel Counter Register

-#define AT91C_CH0_CDTYR ((AT91_REG *) 	0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register

-// ========== Register definition for PWMC peripheral ========== 

-#define AT91C_PWMC_VR   ((AT91_REG *) 	0xFFFCC0FC) // (PWMC) PWMC Version Register

-#define AT91C_PWMC_ISR  ((AT91_REG *) 	0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register

-#define AT91C_PWMC_IDR  ((AT91_REG *) 	0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register

-#define AT91C_PWMC_SR   ((AT91_REG *) 	0xFFFCC00C) // (PWMC) PWMC Status Register

-#define AT91C_PWMC_ENA  ((AT91_REG *) 	0xFFFCC004) // (PWMC) PWMC Enable Register

-#define AT91C_PWMC_IMR  ((AT91_REG *) 	0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register

-#define AT91C_PWMC_MR   ((AT91_REG *) 	0xFFFCC000) // (PWMC) PWMC Mode Register

-#define AT91C_PWMC_DIS  ((AT91_REG *) 	0xFFFCC008) // (PWMC) PWMC Disable Register

-#define AT91C_PWMC_IER  ((AT91_REG *) 	0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register

-// ========== Register definition for UDP peripheral ========== 

-#define AT91C_UDP_ISR   ((AT91_REG *) 	0xFFFB001C) // (UDP) Interrupt Status Register

-#define AT91C_UDP_IDR   ((AT91_REG *) 	0xFFFB0014) // (UDP) Interrupt Disable Register

-#define AT91C_UDP_GLBSTATE ((AT91_REG *) 	0xFFFB0004) // (UDP) Global State Register

-#define AT91C_UDP_FDR   ((AT91_REG *) 	0xFFFB0050) // (UDP) Endpoint FIFO Data Register

-#define AT91C_UDP_CSR   ((AT91_REG *) 	0xFFFB0030) // (UDP) Endpoint Control and Status Register

-#define AT91C_UDP_RSTEP ((AT91_REG *) 	0xFFFB0028) // (UDP) Reset Endpoint Register

-#define AT91C_UDP_ICR   ((AT91_REG *) 	0xFFFB0020) // (UDP) Interrupt Clear Register

-#define AT91C_UDP_IMR   ((AT91_REG *) 	0xFFFB0018) // (UDP) Interrupt Mask Register

-#define AT91C_UDP_IER   ((AT91_REG *) 	0xFFFB0010) // (UDP) Interrupt Enable Register

-#define AT91C_UDP_FADDR ((AT91_REG *) 	0xFFFB0008) // (UDP) Function Address Register

-#define AT91C_UDP_NUM   ((AT91_REG *) 	0xFFFB0000) // (UDP) Frame Number Register

-

-// *****************************************************************************

-//               PIO DEFINITIONS FOR AT91SAM7S64

-// *****************************************************************************

-#define AT91C_PIO_PA0        ((unsigned int) 1 <<  0) // Pin Controlled by PA0

-#define AT91C_PA0_PWM0     ((unsigned int) AT91C_PIO_PA0) //  PWM Channel 0

-#define AT91C_PA0_TIOA0    ((unsigned int) AT91C_PIO_PA0) //  Timer Counter 0 Multipurpose Timer I/O Pin A

-#define AT91C_PIO_PA1        ((unsigned int) 1 <<  1) // Pin Controlled by PA1

-#define AT91C_PA1_PWM1     ((unsigned int) AT91C_PIO_PA1) //  PWM Channel 1

-#define AT91C_PA1_TIOB0    ((unsigned int) AT91C_PIO_PA1) //  Timer Counter 0 Multipurpose Timer I/O Pin B

-#define AT91C_PIO_PA10       ((unsigned int) 1 << 10) // Pin Controlled by PA10

-#define AT91C_PA10_DTXD     ((unsigned int) AT91C_PIO_PA10) //  DBGU Debug Transmit Data

-#define AT91C_PA10_NPCS2    ((unsigned int) AT91C_PIO_PA10) //  SPI Peripheral Chip Select 2

-#define AT91C_PIO_PA11       ((unsigned int) 1 << 11) // Pin Controlled by PA11

-#define AT91C_PA11_NPCS0    ((unsigned int) AT91C_PIO_PA11) //  SPI Peripheral Chip Select 0

-#define AT91C_PA11_PWM0     ((unsigned int) AT91C_PIO_PA11) //  PWM Channel 0

-#define AT91C_PIO_PA12       ((unsigned int) 1 << 12) // Pin Controlled by PA12

-#define AT91C_PA12_MISO     ((unsigned int) AT91C_PIO_PA12) //  SPI Master In Slave

-#define AT91C_PA12_PWM1     ((unsigned int) AT91C_PIO_PA12) //  PWM Channel 1

-#define AT91C_PIO_PA13       ((unsigned int) 1 << 13) // Pin Controlled by PA13

-#define AT91C_PA13_MOSI     ((unsigned int) AT91C_PIO_PA13) //  SPI Master Out Slave

-#define AT91C_PA13_PWM2     ((unsigned int) AT91C_PIO_PA13) //  PWM Channel 2

-#define AT91C_PIO_PA14       ((unsigned int) 1 << 14) // Pin Controlled by PA14

-#define AT91C_PA14_SPCK     ((unsigned int) AT91C_PIO_PA14) //  SPI Serial Clock

-#define AT91C_PA14_PWM3     ((unsigned int) AT91C_PIO_PA14) //  PWM Channel 3

-#define AT91C_PIO_PA15       ((unsigned int) 1 << 15) // Pin Controlled by PA15

-#define AT91C_PA15_TF       ((unsigned int) AT91C_PIO_PA15) //  SSC Transmit Frame Sync

-#define AT91C_PA15_TIOA1    ((unsigned int) AT91C_PIO_PA15) //  Timer Counter 1 Multipurpose Timer I/O Pin A

-#define AT91C_PIO_PA16       ((unsigned int) 1 << 16) // Pin Controlled by PA16

-#define AT91C_PA16_TK       ((unsigned int) AT91C_PIO_PA16) //  SSC Transmit Clock

-#define AT91C_PA16_TIOB1    ((unsigned int) AT91C_PIO_PA16) //  Timer Counter 1 Multipurpose Timer I/O Pin B

-#define AT91C_PIO_PA17       ((unsigned int) 1 << 17) // Pin Controlled by PA17

-#define AT91C_PA17_TD       ((unsigned int) AT91C_PIO_PA17) //  SSC Transmit data

-#define AT91C_PA17_PCK1     ((unsigned int) AT91C_PIO_PA17) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PA18       ((unsigned int) 1 << 18) // Pin Controlled by PA18

-#define AT91C_PA18_RD       ((unsigned int) AT91C_PIO_PA18) //  SSC Receive Data

-#define AT91C_PA18_PCK2     ((unsigned int) AT91C_PIO_PA18) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PA19       ((unsigned int) 1 << 19) // Pin Controlled by PA19

-#define AT91C_PA19_RK       ((unsigned int) AT91C_PIO_PA19) //  SSC Receive Clock

-#define AT91C_PA19_FIQ      ((unsigned int) AT91C_PIO_PA19) //  AIC Fast Interrupt Input

-#define AT91C_PIO_PA2        ((unsigned int) 1 <<  2) // Pin Controlled by PA2

-#define AT91C_PA2_PWM2     ((unsigned int) AT91C_PIO_PA2) //  PWM Channel 2

-#define AT91C_PA2_SCK0     ((unsigned int) AT91C_PIO_PA2) //  USART 0 Serial Clock

-#define AT91C_PIO_PA20       ((unsigned int) 1 << 20) // Pin Controlled by PA20

-#define AT91C_PA20_RF       ((unsigned int) AT91C_PIO_PA20) //  SSC Receive Frame Sync

-#define AT91C_PA20_IRQ0     ((unsigned int) AT91C_PIO_PA20) //  External Interrupt 0

-#define AT91C_PIO_PA21       ((unsigned int) 1 << 21) // Pin Controlled by PA21

-#define AT91C_PA21_RXD1     ((unsigned int) AT91C_PIO_PA21) //  USART 1 Receive Data

-#define AT91C_PA21_PCK1     ((unsigned int) AT91C_PIO_PA21) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PA22       ((unsigned int) 1 << 22) // Pin Controlled by PA22

-#define AT91C_PA22_TXD1     ((unsigned int) AT91C_PIO_PA22) //  USART 1 Transmit Data

-#define AT91C_PA22_NPCS3    ((unsigned int) AT91C_PIO_PA22) //  SPI Peripheral Chip Select 3

-#define AT91C_PIO_PA23       ((unsigned int) 1 << 23) // Pin Controlled by PA23

-#define AT91C_PA23_SCK1     ((unsigned int) AT91C_PIO_PA23) //  USART 1 Serial Clock

-#define AT91C_PA23_PWM0     ((unsigned int) AT91C_PIO_PA23) //  PWM Channel 0

-#define AT91C_PIO_PA24       ((unsigned int) 1 << 24) // Pin Controlled by PA24

-#define AT91C_PA24_RTS1     ((unsigned int) AT91C_PIO_PA24) //  USART 1 Ready To Send

-#define AT91C_PA24_PWM1     ((unsigned int) AT91C_PIO_PA24) //  PWM Channel 1

-#define AT91C_PIO_PA25       ((unsigned int) 1 << 25) // Pin Controlled by PA25

-#define AT91C_PA25_CTS1     ((unsigned int) AT91C_PIO_PA25) //  USART 1 Clear To Send

-#define AT91C_PA25_PWM2     ((unsigned int) AT91C_PIO_PA25) //  PWM Channel 2

-#define AT91C_PIO_PA26       ((unsigned int) 1 << 26) // Pin Controlled by PA26

-#define AT91C_PA26_DCD1     ((unsigned int) AT91C_PIO_PA26) //  USART 1 Data Carrier Detect

-#define AT91C_PA26_TIOA2    ((unsigned int) AT91C_PIO_PA26) //  Timer Counter 2 Multipurpose Timer I/O Pin A

-#define AT91C_PIO_PA27       ((unsigned int) 1 << 27) // Pin Controlled by PA27

-#define AT91C_PA27_DTR1     ((unsigned int) AT91C_PIO_PA27) //  USART 1 Data Terminal ready

-#define AT91C_PA27_TIOB2    ((unsigned int) AT91C_PIO_PA27) //  Timer Counter 2 Multipurpose Timer I/O Pin B

-#define AT91C_PIO_PA28       ((unsigned int) 1 << 28) // Pin Controlled by PA28

-#define AT91C_PA28_DSR1     ((unsigned int) AT91C_PIO_PA28) //  USART 1 Data Set ready

-#define AT91C_PA28_TCLK1    ((unsigned int) AT91C_PIO_PA28) //  Timer Counter 1 external clock input

-#define AT91C_PIO_PA29       ((unsigned int) 1 << 29) // Pin Controlled by PA29

-#define AT91C_PA29_RI1      ((unsigned int) AT91C_PIO_PA29) //  USART 1 Ring Indicator

-#define AT91C_PA29_TCLK2    ((unsigned int) AT91C_PIO_PA29) //  Timer Counter 2 external clock input

-#define AT91C_PIO_PA3        ((unsigned int) 1 <<  3) // Pin Controlled by PA3

-#define AT91C_PA3_TWD      ((unsigned int) AT91C_PIO_PA3) //  TWI Two-wire Serial Data

-#define AT91C_PA3_NPCS3    ((unsigned int) AT91C_PIO_PA3) //  SPI Peripheral Chip Select 3

-#define AT91C_PIO_PA30       ((unsigned int) 1 << 30) // Pin Controlled by PA30

-#define AT91C_PA30_IRQ1     ((unsigned int) AT91C_PIO_PA30) //  External Interrupt 1

-#define AT91C_PA30_NPCS2    ((unsigned int) AT91C_PIO_PA30) //  SPI Peripheral Chip Select 2

-#define AT91C_PIO_PA31       ((unsigned int) 1 << 31) // Pin Controlled by PA31

-#define AT91C_PA31_NPCS1    ((unsigned int) AT91C_PIO_PA31) //  SPI Peripheral Chip Select 1

-#define AT91C_PA31_PCK2     ((unsigned int) AT91C_PIO_PA31) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PA4        ((unsigned int) 1 <<  4) // Pin Controlled by PA4

-#define AT91C_PA4_TWCK     ((unsigned int) AT91C_PIO_PA4) //  TWI Two-wire Serial Clock

-#define AT91C_PA4_TCLK0    ((unsigned int) AT91C_PIO_PA4) //  Timer Counter 0 external clock input

-#define AT91C_PIO_PA5        ((unsigned int) 1 <<  5) // Pin Controlled by PA5

-#define AT91C_PA5_RXD0     ((unsigned int) AT91C_PIO_PA5) //  USART 0 Receive Data

-#define AT91C_PA5_NPCS3    ((unsigned int) AT91C_PIO_PA5) //  SPI Peripheral Chip Select 3

-#define AT91C_PIO_PA6        ((unsigned int) 1 <<  6) // Pin Controlled by PA6

-#define AT91C_PA6_TXD0     ((unsigned int) AT91C_PIO_PA6) //  USART 0 Transmit Data

-#define AT91C_PA6_PCK0     ((unsigned int) AT91C_PIO_PA6) //  PMC Programmable Clock Output 0

-#define AT91C_PIO_PA7        ((unsigned int) 1 <<  7) // Pin Controlled by PA7

-#define AT91C_PA7_RTS0     ((unsigned int) AT91C_PIO_PA7) //  USART 0 Ready To Send

-#define AT91C_PA7_PWM3     ((unsigned int) AT91C_PIO_PA7) //  PWM Channel 3

-#define AT91C_PIO_PA8        ((unsigned int) 1 <<  8) // Pin Controlled by PA8

-#define AT91C_PA8_CTS0     ((unsigned int) AT91C_PIO_PA8) //  USART 0 Clear To Send

-#define AT91C_PA8_ADTRG    ((unsigned int) AT91C_PIO_PA8) //  ADC External Trigger

-#define AT91C_PIO_PA9        ((unsigned int) 1 <<  9) // Pin Controlled by PA9

-#define AT91C_PA9_DRXD     ((unsigned int) AT91C_PIO_PA9) //  DBGU Debug Receive Data

-#define AT91C_PA9_NPCS1    ((unsigned int) AT91C_PIO_PA9) //  SPI Peripheral Chip Select 1

-

-// *****************************************************************************

-//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7S64

-// *****************************************************************************

-#define AT91C_ID_FIQ    ((unsigned int)  0) // Advanced Interrupt Controller (FIQ)

-#define AT91C_ID_SYS    ((unsigned int)  1) // System Peripheral

-#define AT91C_ID_PIOA   ((unsigned int)  2) // Parallel IO Controller

-#define AT91C_ID_3_Reserved ((unsigned int)  3) // Reserved

-#define AT91C_ID_ADC    ((unsigned int)  4) // Analog-to-Digital Converter

-#define AT91C_ID_SPI    ((unsigned int)  5) // Serial Peripheral Interface

-#define AT91C_ID_US0    ((unsigned int)  6) // USART 0

-#define AT91C_ID_US1    ((unsigned int)  7) // USART 1

-#define AT91C_ID_SSC    ((unsigned int)  8) // Serial Synchronous Controller

-#define AT91C_ID_TWI    ((unsigned int)  9) // Two-Wire Interface

-#define AT91C_ID_PWMC   ((unsigned int) 10) // PWM Controller

-#define AT91C_ID_UDP    ((unsigned int) 11) // USB Device Port

-#define AT91C_ID_TC0    ((unsigned int) 12) // Timer Counter 0

-#define AT91C_ID_TC1    ((unsigned int) 13) // Timer Counter 1

-#define AT91C_ID_TC2    ((unsigned int) 14) // Timer Counter 2

-#define AT91C_ID_15_Reserved ((unsigned int) 15) // Reserved

-#define AT91C_ID_16_Reserved ((unsigned int) 16) // Reserved

-#define AT91C_ID_17_Reserved ((unsigned int) 17) // Reserved

-#define AT91C_ID_18_Reserved ((unsigned int) 18) // Reserved

-#define AT91C_ID_19_Reserved ((unsigned int) 19) // Reserved

-#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved

-#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved

-#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved

-#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved

-#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved

-#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved

-#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved

-#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved

-#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved

-#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved

-#define AT91C_ID_IRQ0   ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0)

-#define AT91C_ID_IRQ1   ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1)

-

-// *****************************************************************************

-//               BASE ADDRESS DEFINITIONS FOR AT91SAM7S64

-// *****************************************************************************

-#define AT91C_BASE_SYSC      ((AT91PS_SYSC) 	0xFFFFF000) // (SYSC) Base Address

-#define AT91C_BASE_AIC       ((AT91PS_AIC) 	0xFFFFF000) // (AIC) Base Address

-#define AT91C_BASE_DBGU      ((AT91PS_DBGU) 	0xFFFFF200) // (DBGU) Base Address

-#define AT91C_BASE_PDC_DBGU  ((AT91PS_PDC) 	0xFFFFF300) // (PDC_DBGU) Base Address

-#define AT91C_BASE_PIOA      ((AT91PS_PIO) 	0xFFFFF400) // (PIOA) Base Address

-#define AT91C_BASE_CKGR      ((AT91PS_CKGR) 	0xFFFFFC20) // (CKGR) Base Address

-#define AT91C_BASE_PMC       ((AT91PS_PMC) 	0xFFFFFC00) // (PMC) Base Address

-#define AT91C_BASE_RSTC      ((AT91PS_RSTC) 	0xFFFFFD00) // (RSTC) Base Address

-#define AT91C_BASE_RTTC      ((AT91PS_RTTC) 	0xFFFFFD20) // (RTTC) Base Address

-#define AT91C_BASE_PITC      ((AT91PS_PITC) 	0xFFFFFD30) // (PITC) Base Address

-#define AT91C_BASE_WDTC      ((AT91PS_WDTC) 	0xFFFFFD40) // (WDTC) Base Address

-#define AT91C_BASE_MC        ((AT91PS_MC) 	0xFFFFFF00) // (MC) Base Address

-#define AT91C_BASE_PDC_SPI   ((AT91PS_PDC) 	0xFFFE0100) // (PDC_SPI) Base Address

-#define AT91C_BASE_SPI       ((AT91PS_SPI) 	0xFFFE0000) // (SPI) Base Address

-#define AT91C_BASE_PDC_ADC   ((AT91PS_PDC) 	0xFFFD8100) // (PDC_ADC) Base Address

-#define AT91C_BASE_ADC       ((AT91PS_ADC) 	0xFFFD8000) // (ADC) Base Address

-#define AT91C_BASE_PDC_SSC   ((AT91PS_PDC) 	0xFFFD4100) // (PDC_SSC) Base Address

-#define AT91C_BASE_SSC       ((AT91PS_SSC) 	0xFFFD4000) // (SSC) Base Address

-#define AT91C_BASE_PDC_US1   ((AT91PS_PDC) 	0xFFFC4100) // (PDC_US1) Base Address

-#define AT91C_BASE_US1       ((AT91PS_USART) 	0xFFFC4000) // (US1) Base Address

-#define AT91C_BASE_PDC_US0   ((AT91PS_PDC) 	0xFFFC0100) // (PDC_US0) Base Address

-#define AT91C_BASE_US0       ((AT91PS_USART) 	0xFFFC0000) // (US0) Base Address

-#define AT91C_BASE_TWI       ((AT91PS_TWI) 	0xFFFB8000) // (TWI) Base Address

-#define AT91C_BASE_TC2       ((AT91PS_TC) 	0xFFFA0080) // (TC2) Base Address

-#define AT91C_BASE_TC1       ((AT91PS_TC) 	0xFFFA0040) // (TC1) Base Address

-#define AT91C_BASE_TC0       ((AT91PS_TC) 	0xFFFA0000) // (TC0) Base Address

-#define AT91C_BASE_TCB       ((AT91PS_TCB) 	0xFFFA0000) // (TCB) Base Address

-#define AT91C_BASE_PWMC_CH3  ((AT91PS_PWMC_CH) 	0xFFFCC260) // (PWMC_CH3) Base Address

-#define AT91C_BASE_PWMC_CH2  ((AT91PS_PWMC_CH) 	0xFFFCC240) // (PWMC_CH2) Base Address

-#define AT91C_BASE_PWMC_CH1  ((AT91PS_PWMC_CH) 	0xFFFCC220) // (PWMC_CH1) Base Address

-#define AT91C_BASE_PWMC_CH0  ((AT91PS_PWMC_CH) 	0xFFFCC200) // (PWMC_CH0) Base Address

-#define AT91C_BASE_PWMC      ((AT91PS_PWMC) 	0xFFFCC000) // (PWMC) Base Address

-#define AT91C_BASE_UDP       ((AT91PS_UDP) 	0xFFFB0000) // (UDP) Base Address

-

-// *****************************************************************************

-//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7S64

-// *****************************************************************************

-#define AT91C_ISRAM	 ((char *) 	0x00200000) // Internal SRAM base address

-#define AT91C_ISRAM_SIZE	 ((unsigned int) 0x00004000) // Internal SRAM size in byte (16 Kbyte)

-#define AT91C_IFLASH	 ((char *) 	0x00100000) // Internal ROM base address

-#define AT91C_IFLASH_SIZE	 ((unsigned int) 0x00010000) // Internal ROM size in byte (64 Kbyte)

-

-#endif

+// ----------------------------------------------------------------------------
+//          ATMEL Microcontroller Software Support  -  ROUSSET  -
+// ----------------------------------------------------------------------------
+//  The software is delivered "AS IS" without warranty or condition of any
+//  kind, either express, implied or statutory. This includes without
+//  limitation any warranty or condition with respect to merchantability or
+//  fitness for any particular purpose, or against the infringements of
+//  intellectual property rights of others.
+// ----------------------------------------------------------------------------
+// File Name           : AT91SAM7S64.h
+// Object              : AT91SAM7S64 definitions
+// Generated           : AT91 SW Application Group  07/16/2004 (07:43:08)
+//
+// CVS Reference       : /AT91SAM7S64.pl/1.12/Mon Jul 12 13:02:30 2004//
+// CVS Reference       : /SYSC_SAM7Sxx.pl/1.5/Mon Jul 12 16:22:12 2004//
+// CVS Reference       : /MC_SAM02.pl/1.3/Wed Mar 10 08:37:04 2004//
+// CVS Reference       : /UDP_1765B.pl/1.3/Fri Aug  2 14:45:38 2002//
+// CVS Reference       : /AIC_1796B.pl/1.1.1.1/Fri Jun 28 09:36:48 2002//
+// CVS Reference       : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004//
+// CVS Reference       : /PIO_1725D.pl/1.1.1.1/Fri Jun 28 09:36:48 2002//
+// CVS Reference       : /DBGU_1754A.pl/1.4/Fri Jan 31 12:18:24 2003//
+// CVS Reference       : /US_1739C.pl/1.2/Mon Jul 12 17:26:24 2004//
+// CVS Reference       : /SPI2.pl/1.2/Fri Oct 17 08:13:40 2003//
+// CVS Reference       : /SSC_1762A.pl/1.2/Fri Nov  8 13:26:40 2002//
+// CVS Reference       : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003//
+// CVS Reference       : /TWI_1761B.pl/1.4/Fri Feb  7 10:30:08 2003//
+// CVS Reference       : /PDC_1734B.pl/1.2/Thu Nov 21 16:38:24 2002//
+// CVS Reference       : /ADC_SAM.pl/1.7/Fri Oct 17 08:12:38 2003//
+// CVS Reference       : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004//
+// ----------------------------------------------------------------------------
+
+#ifndef AT91SAM7S64_H
+#define AT91SAM7S64_H
+
+typedef volatile unsigned int AT91_REG;// Hardware register definition
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR System Peripherals
+// *****************************************************************************
+typedef struct _AT91S_SYSC {
+    AT91_REG     SYSC_AIC_SMR[32];  // Source Mode Register
+    AT91_REG     SYSC_AIC_SVR[32];  // Source Vector Register
+    AT91_REG     SYSC_AIC_IVR;  // IRQ Vector Register
+    AT91_REG     SYSC_AIC_FVR;  // FIQ Vector Register
+    AT91_REG     SYSC_AIC_ISR;  // Interrupt Status Register
+    AT91_REG     SYSC_AIC_IPR;  // Interrupt Pending Register
+    AT91_REG     SYSC_AIC_IMR;  // Interrupt Mask Register
+    AT91_REG     SYSC_AIC_CISR;     // Core Interrupt Status Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     SYSC_AIC_IECR;     // Interrupt Enable Command Register
+    AT91_REG     SYSC_AIC_IDCR;     // Interrupt Disable Command Register
+    AT91_REG     SYSC_AIC_ICCR;     // Interrupt Clear Command Register
+    AT91_REG     SYSC_AIC_ISCR;     // Interrupt Set Command Register
+    AT91_REG     SYSC_AIC_EOICR;    // End of Interrupt Command Register
+    AT91_REG     SYSC_AIC_SPU;  // Spurious Vector Register
+    AT91_REG     SYSC_AIC_DCR;  // Debug Control Register (Protect)
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     SYSC_AIC_FFER;     // Fast Forcing Enable Register
+    AT91_REG     SYSC_AIC_FFDR;     // Fast Forcing Disable Register
+    AT91_REG     SYSC_AIC_FFSR;     // Fast Forcing Status Register
+    AT91_REG     Reserved2[45];     //
+    AT91_REG     SYSC_DBGU_CR;  // Control Register
+    AT91_REG     SYSC_DBGU_MR;  // Mode Register
+    AT91_REG     SYSC_DBGU_IER;     // Interrupt Enable Register
+    AT91_REG     SYSC_DBGU_IDR;     // Interrupt Disable Register
+    AT91_REG     SYSC_DBGU_IMR;     // Interrupt Mask Register
+    AT91_REG     SYSC_DBGU_CSR;     // Channel Status Register
+    AT91_REG     SYSC_DBGU_RHR;     // Receiver Holding Register
+    AT91_REG     SYSC_DBGU_THR;     // Transmitter Holding Register
+    AT91_REG     SYSC_DBGU_BRGR;    // Baud Rate Generator Register
+    AT91_REG     Reserved3[7];  //
+    AT91_REG     SYSC_DBGU_C1R;     // Chip ID1 Register
+    AT91_REG     SYSC_DBGU_C2R;     // Chip ID2 Register
+    AT91_REG     SYSC_DBGU_FNTR;    // Force NTRST Register
+    AT91_REG     Reserved4[45];     //
+    AT91_REG     SYSC_DBGU_RPR;     // Receive Pointer Register
+    AT91_REG     SYSC_DBGU_RCR;     // Receive Counter Register
+    AT91_REG     SYSC_DBGU_TPR;     // Transmit Pointer Register
+    AT91_REG     SYSC_DBGU_TCR;     // Transmit Counter Register
+    AT91_REG     SYSC_DBGU_RNPR;    // Receive Next Pointer Register
+    AT91_REG     SYSC_DBGU_RNCR;    // Receive Next Counter Register
+    AT91_REG     SYSC_DBGU_TNPR;    // Transmit Next Pointer Register
+    AT91_REG     SYSC_DBGU_TNCR;    // Transmit Next Counter Register
+    AT91_REG     SYSC_DBGU_PTCR;    // PDC Transfer Control Register
+    AT91_REG     SYSC_DBGU_PTSR;    // PDC Transfer Status Register
+    AT91_REG     Reserved5[54];     //
+    AT91_REG     SYSC_PIOA_PER;     // PIO Enable Register
+    AT91_REG     SYSC_PIOA_PDR;     // PIO Disable Register
+    AT91_REG     SYSC_PIOA_PSR;     // PIO Status Register
+    AT91_REG     Reserved6[1];  //
+    AT91_REG     SYSC_PIOA_OER;     // Output Enable Register
+    AT91_REG     SYSC_PIOA_ODR;     // Output Disable Registerr
+    AT91_REG     SYSC_PIOA_OSR;     // Output Status Register
+    AT91_REG     Reserved7[1];  //
+    AT91_REG     SYSC_PIOA_IFER;    // Input Filter Enable Register
+    AT91_REG     SYSC_PIOA_IFDR;    // Input Filter Disable Register
+    AT91_REG     SYSC_PIOA_IFSR;    // Input Filter Status Register
+    AT91_REG     Reserved8[1];  //
+    AT91_REG     SYSC_PIOA_SODR;    // Set Output Data Register
+    AT91_REG     SYSC_PIOA_CODR;    // Clear Output Data Register
+    AT91_REG     SYSC_PIOA_ODSR;    // Output Data Status Register
+    AT91_REG     SYSC_PIOA_PDSR;    // Pin Data Status Register
+    AT91_REG     SYSC_PIOA_IER;     // Interrupt Enable Register
+    AT91_REG     SYSC_PIOA_IDR;     // Interrupt Disable Register
+    AT91_REG     SYSC_PIOA_IMR;     // Interrupt Mask Register
+    AT91_REG     SYSC_PIOA_ISR;     // Interrupt Status Register
+    AT91_REG     SYSC_PIOA_MDER;    // Multi-driver Enable Register
+    AT91_REG     SYSC_PIOA_MDDR;    // Multi-driver Disable Register
+    AT91_REG     SYSC_PIOA_MDSR;    // Multi-driver Status Register
+    AT91_REG     Reserved9[1];  //
+    AT91_REG     SYSC_PIOA_PPUDR;   // Pull-up Disable Register
+    AT91_REG     SYSC_PIOA_PPUER;   // Pull-up Enable Register
+    AT91_REG     SYSC_PIOA_PPUSR;   // Pad Pull-up Status Register
+    AT91_REG     Reserved10[1];     //
+    AT91_REG     SYSC_PIOA_ASR;     // Select A Register
+    AT91_REG     SYSC_PIOA_BSR;     // Select B Register
+    AT91_REG     SYSC_PIOA_ABSR;    // AB Select Status Register
+    AT91_REG     Reserved11[9];     //
+    AT91_REG     SYSC_PIOA_OWER;    // Output Write Enable Register
+    AT91_REG     SYSC_PIOA_OWDR;    // Output Write Disable Register
+    AT91_REG     SYSC_PIOA_OWSR;    // Output Write Status Register
+    AT91_REG     Reserved12[469];   //
+    AT91_REG     SYSC_PMC_SCER;     // System Clock Enable Register
+    AT91_REG     SYSC_PMC_SCDR;     // System Clock Disable Register
+    AT91_REG     SYSC_PMC_SCSR;     // System Clock Status Register
+    AT91_REG     Reserved13[1];     //
+    AT91_REG     SYSC_PMC_PCER;     // Peripheral Clock Enable Register
+    AT91_REG     SYSC_PMC_PCDR;     // Peripheral Clock Disable Register
+    AT91_REG     SYSC_PMC_PCSR;     // Peripheral Clock Status Register
+    AT91_REG     Reserved14[1];     //
+    AT91_REG     SYSC_PMC_MOR;  // Main Oscillator Register
+    AT91_REG     SYSC_PMC_MCFR;     // Main Clock  Frequency Register
+    AT91_REG     Reserved15[1];     //
+    AT91_REG     SYSC_PMC_PLLR;     // PLL Register
+    AT91_REG     SYSC_PMC_MCKR;     // Master Clock Register
+    AT91_REG     Reserved16[3];     //
+    AT91_REG     SYSC_PMC_PCKR[8];  // Programmable Clock Register
+    AT91_REG     SYSC_PMC_IER;  // Interrupt Enable Register
+    AT91_REG     SYSC_PMC_IDR;  // Interrupt Disable Register
+    AT91_REG     SYSC_PMC_SR;   // Status Register
+    AT91_REG     SYSC_PMC_IMR;  // Interrupt Mask Register
+    AT91_REG     Reserved17[36];    //
+    AT91_REG     SYSC_RSTC_RCR;     // Reset Control Register
+    AT91_REG     SYSC_RSTC_RSR;     // Reset Status Register
+    AT91_REG     SYSC_RSTC_RMR;     // Reset Mode Register
+    AT91_REG     Reserved18[5];     //
+    AT91_REG     SYSC_RTTC_RTMR;    // Real-time Mode Register
+    AT91_REG     SYSC_RTTC_RTAR;    // Real-time Alarm Register
+    AT91_REG     SYSC_RTTC_RTVR;    // Real-time Value Register
+    AT91_REG     SYSC_RTTC_RTSR;    // Real-time Status Register
+    AT91_REG     SYSC_PITC_PIMR;    // Period Interval Mode Register
+    AT91_REG     SYSC_PITC_PISR;    // Period Interval Status Register
+    AT91_REG     SYSC_PITC_PIVR;    // Period Interval Value Register
+    AT91_REG     SYSC_PITC_PIIR;    // Period Interval Image Register
+    AT91_REG     SYSC_WDTC_WDCR;    // Watchdog Control Register
+    AT91_REG     SYSC_WDTC_WDMR;    // Watchdog Mode Register
+    AT91_REG     SYSC_WDTC_WDSR;    // Watchdog Status Register
+    AT91_REG     Reserved19[5];     //
+    AT91_REG     SYSC_SYSC_VRPM;    // Voltage Regulator Power Mode Register
+} AT91S_SYSC, *AT91PS_SYSC;
+
+// -------- VRPM : (SYSC Offset: 0xd60) Voltage Regulator Power Mode Register --------
+#define AT91C_SYSC_PSTDBY     ((unsigned int) 0x1 <<  0) // (SYSC) Voltage Regulator Power Mode
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller
+// *****************************************************************************
+typedef struct _AT91S_AIC {
+    AT91_REG     AIC_SMR[32];   // Source Mode Register
+    AT91_REG     AIC_SVR[32];   // Source Vector Register
+    AT91_REG     AIC_IVR;   // IRQ Vector Register
+    AT91_REG     AIC_FVR;   // FIQ Vector Register
+    AT91_REG     AIC_ISR;   // Interrupt Status Register
+    AT91_REG     AIC_IPR;   // Interrupt Pending Register
+    AT91_REG     AIC_IMR;   // Interrupt Mask Register
+    AT91_REG     AIC_CISR;  // Core Interrupt Status Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     AIC_IECR;  // Interrupt Enable Command Register
+    AT91_REG     AIC_IDCR;  // Interrupt Disable Command Register
+    AT91_REG     AIC_ICCR;  // Interrupt Clear Command Register
+    AT91_REG     AIC_ISCR;  // Interrupt Set Command Register
+    AT91_REG     AIC_EOICR;     // End of Interrupt Command Register
+    AT91_REG     AIC_SPU;   // Spurious Vector Register
+    AT91_REG     AIC_DCR;   // Debug Control Register (Protect)
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     AIC_FFER;  // Fast Forcing Enable Register
+    AT91_REG     AIC_FFDR;  // Fast Forcing Disable Register
+    AT91_REG     AIC_FFSR;  // Fast Forcing Status Register
+} AT91S_AIC, *AT91PS_AIC;
+
+// -------- AIC_SMR : (AIC Offset: 0x0) Control Register --------
+#define AT91C_AIC_PRIOR       ((unsigned int) 0x7 <<  0) // (AIC) Priority Level
+#define     AT91C_AIC_PRIOR_LOWEST               ((unsigned int) 0x0) // (AIC) Lowest priority level
+#define     AT91C_AIC_PRIOR_HIGHEST              ((unsigned int) 0x7) // (AIC) Highest priority level
+#define AT91C_AIC_SRCTYPE     ((unsigned int) 0x3 <<  5) // (AIC) Interrupt Source Type
+#define     AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE  ((unsigned int) 0x0 <<  5) // (AIC) Internal Sources Code Label Level Sensitive
+#define     AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED   ((unsigned int) 0x1 <<  5) // (AIC) Internal Sources Code Label Edge triggered
+#define     AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL       ((unsigned int) 0x2 <<  5) // (AIC) External Sources Code Label High-level Sensitive
+#define     AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE    ((unsigned int) 0x3 <<  5) // (AIC) External Sources Code Label Positive Edge triggered
+// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register --------
+#define AT91C_AIC_NFIQ        ((unsigned int) 0x1 <<  0) // (AIC) NFIQ Status
+#define AT91C_AIC_NIRQ        ((unsigned int) 0x1 <<  1) // (AIC) NIRQ Status
+// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) --------
+#define AT91C_AIC_DCR_PROT    ((unsigned int) 0x1 <<  0) // (AIC) Protection Mode
+#define AT91C_AIC_DCR_GMSK    ((unsigned int) 0x1 <<  1) // (AIC) General Mask
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Debug Unit
+// *****************************************************************************
+typedef struct _AT91S_DBGU {
+    AT91_REG     DBGU_CR;   // Control Register
+    AT91_REG     DBGU_MR;   // Mode Register
+    AT91_REG     DBGU_IER;  // Interrupt Enable Register
+    AT91_REG     DBGU_IDR;  // Interrupt Disable Register
+    AT91_REG     DBGU_IMR;  // Interrupt Mask Register
+    AT91_REG     DBGU_CSR;  // Channel Status Register
+    AT91_REG     DBGU_RHR;  // Receiver Holding Register
+    AT91_REG     DBGU_THR;  // Transmitter Holding Register
+    AT91_REG     DBGU_BRGR;     // Baud Rate Generator Register
+    AT91_REG     Reserved0[7];  //
+    AT91_REG     DBGU_C1R;  // Chip ID1 Register
+    AT91_REG     DBGU_C2R;  // Chip ID2 Register
+    AT91_REG     DBGU_FNTR;     // Force NTRST Register
+    AT91_REG     Reserved1[45];     //
+    AT91_REG     DBGU_RPR;  // Receive Pointer Register
+    AT91_REG     DBGU_RCR;  // Receive Counter Register
+    AT91_REG     DBGU_TPR;  // Transmit Pointer Register
+    AT91_REG     DBGU_TCR;  // Transmit Counter Register
+    AT91_REG     DBGU_RNPR;     // Receive Next Pointer Register
+    AT91_REG     DBGU_RNCR;     // Receive Next Counter Register
+    AT91_REG     DBGU_TNPR;     // Transmit Next Pointer Register
+    AT91_REG     DBGU_TNCR;     // Transmit Next Counter Register
+    AT91_REG     DBGU_PTCR;     // PDC Transfer Control Register
+    AT91_REG     DBGU_PTSR;     // PDC Transfer Status Register
+} AT91S_DBGU, *AT91PS_DBGU;
+
+// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_RSTRX        ((unsigned int) 0x1 <<  2) // (DBGU) Reset Receiver
+#define AT91C_US_RSTTX        ((unsigned int) 0x1 <<  3) // (DBGU) Reset Transmitter
+#define AT91C_US_RXEN         ((unsigned int) 0x1 <<  4) // (DBGU) Receiver Enable
+#define AT91C_US_RXDIS        ((unsigned int) 0x1 <<  5) // (DBGU) Receiver Disable
+#define AT91C_US_TXEN         ((unsigned int) 0x1 <<  6) // (DBGU) Transmitter Enable
+#define AT91C_US_TXDIS        ((unsigned int) 0x1 <<  7) // (DBGU) Transmitter Disable
+// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_PAR          ((unsigned int) 0x7 <<  9) // (DBGU) Parity type
+#define     AT91C_US_PAR_EVEN                 ((unsigned int) 0x0 <<  9) // (DBGU) Even Parity
+#define     AT91C_US_PAR_ODD                  ((unsigned int) 0x1 <<  9) // (DBGU) Odd Parity
+#define     AT91C_US_PAR_SPACE                ((unsigned int) 0x2 <<  9) // (DBGU) Parity forced to 0 (Space)
+#define     AT91C_US_PAR_MARK                 ((unsigned int) 0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)
+#define     AT91C_US_PAR_NONE                 ((unsigned int) 0x4 <<  9) // (DBGU) No Parity
+#define     AT91C_US_PAR_MULTI_DROP           ((unsigned int) 0x6 <<  9) // (DBGU) Multi-drop mode
+#define AT91C_US_CHMODE       ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode
+#define     AT91C_US_CHMODE_NORMAL               ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.
+#define     AT91C_US_CHMODE_AUTO                 ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.
+#define     AT91C_US_CHMODE_LOCAL                ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.
+#define     AT91C_US_CHMODE_REMOTE               ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.
+// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXRDY        ((unsigned int) 0x1 <<  0) // (DBGU) RXRDY Interrupt
+#define AT91C_US_TXRDY        ((unsigned int) 0x1 <<  1) // (DBGU) TXRDY Interrupt
+#define AT91C_US_ENDRX        ((unsigned int) 0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt
+#define AT91C_US_ENDTX        ((unsigned int) 0x1 <<  4) // (DBGU) End of Transmit Interrupt
+#define AT91C_US_OVRE         ((unsigned int) 0x1 <<  5) // (DBGU) Overrun Interrupt
+#define AT91C_US_FRAME        ((unsigned int) 0x1 <<  6) // (DBGU) Framing Error Interrupt
+#define AT91C_US_PARE         ((unsigned int) 0x1 <<  7) // (DBGU) Parity Error Interrupt
+#define AT91C_US_TXEMPTY      ((unsigned int) 0x1 <<  9) // (DBGU) TXEMPTY Interrupt
+#define AT91C_US_TXBUFE       ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt
+#define AT91C_US_RXBUFF       ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt
+#define AT91C_US_COMM_TX      ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt
+#define AT91C_US_COMM_RX      ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt
+// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register --------
+// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register --------
+#define AT91C_US_FORCE_NTRST  ((unsigned int) 0x1 <<  0) // (DBGU) Force NTRST in JTAG
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Peripheral Data Controller
+// *****************************************************************************
+typedef struct _AT91S_PDC {
+    AT91_REG     PDC_RPR;   // Receive Pointer Register
+    AT91_REG     PDC_RCR;   // Receive Counter Register
+    AT91_REG     PDC_TPR;   // Transmit Pointer Register
+    AT91_REG     PDC_TCR;   // Transmit Counter Register
+    AT91_REG     PDC_RNPR;  // Receive Next Pointer Register
+    AT91_REG     PDC_RNCR;  // Receive Next Counter Register
+    AT91_REG     PDC_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     PDC_TNCR;  // Transmit Next Counter Register
+    AT91_REG     PDC_PTCR;  // PDC Transfer Control Register
+    AT91_REG     PDC_PTSR;  // PDC Transfer Status Register
+} AT91S_PDC, *AT91PS_PDC;
+
+// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register --------
+#define AT91C_PDC_RXTEN       ((unsigned int) 0x1 <<  0) // (PDC) Receiver Transfer Enable
+#define AT91C_PDC_RXTDIS      ((unsigned int) 0x1 <<  1) // (PDC) Receiver Transfer Disable
+#define AT91C_PDC_TXTEN       ((unsigned int) 0x1 <<  8) // (PDC) Transmitter Transfer Enable
+#define AT91C_PDC_TXTDIS      ((unsigned int) 0x1 <<  9) // (PDC) Transmitter Transfer Disable
+// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler
+// *****************************************************************************
+typedef struct _AT91S_PIO {
+    AT91_REG     PIO_PER;   // PIO Enable Register
+    AT91_REG     PIO_PDR;   // PIO Disable Register
+    AT91_REG     PIO_PSR;   // PIO Status Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     PIO_OER;   // Output Enable Register
+    AT91_REG     PIO_ODR;   // Output Disable Registerr
+    AT91_REG     PIO_OSR;   // Output Status Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     PIO_IFER;  // Input Filter Enable Register
+    AT91_REG     PIO_IFDR;  // Input Filter Disable Register
+    AT91_REG     PIO_IFSR;  // Input Filter Status Register
+    AT91_REG     Reserved2[1];  //
+    AT91_REG     PIO_SODR;  // Set Output Data Register
+    AT91_REG     PIO_CODR;  // Clear Output Data Register
+    AT91_REG     PIO_ODSR;  // Output Data Status Register
+    AT91_REG     PIO_PDSR;  // Pin Data Status Register
+    AT91_REG     PIO_IER;   // Interrupt Enable Register
+    AT91_REG     PIO_IDR;   // Interrupt Disable Register
+    AT91_REG     PIO_IMR;   // Interrupt Mask Register
+    AT91_REG     PIO_ISR;   // Interrupt Status Register
+    AT91_REG     PIO_MDER;  // Multi-driver Enable Register
+    AT91_REG     PIO_MDDR;  // Multi-driver Disable Register
+    AT91_REG     PIO_MDSR;  // Multi-driver Status Register
+    AT91_REG     Reserved3[1];  //
+    AT91_REG     PIO_PPUDR;     // Pull-up Disable Register
+    AT91_REG     PIO_PPUER;     // Pull-up Enable Register
+    AT91_REG     PIO_PPUSR;     // Pad Pull-up Status Register
+    AT91_REG     Reserved4[1];  //
+    AT91_REG     PIO_ASR;   // Select A Register
+    AT91_REG     PIO_BSR;   // Select B Register
+    AT91_REG     PIO_ABSR;  // AB Select Status Register
+    AT91_REG     Reserved5[9];  //
+    AT91_REG     PIO_OWER;  // Output Write Enable Register
+    AT91_REG     PIO_OWDR;  // Output Write Disable Register
+    AT91_REG     PIO_OWSR;  // Output Write Status Register
+} AT91S_PIO, *AT91PS_PIO;
+
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Clock Generator Controler
+// *****************************************************************************
+typedef struct _AT91S_CKGR {
+    AT91_REG     CKGR_MOR;  // Main Oscillator Register
+    AT91_REG     CKGR_MCFR;     // Main Clock  Frequency Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     CKGR_PLLR;     // PLL Register
+} AT91S_CKGR, *AT91PS_CKGR;
+
+// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register --------
+#define AT91C_CKGR_MOSCEN     ((unsigned int) 0x1 <<  0) // (CKGR) Main Oscillator Enable
+#define AT91C_CKGR_OSCBYPASS  ((unsigned int) 0x1 <<  1) // (CKGR) Main Oscillator Bypass
+#define AT91C_CKGR_OSCOUNT    ((unsigned int) 0xFF <<  8) // (CKGR) Main Oscillator Start-up Time
+// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register --------
+#define AT91C_CKGR_MAINF      ((unsigned int) 0xFFFF <<  0) // (CKGR) Main Clock Frequency
+#define AT91C_CKGR_MAINRDY    ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready
+// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register --------
+#define AT91C_CKGR_DIV        ((unsigned int) 0xFF <<  0) // (CKGR) Divider Selected
+#define     AT91C_CKGR_DIV_0                    ((unsigned int) 0x0) // (CKGR) Divider output is 0
+#define     AT91C_CKGR_DIV_BYPASS               ((unsigned int) 0x1) // (CKGR) Divider is bypassed
+#define AT91C_CKGR_PLLCOUNT   ((unsigned int) 0x3F <<  8) // (CKGR) PLL Counter
+#define AT91C_CKGR_OUT        ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range
+#define     AT91C_CKGR_OUT_0                    ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_1                    ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_2                    ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_3                    ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet
+#define AT91C_CKGR_MUL        ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier
+#define AT91C_CKGR_USBDIV     ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks
+#define     AT91C_CKGR_USBDIV_0                    ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output
+#define     AT91C_CKGR_USBDIV_1                    ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2
+#define     AT91C_CKGR_USBDIV_2                    ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Power Management Controler
+// *****************************************************************************
+typedef struct _AT91S_PMC {
+    AT91_REG     PMC_SCER;  // System Clock Enable Register
+    AT91_REG     PMC_SCDR;  // System Clock Disable Register
+    AT91_REG     PMC_SCSR;  // System Clock Status Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     PMC_PCER;  // Peripheral Clock Enable Register
+    AT91_REG     PMC_PCDR;  // Peripheral Clock Disable Register
+    AT91_REG     PMC_PCSR;  // Peripheral Clock Status Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     PMC_MOR;   // Main Oscillator Register
+    AT91_REG     PMC_MCFR;  // Main Clock  Frequency Register
+    AT91_REG     Reserved2[1];  //
+    AT91_REG     PMC_PLLR;  // PLL Register
+    AT91_REG     PMC_MCKR;  // Master Clock Register
+    AT91_REG     Reserved3[3];  //
+    AT91_REG     PMC_PCKR[8];   // Programmable Clock Register
+    AT91_REG     PMC_IER;   // Interrupt Enable Register
+    AT91_REG     PMC_IDR;   // Interrupt Disable Register
+    AT91_REG     PMC_SR;    // Status Register
+    AT91_REG     PMC_IMR;   // Interrupt Mask Register
+} AT91S_PMC, *AT91PS_PMC;
+
+// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register --------
+#define AT91C_PMC_PCK         ((unsigned int) 0x1 <<  0) // (PMC) Processor Clock
+#define AT91C_PMC_UDP         ((unsigned int) 0x1 <<  7) // (PMC) USB Device Port Clock
+#define AT91C_PMC_PCK0        ((unsigned int) 0x1 <<  8) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK1        ((unsigned int) 0x1 <<  9) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK2        ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK3        ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output
+// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register --------
+// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register --------
+// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register --------
+// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register --------
+// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register --------
+// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register --------
+#define AT91C_PMC_CSS         ((unsigned int) 0x3 <<  0) // (PMC) Programmable Clock Selection
+#define     AT91C_PMC_CSS_SLOW_CLK             ((unsigned int) 0x0) // (PMC) Slow Clock is selected
+#define     AT91C_PMC_CSS_MAIN_CLK             ((unsigned int) 0x1) // (PMC) Main Clock is selected
+#define     AT91C_PMC_CSS_PLL_CLK              ((unsigned int) 0x3) // (PMC) Clock from PLL is selected
+#define AT91C_PMC_PRES        ((unsigned int) 0x7 <<  2) // (PMC) Programmable Clock Prescaler
+#define     AT91C_PMC_PRES_CLK                  ((unsigned int) 0x0 <<  2) // (PMC) Selected clock
+#define     AT91C_PMC_PRES_CLK_2                ((unsigned int) 0x1 <<  2) // (PMC) Selected clock divided by 2
+#define     AT91C_PMC_PRES_CLK_4                ((unsigned int) 0x2 <<  2) // (PMC) Selected clock divided by 4
+#define     AT91C_PMC_PRES_CLK_8                ((unsigned int) 0x3 <<  2) // (PMC) Selected clock divided by 8
+#define     AT91C_PMC_PRES_CLK_16               ((unsigned int) 0x4 <<  2) // (PMC) Selected clock divided by 16
+#define     AT91C_PMC_PRES_CLK_32               ((unsigned int) 0x5 <<  2) // (PMC) Selected clock divided by 32
+#define     AT91C_PMC_PRES_CLK_64               ((unsigned int) 0x6 <<  2) // (PMC) Selected clock divided by 64
+// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register --------
+// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register --------
+#define AT91C_PMC_MOSCS       ((unsigned int) 0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask
+#define AT91C_PMC_LOCK        ((unsigned int) 0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask
+#define AT91C_PMC_MCKRDY      ((unsigned int) 0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK0RDY     ((unsigned int) 0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK1RDY     ((unsigned int) 0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK2RDY     ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK3RDY     ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask
+// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register --------
+// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register --------
+// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Reset Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_RSTC {
+    AT91_REG     RSTC_RCR;  // Reset Control Register
+    AT91_REG     RSTC_RSR;  // Reset Status Register
+    AT91_REG     RSTC_RMR;  // Reset Mode Register
+} AT91S_RSTC, *AT91PS_RSTC;
+
+// -------- SYSC_RCR : (RSTC Offset: 0x0) Reset Control Register --------
+#define AT91C_SYSC_PROCRST    ((unsigned int) 0x1 <<  0) // (RSTC) Processor Reset
+#define AT91C_SYSC_ICERST     ((unsigned int) 0x1 <<  1) // (RSTC) ICE Interface Reset
+#define AT91C_SYSC_PERRST     ((unsigned int) 0x1 <<  2) // (RSTC) Peripheral Reset
+#define AT91C_SYSC_EXTRST     ((unsigned int) 0x1 <<  3) // (RSTC) External Reset
+#define AT91C_SYSC_KEY        ((unsigned int) 0xFF << 24) // (RSTC) Password
+// -------- SYSC_RSR : (RSTC Offset: 0x4) Reset Status Register --------
+#define AT91C_SYSC_URSTS      ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Status
+#define AT91C_SYSC_BODSTS     ((unsigned int) 0x1 <<  1) // (RSTC) Brown-out Detection Status
+#define AT91C_SYSC_RSTTYP     ((unsigned int) 0x7 <<  8) // (RSTC) Reset Type
+#define     AT91C_SYSC_RSTTYP_POWERUP              ((unsigned int) 0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.
+#define     AT91C_SYSC_RSTTYP_WATCHDOG             ((unsigned int) 0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.
+#define     AT91C_SYSC_RSTTYP_SOFTWARE             ((unsigned int) 0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.
+#define     AT91C_SYSC_RSTTYP_USER                 ((unsigned int) 0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.
+#define     AT91C_SYSC_RSTTYP_BROWNOUT             ((unsigned int) 0x5 <<  8) // (RSTC) Brown-out Reset.
+#define AT91C_SYSC_NRSTL      ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level
+#define AT91C_SYSC_SRCMP      ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress.
+// -------- SYSC_RMR : (RSTC Offset: 0x8) Reset Mode Register --------
+#define AT91C_SYSC_URSTEN     ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Enable
+#define AT91C_SYSC_URSTIEN    ((unsigned int) 0x1 <<  4) // (RSTC) User Reset Interrupt Enable
+#define AT91C_SYSC_ERSTL      ((unsigned int) 0xF <<  8) // (RSTC) User Reset Enable
+#define AT91C_SYSC_BODIEN     ((unsigned int) 0x1 << 16) // (RSTC) Brown-out Detection Interrupt Enable
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_RTTC {
+    AT91_REG     RTTC_RTMR;     // Real-time Mode Register
+    AT91_REG     RTTC_RTAR;     // Real-time Alarm Register
+    AT91_REG     RTTC_RTVR;     // Real-time Value Register
+    AT91_REG     RTTC_RTSR;     // Real-time Status Register
+} AT91S_RTTC, *AT91PS_RTTC;
+
+// -------- SYSC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register --------
+#define AT91C_SYSC_RTPRES     ((unsigned int) 0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value
+#define AT91C_SYSC_ALMIEN     ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable
+#define AT91C_SYSC_RTTINCIEN  ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable
+#define AT91C_SYSC_RTTRST     ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart
+// -------- SYSC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register --------
+#define AT91C_SYSC_ALMV       ((unsigned int) 0x0 <<  0) // (RTTC) Alarm Value
+// -------- SYSC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register --------
+#define AT91C_SYSC_CRTV       ((unsigned int) 0x0 <<  0) // (RTTC) Current Real-time Value
+// -------- SYSC_RTSR : (RTTC Offset: 0xc) Real-time Status Register --------
+#define AT91C_SYSC_ALMS       ((unsigned int) 0x1 <<  0) // (RTTC) Real-time Alarm Status
+#define AT91C_SYSC_RTTINC     ((unsigned int) 0x1 <<  1) // (RTTC) Real-time Timer Increment
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_PITC {
+    AT91_REG     PITC_PIMR;     // Period Interval Mode Register
+    AT91_REG     PITC_PISR;     // Period Interval Status Register
+    AT91_REG     PITC_PIVR;     // Period Interval Value Register
+    AT91_REG     PITC_PIIR;     // Period Interval Image Register
+} AT91S_PITC, *AT91PS_PITC;
+
+// -------- SYSC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register --------
+#define AT91C_SYSC_PIV        ((unsigned int) 0xFFFFF <<  0) // (PITC) Periodic Interval Value
+#define AT91C_SYSC_PITEN      ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled
+#define AT91C_SYSC_PITIEN     ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable
+// -------- SYSC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register --------
+#define AT91C_SYSC_PITS       ((unsigned int) 0x1 <<  0) // (PITC) Periodic Interval Timer Status
+// -------- SYSC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register --------
+#define AT91C_SYSC_CPIV       ((unsigned int) 0xFFFFF <<  0) // (PITC) Current Periodic Interval Value
+#define AT91C_SYSC_PICNT      ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter
+// -------- SYSC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_WDTC {
+    AT91_REG     WDTC_WDCR;     // Watchdog Control Register
+    AT91_REG     WDTC_WDMR;     // Watchdog Mode Register
+    AT91_REG     WDTC_WDSR;     // Watchdog Status Register
+} AT91S_WDTC, *AT91PS_WDTC;
+
+// -------- SYSC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register --------
+#define AT91C_SYSC_WDRSTT     ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Restart
+// -------- SYSC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register --------
+#define AT91C_SYSC_WDV        ((unsigned int) 0xFFF <<  0) // (WDTC) Watchdog Timer Restart
+#define AT91C_SYSC_WDFIEN     ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable
+#define AT91C_SYSC_WDRSTEN    ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable
+#define AT91C_SYSC_WDRPROC    ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart
+#define AT91C_SYSC_WDDIS      ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable
+#define AT91C_SYSC_WDD        ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value
+#define AT91C_SYSC_WDDBGHLT   ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt
+#define AT91C_SYSC_WDIDLEHLT  ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt
+// -------- SYSC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register --------
+#define AT91C_SYSC_WDUNF      ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Underflow
+#define AT91C_SYSC_WDERR      ((unsigned int) 0x1 <<  1) // (WDTC) Watchdog Error
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Memory Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_MC {
+    AT91_REG     MC_RCR;    // MC Remap Control Register
+    AT91_REG     MC_ASR;    // MC Abort Status Register
+    AT91_REG     MC_AASR;   // MC Abort Address Status Register
+    AT91_REG     Reserved0[21];     //
+    AT91_REG     MC_FMR;    // MC Flash Mode Register
+    AT91_REG     MC_FCR;    // MC Flash Command Register
+    AT91_REG     MC_FSR;    // MC Flash Status Register
+} AT91S_MC, *AT91PS_MC;
+
+// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register --------
+#define AT91C_MC_RCB          ((unsigned int) 0x1 <<  0) // (MC) Remap Command Bit
+// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register --------
+#define AT91C_MC_UNDADD       ((unsigned int) 0x1 <<  0) // (MC) Undefined Addess Abort Status
+#define AT91C_MC_MISADD       ((unsigned int) 0x1 <<  1) // (MC) Misaligned Addess Abort Status
+#define AT91C_MC_ABTSZ        ((unsigned int) 0x3 <<  8) // (MC) Abort Size Status
+#define     AT91C_MC_ABTSZ_BYTE                 ((unsigned int) 0x0 <<  8) // (MC) Byte
+#define     AT91C_MC_ABTSZ_HWORD                ((unsigned int) 0x1 <<  8) // (MC) Half-word
+#define     AT91C_MC_ABTSZ_WORD                 ((unsigned int) 0x2 <<  8) // (MC) Word
+#define AT91C_MC_ABTTYP       ((unsigned int) 0x3 << 10) // (MC) Abort Type Status
+#define     AT91C_MC_ABTTYP_DATAR                ((unsigned int) 0x0 << 10) // (MC) Data Read
+#define     AT91C_MC_ABTTYP_DATAW                ((unsigned int) 0x1 << 10) // (MC) Data Write
+#define     AT91C_MC_ABTTYP_FETCH                ((unsigned int) 0x2 << 10) // (MC) Code Fetch
+#define AT91C_MC_MST0         ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source
+#define AT91C_MC_MST1         ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source
+#define AT91C_MC_SVMST0       ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source
+#define AT91C_MC_SVMST1       ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source
+// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register --------
+#define AT91C_MC_FRDY         ((unsigned int) 0x1 <<  0) // (MC) Flash Ready
+#define AT91C_MC_LOCKE        ((unsigned int) 0x1 <<  2) // (MC) Lock Error
+#define AT91C_MC_PROGE        ((unsigned int) 0x1 <<  3) // (MC) Programming Error
+#define AT91C_MC_NEBP         ((unsigned int) 0x1 <<  7) // (MC) No Erase Before Programming
+#define AT91C_MC_FWS          ((unsigned int) 0x3 <<  8) // (MC) Flash Wait State
+#define     AT91C_MC_FWS_0FWS                 ((unsigned int) 0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations
+#define     AT91C_MC_FWS_1FWS                 ((unsigned int) 0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations
+#define     AT91C_MC_FWS_2FWS                 ((unsigned int) 0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations
+#define     AT91C_MC_FWS_3FWS                 ((unsigned int) 0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations
+#define AT91C_MC_FMCN         ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number
+// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register --------
+#define AT91C_MC_FCMD         ((unsigned int) 0xF <<  0) // (MC) Flash Command
+#define     AT91C_MC_FCMD_START_PROG           ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN.
+#define     AT91C_MC_FCMD_LOCK                 ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_PROG_AND_LOCK        ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.
+#define     AT91C_MC_FCMD_UNLOCK               ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_ERASE_ALL            ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.
+#define     AT91C_MC_FCMD_SET_GP_NVM           ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits.
+#define     AT91C_MC_FCMD_CLR_GP_NVM           ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits.
+#define     AT91C_MC_FCMD_SET_SECURITY         ((unsigned int) 0xF) // (MC) Set Security Bit.
+#define AT91C_MC_PAGEN        ((unsigned int) 0x3FF <<  8) // (MC) Page Number
+#define AT91C_MC_KEY          ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key
+// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register --------
+#define AT91C_MC_SECURITY     ((unsigned int) 0x1 <<  4) // (MC) Security Bit Status
+#define AT91C_MC_GPNVM0       ((unsigned int) 0x1 <<  8) // (MC) Sector 0 Lock Status
+#define AT91C_MC_GPNVM1       ((unsigned int) 0x1 <<  9) // (MC) Sector 1 Lock Status
+#define AT91C_MC_GPNVM2       ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status
+#define AT91C_MC_GPNVM3       ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status
+#define AT91C_MC_GPNVM4       ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status
+#define AT91C_MC_GPNVM5       ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status
+#define AT91C_MC_GPNVM6       ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status
+#define AT91C_MC_GPNVM7       ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS0       ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status
+#define AT91C_MC_LOCKS1       ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status
+#define AT91C_MC_LOCKS2       ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status
+#define AT91C_MC_LOCKS3       ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status
+#define AT91C_MC_LOCKS4       ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status
+#define AT91C_MC_LOCKS5       ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status
+#define AT91C_MC_LOCKS6       ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status
+#define AT91C_MC_LOCKS7       ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS8       ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status
+#define AT91C_MC_LOCKS9       ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status
+#define AT91C_MC_LOCKS10      ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status
+#define AT91C_MC_LOCKS11      ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status
+#define AT91C_MC_LOCKS12      ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status
+#define AT91C_MC_LOCKS13      ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status
+#define AT91C_MC_LOCKS14      ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status
+#define AT91C_MC_LOCKS15      ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface
+// *****************************************************************************
+typedef struct _AT91S_SPI {
+    AT91_REG     SPI_CR;    // Control Register
+    AT91_REG     SPI_MR;    // Mode Register
+    AT91_REG     SPI_RDR;   // Receive Data Register
+    AT91_REG     SPI_TDR;   // Transmit Data Register
+    AT91_REG     SPI_SR;    // Status Register
+    AT91_REG     SPI_IER;   // Interrupt Enable Register
+    AT91_REG     SPI_IDR;   // Interrupt Disable Register
+    AT91_REG     SPI_IMR;   // Interrupt Mask Register
+    AT91_REG     Reserved0[4];  //
+    AT91_REG     SPI_CSR[4];    // Chip Select Register
+    AT91_REG     Reserved1[48];     //
+    AT91_REG     SPI_RPR;   // Receive Pointer Register
+    AT91_REG     SPI_RCR;   // Receive Counter Register
+    AT91_REG     SPI_TPR;   // Transmit Pointer Register
+    AT91_REG     SPI_TCR;   // Transmit Counter Register
+    AT91_REG     SPI_RNPR;  // Receive Next Pointer Register
+    AT91_REG     SPI_RNCR;  // Receive Next Counter Register
+    AT91_REG     SPI_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     SPI_TNCR;  // Transmit Next Counter Register
+    AT91_REG     SPI_PTCR;  // PDC Transfer Control Register
+    AT91_REG     SPI_PTSR;  // PDC Transfer Status Register
+} AT91S_SPI, *AT91PS_SPI;
+
+// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register --------
+#define AT91C_SPI_SPIEN       ((unsigned int) 0x1 <<  0) // (SPI) SPI Enable
+#define AT91C_SPI_SPIDIS      ((unsigned int) 0x1 <<  1) // (SPI) SPI Disable
+#define AT91C_SPI_SWRST       ((unsigned int) 0x1 <<  7) // (SPI) SPI Software reset
+#define AT91C_SPI_LASTXFER    ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer
+// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register --------
+#define AT91C_SPI_MSTR        ((unsigned int) 0x1 <<  0) // (SPI) Master/Slave Mode
+#define AT91C_SPI_PS          ((unsigned int) 0x1 <<  1) // (SPI) Peripheral Select
+#define     AT91C_SPI_PS_FIXED                ((unsigned int) 0x0 <<  1) // (SPI) Fixed Peripheral Select
+#define     AT91C_SPI_PS_VARIABLE             ((unsigned int) 0x1 <<  1) // (SPI) Variable Peripheral Select
+#define AT91C_SPI_PCSDEC      ((unsigned int) 0x1 <<  2) // (SPI) Chip Select Decode
+#define AT91C_SPI_FDIV        ((unsigned int) 0x1 <<  3) // (SPI) Clock Selection
+#define AT91C_SPI_MODFDIS     ((unsigned int) 0x1 <<  4) // (SPI) Mode Fault Detection
+#define AT91C_SPI_LLB         ((unsigned int) 0x1 <<  7) // (SPI) Clock Selection
+#define AT91C_SPI_PCS         ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select
+#define AT91C_SPI_DLYBCS      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects
+// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register --------
+#define AT91C_SPI_RD          ((unsigned int) 0xFFFF <<  0) // (SPI) Receive Data
+#define AT91C_SPI_RPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register --------
+#define AT91C_SPI_TD          ((unsigned int) 0xFFFF <<  0) // (SPI) Transmit Data
+#define AT91C_SPI_TPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_SR : (SPI Offset: 0x10) Status Register --------
+#define AT91C_SPI_RDRF        ((unsigned int) 0x1 <<  0) // (SPI) Receive Data Register Full
+#define AT91C_SPI_TDRE        ((unsigned int) 0x1 <<  1) // (SPI) Transmit Data Register Empty
+#define AT91C_SPI_MODF        ((unsigned int) 0x1 <<  2) // (SPI) Mode Fault Error
+#define AT91C_SPI_OVRES       ((unsigned int) 0x1 <<  3) // (SPI) Overrun Error Status
+#define AT91C_SPI_ENDRX       ((unsigned int) 0x1 <<  4) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_ENDTX       ((unsigned int) 0x1 <<  5) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_RXBUFF      ((unsigned int) 0x1 <<  6) // (SPI) RXBUFF Interrupt
+#define AT91C_SPI_TXBUFE      ((unsigned int) 0x1 <<  7) // (SPI) TXBUFE Interrupt
+#define AT91C_SPI_NSSR        ((unsigned int) 0x1 <<  8) // (SPI) NSSR Interrupt
+#define AT91C_SPI_TXEMPTY     ((unsigned int) 0x1 <<  9) // (SPI) TXEMPTY Interrupt
+#define AT91C_SPI_SPIENS      ((unsigned int) 0x1 << 16) // (SPI) Enable Status
+// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register --------
+// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register --------
+// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register --------
+// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register --------
+#define AT91C_SPI_CPOL        ((unsigned int) 0x1 <<  0) // (SPI) Clock Polarity
+#define AT91C_SPI_NCPHA       ((unsigned int) 0x1 <<  1) // (SPI) Clock Phase
+#define AT91C_SPI_CSAAT       ((unsigned int) 0x1 <<  2) // (SPI) Chip Select Active After Transfer
+#define AT91C_SPI_BITS        ((unsigned int) 0xF <<  4) // (SPI) Bits Per Transfer
+#define     AT91C_SPI_BITS_8                    ((unsigned int) 0x0 <<  4) // (SPI) 8 Bits Per transfer
+#define     AT91C_SPI_BITS_9                    ((unsigned int) 0x1 <<  4) // (SPI) 9 Bits Per transfer
+#define     AT91C_SPI_BITS_10                   ((unsigned int) 0x2 <<  4) // (SPI) 10 Bits Per transfer
+#define     AT91C_SPI_BITS_11                   ((unsigned int) 0x3 <<  4) // (SPI) 11 Bits Per transfer
+#define     AT91C_SPI_BITS_12                   ((unsigned int) 0x4 <<  4) // (SPI) 12 Bits Per transfer
+#define     AT91C_SPI_BITS_13                   ((unsigned int) 0x5 <<  4) // (SPI) 13 Bits Per transfer
+#define     AT91C_SPI_BITS_14                   ((unsigned int) 0x6 <<  4) // (SPI) 14 Bits Per transfer
+#define     AT91C_SPI_BITS_15                   ((unsigned int) 0x7 <<  4) // (SPI) 15 Bits Per transfer
+#define     AT91C_SPI_BITS_16                   ((unsigned int) 0x8 <<  4) // (SPI) 16 Bits Per transfer
+#define AT91C_SPI_SCBR        ((unsigned int) 0xFF <<  8) // (SPI) Serial Clock Baud Rate
+#define AT91C_SPI_DLYBS       ((unsigned int) 0xFF << 16) // (SPI) Serial Clock Baud Rate
+#define AT91C_SPI_DLYBCT      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor
+// *****************************************************************************
+typedef struct _AT91S_ADC {
+    AT91_REG     ADC_CR;    // ADC Control Register
+    AT91_REG     ADC_MR;    // ADC Mode Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     ADC_CHER;  // ADC Channel Enable Register
+    AT91_REG     ADC_CHDR;  // ADC Channel Disable Register
+    AT91_REG     ADC_CHSR;  // ADC Channel Status Register
+    AT91_REG     ADC_SR;    // ADC Status Register
+    AT91_REG     ADC_LCDR;  // ADC Last Converted Data Register
+    AT91_REG     ADC_IER;   // ADC Interrupt Enable Register
+    AT91_REG     ADC_IDR;   // ADC Interrupt Disable Register
+    AT91_REG     ADC_IMR;   // ADC Interrupt Mask Register
+    AT91_REG     ADC_CDR0;  // ADC Channel Data Register 0
+    AT91_REG     ADC_CDR1;  // ADC Channel Data Register 1
+    AT91_REG     ADC_CDR2;  // ADC Channel Data Register 2
+    AT91_REG     ADC_CDR3;  // ADC Channel Data Register 3
+    AT91_REG     ADC_CDR4;  // ADC Channel Data Register 4
+    AT91_REG     ADC_CDR5;  // ADC Channel Data Register 5
+    AT91_REG     ADC_CDR6;  // ADC Channel Data Register 6
+    AT91_REG     ADC_CDR7;  // ADC Channel Data Register 7
+    AT91_REG     Reserved1[44];     //
+    AT91_REG     ADC_RPR;   // Receive Pointer Register
+    AT91_REG     ADC_RCR;   // Receive Counter Register
+    AT91_REG     ADC_TPR;   // Transmit Pointer Register
+    AT91_REG     ADC_TCR;   // Transmit Counter Register
+    AT91_REG     ADC_RNPR;  // Receive Next Pointer Register
+    AT91_REG     ADC_RNCR;  // Receive Next Counter Register
+    AT91_REG     ADC_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     ADC_TNCR;  // Transmit Next Counter Register
+    AT91_REG     ADC_PTCR;  // PDC Transfer Control Register
+    AT91_REG     ADC_PTSR;  // PDC Transfer Status Register
+} AT91S_ADC, *AT91PS_ADC;
+
+// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register --------
+#define AT91C_ADC_SWRST       ((unsigned int) 0x1 <<  0) // (ADC) Software Reset
+#define AT91C_ADC_START       ((unsigned int) 0x1 <<  1) // (ADC) Start Conversion
+// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register --------
+#define AT91C_ADC_TRGEN       ((unsigned int) 0x1 <<  0) // (ADC) Trigger Enable
+#define     AT91C_ADC_TRGEN_DIS                  ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software
+#define     AT91C_ADC_TRGEN_EN                   ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.
+#define AT91C_ADC_TRGSEL      ((unsigned int) 0x7 <<  1) // (ADC) Trigger Selection
+#define     AT91C_ADC_TRGSEL_TIOA0                ((unsigned int) 0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0
+#define     AT91C_ADC_TRGSEL_TIOA1                ((unsigned int) 0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1
+#define     AT91C_ADC_TRGSEL_TIOA2                ((unsigned int) 0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2
+#define     AT91C_ADC_TRGSEL_TIOA3                ((unsigned int) 0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3
+#define     AT91C_ADC_TRGSEL_TIOA4                ((unsigned int) 0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4
+#define     AT91C_ADC_TRGSEL_TIOA5                ((unsigned int) 0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5
+#define     AT91C_ADC_TRGSEL_EXT                  ((unsigned int) 0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger
+#define AT91C_ADC_LOWRES      ((unsigned int) 0x1 <<  4) // (ADC) Resolution.
+#define     AT91C_ADC_LOWRES_10_BIT               ((unsigned int) 0x0 <<  4) // (ADC) 10-bit resolution
+#define     AT91C_ADC_LOWRES_8_BIT                ((unsigned int) 0x1 <<  4) // (ADC) 8-bit resolution
+#define AT91C_ADC_SLEEP       ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode
+#define     AT91C_ADC_SLEEP_NORMAL_MODE          ((unsigned int) 0x0 <<  5) // (ADC) Normal Mode
+#define     AT91C_ADC_SLEEP_MODE                 ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode
+#define AT91C_ADC_PRESCAL     ((unsigned int) 0x3F <<  8) // (ADC) Prescaler rate selection
+#define AT91C_ADC_STARTUP     ((unsigned int) 0x1F << 16) // (ADC) Startup Time
+#define AT91C_ADC_SHTIM       ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time
+// --------     ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register --------
+#define AT91C_ADC_CH0         ((unsigned int) 0x1 <<  0) // (ADC) Channel 0
+#define AT91C_ADC_CH1         ((unsigned int) 0x1 <<  1) // (ADC) Channel 1
+#define AT91C_ADC_CH2         ((unsigned int) 0x1 <<  2) // (ADC) Channel 2
+#define AT91C_ADC_CH3         ((unsigned int) 0x1 <<  3) // (ADC) Channel 3
+#define AT91C_ADC_CH4         ((unsigned int) 0x1 <<  4) // (ADC) Channel 4
+#define AT91C_ADC_CH5         ((unsigned int) 0x1 <<  5) // (ADC) Channel 5
+#define AT91C_ADC_CH6         ((unsigned int) 0x1 <<  6) // (ADC) Channel 6
+#define AT91C_ADC_CH7         ((unsigned int) 0x1 <<  7) // (ADC) Channel 7
+// --------     ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register --------
+// --------     ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register --------
+// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register --------
+#define AT91C_ADC_EOC0        ((unsigned int) 0x1 <<  0) // (ADC) End of Conversion
+#define AT91C_ADC_EOC1        ((unsigned int) 0x1 <<  1) // (ADC) End of Conversion
+#define AT91C_ADC_EOC2        ((unsigned int) 0x1 <<  2) // (ADC) End of Conversion
+#define AT91C_ADC_EOC3        ((unsigned int) 0x1 <<  3) // (ADC) End of Conversion
+#define AT91C_ADC_EOC4        ((unsigned int) 0x1 <<  4) // (ADC) End of Conversion
+#define AT91C_ADC_EOC5        ((unsigned int) 0x1 <<  5) // (ADC) End of Conversion
+#define AT91C_ADC_EOC6        ((unsigned int) 0x1 <<  6) // (ADC) End of Conversion
+#define AT91C_ADC_EOC7        ((unsigned int) 0x1 <<  7) // (ADC) End of Conversion
+#define AT91C_ADC_OVRE0       ((unsigned int) 0x1 <<  8) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE1       ((unsigned int) 0x1 <<  9) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE2       ((unsigned int) 0x1 << 10) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE3       ((unsigned int) 0x1 << 11) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE4       ((unsigned int) 0x1 << 12) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE5       ((unsigned int) 0x1 << 13) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE6       ((unsigned int) 0x1 << 14) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE7       ((unsigned int) 0x1 << 15) // (ADC) Overrun Error
+#define AT91C_ADC_DRDY        ((unsigned int) 0x1 << 16) // (ADC) Data Ready
+#define AT91C_ADC_GOVRE       ((unsigned int) 0x1 << 17) // (ADC) General Overrun
+#define AT91C_ADC_ENDRX       ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer
+#define AT91C_ADC_RXBUFF      ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt
+// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register --------
+#define AT91C_ADC_LDATA       ((unsigned int) 0x3FF <<  0) // (ADC) Last Data Converted
+// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register --------
+// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register --------
+// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register --------
+// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 --------
+#define AT91C_ADC_DATA        ((unsigned int) 0x3FF <<  0) // (ADC) Converted Data
+// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 --------
+// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 --------
+// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 --------
+// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 --------
+// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 --------
+// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 --------
+// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_SSC {
+    AT91_REG     SSC_CR;    // Control Register
+    AT91_REG     SSC_CMR;   // Clock Mode Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     SSC_RCMR;  // Receive Clock ModeRegister
+    AT91_REG     SSC_RFMR;  // Receive Frame Mode Register
+    AT91_REG     SSC_TCMR;  // Transmit Clock Mode Register
+    AT91_REG     SSC_TFMR;  // Transmit Frame Mode Register
+    AT91_REG     SSC_RHR;   // Receive Holding Register
+    AT91_REG     SSC_THR;   // Transmit Holding Register
+    AT91_REG     Reserved1[2];  //
+    AT91_REG     SSC_RSHR;  // Receive Sync Holding Register
+    AT91_REG     SSC_TSHR;  // Transmit Sync Holding Register
+    AT91_REG     SSC_RC0R;  // Receive Compare 0 Register
+    AT91_REG     SSC_RC1R;  // Receive Compare 1 Register
+    AT91_REG     SSC_SR;    // Status Register
+    AT91_REG     SSC_IER;   // Interrupt Enable Register
+    AT91_REG     SSC_IDR;   // Interrupt Disable Register
+    AT91_REG     SSC_IMR;   // Interrupt Mask Register
+    AT91_REG     Reserved2[44];     //
+    AT91_REG     SSC_RPR;   // Receive Pointer Register
+    AT91_REG     SSC_RCR;   // Receive Counter Register
+    AT91_REG     SSC_TPR;   // Transmit Pointer Register
+    AT91_REG     SSC_TCR;   // Transmit Counter Register
+    AT91_REG     SSC_RNPR;  // Receive Next Pointer Register
+    AT91_REG     SSC_RNCR;  // Receive Next Counter Register
+    AT91_REG     SSC_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     SSC_TNCR;  // Transmit Next Counter Register
+    AT91_REG     SSC_PTCR;  // PDC Transfer Control Register
+    AT91_REG     SSC_PTSR;  // PDC Transfer Status Register
+} AT91S_SSC, *AT91PS_SSC;
+
+// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register --------
+#define AT91C_SSC_RXEN        ((unsigned int) 0x1 <<  0) // (SSC) Receive Enable
+#define AT91C_SSC_RXDIS       ((unsigned int) 0x1 <<  1) // (SSC) Receive Disable
+#define AT91C_SSC_TXEN        ((unsigned int) 0x1 <<  8) // (SSC) Transmit Enable
+#define AT91C_SSC_TXDIS       ((unsigned int) 0x1 <<  9) // (SSC) Transmit Disable
+#define AT91C_SSC_SWRST       ((unsigned int) 0x1 << 15) // (SSC) Software Reset
+// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register --------
+#define AT91C_SSC_CKS         ((unsigned int) 0x3 <<  0) // (SSC) Receive/Transmit Clock Selection
+#define     AT91C_SSC_CKS_DIV                  ((unsigned int) 0x0) // (SSC) Divided Clock
+#define     AT91C_SSC_CKS_TK                   ((unsigned int) 0x1) // (SSC) TK Clock signal
+#define     AT91C_SSC_CKS_RK                   ((unsigned int) 0x2) // (SSC) RK pin
+#define AT91C_SSC_CKO         ((unsigned int) 0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection
+#define     AT91C_SSC_CKO_NONE                 ((unsigned int) 0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only
+#define     AT91C_SSC_CKO_CONTINOUS            ((unsigned int) 0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output
+#define     AT91C_SSC_CKO_DATA_TX              ((unsigned int) 0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output
+#define AT91C_SSC_CKI         ((unsigned int) 0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion
+#define AT91C_SSC_CKG         ((unsigned int) 0x3 <<  6) // (SSC) Receive/Transmit Clock Gating Selection
+#define     AT91C_SSC_CKG_NONE                 ((unsigned int) 0x0 <<  6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock
+#define     AT91C_SSC_CKG_LOW                  ((unsigned int) 0x1 <<  6) // (SSC) Receive/Transmit Clock enabled only if RF Low
+#define     AT91C_SSC_CKG_HIGH                 ((unsigned int) 0x2 <<  6) // (SSC) Receive/Transmit Clock enabled only if RF High
+#define AT91C_SSC_START       ((unsigned int) 0xF <<  8) // (SSC) Receive/Transmit Start Selection
+#define     AT91C_SSC_START_CONTINOUS            ((unsigned int) 0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.
+#define     AT91C_SSC_START_TX                   ((unsigned int) 0x1 <<  8) // (SSC) Transmit/Receive start
+#define     AT91C_SSC_START_LOW_RF               ((unsigned int) 0x2 <<  8) // (SSC) Detection of a low level on RF input
+#define     AT91C_SSC_START_HIGH_RF              ((unsigned int) 0x3 <<  8) // (SSC) Detection of a high level on RF input
+#define     AT91C_SSC_START_FALL_RF              ((unsigned int) 0x4 <<  8) // (SSC) Detection of a falling edge on RF input
+#define     AT91C_SSC_START_RISE_RF              ((unsigned int) 0x5 <<  8) // (SSC) Detection of a rising edge on RF input
+#define     AT91C_SSC_START_LEVEL_RF             ((unsigned int) 0x6 <<  8) // (SSC) Detection of any level change on RF input
+#define     AT91C_SSC_START_EDGE_RF              ((unsigned int) 0x7 <<  8) // (SSC) Detection of any edge on RF input
+#define     AT91C_SSC_START_0                    ((unsigned int) 0x8 <<  8) // (SSC) Compare 0
+#define AT91C_SSC_STOP        ((unsigned int) 0x1 << 12) // (SSC) Receive Stop Selection
+#define AT91C_SSC_STTOUT      ((unsigned int) 0x1 << 15) // (SSC) Receive/Transmit Start Output Selection
+#define AT91C_SSC_STTDLY      ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay
+#define AT91C_SSC_PERIOD      ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection
+// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register --------
+#define AT91C_SSC_DATLEN      ((unsigned int) 0x1F <<  0) // (SSC) Data Length
+#define AT91C_SSC_LOOP        ((unsigned int) 0x1 <<  5) // (SSC) Loop Mode
+#define AT91C_SSC_MSBF        ((unsigned int) 0x1 <<  7) // (SSC) Most Significant Bit First
+#define AT91C_SSC_DATNB       ((unsigned int) 0xF <<  8) // (SSC) Data Number per Frame
+#define AT91C_SSC_FSLEN       ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length
+#define AT91C_SSC_FSOS        ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection
+#define     AT91C_SSC_FSOS_NONE                 ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only
+#define     AT91C_SSC_FSOS_NEGATIVE             ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse
+#define     AT91C_SSC_FSOS_POSITIVE             ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse
+#define     AT91C_SSC_FSOS_LOW                  ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer
+#define     AT91C_SSC_FSOS_HIGH                 ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer
+#define     AT91C_SSC_FSOS_TOGGLE               ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer
+#define AT91C_SSC_FSEDGE      ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection
+// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register --------
+// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register --------
+#define AT91C_SSC_DATDEF      ((unsigned int) 0x1 <<  5) // (SSC) Data Default Value
+#define AT91C_SSC_FSDEN       ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable
+// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register --------
+#define AT91C_SSC_TXRDY       ((unsigned int) 0x1 <<  0) // (SSC) Transmit Ready
+#define AT91C_SSC_TXEMPTY     ((unsigned int) 0x1 <<  1) // (SSC) Transmit Empty
+#define AT91C_SSC_ENDTX       ((unsigned int) 0x1 <<  2) // (SSC) End Of Transmission
+#define AT91C_SSC_TXBUFE      ((unsigned int) 0x1 <<  3) // (SSC) Transmit Buffer Empty
+#define AT91C_SSC_RXRDY       ((unsigned int) 0x1 <<  4) // (SSC) Receive Ready
+#define AT91C_SSC_OVRUN       ((unsigned int) 0x1 <<  5) // (SSC) Receive Overrun
+#define AT91C_SSC_ENDRX       ((unsigned int) 0x1 <<  6) // (SSC) End of Reception
+#define AT91C_SSC_RXBUFF      ((unsigned int) 0x1 <<  7) // (SSC) Receive Buffer Full
+#define AT91C_SSC_CP0         ((unsigned int) 0x1 <<  8) // (SSC) Compare 0
+#define AT91C_SSC_CP1         ((unsigned int) 0x1 <<  9) // (SSC) Compare 1
+#define AT91C_SSC_TXSYN       ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync
+#define AT91C_SSC_RXSYN       ((unsigned int) 0x1 << 11) // (SSC) Receive Sync
+#define AT91C_SSC_TXENA       ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable
+#define AT91C_SSC_RXENA       ((unsigned int) 0x1 << 17) // (SSC) Receive Enable
+// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register --------
+// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register --------
+// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Usart
+// *****************************************************************************
+typedef struct _AT91S_USART {
+    AT91_REG     US_CR;     // Control Register
+    AT91_REG     US_MR;     // Mode Register
+    AT91_REG     US_IER;    // Interrupt Enable Register
+    AT91_REG     US_IDR;    // Interrupt Disable Register
+    AT91_REG     US_IMR;    // Interrupt Mask Register
+    AT91_REG     US_CSR;    // Channel Status Register
+    AT91_REG     US_RHR;    // Receiver Holding Register
+    AT91_REG     US_THR;    // Transmitter Holding Register
+    AT91_REG     US_BRGR;   // Baud Rate Generator Register
+    AT91_REG     US_RTOR;   // Receiver Time-out Register
+    AT91_REG     US_TTGR;   // Transmitter Time-guard Register
+    AT91_REG     Reserved0[5];  //
+    AT91_REG     US_FIDI;   // FI_DI_Ratio Register
+    AT91_REG     US_NER;    // Nb Errors Register
+    AT91_REG     US_XXR;    // XON_XOFF Register
+    AT91_REG     US_IF;     // IRDA_FILTER Register
+    AT91_REG     Reserved1[44];     //
+    AT91_REG     US_RPR;    // Receive Pointer Register
+    AT91_REG     US_RCR;    // Receive Counter Register
+    AT91_REG     US_TPR;    // Transmit Pointer Register
+    AT91_REG     US_TCR;    // Transmit Counter Register
+    AT91_REG     US_RNPR;   // Receive Next Pointer Register
+    AT91_REG     US_RNCR;   // Receive Next Counter Register
+    AT91_REG     US_TNPR;   // Transmit Next Pointer Register
+    AT91_REG     US_TNCR;   // Transmit Next Counter Register
+    AT91_REG     US_PTCR;   // PDC Transfer Control Register
+    AT91_REG     US_PTSR;   // PDC Transfer Status Register
+} AT91S_USART, *AT91PS_USART;
+
+// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_RSTSTA       ((unsigned int) 0x1 <<  8) // (USART) Reset Status Bits
+#define AT91C_US_STTBRK       ((unsigned int) 0x1 <<  9) // (USART) Start Break
+#define AT91C_US_STPBRK       ((unsigned int) 0x1 << 10) // (USART) Stop Break
+#define AT91C_US_STTTO        ((unsigned int) 0x1 << 11) // (USART) Start Time-out
+#define AT91C_US_SENDA        ((unsigned int) 0x1 << 12) // (USART) Send Address
+#define AT91C_US_RSTIT        ((unsigned int) 0x1 << 13) // (USART) Reset Iterations
+#define AT91C_US_RSTNACK      ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge
+#define AT91C_US_RETTO        ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out
+#define AT91C_US_DTREN        ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable
+#define AT91C_US_DTRDIS       ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable
+#define AT91C_US_RTSEN        ((unsigned int) 0x1 << 18) // (USART) Request to Send enable
+#define AT91C_US_RTSDIS       ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable
+// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_USMODE       ((unsigned int) 0xF <<  0) // (USART) Usart mode
+#define     AT91C_US_USMODE_NORMAL               ((unsigned int) 0x0) // (USART) Normal
+#define     AT91C_US_USMODE_RS485                ((unsigned int) 0x1) // (USART) RS485
+#define     AT91C_US_USMODE_HWHSH                ((unsigned int) 0x2) // (USART) Hardware Handshaking
+#define     AT91C_US_USMODE_MODEM                ((unsigned int) 0x3) // (USART) Modem
+#define     AT91C_US_USMODE_ISO7816_0            ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0
+#define     AT91C_US_USMODE_ISO7816_1            ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1
+#define     AT91C_US_USMODE_IRDA                 ((unsigned int) 0x8) // (USART) IrDA
+#define     AT91C_US_USMODE_SWHSH                ((unsigned int) 0xC) // (USART) Software Handshaking
+#define AT91C_US_CLKS         ((unsigned int) 0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CLKS_CLOCK                ((unsigned int) 0x0 <<  4) // (USART) Clock
+#define     AT91C_US_CLKS_FDIV1                ((unsigned int) 0x1 <<  4) // (USART) fdiv1
+#define     AT91C_US_CLKS_SLOW                 ((unsigned int) 0x2 <<  4) // (USART) slow_clock (ARM)
+#define     AT91C_US_CLKS_EXT                  ((unsigned int) 0x3 <<  4) // (USART) External (SCK)
+#define AT91C_US_CHRL         ((unsigned int) 0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CHRL_5_BITS               ((unsigned int) 0x0 <<  6) // (USART) Character Length: 5 bits
+#define     AT91C_US_CHRL_6_BITS               ((unsigned int) 0x1 <<  6) // (USART) Character Length: 6 bits
+#define     AT91C_US_CHRL_7_BITS               ((unsigned int) 0x2 <<  6) // (USART) Character Length: 7 bits
+#define     AT91C_US_CHRL_8_BITS               ((unsigned int) 0x3 <<  6) // (USART) Character Length: 8 bits
+#define AT91C_US_SYNC         ((unsigned int) 0x1 <<  8) // (USART) Synchronous Mode Select
+#define AT91C_US_NBSTOP       ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits
+#define     AT91C_US_NBSTOP_1_BIT                ((unsigned int) 0x0 << 12) // (USART) 1 stop bit
+#define     AT91C_US_NBSTOP_15_BIT               ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits
+#define     AT91C_US_NBSTOP_2_BIT                ((unsigned int) 0x2 << 12) // (USART) 2 stop bits
+#define AT91C_US_MSBF         ((unsigned int) 0x1 << 16) // (USART) Bit Order
+#define AT91C_US_MODE9        ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length
+#define AT91C_US_CKLO         ((unsigned int) 0x1 << 18) // (USART) Clock Output Select
+#define AT91C_US_OVER         ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode
+#define AT91C_US_INACK        ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge
+#define AT91C_US_DSNACK       ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK
+#define AT91C_US_MAX_ITER     ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions
+#define AT91C_US_FILTER       ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter
+// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXBRK        ((unsigned int) 0x1 <<  2) // (USART) Break Received/End of Break
+#define AT91C_US_TIMEOUT      ((unsigned int) 0x1 <<  8) // (USART) Receiver Time-out
+#define AT91C_US_ITERATION    ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached
+#define AT91C_US_NACK         ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge
+#define AT91C_US_RIIC         ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag
+#define AT91C_US_DSRIC        ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag
+#define AT91C_US_DCDIC        ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag
+#define AT91C_US_CTSIC        ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag
+// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register --------
+#define AT91C_US_RI           ((unsigned int) 0x1 << 20) // (USART) Image of RI Input
+#define AT91C_US_DSR          ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input
+#define AT91C_US_DCD          ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input
+#define AT91C_US_CTS          ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Two-wire Interface
+// *****************************************************************************
+typedef struct _AT91S_TWI {
+    AT91_REG     TWI_CR;    // Control Register
+    AT91_REG     TWI_MMR;   // Master Mode Register
+    AT91_REG     TWI_SMR;   // Slave Mode Register
+    AT91_REG     TWI_IADR;  // Internal Address Register
+    AT91_REG     TWI_CWGR;  // Clock Waveform Generator Register
+    AT91_REG     Reserved0[3];  //
+    AT91_REG     TWI_SR;    // Status Register
+    AT91_REG     TWI_IER;   // Interrupt Enable Register
+    AT91_REG     TWI_IDR;   // Interrupt Disable Register
+    AT91_REG     TWI_IMR;   // Interrupt Mask Register
+    AT91_REG     TWI_RHR;   // Receive Holding Register
+    AT91_REG     TWI_THR;   // Transmit Holding Register
+} AT91S_TWI, *AT91PS_TWI;
+
+// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register --------
+#define AT91C_TWI_START       ((unsigned int) 0x1 <<  0) // (TWI) Send a START Condition
+#define AT91C_TWI_STOP        ((unsigned int) 0x1 <<  1) // (TWI) Send a STOP Condition
+#define AT91C_TWI_MSEN        ((unsigned int) 0x1 <<  2) // (TWI) TWI Master Transfer Enabled
+#define AT91C_TWI_MSDIS       ((unsigned int) 0x1 <<  3) // (TWI) TWI Master Transfer Disabled
+#define AT91C_TWI_SVEN        ((unsigned int) 0x1 <<  4) // (TWI) TWI Slave Transfer Enabled
+#define AT91C_TWI_SVDIS       ((unsigned int) 0x1 <<  5) // (TWI) TWI Slave Transfer Disabled
+#define AT91C_TWI_SWRST       ((unsigned int) 0x1 <<  7) // (TWI) Software Reset
+// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register --------
+#define AT91C_TWI_IADRSZ      ((unsigned int) 0x3 <<  8) // (TWI) Internal Device Address Size
+#define     AT91C_TWI_IADRSZ_NO                   ((unsigned int) 0x0 <<  8) // (TWI) No internal device address
+#define     AT91C_TWI_IADRSZ_1_BYTE               ((unsigned int) 0x1 <<  8) // (TWI) One-byte internal device address
+#define     AT91C_TWI_IADRSZ_2_BYTE               ((unsigned int) 0x2 <<  8) // (TWI) Two-byte internal device address
+#define     AT91C_TWI_IADRSZ_3_BYTE               ((unsigned int) 0x3 <<  8) // (TWI) Three-byte internal device address
+#define AT91C_TWI_MREAD       ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction
+#define AT91C_TWI_DADR        ((unsigned int) 0x7F << 16) // (TWI) Device Address
+// -------- TWI_SMR : (TWI Offset: 0x8) TWI Slave Mode Register --------
+#define AT91C_TWI_SADR        ((unsigned int) 0x7F << 16) // (TWI) Slave Device Address
+// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register --------
+#define AT91C_TWI_CLDIV       ((unsigned int) 0xFF <<  0) // (TWI) Clock Low Divider
+#define AT91C_TWI_CHDIV       ((unsigned int) 0xFF <<  8) // (TWI) Clock High Divider
+#define AT91C_TWI_CKDIV       ((unsigned int) 0x7 << 16) // (TWI) Clock Divider
+// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register --------
+#define AT91C_TWI_TXCOMP      ((unsigned int) 0x1 <<  0) // (TWI) Transmission Completed
+#define AT91C_TWI_RXRDY       ((unsigned int) 0x1 <<  1) // (TWI) Receive holding register ReaDY
+#define AT91C_TWI_TXRDY       ((unsigned int) 0x1 <<  2) // (TWI) Transmit holding register ReaDY
+#define AT91C_TWI_SVREAD      ((unsigned int) 0x1 <<  3) // (TWI) Slave Read
+#define AT91C_TWI_SVACC       ((unsigned int) 0x1 <<  4) // (TWI) Slave Access
+#define AT91C_TWI_GCACC       ((unsigned int) 0x1 <<  5) // (TWI) General Call Access
+#define AT91C_TWI_OVRE        ((unsigned int) 0x1 <<  6) // (TWI) Overrun Error
+#define AT91C_TWI_UNRE        ((unsigned int) 0x1 <<  7) // (TWI) Underrun Error
+#define AT91C_TWI_NACK        ((unsigned int) 0x1 <<  8) // (TWI) Not Acknowledged
+#define AT91C_TWI_ARBLST      ((unsigned int) 0x1 <<  9) // (TWI) Arbitration Lost
+// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register --------
+// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register --------
+// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface
+// *****************************************************************************
+typedef struct _AT91S_TC {
+    AT91_REG     TC_CCR;    // Channel Control Register
+    AT91_REG     TC_CMR;    // Channel Mode Register (Capture Mode / Waveform Mode)
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     TC_CV;     // Counter Value
+    AT91_REG     TC_RA;     // Register A
+    AT91_REG     TC_RB;     // Register B
+    AT91_REG     TC_RC;     // Register C
+    AT91_REG     TC_SR;     // Status Register
+    AT91_REG     TC_IER;    // Interrupt Enable Register
+    AT91_REG     TC_IDR;    // Interrupt Disable Register
+    AT91_REG     TC_IMR;    // Interrupt Mask Register
+} AT91S_TC, *AT91PS_TC;
+
+// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register --------
+#define AT91C_TC_CLKEN        ((unsigned int) 0x1 <<  0) // (TC) Counter Clock Enable Command
+#define AT91C_TC_CLKDIS       ((unsigned int) 0x1 <<  1) // (TC) Counter Clock Disable Command
+#define AT91C_TC_SWTRG        ((unsigned int) 0x1 <<  2) // (TC) Software Trigger Command
+// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode --------
+#define AT91C_TC_CLKS         ((unsigned int) 0x7 <<  0) // (TC) Clock Selection
+#define     AT91C_TC_CLKS_TIMER_DIV1_CLOCK     ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV2_CLOCK     ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV3_CLOCK     ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV4_CLOCK     ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV5_CLOCK     ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK
+#define     AT91C_TC_CLKS_XC0                  ((unsigned int) 0x5) // (TC) Clock selected: XC0
+#define     AT91C_TC_CLKS_XC1                  ((unsigned int) 0x6) // (TC) Clock selected: XC1
+#define     AT91C_TC_CLKS_XC2                  ((unsigned int) 0x7) // (TC) Clock selected: XC2
+#define AT91C_TC_CLKI         ((unsigned int) 0x1 <<  3) // (TC) Clock Invert
+#define AT91C_TC_BURST        ((unsigned int) 0x3 <<  4) // (TC) Burst Signal Selection
+#define     AT91C_TC_BURST_NONE                 ((unsigned int) 0x0 <<  4) // (TC) The clock is not gated by an external signal
+#define     AT91C_TC_BURST_XC0                  ((unsigned int) 0x1 <<  4) // (TC) XC0 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC1                  ((unsigned int) 0x2 <<  4) // (TC) XC1 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC2                  ((unsigned int) 0x3 <<  4) // (TC) XC2 is ANDed with the selected clock
+#define AT91C_TC_CPCSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare
+#define AT91C_TC_LDBSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading
+#define AT91C_TC_LDBDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading
+#define AT91C_TC_CPCDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disable with RC Compare
+#define AT91C_TC_ETRGEDG      ((unsigned int) 0x3 <<  8) // (TC) External Trigger Edge Selection
+#define     AT91C_TC_ETRGEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_ETRGEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_ETRGEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_ETRGEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_EEVTEDG      ((unsigned int) 0x3 <<  8) // (TC) External Event Edge Selection
+#define     AT91C_TC_EEVTEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_EEVTEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_EEVTEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_EEVTEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_ABETRG       ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection
+#define AT91C_TC_EEVT         ((unsigned int) 0x3 << 10) // (TC) External Event  Selection
+#define     AT91C_TC_EEVT_NONE                 ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input
+#define     AT91C_TC_EEVT_RISING               ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output
+#define     AT91C_TC_EEVT_FALLING              ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output
+#define     AT91C_TC_EEVT_BOTH                 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output
+#define AT91C_TC_ENETRG       ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable
+#define AT91C_TC_WAVESEL      ((unsigned int) 0x3 << 13) // (TC) Waveform  Selection
+#define     AT91C_TC_WAVESEL_UP                   ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN               ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UP_AUTO              ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN_AUTO          ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare
+#define AT91C_TC_CPCTRG       ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable
+#define AT91C_TC_WAVE         ((unsigned int) 0x1 << 15) // (TC)
+#define AT91C_TC_LDRA         ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection
+#define     AT91C_TC_LDRA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Edge: None
+#define     AT91C_TC_LDRA_RISING               ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRA_FALLING              ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRA_BOTH                 ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_ACPA         ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA
+#define     AT91C_TC_ACPA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Effect: none
+#define     AT91C_TC_ACPA_SET                  ((unsigned int) 0x1 << 16) // (TC) Effect: set
+#define     AT91C_TC_ACPA_CLEAR                ((unsigned int) 0x2 << 16) // (TC) Effect: clear
+#define     AT91C_TC_ACPA_TOGGLE               ((unsigned int) 0x3 << 16) // (TC) Effect: toggle
+#define AT91C_TC_LDRB         ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection
+#define     AT91C_TC_LDRB_NONE                 ((unsigned int) 0x0 << 18) // (TC) Edge: None
+#define     AT91C_TC_LDRB_RISING               ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRB_FALLING              ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRB_BOTH                 ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_ACPC         ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA
+#define     AT91C_TC_ACPC_NONE                 ((unsigned int) 0x0 << 18) // (TC) Effect: none
+#define     AT91C_TC_ACPC_SET                  ((unsigned int) 0x1 << 18) // (TC) Effect: set
+#define     AT91C_TC_ACPC_CLEAR                ((unsigned int) 0x2 << 18) // (TC) Effect: clear
+#define     AT91C_TC_ACPC_TOGGLE               ((unsigned int) 0x3 << 18) // (TC) Effect: toggle
+#define AT91C_TC_AEEVT        ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA
+#define     AT91C_TC_AEEVT_NONE                 ((unsigned int) 0x0 << 20) // (TC) Effect: none
+#define     AT91C_TC_AEEVT_SET                  ((unsigned int) 0x1 << 20) // (TC) Effect: set
+#define     AT91C_TC_AEEVT_CLEAR                ((unsigned int) 0x2 << 20) // (TC) Effect: clear
+#define     AT91C_TC_AEEVT_TOGGLE               ((unsigned int) 0x3 << 20) // (TC) Effect: toggle
+#define AT91C_TC_ASWTRG       ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA
+#define     AT91C_TC_ASWTRG_NONE                 ((unsigned int) 0x0 << 22) // (TC) Effect: none
+#define     AT91C_TC_ASWTRG_SET                  ((unsigned int) 0x1 << 22) // (TC) Effect: set
+#define     AT91C_TC_ASWTRG_CLEAR                ((unsigned int) 0x2 << 22) // (TC) Effect: clear
+#define     AT91C_TC_ASWTRG_TOGGLE               ((unsigned int) 0x3 << 22) // (TC) Effect: toggle
+#define AT91C_TC_BCPB         ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB
+#define     AT91C_TC_BCPB_NONE                 ((unsigned int) 0x0 << 24) // (TC) Effect: none
+#define     AT91C_TC_BCPB_SET                  ((unsigned int) 0x1 << 24) // (TC) Effect: set
+#define     AT91C_TC_BCPB_CLEAR                ((unsigned int) 0x2 << 24) // (TC) Effect: clear
+#define     AT91C_TC_BCPB_TOGGLE               ((unsigned int) 0x3 << 24) // (TC) Effect: toggle
+#define AT91C_TC_BCPC         ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB
+#define     AT91C_TC_BCPC_NONE                 ((unsigned int) 0x0 << 26) // (TC) Effect: none
+#define     AT91C_TC_BCPC_SET                  ((unsigned int) 0x1 << 26) // (TC) Effect: set
+#define     AT91C_TC_BCPC_CLEAR                ((unsigned int) 0x2 << 26) // (TC) Effect: clear
+#define     AT91C_TC_BCPC_TOGGLE               ((unsigned int) 0x3 << 26) // (TC) Effect: toggle
+#define AT91C_TC_BEEVT        ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB
+#define     AT91C_TC_BEEVT_NONE                 ((unsigned int) 0x0 << 28) // (TC) Effect: none
+#define     AT91C_TC_BEEVT_SET                  ((unsigned int) 0x1 << 28) // (TC) Effect: set
+#define     AT91C_TC_BEEVT_CLEAR                ((unsigned int) 0x2 << 28) // (TC) Effect: clear
+#define     AT91C_TC_BEEVT_TOGGLE               ((unsigned int) 0x3 << 28) // (TC) Effect: toggle
+#define AT91C_TC_BSWTRG       ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB
+#define     AT91C_TC_BSWTRG_NONE                 ((unsigned int) 0x0 << 30) // (TC) Effect: none
+#define     AT91C_TC_BSWTRG_SET                  ((unsigned int) 0x1 << 30) // (TC) Effect: set
+#define     AT91C_TC_BSWTRG_CLEAR                ((unsigned int) 0x2 << 30) // (TC) Effect: clear
+#define     AT91C_TC_BSWTRG_TOGGLE               ((unsigned int) 0x3 << 30) // (TC) Effect: toggle
+// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register --------
+#define AT91C_TC_COVFS        ((unsigned int) 0x1 <<  0) // (TC) Counter Overflow
+#define AT91C_TC_LOVRS        ((unsigned int) 0x1 <<  1) // (TC) Load Overrun
+#define AT91C_TC_CPAS         ((unsigned int) 0x1 <<  2) // (TC) RA Compare
+#define AT91C_TC_CPBS         ((unsigned int) 0x1 <<  3) // (TC) RB Compare
+#define AT91C_TC_CPCS         ((unsigned int) 0x1 <<  4) // (TC) RC Compare
+#define AT91C_TC_LDRAS        ((unsigned int) 0x1 <<  5) // (TC) RA Loading
+#define AT91C_TC_LDRBS        ((unsigned int) 0x1 <<  6) // (TC) RB Loading
+#define AT91C_TC_ETRCS        ((unsigned int) 0x1 <<  7) // (TC) External Trigger
+#define AT91C_TC_ETRGS        ((unsigned int) 0x1 << 16) // (TC) Clock Enabling
+#define AT91C_TC_MTIOA        ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror
+#define AT91C_TC_MTIOB        ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror
+// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register --------
+// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register --------
+// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Interface
+// *****************************************************************************
+typedef struct _AT91S_TCB {
+    AT91S_TC     TCB_TC0;   // TC Channel 0
+    AT91_REG     Reserved0[4];  //
+    AT91S_TC     TCB_TC1;   // TC Channel 1
+    AT91_REG     Reserved1[4];  //
+    AT91S_TC     TCB_TC2;   // TC Channel 2
+    AT91_REG     Reserved2[4];  //
+    AT91_REG     TCB_BCR;   // TC Block Control Register
+    AT91_REG     TCB_BMR;   // TC Block Mode Register
+} AT91S_TCB, *AT91PS_TCB;
+
+// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register --------
+#define AT91C_TCB_SYNC        ((unsigned int) 0x1 <<  0) // (TCB) Synchro Command
+// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register --------
+#define AT91C_TCB_TC0XC0S     ((unsigned int) 0x1 <<  0) // (TCB) External Clock Signal 0 Selection
+#define     AT91C_TCB_TC0XC0S_TCLK0                ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0
+#define     AT91C_TCB_TC0XC0S_NONE                 ((unsigned int) 0x1) // (TCB) None signal connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA1                ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA2                ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0
+#define AT91C_TCB_TC1XC1S     ((unsigned int) 0x1 <<  2) // (TCB) External Clock Signal 1 Selection
+#define     AT91C_TCB_TC1XC1S_TCLK1                ((unsigned int) 0x0 <<  2) // (TCB) TCLK1 connected to XC1
+#define     AT91C_TCB_TC1XC1S_NONE                 ((unsigned int) 0x1 <<  2) // (TCB) None signal connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA0                ((unsigned int) 0x2 <<  2) // (TCB) TIOA0 connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA2                ((unsigned int) 0x3 <<  2) // (TCB) TIOA2 connected to XC1
+#define AT91C_TCB_TC2XC2S     ((unsigned int) 0x1 <<  4) // (TCB) External Clock Signal 2 Selection
+#define     AT91C_TCB_TC2XC2S_TCLK2                ((unsigned int) 0x0 <<  4) // (TCB) TCLK2 connected to XC2
+#define     AT91C_TCB_TC2XC2S_NONE                 ((unsigned int) 0x1 <<  4) // (TCB) None signal connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA0                ((unsigned int) 0x2 <<  4) // (TCB) TIOA0 connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA2                ((unsigned int) 0x3 <<  4) // (TCB) TIOA2 connected to XC2
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface
+// *****************************************************************************
+typedef struct _AT91S_PWMC_CH {
+    AT91_REG     PWMC_CMR;  // Channel Mode Register
+    AT91_REG     PWMC_CDTYR;    // Channel Duty Cycle Register
+    AT91_REG     PWMC_CPRDR;    // Channel Period Register
+    AT91_REG     PWMC_CCNTR;    // Channel Counter Register
+    AT91_REG     PWMC_CUPDR;    // Channel Update Register
+    AT91_REG     PWMC_Reserved[3];  // Reserved
+} AT91S_PWMC_CH, *AT91PS_PWMC_CH;
+
+// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register --------
+#define AT91C_PWMC_CPRE       ((unsigned int) 0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx
+#define     AT91C_PWMC_CPRE_MCK                  ((unsigned int) 0x0) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKA                 ((unsigned int) 0xB) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKB                 ((unsigned int) 0xC) // (PWMC_CH)
+#define AT91C_PWMC_CALG       ((unsigned int) 0x1 <<  8) // (PWMC_CH) Channel Alignment
+#define AT91C_PWMC_CPOL       ((unsigned int) 0x1 <<  9) // (PWMC_CH) Channel Polarity
+#define AT91C_PWMC_CPD        ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period
+// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register --------
+#define AT91C_PWMC_CDTY       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Duty Cycle
+// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register --------
+#define AT91C_PWMC_CPRD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Period
+// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register --------
+#define AT91C_PWMC_CCNT       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Counter
+// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register --------
+#define AT91C_PWMC_CUPD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Update
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_PWMC {
+    AT91_REG     PWMC_MR;   // PWMC Mode Register
+    AT91_REG     PWMC_ENA;  // PWMC Enable Register
+    AT91_REG     PWMC_DIS;  // PWMC Disable Register
+    AT91_REG     PWMC_SR;   // PWMC Status Register
+    AT91_REG     PWMC_IER;  // PWMC Interrupt Enable Register
+    AT91_REG     PWMC_IDR;  // PWMC Interrupt Disable Register
+    AT91_REG     PWMC_IMR;  // PWMC Interrupt Mask Register
+    AT91_REG     PWMC_ISR;  // PWMC Interrupt Status Register
+    AT91_REG     Reserved0[55];     //
+    AT91_REG     PWMC_VR;   // PWMC Version Register
+    AT91_REG     Reserved1[64];     //
+    AT91S_PWMC_CH    PWMC_CH[32];   // PWMC Channel 0
+} AT91S_PWMC, *AT91PS_PWMC;
+
+// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register --------
+#define AT91C_PWMC_DIVA       ((unsigned int) 0xFF <<  0) // (PWMC) CLKA divide factor.
+#define AT91C_PWMC_PREA       ((unsigned int) 0xF <<  8) // (PWMC) Divider Input Clock Prescaler A
+#define     AT91C_PWMC_PREA_MCK                  ((unsigned int) 0x0 <<  8) // (PWMC)
+#define AT91C_PWMC_DIVB       ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor.
+#define AT91C_PWMC_PREB       ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B
+#define     AT91C_PWMC_PREB_MCK                  ((unsigned int) 0x0 << 24) // (PWMC)
+// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register --------
+#define AT91C_PWMC_CHID0      ((unsigned int) 0x1 <<  0) // (PWMC) Channel ID 0
+#define AT91C_PWMC_CHID1      ((unsigned int) 0x1 <<  1) // (PWMC) Channel ID 1
+#define AT91C_PWMC_CHID2      ((unsigned int) 0x1 <<  2) // (PWMC) Channel ID 2
+#define AT91C_PWMC_CHID3      ((unsigned int) 0x1 <<  3) // (PWMC) Channel ID 3
+#define AT91C_PWMC_CHID4      ((unsigned int) 0x1 <<  4) // (PWMC) Channel ID 4
+#define AT91C_PWMC_CHID5      ((unsigned int) 0x1 <<  5) // (PWMC) Channel ID 5
+#define AT91C_PWMC_CHID6      ((unsigned int) 0x1 <<  6) // (PWMC) Channel ID 6
+#define AT91C_PWMC_CHID7      ((unsigned int) 0x1 <<  7) // (PWMC) Channel ID 7
+// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register --------
+// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register --------
+// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register --------
+// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register --------
+// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register --------
+// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR USB Device Interface
+// *****************************************************************************
+typedef struct _AT91S_UDP {
+    AT91_REG     UDP_NUM;   // Frame Number Register
+    AT91_REG     UDP_GLBSTATE;  // Global State Register
+    AT91_REG     UDP_FADDR;     // Function Address Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     UDP_IER;   // Interrupt Enable Register
+    AT91_REG     UDP_IDR;   // Interrupt Disable Register
+    AT91_REG     UDP_IMR;   // Interrupt Mask Register
+    AT91_REG     UDP_ISR;   // Interrupt Status Register
+    AT91_REG     UDP_ICR;   // Interrupt Clear Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     UDP_RSTEP;     // Reset Endpoint Register
+    AT91_REG     Reserved2[1];  //
+    AT91_REG     UDP_CSR[8];    // Endpoint Control and Status Register
+    AT91_REG     UDP_FDR[8];    // Endpoint FIFO Data Register
+} AT91S_UDP, *AT91PS_UDP;
+
+// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register --------
+#define AT91C_UDP_FRM_NUM     ((unsigned int) 0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats
+#define AT91C_UDP_FRM_ERR     ((unsigned int) 0x1 << 16) // (UDP) Frame Error
+#define AT91C_UDP_FRM_OK      ((unsigned int) 0x1 << 17) // (UDP) Frame OK
+// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register --------
+#define AT91C_UDP_FADDEN      ((unsigned int) 0x1 <<  0) // (UDP) Function Address Enable
+#define AT91C_UDP_CONFG       ((unsigned int) 0x1 <<  1) // (UDP) Configured
+#define AT91C_UDP_RMWUPE      ((unsigned int) 0x1 <<  2) // (UDP) Remote Wake Up Enable
+#define AT91C_UDP_RSMINPR     ((unsigned int) 0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host
+// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register --------
+#define AT91C_UDP_FADD        ((unsigned int) 0xFF <<  0) // (UDP) Function Address Value
+#define AT91C_UDP_FEN         ((unsigned int) 0x1 <<  8) // (UDP) Function Enable
+// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register --------
+#define AT91C_UDP_EPINT0      ((unsigned int) 0x1 <<  0) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT1      ((unsigned int) 0x1 <<  1) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT2      ((unsigned int) 0x1 <<  2) // (UDP) Endpoint 2 Interrupt
+#define AT91C_UDP_EPINT3      ((unsigned int) 0x1 <<  3) // (UDP) Endpoint 3 Interrupt
+#define AT91C_UDP_EPINT4      ((unsigned int) 0x1 <<  4) // (UDP) Endpoint 4 Interrupt
+#define AT91C_UDP_EPINT5      ((unsigned int) 0x1 <<  5) // (UDP) Endpoint 5 Interrupt
+#define AT91C_UDP_EPINT6      ((unsigned int) 0x1 <<  6) // (UDP) Endpoint 6 Interrupt
+#define AT91C_UDP_EPINT7      ((unsigned int) 0x1 <<  7) // (UDP) Endpoint 7 Interrupt
+#define AT91C_UDP_RXSUSP      ((unsigned int) 0x1 <<  8) // (UDP) USB Suspend Interrupt
+#define AT91C_UDP_RXRSM       ((unsigned int) 0x1 <<  9) // (UDP) USB Resume Interrupt
+#define AT91C_UDP_EXTRSM      ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt
+#define AT91C_UDP_SOFINT      ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt
+#define AT91C_UDP_WAKEUP      ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt
+// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register --------
+// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register --------
+// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register --------
+#define AT91C_UDP_ENDBUSRES   ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt
+// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register --------
+// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register --------
+#define AT91C_UDP_EP0         ((unsigned int) 0x1 <<  0) // (UDP) Reset Endpoint 0
+#define AT91C_UDP_EP1         ((unsigned int) 0x1 <<  1) // (UDP) Reset Endpoint 1
+#define AT91C_UDP_EP2         ((unsigned int) 0x1 <<  2) // (UDP) Reset Endpoint 2
+#define AT91C_UDP_EP3         ((unsigned int) 0x1 <<  3) // (UDP) Reset Endpoint 3
+#define AT91C_UDP_EP4         ((unsigned int) 0x1 <<  4) // (UDP) Reset Endpoint 4
+#define AT91C_UDP_EP5         ((unsigned int) 0x1 <<  5) // (UDP) Reset Endpoint 5
+#define AT91C_UDP_EP6         ((unsigned int) 0x1 <<  6) // (UDP) Reset Endpoint 6
+#define AT91C_UDP_EP7         ((unsigned int) 0x1 <<  7) // (UDP) Reset Endpoint 7
+// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register --------
+#define AT91C_UDP_TXCOMP      ((unsigned int) 0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR
+#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 <<  1) // (UDP) Receive Data Bank 0
+#define AT91C_UDP_RXSETUP     ((unsigned int) 0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)
+#define AT91C_UDP_ISOERROR    ((unsigned int) 0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)
+#define AT91C_UDP_TXPKTRDY    ((unsigned int) 0x1 <<  4) // (UDP) Transmit Packet Ready
+#define AT91C_UDP_FORCESTALL  ((unsigned int) 0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).
+#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).
+#define AT91C_UDP_DIR         ((unsigned int) 0x1 <<  7) // (UDP) Transfer Direction
+#define AT91C_UDP_EPTYPE      ((unsigned int) 0x7 <<  8) // (UDP) Endpoint type
+#define     AT91C_UDP_EPTYPE_CTRL                 ((unsigned int) 0x0 <<  8) // (UDP) Control
+#define     AT91C_UDP_EPTYPE_ISO_OUT              ((unsigned int) 0x1 <<  8) // (UDP) Isochronous OUT
+#define     AT91C_UDP_EPTYPE_BULK_OUT             ((unsigned int) 0x2 <<  8) // (UDP) Bulk OUT
+#define     AT91C_UDP_EPTYPE_INT_OUT              ((unsigned int) 0x3 <<  8) // (UDP) Interrupt OUT
+#define     AT91C_UDP_EPTYPE_ISO_IN               ((unsigned int) 0x5 <<  8) // (UDP) Isochronous IN
+#define     AT91C_UDP_EPTYPE_BULK_IN              ((unsigned int) 0x6 <<  8) // (UDP) Bulk IN
+#define     AT91C_UDP_EPTYPE_INT_IN               ((unsigned int) 0x7 <<  8) // (UDP) Interrupt IN
+#define AT91C_UDP_DTGLE       ((unsigned int) 0x1 << 11) // (UDP) Data Toggle
+#define AT91C_UDP_EPEDS       ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable
+#define AT91C_UDP_RXBYTECNT   ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO
+
+// *****************************************************************************
+//               REGISTER ADDRESS DEFINITION FOR AT91SAM7S64
+// *****************************************************************************
+// ========== Register definition for SYSC peripheral ==========
+#define AT91C_SYSC_SYSC_VRPM ((AT91_REG *)  0xFFFFFD60) // (SYSC) Voltage Regulator Power Mode Register
+// ========== Register definition for AIC peripheral ==========
+#define AT91C_AIC_ICCR  ((AT91_REG *)   0xFFFFF128) // (AIC) Interrupt Clear Command Register
+#define AT91C_AIC_IECR  ((AT91_REG *)   0xFFFFF120) // (AIC) Interrupt Enable Command Register
+#define AT91C_AIC_SMR   ((AT91_REG *)   0xFFFFF000) // (AIC) Source Mode Register
+#define AT91C_AIC_ISCR  ((AT91_REG *)   0xFFFFF12C) // (AIC) Interrupt Set Command Register
+#define AT91C_AIC_EOICR ((AT91_REG *)   0xFFFFF130) // (AIC) End of Interrupt Command Register
+#define AT91C_AIC_DCR   ((AT91_REG *)   0xFFFFF138) // (AIC) Debug Control Register (Protect)
+#define AT91C_AIC_FFER  ((AT91_REG *)   0xFFFFF140) // (AIC) Fast Forcing Enable Register
+#define AT91C_AIC_SVR   ((AT91_REG *)   0xFFFFF080) // (AIC) Source Vector Register
+#define AT91C_AIC_SPU   ((AT91_REG *)   0xFFFFF134) // (AIC) Spurious Vector Register
+#define AT91C_AIC_FFDR  ((AT91_REG *)   0xFFFFF144) // (AIC) Fast Forcing Disable Register
+#define AT91C_AIC_FVR   ((AT91_REG *)   0xFFFFF104) // (AIC) FIQ Vector Register
+#define AT91C_AIC_FFSR  ((AT91_REG *)   0xFFFFF148) // (AIC) Fast Forcing Status Register
+#define AT91C_AIC_IMR   ((AT91_REG *)   0xFFFFF110) // (AIC) Interrupt Mask Register
+#define AT91C_AIC_ISR   ((AT91_REG *)   0xFFFFF108) // (AIC) Interrupt Status Register
+#define AT91C_AIC_IVR   ((AT91_REG *)   0xFFFFF100) // (AIC) IRQ Vector Register
+#define AT91C_AIC_IDCR  ((AT91_REG *)   0xFFFFF124) // (AIC) Interrupt Disable Command Register
+#define AT91C_AIC_CISR  ((AT91_REG *)   0xFFFFF114) // (AIC) Core Interrupt Status Register
+#define AT91C_AIC_IPR   ((AT91_REG *)   0xFFFFF10C) // (AIC) Interrupt Pending Register
+// ========== Register definition for DBGU peripheral ==========
+#define AT91C_DBGU_C2R  ((AT91_REG *)   0xFFFFF244) // (DBGU) Chip ID2 Register
+#define AT91C_DBGU_THR  ((AT91_REG *)   0xFFFFF21C) // (DBGU) Transmitter Holding Register
+#define AT91C_DBGU_CSR  ((AT91_REG *)   0xFFFFF214) // (DBGU) Channel Status Register
+#define AT91C_DBGU_IDR  ((AT91_REG *)   0xFFFFF20C) // (DBGU) Interrupt Disable Register
+#define AT91C_DBGU_MR   ((AT91_REG *)   0xFFFFF204) // (DBGU) Mode Register
+#define AT91C_DBGU_FNTR ((AT91_REG *)   0xFFFFF248) // (DBGU) Force NTRST Register
+#define AT91C_DBGU_C1R  ((AT91_REG *)   0xFFFFF240) // (DBGU) Chip ID1 Register
+#define AT91C_DBGU_BRGR ((AT91_REG *)   0xFFFFF220) // (DBGU) Baud Rate Generator Register
+#define AT91C_DBGU_RHR  ((AT91_REG *)   0xFFFFF218) // (DBGU) Receiver Holding Register
+#define AT91C_DBGU_IMR  ((AT91_REG *)   0xFFFFF210) // (DBGU) Interrupt Mask Register
+#define AT91C_DBGU_IER  ((AT91_REG *)   0xFFFFF208) // (DBGU) Interrupt Enable Register
+#define AT91C_DBGU_CR   ((AT91_REG *)   0xFFFFF200) // (DBGU) Control Register
+// ========== Register definition for PDC_DBGU peripheral ==========
+#define AT91C_DBGU_TNCR ((AT91_REG *)   0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register
+#define AT91C_DBGU_RNCR ((AT91_REG *)   0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register
+#define AT91C_DBGU_PTCR ((AT91_REG *)   0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register
+#define AT91C_DBGU_PTSR ((AT91_REG *)   0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register
+#define AT91C_DBGU_RCR  ((AT91_REG *)   0xFFFFF304) // (PDC_DBGU) Receive Counter Register
+#define AT91C_DBGU_TCR  ((AT91_REG *)   0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register
+#define AT91C_DBGU_RPR  ((AT91_REG *)   0xFFFFF300) // (PDC_DBGU) Receive Pointer Register
+#define AT91C_DBGU_TPR  ((AT91_REG *)   0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register
+#define AT91C_DBGU_RNPR ((AT91_REG *)   0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register
+#define AT91C_DBGU_TNPR ((AT91_REG *)   0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register
+// ========== Register definition for PIOA peripheral ==========
+#define AT91C_PIOA_IMR  ((AT91_REG *)   0xFFFFF448) // (PIOA) Interrupt Mask Register
+#define AT91C_PIOA_IER  ((AT91_REG *)   0xFFFFF440) // (PIOA) Interrupt Enable Register
+#define AT91C_PIOA_OWDR ((AT91_REG *)   0xFFFFF4A4) // (PIOA) Output Write Disable Register
+#define AT91C_PIOA_ISR  ((AT91_REG *)   0xFFFFF44C) // (PIOA) Interrupt Status Register
+#define AT91C_PIOA_PPUDR ((AT91_REG *)  0xFFFFF460) // (PIOA) Pull-up Disable Register
+#define AT91C_PIOA_MDSR ((AT91_REG *)   0xFFFFF458) // (PIOA) Multi-driver Status Register
+#define AT91C_PIOA_MDER ((AT91_REG *)   0xFFFFF450) // (PIOA) Multi-driver Enable Register
+#define AT91C_PIOA_PER  ((AT91_REG *)   0xFFFFF400) // (PIOA) PIO Enable Register
+#define AT91C_PIOA_PSR  ((AT91_REG *)   0xFFFFF408) // (PIOA) PIO Status Register
+#define AT91C_PIOA_OER  ((AT91_REG *)   0xFFFFF410) // (PIOA) Output Enable Register
+#define AT91C_PIOA_BSR  ((AT91_REG *)   0xFFFFF474) // (PIOA) Select B Register
+#define AT91C_PIOA_PPUER ((AT91_REG *)  0xFFFFF464) // (PIOA) Pull-up Enable Register
+#define AT91C_PIOA_MDDR ((AT91_REG *)   0xFFFFF454) // (PIOA) Multi-driver Disable Register
+#define AT91C_PIOA_PDR  ((AT91_REG *)   0xFFFFF404) // (PIOA) PIO Disable Register
+#define AT91C_PIOA_ODR  ((AT91_REG *)   0xFFFFF414) // (PIOA) Output Disable Registerr
+#define AT91C_PIOA_IFDR ((AT91_REG *)   0xFFFFF424) // (PIOA) Input Filter Disable Register
+#define AT91C_PIOA_ABSR ((AT91_REG *)   0xFFFFF478) // (PIOA) AB Select Status Register
+#define AT91C_PIOA_ASR  ((AT91_REG *)   0xFFFFF470) // (PIOA) Select A Register
+#define AT91C_PIOA_PPUSR ((AT91_REG *)  0xFFFFF468) // (PIOA) Pad Pull-up Status Register
+#define AT91C_PIOA_ODSR ((AT91_REG *)   0xFFFFF438) // (PIOA) Output Data Status Register
+#define AT91C_PIOA_SODR ((AT91_REG *)   0xFFFFF430) // (PIOA) Set Output Data Register
+#define AT91C_PIOA_IFSR ((AT91_REG *)   0xFFFFF428) // (PIOA) Input Filter Status Register
+#define AT91C_PIOA_IFER ((AT91_REG *)   0xFFFFF420) // (PIOA) Input Filter Enable Register
+#define AT91C_PIOA_OSR  ((AT91_REG *)   0xFFFFF418) // (PIOA) Output Status Register
+#define AT91C_PIOA_IDR  ((AT91_REG *)   0xFFFFF444) // (PIOA) Interrupt Disable Register
+#define AT91C_PIOA_PDSR ((AT91_REG *)   0xFFFFF43C) // (PIOA) Pin Data Status Register
+#define AT91C_PIOA_CODR ((AT91_REG *)   0xFFFFF434) // (PIOA) Clear Output Data Register
+#define AT91C_PIOA_OWSR ((AT91_REG *)   0xFFFFF4A8) // (PIOA) Output Write Status Register
+#define AT91C_PIOA_OWER ((AT91_REG *)   0xFFFFF4A0) // (PIOA) Output Write Enable Register
+// ========== Register definition for CKGR peripheral ==========
+#define AT91C_CKGR_PLLR ((AT91_REG *)   0xFFFFFC2C) // (CKGR) PLL Register
+#define AT91C_CKGR_MCFR ((AT91_REG *)   0xFFFFFC24) // (CKGR) Main Clock  Frequency Register
+#define AT91C_CKGR_MOR  ((AT91_REG *)   0xFFFFFC20) // (CKGR) Main Oscillator Register
+// ========== Register definition for PMC peripheral ==========
+#define AT91C_PMC_SCSR  ((AT91_REG *)   0xFFFFFC08) // (PMC) System Clock Status Register
+#define AT91C_PMC_SCER  ((AT91_REG *)   0xFFFFFC00) // (PMC) System Clock Enable Register
+#define AT91C_PMC_IMR   ((AT91_REG *)   0xFFFFFC6C) // (PMC) Interrupt Mask Register
+#define AT91C_PMC_IDR   ((AT91_REG *)   0xFFFFFC64) // (PMC) Interrupt Disable Register
+#define AT91C_PMC_PCDR  ((AT91_REG *)   0xFFFFFC14) // (PMC) Peripheral Clock Disable Register
+#define AT91C_PMC_SCDR  ((AT91_REG *)   0xFFFFFC04) // (PMC) System Clock Disable Register
+#define AT91C_PMC_SR    ((AT91_REG *)   0xFFFFFC68) // (PMC) Status Register
+#define AT91C_PMC_IER   ((AT91_REG *)   0xFFFFFC60) // (PMC) Interrupt Enable Register
+#define AT91C_PMC_MCKR  ((AT91_REG *)   0xFFFFFC30) // (PMC) Master Clock Register
+#define AT91C_PMC_MOR   ((AT91_REG *)   0xFFFFFC20) // (PMC) Main Oscillator Register
+#define AT91C_PMC_PCER  ((AT91_REG *)   0xFFFFFC10) // (PMC) Peripheral Clock Enable Register
+#define AT91C_PMC_PCSR  ((AT91_REG *)   0xFFFFFC18) // (PMC) Peripheral Clock Status Register
+#define AT91C_PMC_PLLR  ((AT91_REG *)   0xFFFFFC2C) // (PMC) PLL Register
+#define AT91C_PMC_MCFR  ((AT91_REG *)   0xFFFFFC24) // (PMC) Main Clock  Frequency Register
+#define AT91C_PMC_PCKR  ((AT91_REG *)   0xFFFFFC40) // (PMC) Programmable Clock Register
+// ========== Register definition for RSTC peripheral ==========
+#define AT91C_RSTC_RSR  ((AT91_REG *)   0xFFFFFD04) // (RSTC) Reset Status Register
+#define AT91C_RSTC_RMR  ((AT91_REG *)   0xFFFFFD08) // (RSTC) Reset Mode Register
+#define AT91C_RSTC_RCR  ((AT91_REG *)   0xFFFFFD00) // (RSTC) Reset Control Register
+// ========== Register definition for RTTC peripheral ==========
+#define AT91C_RTTC_RTSR ((AT91_REG *)   0xFFFFFD2C) // (RTTC) Real-time Status Register
+#define AT91C_RTTC_RTAR ((AT91_REG *)   0xFFFFFD24) // (RTTC) Real-time Alarm Register
+#define AT91C_RTTC_RTVR ((AT91_REG *)   0xFFFFFD28) // (RTTC) Real-time Value Register
+#define AT91C_RTTC_RTMR ((AT91_REG *)   0xFFFFFD20) // (RTTC) Real-time Mode Register
+// ========== Register definition for PITC peripheral ==========
+#define AT91C_PITC_PIIR ((AT91_REG *)   0xFFFFFD3C) // (PITC) Period Interval Image Register
+#define AT91C_PITC_PISR ((AT91_REG *)   0xFFFFFD34) // (PITC) Period Interval Status Register
+#define AT91C_PITC_PIVR ((AT91_REG *)   0xFFFFFD38) // (PITC) Period Interval Value Register
+#define AT91C_PITC_PIMR ((AT91_REG *)   0xFFFFFD30) // (PITC) Period Interval Mode Register
+// ========== Register definition for WDTC peripheral ==========
+#define AT91C_WDTC_WDMR ((AT91_REG *)   0xFFFFFD44) // (WDTC) Watchdog Mode Register
+#define AT91C_WDTC_WDSR ((AT91_REG *)   0xFFFFFD48) // (WDTC) Watchdog Status Register
+#define AT91C_WDTC_WDCR ((AT91_REG *)   0xFFFFFD40) // (WDTC) Watchdog Control Register
+// ========== Register definition for MC peripheral ==========
+#define AT91C_MC_FCR    ((AT91_REG *)   0xFFFFFF64) // (MC) MC Flash Command Register
+#define AT91C_MC_ASR    ((AT91_REG *)   0xFFFFFF04) // (MC) MC Abort Status Register
+#define AT91C_MC_FSR    ((AT91_REG *)   0xFFFFFF68) // (MC) MC Flash Status Register
+#define AT91C_MC_FMR    ((AT91_REG *)   0xFFFFFF60) // (MC) MC Flash Mode Register
+#define AT91C_MC_AASR   ((AT91_REG *)   0xFFFFFF08) // (MC) MC Abort Address Status Register
+#define AT91C_MC_RCR    ((AT91_REG *)   0xFFFFFF00) // (MC) MC Remap Control Register
+// ========== Register definition for PDC_SPI peripheral ==========
+#define AT91C_SPI_PTCR  ((AT91_REG *)   0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register
+#define AT91C_SPI_TNPR  ((AT91_REG *)   0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register
+#define AT91C_SPI_RNPR  ((AT91_REG *)   0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register
+#define AT91C_SPI_TPR   ((AT91_REG *)   0xFFFE0108) // (PDC_SPI) Transmit Pointer Register
+#define AT91C_SPI_RPR   ((AT91_REG *)   0xFFFE0100) // (PDC_SPI) Receive Pointer Register
+#define AT91C_SPI_PTSR  ((AT91_REG *)   0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register
+#define AT91C_SPI_TNCR  ((AT91_REG *)   0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register
+#define AT91C_SPI_RNCR  ((AT91_REG *)   0xFFFE0114) // (PDC_SPI) Receive Next Counter Register
+#define AT91C_SPI_TCR   ((AT91_REG *)   0xFFFE010C) // (PDC_SPI) Transmit Counter Register
+#define AT91C_SPI_RCR   ((AT91_REG *)   0xFFFE0104) // (PDC_SPI) Receive Counter Register
+// ========== Register definition for SPI peripheral ==========
+#define AT91C_SPI_CSR   ((AT91_REG *)   0xFFFE0030) // (SPI) Chip Select Register
+#define AT91C_SPI_IDR   ((AT91_REG *)   0xFFFE0018) // (SPI) Interrupt Disable Register
+#define AT91C_SPI_SR    ((AT91_REG *)   0xFFFE0010) // (SPI) Status Register
+#define AT91C_SPI_RDR   ((AT91_REG *)   0xFFFE0008) // (SPI) Receive Data Register
+#define AT91C_SPI_CR    ((AT91_REG *)   0xFFFE0000) // (SPI) Control Register
+#define AT91C_SPI_IMR   ((AT91_REG *)   0xFFFE001C) // (SPI) Interrupt Mask Register
+#define AT91C_SPI_IER   ((AT91_REG *)   0xFFFE0014) // (SPI) Interrupt Enable Register
+#define AT91C_SPI_TDR   ((AT91_REG *)   0xFFFE000C) // (SPI) Transmit Data Register
+#define AT91C_SPI_MR    ((AT91_REG *)   0xFFFE0004) // (SPI) Mode Register
+// ========== Register definition for PDC_ADC peripheral ==========
+#define AT91C_ADC_PTCR  ((AT91_REG *)   0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register
+#define AT91C_ADC_TNPR  ((AT91_REG *)   0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register
+#define AT91C_ADC_RNPR  ((AT91_REG *)   0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register
+#define AT91C_ADC_TPR   ((AT91_REG *)   0xFFFD8108) // (PDC_ADC) Transmit Pointer Register
+#define AT91C_ADC_RPR   ((AT91_REG *)   0xFFFD8100) // (PDC_ADC) Receive Pointer Register
+#define AT91C_ADC_PTSR  ((AT91_REG *)   0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register
+#define AT91C_ADC_TNCR  ((AT91_REG *)   0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register
+#define AT91C_ADC_RNCR  ((AT91_REG *)   0xFFFD8114) // (PDC_ADC) Receive Next Counter Register
+#define AT91C_ADC_TCR   ((AT91_REG *)   0xFFFD810C) // (PDC_ADC) Transmit Counter Register
+#define AT91C_ADC_RCR   ((AT91_REG *)   0xFFFD8104) // (PDC_ADC) Receive Counter Register
+// ========== Register definition for ADC peripheral ==========
+#define AT91C_ADC_IMR   ((AT91_REG *)   0xFFFD802C) // (ADC) ADC Interrupt Mask Register
+#define AT91C_ADC_CDR4  ((AT91_REG *)   0xFFFD8040) // (ADC) ADC Channel Data Register 4
+#define AT91C_ADC_CDR2  ((AT91_REG *)   0xFFFD8038) // (ADC) ADC Channel Data Register 2
+#define AT91C_ADC_CDR0  ((AT91_REG *)   0xFFFD8030) // (ADC) ADC Channel Data Register 0
+#define AT91C_ADC_CDR7  ((AT91_REG *)   0xFFFD804C) // (ADC) ADC Channel Data Register 7
+#define AT91C_ADC_CDR1  ((AT91_REG *)   0xFFFD8034) // (ADC) ADC Channel Data Register 1
+#define AT91C_ADC_CDR3  ((AT91_REG *)   0xFFFD803C) // (ADC) ADC Channel Data Register 3
+#define AT91C_ADC_CDR5  ((AT91_REG *)   0xFFFD8044) // (ADC) ADC Channel Data Register 5
+#define AT91C_ADC_MR    ((AT91_REG *)   0xFFFD8004) // (ADC) ADC Mode Register
+#define AT91C_ADC_CDR6  ((AT91_REG *)   0xFFFD8048) // (ADC) ADC Channel Data Register 6
+#define AT91C_ADC_CR    ((AT91_REG *)   0xFFFD8000) // (ADC) ADC Control Register
+#define AT91C_ADC_CHER  ((AT91_REG *)   0xFFFD8010) // (ADC) ADC Channel Enable Register
+#define AT91C_ADC_CHSR  ((AT91_REG *)   0xFFFD8018) // (ADC) ADC Channel Status Register
+#define AT91C_ADC_IER   ((AT91_REG *)   0xFFFD8024) // (ADC) ADC Interrupt Enable Register
+#define AT91C_ADC_SR    ((AT91_REG *)   0xFFFD801C) // (ADC) ADC Status Register
+#define AT91C_ADC_CHDR  ((AT91_REG *)   0xFFFD8014) // (ADC) ADC Channel Disable Register
+#define AT91C_ADC_IDR   ((AT91_REG *)   0xFFFD8028) // (ADC) ADC Interrupt Disable Register
+#define AT91C_ADC_LCDR  ((AT91_REG *)   0xFFFD8020) // (ADC) ADC Last Converted Data Register
+// ========== Register definition for PDC_SSC peripheral ==========
+#define AT91C_SSC_PTCR  ((AT91_REG *)   0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register
+#define AT91C_SSC_TNPR  ((AT91_REG *)   0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register
+#define AT91C_SSC_RNPR  ((AT91_REG *)   0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register
+#define AT91C_SSC_TPR   ((AT91_REG *)   0xFFFD4108) // (PDC_SSC) Transmit Pointer Register
+#define AT91C_SSC_RPR   ((AT91_REG *)   0xFFFD4100) // (PDC_SSC) Receive Pointer Register
+#define AT91C_SSC_PTSR  ((AT91_REG *)   0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register
+#define AT91C_SSC_TNCR  ((AT91_REG *)   0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register
+#define AT91C_SSC_RNCR  ((AT91_REG *)   0xFFFD4114) // (PDC_SSC) Receive Next Counter Register
+#define AT91C_SSC_TCR   ((AT91_REG *)   0xFFFD410C) // (PDC_SSC) Transmit Counter Register
+#define AT91C_SSC_RCR   ((AT91_REG *)   0xFFFD4104) // (PDC_SSC) Receive Counter Register
+// ========== Register definition for SSC peripheral ==========
+#define AT91C_SSC_RFMR  ((AT91_REG *)   0xFFFD4014) // (SSC) Receive Frame Mode Register
+#define AT91C_SSC_CMR   ((AT91_REG *)   0xFFFD4004) // (SSC) Clock Mode Register
+#define AT91C_SSC_IDR   ((AT91_REG *)   0xFFFD4048) // (SSC) Interrupt Disable Register
+#define AT91C_SSC_SR    ((AT91_REG *)   0xFFFD4040) // (SSC) Status Register
+#define AT91C_SSC_RC0R  ((AT91_REG *)   0xFFFD4038) // (SSC) Receive Compare 0 Register
+#define AT91C_SSC_RSHR  ((AT91_REG *)   0xFFFD4030) // (SSC) Receive Sync Holding Register
+#define AT91C_SSC_RHR   ((AT91_REG *)   0xFFFD4020) // (SSC) Receive Holding Register
+#define AT91C_SSC_TCMR  ((AT91_REG *)   0xFFFD4018) // (SSC) Transmit Clock Mode Register
+#define AT91C_SSC_RCMR  ((AT91_REG *)   0xFFFD4010) // (SSC) Receive Clock ModeRegister
+#define AT91C_SSC_CR    ((AT91_REG *)   0xFFFD4000) // (SSC) Control Register
+#define AT91C_SSC_IMR   ((AT91_REG *)   0xFFFD404C) // (SSC) Interrupt Mask Register
+#define AT91C_SSC_IER   ((AT91_REG *)   0xFFFD4044) // (SSC) Interrupt Enable Register
+#define AT91C_SSC_RC1R  ((AT91_REG *)   0xFFFD403C) // (SSC) Receive Compare 1 Register
+#define AT91C_SSC_TSHR  ((AT91_REG *)   0xFFFD4034) // (SSC) Transmit Sync Holding Register
+#define AT91C_SSC_THR   ((AT91_REG *)   0xFFFD4024) // (SSC) Transmit Holding Register
+#define AT91C_SSC_TFMR  ((AT91_REG *)   0xFFFD401C) // (SSC) Transmit Frame Mode Register
+// ========== Register definition for PDC_US1 peripheral ==========
+#define AT91C_US1_PTSR  ((AT91_REG *)   0xFFFC4124) // (PDC_US1) PDC Transfer Status Register
+#define AT91C_US1_TNCR  ((AT91_REG *)   0xFFFC411C) // (PDC_US1) Transmit Next Counter Register
+#define AT91C_US1_RNCR  ((AT91_REG *)   0xFFFC4114) // (PDC_US1) Receive Next Counter Register
+#define AT91C_US1_TCR   ((AT91_REG *)   0xFFFC410C) // (PDC_US1) Transmit Counter Register
+#define AT91C_US1_RCR   ((AT91_REG *)   0xFFFC4104) // (PDC_US1) Receive Counter Register
+#define AT91C_US1_PTCR  ((AT91_REG *)   0xFFFC4120) // (PDC_US1) PDC Transfer Control Register
+#define AT91C_US1_TNPR  ((AT91_REG *)   0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register
+#define AT91C_US1_RNPR  ((AT91_REG *)   0xFFFC4110) // (PDC_US1) Receive Next Pointer Register
+#define AT91C_US1_TPR   ((AT91_REG *)   0xFFFC4108) // (PDC_US1) Transmit Pointer Register
+#define AT91C_US1_RPR   ((AT91_REG *)   0xFFFC4100) // (PDC_US1) Receive Pointer Register
+// ========== Register definition for US1 peripheral ==========
+#define AT91C_US1_XXR   ((AT91_REG *)   0xFFFC4048) // (US1) XON_XOFF Register
+#define AT91C_US1_RHR   ((AT91_REG *)   0xFFFC4018) // (US1) Receiver Holding Register
+#define AT91C_US1_IMR   ((AT91_REG *)   0xFFFC4010) // (US1) Interrupt Mask Register
+#define AT91C_US1_IER   ((AT91_REG *)   0xFFFC4008) // (US1) Interrupt Enable Register
+#define AT91C_US1_CR    ((AT91_REG *)   0xFFFC4000) // (US1) Control Register
+#define AT91C_US1_RTOR  ((AT91_REG *)   0xFFFC4024) // (US1) Receiver Time-out Register
+#define AT91C_US1_THR   ((AT91_REG *)   0xFFFC401C) // (US1) Transmitter Holding Register
+#define AT91C_US1_CSR   ((AT91_REG *)   0xFFFC4014) // (US1) Channel Status Register
+#define AT91C_US1_IDR   ((AT91_REG *)   0xFFFC400C) // (US1) Interrupt Disable Register
+#define AT91C_US1_FIDI  ((AT91_REG *)   0xFFFC4040) // (US1) FI_DI_Ratio Register
+#define AT91C_US1_BRGR  ((AT91_REG *)   0xFFFC4020) // (US1) Baud Rate Generator Register
+#define AT91C_US1_TTGR  ((AT91_REG *)   0xFFFC4028) // (US1) Transmitter Time-guard Register
+#define AT91C_US1_IF    ((AT91_REG *)   0xFFFC404C) // (US1) IRDA_FILTER Register
+#define AT91C_US1_NER   ((AT91_REG *)   0xFFFC4044) // (US1) Nb Errors Register
+#define AT91C_US1_MR    ((AT91_REG *)   0xFFFC4004) // (US1) Mode Register
+// ========== Register definition for PDC_US0 peripheral ==========
+#define AT91C_US0_PTCR  ((AT91_REG *)   0xFFFC0120) // (PDC_US0) PDC Transfer Control Register
+#define AT91C_US0_TNPR  ((AT91_REG *)   0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register
+#define AT91C_US0_RNPR  ((AT91_REG *)   0xFFFC0110) // (PDC_US0) Receive Next Pointer Register
+#define AT91C_US0_TPR   ((AT91_REG *)   0xFFFC0108) // (PDC_US0) Transmit Pointer Register
+#define AT91C_US0_RPR   ((AT91_REG *)   0xFFFC0100) // (PDC_US0) Receive Pointer Register
+#define AT91C_US0_PTSR  ((AT91_REG *)   0xFFFC0124) // (PDC_US0) PDC Transfer Status Register
+#define AT91C_US0_TNCR  ((AT91_REG *)   0xFFFC011C) // (PDC_US0) Transmit Next Counter Register
+#define AT91C_US0_RNCR  ((AT91_REG *)   0xFFFC0114) // (PDC_US0) Receive Next Counter Register
+#define AT91C_US0_TCR   ((AT91_REG *)   0xFFFC010C) // (PDC_US0) Transmit Counter Register
+#define AT91C_US0_RCR   ((AT91_REG *)   0xFFFC0104) // (PDC_US0) Receive Counter Register
+// ========== Register definition for US0 peripheral ==========
+#define AT91C_US0_TTGR  ((AT91_REG *)   0xFFFC0028) // (US0) Transmitter Time-guard Register
+#define AT91C_US0_BRGR  ((AT91_REG *)   0xFFFC0020) // (US0) Baud Rate Generator Register
+#define AT91C_US0_RHR   ((AT91_REG *)   0xFFFC0018) // (US0) Receiver Holding Register
+#define AT91C_US0_IMR   ((AT91_REG *)   0xFFFC0010) // (US0) Interrupt Mask Register
+#define AT91C_US0_NER   ((AT91_REG *)   0xFFFC0044) // (US0) Nb Errors Register
+#define AT91C_US0_RTOR  ((AT91_REG *)   0xFFFC0024) // (US0) Receiver Time-out Register
+#define AT91C_US0_XXR   ((AT91_REG *)   0xFFFC0048) // (US0) XON_XOFF Register
+#define AT91C_US0_FIDI  ((AT91_REG *)   0xFFFC0040) // (US0) FI_DI_Ratio Register
+#define AT91C_US0_CR    ((AT91_REG *)   0xFFFC0000) // (US0) Control Register
+#define AT91C_US0_IER   ((AT91_REG *)   0xFFFC0008) // (US0) Interrupt Enable Register
+#define AT91C_US0_IF    ((AT91_REG *)   0xFFFC004C) // (US0) IRDA_FILTER Register
+#define AT91C_US0_MR    ((AT91_REG *)   0xFFFC0004) // (US0) Mode Register
+#define AT91C_US0_IDR   ((AT91_REG *)   0xFFFC000C) // (US0) Interrupt Disable Register
+#define AT91C_US0_CSR   ((AT91_REG *)   0xFFFC0014) // (US0) Channel Status Register
+#define AT91C_US0_THR   ((AT91_REG *)   0xFFFC001C) // (US0) Transmitter Holding Register
+// ========== Register definition for TWI peripheral ==========
+#define AT91C_TWI_RHR   ((AT91_REG *)   0xFFFB8030) // (TWI) Receive Holding Register
+#define AT91C_TWI_IDR   ((AT91_REG *)   0xFFFB8028) // (TWI) Interrupt Disable Register
+#define AT91C_TWI_SR    ((AT91_REG *)   0xFFFB8020) // (TWI) Status Register
+#define AT91C_TWI_CWGR  ((AT91_REG *)   0xFFFB8010) // (TWI) Clock Waveform Generator Register
+#define AT91C_TWI_SMR   ((AT91_REG *)   0xFFFB8008) // (TWI) Slave Mode Register
+#define AT91C_TWI_CR    ((AT91_REG *)   0xFFFB8000) // (TWI) Control Register
+#define AT91C_TWI_THR   ((AT91_REG *)   0xFFFB8034) // (TWI) Transmit Holding Register
+#define AT91C_TWI_IMR   ((AT91_REG *)   0xFFFB802C) // (TWI) Interrupt Mask Register
+#define AT91C_TWI_IER   ((AT91_REG *)   0xFFFB8024) // (TWI) Interrupt Enable Register
+#define AT91C_TWI_IADR  ((AT91_REG *)   0xFFFB800C) // (TWI) Internal Address Register
+#define AT91C_TWI_MMR   ((AT91_REG *)   0xFFFB8004) // (TWI) Master Mode Register
+// ========== Register definition for TC2 peripheral ==========
+#define AT91C_TC2_IMR   ((AT91_REG *)   0xFFFA00AC) // (TC2) Interrupt Mask Register
+#define AT91C_TC2_IER   ((AT91_REG *)   0xFFFA00A4) // (TC2) Interrupt Enable Register
+#define AT91C_TC2_RC    ((AT91_REG *)   0xFFFA009C) // (TC2) Register C
+#define AT91C_TC2_RA    ((AT91_REG *)   0xFFFA0094) // (TC2) Register A
+#define AT91C_TC2_CMR   ((AT91_REG *)   0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC2_IDR   ((AT91_REG *)   0xFFFA00A8) // (TC2) Interrupt Disable Register
+#define AT91C_TC2_SR    ((AT91_REG *)   0xFFFA00A0) // (TC2) Status Register
+#define AT91C_TC2_RB    ((AT91_REG *)   0xFFFA0098) // (TC2) Register B
+#define AT91C_TC2_CV    ((AT91_REG *)   0xFFFA0090) // (TC2) Counter Value
+#define AT91C_TC2_CCR   ((AT91_REG *)   0xFFFA0080) // (TC2) Channel Control Register
+// ========== Register definition for TC1 peripheral ==========
+#define AT91C_TC1_IMR   ((AT91_REG *)   0xFFFA006C) // (TC1) Interrupt Mask Register
+#define AT91C_TC1_IER   ((AT91_REG *)   0xFFFA0064) // (TC1) Interrupt Enable Register
+#define AT91C_TC1_RC    ((AT91_REG *)   0xFFFA005C) // (TC1) Register C
+#define AT91C_TC1_RA    ((AT91_REG *)   0xFFFA0054) // (TC1) Register A
+#define AT91C_TC1_CMR   ((AT91_REG *)   0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC1_IDR   ((AT91_REG *)   0xFFFA0068) // (TC1) Interrupt Disable Register
+#define AT91C_TC1_SR    ((AT91_REG *)   0xFFFA0060) // (TC1) Status Register
+#define AT91C_TC1_RB    ((AT91_REG *)   0xFFFA0058) // (TC1) Register B
+#define AT91C_TC1_CV    ((AT91_REG *)   0xFFFA0050) // (TC1) Counter Value
+#define AT91C_TC1_CCR   ((AT91_REG *)   0xFFFA0040) // (TC1) Channel Control Register
+// ========== Register definition for TC0 peripheral ==========
+#define AT91C_TC0_IMR   ((AT91_REG *)   0xFFFA002C) // (TC0) Interrupt Mask Register
+#define AT91C_TC0_IER   ((AT91_REG *)   0xFFFA0024) // (TC0) Interrupt Enable Register
+#define AT91C_TC0_RC    ((AT91_REG *)   0xFFFA001C) // (TC0) Register C
+#define AT91C_TC0_RA    ((AT91_REG *)   0xFFFA0014) // (TC0) Register A
+#define AT91C_TC0_CMR   ((AT91_REG *)   0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC0_IDR   ((AT91_REG *)   0xFFFA0028) // (TC0) Interrupt Disable Register
+#define AT91C_TC0_SR    ((AT91_REG *)   0xFFFA0020) // (TC0) Status Register
+#define AT91C_TC0_RB    ((AT91_REG *)   0xFFFA0018) // (TC0) Register B
+#define AT91C_TC0_CV    ((AT91_REG *)   0xFFFA0010) // (TC0) Counter Value
+#define AT91C_TC0_CCR   ((AT91_REG *)   0xFFFA0000) // (TC0) Channel Control Register
+// ========== Register definition for TCB peripheral ==========
+#define AT91C_TCB_BMR   ((AT91_REG *)   0xFFFA00C4) // (TCB) TC Block Mode Register
+#define AT91C_TCB_BCR   ((AT91_REG *)   0xFFFA00C0) // (TCB) TC Block Control Register
+// ========== Register definition for PWMC_CH3 peripheral ==========
+#define AT91C_CH3_CUPDR ((AT91_REG *)   0xFFFCC270) // (PWMC_CH3) Channel Update Register
+#define AT91C_CH3_CPRDR ((AT91_REG *)   0xFFFCC268) // (PWMC_CH3) Channel Period Register
+#define AT91C_CH3_CMR   ((AT91_REG *)   0xFFFCC260) // (PWMC_CH3) Channel Mode Register
+#define AT91C_CH3_Reserved ((AT91_REG *)    0xFFFCC274) // (PWMC_CH3) Reserved
+#define AT91C_CH3_CCNTR ((AT91_REG *)   0xFFFCC26C) // (PWMC_CH3) Channel Counter Register
+#define AT91C_CH3_CDTYR ((AT91_REG *)   0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register
+// ========== Register definition for PWMC_CH2 peripheral ==========
+#define AT91C_CH2_CUPDR ((AT91_REG *)   0xFFFCC250) // (PWMC_CH2) Channel Update Register
+#define AT91C_CH2_CPRDR ((AT91_REG *)   0xFFFCC248) // (PWMC_CH2) Channel Period Register
+#define AT91C_CH2_CMR   ((AT91_REG *)   0xFFFCC240) // (PWMC_CH2) Channel Mode Register
+#define AT91C_CH2_Reserved ((AT91_REG *)    0xFFFCC254) // (PWMC_CH2) Reserved
+#define AT91C_CH2_CCNTR ((AT91_REG *)   0xFFFCC24C) // (PWMC_CH2) Channel Counter Register
+#define AT91C_CH2_CDTYR ((AT91_REG *)   0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register
+// ========== Register definition for PWMC_CH1 peripheral ==========
+#define AT91C_CH1_CUPDR ((AT91_REG *)   0xFFFCC230) // (PWMC_CH1) Channel Update Register
+#define AT91C_CH1_CPRDR ((AT91_REG *)   0xFFFCC228) // (PWMC_CH1) Channel Period Register
+#define AT91C_CH1_CMR   ((AT91_REG *)   0xFFFCC220) // (PWMC_CH1) Channel Mode Register
+#define AT91C_CH1_Reserved ((AT91_REG *)    0xFFFCC234) // (PWMC_CH1) Reserved
+#define AT91C_CH1_CCNTR ((AT91_REG *)   0xFFFCC22C) // (PWMC_CH1) Channel Counter Register
+#define AT91C_CH1_CDTYR ((AT91_REG *)   0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register
+// ========== Register definition for PWMC_CH0 peripheral ==========
+#define AT91C_CH0_CUPDR ((AT91_REG *)   0xFFFCC210) // (PWMC_CH0) Channel Update Register
+#define AT91C_CH0_CPRDR ((AT91_REG *)   0xFFFCC208) // (PWMC_CH0) Channel Period Register
+#define AT91C_CH0_CMR   ((AT91_REG *)   0xFFFCC200) // (PWMC_CH0) Channel Mode Register
+#define AT91C_CH0_Reserved ((AT91_REG *)    0xFFFCC214) // (PWMC_CH0) Reserved
+#define AT91C_CH0_CCNTR ((AT91_REG *)   0xFFFCC20C) // (PWMC_CH0) Channel Counter Register
+#define AT91C_CH0_CDTYR ((AT91_REG *)   0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register
+// ========== Register definition for PWMC peripheral ==========
+#define AT91C_PWMC_VR   ((AT91_REG *)   0xFFFCC0FC) // (PWMC) PWMC Version Register
+#define AT91C_PWMC_ISR  ((AT91_REG *)   0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register
+#define AT91C_PWMC_IDR  ((AT91_REG *)   0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register
+#define AT91C_PWMC_SR   ((AT91_REG *)   0xFFFCC00C) // (PWMC) PWMC Status Register
+#define AT91C_PWMC_ENA  ((AT91_REG *)   0xFFFCC004) // (PWMC) PWMC Enable Register
+#define AT91C_PWMC_IMR  ((AT91_REG *)   0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register
+#define AT91C_PWMC_MR   ((AT91_REG *)   0xFFFCC000) // (PWMC) PWMC Mode Register
+#define AT91C_PWMC_DIS  ((AT91_REG *)   0xFFFCC008) // (PWMC) PWMC Disable Register
+#define AT91C_PWMC_IER  ((AT91_REG *)   0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register
+// ========== Register definition for UDP peripheral ==========
+#define AT91C_UDP_ISR   ((AT91_REG *)   0xFFFB001C) // (UDP) Interrupt Status Register
+#define AT91C_UDP_IDR   ((AT91_REG *)   0xFFFB0014) // (UDP) Interrupt Disable Register
+#define AT91C_UDP_GLBSTATE ((AT91_REG *)    0xFFFB0004) // (UDP) Global State Register
+#define AT91C_UDP_FDR   ((AT91_REG *)   0xFFFB0050) // (UDP) Endpoint FIFO Data Register
+#define AT91C_UDP_CSR   ((AT91_REG *)   0xFFFB0030) // (UDP) Endpoint Control and Status Register
+#define AT91C_UDP_RSTEP ((AT91_REG *)   0xFFFB0028) // (UDP) Reset Endpoint Register
+#define AT91C_UDP_ICR   ((AT91_REG *)   0xFFFB0020) // (UDP) Interrupt Clear Register
+#define AT91C_UDP_IMR   ((AT91_REG *)   0xFFFB0018) // (UDP) Interrupt Mask Register
+#define AT91C_UDP_IER   ((AT91_REG *)   0xFFFB0010) // (UDP) Interrupt Enable Register
+#define AT91C_UDP_FADDR ((AT91_REG *)   0xFFFB0008) // (UDP) Function Address Register
+#define AT91C_UDP_NUM   ((AT91_REG *)   0xFFFB0000) // (UDP) Frame Number Register
+
+// *****************************************************************************
+//               PIO DEFINITIONS FOR AT91SAM7S64
+// *****************************************************************************
+#define AT91C_PIO_PA0        ((unsigned int) 1 <<  0) // Pin Controlled by PA0
+#define AT91C_PA0_PWM0     ((unsigned int) AT91C_PIO_PA0) //  PWM Channel 0
+#define AT91C_PA0_TIOA0    ((unsigned int) AT91C_PIO_PA0) //  Timer Counter 0 Multipurpose Timer I/O Pin A
+#define AT91C_PIO_PA1        ((unsigned int) 1 <<  1) // Pin Controlled by PA1
+#define AT91C_PA1_PWM1     ((unsigned int) AT91C_PIO_PA1) //  PWM Channel 1
+#define AT91C_PA1_TIOB0    ((unsigned int) AT91C_PIO_PA1) //  Timer Counter 0 Multipurpose Timer I/O Pin B
+#define AT91C_PIO_PA10       ((unsigned int) 1 << 10) // Pin Controlled by PA10
+#define AT91C_PA10_DTXD     ((unsigned int) AT91C_PIO_PA10) //  DBGU Debug Transmit Data
+#define AT91C_PA10_NPCS2    ((unsigned int) AT91C_PIO_PA10) //  SPI Peripheral Chip Select 2
+#define AT91C_PIO_PA11       ((unsigned int) 1 << 11) // Pin Controlled by PA11
+#define AT91C_PA11_NPCS0    ((unsigned int) AT91C_PIO_PA11) //  SPI Peripheral Chip Select 0
+#define AT91C_PA11_PWM0     ((unsigned int) AT91C_PIO_PA11) //  PWM Channel 0
+#define AT91C_PIO_PA12       ((unsigned int) 1 << 12) // Pin Controlled by PA12
+#define AT91C_PA12_MISO     ((unsigned int) AT91C_PIO_PA12) //  SPI Master In Slave
+#define AT91C_PA12_PWM1     ((unsigned int) AT91C_PIO_PA12) //  PWM Channel 1
+#define AT91C_PIO_PA13       ((unsigned int) 1 << 13) // Pin Controlled by PA13
+#define AT91C_PA13_MOSI     ((unsigned int) AT91C_PIO_PA13) //  SPI Master Out Slave
+#define AT91C_PA13_PWM2     ((unsigned int) AT91C_PIO_PA13) //  PWM Channel 2
+#define AT91C_PIO_PA14       ((unsigned int) 1 << 14) // Pin Controlled by PA14
+#define AT91C_PA14_SPCK     ((unsigned int) AT91C_PIO_PA14) //  SPI Serial Clock
+#define AT91C_PA14_PWM3     ((unsigned int) AT91C_PIO_PA14) //  PWM Channel 3
+#define AT91C_PIO_PA15       ((unsigned int) 1 << 15) // Pin Controlled by PA15
+#define AT91C_PA15_TF       ((unsigned int) AT91C_PIO_PA15) //  SSC Transmit Frame Sync
+#define AT91C_PA15_TIOA1    ((unsigned int) AT91C_PIO_PA15) //  Timer Counter 1 Multipurpose Timer I/O Pin A
+#define AT91C_PIO_PA16       ((unsigned int) 1 << 16) // Pin Controlled by PA16
+#define AT91C_PA16_TK       ((unsigned int) AT91C_PIO_PA16) //  SSC Transmit Clock
+#define AT91C_PA16_TIOB1    ((unsigned int) AT91C_PIO_PA16) //  Timer Counter 1 Multipurpose Timer I/O Pin B
+#define AT91C_PIO_PA17       ((unsigned int) 1 << 17) // Pin Controlled by PA17
+#define AT91C_PA17_TD       ((unsigned int) AT91C_PIO_PA17) //  SSC Transmit data
+#define AT91C_PA17_PCK1     ((unsigned int) AT91C_PIO_PA17) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PA18       ((unsigned int) 1 << 18) // Pin Controlled by PA18
+#define AT91C_PA18_RD       ((unsigned int) AT91C_PIO_PA18) //  SSC Receive Data
+#define AT91C_PA18_PCK2     ((unsigned int) AT91C_PIO_PA18) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PA19       ((unsigned int) 1 << 19) // Pin Controlled by PA19
+#define AT91C_PA19_RK       ((unsigned int) AT91C_PIO_PA19) //  SSC Receive Clock
+#define AT91C_PA19_FIQ      ((unsigned int) AT91C_PIO_PA19) //  AIC Fast Interrupt Input
+#define AT91C_PIO_PA2        ((unsigned int) 1 <<  2) // Pin Controlled by PA2
+#define AT91C_PA2_PWM2     ((unsigned int) AT91C_PIO_PA2) //  PWM Channel 2
+#define AT91C_PA2_SCK0     ((unsigned int) AT91C_PIO_PA2) //  USART 0 Serial Clock
+#define AT91C_PIO_PA20       ((unsigned int) 1 << 20) // Pin Controlled by PA20
+#define AT91C_PA20_RF       ((unsigned int) AT91C_PIO_PA20) //  SSC Receive Frame Sync
+#define AT91C_PA20_IRQ0     ((unsigned int) AT91C_PIO_PA20) //  External Interrupt 0
+#define AT91C_PIO_PA21       ((unsigned int) 1 << 21) // Pin Controlled by PA21
+#define AT91C_PA21_RXD1     ((unsigned int) AT91C_PIO_PA21) //  USART 1 Receive Data
+#define AT91C_PA21_PCK1     ((unsigned int) AT91C_PIO_PA21) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PA22       ((unsigned int) 1 << 22) // Pin Controlled by PA22
+#define AT91C_PA22_TXD1     ((unsigned int) AT91C_PIO_PA22) //  USART 1 Transmit Data
+#define AT91C_PA22_NPCS3    ((unsigned int) AT91C_PIO_PA22) //  SPI Peripheral Chip Select 3
+#define AT91C_PIO_PA23       ((unsigned int) 1 << 23) // Pin Controlled by PA23
+#define AT91C_PA23_SCK1     ((unsigned int) AT91C_PIO_PA23) //  USART 1 Serial Clock
+#define AT91C_PA23_PWM0     ((unsigned int) AT91C_PIO_PA23) //  PWM Channel 0
+#define AT91C_PIO_PA24       ((unsigned int) 1 << 24) // Pin Controlled by PA24
+#define AT91C_PA24_RTS1     ((unsigned int) AT91C_PIO_PA24) //  USART 1 Ready To Send
+#define AT91C_PA24_PWM1     ((unsigned int) AT91C_PIO_PA24) //  PWM Channel 1
+#define AT91C_PIO_PA25       ((unsigned int) 1 << 25) // Pin Controlled by PA25
+#define AT91C_PA25_CTS1     ((unsigned int) AT91C_PIO_PA25) //  USART 1 Clear To Send
+#define AT91C_PA25_PWM2     ((unsigned int) AT91C_PIO_PA25) //  PWM Channel 2
+#define AT91C_PIO_PA26       ((unsigned int) 1 << 26) // Pin Controlled by PA26
+#define AT91C_PA26_DCD1     ((unsigned int) AT91C_PIO_PA26) //  USART 1 Data Carrier Detect
+#define AT91C_PA26_TIOA2    ((unsigned int) AT91C_PIO_PA26) //  Timer Counter 2 Multipurpose Timer I/O Pin A
+#define AT91C_PIO_PA27       ((unsigned int) 1 << 27) // Pin Controlled by PA27
+#define AT91C_PA27_DTR1     ((unsigned int) AT91C_PIO_PA27) //  USART 1 Data Terminal ready
+#define AT91C_PA27_TIOB2    ((unsigned int) AT91C_PIO_PA27) //  Timer Counter 2 Multipurpose Timer I/O Pin B
+#define AT91C_PIO_PA28       ((unsigned int) 1 << 28) // Pin Controlled by PA28
+#define AT91C_PA28_DSR1     ((unsigned int) AT91C_PIO_PA28) //  USART 1 Data Set ready
+#define AT91C_PA28_TCLK1    ((unsigned int) AT91C_PIO_PA28) //  Timer Counter 1 external clock input
+#define AT91C_PIO_PA29       ((unsigned int) 1 << 29) // Pin Controlled by PA29
+#define AT91C_PA29_RI1      ((unsigned int) AT91C_PIO_PA29) //  USART 1 Ring Indicator
+#define AT91C_PA29_TCLK2    ((unsigned int) AT91C_PIO_PA29) //  Timer Counter 2 external clock input
+#define AT91C_PIO_PA3        ((unsigned int) 1 <<  3) // Pin Controlled by PA3
+#define AT91C_PA3_TWD      ((unsigned int) AT91C_PIO_PA3) //  TWI Two-wire Serial Data
+#define AT91C_PA3_NPCS3    ((unsigned int) AT91C_PIO_PA3) //  SPI Peripheral Chip Select 3
+#define AT91C_PIO_PA30       ((unsigned int) 1 << 30) // Pin Controlled by PA30
+#define AT91C_PA30_IRQ1     ((unsigned int) AT91C_PIO_PA30) //  External Interrupt 1
+#define AT91C_PA30_NPCS2    ((unsigned int) AT91C_PIO_PA30) //  SPI Peripheral Chip Select 2
+#define AT91C_PIO_PA31       ((unsigned int) 1 << 31) // Pin Controlled by PA31
+#define AT91C_PA31_NPCS1    ((unsigned int) AT91C_PIO_PA31) //  SPI Peripheral Chip Select 1
+#define AT91C_PA31_PCK2     ((unsigned int) AT91C_PIO_PA31) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PA4        ((unsigned int) 1 <<  4) // Pin Controlled by PA4
+#define AT91C_PA4_TWCK     ((unsigned int) AT91C_PIO_PA4) //  TWI Two-wire Serial Clock
+#define AT91C_PA4_TCLK0    ((unsigned int) AT91C_PIO_PA4) //  Timer Counter 0 external clock input
+#define AT91C_PIO_PA5        ((unsigned int) 1 <<  5) // Pin Controlled by PA5
+#define AT91C_PA5_RXD0     ((unsigned int) AT91C_PIO_PA5) //  USART 0 Receive Data
+#define AT91C_PA5_NPCS3    ((unsigned int) AT91C_PIO_PA5) //  SPI Peripheral Chip Select 3
+#define AT91C_PIO_PA6        ((unsigned int) 1 <<  6) // Pin Controlled by PA6
+#define AT91C_PA6_TXD0     ((unsigned int) AT91C_PIO_PA6) //  USART 0 Transmit Data
+#define AT91C_PA6_PCK0     ((unsigned int) AT91C_PIO_PA6) //  PMC Programmable Clock Output 0
+#define AT91C_PIO_PA7        ((unsigned int) 1 <<  7) // Pin Controlled by PA7
+#define AT91C_PA7_RTS0     ((unsigned int) AT91C_PIO_PA7) //  USART 0 Ready To Send
+#define AT91C_PA7_PWM3     ((unsigned int) AT91C_PIO_PA7) //  PWM Channel 3
+#define AT91C_PIO_PA8        ((unsigned int) 1 <<  8) // Pin Controlled by PA8
+#define AT91C_PA8_CTS0     ((unsigned int) AT91C_PIO_PA8) //  USART 0 Clear To Send
+#define AT91C_PA8_ADTRG    ((unsigned int) AT91C_PIO_PA8) //  ADC External Trigger
+#define AT91C_PIO_PA9        ((unsigned int) 1 <<  9) // Pin Controlled by PA9
+#define AT91C_PA9_DRXD     ((unsigned int) AT91C_PIO_PA9) //  DBGU Debug Receive Data
+#define AT91C_PA9_NPCS1    ((unsigned int) AT91C_PIO_PA9) //  SPI Peripheral Chip Select 1
+
+// *****************************************************************************
+//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7S64
+// *****************************************************************************
+#define AT91C_ID_FIQ    ((unsigned int)  0) // Advanced Interrupt Controller (FIQ)
+#define AT91C_ID_SYS    ((unsigned int)  1) // System Peripheral
+#define AT91C_ID_PIOA   ((unsigned int)  2) // Parallel IO Controller
+#define AT91C_ID_3_Reserved ((unsigned int)  3) // Reserved
+#define AT91C_ID_ADC    ((unsigned int)  4) // Analog-to-Digital Converter
+#define AT91C_ID_SPI    ((unsigned int)  5) // Serial Peripheral Interface
+#define AT91C_ID_US0    ((unsigned int)  6) // USART 0
+#define AT91C_ID_US1    ((unsigned int)  7) // USART 1
+#define AT91C_ID_SSC    ((unsigned int)  8) // Serial Synchronous Controller
+#define AT91C_ID_TWI    ((unsigned int)  9) // Two-Wire Interface
+#define AT91C_ID_PWMC   ((unsigned int) 10) // PWM Controller
+#define AT91C_ID_UDP    ((unsigned int) 11) // USB Device Port
+#define AT91C_ID_TC0    ((unsigned int) 12) // Timer Counter 0
+#define AT91C_ID_TC1    ((unsigned int) 13) // Timer Counter 1
+#define AT91C_ID_TC2    ((unsigned int) 14) // Timer Counter 2
+#define AT91C_ID_15_Reserved ((unsigned int) 15) // Reserved
+#define AT91C_ID_16_Reserved ((unsigned int) 16) // Reserved
+#define AT91C_ID_17_Reserved ((unsigned int) 17) // Reserved
+#define AT91C_ID_18_Reserved ((unsigned int) 18) // Reserved
+#define AT91C_ID_19_Reserved ((unsigned int) 19) // Reserved
+#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved
+#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved
+#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved
+#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved
+#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved
+#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved
+#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved
+#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved
+#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved
+#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved
+#define AT91C_ID_IRQ0   ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0)
+#define AT91C_ID_IRQ1   ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1)
+
+// *****************************************************************************
+//               BASE ADDRESS DEFINITIONS FOR AT91SAM7S64
+// *****************************************************************************
+#define AT91C_BASE_SYSC      ((AT91PS_SYSC)     0xFFFFF000) // (SYSC) Base Address
+#define AT91C_BASE_AIC       ((AT91PS_AIC)  0xFFFFF000) // (AIC) Base Address
+#define AT91C_BASE_DBGU      ((AT91PS_DBGU)     0xFFFFF200) // (DBGU) Base Address
+#define AT91C_BASE_PDC_DBGU  ((AT91PS_PDC)  0xFFFFF300) // (PDC_DBGU) Base Address
+#define AT91C_BASE_PIOA      ((AT91PS_PIO)  0xFFFFF400) // (PIOA) Base Address
+#define AT91C_BASE_CKGR      ((AT91PS_CKGR)     0xFFFFFC20) // (CKGR) Base Address
+#define AT91C_BASE_PMC       ((AT91PS_PMC)  0xFFFFFC00) // (PMC) Base Address
+#define AT91C_BASE_RSTC      ((AT91PS_RSTC)     0xFFFFFD00) // (RSTC) Base Address
+#define AT91C_BASE_RTTC      ((AT91PS_RTTC)     0xFFFFFD20) // (RTTC) Base Address
+#define AT91C_BASE_PITC      ((AT91PS_PITC)     0xFFFFFD30) // (PITC) Base Address
+#define AT91C_BASE_WDTC      ((AT91PS_WDTC)     0xFFFFFD40) // (WDTC) Base Address
+#define AT91C_BASE_MC        ((AT91PS_MC)   0xFFFFFF00) // (MC) Base Address
+#define AT91C_BASE_PDC_SPI   ((AT91PS_PDC)  0xFFFE0100) // (PDC_SPI) Base Address
+#define AT91C_BASE_SPI       ((AT91PS_SPI)  0xFFFE0000) // (SPI) Base Address
+#define AT91C_BASE_PDC_ADC   ((AT91PS_PDC)  0xFFFD8100) // (PDC_ADC) Base Address
+#define AT91C_BASE_ADC       ((AT91PS_ADC)  0xFFFD8000) // (ADC) Base Address
+#define AT91C_BASE_PDC_SSC   ((AT91PS_PDC)  0xFFFD4100) // (PDC_SSC) Base Address
+#define AT91C_BASE_SSC       ((AT91PS_SSC)  0xFFFD4000) // (SSC) Base Address
+#define AT91C_BASE_PDC_US1   ((AT91PS_PDC)  0xFFFC4100) // (PDC_US1) Base Address
+#define AT91C_BASE_US1       ((AT91PS_USART)    0xFFFC4000) // (US1) Base Address
+#define AT91C_BASE_PDC_US0   ((AT91PS_PDC)  0xFFFC0100) // (PDC_US0) Base Address
+#define AT91C_BASE_US0       ((AT91PS_USART)    0xFFFC0000) // (US0) Base Address
+#define AT91C_BASE_TWI       ((AT91PS_TWI)  0xFFFB8000) // (TWI) Base Address
+#define AT91C_BASE_TC2       ((AT91PS_TC)   0xFFFA0080) // (TC2) Base Address
+#define AT91C_BASE_TC1       ((AT91PS_TC)   0xFFFA0040) // (TC1) Base Address
+#define AT91C_BASE_TC0       ((AT91PS_TC)   0xFFFA0000) // (TC0) Base Address
+#define AT91C_BASE_TCB       ((AT91PS_TCB)  0xFFFA0000) // (TCB) Base Address
+#define AT91C_BASE_PWMC_CH3  ((AT91PS_PWMC_CH)  0xFFFCC260) // (PWMC_CH3) Base Address
+#define AT91C_BASE_PWMC_CH2  ((AT91PS_PWMC_CH)  0xFFFCC240) // (PWMC_CH2) Base Address
+#define AT91C_BASE_PWMC_CH1  ((AT91PS_PWMC_CH)  0xFFFCC220) // (PWMC_CH1) Base Address
+#define AT91C_BASE_PWMC_CH0  ((AT91PS_PWMC_CH)  0xFFFCC200) // (PWMC_CH0) Base Address
+#define AT91C_BASE_PWMC      ((AT91PS_PWMC)     0xFFFCC000) // (PWMC) Base Address
+#define AT91C_BASE_UDP       ((AT91PS_UDP)  0xFFFB0000) // (UDP) Base Address
+
+// *****************************************************************************
+//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7S64
+// *****************************************************************************
+#define AT91C_ISRAM  ((char *)  0x00200000) // Internal SRAM base address
+#define AT91C_ISRAM_SIZE     ((unsigned int) 0x00004000) // Internal SRAM size in byte (16 Kbyte)
+#define AT91C_IFLASH     ((char *)  0x00100000) // Internal ROM base address
+#define AT91C_IFLASH_SIZE    ((unsigned int) 0x00010000) // Internal ROM size in byte (64 Kbyte)
+
+#endif
diff --git a/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h b/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h
index 7d2657a..77e8669 100644
--- a/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h
+++ b/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h
@@ -1,1812 +1,1810 @@
-// ----------------------------------------------------------------------------

-//          ATMEL Microcontroller Software Support  -  ROUSSET  -

-// ----------------------------------------------------------------------------

-//  The software is delivered "AS IS" without warranty or condition of any

-//  kind, either express, implied or statutory. This includes without

-//  limitation any warranty or condition with respect to merchantability or

-//  fitness for any particular purpose, or against the infringements of

-//  intellectual property rights of others.

-// ----------------------------------------------------------------------------

-// File Name           : AT91SAM7S64.h

-// Object              : AT91SAM7S64 definitions

-// Generated           : AT91 SW Application Group  07/16/2004 (07:43:09)

-// 

-// CVS Reference       : /AT91SAM7S64.pl/1.12/Mon Jul 12 13:02:30 2004//

-// CVS Reference       : /SYSC_SAM7Sxx.pl/1.5/Mon Jul 12 16:22:12 2004//

-// CVS Reference       : /MC_SAM02.pl/1.3/Wed Mar 10 08:37:04 2004//

-// CVS Reference       : /UDP_1765B.pl/1.3/Fri Aug  2 14:45:38 2002//

-// CVS Reference       : /AIC_1796B.pl/1.1.1.1/Fri Jun 28 09:36:48 2002//

-// CVS Reference       : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004//

-// CVS Reference       : /PIO_1725D.pl/1.1.1.1/Fri Jun 28 09:36:48 2002//

-// CVS Reference       : /DBGU_1754A.pl/1.4/Fri Jan 31 12:18:24 2003//

-// CVS Reference       : /US_1739C.pl/1.2/Mon Jul 12 17:26:24 2004//

-// CVS Reference       : /SPI2.pl/1.2/Fri Oct 17 08:13:40 2003//

-// CVS Reference       : /SSC_1762A.pl/1.2/Fri Nov  8 13:26:40 2002//

-// CVS Reference       : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003//

-// CVS Reference       : /TWI_1761B.pl/1.4/Fri Feb  7 10:30:08 2003//

-// CVS Reference       : /PDC_1734B.pl/1.2/Thu Nov 21 16:38:24 2002//

-// CVS Reference       : /ADC_SAM.pl/1.7/Fri Oct 17 08:12:38 2003//

-// CVS Reference       : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004//

-// ----------------------------------------------------------------------------

-

-// Hardware register definition

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR System Peripherals

-// *****************************************************************************

-// *** Register offset in AT91S_SYSC structure ***

-#define SYSC_AIC_SMR    ( 0) // Source Mode Register

-#define SYSC_AIC_SVR    (128) // Source Vector Register

-#define SYSC_AIC_IVR    (256) // IRQ Vector Register

-#define SYSC_AIC_FVR    (260) // FIQ Vector Register

-#define SYSC_AIC_ISR    (264) // Interrupt Status Register

-#define SYSC_AIC_IPR    (268) // Interrupt Pending Register

-#define SYSC_AIC_IMR    (272) // Interrupt Mask Register

-#define SYSC_AIC_CISR   (276) // Core Interrupt Status Register

-#define SYSC_AIC_IECR   (288) // Interrupt Enable Command Register

-#define SYSC_AIC_IDCR   (292) // Interrupt Disable Command Register

-#define SYSC_AIC_ICCR   (296) // Interrupt Clear Command Register

-#define SYSC_AIC_ISCR   (300) // Interrupt Set Command Register

-#define SYSC_AIC_EOICR  (304) // End of Interrupt Command Register

-#define SYSC_AIC_SPU    (308) // Spurious Vector Register

-#define SYSC_AIC_DCR    (312) // Debug Control Register (Protect)

-#define SYSC_AIC_FFER   (320) // Fast Forcing Enable Register

-#define SYSC_AIC_FFDR   (324) // Fast Forcing Disable Register

-#define SYSC_AIC_FFSR   (328) // Fast Forcing Status Register

-#define SYSC_DBGU_CR    (512) // Control Register

-#define SYSC_DBGU_MR    (516) // Mode Register

-#define SYSC_DBGU_IER   (520) // Interrupt Enable Register

-#define SYSC_DBGU_IDR   (524) // Interrupt Disable Register

-#define SYSC_DBGU_IMR   (528) // Interrupt Mask Register

-#define SYSC_DBGU_CSR   (532) // Channel Status Register

-#define SYSC_DBGU_RHR   (536) // Receiver Holding Register

-#define SYSC_DBGU_THR   (540) // Transmitter Holding Register

-#define SYSC_DBGU_BRGR  (544) // Baud Rate Generator Register

-#define SYSC_DBGU_C1R   (576) // Chip ID1 Register

-#define SYSC_DBGU_C2R   (580) // Chip ID2 Register

-#define SYSC_DBGU_FNTR  (584) // Force NTRST Register

-#define SYSC_DBGU_RPR   (768) // Receive Pointer Register

-#define SYSC_DBGU_RCR   (772) // Receive Counter Register

-#define SYSC_DBGU_TPR   (776) // Transmit Pointer Register

-#define SYSC_DBGU_TCR   (780) // Transmit Counter Register

-#define SYSC_DBGU_RNPR  (784) // Receive Next Pointer Register

-#define SYSC_DBGU_RNCR  (788) // Receive Next Counter Register

-#define SYSC_DBGU_TNPR  (792) // Transmit Next Pointer Register

-#define SYSC_DBGU_TNCR  (796) // Transmit Next Counter Register

-#define SYSC_DBGU_PTCR  (800) // PDC Transfer Control Register

-#define SYSC_DBGU_PTSR  (804) // PDC Transfer Status Register

-#define SYSC_PIOA_PER   (1024) // PIO Enable Register

-#define SYSC_PIOA_PDR   (1028) // PIO Disable Register

-#define SYSC_PIOA_PSR   (1032) // PIO Status Register

-#define SYSC_PIOA_OER   (1040) // Output Enable Register

-#define SYSC_PIOA_ODR   (1044) // Output Disable Registerr

-#define SYSC_PIOA_OSR   (1048) // Output Status Register

-#define SYSC_PIOA_IFER  (1056) // Input Filter Enable Register

-#define SYSC_PIOA_IFDR  (1060) // Input Filter Disable Register

-#define SYSC_PIOA_IFSR  (1064) // Input Filter Status Register

-#define SYSC_PIOA_SODR  (1072) // Set Output Data Register

-#define SYSC_PIOA_CODR  (1076) // Clear Output Data Register

-#define SYSC_PIOA_ODSR  (1080) // Output Data Status Register

-#define SYSC_PIOA_PDSR  (1084) // Pin Data Status Register

-#define SYSC_PIOA_IER   (1088) // Interrupt Enable Register

-#define SYSC_PIOA_IDR   (1092) // Interrupt Disable Register

-#define SYSC_PIOA_IMR   (1096) // Interrupt Mask Register

-#define SYSC_PIOA_ISR   (1100) // Interrupt Status Register

-#define SYSC_PIOA_MDER  (1104) // Multi-driver Enable Register

-#define SYSC_PIOA_MDDR  (1108) // Multi-driver Disable Register

-#define SYSC_PIOA_MDSR  (1112) // Multi-driver Status Register

-#define SYSC_PIOA_PPUDR (1120) // Pull-up Disable Register

-#define SYSC_PIOA_PPUER (1124) // Pull-up Enable Register

-#define SYSC_PIOA_PPUSR (1128) // Pad Pull-up Status Register

-#define SYSC_PIOA_ASR   (1136) // Select A Register

-#define SYSC_PIOA_BSR   (1140) // Select B Register

-#define SYSC_PIOA_ABSR  (1144) // AB Select Status Register

-#define SYSC_PIOA_OWER  (1184) // Output Write Enable Register

-#define SYSC_PIOA_OWDR  (1188) // Output Write Disable Register

-#define SYSC_PIOA_OWSR  (1192) // Output Write Status Register

-#define SYSC_PMC_SCER   (3072) // System Clock Enable Register

-#define SYSC_PMC_SCDR   (3076) // System Clock Disable Register

-#define SYSC_PMC_SCSR   (3080) // System Clock Status Register

-#define SYSC_PMC_PCER   (3088) // Peripheral Clock Enable Register

-#define SYSC_PMC_PCDR   (3092) // Peripheral Clock Disable Register

-#define SYSC_PMC_PCSR   (3096) // Peripheral Clock Status Register

-#define SYSC_PMC_MOR    (3104) // Main Oscillator Register

-#define SYSC_PMC_MCFR   (3108) // Main Clock  Frequency Register

-#define SYSC_PMC_PLLR   (3116) // PLL Register

-#define SYSC_PMC_MCKR   (3120) // Master Clock Register

-#define SYSC_PMC_PCKR   (3136) // Programmable Clock Register

-#define SYSC_PMC_IER    (3168) // Interrupt Enable Register

-#define SYSC_PMC_IDR    (3172) // Interrupt Disable Register

-#define SYSC_PMC_SR     (3176) // Status Register

-#define SYSC_PMC_IMR    (3180) // Interrupt Mask Register

-#define SYSC_RSTC_RCR   (3328) // Reset Control Register

-#define SYSC_RSTC_RSR   (3332) // Reset Status Register

-#define SYSC_RSTC_RMR   (3336) // Reset Mode Register

-#define SYSC_RTTC_RTMR  (3360) // Real-time Mode Register

-#define SYSC_RTTC_RTAR  (3364) // Real-time Alarm Register

-#define SYSC_RTTC_RTVR  (3368) // Real-time Value Register

-#define SYSC_RTTC_RTSR  (3372) // Real-time Status Register

-#define SYSC_PITC_PIMR  (3376) // Period Interval Mode Register

-#define SYSC_PITC_PISR  (3380) // Period Interval Status Register

-#define SYSC_PITC_PIVR  (3384) // Period Interval Value Register

-#define SYSC_PITC_PIIR  (3388) // Period Interval Image Register

-#define SYSC_WDTC_WDCR  (3392) // Watchdog Control Register

-#define SYSC_WDTC_WDMR  (3396) // Watchdog Mode Register

-#define SYSC_WDTC_WDSR  (3400) // Watchdog Status Register

-#define SYSC_SYSC_VRPM  (3424) // Voltage Regulator Power Mode Register

-// -------- VRPM : (SYSC Offset: 0xd60) Voltage Regulator Power Mode Register -------- 

-#define AT91C_SYSC_PSTDBY         (0x1 <<  0) // (SYSC) Voltage Regulator Power Mode

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller

-// *****************************************************************************

-// *** Register offset in AT91S_AIC structure ***

-#define AIC_SMR         ( 0) // Source Mode Register

-#define AIC_SVR         (128) // Source Vector Register

-#define AIC_IVR         (256) // IRQ Vector Register

-#define AIC_FVR         (260) // FIQ Vector Register

-#define AIC_ISR         (264) // Interrupt Status Register

-#define AIC_IPR         (268) // Interrupt Pending Register

-#define AIC_IMR         (272) // Interrupt Mask Register

-#define AIC_CISR        (276) // Core Interrupt Status Register

-#define AIC_IECR        (288) // Interrupt Enable Command Register

-#define AIC_IDCR        (292) // Interrupt Disable Command Register

-#define AIC_ICCR        (296) // Interrupt Clear Command Register

-#define AIC_ISCR        (300) // Interrupt Set Command Register

-#define AIC_EOICR       (304) // End of Interrupt Command Register

-#define AIC_SPU         (308) // Spurious Vector Register

-#define AIC_DCR         (312) // Debug Control Register (Protect)

-#define AIC_FFER        (320) // Fast Forcing Enable Register

-#define AIC_FFDR        (324) // Fast Forcing Disable Register

-#define AIC_FFSR        (328) // Fast Forcing Status Register

-// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- 

-#define AT91C_AIC_PRIOR           (0x7 <<  0) // (AIC) Priority Level

-#define 	AT91C_AIC_PRIOR_LOWEST               (0x0) // (AIC) Lowest priority level

-#define 	AT91C_AIC_PRIOR_HIGHEST              (0x7) // (AIC) Highest priority level

-#define AT91C_AIC_SRCTYPE         (0x3 <<  5) // (AIC) Interrupt Source Type

-#define 	AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE  (0x0 <<  5) // (AIC) Internal Sources Code Label Level Sensitive

-#define 	AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED   (0x1 <<  5) // (AIC) Internal Sources Code Label Edge triggered

-#define 	AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL       (0x2 <<  5) // (AIC) External Sources Code Label High-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE    (0x3 <<  5) // (AIC) External Sources Code Label Positive Edge triggered

-// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- 

-#define AT91C_AIC_NFIQ            (0x1 <<  0) // (AIC) NFIQ Status

-#define AT91C_AIC_NIRQ            (0x1 <<  1) // (AIC) NIRQ Status

-// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- 

-#define AT91C_AIC_DCR_PROT        (0x1 <<  0) // (AIC) Protection Mode

-#define AT91C_AIC_DCR_GMSK        (0x1 <<  1) // (AIC) General Mask

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Debug Unit

-// *****************************************************************************

-// *** Register offset in AT91S_DBGU structure ***

-#define DBGU_CR         ( 0) // Control Register

-#define DBGU_MR         ( 4) // Mode Register

-#define DBGU_IER        ( 8) // Interrupt Enable Register

-#define DBGU_IDR        (12) // Interrupt Disable Register

-#define DBGU_IMR        (16) // Interrupt Mask Register

-#define DBGU_CSR        (20) // Channel Status Register

-#define DBGU_RHR        (24) // Receiver Holding Register

-#define DBGU_THR        (28) // Transmitter Holding Register

-#define DBGU_BRGR       (32) // Baud Rate Generator Register

-#define DBGU_C1R        (64) // Chip ID1 Register

-#define DBGU_C2R        (68) // Chip ID2 Register

-#define DBGU_FNTR       (72) // Force NTRST Register

-#define DBGU_RPR        (256) // Receive Pointer Register

-#define DBGU_RCR        (260) // Receive Counter Register

-#define DBGU_TPR        (264) // Transmit Pointer Register

-#define DBGU_TCR        (268) // Transmit Counter Register

-#define DBGU_RNPR       (272) // Receive Next Pointer Register

-#define DBGU_RNCR       (276) // Receive Next Counter Register

-#define DBGU_TNPR       (280) // Transmit Next Pointer Register

-#define DBGU_TNCR       (284) // Transmit Next Counter Register

-#define DBGU_PTCR       (288) // PDC Transfer Control Register

-#define DBGU_PTSR       (292) // PDC Transfer Status Register

-// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_RSTRX            (0x1 <<  2) // (DBGU) Reset Receiver

-#define AT91C_US_RSTTX            (0x1 <<  3) // (DBGU) Reset Transmitter

-#define AT91C_US_RXEN             (0x1 <<  4) // (DBGU) Receiver Enable

-#define AT91C_US_RXDIS            (0x1 <<  5) // (DBGU) Receiver Disable

-#define AT91C_US_TXEN             (0x1 <<  6) // (DBGU) Transmitter Enable

-#define AT91C_US_TXDIS            (0x1 <<  7) // (DBGU) Transmitter Disable

-// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_PAR              (0x7 <<  9) // (DBGU) Parity type

-#define 	AT91C_US_PAR_EVEN                 (0x0 <<  9) // (DBGU) Even Parity

-#define 	AT91C_US_PAR_ODD                  (0x1 <<  9) // (DBGU) Odd Parity

-#define 	AT91C_US_PAR_SPACE                (0x2 <<  9) // (DBGU) Parity forced to 0 (Space)

-#define 	AT91C_US_PAR_MARK                 (0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)

-#define 	AT91C_US_PAR_NONE                 (0x4 <<  9) // (DBGU) No Parity

-#define 	AT91C_US_PAR_MULTI_DROP           (0x6 <<  9) // (DBGU) Multi-drop mode

-#define AT91C_US_CHMODE           (0x3 << 14) // (DBGU) Channel Mode

-#define 	AT91C_US_CHMODE_NORMAL               (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.

-#define 	AT91C_US_CHMODE_AUTO                 (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.

-#define 	AT91C_US_CHMODE_LOCAL                (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.

-#define 	AT91C_US_CHMODE_REMOTE               (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.

-// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXRDY            (0x1 <<  0) // (DBGU) RXRDY Interrupt

-#define AT91C_US_TXRDY            (0x1 <<  1) // (DBGU) TXRDY Interrupt

-#define AT91C_US_ENDRX            (0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt

-#define AT91C_US_ENDTX            (0x1 <<  4) // (DBGU) End of Transmit Interrupt

-#define AT91C_US_OVRE             (0x1 <<  5) // (DBGU) Overrun Interrupt

-#define AT91C_US_FRAME            (0x1 <<  6) // (DBGU) Framing Error Interrupt

-#define AT91C_US_PARE             (0x1 <<  7) // (DBGU) Parity Error Interrupt

-#define AT91C_US_TXEMPTY          (0x1 <<  9) // (DBGU) TXEMPTY Interrupt

-#define AT91C_US_TXBUFE           (0x1 << 11) // (DBGU) TXBUFE Interrupt

-#define AT91C_US_RXBUFF           (0x1 << 12) // (DBGU) RXBUFF Interrupt

-#define AT91C_US_COMM_TX          (0x1 << 30) // (DBGU) COMM_TX Interrupt

-#define AT91C_US_COMM_RX          (0x1 << 31) // (DBGU) COMM_RX Interrupt

-// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- 

-// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- 

-#define AT91C_US_FORCE_NTRST      (0x1 <<  0) // (DBGU) Force NTRST in JTAG

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Peripheral Data Controller

-// *****************************************************************************

-// *** Register offset in AT91S_PDC structure ***

-#define PDC_RPR         ( 0) // Receive Pointer Register

-#define PDC_RCR         ( 4) // Receive Counter Register

-#define PDC_TPR         ( 8) // Transmit Pointer Register

-#define PDC_TCR         (12) // Transmit Counter Register

-#define PDC_RNPR        (16) // Receive Next Pointer Register

-#define PDC_RNCR        (20) // Receive Next Counter Register

-#define PDC_TNPR        (24) // Transmit Next Pointer Register

-#define PDC_TNCR        (28) // Transmit Next Counter Register

-#define PDC_PTCR        (32) // PDC Transfer Control Register

-#define PDC_PTSR        (36) // PDC Transfer Status Register

-// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- 

-#define AT91C_PDC_RXTEN           (0x1 <<  0) // (PDC) Receiver Transfer Enable

-#define AT91C_PDC_RXTDIS          (0x1 <<  1) // (PDC) Receiver Transfer Disable

-#define AT91C_PDC_TXTEN           (0x1 <<  8) // (PDC) Transmitter Transfer Enable

-#define AT91C_PDC_TXTDIS          (0x1 <<  9) // (PDC) Transmitter Transfer Disable

-// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler

-// *****************************************************************************

-// *** Register offset in AT91S_PIO structure ***

-#define PIO_PER         ( 0) // PIO Enable Register

-#define PIO_PDR         ( 4) // PIO Disable Register

-#define PIO_PSR         ( 8) // PIO Status Register

-#define PIO_OER         (16) // Output Enable Register

-#define PIO_ODR         (20) // Output Disable Registerr

-#define PIO_OSR         (24) // Output Status Register

-#define PIO_IFER        (32) // Input Filter Enable Register

-#define PIO_IFDR        (36) // Input Filter Disable Register

-#define PIO_IFSR        (40) // Input Filter Status Register

-#define PIO_SODR        (48) // Set Output Data Register

-#define PIO_CODR        (52) // Clear Output Data Register

-#define PIO_ODSR        (56) // Output Data Status Register

-#define PIO_PDSR        (60) // Pin Data Status Register

-#define PIO_IER         (64) // Interrupt Enable Register

-#define PIO_IDR         (68) // Interrupt Disable Register

-#define PIO_IMR         (72) // Interrupt Mask Register

-#define PIO_ISR         (76) // Interrupt Status Register

-#define PIO_MDER        (80) // Multi-driver Enable Register

-#define PIO_MDDR        (84) // Multi-driver Disable Register

-#define PIO_MDSR        (88) // Multi-driver Status Register

-#define PIO_PPUDR       (96) // Pull-up Disable Register

-#define PIO_PPUER       (100) // Pull-up Enable Register

-#define PIO_PPUSR       (104) // Pad Pull-up Status Register

-#define PIO_ASR         (112) // Select A Register

-#define PIO_BSR         (116) // Select B Register

-#define PIO_ABSR        (120) // AB Select Status Register

-#define PIO_OWER        (160) // Output Write Enable Register

-#define PIO_OWDR        (164) // Output Write Disable Register

-#define PIO_OWSR        (168) // Output Write Status Register

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Clock Generator Controler

-// *****************************************************************************

-// *** Register offset in AT91S_CKGR structure ***

-#define CKGR_MOR        ( 0) // Main Oscillator Register

-#define CKGR_MCFR       ( 4) // Main Clock  Frequency Register

-#define CKGR_PLLR       (12) // PLL Register

-// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- 

-#define AT91C_CKGR_MOSCEN         (0x1 <<  0) // (CKGR) Main Oscillator Enable

-#define AT91C_CKGR_OSCBYPASS      (0x1 <<  1) // (CKGR) Main Oscillator Bypass

-#define AT91C_CKGR_OSCOUNT        (0xFF <<  8) // (CKGR) Main Oscillator Start-up Time

-// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- 

-#define AT91C_CKGR_MAINF          (0xFFFF <<  0) // (CKGR) Main Clock Frequency

-#define AT91C_CKGR_MAINRDY        (0x1 << 16) // (CKGR) Main Clock Ready

-// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- 

-#define AT91C_CKGR_DIV            (0xFF <<  0) // (CKGR) Divider Selected

-#define 	AT91C_CKGR_DIV_0                    (0x0) // (CKGR) Divider output is 0

-#define 	AT91C_CKGR_DIV_BYPASS               (0x1) // (CKGR) Divider is bypassed

-#define AT91C_CKGR_PLLCOUNT       (0x3F <<  8) // (CKGR) PLL Counter

-#define AT91C_CKGR_OUT            (0x3 << 14) // (CKGR) PLL Output Frequency Range

-#define 	AT91C_CKGR_OUT_0                    (0x0 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_1                    (0x1 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_2                    (0x2 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_3                    (0x3 << 14) // (CKGR) Please refer to the PLL datasheet

-#define AT91C_CKGR_MUL            (0x7FF << 16) // (CKGR) PLL Multiplier

-#define AT91C_CKGR_USBDIV         (0x3 << 28) // (CKGR) Divider for USB Clocks

-#define 	AT91C_CKGR_USBDIV_0                    (0x0 << 28) // (CKGR) Divider output is PLL clock output

-#define 	AT91C_CKGR_USBDIV_1                    (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2

-#define 	AT91C_CKGR_USBDIV_2                    (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Power Management Controler

-// *****************************************************************************

-// *** Register offset in AT91S_PMC structure ***

-#define PMC_SCER        ( 0) // System Clock Enable Register

-#define PMC_SCDR        ( 4) // System Clock Disable Register

-#define PMC_SCSR        ( 8) // System Clock Status Register

-#define PMC_PCER        (16) // Peripheral Clock Enable Register

-#define PMC_PCDR        (20) // Peripheral Clock Disable Register

-#define PMC_PCSR        (24) // Peripheral Clock Status Register

-#define PMC_MOR         (32) // Main Oscillator Register

-#define PMC_MCFR        (36) // Main Clock  Frequency Register

-#define PMC_PLLR        (44) // PLL Register

-#define PMC_MCKR        (48) // Master Clock Register

-#define PMC_PCKR        (64) // Programmable Clock Register

-#define PMC_IER         (96) // Interrupt Enable Register

-#define PMC_IDR         (100) // Interrupt Disable Register

-#define PMC_SR          (104) // Status Register

-#define PMC_IMR         (108) // Interrupt Mask Register

-// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- 

-#define AT91C_PMC_PCK             (0x1 <<  0) // (PMC) Processor Clock

-#define AT91C_PMC_UDP             (0x1 <<  7) // (PMC) USB Device Port Clock

-#define AT91C_PMC_PCK0            (0x1 <<  8) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK1            (0x1 <<  9) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK2            (0x1 << 10) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK3            (0x1 << 11) // (PMC) Programmable Clock Output

-// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- 

-// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- 

-// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- 

-// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- 

-// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- 

-// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- 

-#define AT91C_PMC_CSS             (0x3 <<  0) // (PMC) Programmable Clock Selection

-#define 	AT91C_PMC_CSS_SLOW_CLK             (0x0) // (PMC) Slow Clock is selected

-#define 	AT91C_PMC_CSS_MAIN_CLK             (0x1) // (PMC) Main Clock is selected

-#define 	AT91C_PMC_CSS_PLL_CLK              (0x3) // (PMC) Clock from PLL is selected

-#define AT91C_PMC_PRES            (0x7 <<  2) // (PMC) Programmable Clock Prescaler

-#define 	AT91C_PMC_PRES_CLK                  (0x0 <<  2) // (PMC) Selected clock

-#define 	AT91C_PMC_PRES_CLK_2                (0x1 <<  2) // (PMC) Selected clock divided by 2

-#define 	AT91C_PMC_PRES_CLK_4                (0x2 <<  2) // (PMC) Selected clock divided by 4

-#define 	AT91C_PMC_PRES_CLK_8                (0x3 <<  2) // (PMC) Selected clock divided by 8

-#define 	AT91C_PMC_PRES_CLK_16               (0x4 <<  2) // (PMC) Selected clock divided by 16

-#define 	AT91C_PMC_PRES_CLK_32               (0x5 <<  2) // (PMC) Selected clock divided by 32

-#define 	AT91C_PMC_PRES_CLK_64               (0x6 <<  2) // (PMC) Selected clock divided by 64

-// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- 

-// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- 

-#define AT91C_PMC_MOSCS           (0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask

-#define AT91C_PMC_LOCK            (0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask

-#define AT91C_PMC_MCKRDY          (0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK0RDY         (0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK1RDY         (0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK2RDY         (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK3RDY         (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask

-// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- 

-// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- 

-// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Reset Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_RSTC structure ***

-#define RSTC_RCR        ( 0) // Reset Control Register

-#define RSTC_RSR        ( 4) // Reset Status Register

-#define RSTC_RMR        ( 8) // Reset Mode Register

-// -------- SYSC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- 

-#define AT91C_SYSC_PROCRST        (0x1 <<  0) // (RSTC) Processor Reset

-#define AT91C_SYSC_ICERST         (0x1 <<  1) // (RSTC) ICE Interface Reset

-#define AT91C_SYSC_PERRST         (0x1 <<  2) // (RSTC) Peripheral Reset

-#define AT91C_SYSC_EXTRST         (0x1 <<  3) // (RSTC) External Reset

-#define AT91C_SYSC_KEY            (0xFF << 24) // (RSTC) Password

-// -------- SYSC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- 

-#define AT91C_SYSC_URSTS          (0x1 <<  0) // (RSTC) User Reset Status

-#define AT91C_SYSC_BODSTS         (0x1 <<  1) // (RSTC) Brown-out Detection Status

-#define AT91C_SYSC_RSTTYP         (0x7 <<  8) // (RSTC) Reset Type

-#define 	AT91C_SYSC_RSTTYP_POWERUP              (0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.

-#define 	AT91C_SYSC_RSTTYP_WATCHDOG             (0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.

-#define 	AT91C_SYSC_RSTTYP_SOFTWARE             (0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.

-#define 	AT91C_SYSC_RSTTYP_USER                 (0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.

-#define 	AT91C_SYSC_RSTTYP_BROWNOUT             (0x5 <<  8) // (RSTC) Brown-out Reset.

-#define AT91C_SYSC_NRSTL          (0x1 << 16) // (RSTC) NRST pin level

-#define AT91C_SYSC_SRCMP          (0x1 << 17) // (RSTC) Software Reset Command in Progress.

-// -------- SYSC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- 

-#define AT91C_SYSC_URSTEN         (0x1 <<  0) // (RSTC) User Reset Enable

-#define AT91C_SYSC_URSTIEN        (0x1 <<  4) // (RSTC) User Reset Interrupt Enable

-#define AT91C_SYSC_ERSTL          (0xF <<  8) // (RSTC) User Reset Enable

-#define AT91C_SYSC_BODIEN         (0x1 << 16) // (RSTC) Brown-out Detection Interrupt Enable

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_RTTC structure ***

-#define RTTC_RTMR       ( 0) // Real-time Mode Register

-#define RTTC_RTAR       ( 4) // Real-time Alarm Register

-#define RTTC_RTVR       ( 8) // Real-time Value Register

-#define RTTC_RTSR       (12) // Real-time Status Register

-// -------- SYSC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- 

-#define AT91C_SYSC_RTPRES         (0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value

-#define AT91C_SYSC_ALMIEN         (0x1 << 16) // (RTTC) Alarm Interrupt Enable

-#define AT91C_SYSC_RTTINCIEN      (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable

-#define AT91C_SYSC_RTTRST         (0x1 << 18) // (RTTC) Real Time Timer Restart

-// -------- SYSC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- 

-#define AT91C_SYSC_ALMV           (0x0 <<  0) // (RTTC) Alarm Value

-// -------- SYSC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- 

-#define AT91C_SYSC_CRTV           (0x0 <<  0) // (RTTC) Current Real-time Value

-// -------- SYSC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- 

-#define AT91C_SYSC_ALMS           (0x1 <<  0) // (RTTC) Real-time Alarm Status

-#define AT91C_SYSC_RTTINC         (0x1 <<  1) // (RTTC) Real-time Timer Increment

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_PITC structure ***

-#define PITC_PIMR       ( 0) // Period Interval Mode Register

-#define PITC_PISR       ( 4) // Period Interval Status Register

-#define PITC_PIVR       ( 8) // Period Interval Value Register

-#define PITC_PIIR       (12) // Period Interval Image Register

-// -------- SYSC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- 

-#define AT91C_SYSC_PIV            (0xFFFFF <<  0) // (PITC) Periodic Interval Value

-#define AT91C_SYSC_PITEN          (0x1 << 24) // (PITC) Periodic Interval Timer Enabled

-#define AT91C_SYSC_PITIEN         (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable

-// -------- SYSC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- 

-#define AT91C_SYSC_PITS           (0x1 <<  0) // (PITC) Periodic Interval Timer Status

-// -------- SYSC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- 

-#define AT91C_SYSC_CPIV           (0xFFFFF <<  0) // (PITC) Current Periodic Interval Value

-#define AT91C_SYSC_PICNT          (0xFFF << 20) // (PITC) Periodic Interval Counter

-// -------- SYSC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_WDTC structure ***

-#define WDTC_WDCR       ( 0) // Watchdog Control Register

-#define WDTC_WDMR       ( 4) // Watchdog Mode Register

-#define WDTC_WDSR       ( 8) // Watchdog Status Register

-// -------- SYSC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- 

-#define AT91C_SYSC_WDRSTT         (0x1 <<  0) // (WDTC) Watchdog Restart

-// -------- SYSC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- 

-#define AT91C_SYSC_WDV            (0xFFF <<  0) // (WDTC) Watchdog Timer Restart

-#define AT91C_SYSC_WDFIEN         (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable

-#define AT91C_SYSC_WDRSTEN        (0x1 << 13) // (WDTC) Watchdog Reset Enable

-#define AT91C_SYSC_WDRPROC        (0x1 << 14) // (WDTC) Watchdog Timer Restart

-#define AT91C_SYSC_WDDIS          (0x1 << 15) // (WDTC) Watchdog Disable

-#define AT91C_SYSC_WDD            (0xFFF << 16) // (WDTC) Watchdog Delta Value

-#define AT91C_SYSC_WDDBGHLT       (0x1 << 28) // (WDTC) Watchdog Debug Halt

-#define AT91C_SYSC_WDIDLEHLT      (0x1 << 29) // (WDTC) Watchdog Idle Halt

-// -------- SYSC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- 

-#define AT91C_SYSC_WDUNF          (0x1 <<  0) // (WDTC) Watchdog Underflow

-#define AT91C_SYSC_WDERR          (0x1 <<  1) // (WDTC) Watchdog Error

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Memory Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_MC structure ***

-#define MC_RCR          ( 0) // MC Remap Control Register

-#define MC_ASR          ( 4) // MC Abort Status Register

-#define MC_AASR         ( 8) // MC Abort Address Status Register

-#define MC_FMR          (96) // MC Flash Mode Register

-#define MC_FCR          (100) // MC Flash Command Register

-#define MC_FSR          (104) // MC Flash Status Register

-// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- 

-#define AT91C_MC_RCB              (0x1 <<  0) // (MC) Remap Command Bit

-// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- 

-#define AT91C_MC_UNDADD           (0x1 <<  0) // (MC) Undefined Addess Abort Status

-#define AT91C_MC_MISADD           (0x1 <<  1) // (MC) Misaligned Addess Abort Status

-#define AT91C_MC_ABTSZ            (0x3 <<  8) // (MC) Abort Size Status

-#define 	AT91C_MC_ABTSZ_BYTE                 (0x0 <<  8) // (MC) Byte

-#define 	AT91C_MC_ABTSZ_HWORD                (0x1 <<  8) // (MC) Half-word

-#define 	AT91C_MC_ABTSZ_WORD                 (0x2 <<  8) // (MC) Word

-#define AT91C_MC_ABTTYP           (0x3 << 10) // (MC) Abort Type Status

-#define 	AT91C_MC_ABTTYP_DATAR                (0x0 << 10) // (MC) Data Read

-#define 	AT91C_MC_ABTTYP_DATAW                (0x1 << 10) // (MC) Data Write

-#define 	AT91C_MC_ABTTYP_FETCH                (0x2 << 10) // (MC) Code Fetch

-#define AT91C_MC_MST0             (0x1 << 16) // (MC) Master 0 Abort Source

-#define AT91C_MC_MST1             (0x1 << 17) // (MC) Master 1 Abort Source

-#define AT91C_MC_SVMST0           (0x1 << 24) // (MC) Saved Master 0 Abort Source

-#define AT91C_MC_SVMST1           (0x1 << 25) // (MC) Saved Master 1 Abort Source

-// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- 

-#define AT91C_MC_FRDY             (0x1 <<  0) // (MC) Flash Ready

-#define AT91C_MC_LOCKE            (0x1 <<  2) // (MC) Lock Error

-#define AT91C_MC_PROGE            (0x1 <<  3) // (MC) Programming Error

-#define AT91C_MC_NEBP             (0x1 <<  7) // (MC) No Erase Before Programming

-#define AT91C_MC_FWS              (0x3 <<  8) // (MC) Flash Wait State

-#define 	AT91C_MC_FWS_0FWS                 (0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations

-#define 	AT91C_MC_FWS_1FWS                 (0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations

-#define 	AT91C_MC_FWS_2FWS                 (0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations

-#define 	AT91C_MC_FWS_3FWS                 (0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations

-#define AT91C_MC_FMCN             (0xFF << 16) // (MC) Flash Microsecond Cycle Number

-// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- 

-#define AT91C_MC_FCMD             (0xF <<  0) // (MC) Flash Command

-#define 	AT91C_MC_FCMD_START_PROG           (0x1) // (MC) Starts the programming of th epage specified by PAGEN.

-#define 	AT91C_MC_FCMD_LOCK                 (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_PROG_AND_LOCK        (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.

-#define 	AT91C_MC_FCMD_UNLOCK               (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_ERASE_ALL            (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.

-#define 	AT91C_MC_FCMD_SET_GP_NVM           (0xB) // (MC) Set General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_CLR_GP_NVM           (0xD) // (MC) Clear General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_SET_SECURITY         (0xF) // (MC) Set Security Bit.

-#define AT91C_MC_PAGEN            (0x3FF <<  8) // (MC) Page Number

-#define AT91C_MC_KEY              (0xFF << 24) // (MC) Writing Protect Key

-// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- 

-#define AT91C_MC_SECURITY         (0x1 <<  4) // (MC) Security Bit Status

-#define AT91C_MC_GPNVM0           (0x1 <<  8) // (MC) Sector 0 Lock Status

-#define AT91C_MC_GPNVM1           (0x1 <<  9) // (MC) Sector 1 Lock Status

-#define AT91C_MC_GPNVM2           (0x1 << 10) // (MC) Sector 2 Lock Status

-#define AT91C_MC_GPNVM3           (0x1 << 11) // (MC) Sector 3 Lock Status

-#define AT91C_MC_GPNVM4           (0x1 << 12) // (MC) Sector 4 Lock Status

-#define AT91C_MC_GPNVM5           (0x1 << 13) // (MC) Sector 5 Lock Status

-#define AT91C_MC_GPNVM6           (0x1 << 14) // (MC) Sector 6 Lock Status

-#define AT91C_MC_GPNVM7           (0x1 << 15) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS0           (0x1 << 16) // (MC) Sector 0 Lock Status

-#define AT91C_MC_LOCKS1           (0x1 << 17) // (MC) Sector 1 Lock Status

-#define AT91C_MC_LOCKS2           (0x1 << 18) // (MC) Sector 2 Lock Status

-#define AT91C_MC_LOCKS3           (0x1 << 19) // (MC) Sector 3 Lock Status

-#define AT91C_MC_LOCKS4           (0x1 << 20) // (MC) Sector 4 Lock Status

-#define AT91C_MC_LOCKS5           (0x1 << 21) // (MC) Sector 5 Lock Status

-#define AT91C_MC_LOCKS6           (0x1 << 22) // (MC) Sector 6 Lock Status

-#define AT91C_MC_LOCKS7           (0x1 << 23) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS8           (0x1 << 24) // (MC) Sector 8 Lock Status

-#define AT91C_MC_LOCKS9           (0x1 << 25) // (MC) Sector 9 Lock Status

-#define AT91C_MC_LOCKS10          (0x1 << 26) // (MC) Sector 10 Lock Status

-#define AT91C_MC_LOCKS11          (0x1 << 27) // (MC) Sector 11 Lock Status

-#define AT91C_MC_LOCKS12          (0x1 << 28) // (MC) Sector 12 Lock Status

-#define AT91C_MC_LOCKS13          (0x1 << 29) // (MC) Sector 13 Lock Status

-#define AT91C_MC_LOCKS14          (0x1 << 30) // (MC) Sector 14 Lock Status

-#define AT91C_MC_LOCKS15          (0x1 << 31) // (MC) Sector 15 Lock Status

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface

-// *****************************************************************************

-// *** Register offset in AT91S_SPI structure ***

-#define SPI_CR          ( 0) // Control Register

-#define SPI_MR          ( 4) // Mode Register

-#define SPI_RDR         ( 8) // Receive Data Register

-#define SPI_TDR         (12) // Transmit Data Register

-#define SPI_SR          (16) // Status Register

-#define SPI_IER         (20) // Interrupt Enable Register

-#define SPI_IDR         (24) // Interrupt Disable Register

-#define SPI_IMR         (28) // Interrupt Mask Register

-#define SPI_CSR         (48) // Chip Select Register

-#define SPI_RPR         (256) // Receive Pointer Register

-#define SPI_RCR         (260) // Receive Counter Register

-#define SPI_TPR         (264) // Transmit Pointer Register

-#define SPI_TCR         (268) // Transmit Counter Register

-#define SPI_RNPR        (272) // Receive Next Pointer Register

-#define SPI_RNCR        (276) // Receive Next Counter Register

-#define SPI_TNPR        (280) // Transmit Next Pointer Register

-#define SPI_TNCR        (284) // Transmit Next Counter Register

-#define SPI_PTCR        (288) // PDC Transfer Control Register

-#define SPI_PTSR        (292) // PDC Transfer Status Register

-// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- 

-#define AT91C_SPI_SPIEN           (0x1 <<  0) // (SPI) SPI Enable

-#define AT91C_SPI_SPIDIS          (0x1 <<  1) // (SPI) SPI Disable

-#define AT91C_SPI_SWRST           (0x1 <<  7) // (SPI) SPI Software reset

-#define AT91C_SPI_LASTXFER        (0x1 << 24) // (SPI) SPI Last Transfer

-// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- 

-#define AT91C_SPI_MSTR            (0x1 <<  0) // (SPI) Master/Slave Mode

-#define AT91C_SPI_PS              (0x1 <<  1) // (SPI) Peripheral Select

-#define 	AT91C_SPI_PS_FIXED                (0x0 <<  1) // (SPI) Fixed Peripheral Select

-#define 	AT91C_SPI_PS_VARIABLE             (0x1 <<  1) // (SPI) Variable Peripheral Select

-#define AT91C_SPI_PCSDEC          (0x1 <<  2) // (SPI) Chip Select Decode

-#define AT91C_SPI_FDIV            (0x1 <<  3) // (SPI) Clock Selection

-#define AT91C_SPI_MODFDIS         (0x1 <<  4) // (SPI) Mode Fault Detection

-#define AT91C_SPI_LLB             (0x1 <<  7) // (SPI) Clock Selection

-#define AT91C_SPI_PCS             (0xF << 16) // (SPI) Peripheral Chip Select

-#define AT91C_SPI_DLYBCS          (0xFF << 24) // (SPI) Delay Between Chip Selects

-// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- 

-#define AT91C_SPI_RD              (0xFFFF <<  0) // (SPI) Receive Data

-#define AT91C_SPI_RPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- 

-#define AT91C_SPI_TD              (0xFFFF <<  0) // (SPI) Transmit Data

-#define AT91C_SPI_TPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- 

-#define AT91C_SPI_RDRF            (0x1 <<  0) // (SPI) Receive Data Register Full

-#define AT91C_SPI_TDRE            (0x1 <<  1) // (SPI) Transmit Data Register Empty

-#define AT91C_SPI_MODF            (0x1 <<  2) // (SPI) Mode Fault Error

-#define AT91C_SPI_OVRES           (0x1 <<  3) // (SPI) Overrun Error Status

-#define AT91C_SPI_ENDRX           (0x1 <<  4) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_ENDTX           (0x1 <<  5) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_RXBUFF          (0x1 <<  6) // (SPI) RXBUFF Interrupt

-#define AT91C_SPI_TXBUFE          (0x1 <<  7) // (SPI) TXBUFE Interrupt

-#define AT91C_SPI_NSSR            (0x1 <<  8) // (SPI) NSSR Interrupt

-#define AT91C_SPI_TXEMPTY         (0x1 <<  9) // (SPI) TXEMPTY Interrupt

-#define AT91C_SPI_SPIENS          (0x1 << 16) // (SPI) Enable Status

-// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- 

-// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- 

-// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- 

-// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- 

-#define AT91C_SPI_CPOL            (0x1 <<  0) // (SPI) Clock Polarity

-#define AT91C_SPI_NCPHA           (0x1 <<  1) // (SPI) Clock Phase

-#define AT91C_SPI_CSAAT           (0x1 <<  2) // (SPI) Chip Select Active After Transfer

-#define AT91C_SPI_BITS            (0xF <<  4) // (SPI) Bits Per Transfer

-#define 	AT91C_SPI_BITS_8                    (0x0 <<  4) // (SPI) 8 Bits Per transfer

-#define 	AT91C_SPI_BITS_9                    (0x1 <<  4) // (SPI) 9 Bits Per transfer

-#define 	AT91C_SPI_BITS_10                   (0x2 <<  4) // (SPI) 10 Bits Per transfer

-#define 	AT91C_SPI_BITS_11                   (0x3 <<  4) // (SPI) 11 Bits Per transfer

-#define 	AT91C_SPI_BITS_12                   (0x4 <<  4) // (SPI) 12 Bits Per transfer

-#define 	AT91C_SPI_BITS_13                   (0x5 <<  4) // (SPI) 13 Bits Per transfer

-#define 	AT91C_SPI_BITS_14                   (0x6 <<  4) // (SPI) 14 Bits Per transfer

-#define 	AT91C_SPI_BITS_15                   (0x7 <<  4) // (SPI) 15 Bits Per transfer

-#define 	AT91C_SPI_BITS_16                   (0x8 <<  4) // (SPI) 16 Bits Per transfer

-#define AT91C_SPI_SCBR            (0xFF <<  8) // (SPI) Serial Clock Baud Rate

-#define AT91C_SPI_DLYBS           (0xFF << 16) // (SPI) Serial Clock Baud Rate

-#define AT91C_SPI_DLYBCT          (0xFF << 24) // (SPI) Delay Between Consecutive Transfers

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor

-// *****************************************************************************

-// *** Register offset in AT91S_ADC structure ***

-#define ADC_CR          ( 0) // ADC Control Register

-#define ADC_MR          ( 4) // ADC Mode Register

-#define ADC_CHER        (16) // ADC Channel Enable Register

-#define ADC_CHDR        (20) // ADC Channel Disable Register

-#define ADC_CHSR        (24) // ADC Channel Status Register

-#define ADC_SR          (28) // ADC Status Register

-#define ADC_LCDR        (32) // ADC Last Converted Data Register

-#define ADC_IER         (36) // ADC Interrupt Enable Register

-#define ADC_IDR         (40) // ADC Interrupt Disable Register

-#define ADC_IMR         (44) // ADC Interrupt Mask Register

-#define ADC_CDR0        (48) // ADC Channel Data Register 0

-#define ADC_CDR1        (52) // ADC Channel Data Register 1

-#define ADC_CDR2        (56) // ADC Channel Data Register 2

-#define ADC_CDR3        (60) // ADC Channel Data Register 3

-#define ADC_CDR4        (64) // ADC Channel Data Register 4

-#define ADC_CDR5        (68) // ADC Channel Data Register 5

-#define ADC_CDR6        (72) // ADC Channel Data Register 6

-#define ADC_CDR7        (76) // ADC Channel Data Register 7

-#define ADC_RPR         (256) // Receive Pointer Register

-#define ADC_RCR         (260) // Receive Counter Register

-#define ADC_TPR         (264) // Transmit Pointer Register

-#define ADC_TCR         (268) // Transmit Counter Register

-#define ADC_RNPR        (272) // Receive Next Pointer Register

-#define ADC_RNCR        (276) // Receive Next Counter Register

-#define ADC_TNPR        (280) // Transmit Next Pointer Register

-#define ADC_TNCR        (284) // Transmit Next Counter Register

-#define ADC_PTCR        (288) // PDC Transfer Control Register

-#define ADC_PTSR        (292) // PDC Transfer Status Register

-// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- 

-#define AT91C_ADC_SWRST           (0x1 <<  0) // (ADC) Software Reset

-#define AT91C_ADC_START           (0x1 <<  1) // (ADC) Start Conversion

-// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- 

-#define AT91C_ADC_TRGEN           (0x1 <<  0) // (ADC) Trigger Enable

-#define 	AT91C_ADC_TRGEN_DIS                  (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software

-#define 	AT91C_ADC_TRGEN_EN                   (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.

-#define AT91C_ADC_TRGSEL          (0x7 <<  1) // (ADC) Trigger Selection

-#define 	AT91C_ADC_TRGSEL_TIOA0                (0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0

-#define 	AT91C_ADC_TRGSEL_TIOA1                (0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1

-#define 	AT91C_ADC_TRGSEL_TIOA2                (0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2

-#define 	AT91C_ADC_TRGSEL_TIOA3                (0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3

-#define 	AT91C_ADC_TRGSEL_TIOA4                (0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4

-#define 	AT91C_ADC_TRGSEL_TIOA5                (0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5

-#define 	AT91C_ADC_TRGSEL_EXT                  (0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger

-#define AT91C_ADC_LOWRES          (0x1 <<  4) // (ADC) Resolution.

-#define 	AT91C_ADC_LOWRES_10_BIT               (0x0 <<  4) // (ADC) 10-bit resolution

-#define 	AT91C_ADC_LOWRES_8_BIT                (0x1 <<  4) // (ADC) 8-bit resolution

-#define AT91C_ADC_SLEEP           (0x1 <<  5) // (ADC) Sleep Mode

-#define 	AT91C_ADC_SLEEP_NORMAL_MODE          (0x0 <<  5) // (ADC) Normal Mode

-#define 	AT91C_ADC_SLEEP_MODE                 (0x1 <<  5) // (ADC) Sleep Mode

-#define AT91C_ADC_PRESCAL         (0x3F <<  8) // (ADC) Prescaler rate selection

-#define AT91C_ADC_STARTUP         (0x1F << 16) // (ADC) Startup Time

-#define AT91C_ADC_SHTIM           (0xF << 24) // (ADC) Sample & Hold Time

-// -------- 	ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- 

-#define AT91C_ADC_CH0             (0x1 <<  0) // (ADC) Channel 0

-#define AT91C_ADC_CH1             (0x1 <<  1) // (ADC) Channel 1

-#define AT91C_ADC_CH2             (0x1 <<  2) // (ADC) Channel 2

-#define AT91C_ADC_CH3             (0x1 <<  3) // (ADC) Channel 3

-#define AT91C_ADC_CH4             (0x1 <<  4) // (ADC) Channel 4

-#define AT91C_ADC_CH5             (0x1 <<  5) // (ADC) Channel 5

-#define AT91C_ADC_CH6             (0x1 <<  6) // (ADC) Channel 6

-#define AT91C_ADC_CH7             (0x1 <<  7) // (ADC) Channel 7

-// -------- 	ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- 

-// -------- 	ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- 

-// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- 

-#define AT91C_ADC_EOC0            (0x1 <<  0) // (ADC) End of Conversion

-#define AT91C_ADC_EOC1            (0x1 <<  1) // (ADC) End of Conversion

-#define AT91C_ADC_EOC2            (0x1 <<  2) // (ADC) End of Conversion

-#define AT91C_ADC_EOC3            (0x1 <<  3) // (ADC) End of Conversion

-#define AT91C_ADC_EOC4            (0x1 <<  4) // (ADC) End of Conversion

-#define AT91C_ADC_EOC5            (0x1 <<  5) // (ADC) End of Conversion

-#define AT91C_ADC_EOC6            (0x1 <<  6) // (ADC) End of Conversion

-#define AT91C_ADC_EOC7            (0x1 <<  7) // (ADC) End of Conversion

-#define AT91C_ADC_OVRE0           (0x1 <<  8) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE1           (0x1 <<  9) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE2           (0x1 << 10) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE3           (0x1 << 11) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE4           (0x1 << 12) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE5           (0x1 << 13) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE6           (0x1 << 14) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE7           (0x1 << 15) // (ADC) Overrun Error

-#define AT91C_ADC_DRDY            (0x1 << 16) // (ADC) Data Ready

-#define AT91C_ADC_GOVRE           (0x1 << 17) // (ADC) General Overrun

-#define AT91C_ADC_ENDRX           (0x1 << 18) // (ADC) End of Receiver Transfer

-#define AT91C_ADC_RXBUFF          (0x1 << 19) // (ADC) RXBUFF Interrupt

-// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- 

-#define AT91C_ADC_LDATA           (0x3FF <<  0) // (ADC) Last Data Converted

-// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- 

-// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- 

-// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- 

-// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- 

-#define AT91C_ADC_DATA            (0x3FF <<  0) // (ADC) Converted Data

-// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- 

-// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- 

-// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- 

-// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- 

-// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- 

-// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- 

-// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_SSC structure ***

-#define SSC_CR          ( 0) // Control Register

-#define SSC_CMR         ( 4) // Clock Mode Register

-#define SSC_RCMR        (16) // Receive Clock ModeRegister

-#define SSC_RFMR        (20) // Receive Frame Mode Register

-#define SSC_TCMR        (24) // Transmit Clock Mode Register

-#define SSC_TFMR        (28) // Transmit Frame Mode Register

-#define SSC_RHR         (32) // Receive Holding Register

-#define SSC_THR         (36) // Transmit Holding Register

-#define SSC_RSHR        (48) // Receive Sync Holding Register

-#define SSC_TSHR        (52) // Transmit Sync Holding Register

-#define SSC_RC0R        (56) // Receive Compare 0 Register

-#define SSC_RC1R        (60) // Receive Compare 1 Register

-#define SSC_SR          (64) // Status Register

-#define SSC_IER         (68) // Interrupt Enable Register

-#define SSC_IDR         (72) // Interrupt Disable Register

-#define SSC_IMR         (76) // Interrupt Mask Register

-#define SSC_RPR         (256) // Receive Pointer Register

-#define SSC_RCR         (260) // Receive Counter Register

-#define SSC_TPR         (264) // Transmit Pointer Register

-#define SSC_TCR         (268) // Transmit Counter Register

-#define SSC_RNPR        (272) // Receive Next Pointer Register

-#define SSC_RNCR        (276) // Receive Next Counter Register

-#define SSC_TNPR        (280) // Transmit Next Pointer Register

-#define SSC_TNCR        (284) // Transmit Next Counter Register

-#define SSC_PTCR        (288) // PDC Transfer Control Register

-#define SSC_PTSR        (292) // PDC Transfer Status Register

-// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- 

-#define AT91C_SSC_RXEN            (0x1 <<  0) // (SSC) Receive Enable

-#define AT91C_SSC_RXDIS           (0x1 <<  1) // (SSC) Receive Disable

-#define AT91C_SSC_TXEN            (0x1 <<  8) // (SSC) Transmit Enable

-#define AT91C_SSC_TXDIS           (0x1 <<  9) // (SSC) Transmit Disable

-#define AT91C_SSC_SWRST           (0x1 << 15) // (SSC) Software Reset

-// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- 

-#define AT91C_SSC_CKS             (0x3 <<  0) // (SSC) Receive/Transmit Clock Selection

-#define 	AT91C_SSC_CKS_DIV                  (0x0) // (SSC) Divided Clock

-#define 	AT91C_SSC_CKS_TK                   (0x1) // (SSC) TK Clock signal

-#define 	AT91C_SSC_CKS_RK                   (0x2) // (SSC) RK pin

-#define AT91C_SSC_CKO             (0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection

-#define 	AT91C_SSC_CKO_NONE                 (0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only

-#define 	AT91C_SSC_CKO_CONTINOUS            (0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output

-#define 	AT91C_SSC_CKO_DATA_TX              (0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output

-#define AT91C_SSC_CKI             (0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion

-#define AT91C_SSC_CKG             (0x3 <<  6) // (SSC) Receive/Transmit Clock Gating Selection

-#define 	AT91C_SSC_CKG_NONE                 (0x0 <<  6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock

-#define 	AT91C_SSC_CKG_LOW                  (0x1 <<  6) // (SSC) Receive/Transmit Clock enabled only if RF Low

-#define 	AT91C_SSC_CKG_HIGH                 (0x2 <<  6) // (SSC) Receive/Transmit Clock enabled only if RF High

-#define AT91C_SSC_START           (0xF <<  8) // (SSC) Receive/Transmit Start Selection

-#define 	AT91C_SSC_START_CONTINOUS            (0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.

-#define 	AT91C_SSC_START_TX                   (0x1 <<  8) // (SSC) Transmit/Receive start

-#define 	AT91C_SSC_START_LOW_RF               (0x2 <<  8) // (SSC) Detection of a low level on RF input

-#define 	AT91C_SSC_START_HIGH_RF              (0x3 <<  8) // (SSC) Detection of a high level on RF input

-#define 	AT91C_SSC_START_FALL_RF              (0x4 <<  8) // (SSC) Detection of a falling edge on RF input

-#define 	AT91C_SSC_START_RISE_RF              (0x5 <<  8) // (SSC) Detection of a rising edge on RF input

-#define 	AT91C_SSC_START_LEVEL_RF             (0x6 <<  8) // (SSC) Detection of any level change on RF input

-#define 	AT91C_SSC_START_EDGE_RF              (0x7 <<  8) // (SSC) Detection of any edge on RF input

-#define 	AT91C_SSC_START_0                    (0x8 <<  8) // (SSC) Compare 0

-#define AT91C_SSC_STOP            (0x1 << 12) // (SSC) Receive Stop Selection

-#define AT91C_SSC_STTOUT          (0x1 << 15) // (SSC) Receive/Transmit Start Output Selection

-#define AT91C_SSC_STTDLY          (0xFF << 16) // (SSC) Receive/Transmit Start Delay

-#define AT91C_SSC_PERIOD          (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection

-// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- 

-#define AT91C_SSC_DATLEN          (0x1F <<  0) // (SSC) Data Length

-#define AT91C_SSC_LOOP            (0x1 <<  5) // (SSC) Loop Mode

-#define AT91C_SSC_MSBF            (0x1 <<  7) // (SSC) Most Significant Bit First

-#define AT91C_SSC_DATNB           (0xF <<  8) // (SSC) Data Number per Frame

-#define AT91C_SSC_FSLEN           (0xF << 16) // (SSC) Receive/Transmit Frame Sync length

-#define AT91C_SSC_FSOS            (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection

-#define 	AT91C_SSC_FSOS_NONE                 (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only

-#define 	AT91C_SSC_FSOS_NEGATIVE             (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse

-#define 	AT91C_SSC_FSOS_POSITIVE             (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse

-#define 	AT91C_SSC_FSOS_LOW                  (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer

-#define 	AT91C_SSC_FSOS_HIGH                 (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer

-#define 	AT91C_SSC_FSOS_TOGGLE               (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer

-#define AT91C_SSC_FSEDGE          (0x1 << 24) // (SSC) Frame Sync Edge Detection

-// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- 

-// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- 

-#define AT91C_SSC_DATDEF          (0x1 <<  5) // (SSC) Data Default Value

-#define AT91C_SSC_FSDEN           (0x1 << 23) // (SSC) Frame Sync Data Enable

-// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- 

-#define AT91C_SSC_TXRDY           (0x1 <<  0) // (SSC) Transmit Ready

-#define AT91C_SSC_TXEMPTY         (0x1 <<  1) // (SSC) Transmit Empty

-#define AT91C_SSC_ENDTX           (0x1 <<  2) // (SSC) End Of Transmission

-#define AT91C_SSC_TXBUFE          (0x1 <<  3) // (SSC) Transmit Buffer Empty

-#define AT91C_SSC_RXRDY           (0x1 <<  4) // (SSC) Receive Ready

-#define AT91C_SSC_OVRUN           (0x1 <<  5) // (SSC) Receive Overrun

-#define AT91C_SSC_ENDRX           (0x1 <<  6) // (SSC) End of Reception

-#define AT91C_SSC_RXBUFF          (0x1 <<  7) // (SSC) Receive Buffer Full

-#define AT91C_SSC_CP0             (0x1 <<  8) // (SSC) Compare 0

-#define AT91C_SSC_CP1             (0x1 <<  9) // (SSC) Compare 1

-#define AT91C_SSC_TXSYN           (0x1 << 10) // (SSC) Transmit Sync

-#define AT91C_SSC_RXSYN           (0x1 << 11) // (SSC) Receive Sync

-#define AT91C_SSC_TXENA           (0x1 << 16) // (SSC) Transmit Enable

-#define AT91C_SSC_RXENA           (0x1 << 17) // (SSC) Receive Enable

-// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- 

-// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- 

-// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Usart

-// *****************************************************************************

-// *** Register offset in AT91S_USART structure ***

-#define US_CR           ( 0) // Control Register

-#define US_MR           ( 4) // Mode Register

-#define US_IER          ( 8) // Interrupt Enable Register

-#define US_IDR          (12) // Interrupt Disable Register

-#define US_IMR          (16) // Interrupt Mask Register

-#define US_CSR          (20) // Channel Status Register

-#define US_RHR          (24) // Receiver Holding Register

-#define US_THR          (28) // Transmitter Holding Register

-#define US_BRGR         (32) // Baud Rate Generator Register

-#define US_RTOR         (36) // Receiver Time-out Register

-#define US_TTGR         (40) // Transmitter Time-guard Register

-#define US_FIDI         (64) // FI_DI_Ratio Register

-#define US_NER          (68) // Nb Errors Register

-#define US_XXR          (72) // XON_XOFF Register

-#define US_IF           (76) // IRDA_FILTER Register

-#define US_RPR          (256) // Receive Pointer Register

-#define US_RCR          (260) // Receive Counter Register

-#define US_TPR          (264) // Transmit Pointer Register

-#define US_TCR          (268) // Transmit Counter Register

-#define US_RNPR         (272) // Receive Next Pointer Register

-#define US_RNCR         (276) // Receive Next Counter Register

-#define US_TNPR         (280) // Transmit Next Pointer Register

-#define US_TNCR         (284) // Transmit Next Counter Register

-#define US_PTCR         (288) // PDC Transfer Control Register

-#define US_PTSR         (292) // PDC Transfer Status Register

-// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_RSTSTA           (0x1 <<  8) // (USART) Reset Status Bits

-#define AT91C_US_STTBRK           (0x1 <<  9) // (USART) Start Break

-#define AT91C_US_STPBRK           (0x1 << 10) // (USART) Stop Break

-#define AT91C_US_STTTO            (0x1 << 11) // (USART) Start Time-out

-#define AT91C_US_SENDA            (0x1 << 12) // (USART) Send Address

-#define AT91C_US_RSTIT            (0x1 << 13) // (USART) Reset Iterations

-#define AT91C_US_RSTNACK          (0x1 << 14) // (USART) Reset Non Acknowledge

-#define AT91C_US_RETTO            (0x1 << 15) // (USART) Rearm Time-out

-#define AT91C_US_DTREN            (0x1 << 16) // (USART) Data Terminal ready Enable

-#define AT91C_US_DTRDIS           (0x1 << 17) // (USART) Data Terminal ready Disable

-#define AT91C_US_RTSEN            (0x1 << 18) // (USART) Request to Send enable

-#define AT91C_US_RTSDIS           (0x1 << 19) // (USART) Request to Send Disable

-// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_USMODE           (0xF <<  0) // (USART) Usart mode

-#define 	AT91C_US_USMODE_NORMAL               (0x0) // (USART) Normal

-#define 	AT91C_US_USMODE_RS485                (0x1) // (USART) RS485

-#define 	AT91C_US_USMODE_HWHSH                (0x2) // (USART) Hardware Handshaking

-#define 	AT91C_US_USMODE_MODEM                (0x3) // (USART) Modem

-#define 	AT91C_US_USMODE_ISO7816_0            (0x4) // (USART) ISO7816 protocol: T = 0

-#define 	AT91C_US_USMODE_ISO7816_1            (0x6) // (USART) ISO7816 protocol: T = 1

-#define 	AT91C_US_USMODE_IRDA                 (0x8) // (USART) IrDA

-#define 	AT91C_US_USMODE_SWHSH                (0xC) // (USART) Software Handshaking

-#define AT91C_US_CLKS             (0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CLKS_CLOCK                (0x0 <<  4) // (USART) Clock

-#define 	AT91C_US_CLKS_FDIV1                (0x1 <<  4) // (USART) fdiv1

-#define 	AT91C_US_CLKS_SLOW                 (0x2 <<  4) // (USART) slow_clock (ARM)

-#define 	AT91C_US_CLKS_EXT                  (0x3 <<  4) // (USART) External (SCK)

-#define AT91C_US_CHRL             (0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CHRL_5_BITS               (0x0 <<  6) // (USART) Character Length: 5 bits

-#define 	AT91C_US_CHRL_6_BITS               (0x1 <<  6) // (USART) Character Length: 6 bits

-#define 	AT91C_US_CHRL_7_BITS               (0x2 <<  6) // (USART) Character Length: 7 bits

-#define 	AT91C_US_CHRL_8_BITS               (0x3 <<  6) // (USART) Character Length: 8 bits

-#define AT91C_US_SYNC             (0x1 <<  8) // (USART) Synchronous Mode Select

-#define AT91C_US_NBSTOP           (0x3 << 12) // (USART) Number of Stop bits

-#define 	AT91C_US_NBSTOP_1_BIT                (0x0 << 12) // (USART) 1 stop bit

-#define 	AT91C_US_NBSTOP_15_BIT               (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits

-#define 	AT91C_US_NBSTOP_2_BIT                (0x2 << 12) // (USART) 2 stop bits

-#define AT91C_US_MSBF             (0x1 << 16) // (USART) Bit Order

-#define AT91C_US_MODE9            (0x1 << 17) // (USART) 9-bit Character length

-#define AT91C_US_CKLO             (0x1 << 18) // (USART) Clock Output Select

-#define AT91C_US_OVER             (0x1 << 19) // (USART) Over Sampling Mode

-#define AT91C_US_INACK            (0x1 << 20) // (USART) Inhibit Non Acknowledge

-#define AT91C_US_DSNACK           (0x1 << 21) // (USART) Disable Successive NACK

-#define AT91C_US_MAX_ITER         (0x1 << 24) // (USART) Number of Repetitions

-#define AT91C_US_FILTER           (0x1 << 28) // (USART) Receive Line Filter

-// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXBRK            (0x1 <<  2) // (USART) Break Received/End of Break

-#define AT91C_US_TIMEOUT          (0x1 <<  8) // (USART) Receiver Time-out

-#define AT91C_US_ITERATION        (0x1 << 10) // (USART) Max number of Repetitions Reached

-#define AT91C_US_NACK             (0x1 << 13) // (USART) Non Acknowledge

-#define AT91C_US_RIIC             (0x1 << 16) // (USART) Ring INdicator Input Change Flag

-#define AT91C_US_DSRIC            (0x1 << 17) // (USART) Data Set Ready Input Change Flag

-#define AT91C_US_DCDIC            (0x1 << 18) // (USART) Data Carrier Flag

-#define AT91C_US_CTSIC            (0x1 << 19) // (USART) Clear To Send Input Change Flag

-// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- 

-#define AT91C_US_RI               (0x1 << 20) // (USART) Image of RI Input

-#define AT91C_US_DSR              (0x1 << 21) // (USART) Image of DSR Input

-#define AT91C_US_DCD              (0x1 << 22) // (USART) Image of DCD Input

-#define AT91C_US_CTS              (0x1 << 23) // (USART) Image of CTS Input

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Two-wire Interface

-// *****************************************************************************

-// *** Register offset in AT91S_TWI structure ***

-#define TWI_CR          ( 0) // Control Register

-#define TWI_MMR         ( 4) // Master Mode Register

-#define TWI_SMR         ( 8) // Slave Mode Register

-#define TWI_IADR        (12) // Internal Address Register

-#define TWI_CWGR        (16) // Clock Waveform Generator Register

-#define TWI_SR          (32) // Status Register

-#define TWI_IER         (36) // Interrupt Enable Register

-#define TWI_IDR         (40) // Interrupt Disable Register

-#define TWI_IMR         (44) // Interrupt Mask Register

-#define TWI_RHR         (48) // Receive Holding Register

-#define TWI_THR         (52) // Transmit Holding Register

-// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- 

-#define AT91C_TWI_START           (0x1 <<  0) // (TWI) Send a START Condition

-#define AT91C_TWI_STOP            (0x1 <<  1) // (TWI) Send a STOP Condition

-#define AT91C_TWI_MSEN            (0x1 <<  2) // (TWI) TWI Master Transfer Enabled

-#define AT91C_TWI_MSDIS           (0x1 <<  3) // (TWI) TWI Master Transfer Disabled

-#define AT91C_TWI_SVEN            (0x1 <<  4) // (TWI) TWI Slave Transfer Enabled

-#define AT91C_TWI_SVDIS           (0x1 <<  5) // (TWI) TWI Slave Transfer Disabled

-#define AT91C_TWI_SWRST           (0x1 <<  7) // (TWI) Software Reset

-// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- 

-#define AT91C_TWI_IADRSZ          (0x3 <<  8) // (TWI) Internal Device Address Size

-#define 	AT91C_TWI_IADRSZ_NO                   (0x0 <<  8) // (TWI) No internal device address

-#define 	AT91C_TWI_IADRSZ_1_BYTE               (0x1 <<  8) // (TWI) One-byte internal device address

-#define 	AT91C_TWI_IADRSZ_2_BYTE               (0x2 <<  8) // (TWI) Two-byte internal device address

-#define 	AT91C_TWI_IADRSZ_3_BYTE               (0x3 <<  8) // (TWI) Three-byte internal device address

-#define AT91C_TWI_MREAD           (0x1 << 12) // (TWI) Master Read Direction

-#define AT91C_TWI_DADR            (0x7F << 16) // (TWI) Device Address

-// -------- TWI_SMR : (TWI Offset: 0x8) TWI Slave Mode Register -------- 

-#define AT91C_TWI_SADR            (0x7F << 16) // (TWI) Slave Device Address

-// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- 

-#define AT91C_TWI_CLDIV           (0xFF <<  0) // (TWI) Clock Low Divider

-#define AT91C_TWI_CHDIV           (0xFF <<  8) // (TWI) Clock High Divider

-#define AT91C_TWI_CKDIV           (0x7 << 16) // (TWI) Clock Divider

-// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- 

-#define AT91C_TWI_TXCOMP          (0x1 <<  0) // (TWI) Transmission Completed

-#define AT91C_TWI_RXRDY           (0x1 <<  1) // (TWI) Receive holding register ReaDY

-#define AT91C_TWI_TXRDY           (0x1 <<  2) // (TWI) Transmit holding register ReaDY

-#define AT91C_TWI_SVREAD          (0x1 <<  3) // (TWI) Slave Read

-#define AT91C_TWI_SVACC           (0x1 <<  4) // (TWI) Slave Access

-#define AT91C_TWI_GCACC           (0x1 <<  5) // (TWI) General Call Access

-#define AT91C_TWI_OVRE            (0x1 <<  6) // (TWI) Overrun Error

-#define AT91C_TWI_UNRE            (0x1 <<  7) // (TWI) Underrun Error

-#define AT91C_TWI_NACK            (0x1 <<  8) // (TWI) Not Acknowledged

-#define AT91C_TWI_ARBLST          (0x1 <<  9) // (TWI) Arbitration Lost

-// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- 

-// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- 

-// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface

-// *****************************************************************************

-// *** Register offset in AT91S_TC structure ***

-#define TC_CCR          ( 0) // Channel Control Register

-#define TC_CMR          ( 4) // Channel Mode Register (Capture Mode / Waveform Mode)

-#define TC_CV           (16) // Counter Value

-#define TC_RA           (20) // Register A

-#define TC_RB           (24) // Register B

-#define TC_RC           (28) // Register C

-#define TC_SR           (32) // Status Register

-#define TC_IER          (36) // Interrupt Enable Register

-#define TC_IDR          (40) // Interrupt Disable Register

-#define TC_IMR          (44) // Interrupt Mask Register

-// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- 

-#define AT91C_TC_CLKEN            (0x1 <<  0) // (TC) Counter Clock Enable Command

-#define AT91C_TC_CLKDIS           (0x1 <<  1) // (TC) Counter Clock Disable Command

-#define AT91C_TC_SWTRG            (0x1 <<  2) // (TC) Software Trigger Command

-// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- 

-#define AT91C_TC_CLKS             (0x7 <<  0) // (TC) Clock Selection

-#define 	AT91C_TC_CLKS_TIMER_DIV1_CLOCK     (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV2_CLOCK     (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV3_CLOCK     (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV4_CLOCK     (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV5_CLOCK     (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK

-#define 	AT91C_TC_CLKS_XC0                  (0x5) // (TC) Clock selected: XC0

-#define 	AT91C_TC_CLKS_XC1                  (0x6) // (TC) Clock selected: XC1

-#define 	AT91C_TC_CLKS_XC2                  (0x7) // (TC) Clock selected: XC2

-#define AT91C_TC_CLKI             (0x1 <<  3) // (TC) Clock Invert

-#define AT91C_TC_BURST            (0x3 <<  4) // (TC) Burst Signal Selection

-#define 	AT91C_TC_BURST_NONE                 (0x0 <<  4) // (TC) The clock is not gated by an external signal

-#define 	AT91C_TC_BURST_XC0                  (0x1 <<  4) // (TC) XC0 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC1                  (0x2 <<  4) // (TC) XC1 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC2                  (0x3 <<  4) // (TC) XC2 is ANDed with the selected clock

-#define AT91C_TC_CPCSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare

-#define AT91C_TC_LDBSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading

-#define AT91C_TC_LDBDIS           (0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading

-#define AT91C_TC_CPCDIS           (0x1 <<  7) // (TC) Counter Clock Disable with RC Compare

-#define AT91C_TC_ETRGEDG          (0x3 <<  8) // (TC) External Trigger Edge Selection

-#define 	AT91C_TC_ETRGEDG_NONE                 (0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_ETRGEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_ETRGEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_ETRGEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_EEVTEDG          (0x3 <<  8) // (TC) External Event Edge Selection

-#define 	AT91C_TC_EEVTEDG_NONE                 (0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_EEVTEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_EEVTEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_EEVTEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_ABETRG           (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection

-#define AT91C_TC_EEVT             (0x3 << 10) // (TC) External Event  Selection

-#define 	AT91C_TC_EEVT_NONE                 (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input

-#define 	AT91C_TC_EEVT_RISING               (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output

-#define 	AT91C_TC_EEVT_FALLING              (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output

-#define 	AT91C_TC_EEVT_BOTH                 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output

-#define AT91C_TC_ENETRG           (0x1 << 12) // (TC) External Event Trigger enable

-#define AT91C_TC_WAVESEL          (0x3 << 13) // (TC) Waveform  Selection

-#define 	AT91C_TC_WAVESEL_UP                   (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN               (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UP_AUTO              (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN_AUTO          (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare

-#define AT91C_TC_CPCTRG           (0x1 << 14) // (TC) RC Compare Trigger Enable

-#define AT91C_TC_WAVE             (0x1 << 15) // (TC) 

-#define AT91C_TC_LDRA             (0x3 << 16) // (TC) RA Loading Selection

-#define 	AT91C_TC_LDRA_NONE                 (0x0 << 16) // (TC) Edge: None

-#define 	AT91C_TC_LDRA_RISING               (0x1 << 16) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRA_FALLING              (0x2 << 16) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRA_BOTH                 (0x3 << 16) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_ACPA             (0x3 << 16) // (TC) RA Compare Effect on TIOA

-#define 	AT91C_TC_ACPA_NONE                 (0x0 << 16) // (TC) Effect: none

-#define 	AT91C_TC_ACPA_SET                  (0x1 << 16) // (TC) Effect: set

-#define 	AT91C_TC_ACPA_CLEAR                (0x2 << 16) // (TC) Effect: clear

-#define 	AT91C_TC_ACPA_TOGGLE               (0x3 << 16) // (TC) Effect: toggle

-#define AT91C_TC_LDRB             (0x3 << 18) // (TC) RB Loading Selection

-#define 	AT91C_TC_LDRB_NONE                 (0x0 << 18) // (TC) Edge: None

-#define 	AT91C_TC_LDRB_RISING               (0x1 << 18) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRB_FALLING              (0x2 << 18) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRB_BOTH                 (0x3 << 18) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_ACPC             (0x3 << 18) // (TC) RC Compare Effect on TIOA

-#define 	AT91C_TC_ACPC_NONE                 (0x0 << 18) // (TC) Effect: none

-#define 	AT91C_TC_ACPC_SET                  (0x1 << 18) // (TC) Effect: set

-#define 	AT91C_TC_ACPC_CLEAR                (0x2 << 18) // (TC) Effect: clear

-#define 	AT91C_TC_ACPC_TOGGLE               (0x3 << 18) // (TC) Effect: toggle

-#define AT91C_TC_AEEVT            (0x3 << 20) // (TC) External Event Effect on TIOA

-#define 	AT91C_TC_AEEVT_NONE                 (0x0 << 20) // (TC) Effect: none

-#define 	AT91C_TC_AEEVT_SET                  (0x1 << 20) // (TC) Effect: set

-#define 	AT91C_TC_AEEVT_CLEAR                (0x2 << 20) // (TC) Effect: clear

-#define 	AT91C_TC_AEEVT_TOGGLE               (0x3 << 20) // (TC) Effect: toggle

-#define AT91C_TC_ASWTRG           (0x3 << 22) // (TC) Software Trigger Effect on TIOA

-#define 	AT91C_TC_ASWTRG_NONE                 (0x0 << 22) // (TC) Effect: none

-#define 	AT91C_TC_ASWTRG_SET                  (0x1 << 22) // (TC) Effect: set

-#define 	AT91C_TC_ASWTRG_CLEAR                (0x2 << 22) // (TC) Effect: clear

-#define 	AT91C_TC_ASWTRG_TOGGLE               (0x3 << 22) // (TC) Effect: toggle

-#define AT91C_TC_BCPB             (0x3 << 24) // (TC) RB Compare Effect on TIOB

-#define 	AT91C_TC_BCPB_NONE                 (0x0 << 24) // (TC) Effect: none

-#define 	AT91C_TC_BCPB_SET                  (0x1 << 24) // (TC) Effect: set

-#define 	AT91C_TC_BCPB_CLEAR                (0x2 << 24) // (TC) Effect: clear

-#define 	AT91C_TC_BCPB_TOGGLE               (0x3 << 24) // (TC) Effect: toggle

-#define AT91C_TC_BCPC             (0x3 << 26) // (TC) RC Compare Effect on TIOB

-#define 	AT91C_TC_BCPC_NONE                 (0x0 << 26) // (TC) Effect: none

-#define 	AT91C_TC_BCPC_SET                  (0x1 << 26) // (TC) Effect: set

-#define 	AT91C_TC_BCPC_CLEAR                (0x2 << 26) // (TC) Effect: clear

-#define 	AT91C_TC_BCPC_TOGGLE               (0x3 << 26) // (TC) Effect: toggle

-#define AT91C_TC_BEEVT            (0x3 << 28) // (TC) External Event Effect on TIOB

-#define 	AT91C_TC_BEEVT_NONE                 (0x0 << 28) // (TC) Effect: none

-#define 	AT91C_TC_BEEVT_SET                  (0x1 << 28) // (TC) Effect: set

-#define 	AT91C_TC_BEEVT_CLEAR                (0x2 << 28) // (TC) Effect: clear

-#define 	AT91C_TC_BEEVT_TOGGLE               (0x3 << 28) // (TC) Effect: toggle

-#define AT91C_TC_BSWTRG           (0x3 << 30) // (TC) Software Trigger Effect on TIOB

-#define 	AT91C_TC_BSWTRG_NONE                 (0x0 << 30) // (TC) Effect: none

-#define 	AT91C_TC_BSWTRG_SET                  (0x1 << 30) // (TC) Effect: set

-#define 	AT91C_TC_BSWTRG_CLEAR                (0x2 << 30) // (TC) Effect: clear

-#define 	AT91C_TC_BSWTRG_TOGGLE               (0x3 << 30) // (TC) Effect: toggle

-// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- 

-#define AT91C_TC_COVFS            (0x1 <<  0) // (TC) Counter Overflow

-#define AT91C_TC_LOVRS            (0x1 <<  1) // (TC) Load Overrun

-#define AT91C_TC_CPAS             (0x1 <<  2) // (TC) RA Compare

-#define AT91C_TC_CPBS             (0x1 <<  3) // (TC) RB Compare

-#define AT91C_TC_CPCS             (0x1 <<  4) // (TC) RC Compare

-#define AT91C_TC_LDRAS            (0x1 <<  5) // (TC) RA Loading

-#define AT91C_TC_LDRBS            (0x1 <<  6) // (TC) RB Loading

-#define AT91C_TC_ETRCS            (0x1 <<  7) // (TC) External Trigger

-#define AT91C_TC_ETRGS            (0x1 << 16) // (TC) Clock Enabling

-#define AT91C_TC_MTIOA            (0x1 << 17) // (TC) TIOA Mirror

-#define AT91C_TC_MTIOB            (0x1 << 18) // (TC) TIOA Mirror

-// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- 

-// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- 

-// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Interface

-// *****************************************************************************

-// *** Register offset in AT91S_TCB structure ***

-#define TCB_TC0         ( 0) // TC Channel 0

-#define TCB_TC1         (64) // TC Channel 1

-#define TCB_TC2         (128) // TC Channel 2

-#define TCB_BCR         (192) // TC Block Control Register

-#define TCB_BMR         (196) // TC Block Mode Register

-// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- 

-#define AT91C_TCB_SYNC            (0x1 <<  0) // (TCB) Synchro Command

-// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- 

-#define AT91C_TCB_TC0XC0S         (0x1 <<  0) // (TCB) External Clock Signal 0 Selection

-#define 	AT91C_TCB_TC0XC0S_TCLK0                (0x0) // (TCB) TCLK0 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_NONE                 (0x1) // (TCB) None signal connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA1                (0x2) // (TCB) TIOA1 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA2                (0x3) // (TCB) TIOA2 connected to XC0

-#define AT91C_TCB_TC1XC1S         (0x1 <<  2) // (TCB) External Clock Signal 1 Selection

-#define 	AT91C_TCB_TC1XC1S_TCLK1                (0x0 <<  2) // (TCB) TCLK1 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_NONE                 (0x1 <<  2) // (TCB) None signal connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA0                (0x2 <<  2) // (TCB) TIOA0 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA2                (0x3 <<  2) // (TCB) TIOA2 connected to XC1

-#define AT91C_TCB_TC2XC2S         (0x1 <<  4) // (TCB) External Clock Signal 2 Selection

-#define 	AT91C_TCB_TC2XC2S_TCLK2                (0x0 <<  4) // (TCB) TCLK2 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_NONE                 (0x1 <<  4) // (TCB) None signal connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA0                (0x2 <<  4) // (TCB) TIOA0 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA2                (0x3 <<  4) // (TCB) TIOA2 connected to XC2

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface

-// *****************************************************************************

-// *** Register offset in AT91S_PWMC_CH structure ***

-#define PWMC_CMR        ( 0) // Channel Mode Register

-#define PWMC_CDTYR      ( 4) // Channel Duty Cycle Register

-#define PWMC_CPRDR      ( 8) // Channel Period Register

-#define PWMC_CCNTR      (12) // Channel Counter Register

-#define PWMC_CUPDR      (16) // Channel Update Register

-#define PWMC_Reserved   (20) // Reserved

-// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- 

-#define AT91C_PWMC_CPRE           (0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx

-#define 	AT91C_PWMC_CPRE_MCK                  (0x0) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKA                 (0xB) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKB                 (0xC) // (PWMC_CH) 

-#define AT91C_PWMC_CALG           (0x1 <<  8) // (PWMC_CH) Channel Alignment

-#define AT91C_PWMC_CPOL           (0x1 <<  9) // (PWMC_CH) Channel Polarity

-#define AT91C_PWMC_CPD            (0x1 << 10) // (PWMC_CH) Channel Update Period

-// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- 

-#define AT91C_PWMC_CDTY           (0x0 <<  0) // (PWMC_CH) Channel Duty Cycle

-// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- 

-#define AT91C_PWMC_CPRD           (0x0 <<  0) // (PWMC_CH) Channel Period

-// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- 

-#define AT91C_PWMC_CCNT           (0x0 <<  0) // (PWMC_CH) Channel Counter

-// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- 

-#define AT91C_PWMC_CUPD           (0x0 <<  0) // (PWMC_CH) Channel Update

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_PWMC structure ***

-#define PWMC_MR         ( 0) // PWMC Mode Register

-#define PWMC_ENA        ( 4) // PWMC Enable Register

-#define PWMC_DIS        ( 8) // PWMC Disable Register

-#define PWMC_SR         (12) // PWMC Status Register

-#define PWMC_IER        (16) // PWMC Interrupt Enable Register

-#define PWMC_IDR        (20) // PWMC Interrupt Disable Register

-#define PWMC_IMR        (24) // PWMC Interrupt Mask Register

-#define PWMC_ISR        (28) // PWMC Interrupt Status Register

-#define PWMC_VR         (252) // PWMC Version Register

-#define PWMC_CH         (512) // PWMC Channel 0

-// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- 

-#define AT91C_PWMC_DIVA           (0xFF <<  0) // (PWMC) CLKA divide factor.

-#define AT91C_PWMC_PREA           (0xF <<  8) // (PWMC) Divider Input Clock Prescaler A

-#define 	AT91C_PWMC_PREA_MCK                  (0x0 <<  8) // (PWMC) 

-#define AT91C_PWMC_DIVB           (0xFF << 16) // (PWMC) CLKB divide factor.

-#define AT91C_PWMC_PREB           (0xF << 24) // (PWMC) Divider Input Clock Prescaler B

-#define 	AT91C_PWMC_PREB_MCK                  (0x0 << 24) // (PWMC) 

-// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- 

-#define AT91C_PWMC_CHID0          (0x1 <<  0) // (PWMC) Channel ID 0

-#define AT91C_PWMC_CHID1          (0x1 <<  1) // (PWMC) Channel ID 1

-#define AT91C_PWMC_CHID2          (0x1 <<  2) // (PWMC) Channel ID 2

-#define AT91C_PWMC_CHID3          (0x1 <<  3) // (PWMC) Channel ID 3

-#define AT91C_PWMC_CHID4          (0x1 <<  4) // (PWMC) Channel ID 4

-#define AT91C_PWMC_CHID5          (0x1 <<  5) // (PWMC) Channel ID 5

-#define AT91C_PWMC_CHID6          (0x1 <<  6) // (PWMC) Channel ID 6

-#define AT91C_PWMC_CHID7          (0x1 <<  7) // (PWMC) Channel ID 7

-// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- 

-// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- 

-// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- 

-// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- 

-// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- 

-// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR USB Device Interface

-// *****************************************************************************

-// *** Register offset in AT91S_UDP structure ***

-#define UDP_NUM         ( 0) // Frame Number Register

-#define UDP_GLBSTATE    ( 4) // Global State Register

-#define UDP_FADDR       ( 8) // Function Address Register

-#define UDP_IER         (16) // Interrupt Enable Register

-#define UDP_IDR         (20) // Interrupt Disable Register

-#define UDP_IMR         (24) // Interrupt Mask Register

-#define UDP_ISR         (28) // Interrupt Status Register

-#define UDP_ICR         (32) // Interrupt Clear Register

-#define UDP_RSTEP       (40) // Reset Endpoint Register

-#define UDP_CSR         (48) // Endpoint Control and Status Register

-#define UDP_FDR         (80) // Endpoint FIFO Data Register

-// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- 

-#define AT91C_UDP_FRM_NUM         (0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats

-#define AT91C_UDP_FRM_ERR         (0x1 << 16) // (UDP) Frame Error

-#define AT91C_UDP_FRM_OK          (0x1 << 17) // (UDP) Frame OK

-// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- 

-#define AT91C_UDP_FADDEN          (0x1 <<  0) // (UDP) Function Address Enable

-#define AT91C_UDP_CONFG           (0x1 <<  1) // (UDP) Configured

-#define AT91C_UDP_RMWUPE          (0x1 <<  2) // (UDP) Remote Wake Up Enable

-#define AT91C_UDP_RSMINPR         (0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host

-// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- 

-#define AT91C_UDP_FADD            (0xFF <<  0) // (UDP) Function Address Value

-#define AT91C_UDP_FEN             (0x1 <<  8) // (UDP) Function Enable

-// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- 

-#define AT91C_UDP_EPINT0          (0x1 <<  0) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT1          (0x1 <<  1) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT2          (0x1 <<  2) // (UDP) Endpoint 2 Interrupt

-#define AT91C_UDP_EPINT3          (0x1 <<  3) // (UDP) Endpoint 3 Interrupt

-#define AT91C_UDP_EPINT4          (0x1 <<  4) // (UDP) Endpoint 4 Interrupt

-#define AT91C_UDP_EPINT5          (0x1 <<  5) // (UDP) Endpoint 5 Interrupt

-#define AT91C_UDP_EPINT6          (0x1 <<  6) // (UDP) Endpoint 6 Interrupt

-#define AT91C_UDP_EPINT7          (0x1 <<  7) // (UDP) Endpoint 7 Interrupt

-#define AT91C_UDP_RXSUSP          (0x1 <<  8) // (UDP) USB Suspend Interrupt

-#define AT91C_UDP_RXRSM           (0x1 <<  9) // (UDP) USB Resume Interrupt

-#define AT91C_UDP_EXTRSM          (0x1 << 10) // (UDP) USB External Resume Interrupt

-#define AT91C_UDP_SOFINT          (0x1 << 11) // (UDP) USB Start Of frame Interrupt

-#define AT91C_UDP_WAKEUP          (0x1 << 13) // (UDP) USB Resume Interrupt

-// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- 

-// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- 

-// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- 

-#define AT91C_UDP_ENDBUSRES       (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt

-// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- 

-// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- 

-#define AT91C_UDP_EP0             (0x1 <<  0) // (UDP) Reset Endpoint 0

-#define AT91C_UDP_EP1             (0x1 <<  1) // (UDP) Reset Endpoint 1

-#define AT91C_UDP_EP2             (0x1 <<  2) // (UDP) Reset Endpoint 2

-#define AT91C_UDP_EP3             (0x1 <<  3) // (UDP) Reset Endpoint 3

-#define AT91C_UDP_EP4             (0x1 <<  4) // (UDP) Reset Endpoint 4

-#define AT91C_UDP_EP5             (0x1 <<  5) // (UDP) Reset Endpoint 5

-#define AT91C_UDP_EP6             (0x1 <<  6) // (UDP) Reset Endpoint 6

-#define AT91C_UDP_EP7             (0x1 <<  7) // (UDP) Reset Endpoint 7

-// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- 

-#define AT91C_UDP_TXCOMP          (0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR

-#define AT91C_UDP_RX_DATA_BK0     (0x1 <<  1) // (UDP) Receive Data Bank 0

-#define AT91C_UDP_RXSETUP         (0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)

-#define AT91C_UDP_ISOERROR        (0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)

-#define AT91C_UDP_TXPKTRDY        (0x1 <<  4) // (UDP) Transmit Packet Ready

-#define AT91C_UDP_FORCESTALL      (0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).

-#define AT91C_UDP_RX_DATA_BK1     (0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).

-#define AT91C_UDP_DIR             (0x1 <<  7) // (UDP) Transfer Direction

-#define AT91C_UDP_EPTYPE          (0x7 <<  8) // (UDP) Endpoint type

-#define 	AT91C_UDP_EPTYPE_CTRL                 (0x0 <<  8) // (UDP) Control

-#define 	AT91C_UDP_EPTYPE_ISO_OUT              (0x1 <<  8) // (UDP) Isochronous OUT

-#define 	AT91C_UDP_EPTYPE_BULK_OUT             (0x2 <<  8) // (UDP) Bulk OUT

-#define 	AT91C_UDP_EPTYPE_INT_OUT              (0x3 <<  8) // (UDP) Interrupt OUT

-#define 	AT91C_UDP_EPTYPE_ISO_IN               (0x5 <<  8) // (UDP) Isochronous IN

-#define 	AT91C_UDP_EPTYPE_BULK_IN              (0x6 <<  8) // (UDP) Bulk IN

-#define 	AT91C_UDP_EPTYPE_INT_IN               (0x7 <<  8) // (UDP) Interrupt IN

-#define AT91C_UDP_DTGLE           (0x1 << 11) // (UDP) Data Toggle

-#define AT91C_UDP_EPEDS           (0x1 << 15) // (UDP) Endpoint Enable Disable

-#define AT91C_UDP_RXBYTECNT       (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO

-

-// *****************************************************************************

-//               REGISTER ADDRESS DEFINITION FOR AT91SAM7S64

-// *****************************************************************************

-// ========== Register definition for SYSC peripheral ========== 

-#define AT91C_SYSC_SYSC_VRPM      (0xFFFFFD60) // (SYSC) Voltage Regulator Power Mode Register

-// ========== Register definition for AIC peripheral ========== 

-#define AT91C_AIC_ICCR            (0xFFFFF128) // (AIC) Interrupt Clear Command Register

-#define AT91C_AIC_IECR            (0xFFFFF120) // (AIC) Interrupt Enable Command Register

-#define AT91C_AIC_SMR             (0xFFFFF000) // (AIC) Source Mode Register

-#define AT91C_AIC_ISCR            (0xFFFFF12C) // (AIC) Interrupt Set Command Register

-#define AT91C_AIC_EOICR           (0xFFFFF130) // (AIC) End of Interrupt Command Register

-#define AT91C_AIC_DCR             (0xFFFFF138) // (AIC) Debug Control Register (Protect)

-#define AT91C_AIC_FFER            (0xFFFFF140) // (AIC) Fast Forcing Enable Register

-#define AT91C_AIC_SVR             (0xFFFFF080) // (AIC) Source Vector Register

-#define AT91C_AIC_SPU             (0xFFFFF134) // (AIC) Spurious Vector Register

-#define AT91C_AIC_FFDR            (0xFFFFF144) // (AIC) Fast Forcing Disable Register

-#define AT91C_AIC_FVR             (0xFFFFF104) // (AIC) FIQ Vector Register

-#define AT91C_AIC_FFSR            (0xFFFFF148) // (AIC) Fast Forcing Status Register

-#define AT91C_AIC_IMR             (0xFFFFF110) // (AIC) Interrupt Mask Register

-#define AT91C_AIC_ISR             (0xFFFFF108) // (AIC) Interrupt Status Register

-#define AT91C_AIC_IVR             (0xFFFFF100) // (AIC) IRQ Vector Register

-#define AT91C_AIC_IDCR            (0xFFFFF124) // (AIC) Interrupt Disable Command Register

-#define AT91C_AIC_CISR            (0xFFFFF114) // (AIC) Core Interrupt Status Register

-#define AT91C_AIC_IPR             (0xFFFFF10C) // (AIC) Interrupt Pending Register

-// ========== Register definition for DBGU peripheral ========== 

-#define AT91C_DBGU_C2R            (0xFFFFF244) // (DBGU) Chip ID2 Register

-#define AT91C_DBGU_THR            (0xFFFFF21C) // (DBGU) Transmitter Holding Register

-#define AT91C_DBGU_CSR            (0xFFFFF214) // (DBGU) Channel Status Register

-#define AT91C_DBGU_IDR            (0xFFFFF20C) // (DBGU) Interrupt Disable Register

-#define AT91C_DBGU_MR             (0xFFFFF204) // (DBGU) Mode Register

-#define AT91C_DBGU_FNTR           (0xFFFFF248) // (DBGU) Force NTRST Register

-#define AT91C_DBGU_C1R            (0xFFFFF240) // (DBGU) Chip ID1 Register

-#define AT91C_DBGU_BRGR           (0xFFFFF220) // (DBGU) Baud Rate Generator Register

-#define AT91C_DBGU_RHR            (0xFFFFF218) // (DBGU) Receiver Holding Register

-#define AT91C_DBGU_IMR            (0xFFFFF210) // (DBGU) Interrupt Mask Register

-#define AT91C_DBGU_IER            (0xFFFFF208) // (DBGU) Interrupt Enable Register

-#define AT91C_DBGU_CR             (0xFFFFF200) // (DBGU) Control Register

-// ========== Register definition for PDC_DBGU peripheral ========== 

-#define AT91C_DBGU_TNCR           (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register

-#define AT91C_DBGU_RNCR           (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register

-#define AT91C_DBGU_PTCR           (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register

-#define AT91C_DBGU_PTSR           (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register

-#define AT91C_DBGU_RCR            (0xFFFFF304) // (PDC_DBGU) Receive Counter Register

-#define AT91C_DBGU_TCR            (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register

-#define AT91C_DBGU_RPR            (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register

-#define AT91C_DBGU_TPR            (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register

-#define AT91C_DBGU_RNPR           (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register

-#define AT91C_DBGU_TNPR           (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register

-// ========== Register definition for PIOA peripheral ========== 

-#define AT91C_PIOA_IMR            (0xFFFFF448) // (PIOA) Interrupt Mask Register

-#define AT91C_PIOA_IER            (0xFFFFF440) // (PIOA) Interrupt Enable Register

-#define AT91C_PIOA_OWDR           (0xFFFFF4A4) // (PIOA) Output Write Disable Register

-#define AT91C_PIOA_ISR            (0xFFFFF44C) // (PIOA) Interrupt Status Register

-#define AT91C_PIOA_PPUDR          (0xFFFFF460) // (PIOA) Pull-up Disable Register

-#define AT91C_PIOA_MDSR           (0xFFFFF458) // (PIOA) Multi-driver Status Register

-#define AT91C_PIOA_MDER           (0xFFFFF450) // (PIOA) Multi-driver Enable Register

-#define AT91C_PIOA_PER            (0xFFFFF400) // (PIOA) PIO Enable Register

-#define AT91C_PIOA_PSR            (0xFFFFF408) // (PIOA) PIO Status Register

-#define AT91C_PIOA_OER            (0xFFFFF410) // (PIOA) Output Enable Register

-#define AT91C_PIOA_BSR            (0xFFFFF474) // (PIOA) Select B Register

-#define AT91C_PIOA_PPUER          (0xFFFFF464) // (PIOA) Pull-up Enable Register

-#define AT91C_PIOA_MDDR           (0xFFFFF454) // (PIOA) Multi-driver Disable Register

-#define AT91C_PIOA_PDR            (0xFFFFF404) // (PIOA) PIO Disable Register

-#define AT91C_PIOA_ODR            (0xFFFFF414) // (PIOA) Output Disable Registerr

-#define AT91C_PIOA_IFDR           (0xFFFFF424) // (PIOA) Input Filter Disable Register

-#define AT91C_PIOA_ABSR           (0xFFFFF478) // (PIOA) AB Select Status Register

-#define AT91C_PIOA_ASR            (0xFFFFF470) // (PIOA) Select A Register

-#define AT91C_PIOA_PPUSR          (0xFFFFF468) // (PIOA) Pad Pull-up Status Register

-#define AT91C_PIOA_ODSR           (0xFFFFF438) // (PIOA) Output Data Status Register

-#define AT91C_PIOA_SODR           (0xFFFFF430) // (PIOA) Set Output Data Register

-#define AT91C_PIOA_IFSR           (0xFFFFF428) // (PIOA) Input Filter Status Register

-#define AT91C_PIOA_IFER           (0xFFFFF420) // (PIOA) Input Filter Enable Register

-#define AT91C_PIOA_OSR            (0xFFFFF418) // (PIOA) Output Status Register

-#define AT91C_PIOA_IDR            (0xFFFFF444) // (PIOA) Interrupt Disable Register

-#define AT91C_PIOA_PDSR           (0xFFFFF43C) // (PIOA) Pin Data Status Register

-#define AT91C_PIOA_CODR           (0xFFFFF434) // (PIOA) Clear Output Data Register

-#define AT91C_PIOA_OWSR           (0xFFFFF4A8) // (PIOA) Output Write Status Register

-#define AT91C_PIOA_OWER           (0xFFFFF4A0) // (PIOA) Output Write Enable Register

-// ========== Register definition for CKGR peripheral ========== 

-#define AT91C_CKGR_PLLR           (0xFFFFFC2C) // (CKGR) PLL Register

-#define AT91C_CKGR_MCFR           (0xFFFFFC24) // (CKGR) Main Clock  Frequency Register

-#define AT91C_CKGR_MOR            (0xFFFFFC20) // (CKGR) Main Oscillator Register

-// ========== Register definition for PMC peripheral ========== 

-#define AT91C_PMC_SCSR            (0xFFFFFC08) // (PMC) System Clock Status Register

-#define AT91C_PMC_SCER            (0xFFFFFC00) // (PMC) System Clock Enable Register

-#define AT91C_PMC_IMR             (0xFFFFFC6C) // (PMC) Interrupt Mask Register

-#define AT91C_PMC_IDR             (0xFFFFFC64) // (PMC) Interrupt Disable Register

-#define AT91C_PMC_PCDR            (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register

-#define AT91C_PMC_SCDR            (0xFFFFFC04) // (PMC) System Clock Disable Register

-#define AT91C_PMC_SR              (0xFFFFFC68) // (PMC) Status Register

-#define AT91C_PMC_IER             (0xFFFFFC60) // (PMC) Interrupt Enable Register

-#define AT91C_PMC_MCKR            (0xFFFFFC30) // (PMC) Master Clock Register

-#define AT91C_PMC_MOR             (0xFFFFFC20) // (PMC) Main Oscillator Register

-#define AT91C_PMC_PCER            (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register

-#define AT91C_PMC_PCSR            (0xFFFFFC18) // (PMC) Peripheral Clock Status Register

-#define AT91C_PMC_PLLR            (0xFFFFFC2C) // (PMC) PLL Register

-#define AT91C_PMC_MCFR            (0xFFFFFC24) // (PMC) Main Clock  Frequency Register

-#define AT91C_PMC_PCKR            (0xFFFFFC40) // (PMC) Programmable Clock Register

-// ========== Register definition for RSTC peripheral ========== 

-#define AT91C_RSTC_RSR            (0xFFFFFD04) // (RSTC) Reset Status Register

-#define AT91C_RSTC_RMR            (0xFFFFFD08) // (RSTC) Reset Mode Register

-#define AT91C_RSTC_RCR            (0xFFFFFD00) // (RSTC) Reset Control Register

-// ========== Register definition for RTTC peripheral ========== 

-#define AT91C_RTTC_RTSR           (0xFFFFFD2C) // (RTTC) Real-time Status Register

-#define AT91C_RTTC_RTAR           (0xFFFFFD24) // (RTTC) Real-time Alarm Register

-#define AT91C_RTTC_RTVR           (0xFFFFFD28) // (RTTC) Real-time Value Register

-#define AT91C_RTTC_RTMR           (0xFFFFFD20) // (RTTC) Real-time Mode Register

-// ========== Register definition for PITC peripheral ========== 

-#define AT91C_PITC_PIIR           (0xFFFFFD3C) // (PITC) Period Interval Image Register

-#define AT91C_PITC_PISR           (0xFFFFFD34) // (PITC) Period Interval Status Register

-#define AT91C_PITC_PIVR           (0xFFFFFD38) // (PITC) Period Interval Value Register

-#define AT91C_PITC_PIMR           (0xFFFFFD30) // (PITC) Period Interval Mode Register

-// ========== Register definition for WDTC peripheral ========== 

-#define AT91C_WDTC_WDMR           (0xFFFFFD44) // (WDTC) Watchdog Mode Register

-#define AT91C_WDTC_WDSR           (0xFFFFFD48) // (WDTC) Watchdog Status Register

-#define AT91C_WDTC_WDCR           (0xFFFFFD40) // (WDTC) Watchdog Control Register

-// ========== Register definition for MC peripheral ========== 

-#define AT91C_MC_FCR              (0xFFFFFF64) // (MC) MC Flash Command Register

-#define AT91C_MC_ASR              (0xFFFFFF04) // (MC) MC Abort Status Register

-#define AT91C_MC_FSR              (0xFFFFFF68) // (MC) MC Flash Status Register

-#define AT91C_MC_FMR              (0xFFFFFF60) // (MC) MC Flash Mode Register

-#define AT91C_MC_AASR             (0xFFFFFF08) // (MC) MC Abort Address Status Register

-#define AT91C_MC_RCR              (0xFFFFFF00) // (MC) MC Remap Control Register

-// ========== Register definition for PDC_SPI peripheral ========== 

-#define AT91C_SPI_PTCR            (0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register

-#define AT91C_SPI_TNPR            (0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register

-#define AT91C_SPI_RNPR            (0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register

-#define AT91C_SPI_TPR             (0xFFFE0108) // (PDC_SPI) Transmit Pointer Register

-#define AT91C_SPI_RPR             (0xFFFE0100) // (PDC_SPI) Receive Pointer Register

-#define AT91C_SPI_PTSR            (0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register

-#define AT91C_SPI_TNCR            (0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register

-#define AT91C_SPI_RNCR            (0xFFFE0114) // (PDC_SPI) Receive Next Counter Register

-#define AT91C_SPI_TCR             (0xFFFE010C) // (PDC_SPI) Transmit Counter Register

-#define AT91C_SPI_RCR             (0xFFFE0104) // (PDC_SPI) Receive Counter Register

-// ========== Register definition for SPI peripheral ========== 

-#define AT91C_SPI_CSR             (0xFFFE0030) // (SPI) Chip Select Register

-#define AT91C_SPI_IDR             (0xFFFE0018) // (SPI) Interrupt Disable Register

-#define AT91C_SPI_SR              (0xFFFE0010) // (SPI) Status Register

-#define AT91C_SPI_RDR             (0xFFFE0008) // (SPI) Receive Data Register

-#define AT91C_SPI_CR              (0xFFFE0000) // (SPI) Control Register

-#define AT91C_SPI_IMR             (0xFFFE001C) // (SPI) Interrupt Mask Register

-#define AT91C_SPI_IER             (0xFFFE0014) // (SPI) Interrupt Enable Register

-#define AT91C_SPI_TDR             (0xFFFE000C) // (SPI) Transmit Data Register

-#define AT91C_SPI_MR              (0xFFFE0004) // (SPI) Mode Register

-// ========== Register definition for PDC_ADC peripheral ========== 

-#define AT91C_ADC_PTCR            (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register

-#define AT91C_ADC_TNPR            (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register

-#define AT91C_ADC_RNPR            (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register

-#define AT91C_ADC_TPR             (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register

-#define AT91C_ADC_RPR             (0xFFFD8100) // (PDC_ADC) Receive Pointer Register

-#define AT91C_ADC_PTSR            (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register

-#define AT91C_ADC_TNCR            (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register

-#define AT91C_ADC_RNCR            (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register

-#define AT91C_ADC_TCR             (0xFFFD810C) // (PDC_ADC) Transmit Counter Register

-#define AT91C_ADC_RCR             (0xFFFD8104) // (PDC_ADC) Receive Counter Register

-// ========== Register definition for ADC peripheral ========== 

-#define AT91C_ADC_IMR             (0xFFFD802C) // (ADC) ADC Interrupt Mask Register

-#define AT91C_ADC_CDR4            (0xFFFD8040) // (ADC) ADC Channel Data Register 4

-#define AT91C_ADC_CDR2            (0xFFFD8038) // (ADC) ADC Channel Data Register 2

-#define AT91C_ADC_CDR0            (0xFFFD8030) // (ADC) ADC Channel Data Register 0

-#define AT91C_ADC_CDR7            (0xFFFD804C) // (ADC) ADC Channel Data Register 7

-#define AT91C_ADC_CDR1            (0xFFFD8034) // (ADC) ADC Channel Data Register 1

-#define AT91C_ADC_CDR3            (0xFFFD803C) // (ADC) ADC Channel Data Register 3

-#define AT91C_ADC_CDR5            (0xFFFD8044) // (ADC) ADC Channel Data Register 5

-#define AT91C_ADC_MR              (0xFFFD8004) // (ADC) ADC Mode Register

-#define AT91C_ADC_CDR6            (0xFFFD8048) // (ADC) ADC Channel Data Register 6

-#define AT91C_ADC_CR              (0xFFFD8000) // (ADC) ADC Control Register

-#define AT91C_ADC_CHER            (0xFFFD8010) // (ADC) ADC Channel Enable Register

-#define AT91C_ADC_CHSR            (0xFFFD8018) // (ADC) ADC Channel Status Register

-#define AT91C_ADC_IER             (0xFFFD8024) // (ADC) ADC Interrupt Enable Register

-#define AT91C_ADC_SR              (0xFFFD801C) // (ADC) ADC Status Register

-#define AT91C_ADC_CHDR            (0xFFFD8014) // (ADC) ADC Channel Disable Register

-#define AT91C_ADC_IDR             (0xFFFD8028) // (ADC) ADC Interrupt Disable Register

-#define AT91C_ADC_LCDR            (0xFFFD8020) // (ADC) ADC Last Converted Data Register

-// ========== Register definition for PDC_SSC peripheral ========== 

-#define AT91C_SSC_PTCR            (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register

-#define AT91C_SSC_TNPR            (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register

-#define AT91C_SSC_RNPR            (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register

-#define AT91C_SSC_TPR             (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register

-#define AT91C_SSC_RPR             (0xFFFD4100) // (PDC_SSC) Receive Pointer Register

-#define AT91C_SSC_PTSR            (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register

-#define AT91C_SSC_TNCR            (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register

-#define AT91C_SSC_RNCR            (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register

-#define AT91C_SSC_TCR             (0xFFFD410C) // (PDC_SSC) Transmit Counter Register

-#define AT91C_SSC_RCR             (0xFFFD4104) // (PDC_SSC) Receive Counter Register

-// ========== Register definition for SSC peripheral ========== 

-#define AT91C_SSC_RFMR            (0xFFFD4014) // (SSC) Receive Frame Mode Register

-#define AT91C_SSC_CMR             (0xFFFD4004) // (SSC) Clock Mode Register

-#define AT91C_SSC_IDR             (0xFFFD4048) // (SSC) Interrupt Disable Register

-#define AT91C_SSC_SR              (0xFFFD4040) // (SSC) Status Register

-#define AT91C_SSC_RC0R            (0xFFFD4038) // (SSC) Receive Compare 0 Register

-#define AT91C_SSC_RSHR            (0xFFFD4030) // (SSC) Receive Sync Holding Register

-#define AT91C_SSC_RHR             (0xFFFD4020) // (SSC) Receive Holding Register

-#define AT91C_SSC_TCMR            (0xFFFD4018) // (SSC) Transmit Clock Mode Register

-#define AT91C_SSC_RCMR            (0xFFFD4010) // (SSC) Receive Clock ModeRegister

-#define AT91C_SSC_CR              (0xFFFD4000) // (SSC) Control Register

-#define AT91C_SSC_IMR             (0xFFFD404C) // (SSC) Interrupt Mask Register

-#define AT91C_SSC_IER             (0xFFFD4044) // (SSC) Interrupt Enable Register

-#define AT91C_SSC_RC1R            (0xFFFD403C) // (SSC) Receive Compare 1 Register

-#define AT91C_SSC_TSHR            (0xFFFD4034) // (SSC) Transmit Sync Holding Register

-#define AT91C_SSC_THR             (0xFFFD4024) // (SSC) Transmit Holding Register

-#define AT91C_SSC_TFMR            (0xFFFD401C) // (SSC) Transmit Frame Mode Register

-// ========== Register definition for PDC_US1 peripheral ========== 

-#define AT91C_US1_PTSR            (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register

-#define AT91C_US1_TNCR            (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register

-#define AT91C_US1_RNCR            (0xFFFC4114) // (PDC_US1) Receive Next Counter Register

-#define AT91C_US1_TCR             (0xFFFC410C) // (PDC_US1) Transmit Counter Register

-#define AT91C_US1_RCR             (0xFFFC4104) // (PDC_US1) Receive Counter Register

-#define AT91C_US1_PTCR            (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register

-#define AT91C_US1_TNPR            (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register

-#define AT91C_US1_RNPR            (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register

-#define AT91C_US1_TPR             (0xFFFC4108) // (PDC_US1) Transmit Pointer Register

-#define AT91C_US1_RPR             (0xFFFC4100) // (PDC_US1) Receive Pointer Register

-// ========== Register definition for US1 peripheral ========== 

-#define AT91C_US1_XXR             (0xFFFC4048) // (US1) XON_XOFF Register

-#define AT91C_US1_RHR             (0xFFFC4018) // (US1) Receiver Holding Register

-#define AT91C_US1_IMR             (0xFFFC4010) // (US1) Interrupt Mask Register

-#define AT91C_US1_IER             (0xFFFC4008) // (US1) Interrupt Enable Register

-#define AT91C_US1_CR              (0xFFFC4000) // (US1) Control Register

-#define AT91C_US1_RTOR            (0xFFFC4024) // (US1) Receiver Time-out Register

-#define AT91C_US1_THR             (0xFFFC401C) // (US1) Transmitter Holding Register

-#define AT91C_US1_CSR             (0xFFFC4014) // (US1) Channel Status Register

-#define AT91C_US1_IDR             (0xFFFC400C) // (US1) Interrupt Disable Register

-#define AT91C_US1_FIDI            (0xFFFC4040) // (US1) FI_DI_Ratio Register

-#define AT91C_US1_BRGR            (0xFFFC4020) // (US1) Baud Rate Generator Register

-#define AT91C_US1_TTGR            (0xFFFC4028) // (US1) Transmitter Time-guard Register

-#define AT91C_US1_IF              (0xFFFC404C) // (US1) IRDA_FILTER Register

-#define AT91C_US1_NER             (0xFFFC4044) // (US1) Nb Errors Register

-#define AT91C_US1_MR              (0xFFFC4004) // (US1) Mode Register

-// ========== Register definition for PDC_US0 peripheral ========== 

-#define AT91C_US0_PTCR            (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register

-#define AT91C_US0_TNPR            (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register

-#define AT91C_US0_RNPR            (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register

-#define AT91C_US0_TPR             (0xFFFC0108) // (PDC_US0) Transmit Pointer Register

-#define AT91C_US0_RPR             (0xFFFC0100) // (PDC_US0) Receive Pointer Register

-#define AT91C_US0_PTSR            (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register

-#define AT91C_US0_TNCR            (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register

-#define AT91C_US0_RNCR            (0xFFFC0114) // (PDC_US0) Receive Next Counter Register

-#define AT91C_US0_TCR             (0xFFFC010C) // (PDC_US0) Transmit Counter Register

-#define AT91C_US0_RCR             (0xFFFC0104) // (PDC_US0) Receive Counter Register

-// ========== Register definition for US0 peripheral ========== 

-#define AT91C_US0_TTGR            (0xFFFC0028) // (US0) Transmitter Time-guard Register

-#define AT91C_US0_BRGR            (0xFFFC0020) // (US0) Baud Rate Generator Register

-#define AT91C_US0_RHR             (0xFFFC0018) // (US0) Receiver Holding Register

-#define AT91C_US0_IMR             (0xFFFC0010) // (US0) Interrupt Mask Register

-#define AT91C_US0_NER             (0xFFFC0044) // (US0) Nb Errors Register

-#define AT91C_US0_RTOR            (0xFFFC0024) // (US0) Receiver Time-out Register

-#define AT91C_US0_XXR             (0xFFFC0048) // (US0) XON_XOFF Register

-#define AT91C_US0_FIDI            (0xFFFC0040) // (US0) FI_DI_Ratio Register

-#define AT91C_US0_CR              (0xFFFC0000) // (US0) Control Register

-#define AT91C_US0_IER             (0xFFFC0008) // (US0) Interrupt Enable Register

-#define AT91C_US0_IF              (0xFFFC004C) // (US0) IRDA_FILTER Register

-#define AT91C_US0_MR              (0xFFFC0004) // (US0) Mode Register

-#define AT91C_US0_IDR             (0xFFFC000C) // (US0) Interrupt Disable Register

-#define AT91C_US0_CSR             (0xFFFC0014) // (US0) Channel Status Register

-#define AT91C_US0_THR             (0xFFFC001C) // (US0) Transmitter Holding Register

-// ========== Register definition for TWI peripheral ========== 

-#define AT91C_TWI_RHR             (0xFFFB8030) // (TWI) Receive Holding Register

-#define AT91C_TWI_IDR             (0xFFFB8028) // (TWI) Interrupt Disable Register

-#define AT91C_TWI_SR              (0xFFFB8020) // (TWI) Status Register

-#define AT91C_TWI_CWGR            (0xFFFB8010) // (TWI) Clock Waveform Generator Register

-#define AT91C_TWI_SMR             (0xFFFB8008) // (TWI) Slave Mode Register

-#define AT91C_TWI_CR              (0xFFFB8000) // (TWI) Control Register

-#define AT91C_TWI_THR             (0xFFFB8034) // (TWI) Transmit Holding Register

-#define AT91C_TWI_IMR             (0xFFFB802C) // (TWI) Interrupt Mask Register

-#define AT91C_TWI_IER             (0xFFFB8024) // (TWI) Interrupt Enable Register

-#define AT91C_TWI_IADR            (0xFFFB800C) // (TWI) Internal Address Register

-#define AT91C_TWI_MMR             (0xFFFB8004) // (TWI) Master Mode Register

-// ========== Register definition for TC2 peripheral ========== 

-#define AT91C_TC2_IMR             (0xFFFA00AC) // (TC2) Interrupt Mask Register

-#define AT91C_TC2_IER             (0xFFFA00A4) // (TC2) Interrupt Enable Register

-#define AT91C_TC2_RC              (0xFFFA009C) // (TC2) Register C

-#define AT91C_TC2_RA              (0xFFFA0094) // (TC2) Register A

-#define AT91C_TC2_CMR             (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC2_IDR             (0xFFFA00A8) // (TC2) Interrupt Disable Register

-#define AT91C_TC2_SR              (0xFFFA00A0) // (TC2) Status Register

-#define AT91C_TC2_RB              (0xFFFA0098) // (TC2) Register B

-#define AT91C_TC2_CV              (0xFFFA0090) // (TC2) Counter Value

-#define AT91C_TC2_CCR             (0xFFFA0080) // (TC2) Channel Control Register

-// ========== Register definition for TC1 peripheral ========== 

-#define AT91C_TC1_IMR             (0xFFFA006C) // (TC1) Interrupt Mask Register

-#define AT91C_TC1_IER             (0xFFFA0064) // (TC1) Interrupt Enable Register

-#define AT91C_TC1_RC              (0xFFFA005C) // (TC1) Register C

-#define AT91C_TC1_RA              (0xFFFA0054) // (TC1) Register A

-#define AT91C_TC1_CMR             (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC1_IDR             (0xFFFA0068) // (TC1) Interrupt Disable Register

-#define AT91C_TC1_SR              (0xFFFA0060) // (TC1) Status Register

-#define AT91C_TC1_RB              (0xFFFA0058) // (TC1) Register B

-#define AT91C_TC1_CV              (0xFFFA0050) // (TC1) Counter Value

-#define AT91C_TC1_CCR             (0xFFFA0040) // (TC1) Channel Control Register

-// ========== Register definition for TC0 peripheral ========== 

-#define AT91C_TC0_IMR             (0xFFFA002C) // (TC0) Interrupt Mask Register

-#define AT91C_TC0_IER             (0xFFFA0024) // (TC0) Interrupt Enable Register

-#define AT91C_TC0_RC              (0xFFFA001C) // (TC0) Register C

-#define AT91C_TC0_RA              (0xFFFA0014) // (TC0) Register A

-#define AT91C_TC0_CMR             (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC0_IDR             (0xFFFA0028) // (TC0) Interrupt Disable Register

-#define AT91C_TC0_SR              (0xFFFA0020) // (TC0) Status Register

-#define AT91C_TC0_RB              (0xFFFA0018) // (TC0) Register B

-#define AT91C_TC0_CV              (0xFFFA0010) // (TC0) Counter Value

-#define AT91C_TC0_CCR             (0xFFFA0000) // (TC0) Channel Control Register

-// ========== Register definition for TCB peripheral ========== 

-#define AT91C_TCB_BMR             (0xFFFA00C4) // (TCB) TC Block Mode Register

-#define AT91C_TCB_BCR             (0xFFFA00C0) // (TCB) TC Block Control Register

-// ========== Register definition for PWMC_CH3 peripheral ========== 

-#define AT91C_CH3_CUPDR           (0xFFFCC270) // (PWMC_CH3) Channel Update Register

-#define AT91C_CH3_CPRDR           (0xFFFCC268) // (PWMC_CH3) Channel Period Register

-#define AT91C_CH3_CMR             (0xFFFCC260) // (PWMC_CH3) Channel Mode Register

-#define AT91C_CH3_Reserved        (0xFFFCC274) // (PWMC_CH3) Reserved

-#define AT91C_CH3_CCNTR           (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register

-#define AT91C_CH3_CDTYR           (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register

-// ========== Register definition for PWMC_CH2 peripheral ========== 

-#define AT91C_CH2_CUPDR           (0xFFFCC250) // (PWMC_CH2) Channel Update Register

-#define AT91C_CH2_CPRDR           (0xFFFCC248) // (PWMC_CH2) Channel Period Register

-#define AT91C_CH2_CMR             (0xFFFCC240) // (PWMC_CH2) Channel Mode Register

-#define AT91C_CH2_Reserved        (0xFFFCC254) // (PWMC_CH2) Reserved

-#define AT91C_CH2_CCNTR           (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register

-#define AT91C_CH2_CDTYR           (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register

-// ========== Register definition for PWMC_CH1 peripheral ========== 

-#define AT91C_CH1_CUPDR           (0xFFFCC230) // (PWMC_CH1) Channel Update Register

-#define AT91C_CH1_CPRDR           (0xFFFCC228) // (PWMC_CH1) Channel Period Register

-#define AT91C_CH1_CMR             (0xFFFCC220) // (PWMC_CH1) Channel Mode Register

-#define AT91C_CH1_Reserved        (0xFFFCC234) // (PWMC_CH1) Reserved

-#define AT91C_CH1_CCNTR           (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register

-#define AT91C_CH1_CDTYR           (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register

-// ========== Register definition for PWMC_CH0 peripheral ========== 

-#define AT91C_CH0_CUPDR           (0xFFFCC210) // (PWMC_CH0) Channel Update Register

-#define AT91C_CH0_CPRDR           (0xFFFCC208) // (PWMC_CH0) Channel Period Register

-#define AT91C_CH0_CMR             (0xFFFCC200) // (PWMC_CH0) Channel Mode Register

-#define AT91C_CH0_Reserved        (0xFFFCC214) // (PWMC_CH0) Reserved

-#define AT91C_CH0_CCNTR           (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register

-#define AT91C_CH0_CDTYR           (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register

-// ========== Register definition for PWMC peripheral ========== 

-#define AT91C_PWMC_VR             (0xFFFCC0FC) // (PWMC) PWMC Version Register

-#define AT91C_PWMC_ISR            (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register

-#define AT91C_PWMC_IDR            (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register

-#define AT91C_PWMC_SR             (0xFFFCC00C) // (PWMC) PWMC Status Register

-#define AT91C_PWMC_ENA            (0xFFFCC004) // (PWMC) PWMC Enable Register

-#define AT91C_PWMC_IMR            (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register

-#define AT91C_PWMC_MR             (0xFFFCC000) // (PWMC) PWMC Mode Register

-#define AT91C_PWMC_DIS            (0xFFFCC008) // (PWMC) PWMC Disable Register

-#define AT91C_PWMC_IER            (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register

-// ========== Register definition for UDP peripheral ========== 

-#define AT91C_UDP_ISR             (0xFFFB001C) // (UDP) Interrupt Status Register

-#define AT91C_UDP_IDR             (0xFFFB0014) // (UDP) Interrupt Disable Register

-#define AT91C_UDP_GLBSTATE        (0xFFFB0004) // (UDP) Global State Register

-#define AT91C_UDP_FDR             (0xFFFB0050) // (UDP) Endpoint FIFO Data Register

-#define AT91C_UDP_CSR             (0xFFFB0030) // (UDP) Endpoint Control and Status Register

-#define AT91C_UDP_RSTEP           (0xFFFB0028) // (UDP) Reset Endpoint Register

-#define AT91C_UDP_ICR             (0xFFFB0020) // (UDP) Interrupt Clear Register

-#define AT91C_UDP_IMR             (0xFFFB0018) // (UDP) Interrupt Mask Register

-#define AT91C_UDP_IER             (0xFFFB0010) // (UDP) Interrupt Enable Register

-#define AT91C_UDP_FADDR           (0xFFFB0008) // (UDP) Function Address Register

-#define AT91C_UDP_NUM             (0xFFFB0000) // (UDP) Frame Number Register

-

-// *****************************************************************************

-//               PIO DEFINITIONS FOR AT91SAM7S64

-// *****************************************************************************

-#define AT91C_PIO_PA0             (1 <<  0) // Pin Controlled by PA0

-#define AT91C_PA0_PWM0            (AT91C_PIO_PA0) //  PWM Channel 0

-#define AT91C_PA0_TIOA0           (AT91C_PIO_PA0) //  Timer Counter 0 Multipurpose Timer I/O Pin A

-#define AT91C_PIO_PA1             (1 <<  1) // Pin Controlled by PA1

-#define AT91C_PA1_PWM1            (AT91C_PIO_PA1) //  PWM Channel 1

-#define AT91C_PA1_TIOB0           (AT91C_PIO_PA1) //  Timer Counter 0 Multipurpose Timer I/O Pin B

-#define AT91C_PIO_PA10            (1 << 10) // Pin Controlled by PA10

-#define AT91C_PA10_DTXD           (AT91C_PIO_PA10) //  DBGU Debug Transmit Data

-#define AT91C_PA10_NPCS2          (AT91C_PIO_PA10) //  SPI Peripheral Chip Select 2

-#define AT91C_PIO_PA11            (1 << 11) // Pin Controlled by PA11

-#define AT91C_PA11_NPCS0          (AT91C_PIO_PA11) //  SPI Peripheral Chip Select 0

-#define AT91C_PA11_PWM0           (AT91C_PIO_PA11) //  PWM Channel 0

-#define AT91C_PIO_PA12            (1 << 12) // Pin Controlled by PA12

-#define AT91C_PA12_MISO           (AT91C_PIO_PA12) //  SPI Master In Slave

-#define AT91C_PA12_PWM1           (AT91C_PIO_PA12) //  PWM Channel 1

-#define AT91C_PIO_PA13            (1 << 13) // Pin Controlled by PA13

-#define AT91C_PA13_MOSI           (AT91C_PIO_PA13) //  SPI Master Out Slave

-#define AT91C_PA13_PWM2           (AT91C_PIO_PA13) //  PWM Channel 2

-#define AT91C_PIO_PA14            (1 << 14) // Pin Controlled by PA14

-#define AT91C_PA14_SPCK           (AT91C_PIO_PA14) //  SPI Serial Clock

-#define AT91C_PA14_PWM3           (AT91C_PIO_PA14) //  PWM Channel 3

-#define AT91C_PIO_PA15            (1 << 15) // Pin Controlled by PA15

-#define AT91C_PA15_TF             (AT91C_PIO_PA15) //  SSC Transmit Frame Sync

-#define AT91C_PA15_TIOA1          (AT91C_PIO_PA15) //  Timer Counter 1 Multipurpose Timer I/O Pin A

-#define AT91C_PIO_PA16            (1 << 16) // Pin Controlled by PA16

-#define AT91C_PA16_TK             (AT91C_PIO_PA16) //  SSC Transmit Clock

-#define AT91C_PA16_TIOB1          (AT91C_PIO_PA16) //  Timer Counter 1 Multipurpose Timer I/O Pin B

-#define AT91C_PIO_PA17            (1 << 17) // Pin Controlled by PA17

-#define AT91C_PA17_TD             (AT91C_PIO_PA17) //  SSC Transmit data

-#define AT91C_PA17_PCK1           (AT91C_PIO_PA17) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PA18            (1 << 18) // Pin Controlled by PA18

-#define AT91C_PA18_RD             (AT91C_PIO_PA18) //  SSC Receive Data

-#define AT91C_PA18_PCK2           (AT91C_PIO_PA18) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PA19            (1 << 19) // Pin Controlled by PA19

-#define AT91C_PA19_RK             (AT91C_PIO_PA19) //  SSC Receive Clock

-#define AT91C_PA19_FIQ            (AT91C_PIO_PA19) //  AIC Fast Interrupt Input

-#define AT91C_PIO_PA2             (1 <<  2) // Pin Controlled by PA2

-#define AT91C_PA2_PWM2            (AT91C_PIO_PA2) //  PWM Channel 2

-#define AT91C_PA2_SCK0            (AT91C_PIO_PA2) //  USART 0 Serial Clock

-#define AT91C_PIO_PA20            (1 << 20) // Pin Controlled by PA20

-#define AT91C_PA20_RF             (AT91C_PIO_PA20) //  SSC Receive Frame Sync

-#define AT91C_PA20_IRQ0           (AT91C_PIO_PA20) //  External Interrupt 0

-#define AT91C_PIO_PA21            (1 << 21) // Pin Controlled by PA21

-#define AT91C_PA21_RXD1           (AT91C_PIO_PA21) //  USART 1 Receive Data

-#define AT91C_PA21_PCK1           (AT91C_PIO_PA21) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PA22            (1 << 22) // Pin Controlled by PA22

-#define AT91C_PA22_TXD1           (AT91C_PIO_PA22) //  USART 1 Transmit Data

-#define AT91C_PA22_NPCS3          (AT91C_PIO_PA22) //  SPI Peripheral Chip Select 3

-#define AT91C_PIO_PA23            (1 << 23) // Pin Controlled by PA23

-#define AT91C_PA23_SCK1           (AT91C_PIO_PA23) //  USART 1 Serial Clock

-#define AT91C_PA23_PWM0           (AT91C_PIO_PA23) //  PWM Channel 0

-#define AT91C_PIO_PA24            (1 << 24) // Pin Controlled by PA24

-#define AT91C_PA24_RTS1           (AT91C_PIO_PA24) //  USART 1 Ready To Send

-#define AT91C_PA24_PWM1           (AT91C_PIO_PA24) //  PWM Channel 1

-#define AT91C_PIO_PA25            (1 << 25) // Pin Controlled by PA25

-#define AT91C_PA25_CTS1           (AT91C_PIO_PA25) //  USART 1 Clear To Send

-#define AT91C_PA25_PWM2           (AT91C_PIO_PA25) //  PWM Channel 2

-#define AT91C_PIO_PA26            (1 << 26) // Pin Controlled by PA26

-#define AT91C_PA26_DCD1           (AT91C_PIO_PA26) //  USART 1 Data Carrier Detect

-#define AT91C_PA26_TIOA2          (AT91C_PIO_PA26) //  Timer Counter 2 Multipurpose Timer I/O Pin A

-#define AT91C_PIO_PA27            (1 << 27) // Pin Controlled by PA27

-#define AT91C_PA27_DTR1           (AT91C_PIO_PA27) //  USART 1 Data Terminal ready

-#define AT91C_PA27_TIOB2          (AT91C_PIO_PA27) //  Timer Counter 2 Multipurpose Timer I/O Pin B

-#define AT91C_PIO_PA28            (1 << 28) // Pin Controlled by PA28

-#define AT91C_PA28_DSR1           (AT91C_PIO_PA28) //  USART 1 Data Set ready

-#define AT91C_PA28_TCLK1          (AT91C_PIO_PA28) //  Timer Counter 1 external clock input

-#define AT91C_PIO_PA29            (1 << 29) // Pin Controlled by PA29

-#define AT91C_PA29_RI1            (AT91C_PIO_PA29) //  USART 1 Ring Indicator

-#define AT91C_PA29_TCLK2          (AT91C_PIO_PA29) //  Timer Counter 2 external clock input

-#define AT91C_PIO_PA3             (1 <<  3) // Pin Controlled by PA3

-#define AT91C_PA3_TWD             (AT91C_PIO_PA3) //  TWI Two-wire Serial Data

-#define AT91C_PA3_NPCS3           (AT91C_PIO_PA3) //  SPI Peripheral Chip Select 3

-#define AT91C_PIO_PA30            (1 << 30) // Pin Controlled by PA30

-#define AT91C_PA30_IRQ1           (AT91C_PIO_PA30) //  External Interrupt 1

-#define AT91C_PA30_NPCS2          (AT91C_PIO_PA30) //  SPI Peripheral Chip Select 2

-#define AT91C_PIO_PA31            (1 << 31) // Pin Controlled by PA31

-#define AT91C_PA31_NPCS1          (AT91C_PIO_PA31) //  SPI Peripheral Chip Select 1

-#define AT91C_PA31_PCK2           (AT91C_PIO_PA31) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PA4             (1 <<  4) // Pin Controlled by PA4

-#define AT91C_PA4_TWCK            (AT91C_PIO_PA4) //  TWI Two-wire Serial Clock

-#define AT91C_PA4_TCLK0           (AT91C_PIO_PA4) //  Timer Counter 0 external clock input

-#define AT91C_PIO_PA5             (1 <<  5) // Pin Controlled by PA5

-#define AT91C_PA5_RXD0            (AT91C_PIO_PA5) //  USART 0 Receive Data

-#define AT91C_PA5_NPCS3           (AT91C_PIO_PA5) //  SPI Peripheral Chip Select 3

-#define AT91C_PIO_PA6             (1 <<  6) // Pin Controlled by PA6

-#define AT91C_PA6_TXD0            (AT91C_PIO_PA6) //  USART 0 Transmit Data

-#define AT91C_PA6_PCK0            (AT91C_PIO_PA6) //  PMC Programmable Clock Output 0

-#define AT91C_PIO_PA7             (1 <<  7) // Pin Controlled by PA7

-#define AT91C_PA7_RTS0            (AT91C_PIO_PA7) //  USART 0 Ready To Send

-#define AT91C_PA7_PWM3            (AT91C_PIO_PA7) //  PWM Channel 3

-#define AT91C_PIO_PA8             (1 <<  8) // Pin Controlled by PA8

-#define AT91C_PA8_CTS0            (AT91C_PIO_PA8) //  USART 0 Clear To Send

-#define AT91C_PA8_ADTRG           (AT91C_PIO_PA8) //  ADC External Trigger

-#define AT91C_PIO_PA9             (1 <<  9) // Pin Controlled by PA9

-#define AT91C_PA9_DRXD            (AT91C_PIO_PA9) //  DBGU Debug Receive Data

-#define AT91C_PA9_NPCS1           (AT91C_PIO_PA9) //  SPI Peripheral Chip Select 1

-

-// *****************************************************************************

-//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7S64

-// *****************************************************************************

-#define AT91C_ID_FIQ              ( 0) // Advanced Interrupt Controller (FIQ)

-#define AT91C_ID_SYS              ( 1) // System Peripheral

-#define AT91C_ID_PIOA             ( 2) // Parallel IO Controller

-#define AT91C_ID_3_Reserved       ( 3) // Reserved

-#define AT91C_ID_ADC              ( 4) // Analog-to-Digital Converter

-#define AT91C_ID_SPI              ( 5) // Serial Peripheral Interface

-#define AT91C_ID_US0              ( 6) // USART 0

-#define AT91C_ID_US1              ( 7) // USART 1

-#define AT91C_ID_SSC              ( 8) // Serial Synchronous Controller

-#define AT91C_ID_TWI              ( 9) // Two-Wire Interface

-#define AT91C_ID_PWMC             (10) // PWM Controller

-#define AT91C_ID_UDP              (11) // USB Device Port

-#define AT91C_ID_TC0              (12) // Timer Counter 0

-#define AT91C_ID_TC1              (13) // Timer Counter 1

-#define AT91C_ID_TC2              (14) // Timer Counter 2

-#define AT91C_ID_15_Reserved      (15) // Reserved

-#define AT91C_ID_16_Reserved      (16) // Reserved

-#define AT91C_ID_17_Reserved      (17) // Reserved

-#define AT91C_ID_18_Reserved      (18) // Reserved

-#define AT91C_ID_19_Reserved      (19) // Reserved

-#define AT91C_ID_20_Reserved      (20) // Reserved

-#define AT91C_ID_21_Reserved      (21) // Reserved

-#define AT91C_ID_22_Reserved      (22) // Reserved

-#define AT91C_ID_23_Reserved      (23) // Reserved

-#define AT91C_ID_24_Reserved      (24) // Reserved

-#define AT91C_ID_25_Reserved      (25) // Reserved

-#define AT91C_ID_26_Reserved      (26) // Reserved

-#define AT91C_ID_27_Reserved      (27) // Reserved

-#define AT91C_ID_28_Reserved      (28) // Reserved

-#define AT91C_ID_29_Reserved      (29) // Reserved

-#define AT91C_ID_IRQ0             (30) // Advanced Interrupt Controller (IRQ0)

-#define AT91C_ID_IRQ1             (31) // Advanced Interrupt Controller (IRQ1)

-

-// *****************************************************************************

-//               BASE ADDRESS DEFINITIONS FOR AT91SAM7S64

-// *****************************************************************************

-#define AT91C_BASE_SYSC           (0xFFFFF000) // (SYSC) Base Address

-#define AT91C_BASE_AIC            (0xFFFFF000) // (AIC) Base Address

-#define AT91C_BASE_DBGU           (0xFFFFF200) // (DBGU) Base Address

-#define AT91C_BASE_PDC_DBGU       (0xFFFFF300) // (PDC_DBGU) Base Address

-#define AT91C_BASE_PIOA           (0xFFFFF400) // (PIOA) Base Address

-#define AT91C_BASE_CKGR           (0xFFFFFC20) // (CKGR) Base Address

-#define AT91C_BASE_PMC            (0xFFFFFC00) // (PMC) Base Address

-#define AT91C_BASE_RSTC           (0xFFFFFD00) // (RSTC) Base Address

-#define AT91C_BASE_RTTC           (0xFFFFFD20) // (RTTC) Base Address

-#define AT91C_BASE_PITC           (0xFFFFFD30) // (PITC) Base Address

-#define AT91C_BASE_WDTC           (0xFFFFFD40) // (WDTC) Base Address

-#define AT91C_BASE_MC             (0xFFFFFF00) // (MC) Base Address

-#define AT91C_BASE_PDC_SPI        (0xFFFE0100) // (PDC_SPI) Base Address

-#define AT91C_BASE_SPI            (0xFFFE0000) // (SPI) Base Address

-#define AT91C_BASE_PDC_ADC        (0xFFFD8100) // (PDC_ADC) Base Address

-#define AT91C_BASE_ADC            (0xFFFD8000) // (ADC) Base Address

-#define AT91C_BASE_PDC_SSC        (0xFFFD4100) // (PDC_SSC) Base Address

-#define AT91C_BASE_SSC            (0xFFFD4000) // (SSC) Base Address

-#define AT91C_BASE_PDC_US1        (0xFFFC4100) // (PDC_US1) Base Address

-#define AT91C_BASE_US1            (0xFFFC4000) // (US1) Base Address

-#define AT91C_BASE_PDC_US0        (0xFFFC0100) // (PDC_US0) Base Address

-#define AT91C_BASE_US0            (0xFFFC0000) // (US0) Base Address

-#define AT91C_BASE_TWI            (0xFFFB8000) // (TWI) Base Address

-#define AT91C_BASE_TC2            (0xFFFA0080) // (TC2) Base Address

-#define AT91C_BASE_TC1            (0xFFFA0040) // (TC1) Base Address

-#define AT91C_BASE_TC0            (0xFFFA0000) // (TC0) Base Address

-#define AT91C_BASE_TCB            (0xFFFA0000) // (TCB) Base Address

-#define AT91C_BASE_PWMC_CH3       (0xFFFCC260) // (PWMC_CH3) Base Address

-#define AT91C_BASE_PWMC_CH2       (0xFFFCC240) // (PWMC_CH2) Base Address

-#define AT91C_BASE_PWMC_CH1       (0xFFFCC220) // (PWMC_CH1) Base Address

-#define AT91C_BASE_PWMC_CH0       (0xFFFCC200) // (PWMC_CH0) Base Address

-#define AT91C_BASE_PWMC           (0xFFFCC000) // (PWMC) Base Address

-#define AT91C_BASE_UDP            (0xFFFB0000) // (UDP) Base Address

-

-// *****************************************************************************

-//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7S64

-// *****************************************************************************

-#define AT91C_ISRAM	              (0x00200000) // Internal SRAM base address

-#define AT91C_ISRAM_SIZE	         (0x00004000) // Internal SRAM size in byte (16 Kbyte)

-#define AT91C_IFLASH	             (0x00100000) // Internal ROM base address

-#define AT91C_IFLASH_SIZE	        (0x00010000) // Internal ROM size in byte (64 Kbyte)

-

-

+// ----------------------------------------------------------------------------
+//          ATMEL Microcontroller Software Support  -  ROUSSET  -
+// ----------------------------------------------------------------------------
+//  The software is delivered "AS IS" without warranty or condition of any
+//  kind, either express, implied or statutory. This includes without
+//  limitation any warranty or condition with respect to merchantability or
+//  fitness for any particular purpose, or against the infringements of
+//  intellectual property rights of others.
+// ----------------------------------------------------------------------------
+// File Name           : AT91SAM7S64.h
+// Object              : AT91SAM7S64 definitions
+// Generated           : AT91 SW Application Group  07/16/2004 (07:43:09)
+//
+// CVS Reference       : /AT91SAM7S64.pl/1.12/Mon Jul 12 13:02:30 2004//
+// CVS Reference       : /SYSC_SAM7Sxx.pl/1.5/Mon Jul 12 16:22:12 2004//
+// CVS Reference       : /MC_SAM02.pl/1.3/Wed Mar 10 08:37:04 2004//
+// CVS Reference       : /UDP_1765B.pl/1.3/Fri Aug  2 14:45:38 2002//
+// CVS Reference       : /AIC_1796B.pl/1.1.1.1/Fri Jun 28 09:36:48 2002//
+// CVS Reference       : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004//
+// CVS Reference       : /PIO_1725D.pl/1.1.1.1/Fri Jun 28 09:36:48 2002//
+// CVS Reference       : /DBGU_1754A.pl/1.4/Fri Jan 31 12:18:24 2003//
+// CVS Reference       : /US_1739C.pl/1.2/Mon Jul 12 17:26:24 2004//
+// CVS Reference       : /SPI2.pl/1.2/Fri Oct 17 08:13:40 2003//
+// CVS Reference       : /SSC_1762A.pl/1.2/Fri Nov  8 13:26:40 2002//
+// CVS Reference       : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003//
+// CVS Reference       : /TWI_1761B.pl/1.4/Fri Feb  7 10:30:08 2003//
+// CVS Reference       : /PDC_1734B.pl/1.2/Thu Nov 21 16:38:24 2002//
+// CVS Reference       : /ADC_SAM.pl/1.7/Fri Oct 17 08:12:38 2003//
+// CVS Reference       : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004//
+// ----------------------------------------------------------------------------
+
+// Hardware register definition
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR System Peripherals
+// *****************************************************************************
+// *** Register offset in AT91S_SYSC structure ***
+#define SYSC_AIC_SMR    ( 0) // Source Mode Register
+#define SYSC_AIC_SVR    (128) // Source Vector Register
+#define SYSC_AIC_IVR    (256) // IRQ Vector Register
+#define SYSC_AIC_FVR    (260) // FIQ Vector Register
+#define SYSC_AIC_ISR    (264) // Interrupt Status Register
+#define SYSC_AIC_IPR    (268) // Interrupt Pending Register
+#define SYSC_AIC_IMR    (272) // Interrupt Mask Register
+#define SYSC_AIC_CISR   (276) // Core Interrupt Status Register
+#define SYSC_AIC_IECR   (288) // Interrupt Enable Command Register
+#define SYSC_AIC_IDCR   (292) // Interrupt Disable Command Register
+#define SYSC_AIC_ICCR   (296) // Interrupt Clear Command Register
+#define SYSC_AIC_ISCR   (300) // Interrupt Set Command Register
+#define SYSC_AIC_EOICR  (304) // End of Interrupt Command Register
+#define SYSC_AIC_SPU    (308) // Spurious Vector Register
+#define SYSC_AIC_DCR    (312) // Debug Control Register (Protect)
+#define SYSC_AIC_FFER   (320) // Fast Forcing Enable Register
+#define SYSC_AIC_FFDR   (324) // Fast Forcing Disable Register
+#define SYSC_AIC_FFSR   (328) // Fast Forcing Status Register
+#define SYSC_DBGU_CR    (512) // Control Register
+#define SYSC_DBGU_MR    (516) // Mode Register
+#define SYSC_DBGU_IER   (520) // Interrupt Enable Register
+#define SYSC_DBGU_IDR   (524) // Interrupt Disable Register
+#define SYSC_DBGU_IMR   (528) // Interrupt Mask Register
+#define SYSC_DBGU_CSR   (532) // Channel Status Register
+#define SYSC_DBGU_RHR   (536) // Receiver Holding Register
+#define SYSC_DBGU_THR   (540) // Transmitter Holding Register
+#define SYSC_DBGU_BRGR  (544) // Baud Rate Generator Register
+#define SYSC_DBGU_C1R   (576) // Chip ID1 Register
+#define SYSC_DBGU_C2R   (580) // Chip ID2 Register
+#define SYSC_DBGU_FNTR  (584) // Force NTRST Register
+#define SYSC_DBGU_RPR   (768) // Receive Pointer Register
+#define SYSC_DBGU_RCR   (772) // Receive Counter Register
+#define SYSC_DBGU_TPR   (776) // Transmit Pointer Register
+#define SYSC_DBGU_TCR   (780) // Transmit Counter Register
+#define SYSC_DBGU_RNPR  (784) // Receive Next Pointer Register
+#define SYSC_DBGU_RNCR  (788) // Receive Next Counter Register
+#define SYSC_DBGU_TNPR  (792) // Transmit Next Pointer Register
+#define SYSC_DBGU_TNCR  (796) // Transmit Next Counter Register
+#define SYSC_DBGU_PTCR  (800) // PDC Transfer Control Register
+#define SYSC_DBGU_PTSR  (804) // PDC Transfer Status Register
+#define SYSC_PIOA_PER   (1024) // PIO Enable Register
+#define SYSC_PIOA_PDR   (1028) // PIO Disable Register
+#define SYSC_PIOA_PSR   (1032) // PIO Status Register
+#define SYSC_PIOA_OER   (1040) // Output Enable Register
+#define SYSC_PIOA_ODR   (1044) // Output Disable Registerr
+#define SYSC_PIOA_OSR   (1048) // Output Status Register
+#define SYSC_PIOA_IFER  (1056) // Input Filter Enable Register
+#define SYSC_PIOA_IFDR  (1060) // Input Filter Disable Register
+#define SYSC_PIOA_IFSR  (1064) // Input Filter Status Register
+#define SYSC_PIOA_SODR  (1072) // Set Output Data Register
+#define SYSC_PIOA_CODR  (1076) // Clear Output Data Register
+#define SYSC_PIOA_ODSR  (1080) // Output Data Status Register
+#define SYSC_PIOA_PDSR  (1084) // Pin Data Status Register
+#define SYSC_PIOA_IER   (1088) // Interrupt Enable Register
+#define SYSC_PIOA_IDR   (1092) // Interrupt Disable Register
+#define SYSC_PIOA_IMR   (1096) // Interrupt Mask Register
+#define SYSC_PIOA_ISR   (1100) // Interrupt Status Register
+#define SYSC_PIOA_MDER  (1104) // Multi-driver Enable Register
+#define SYSC_PIOA_MDDR  (1108) // Multi-driver Disable Register
+#define SYSC_PIOA_MDSR  (1112) // Multi-driver Status Register
+#define SYSC_PIOA_PPUDR (1120) // Pull-up Disable Register
+#define SYSC_PIOA_PPUER (1124) // Pull-up Enable Register
+#define SYSC_PIOA_PPUSR (1128) // Pad Pull-up Status Register
+#define SYSC_PIOA_ASR   (1136) // Select A Register
+#define SYSC_PIOA_BSR   (1140) // Select B Register
+#define SYSC_PIOA_ABSR  (1144) // AB Select Status Register
+#define SYSC_PIOA_OWER  (1184) // Output Write Enable Register
+#define SYSC_PIOA_OWDR  (1188) // Output Write Disable Register
+#define SYSC_PIOA_OWSR  (1192) // Output Write Status Register
+#define SYSC_PMC_SCER   (3072) // System Clock Enable Register
+#define SYSC_PMC_SCDR   (3076) // System Clock Disable Register
+#define SYSC_PMC_SCSR   (3080) // System Clock Status Register
+#define SYSC_PMC_PCER   (3088) // Peripheral Clock Enable Register
+#define SYSC_PMC_PCDR   (3092) // Peripheral Clock Disable Register
+#define SYSC_PMC_PCSR   (3096) // Peripheral Clock Status Register
+#define SYSC_PMC_MOR    (3104) // Main Oscillator Register
+#define SYSC_PMC_MCFR   (3108) // Main Clock  Frequency Register
+#define SYSC_PMC_PLLR   (3116) // PLL Register
+#define SYSC_PMC_MCKR   (3120) // Master Clock Register
+#define SYSC_PMC_PCKR   (3136) // Programmable Clock Register
+#define SYSC_PMC_IER    (3168) // Interrupt Enable Register
+#define SYSC_PMC_IDR    (3172) // Interrupt Disable Register
+#define SYSC_PMC_SR     (3176) // Status Register
+#define SYSC_PMC_IMR    (3180) // Interrupt Mask Register
+#define SYSC_RSTC_RCR   (3328) // Reset Control Register
+#define SYSC_RSTC_RSR   (3332) // Reset Status Register
+#define SYSC_RSTC_RMR   (3336) // Reset Mode Register
+#define SYSC_RTTC_RTMR  (3360) // Real-time Mode Register
+#define SYSC_RTTC_RTAR  (3364) // Real-time Alarm Register
+#define SYSC_RTTC_RTVR  (3368) // Real-time Value Register
+#define SYSC_RTTC_RTSR  (3372) // Real-time Status Register
+#define SYSC_PITC_PIMR  (3376) // Period Interval Mode Register
+#define SYSC_PITC_PISR  (3380) // Period Interval Status Register
+#define SYSC_PITC_PIVR  (3384) // Period Interval Value Register
+#define SYSC_PITC_PIIR  (3388) // Period Interval Image Register
+#define SYSC_WDTC_WDCR  (3392) // Watchdog Control Register
+#define SYSC_WDTC_WDMR  (3396) // Watchdog Mode Register
+#define SYSC_WDTC_WDSR  (3400) // Watchdog Status Register
+#define SYSC_SYSC_VRPM  (3424) // Voltage Regulator Power Mode Register
+// -------- VRPM : (SYSC Offset: 0xd60) Voltage Regulator Power Mode Register --------
+#define AT91C_SYSC_PSTDBY         (0x1 <<  0) // (SYSC) Voltage Regulator Power Mode
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller
+// *****************************************************************************
+// *** Register offset in AT91S_AIC structure ***
+#define AIC_SMR         ( 0) // Source Mode Register
+#define AIC_SVR         (128) // Source Vector Register
+#define AIC_IVR         (256) // IRQ Vector Register
+#define AIC_FVR         (260) // FIQ Vector Register
+#define AIC_ISR         (264) // Interrupt Status Register
+#define AIC_IPR         (268) // Interrupt Pending Register
+#define AIC_IMR         (272) // Interrupt Mask Register
+#define AIC_CISR        (276) // Core Interrupt Status Register
+#define AIC_IECR        (288) // Interrupt Enable Command Register
+#define AIC_IDCR        (292) // Interrupt Disable Command Register
+#define AIC_ICCR        (296) // Interrupt Clear Command Register
+#define AIC_ISCR        (300) // Interrupt Set Command Register
+#define AIC_EOICR       (304) // End of Interrupt Command Register
+#define AIC_SPU         (308) // Spurious Vector Register
+#define AIC_DCR         (312) // Debug Control Register (Protect)
+#define AIC_FFER        (320) // Fast Forcing Enable Register
+#define AIC_FFDR        (324) // Fast Forcing Disable Register
+#define AIC_FFSR        (328) // Fast Forcing Status Register
+// -------- AIC_SMR : (AIC Offset: 0x0) Control Register --------
+#define AT91C_AIC_PRIOR           (0x7 <<  0) // (AIC) Priority Level
+#define     AT91C_AIC_PRIOR_LOWEST               (0x0) // (AIC) Lowest priority level
+#define     AT91C_AIC_PRIOR_HIGHEST              (0x7) // (AIC) Highest priority level
+#define AT91C_AIC_SRCTYPE         (0x3 <<  5) // (AIC) Interrupt Source Type
+#define     AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE  (0x0 <<  5) // (AIC) Internal Sources Code Label Level Sensitive
+#define     AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED   (0x1 <<  5) // (AIC) Internal Sources Code Label Edge triggered
+#define     AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL       (0x2 <<  5) // (AIC) External Sources Code Label High-level Sensitive
+#define     AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE    (0x3 <<  5) // (AIC) External Sources Code Label Positive Edge triggered
+// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register --------
+#define AT91C_AIC_NFIQ            (0x1 <<  0) // (AIC) NFIQ Status
+#define AT91C_AIC_NIRQ            (0x1 <<  1) // (AIC) NIRQ Status
+// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) --------
+#define AT91C_AIC_DCR_PROT        (0x1 <<  0) // (AIC) Protection Mode
+#define AT91C_AIC_DCR_GMSK        (0x1 <<  1) // (AIC) General Mask
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Debug Unit
+// *****************************************************************************
+// *** Register offset in AT91S_DBGU structure ***
+#define DBGU_CR         ( 0) // Control Register
+#define DBGU_MR         ( 4) // Mode Register
+#define DBGU_IER        ( 8) // Interrupt Enable Register
+#define DBGU_IDR        (12) // Interrupt Disable Register
+#define DBGU_IMR        (16) // Interrupt Mask Register
+#define DBGU_CSR        (20) // Channel Status Register
+#define DBGU_RHR        (24) // Receiver Holding Register
+#define DBGU_THR        (28) // Transmitter Holding Register
+#define DBGU_BRGR       (32) // Baud Rate Generator Register
+#define DBGU_C1R        (64) // Chip ID1 Register
+#define DBGU_C2R        (68) // Chip ID2 Register
+#define DBGU_FNTR       (72) // Force NTRST Register
+#define DBGU_RPR        (256) // Receive Pointer Register
+#define DBGU_RCR        (260) // Receive Counter Register
+#define DBGU_TPR        (264) // Transmit Pointer Register
+#define DBGU_TCR        (268) // Transmit Counter Register
+#define DBGU_RNPR       (272) // Receive Next Pointer Register
+#define DBGU_RNCR       (276) // Receive Next Counter Register
+#define DBGU_TNPR       (280) // Transmit Next Pointer Register
+#define DBGU_TNCR       (284) // Transmit Next Counter Register
+#define DBGU_PTCR       (288) // PDC Transfer Control Register
+#define DBGU_PTSR       (292) // PDC Transfer Status Register
+// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_RSTRX            (0x1 <<  2) // (DBGU) Reset Receiver
+#define AT91C_US_RSTTX            (0x1 <<  3) // (DBGU) Reset Transmitter
+#define AT91C_US_RXEN             (0x1 <<  4) // (DBGU) Receiver Enable
+#define AT91C_US_RXDIS            (0x1 <<  5) // (DBGU) Receiver Disable
+#define AT91C_US_TXEN             (0x1 <<  6) // (DBGU) Transmitter Enable
+#define AT91C_US_TXDIS            (0x1 <<  7) // (DBGU) Transmitter Disable
+// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_PAR              (0x7 <<  9) // (DBGU) Parity type
+#define     AT91C_US_PAR_EVEN                 (0x0 <<  9) // (DBGU) Even Parity
+#define     AT91C_US_PAR_ODD                  (0x1 <<  9) // (DBGU) Odd Parity
+#define     AT91C_US_PAR_SPACE                (0x2 <<  9) // (DBGU) Parity forced to 0 (Space)
+#define     AT91C_US_PAR_MARK                 (0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)
+#define     AT91C_US_PAR_NONE                 (0x4 <<  9) // (DBGU) No Parity
+#define     AT91C_US_PAR_MULTI_DROP           (0x6 <<  9) // (DBGU) Multi-drop mode
+#define AT91C_US_CHMODE           (0x3 << 14) // (DBGU) Channel Mode
+#define     AT91C_US_CHMODE_NORMAL               (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.
+#define     AT91C_US_CHMODE_AUTO                 (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.
+#define     AT91C_US_CHMODE_LOCAL                (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.
+#define     AT91C_US_CHMODE_REMOTE               (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.
+// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXRDY            (0x1 <<  0) // (DBGU) RXRDY Interrupt
+#define AT91C_US_TXRDY            (0x1 <<  1) // (DBGU) TXRDY Interrupt
+#define AT91C_US_ENDRX            (0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt
+#define AT91C_US_ENDTX            (0x1 <<  4) // (DBGU) End of Transmit Interrupt
+#define AT91C_US_OVRE             (0x1 <<  5) // (DBGU) Overrun Interrupt
+#define AT91C_US_FRAME            (0x1 <<  6) // (DBGU) Framing Error Interrupt
+#define AT91C_US_PARE             (0x1 <<  7) // (DBGU) Parity Error Interrupt
+#define AT91C_US_TXEMPTY          (0x1 <<  9) // (DBGU) TXEMPTY Interrupt
+#define AT91C_US_TXBUFE           (0x1 << 11) // (DBGU) TXBUFE Interrupt
+#define AT91C_US_RXBUFF           (0x1 << 12) // (DBGU) RXBUFF Interrupt
+#define AT91C_US_COMM_TX          (0x1 << 30) // (DBGU) COMM_TX Interrupt
+#define AT91C_US_COMM_RX          (0x1 << 31) // (DBGU) COMM_RX Interrupt
+// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register --------
+// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register --------
+#define AT91C_US_FORCE_NTRST      (0x1 <<  0) // (DBGU) Force NTRST in JTAG
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Peripheral Data Controller
+// *****************************************************************************
+// *** Register offset in AT91S_PDC structure ***
+#define PDC_RPR         ( 0) // Receive Pointer Register
+#define PDC_RCR         ( 4) // Receive Counter Register
+#define PDC_TPR         ( 8) // Transmit Pointer Register
+#define PDC_TCR         (12) // Transmit Counter Register
+#define PDC_RNPR        (16) // Receive Next Pointer Register
+#define PDC_RNCR        (20) // Receive Next Counter Register
+#define PDC_TNPR        (24) // Transmit Next Pointer Register
+#define PDC_TNCR        (28) // Transmit Next Counter Register
+#define PDC_PTCR        (32) // PDC Transfer Control Register
+#define PDC_PTSR        (36) // PDC Transfer Status Register
+// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register --------
+#define AT91C_PDC_RXTEN           (0x1 <<  0) // (PDC) Receiver Transfer Enable
+#define AT91C_PDC_RXTDIS          (0x1 <<  1) // (PDC) Receiver Transfer Disable
+#define AT91C_PDC_TXTEN           (0x1 <<  8) // (PDC) Transmitter Transfer Enable
+#define AT91C_PDC_TXTDIS          (0x1 <<  9) // (PDC) Transmitter Transfer Disable
+// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler
+// *****************************************************************************
+// *** Register offset in AT91S_PIO structure ***
+#define PIO_PER         ( 0) // PIO Enable Register
+#define PIO_PDR         ( 4) // PIO Disable Register
+#define PIO_PSR         ( 8) // PIO Status Register
+#define PIO_OER         (16) // Output Enable Register
+#define PIO_ODR         (20) // Output Disable Registerr
+#define PIO_OSR         (24) // Output Status Register
+#define PIO_IFER        (32) // Input Filter Enable Register
+#define PIO_IFDR        (36) // Input Filter Disable Register
+#define PIO_IFSR        (40) // Input Filter Status Register
+#define PIO_SODR        (48) // Set Output Data Register
+#define PIO_CODR        (52) // Clear Output Data Register
+#define PIO_ODSR        (56) // Output Data Status Register
+#define PIO_PDSR        (60) // Pin Data Status Register
+#define PIO_IER         (64) // Interrupt Enable Register
+#define PIO_IDR         (68) // Interrupt Disable Register
+#define PIO_IMR         (72) // Interrupt Mask Register
+#define PIO_ISR         (76) // Interrupt Status Register
+#define PIO_MDER        (80) // Multi-driver Enable Register
+#define PIO_MDDR        (84) // Multi-driver Disable Register
+#define PIO_MDSR        (88) // Multi-driver Status Register
+#define PIO_PPUDR       (96) // Pull-up Disable Register
+#define PIO_PPUER       (100) // Pull-up Enable Register
+#define PIO_PPUSR       (104) // Pad Pull-up Status Register
+#define PIO_ASR         (112) // Select A Register
+#define PIO_BSR         (116) // Select B Register
+#define PIO_ABSR        (120) // AB Select Status Register
+#define PIO_OWER        (160) // Output Write Enable Register
+#define PIO_OWDR        (164) // Output Write Disable Register
+#define PIO_OWSR        (168) // Output Write Status Register
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Clock Generator Controler
+// *****************************************************************************
+// *** Register offset in AT91S_CKGR structure ***
+#define CKGR_MOR        ( 0) // Main Oscillator Register
+#define CKGR_MCFR       ( 4) // Main Clock  Frequency Register
+#define CKGR_PLLR       (12) // PLL Register
+// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register --------
+#define AT91C_CKGR_MOSCEN         (0x1 <<  0) // (CKGR) Main Oscillator Enable
+#define AT91C_CKGR_OSCBYPASS      (0x1 <<  1) // (CKGR) Main Oscillator Bypass
+#define AT91C_CKGR_OSCOUNT        (0xFF <<  8) // (CKGR) Main Oscillator Start-up Time
+// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register --------
+#define AT91C_CKGR_MAINF          (0xFFFF <<  0) // (CKGR) Main Clock Frequency
+#define AT91C_CKGR_MAINRDY        (0x1 << 16) // (CKGR) Main Clock Ready
+// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register --------
+#define AT91C_CKGR_DIV            (0xFF <<  0) // (CKGR) Divider Selected
+#define     AT91C_CKGR_DIV_0                    (0x0) // (CKGR) Divider output is 0
+#define     AT91C_CKGR_DIV_BYPASS               (0x1) // (CKGR) Divider is bypassed
+#define AT91C_CKGR_PLLCOUNT       (0x3F <<  8) // (CKGR) PLL Counter
+#define AT91C_CKGR_OUT            (0x3 << 14) // (CKGR) PLL Output Frequency Range
+#define     AT91C_CKGR_OUT_0                    (0x0 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_1                    (0x1 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_2                    (0x2 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_3                    (0x3 << 14) // (CKGR) Please refer to the PLL datasheet
+#define AT91C_CKGR_MUL            (0x7FF << 16) // (CKGR) PLL Multiplier
+#define AT91C_CKGR_USBDIV         (0x3 << 28) // (CKGR) Divider for USB Clocks
+#define     AT91C_CKGR_USBDIV_0                    (0x0 << 28) // (CKGR) Divider output is PLL clock output
+#define     AT91C_CKGR_USBDIV_1                    (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2
+#define     AT91C_CKGR_USBDIV_2                    (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Power Management Controler
+// *****************************************************************************
+// *** Register offset in AT91S_PMC structure ***
+#define PMC_SCER        ( 0) // System Clock Enable Register
+#define PMC_SCDR        ( 4) // System Clock Disable Register
+#define PMC_SCSR        ( 8) // System Clock Status Register
+#define PMC_PCER        (16) // Peripheral Clock Enable Register
+#define PMC_PCDR        (20) // Peripheral Clock Disable Register
+#define PMC_PCSR        (24) // Peripheral Clock Status Register
+#define PMC_MOR         (32) // Main Oscillator Register
+#define PMC_MCFR        (36) // Main Clock  Frequency Register
+#define PMC_PLLR        (44) // PLL Register
+#define PMC_MCKR        (48) // Master Clock Register
+#define PMC_PCKR        (64) // Programmable Clock Register
+#define PMC_IER         (96) // Interrupt Enable Register
+#define PMC_IDR         (100) // Interrupt Disable Register
+#define PMC_SR          (104) // Status Register
+#define PMC_IMR         (108) // Interrupt Mask Register
+// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register --------
+#define AT91C_PMC_PCK             (0x1 <<  0) // (PMC) Processor Clock
+#define AT91C_PMC_UDP             (0x1 <<  7) // (PMC) USB Device Port Clock
+#define AT91C_PMC_PCK0            (0x1 <<  8) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK1            (0x1 <<  9) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK2            (0x1 << 10) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK3            (0x1 << 11) // (PMC) Programmable Clock Output
+// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register --------
+// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register --------
+// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register --------
+// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register --------
+// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register --------
+// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register --------
+#define AT91C_PMC_CSS             (0x3 <<  0) // (PMC) Programmable Clock Selection
+#define     AT91C_PMC_CSS_SLOW_CLK             (0x0) // (PMC) Slow Clock is selected
+#define     AT91C_PMC_CSS_MAIN_CLK             (0x1) // (PMC) Main Clock is selected
+#define     AT91C_PMC_CSS_PLL_CLK              (0x3) // (PMC) Clock from PLL is selected
+#define AT91C_PMC_PRES            (0x7 <<  2) // (PMC) Programmable Clock Prescaler
+#define     AT91C_PMC_PRES_CLK                  (0x0 <<  2) // (PMC) Selected clock
+#define     AT91C_PMC_PRES_CLK_2                (0x1 <<  2) // (PMC) Selected clock divided by 2
+#define     AT91C_PMC_PRES_CLK_4                (0x2 <<  2) // (PMC) Selected clock divided by 4
+#define     AT91C_PMC_PRES_CLK_8                (0x3 <<  2) // (PMC) Selected clock divided by 8
+#define     AT91C_PMC_PRES_CLK_16               (0x4 <<  2) // (PMC) Selected clock divided by 16
+#define     AT91C_PMC_PRES_CLK_32               (0x5 <<  2) // (PMC) Selected clock divided by 32
+#define     AT91C_PMC_PRES_CLK_64               (0x6 <<  2) // (PMC) Selected clock divided by 64
+// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register --------
+// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register --------
+#define AT91C_PMC_MOSCS           (0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask
+#define AT91C_PMC_LOCK            (0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask
+#define AT91C_PMC_MCKRDY          (0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK0RDY         (0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK1RDY         (0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK2RDY         (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK3RDY         (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask
+// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register --------
+// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register --------
+// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Reset Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_RSTC structure ***
+#define RSTC_RCR        ( 0) // Reset Control Register
+#define RSTC_RSR        ( 4) // Reset Status Register
+#define RSTC_RMR        ( 8) // Reset Mode Register
+// -------- SYSC_RCR : (RSTC Offset: 0x0) Reset Control Register --------
+#define AT91C_SYSC_PROCRST        (0x1 <<  0) // (RSTC) Processor Reset
+#define AT91C_SYSC_ICERST         (0x1 <<  1) // (RSTC) ICE Interface Reset
+#define AT91C_SYSC_PERRST         (0x1 <<  2) // (RSTC) Peripheral Reset
+#define AT91C_SYSC_EXTRST         (0x1 <<  3) // (RSTC) External Reset
+#define AT91C_SYSC_KEY            (0xFF << 24) // (RSTC) Password
+// -------- SYSC_RSR : (RSTC Offset: 0x4) Reset Status Register --------
+#define AT91C_SYSC_URSTS          (0x1 <<  0) // (RSTC) User Reset Status
+#define AT91C_SYSC_BODSTS         (0x1 <<  1) // (RSTC) Brown-out Detection Status
+#define AT91C_SYSC_RSTTYP         (0x7 <<  8) // (RSTC) Reset Type
+#define     AT91C_SYSC_RSTTYP_POWERUP              (0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.
+#define     AT91C_SYSC_RSTTYP_WATCHDOG             (0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.
+#define     AT91C_SYSC_RSTTYP_SOFTWARE             (0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.
+#define     AT91C_SYSC_RSTTYP_USER                 (0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.
+#define     AT91C_SYSC_RSTTYP_BROWNOUT             (0x5 <<  8) // (RSTC) Brown-out Reset.
+#define AT91C_SYSC_NRSTL          (0x1 << 16) // (RSTC) NRST pin level
+#define AT91C_SYSC_SRCMP          (0x1 << 17) // (RSTC) Software Reset Command in Progress.
+// -------- SYSC_RMR : (RSTC Offset: 0x8) Reset Mode Register --------
+#define AT91C_SYSC_URSTEN         (0x1 <<  0) // (RSTC) User Reset Enable
+#define AT91C_SYSC_URSTIEN        (0x1 <<  4) // (RSTC) User Reset Interrupt Enable
+#define AT91C_SYSC_ERSTL          (0xF <<  8) // (RSTC) User Reset Enable
+#define AT91C_SYSC_BODIEN         (0x1 << 16) // (RSTC) Brown-out Detection Interrupt Enable
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_RTTC structure ***
+#define RTTC_RTMR       ( 0) // Real-time Mode Register
+#define RTTC_RTAR       ( 4) // Real-time Alarm Register
+#define RTTC_RTVR       ( 8) // Real-time Value Register
+#define RTTC_RTSR       (12) // Real-time Status Register
+// -------- SYSC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register --------
+#define AT91C_SYSC_RTPRES         (0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value
+#define AT91C_SYSC_ALMIEN         (0x1 << 16) // (RTTC) Alarm Interrupt Enable
+#define AT91C_SYSC_RTTINCIEN      (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable
+#define AT91C_SYSC_RTTRST         (0x1 << 18) // (RTTC) Real Time Timer Restart
+// -------- SYSC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register --------
+#define AT91C_SYSC_ALMV           (0x0 <<  0) // (RTTC) Alarm Value
+// -------- SYSC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register --------
+#define AT91C_SYSC_CRTV           (0x0 <<  0) // (RTTC) Current Real-time Value
+// -------- SYSC_RTSR : (RTTC Offset: 0xc) Real-time Status Register --------
+#define AT91C_SYSC_ALMS           (0x1 <<  0) // (RTTC) Real-time Alarm Status
+#define AT91C_SYSC_RTTINC         (0x1 <<  1) // (RTTC) Real-time Timer Increment
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_PITC structure ***
+#define PITC_PIMR       ( 0) // Period Interval Mode Register
+#define PITC_PISR       ( 4) // Period Interval Status Register
+#define PITC_PIVR       ( 8) // Period Interval Value Register
+#define PITC_PIIR       (12) // Period Interval Image Register
+// -------- SYSC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register --------
+#define AT91C_SYSC_PIV            (0xFFFFF <<  0) // (PITC) Periodic Interval Value
+#define AT91C_SYSC_PITEN          (0x1 << 24) // (PITC) Periodic Interval Timer Enabled
+#define AT91C_SYSC_PITIEN         (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable
+// -------- SYSC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register --------
+#define AT91C_SYSC_PITS           (0x1 <<  0) // (PITC) Periodic Interval Timer Status
+// -------- SYSC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register --------
+#define AT91C_SYSC_CPIV           (0xFFFFF <<  0) // (PITC) Current Periodic Interval Value
+#define AT91C_SYSC_PICNT          (0xFFF << 20) // (PITC) Periodic Interval Counter
+// -------- SYSC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_WDTC structure ***
+#define WDTC_WDCR       ( 0) // Watchdog Control Register
+#define WDTC_WDMR       ( 4) // Watchdog Mode Register
+#define WDTC_WDSR       ( 8) // Watchdog Status Register
+// -------- SYSC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register --------
+#define AT91C_SYSC_WDRSTT         (0x1 <<  0) // (WDTC) Watchdog Restart
+// -------- SYSC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register --------
+#define AT91C_SYSC_WDV            (0xFFF <<  0) // (WDTC) Watchdog Timer Restart
+#define AT91C_SYSC_WDFIEN         (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable
+#define AT91C_SYSC_WDRSTEN        (0x1 << 13) // (WDTC) Watchdog Reset Enable
+#define AT91C_SYSC_WDRPROC        (0x1 << 14) // (WDTC) Watchdog Timer Restart
+#define AT91C_SYSC_WDDIS          (0x1 << 15) // (WDTC) Watchdog Disable
+#define AT91C_SYSC_WDD            (0xFFF << 16) // (WDTC) Watchdog Delta Value
+#define AT91C_SYSC_WDDBGHLT       (0x1 << 28) // (WDTC) Watchdog Debug Halt
+#define AT91C_SYSC_WDIDLEHLT      (0x1 << 29) // (WDTC) Watchdog Idle Halt
+// -------- SYSC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register --------
+#define AT91C_SYSC_WDUNF          (0x1 <<  0) // (WDTC) Watchdog Underflow
+#define AT91C_SYSC_WDERR          (0x1 <<  1) // (WDTC) Watchdog Error
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Memory Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_MC structure ***
+#define MC_RCR          ( 0) // MC Remap Control Register
+#define MC_ASR          ( 4) // MC Abort Status Register
+#define MC_AASR         ( 8) // MC Abort Address Status Register
+#define MC_FMR          (96) // MC Flash Mode Register
+#define MC_FCR          (100) // MC Flash Command Register
+#define MC_FSR          (104) // MC Flash Status Register
+// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register --------
+#define AT91C_MC_RCB              (0x1 <<  0) // (MC) Remap Command Bit
+// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register --------
+#define AT91C_MC_UNDADD           (0x1 <<  0) // (MC) Undefined Addess Abort Status
+#define AT91C_MC_MISADD           (0x1 <<  1) // (MC) Misaligned Addess Abort Status
+#define AT91C_MC_ABTSZ            (0x3 <<  8) // (MC) Abort Size Status
+#define     AT91C_MC_ABTSZ_BYTE                 (0x0 <<  8) // (MC) Byte
+#define     AT91C_MC_ABTSZ_HWORD                (0x1 <<  8) // (MC) Half-word
+#define     AT91C_MC_ABTSZ_WORD                 (0x2 <<  8) // (MC) Word
+#define AT91C_MC_ABTTYP           (0x3 << 10) // (MC) Abort Type Status
+#define     AT91C_MC_ABTTYP_DATAR                (0x0 << 10) // (MC) Data Read
+#define     AT91C_MC_ABTTYP_DATAW                (0x1 << 10) // (MC) Data Write
+#define     AT91C_MC_ABTTYP_FETCH                (0x2 << 10) // (MC) Code Fetch
+#define AT91C_MC_MST0             (0x1 << 16) // (MC) Master 0 Abort Source
+#define AT91C_MC_MST1             (0x1 << 17) // (MC) Master 1 Abort Source
+#define AT91C_MC_SVMST0           (0x1 << 24) // (MC) Saved Master 0 Abort Source
+#define AT91C_MC_SVMST1           (0x1 << 25) // (MC) Saved Master 1 Abort Source
+// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register --------
+#define AT91C_MC_FRDY             (0x1 <<  0) // (MC) Flash Ready
+#define AT91C_MC_LOCKE            (0x1 <<  2) // (MC) Lock Error
+#define AT91C_MC_PROGE            (0x1 <<  3) // (MC) Programming Error
+#define AT91C_MC_NEBP             (0x1 <<  7) // (MC) No Erase Before Programming
+#define AT91C_MC_FWS              (0x3 <<  8) // (MC) Flash Wait State
+#define     AT91C_MC_FWS_0FWS                 (0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations
+#define     AT91C_MC_FWS_1FWS                 (0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations
+#define     AT91C_MC_FWS_2FWS                 (0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations
+#define     AT91C_MC_FWS_3FWS                 (0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations
+#define AT91C_MC_FMCN             (0xFF << 16) // (MC) Flash Microsecond Cycle Number
+// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register --------
+#define AT91C_MC_FCMD             (0xF <<  0) // (MC) Flash Command
+#define     AT91C_MC_FCMD_START_PROG           (0x1) // (MC) Starts the programming of th epage specified by PAGEN.
+#define     AT91C_MC_FCMD_LOCK                 (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_PROG_AND_LOCK        (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.
+#define     AT91C_MC_FCMD_UNLOCK               (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_ERASE_ALL            (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.
+#define     AT91C_MC_FCMD_SET_GP_NVM           (0xB) // (MC) Set General Purpose NVM bits.
+#define     AT91C_MC_FCMD_CLR_GP_NVM           (0xD) // (MC) Clear General Purpose NVM bits.
+#define     AT91C_MC_FCMD_SET_SECURITY         (0xF) // (MC) Set Security Bit.
+#define AT91C_MC_PAGEN            (0x3FF <<  8) // (MC) Page Number
+#define AT91C_MC_KEY              (0xFF << 24) // (MC) Writing Protect Key
+// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register --------
+#define AT91C_MC_SECURITY         (0x1 <<  4) // (MC) Security Bit Status
+#define AT91C_MC_GPNVM0           (0x1 <<  8) // (MC) Sector 0 Lock Status
+#define AT91C_MC_GPNVM1           (0x1 <<  9) // (MC) Sector 1 Lock Status
+#define AT91C_MC_GPNVM2           (0x1 << 10) // (MC) Sector 2 Lock Status
+#define AT91C_MC_GPNVM3           (0x1 << 11) // (MC) Sector 3 Lock Status
+#define AT91C_MC_GPNVM4           (0x1 << 12) // (MC) Sector 4 Lock Status
+#define AT91C_MC_GPNVM5           (0x1 << 13) // (MC) Sector 5 Lock Status
+#define AT91C_MC_GPNVM6           (0x1 << 14) // (MC) Sector 6 Lock Status
+#define AT91C_MC_GPNVM7           (0x1 << 15) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS0           (0x1 << 16) // (MC) Sector 0 Lock Status
+#define AT91C_MC_LOCKS1           (0x1 << 17) // (MC) Sector 1 Lock Status
+#define AT91C_MC_LOCKS2           (0x1 << 18) // (MC) Sector 2 Lock Status
+#define AT91C_MC_LOCKS3           (0x1 << 19) // (MC) Sector 3 Lock Status
+#define AT91C_MC_LOCKS4           (0x1 << 20) // (MC) Sector 4 Lock Status
+#define AT91C_MC_LOCKS5           (0x1 << 21) // (MC) Sector 5 Lock Status
+#define AT91C_MC_LOCKS6           (0x1 << 22) // (MC) Sector 6 Lock Status
+#define AT91C_MC_LOCKS7           (0x1 << 23) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS8           (0x1 << 24) // (MC) Sector 8 Lock Status
+#define AT91C_MC_LOCKS9           (0x1 << 25) // (MC) Sector 9 Lock Status
+#define AT91C_MC_LOCKS10          (0x1 << 26) // (MC) Sector 10 Lock Status
+#define AT91C_MC_LOCKS11          (0x1 << 27) // (MC) Sector 11 Lock Status
+#define AT91C_MC_LOCKS12          (0x1 << 28) // (MC) Sector 12 Lock Status
+#define AT91C_MC_LOCKS13          (0x1 << 29) // (MC) Sector 13 Lock Status
+#define AT91C_MC_LOCKS14          (0x1 << 30) // (MC) Sector 14 Lock Status
+#define AT91C_MC_LOCKS15          (0x1 << 31) // (MC) Sector 15 Lock Status
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface
+// *****************************************************************************
+// *** Register offset in AT91S_SPI structure ***
+#define SPI_CR          ( 0) // Control Register
+#define SPI_MR          ( 4) // Mode Register
+#define SPI_RDR         ( 8) // Receive Data Register
+#define SPI_TDR         (12) // Transmit Data Register
+#define SPI_SR          (16) // Status Register
+#define SPI_IER         (20) // Interrupt Enable Register
+#define SPI_IDR         (24) // Interrupt Disable Register
+#define SPI_IMR         (28) // Interrupt Mask Register
+#define SPI_CSR         (48) // Chip Select Register
+#define SPI_RPR         (256) // Receive Pointer Register
+#define SPI_RCR         (260) // Receive Counter Register
+#define SPI_TPR         (264) // Transmit Pointer Register
+#define SPI_TCR         (268) // Transmit Counter Register
+#define SPI_RNPR        (272) // Receive Next Pointer Register
+#define SPI_RNCR        (276) // Receive Next Counter Register
+#define SPI_TNPR        (280) // Transmit Next Pointer Register
+#define SPI_TNCR        (284) // Transmit Next Counter Register
+#define SPI_PTCR        (288) // PDC Transfer Control Register
+#define SPI_PTSR        (292) // PDC Transfer Status Register
+// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register --------
+#define AT91C_SPI_SPIEN           (0x1 <<  0) // (SPI) SPI Enable
+#define AT91C_SPI_SPIDIS          (0x1 <<  1) // (SPI) SPI Disable
+#define AT91C_SPI_SWRST           (0x1 <<  7) // (SPI) SPI Software reset
+#define AT91C_SPI_LASTXFER        (0x1 << 24) // (SPI) SPI Last Transfer
+// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register --------
+#define AT91C_SPI_MSTR            (0x1 <<  0) // (SPI) Master/Slave Mode
+#define AT91C_SPI_PS              (0x1 <<  1) // (SPI) Peripheral Select
+#define     AT91C_SPI_PS_FIXED                (0x0 <<  1) // (SPI) Fixed Peripheral Select
+#define     AT91C_SPI_PS_VARIABLE             (0x1 <<  1) // (SPI) Variable Peripheral Select
+#define AT91C_SPI_PCSDEC          (0x1 <<  2) // (SPI) Chip Select Decode
+#define AT91C_SPI_FDIV            (0x1 <<  3) // (SPI) Clock Selection
+#define AT91C_SPI_MODFDIS         (0x1 <<  4) // (SPI) Mode Fault Detection
+#define AT91C_SPI_LLB             (0x1 <<  7) // (SPI) Clock Selection
+#define AT91C_SPI_PCS             (0xF << 16) // (SPI) Peripheral Chip Select
+#define AT91C_SPI_DLYBCS          (0xFF << 24) // (SPI) Delay Between Chip Selects
+// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register --------
+#define AT91C_SPI_RD              (0xFFFF <<  0) // (SPI) Receive Data
+#define AT91C_SPI_RPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register --------
+#define AT91C_SPI_TD              (0xFFFF <<  0) // (SPI) Transmit Data
+#define AT91C_SPI_TPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_SR : (SPI Offset: 0x10) Status Register --------
+#define AT91C_SPI_RDRF            (0x1 <<  0) // (SPI) Receive Data Register Full
+#define AT91C_SPI_TDRE            (0x1 <<  1) // (SPI) Transmit Data Register Empty
+#define AT91C_SPI_MODF            (0x1 <<  2) // (SPI) Mode Fault Error
+#define AT91C_SPI_OVRES           (0x1 <<  3) // (SPI) Overrun Error Status
+#define AT91C_SPI_ENDRX           (0x1 <<  4) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_ENDTX           (0x1 <<  5) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_RXBUFF          (0x1 <<  6) // (SPI) RXBUFF Interrupt
+#define AT91C_SPI_TXBUFE          (0x1 <<  7) // (SPI) TXBUFE Interrupt
+#define AT91C_SPI_NSSR            (0x1 <<  8) // (SPI) NSSR Interrupt
+#define AT91C_SPI_TXEMPTY         (0x1 <<  9) // (SPI) TXEMPTY Interrupt
+#define AT91C_SPI_SPIENS          (0x1 << 16) // (SPI) Enable Status
+// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register --------
+// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register --------
+// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register --------
+// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register --------
+#define AT91C_SPI_CPOL            (0x1 <<  0) // (SPI) Clock Polarity
+#define AT91C_SPI_NCPHA           (0x1 <<  1) // (SPI) Clock Phase
+#define AT91C_SPI_CSAAT           (0x1 <<  2) // (SPI) Chip Select Active After Transfer
+#define AT91C_SPI_BITS            (0xF <<  4) // (SPI) Bits Per Transfer
+#define     AT91C_SPI_BITS_8                    (0x0 <<  4) // (SPI) 8 Bits Per transfer
+#define     AT91C_SPI_BITS_9                    (0x1 <<  4) // (SPI) 9 Bits Per transfer
+#define     AT91C_SPI_BITS_10                   (0x2 <<  4) // (SPI) 10 Bits Per transfer
+#define     AT91C_SPI_BITS_11                   (0x3 <<  4) // (SPI) 11 Bits Per transfer
+#define     AT91C_SPI_BITS_12                   (0x4 <<  4) // (SPI) 12 Bits Per transfer
+#define     AT91C_SPI_BITS_13                   (0x5 <<  4) // (SPI) 13 Bits Per transfer
+#define     AT91C_SPI_BITS_14                   (0x6 <<  4) // (SPI) 14 Bits Per transfer
+#define     AT91C_SPI_BITS_15                   (0x7 <<  4) // (SPI) 15 Bits Per transfer
+#define     AT91C_SPI_BITS_16                   (0x8 <<  4) // (SPI) 16 Bits Per transfer
+#define AT91C_SPI_SCBR            (0xFF <<  8) // (SPI) Serial Clock Baud Rate
+#define AT91C_SPI_DLYBS           (0xFF << 16) // (SPI) Serial Clock Baud Rate
+#define AT91C_SPI_DLYBCT          (0xFF << 24) // (SPI) Delay Between Consecutive Transfers
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor
+// *****************************************************************************
+// *** Register offset in AT91S_ADC structure ***
+#define ADC_CR          ( 0) // ADC Control Register
+#define ADC_MR          ( 4) // ADC Mode Register
+#define ADC_CHER        (16) // ADC Channel Enable Register
+#define ADC_CHDR        (20) // ADC Channel Disable Register
+#define ADC_CHSR        (24) // ADC Channel Status Register
+#define ADC_SR          (28) // ADC Status Register
+#define ADC_LCDR        (32) // ADC Last Converted Data Register
+#define ADC_IER         (36) // ADC Interrupt Enable Register
+#define ADC_IDR         (40) // ADC Interrupt Disable Register
+#define ADC_IMR         (44) // ADC Interrupt Mask Register
+#define ADC_CDR0        (48) // ADC Channel Data Register 0
+#define ADC_CDR1        (52) // ADC Channel Data Register 1
+#define ADC_CDR2        (56) // ADC Channel Data Register 2
+#define ADC_CDR3        (60) // ADC Channel Data Register 3
+#define ADC_CDR4        (64) // ADC Channel Data Register 4
+#define ADC_CDR5        (68) // ADC Channel Data Register 5
+#define ADC_CDR6        (72) // ADC Channel Data Register 6
+#define ADC_CDR7        (76) // ADC Channel Data Register 7
+#define ADC_RPR         (256) // Receive Pointer Register
+#define ADC_RCR         (260) // Receive Counter Register
+#define ADC_TPR         (264) // Transmit Pointer Register
+#define ADC_TCR         (268) // Transmit Counter Register
+#define ADC_RNPR        (272) // Receive Next Pointer Register
+#define ADC_RNCR        (276) // Receive Next Counter Register
+#define ADC_TNPR        (280) // Transmit Next Pointer Register
+#define ADC_TNCR        (284) // Transmit Next Counter Register
+#define ADC_PTCR        (288) // PDC Transfer Control Register
+#define ADC_PTSR        (292) // PDC Transfer Status Register
+// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register --------
+#define AT91C_ADC_SWRST           (0x1 <<  0) // (ADC) Software Reset
+#define AT91C_ADC_START           (0x1 <<  1) // (ADC) Start Conversion
+// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register --------
+#define AT91C_ADC_TRGEN           (0x1 <<  0) // (ADC) Trigger Enable
+#define     AT91C_ADC_TRGEN_DIS                  (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software
+#define     AT91C_ADC_TRGEN_EN                   (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.
+#define AT91C_ADC_TRGSEL          (0x7 <<  1) // (ADC) Trigger Selection
+#define     AT91C_ADC_TRGSEL_TIOA0                (0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0
+#define     AT91C_ADC_TRGSEL_TIOA1                (0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1
+#define     AT91C_ADC_TRGSEL_TIOA2                (0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2
+#define     AT91C_ADC_TRGSEL_TIOA3                (0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3
+#define     AT91C_ADC_TRGSEL_TIOA4                (0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4
+#define     AT91C_ADC_TRGSEL_TIOA5                (0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5
+#define     AT91C_ADC_TRGSEL_EXT                  (0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger
+#define AT91C_ADC_LOWRES          (0x1 <<  4) // (ADC) Resolution.
+#define     AT91C_ADC_LOWRES_10_BIT               (0x0 <<  4) // (ADC) 10-bit resolution
+#define     AT91C_ADC_LOWRES_8_BIT                (0x1 <<  4) // (ADC) 8-bit resolution
+#define AT91C_ADC_SLEEP           (0x1 <<  5) // (ADC) Sleep Mode
+#define     AT91C_ADC_SLEEP_NORMAL_MODE          (0x0 <<  5) // (ADC) Normal Mode
+#define     AT91C_ADC_SLEEP_MODE                 (0x1 <<  5) // (ADC) Sleep Mode
+#define AT91C_ADC_PRESCAL         (0x3F <<  8) // (ADC) Prescaler rate selection
+#define AT91C_ADC_STARTUP         (0x1F << 16) // (ADC) Startup Time
+#define AT91C_ADC_SHTIM           (0xF << 24) // (ADC) Sample & Hold Time
+// --------     ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register --------
+#define AT91C_ADC_CH0             (0x1 <<  0) // (ADC) Channel 0
+#define AT91C_ADC_CH1             (0x1 <<  1) // (ADC) Channel 1
+#define AT91C_ADC_CH2             (0x1 <<  2) // (ADC) Channel 2
+#define AT91C_ADC_CH3             (0x1 <<  3) // (ADC) Channel 3
+#define AT91C_ADC_CH4             (0x1 <<  4) // (ADC) Channel 4
+#define AT91C_ADC_CH5             (0x1 <<  5) // (ADC) Channel 5
+#define AT91C_ADC_CH6             (0x1 <<  6) // (ADC) Channel 6
+#define AT91C_ADC_CH7             (0x1 <<  7) // (ADC) Channel 7
+// --------     ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register --------
+// --------     ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register --------
+// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register --------
+#define AT91C_ADC_EOC0            (0x1 <<  0) // (ADC) End of Conversion
+#define AT91C_ADC_EOC1            (0x1 <<  1) // (ADC) End of Conversion
+#define AT91C_ADC_EOC2            (0x1 <<  2) // (ADC) End of Conversion
+#define AT91C_ADC_EOC3            (0x1 <<  3) // (ADC) End of Conversion
+#define AT91C_ADC_EOC4            (0x1 <<  4) // (ADC) End of Conversion
+#define AT91C_ADC_EOC5            (0x1 <<  5) // (ADC) End of Conversion
+#define AT91C_ADC_EOC6            (0x1 <<  6) // (ADC) End of Conversion
+#define AT91C_ADC_EOC7            (0x1 <<  7) // (ADC) End of Conversion
+#define AT91C_ADC_OVRE0           (0x1 <<  8) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE1           (0x1 <<  9) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE2           (0x1 << 10) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE3           (0x1 << 11) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE4           (0x1 << 12) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE5           (0x1 << 13) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE6           (0x1 << 14) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE7           (0x1 << 15) // (ADC) Overrun Error
+#define AT91C_ADC_DRDY            (0x1 << 16) // (ADC) Data Ready
+#define AT91C_ADC_GOVRE           (0x1 << 17) // (ADC) General Overrun
+#define AT91C_ADC_ENDRX           (0x1 << 18) // (ADC) End of Receiver Transfer
+#define AT91C_ADC_RXBUFF          (0x1 << 19) // (ADC) RXBUFF Interrupt
+// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register --------
+#define AT91C_ADC_LDATA           (0x3FF <<  0) // (ADC) Last Data Converted
+// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register --------
+// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register --------
+// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register --------
+// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 --------
+#define AT91C_ADC_DATA            (0x3FF <<  0) // (ADC) Converted Data
+// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 --------
+// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 --------
+// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 --------
+// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 --------
+// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 --------
+// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 --------
+// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_SSC structure ***
+#define SSC_CR          ( 0) // Control Register
+#define SSC_CMR         ( 4) // Clock Mode Register
+#define SSC_RCMR        (16) // Receive Clock ModeRegister
+#define SSC_RFMR        (20) // Receive Frame Mode Register
+#define SSC_TCMR        (24) // Transmit Clock Mode Register
+#define SSC_TFMR        (28) // Transmit Frame Mode Register
+#define SSC_RHR         (32) // Receive Holding Register
+#define SSC_THR         (36) // Transmit Holding Register
+#define SSC_RSHR        (48) // Receive Sync Holding Register
+#define SSC_TSHR        (52) // Transmit Sync Holding Register
+#define SSC_RC0R        (56) // Receive Compare 0 Register
+#define SSC_RC1R        (60) // Receive Compare 1 Register
+#define SSC_SR          (64) // Status Register
+#define SSC_IER         (68) // Interrupt Enable Register
+#define SSC_IDR         (72) // Interrupt Disable Register
+#define SSC_IMR         (76) // Interrupt Mask Register
+#define SSC_RPR         (256) // Receive Pointer Register
+#define SSC_RCR         (260) // Receive Counter Register
+#define SSC_TPR         (264) // Transmit Pointer Register
+#define SSC_TCR         (268) // Transmit Counter Register
+#define SSC_RNPR        (272) // Receive Next Pointer Register
+#define SSC_RNCR        (276) // Receive Next Counter Register
+#define SSC_TNPR        (280) // Transmit Next Pointer Register
+#define SSC_TNCR        (284) // Transmit Next Counter Register
+#define SSC_PTCR        (288) // PDC Transfer Control Register
+#define SSC_PTSR        (292) // PDC Transfer Status Register
+// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register --------
+#define AT91C_SSC_RXEN            (0x1 <<  0) // (SSC) Receive Enable
+#define AT91C_SSC_RXDIS           (0x1 <<  1) // (SSC) Receive Disable
+#define AT91C_SSC_TXEN            (0x1 <<  8) // (SSC) Transmit Enable
+#define AT91C_SSC_TXDIS           (0x1 <<  9) // (SSC) Transmit Disable
+#define AT91C_SSC_SWRST           (0x1 << 15) // (SSC) Software Reset
+// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register --------
+#define AT91C_SSC_CKS             (0x3 <<  0) // (SSC) Receive/Transmit Clock Selection
+#define     AT91C_SSC_CKS_DIV                  (0x0) // (SSC) Divided Clock
+#define     AT91C_SSC_CKS_TK                   (0x1) // (SSC) TK Clock signal
+#define     AT91C_SSC_CKS_RK                   (0x2) // (SSC) RK pin
+#define AT91C_SSC_CKO             (0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection
+#define     AT91C_SSC_CKO_NONE                 (0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only
+#define     AT91C_SSC_CKO_CONTINOUS            (0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output
+#define     AT91C_SSC_CKO_DATA_TX              (0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output
+#define AT91C_SSC_CKI             (0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion
+#define AT91C_SSC_CKG             (0x3 <<  6) // (SSC) Receive/Transmit Clock Gating Selection
+#define     AT91C_SSC_CKG_NONE                 (0x0 <<  6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock
+#define     AT91C_SSC_CKG_LOW                  (0x1 <<  6) // (SSC) Receive/Transmit Clock enabled only if RF Low
+#define     AT91C_SSC_CKG_HIGH                 (0x2 <<  6) // (SSC) Receive/Transmit Clock enabled only if RF High
+#define AT91C_SSC_START           (0xF <<  8) // (SSC) Receive/Transmit Start Selection
+#define     AT91C_SSC_START_CONTINOUS            (0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.
+#define     AT91C_SSC_START_TX                   (0x1 <<  8) // (SSC) Transmit/Receive start
+#define     AT91C_SSC_START_LOW_RF               (0x2 <<  8) // (SSC) Detection of a low level on RF input
+#define     AT91C_SSC_START_HIGH_RF              (0x3 <<  8) // (SSC) Detection of a high level on RF input
+#define     AT91C_SSC_START_FALL_RF              (0x4 <<  8) // (SSC) Detection of a falling edge on RF input
+#define     AT91C_SSC_START_RISE_RF              (0x5 <<  8) // (SSC) Detection of a rising edge on RF input
+#define     AT91C_SSC_START_LEVEL_RF             (0x6 <<  8) // (SSC) Detection of any level change on RF input
+#define     AT91C_SSC_START_EDGE_RF              (0x7 <<  8) // (SSC) Detection of any edge on RF input
+#define     AT91C_SSC_START_0                    (0x8 <<  8) // (SSC) Compare 0
+#define AT91C_SSC_STOP            (0x1 << 12) // (SSC) Receive Stop Selection
+#define AT91C_SSC_STTOUT          (0x1 << 15) // (SSC) Receive/Transmit Start Output Selection
+#define AT91C_SSC_STTDLY          (0xFF << 16) // (SSC) Receive/Transmit Start Delay
+#define AT91C_SSC_PERIOD          (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection
+// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register --------
+#define AT91C_SSC_DATLEN          (0x1F <<  0) // (SSC) Data Length
+#define AT91C_SSC_LOOP            (0x1 <<  5) // (SSC) Loop Mode
+#define AT91C_SSC_MSBF            (0x1 <<  7) // (SSC) Most Significant Bit First
+#define AT91C_SSC_DATNB           (0xF <<  8) // (SSC) Data Number per Frame
+#define AT91C_SSC_FSLEN           (0xF << 16) // (SSC) Receive/Transmit Frame Sync length
+#define AT91C_SSC_FSOS            (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection
+#define     AT91C_SSC_FSOS_NONE                 (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only
+#define     AT91C_SSC_FSOS_NEGATIVE             (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse
+#define     AT91C_SSC_FSOS_POSITIVE             (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse
+#define     AT91C_SSC_FSOS_LOW                  (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer
+#define     AT91C_SSC_FSOS_HIGH                 (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer
+#define     AT91C_SSC_FSOS_TOGGLE               (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer
+#define AT91C_SSC_FSEDGE          (0x1 << 24) // (SSC) Frame Sync Edge Detection
+// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register --------
+// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register --------
+#define AT91C_SSC_DATDEF          (0x1 <<  5) // (SSC) Data Default Value
+#define AT91C_SSC_FSDEN           (0x1 << 23) // (SSC) Frame Sync Data Enable
+// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register --------
+#define AT91C_SSC_TXRDY           (0x1 <<  0) // (SSC) Transmit Ready
+#define AT91C_SSC_TXEMPTY         (0x1 <<  1) // (SSC) Transmit Empty
+#define AT91C_SSC_ENDTX           (0x1 <<  2) // (SSC) End Of Transmission
+#define AT91C_SSC_TXBUFE          (0x1 <<  3) // (SSC) Transmit Buffer Empty
+#define AT91C_SSC_RXRDY           (0x1 <<  4) // (SSC) Receive Ready
+#define AT91C_SSC_OVRUN           (0x1 <<  5) // (SSC) Receive Overrun
+#define AT91C_SSC_ENDRX           (0x1 <<  6) // (SSC) End of Reception
+#define AT91C_SSC_RXBUFF          (0x1 <<  7) // (SSC) Receive Buffer Full
+#define AT91C_SSC_CP0             (0x1 <<  8) // (SSC) Compare 0
+#define AT91C_SSC_CP1             (0x1 <<  9) // (SSC) Compare 1
+#define AT91C_SSC_TXSYN           (0x1 << 10) // (SSC) Transmit Sync
+#define AT91C_SSC_RXSYN           (0x1 << 11) // (SSC) Receive Sync
+#define AT91C_SSC_TXENA           (0x1 << 16) // (SSC) Transmit Enable
+#define AT91C_SSC_RXENA           (0x1 << 17) // (SSC) Receive Enable
+// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register --------
+// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register --------
+// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Usart
+// *****************************************************************************
+// *** Register offset in AT91S_USART structure ***
+#define US_CR           ( 0) // Control Register
+#define US_MR           ( 4) // Mode Register
+#define US_IER          ( 8) // Interrupt Enable Register
+#define US_IDR          (12) // Interrupt Disable Register
+#define US_IMR          (16) // Interrupt Mask Register
+#define US_CSR          (20) // Channel Status Register
+#define US_RHR          (24) // Receiver Holding Register
+#define US_THR          (28) // Transmitter Holding Register
+#define US_BRGR         (32) // Baud Rate Generator Register
+#define US_RTOR         (36) // Receiver Time-out Register
+#define US_TTGR         (40) // Transmitter Time-guard Register
+#define US_FIDI         (64) // FI_DI_Ratio Register
+#define US_NER          (68) // Nb Errors Register
+#define US_XXR          (72) // XON_XOFF Register
+#define US_IF           (76) // IRDA_FILTER Register
+#define US_RPR          (256) // Receive Pointer Register
+#define US_RCR          (260) // Receive Counter Register
+#define US_TPR          (264) // Transmit Pointer Register
+#define US_TCR          (268) // Transmit Counter Register
+#define US_RNPR         (272) // Receive Next Pointer Register
+#define US_RNCR         (276) // Receive Next Counter Register
+#define US_TNPR         (280) // Transmit Next Pointer Register
+#define US_TNCR         (284) // Transmit Next Counter Register
+#define US_PTCR         (288) // PDC Transfer Control Register
+#define US_PTSR         (292) // PDC Transfer Status Register
+// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_RSTSTA           (0x1 <<  8) // (USART) Reset Status Bits
+#define AT91C_US_STTBRK           (0x1 <<  9) // (USART) Start Break
+#define AT91C_US_STPBRK           (0x1 << 10) // (USART) Stop Break
+#define AT91C_US_STTTO            (0x1 << 11) // (USART) Start Time-out
+#define AT91C_US_SENDA            (0x1 << 12) // (USART) Send Address
+#define AT91C_US_RSTIT            (0x1 << 13) // (USART) Reset Iterations
+#define AT91C_US_RSTNACK          (0x1 << 14) // (USART) Reset Non Acknowledge
+#define AT91C_US_RETTO            (0x1 << 15) // (USART) Rearm Time-out
+#define AT91C_US_DTREN            (0x1 << 16) // (USART) Data Terminal ready Enable
+#define AT91C_US_DTRDIS           (0x1 << 17) // (USART) Data Terminal ready Disable
+#define AT91C_US_RTSEN            (0x1 << 18) // (USART) Request to Send enable
+#define AT91C_US_RTSDIS           (0x1 << 19) // (USART) Request to Send Disable
+// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_USMODE           (0xF <<  0) // (USART) Usart mode
+#define     AT91C_US_USMODE_NORMAL               (0x0) // (USART) Normal
+#define     AT91C_US_USMODE_RS485                (0x1) // (USART) RS485
+#define     AT91C_US_USMODE_HWHSH                (0x2) // (USART) Hardware Handshaking
+#define     AT91C_US_USMODE_MODEM                (0x3) // (USART) Modem
+#define     AT91C_US_USMODE_ISO7816_0            (0x4) // (USART) ISO7816 protocol: T = 0
+#define     AT91C_US_USMODE_ISO7816_1            (0x6) // (USART) ISO7816 protocol: T = 1
+#define     AT91C_US_USMODE_IRDA                 (0x8) // (USART) IrDA
+#define     AT91C_US_USMODE_SWHSH                (0xC) // (USART) Software Handshaking
+#define AT91C_US_CLKS             (0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CLKS_CLOCK                (0x0 <<  4) // (USART) Clock
+#define     AT91C_US_CLKS_FDIV1                (0x1 <<  4) // (USART) fdiv1
+#define     AT91C_US_CLKS_SLOW                 (0x2 <<  4) // (USART) slow_clock (ARM)
+#define     AT91C_US_CLKS_EXT                  (0x3 <<  4) // (USART) External (SCK)
+#define AT91C_US_CHRL             (0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CHRL_5_BITS               (0x0 <<  6) // (USART) Character Length: 5 bits
+#define     AT91C_US_CHRL_6_BITS               (0x1 <<  6) // (USART) Character Length: 6 bits
+#define     AT91C_US_CHRL_7_BITS               (0x2 <<  6) // (USART) Character Length: 7 bits
+#define     AT91C_US_CHRL_8_BITS               (0x3 <<  6) // (USART) Character Length: 8 bits
+#define AT91C_US_SYNC             (0x1 <<  8) // (USART) Synchronous Mode Select
+#define AT91C_US_NBSTOP           (0x3 << 12) // (USART) Number of Stop bits
+#define     AT91C_US_NBSTOP_1_BIT                (0x0 << 12) // (USART) 1 stop bit
+#define     AT91C_US_NBSTOP_15_BIT               (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits
+#define     AT91C_US_NBSTOP_2_BIT                (0x2 << 12) // (USART) 2 stop bits
+#define AT91C_US_MSBF             (0x1 << 16) // (USART) Bit Order
+#define AT91C_US_MODE9            (0x1 << 17) // (USART) 9-bit Character length
+#define AT91C_US_CKLO             (0x1 << 18) // (USART) Clock Output Select
+#define AT91C_US_OVER             (0x1 << 19) // (USART) Over Sampling Mode
+#define AT91C_US_INACK            (0x1 << 20) // (USART) Inhibit Non Acknowledge
+#define AT91C_US_DSNACK           (0x1 << 21) // (USART) Disable Successive NACK
+#define AT91C_US_MAX_ITER         (0x1 << 24) // (USART) Number of Repetitions
+#define AT91C_US_FILTER           (0x1 << 28) // (USART) Receive Line Filter
+// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXBRK            (0x1 <<  2) // (USART) Break Received/End of Break
+#define AT91C_US_TIMEOUT          (0x1 <<  8) // (USART) Receiver Time-out
+#define AT91C_US_ITERATION        (0x1 << 10) // (USART) Max number of Repetitions Reached
+#define AT91C_US_NACK             (0x1 << 13) // (USART) Non Acknowledge
+#define AT91C_US_RIIC             (0x1 << 16) // (USART) Ring INdicator Input Change Flag
+#define AT91C_US_DSRIC            (0x1 << 17) // (USART) Data Set Ready Input Change Flag
+#define AT91C_US_DCDIC            (0x1 << 18) // (USART) Data Carrier Flag
+#define AT91C_US_CTSIC            (0x1 << 19) // (USART) Clear To Send Input Change Flag
+// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register --------
+#define AT91C_US_RI               (0x1 << 20) // (USART) Image of RI Input
+#define AT91C_US_DSR              (0x1 << 21) // (USART) Image of DSR Input
+#define AT91C_US_DCD              (0x1 << 22) // (USART) Image of DCD Input
+#define AT91C_US_CTS              (0x1 << 23) // (USART) Image of CTS Input
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Two-wire Interface
+// *****************************************************************************
+// *** Register offset in AT91S_TWI structure ***
+#define TWI_CR          ( 0) // Control Register
+#define TWI_MMR         ( 4) // Master Mode Register
+#define TWI_SMR         ( 8) // Slave Mode Register
+#define TWI_IADR        (12) // Internal Address Register
+#define TWI_CWGR        (16) // Clock Waveform Generator Register
+#define TWI_SR          (32) // Status Register
+#define TWI_IER         (36) // Interrupt Enable Register
+#define TWI_IDR         (40) // Interrupt Disable Register
+#define TWI_IMR         (44) // Interrupt Mask Register
+#define TWI_RHR         (48) // Receive Holding Register
+#define TWI_THR         (52) // Transmit Holding Register
+// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register --------
+#define AT91C_TWI_START           (0x1 <<  0) // (TWI) Send a START Condition
+#define AT91C_TWI_STOP            (0x1 <<  1) // (TWI) Send a STOP Condition
+#define AT91C_TWI_MSEN            (0x1 <<  2) // (TWI) TWI Master Transfer Enabled
+#define AT91C_TWI_MSDIS           (0x1 <<  3) // (TWI) TWI Master Transfer Disabled
+#define AT91C_TWI_SVEN            (0x1 <<  4) // (TWI) TWI Slave Transfer Enabled
+#define AT91C_TWI_SVDIS           (0x1 <<  5) // (TWI) TWI Slave Transfer Disabled
+#define AT91C_TWI_SWRST           (0x1 <<  7) // (TWI) Software Reset
+// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register --------
+#define AT91C_TWI_IADRSZ          (0x3 <<  8) // (TWI) Internal Device Address Size
+#define     AT91C_TWI_IADRSZ_NO                   (0x0 <<  8) // (TWI) No internal device address
+#define     AT91C_TWI_IADRSZ_1_BYTE               (0x1 <<  8) // (TWI) One-byte internal device address
+#define     AT91C_TWI_IADRSZ_2_BYTE               (0x2 <<  8) // (TWI) Two-byte internal device address
+#define     AT91C_TWI_IADRSZ_3_BYTE               (0x3 <<  8) // (TWI) Three-byte internal device address
+#define AT91C_TWI_MREAD           (0x1 << 12) // (TWI) Master Read Direction
+#define AT91C_TWI_DADR            (0x7F << 16) // (TWI) Device Address
+// -------- TWI_SMR : (TWI Offset: 0x8) TWI Slave Mode Register --------
+#define AT91C_TWI_SADR            (0x7F << 16) // (TWI) Slave Device Address
+// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register --------
+#define AT91C_TWI_CLDIV           (0xFF <<  0) // (TWI) Clock Low Divider
+#define AT91C_TWI_CHDIV           (0xFF <<  8) // (TWI) Clock High Divider
+#define AT91C_TWI_CKDIV           (0x7 << 16) // (TWI) Clock Divider
+// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register --------
+#define AT91C_TWI_TXCOMP          (0x1 <<  0) // (TWI) Transmission Completed
+#define AT91C_TWI_RXRDY           (0x1 <<  1) // (TWI) Receive holding register ReaDY
+#define AT91C_TWI_TXRDY           (0x1 <<  2) // (TWI) Transmit holding register ReaDY
+#define AT91C_TWI_SVREAD          (0x1 <<  3) // (TWI) Slave Read
+#define AT91C_TWI_SVACC           (0x1 <<  4) // (TWI) Slave Access
+#define AT91C_TWI_GCACC           (0x1 <<  5) // (TWI) General Call Access
+#define AT91C_TWI_OVRE            (0x1 <<  6) // (TWI) Overrun Error
+#define AT91C_TWI_UNRE            (0x1 <<  7) // (TWI) Underrun Error
+#define AT91C_TWI_NACK            (0x1 <<  8) // (TWI) Not Acknowledged
+#define AT91C_TWI_ARBLST          (0x1 <<  9) // (TWI) Arbitration Lost
+// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register --------
+// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register --------
+// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface
+// *****************************************************************************
+// *** Register offset in AT91S_TC structure ***
+#define TC_CCR          ( 0) // Channel Control Register
+#define TC_CMR          ( 4) // Channel Mode Register (Capture Mode / Waveform Mode)
+#define TC_CV           (16) // Counter Value
+#define TC_RA           (20) // Register A
+#define TC_RB           (24) // Register B
+#define TC_RC           (28) // Register C
+#define TC_SR           (32) // Status Register
+#define TC_IER          (36) // Interrupt Enable Register
+#define TC_IDR          (40) // Interrupt Disable Register
+#define TC_IMR          (44) // Interrupt Mask Register
+// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register --------
+#define AT91C_TC_CLKEN            (0x1 <<  0) // (TC) Counter Clock Enable Command
+#define AT91C_TC_CLKDIS           (0x1 <<  1) // (TC) Counter Clock Disable Command
+#define AT91C_TC_SWTRG            (0x1 <<  2) // (TC) Software Trigger Command
+// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode --------
+#define AT91C_TC_CLKS             (0x7 <<  0) // (TC) Clock Selection
+#define     AT91C_TC_CLKS_TIMER_DIV1_CLOCK     (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV2_CLOCK     (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV3_CLOCK     (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV4_CLOCK     (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV5_CLOCK     (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK
+#define     AT91C_TC_CLKS_XC0                  (0x5) // (TC) Clock selected: XC0
+#define     AT91C_TC_CLKS_XC1                  (0x6) // (TC) Clock selected: XC1
+#define     AT91C_TC_CLKS_XC2                  (0x7) // (TC) Clock selected: XC2
+#define AT91C_TC_CLKI             (0x1 <<  3) // (TC) Clock Invert
+#define AT91C_TC_BURST            (0x3 <<  4) // (TC) Burst Signal Selection
+#define     AT91C_TC_BURST_NONE                 (0x0 <<  4) // (TC) The clock is not gated by an external signal
+#define     AT91C_TC_BURST_XC0                  (0x1 <<  4) // (TC) XC0 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC1                  (0x2 <<  4) // (TC) XC1 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC2                  (0x3 <<  4) // (TC) XC2 is ANDed with the selected clock
+#define AT91C_TC_CPCSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare
+#define AT91C_TC_LDBSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading
+#define AT91C_TC_LDBDIS           (0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading
+#define AT91C_TC_CPCDIS           (0x1 <<  7) // (TC) Counter Clock Disable with RC Compare
+#define AT91C_TC_ETRGEDG          (0x3 <<  8) // (TC) External Trigger Edge Selection
+#define     AT91C_TC_ETRGEDG_NONE                 (0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_ETRGEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_ETRGEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_ETRGEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_EEVTEDG          (0x3 <<  8) // (TC) External Event Edge Selection
+#define     AT91C_TC_EEVTEDG_NONE                 (0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_EEVTEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_EEVTEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_EEVTEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_ABETRG           (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection
+#define AT91C_TC_EEVT             (0x3 << 10) // (TC) External Event  Selection
+#define     AT91C_TC_EEVT_NONE                 (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input
+#define     AT91C_TC_EEVT_RISING               (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output
+#define     AT91C_TC_EEVT_FALLING              (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output
+#define     AT91C_TC_EEVT_BOTH                 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output
+#define AT91C_TC_ENETRG           (0x1 << 12) // (TC) External Event Trigger enable
+#define AT91C_TC_WAVESEL          (0x3 << 13) // (TC) Waveform  Selection
+#define     AT91C_TC_WAVESEL_UP                   (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN               (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UP_AUTO              (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN_AUTO          (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare
+#define AT91C_TC_CPCTRG           (0x1 << 14) // (TC) RC Compare Trigger Enable
+#define AT91C_TC_WAVE             (0x1 << 15) // (TC)
+#define AT91C_TC_LDRA             (0x3 << 16) // (TC) RA Loading Selection
+#define     AT91C_TC_LDRA_NONE                 (0x0 << 16) // (TC) Edge: None
+#define     AT91C_TC_LDRA_RISING               (0x1 << 16) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRA_FALLING              (0x2 << 16) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRA_BOTH                 (0x3 << 16) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_ACPA             (0x3 << 16) // (TC) RA Compare Effect on TIOA
+#define     AT91C_TC_ACPA_NONE                 (0x0 << 16) // (TC) Effect: none
+#define     AT91C_TC_ACPA_SET                  (0x1 << 16) // (TC) Effect: set
+#define     AT91C_TC_ACPA_CLEAR                (0x2 << 16) // (TC) Effect: clear
+#define     AT91C_TC_ACPA_TOGGLE               (0x3 << 16) // (TC) Effect: toggle
+#define AT91C_TC_LDRB             (0x3 << 18) // (TC) RB Loading Selection
+#define     AT91C_TC_LDRB_NONE                 (0x0 << 18) // (TC) Edge: None
+#define     AT91C_TC_LDRB_RISING               (0x1 << 18) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRB_FALLING              (0x2 << 18) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRB_BOTH                 (0x3 << 18) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_ACPC             (0x3 << 18) // (TC) RC Compare Effect on TIOA
+#define     AT91C_TC_ACPC_NONE                 (0x0 << 18) // (TC) Effect: none
+#define     AT91C_TC_ACPC_SET                  (0x1 << 18) // (TC) Effect: set
+#define     AT91C_TC_ACPC_CLEAR                (0x2 << 18) // (TC) Effect: clear
+#define     AT91C_TC_ACPC_TOGGLE               (0x3 << 18) // (TC) Effect: toggle
+#define AT91C_TC_AEEVT            (0x3 << 20) // (TC) External Event Effect on TIOA
+#define     AT91C_TC_AEEVT_NONE                 (0x0 << 20) // (TC) Effect: none
+#define     AT91C_TC_AEEVT_SET                  (0x1 << 20) // (TC) Effect: set
+#define     AT91C_TC_AEEVT_CLEAR                (0x2 << 20) // (TC) Effect: clear
+#define     AT91C_TC_AEEVT_TOGGLE               (0x3 << 20) // (TC) Effect: toggle
+#define AT91C_TC_ASWTRG           (0x3 << 22) // (TC) Software Trigger Effect on TIOA
+#define     AT91C_TC_ASWTRG_NONE                 (0x0 << 22) // (TC) Effect: none
+#define     AT91C_TC_ASWTRG_SET                  (0x1 << 22) // (TC) Effect: set
+#define     AT91C_TC_ASWTRG_CLEAR                (0x2 << 22) // (TC) Effect: clear
+#define     AT91C_TC_ASWTRG_TOGGLE               (0x3 << 22) // (TC) Effect: toggle
+#define AT91C_TC_BCPB             (0x3 << 24) // (TC) RB Compare Effect on TIOB
+#define     AT91C_TC_BCPB_NONE                 (0x0 << 24) // (TC) Effect: none
+#define     AT91C_TC_BCPB_SET                  (0x1 << 24) // (TC) Effect: set
+#define     AT91C_TC_BCPB_CLEAR                (0x2 << 24) // (TC) Effect: clear
+#define     AT91C_TC_BCPB_TOGGLE               (0x3 << 24) // (TC) Effect: toggle
+#define AT91C_TC_BCPC             (0x3 << 26) // (TC) RC Compare Effect on TIOB
+#define     AT91C_TC_BCPC_NONE                 (0x0 << 26) // (TC) Effect: none
+#define     AT91C_TC_BCPC_SET                  (0x1 << 26) // (TC) Effect: set
+#define     AT91C_TC_BCPC_CLEAR                (0x2 << 26) // (TC) Effect: clear
+#define     AT91C_TC_BCPC_TOGGLE               (0x3 << 26) // (TC) Effect: toggle
+#define AT91C_TC_BEEVT            (0x3 << 28) // (TC) External Event Effect on TIOB
+#define     AT91C_TC_BEEVT_NONE                 (0x0 << 28) // (TC) Effect: none
+#define     AT91C_TC_BEEVT_SET                  (0x1 << 28) // (TC) Effect: set
+#define     AT91C_TC_BEEVT_CLEAR                (0x2 << 28) // (TC) Effect: clear
+#define     AT91C_TC_BEEVT_TOGGLE               (0x3 << 28) // (TC) Effect: toggle
+#define AT91C_TC_BSWTRG           (0x3 << 30) // (TC) Software Trigger Effect on TIOB
+#define     AT91C_TC_BSWTRG_NONE                 (0x0 << 30) // (TC) Effect: none
+#define     AT91C_TC_BSWTRG_SET                  (0x1 << 30) // (TC) Effect: set
+#define     AT91C_TC_BSWTRG_CLEAR                (0x2 << 30) // (TC) Effect: clear
+#define     AT91C_TC_BSWTRG_TOGGLE               (0x3 << 30) // (TC) Effect: toggle
+// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register --------
+#define AT91C_TC_COVFS            (0x1 <<  0) // (TC) Counter Overflow
+#define AT91C_TC_LOVRS            (0x1 <<  1) // (TC) Load Overrun
+#define AT91C_TC_CPAS             (0x1 <<  2) // (TC) RA Compare
+#define AT91C_TC_CPBS             (0x1 <<  3) // (TC) RB Compare
+#define AT91C_TC_CPCS             (0x1 <<  4) // (TC) RC Compare
+#define AT91C_TC_LDRAS            (0x1 <<  5) // (TC) RA Loading
+#define AT91C_TC_LDRBS            (0x1 <<  6) // (TC) RB Loading
+#define AT91C_TC_ETRCS            (0x1 <<  7) // (TC) External Trigger
+#define AT91C_TC_ETRGS            (0x1 << 16) // (TC) Clock Enabling
+#define AT91C_TC_MTIOA            (0x1 << 17) // (TC) TIOA Mirror
+#define AT91C_TC_MTIOB            (0x1 << 18) // (TC) TIOA Mirror
+// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register --------
+// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register --------
+// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Interface
+// *****************************************************************************
+// *** Register offset in AT91S_TCB structure ***
+#define TCB_TC0         ( 0) // TC Channel 0
+#define TCB_TC1         (64) // TC Channel 1
+#define TCB_TC2         (128) // TC Channel 2
+#define TCB_BCR         (192) // TC Block Control Register
+#define TCB_BMR         (196) // TC Block Mode Register
+// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register --------
+#define AT91C_TCB_SYNC            (0x1 <<  0) // (TCB) Synchro Command
+// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register --------
+#define AT91C_TCB_TC0XC0S         (0x1 <<  0) // (TCB) External Clock Signal 0 Selection
+#define     AT91C_TCB_TC0XC0S_TCLK0                (0x0) // (TCB) TCLK0 connected to XC0
+#define     AT91C_TCB_TC0XC0S_NONE                 (0x1) // (TCB) None signal connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA1                (0x2) // (TCB) TIOA1 connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA2                (0x3) // (TCB) TIOA2 connected to XC0
+#define AT91C_TCB_TC1XC1S         (0x1 <<  2) // (TCB) External Clock Signal 1 Selection
+#define     AT91C_TCB_TC1XC1S_TCLK1                (0x0 <<  2) // (TCB) TCLK1 connected to XC1
+#define     AT91C_TCB_TC1XC1S_NONE                 (0x1 <<  2) // (TCB) None signal connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA0                (0x2 <<  2) // (TCB) TIOA0 connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA2                (0x3 <<  2) // (TCB) TIOA2 connected to XC1
+#define AT91C_TCB_TC2XC2S         (0x1 <<  4) // (TCB) External Clock Signal 2 Selection
+#define     AT91C_TCB_TC2XC2S_TCLK2                (0x0 <<  4) // (TCB) TCLK2 connected to XC2
+#define     AT91C_TCB_TC2XC2S_NONE                 (0x1 <<  4) // (TCB) None signal connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA0                (0x2 <<  4) // (TCB) TIOA0 connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA2                (0x3 <<  4) // (TCB) TIOA2 connected to XC2
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface
+// *****************************************************************************
+// *** Register offset in AT91S_PWMC_CH structure ***
+#define PWMC_CMR        ( 0) // Channel Mode Register
+#define PWMC_CDTYR      ( 4) // Channel Duty Cycle Register
+#define PWMC_CPRDR      ( 8) // Channel Period Register
+#define PWMC_CCNTR      (12) // Channel Counter Register
+#define PWMC_CUPDR      (16) // Channel Update Register
+#define PWMC_Reserved   (20) // Reserved
+// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register --------
+#define AT91C_PWMC_CPRE           (0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx
+#define     AT91C_PWMC_CPRE_MCK                  (0x0) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKA                 (0xB) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKB                 (0xC) // (PWMC_CH)
+#define AT91C_PWMC_CALG           (0x1 <<  8) // (PWMC_CH) Channel Alignment
+#define AT91C_PWMC_CPOL           (0x1 <<  9) // (PWMC_CH) Channel Polarity
+#define AT91C_PWMC_CPD            (0x1 << 10) // (PWMC_CH) Channel Update Period
+// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register --------
+#define AT91C_PWMC_CDTY           (0x0 <<  0) // (PWMC_CH) Channel Duty Cycle
+// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register --------
+#define AT91C_PWMC_CPRD           (0x0 <<  0) // (PWMC_CH) Channel Period
+// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register --------
+#define AT91C_PWMC_CCNT           (0x0 <<  0) // (PWMC_CH) Channel Counter
+// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register --------
+#define AT91C_PWMC_CUPD           (0x0 <<  0) // (PWMC_CH) Channel Update
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_PWMC structure ***
+#define PWMC_MR         ( 0) // PWMC Mode Register
+#define PWMC_ENA        ( 4) // PWMC Enable Register
+#define PWMC_DIS        ( 8) // PWMC Disable Register
+#define PWMC_SR         (12) // PWMC Status Register
+#define PWMC_IER        (16) // PWMC Interrupt Enable Register
+#define PWMC_IDR        (20) // PWMC Interrupt Disable Register
+#define PWMC_IMR        (24) // PWMC Interrupt Mask Register
+#define PWMC_ISR        (28) // PWMC Interrupt Status Register
+#define PWMC_VR         (252) // PWMC Version Register
+#define PWMC_CH         (512) // PWMC Channel 0
+// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register --------
+#define AT91C_PWMC_DIVA           (0xFF <<  0) // (PWMC) CLKA divide factor.
+#define AT91C_PWMC_PREA           (0xF <<  8) // (PWMC) Divider Input Clock Prescaler A
+#define     AT91C_PWMC_PREA_MCK                  (0x0 <<  8) // (PWMC)
+#define AT91C_PWMC_DIVB           (0xFF << 16) // (PWMC) CLKB divide factor.
+#define AT91C_PWMC_PREB           (0xF << 24) // (PWMC) Divider Input Clock Prescaler B
+#define     AT91C_PWMC_PREB_MCK                  (0x0 << 24) // (PWMC)
+// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register --------
+#define AT91C_PWMC_CHID0          (0x1 <<  0) // (PWMC) Channel ID 0
+#define AT91C_PWMC_CHID1          (0x1 <<  1) // (PWMC) Channel ID 1
+#define AT91C_PWMC_CHID2          (0x1 <<  2) // (PWMC) Channel ID 2
+#define AT91C_PWMC_CHID3          (0x1 <<  3) // (PWMC) Channel ID 3
+#define AT91C_PWMC_CHID4          (0x1 <<  4) // (PWMC) Channel ID 4
+#define AT91C_PWMC_CHID5          (0x1 <<  5) // (PWMC) Channel ID 5
+#define AT91C_PWMC_CHID6          (0x1 <<  6) // (PWMC) Channel ID 6
+#define AT91C_PWMC_CHID7          (0x1 <<  7) // (PWMC) Channel ID 7
+// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register --------
+// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register --------
+// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register --------
+// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register --------
+// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register --------
+// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR USB Device Interface
+// *****************************************************************************
+// *** Register offset in AT91S_UDP structure ***
+#define UDP_NUM         ( 0) // Frame Number Register
+#define UDP_GLBSTATE    ( 4) // Global State Register
+#define UDP_FADDR       ( 8) // Function Address Register
+#define UDP_IER         (16) // Interrupt Enable Register
+#define UDP_IDR         (20) // Interrupt Disable Register
+#define UDP_IMR         (24) // Interrupt Mask Register
+#define UDP_ISR         (28) // Interrupt Status Register
+#define UDP_ICR         (32) // Interrupt Clear Register
+#define UDP_RSTEP       (40) // Reset Endpoint Register
+#define UDP_CSR         (48) // Endpoint Control and Status Register
+#define UDP_FDR         (80) // Endpoint FIFO Data Register
+// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register --------
+#define AT91C_UDP_FRM_NUM         (0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats
+#define AT91C_UDP_FRM_ERR         (0x1 << 16) // (UDP) Frame Error
+#define AT91C_UDP_FRM_OK          (0x1 << 17) // (UDP) Frame OK
+// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register --------
+#define AT91C_UDP_FADDEN          (0x1 <<  0) // (UDP) Function Address Enable
+#define AT91C_UDP_CONFG           (0x1 <<  1) // (UDP) Configured
+#define AT91C_UDP_RMWUPE          (0x1 <<  2) // (UDP) Remote Wake Up Enable
+#define AT91C_UDP_RSMINPR         (0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host
+// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register --------
+#define AT91C_UDP_FADD            (0xFF <<  0) // (UDP) Function Address Value
+#define AT91C_UDP_FEN             (0x1 <<  8) // (UDP) Function Enable
+// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register --------
+#define AT91C_UDP_EPINT0          (0x1 <<  0) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT1          (0x1 <<  1) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT2          (0x1 <<  2) // (UDP) Endpoint 2 Interrupt
+#define AT91C_UDP_EPINT3          (0x1 <<  3) // (UDP) Endpoint 3 Interrupt
+#define AT91C_UDP_EPINT4          (0x1 <<  4) // (UDP) Endpoint 4 Interrupt
+#define AT91C_UDP_EPINT5          (0x1 <<  5) // (UDP) Endpoint 5 Interrupt
+#define AT91C_UDP_EPINT6          (0x1 <<  6) // (UDP) Endpoint 6 Interrupt
+#define AT91C_UDP_EPINT7          (0x1 <<  7) // (UDP) Endpoint 7 Interrupt
+#define AT91C_UDP_RXSUSP          (0x1 <<  8) // (UDP) USB Suspend Interrupt
+#define AT91C_UDP_RXRSM           (0x1 <<  9) // (UDP) USB Resume Interrupt
+#define AT91C_UDP_EXTRSM          (0x1 << 10) // (UDP) USB External Resume Interrupt
+#define AT91C_UDP_SOFINT          (0x1 << 11) // (UDP) USB Start Of frame Interrupt
+#define AT91C_UDP_WAKEUP          (0x1 << 13) // (UDP) USB Resume Interrupt
+// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register --------
+// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register --------
+// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register --------
+#define AT91C_UDP_ENDBUSRES       (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt
+// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register --------
+// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register --------
+#define AT91C_UDP_EP0             (0x1 <<  0) // (UDP) Reset Endpoint 0
+#define AT91C_UDP_EP1             (0x1 <<  1) // (UDP) Reset Endpoint 1
+#define AT91C_UDP_EP2             (0x1 <<  2) // (UDP) Reset Endpoint 2
+#define AT91C_UDP_EP3             (0x1 <<  3) // (UDP) Reset Endpoint 3
+#define AT91C_UDP_EP4             (0x1 <<  4) // (UDP) Reset Endpoint 4
+#define AT91C_UDP_EP5             (0x1 <<  5) // (UDP) Reset Endpoint 5
+#define AT91C_UDP_EP6             (0x1 <<  6) // (UDP) Reset Endpoint 6
+#define AT91C_UDP_EP7             (0x1 <<  7) // (UDP) Reset Endpoint 7
+// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register --------
+#define AT91C_UDP_TXCOMP          (0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR
+#define AT91C_UDP_RX_DATA_BK0     (0x1 <<  1) // (UDP) Receive Data Bank 0
+#define AT91C_UDP_RXSETUP         (0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)
+#define AT91C_UDP_ISOERROR        (0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)
+#define AT91C_UDP_TXPKTRDY        (0x1 <<  4) // (UDP) Transmit Packet Ready
+#define AT91C_UDP_FORCESTALL      (0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).
+#define AT91C_UDP_RX_DATA_BK1     (0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).
+#define AT91C_UDP_DIR             (0x1 <<  7) // (UDP) Transfer Direction
+#define AT91C_UDP_EPTYPE          (0x7 <<  8) // (UDP) Endpoint type
+#define     AT91C_UDP_EPTYPE_CTRL                 (0x0 <<  8) // (UDP) Control
+#define     AT91C_UDP_EPTYPE_ISO_OUT              (0x1 <<  8) // (UDP) Isochronous OUT
+#define     AT91C_UDP_EPTYPE_BULK_OUT             (0x2 <<  8) // (UDP) Bulk OUT
+#define     AT91C_UDP_EPTYPE_INT_OUT              (0x3 <<  8) // (UDP) Interrupt OUT
+#define     AT91C_UDP_EPTYPE_ISO_IN               (0x5 <<  8) // (UDP) Isochronous IN
+#define     AT91C_UDP_EPTYPE_BULK_IN              (0x6 <<  8) // (UDP) Bulk IN
+#define     AT91C_UDP_EPTYPE_INT_IN               (0x7 <<  8) // (UDP) Interrupt IN
+#define AT91C_UDP_DTGLE           (0x1 << 11) // (UDP) Data Toggle
+#define AT91C_UDP_EPEDS           (0x1 << 15) // (UDP) Endpoint Enable Disable
+#define AT91C_UDP_RXBYTECNT       (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO
+
+// *****************************************************************************
+//               REGISTER ADDRESS DEFINITION FOR AT91SAM7S64
+// *****************************************************************************
+// ========== Register definition for SYSC peripheral ==========
+#define AT91C_SYSC_SYSC_VRPM      (0xFFFFFD60) // (SYSC) Voltage Regulator Power Mode Register
+// ========== Register definition for AIC peripheral ==========
+#define AT91C_AIC_ICCR            (0xFFFFF128) // (AIC) Interrupt Clear Command Register
+#define AT91C_AIC_IECR            (0xFFFFF120) // (AIC) Interrupt Enable Command Register
+#define AT91C_AIC_SMR             (0xFFFFF000) // (AIC) Source Mode Register
+#define AT91C_AIC_ISCR            (0xFFFFF12C) // (AIC) Interrupt Set Command Register
+#define AT91C_AIC_EOICR           (0xFFFFF130) // (AIC) End of Interrupt Command Register
+#define AT91C_AIC_DCR             (0xFFFFF138) // (AIC) Debug Control Register (Protect)
+#define AT91C_AIC_FFER            (0xFFFFF140) // (AIC) Fast Forcing Enable Register
+#define AT91C_AIC_SVR             (0xFFFFF080) // (AIC) Source Vector Register
+#define AT91C_AIC_SPU             (0xFFFFF134) // (AIC) Spurious Vector Register
+#define AT91C_AIC_FFDR            (0xFFFFF144) // (AIC) Fast Forcing Disable Register
+#define AT91C_AIC_FVR             (0xFFFFF104) // (AIC) FIQ Vector Register
+#define AT91C_AIC_FFSR            (0xFFFFF148) // (AIC) Fast Forcing Status Register
+#define AT91C_AIC_IMR             (0xFFFFF110) // (AIC) Interrupt Mask Register
+#define AT91C_AIC_ISR             (0xFFFFF108) // (AIC) Interrupt Status Register
+#define AT91C_AIC_IVR             (0xFFFFF100) // (AIC) IRQ Vector Register
+#define AT91C_AIC_IDCR            (0xFFFFF124) // (AIC) Interrupt Disable Command Register
+#define AT91C_AIC_CISR            (0xFFFFF114) // (AIC) Core Interrupt Status Register
+#define AT91C_AIC_IPR             (0xFFFFF10C) // (AIC) Interrupt Pending Register
+// ========== Register definition for DBGU peripheral ==========
+#define AT91C_DBGU_C2R            (0xFFFFF244) // (DBGU) Chip ID2 Register
+#define AT91C_DBGU_THR            (0xFFFFF21C) // (DBGU) Transmitter Holding Register
+#define AT91C_DBGU_CSR            (0xFFFFF214) // (DBGU) Channel Status Register
+#define AT91C_DBGU_IDR            (0xFFFFF20C) // (DBGU) Interrupt Disable Register
+#define AT91C_DBGU_MR             (0xFFFFF204) // (DBGU) Mode Register
+#define AT91C_DBGU_FNTR           (0xFFFFF248) // (DBGU) Force NTRST Register
+#define AT91C_DBGU_C1R            (0xFFFFF240) // (DBGU) Chip ID1 Register
+#define AT91C_DBGU_BRGR           (0xFFFFF220) // (DBGU) Baud Rate Generator Register
+#define AT91C_DBGU_RHR            (0xFFFFF218) // (DBGU) Receiver Holding Register
+#define AT91C_DBGU_IMR            (0xFFFFF210) // (DBGU) Interrupt Mask Register
+#define AT91C_DBGU_IER            (0xFFFFF208) // (DBGU) Interrupt Enable Register
+#define AT91C_DBGU_CR             (0xFFFFF200) // (DBGU) Control Register
+// ========== Register definition for PDC_DBGU peripheral ==========
+#define AT91C_DBGU_TNCR           (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register
+#define AT91C_DBGU_RNCR           (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register
+#define AT91C_DBGU_PTCR           (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register
+#define AT91C_DBGU_PTSR           (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register
+#define AT91C_DBGU_RCR            (0xFFFFF304) // (PDC_DBGU) Receive Counter Register
+#define AT91C_DBGU_TCR            (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register
+#define AT91C_DBGU_RPR            (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register
+#define AT91C_DBGU_TPR            (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register
+#define AT91C_DBGU_RNPR           (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register
+#define AT91C_DBGU_TNPR           (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register
+// ========== Register definition for PIOA peripheral ==========
+#define AT91C_PIOA_IMR            (0xFFFFF448) // (PIOA) Interrupt Mask Register
+#define AT91C_PIOA_IER            (0xFFFFF440) // (PIOA) Interrupt Enable Register
+#define AT91C_PIOA_OWDR           (0xFFFFF4A4) // (PIOA) Output Write Disable Register
+#define AT91C_PIOA_ISR            (0xFFFFF44C) // (PIOA) Interrupt Status Register
+#define AT91C_PIOA_PPUDR          (0xFFFFF460) // (PIOA) Pull-up Disable Register
+#define AT91C_PIOA_MDSR           (0xFFFFF458) // (PIOA) Multi-driver Status Register
+#define AT91C_PIOA_MDER           (0xFFFFF450) // (PIOA) Multi-driver Enable Register
+#define AT91C_PIOA_PER            (0xFFFFF400) // (PIOA) PIO Enable Register
+#define AT91C_PIOA_PSR            (0xFFFFF408) // (PIOA) PIO Status Register
+#define AT91C_PIOA_OER            (0xFFFFF410) // (PIOA) Output Enable Register
+#define AT91C_PIOA_BSR            (0xFFFFF474) // (PIOA) Select B Register
+#define AT91C_PIOA_PPUER          (0xFFFFF464) // (PIOA) Pull-up Enable Register
+#define AT91C_PIOA_MDDR           (0xFFFFF454) // (PIOA) Multi-driver Disable Register
+#define AT91C_PIOA_PDR            (0xFFFFF404) // (PIOA) PIO Disable Register
+#define AT91C_PIOA_ODR            (0xFFFFF414) // (PIOA) Output Disable Registerr
+#define AT91C_PIOA_IFDR           (0xFFFFF424) // (PIOA) Input Filter Disable Register
+#define AT91C_PIOA_ABSR           (0xFFFFF478) // (PIOA) AB Select Status Register
+#define AT91C_PIOA_ASR            (0xFFFFF470) // (PIOA) Select A Register
+#define AT91C_PIOA_PPUSR          (0xFFFFF468) // (PIOA) Pad Pull-up Status Register
+#define AT91C_PIOA_ODSR           (0xFFFFF438) // (PIOA) Output Data Status Register
+#define AT91C_PIOA_SODR           (0xFFFFF430) // (PIOA) Set Output Data Register
+#define AT91C_PIOA_IFSR           (0xFFFFF428) // (PIOA) Input Filter Status Register
+#define AT91C_PIOA_IFER           (0xFFFFF420) // (PIOA) Input Filter Enable Register
+#define AT91C_PIOA_OSR            (0xFFFFF418) // (PIOA) Output Status Register
+#define AT91C_PIOA_IDR            (0xFFFFF444) // (PIOA) Interrupt Disable Register
+#define AT91C_PIOA_PDSR           (0xFFFFF43C) // (PIOA) Pin Data Status Register
+#define AT91C_PIOA_CODR           (0xFFFFF434) // (PIOA) Clear Output Data Register
+#define AT91C_PIOA_OWSR           (0xFFFFF4A8) // (PIOA) Output Write Status Register
+#define AT91C_PIOA_OWER           (0xFFFFF4A0) // (PIOA) Output Write Enable Register
+// ========== Register definition for CKGR peripheral ==========
+#define AT91C_CKGR_PLLR           (0xFFFFFC2C) // (CKGR) PLL Register
+#define AT91C_CKGR_MCFR           (0xFFFFFC24) // (CKGR) Main Clock  Frequency Register
+#define AT91C_CKGR_MOR            (0xFFFFFC20) // (CKGR) Main Oscillator Register
+// ========== Register definition for PMC peripheral ==========
+#define AT91C_PMC_SCSR            (0xFFFFFC08) // (PMC) System Clock Status Register
+#define AT91C_PMC_SCER            (0xFFFFFC00) // (PMC) System Clock Enable Register
+#define AT91C_PMC_IMR             (0xFFFFFC6C) // (PMC) Interrupt Mask Register
+#define AT91C_PMC_IDR             (0xFFFFFC64) // (PMC) Interrupt Disable Register
+#define AT91C_PMC_PCDR            (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register
+#define AT91C_PMC_SCDR            (0xFFFFFC04) // (PMC) System Clock Disable Register
+#define AT91C_PMC_SR              (0xFFFFFC68) // (PMC) Status Register
+#define AT91C_PMC_IER             (0xFFFFFC60) // (PMC) Interrupt Enable Register
+#define AT91C_PMC_MCKR            (0xFFFFFC30) // (PMC) Master Clock Register
+#define AT91C_PMC_MOR             (0xFFFFFC20) // (PMC) Main Oscillator Register
+#define AT91C_PMC_PCER            (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register
+#define AT91C_PMC_PCSR            (0xFFFFFC18) // (PMC) Peripheral Clock Status Register
+#define AT91C_PMC_PLLR            (0xFFFFFC2C) // (PMC) PLL Register
+#define AT91C_PMC_MCFR            (0xFFFFFC24) // (PMC) Main Clock  Frequency Register
+#define AT91C_PMC_PCKR            (0xFFFFFC40) // (PMC) Programmable Clock Register
+// ========== Register definition for RSTC peripheral ==========
+#define AT91C_RSTC_RSR            (0xFFFFFD04) // (RSTC) Reset Status Register
+#define AT91C_RSTC_RMR            (0xFFFFFD08) // (RSTC) Reset Mode Register
+#define AT91C_RSTC_RCR            (0xFFFFFD00) // (RSTC) Reset Control Register
+// ========== Register definition for RTTC peripheral ==========
+#define AT91C_RTTC_RTSR           (0xFFFFFD2C) // (RTTC) Real-time Status Register
+#define AT91C_RTTC_RTAR           (0xFFFFFD24) // (RTTC) Real-time Alarm Register
+#define AT91C_RTTC_RTVR           (0xFFFFFD28) // (RTTC) Real-time Value Register
+#define AT91C_RTTC_RTMR           (0xFFFFFD20) // (RTTC) Real-time Mode Register
+// ========== Register definition for PITC peripheral ==========
+#define AT91C_PITC_PIIR           (0xFFFFFD3C) // (PITC) Period Interval Image Register
+#define AT91C_PITC_PISR           (0xFFFFFD34) // (PITC) Period Interval Status Register
+#define AT91C_PITC_PIVR           (0xFFFFFD38) // (PITC) Period Interval Value Register
+#define AT91C_PITC_PIMR           (0xFFFFFD30) // (PITC) Period Interval Mode Register
+// ========== Register definition for WDTC peripheral ==========
+#define AT91C_WDTC_WDMR           (0xFFFFFD44) // (WDTC) Watchdog Mode Register
+#define AT91C_WDTC_WDSR           (0xFFFFFD48) // (WDTC) Watchdog Status Register
+#define AT91C_WDTC_WDCR           (0xFFFFFD40) // (WDTC) Watchdog Control Register
+// ========== Register definition for MC peripheral ==========
+#define AT91C_MC_FCR              (0xFFFFFF64) // (MC) MC Flash Command Register
+#define AT91C_MC_ASR              (0xFFFFFF04) // (MC) MC Abort Status Register
+#define AT91C_MC_FSR              (0xFFFFFF68) // (MC) MC Flash Status Register
+#define AT91C_MC_FMR              (0xFFFFFF60) // (MC) MC Flash Mode Register
+#define AT91C_MC_AASR             (0xFFFFFF08) // (MC) MC Abort Address Status Register
+#define AT91C_MC_RCR              (0xFFFFFF00) // (MC) MC Remap Control Register
+// ========== Register definition for PDC_SPI peripheral ==========
+#define AT91C_SPI_PTCR            (0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register
+#define AT91C_SPI_TNPR            (0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register
+#define AT91C_SPI_RNPR            (0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register
+#define AT91C_SPI_TPR             (0xFFFE0108) // (PDC_SPI) Transmit Pointer Register
+#define AT91C_SPI_RPR             (0xFFFE0100) // (PDC_SPI) Receive Pointer Register
+#define AT91C_SPI_PTSR            (0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register
+#define AT91C_SPI_TNCR            (0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register
+#define AT91C_SPI_RNCR            (0xFFFE0114) // (PDC_SPI) Receive Next Counter Register
+#define AT91C_SPI_TCR             (0xFFFE010C) // (PDC_SPI) Transmit Counter Register
+#define AT91C_SPI_RCR             (0xFFFE0104) // (PDC_SPI) Receive Counter Register
+// ========== Register definition for SPI peripheral ==========
+#define AT91C_SPI_CSR             (0xFFFE0030) // (SPI) Chip Select Register
+#define AT91C_SPI_IDR             (0xFFFE0018) // (SPI) Interrupt Disable Register
+#define AT91C_SPI_SR              (0xFFFE0010) // (SPI) Status Register
+#define AT91C_SPI_RDR             (0xFFFE0008) // (SPI) Receive Data Register
+#define AT91C_SPI_CR              (0xFFFE0000) // (SPI) Control Register
+#define AT91C_SPI_IMR             (0xFFFE001C) // (SPI) Interrupt Mask Register
+#define AT91C_SPI_IER             (0xFFFE0014) // (SPI) Interrupt Enable Register
+#define AT91C_SPI_TDR             (0xFFFE000C) // (SPI) Transmit Data Register
+#define AT91C_SPI_MR              (0xFFFE0004) // (SPI) Mode Register
+// ========== Register definition for PDC_ADC peripheral ==========
+#define AT91C_ADC_PTCR            (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register
+#define AT91C_ADC_TNPR            (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register
+#define AT91C_ADC_RNPR            (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register
+#define AT91C_ADC_TPR             (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register
+#define AT91C_ADC_RPR             (0xFFFD8100) // (PDC_ADC) Receive Pointer Register
+#define AT91C_ADC_PTSR            (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register
+#define AT91C_ADC_TNCR            (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register
+#define AT91C_ADC_RNCR            (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register
+#define AT91C_ADC_TCR             (0xFFFD810C) // (PDC_ADC) Transmit Counter Register
+#define AT91C_ADC_RCR             (0xFFFD8104) // (PDC_ADC) Receive Counter Register
+// ========== Register definition for ADC peripheral ==========
+#define AT91C_ADC_IMR             (0xFFFD802C) // (ADC) ADC Interrupt Mask Register
+#define AT91C_ADC_CDR4            (0xFFFD8040) // (ADC) ADC Channel Data Register 4
+#define AT91C_ADC_CDR2            (0xFFFD8038) // (ADC) ADC Channel Data Register 2
+#define AT91C_ADC_CDR0            (0xFFFD8030) // (ADC) ADC Channel Data Register 0
+#define AT91C_ADC_CDR7            (0xFFFD804C) // (ADC) ADC Channel Data Register 7
+#define AT91C_ADC_CDR1            (0xFFFD8034) // (ADC) ADC Channel Data Register 1
+#define AT91C_ADC_CDR3            (0xFFFD803C) // (ADC) ADC Channel Data Register 3
+#define AT91C_ADC_CDR5            (0xFFFD8044) // (ADC) ADC Channel Data Register 5
+#define AT91C_ADC_MR              (0xFFFD8004) // (ADC) ADC Mode Register
+#define AT91C_ADC_CDR6            (0xFFFD8048) // (ADC) ADC Channel Data Register 6
+#define AT91C_ADC_CR              (0xFFFD8000) // (ADC) ADC Control Register
+#define AT91C_ADC_CHER            (0xFFFD8010) // (ADC) ADC Channel Enable Register
+#define AT91C_ADC_CHSR            (0xFFFD8018) // (ADC) ADC Channel Status Register
+#define AT91C_ADC_IER             (0xFFFD8024) // (ADC) ADC Interrupt Enable Register
+#define AT91C_ADC_SR              (0xFFFD801C) // (ADC) ADC Status Register
+#define AT91C_ADC_CHDR            (0xFFFD8014) // (ADC) ADC Channel Disable Register
+#define AT91C_ADC_IDR             (0xFFFD8028) // (ADC) ADC Interrupt Disable Register
+#define AT91C_ADC_LCDR            (0xFFFD8020) // (ADC) ADC Last Converted Data Register
+// ========== Register definition for PDC_SSC peripheral ==========
+#define AT91C_SSC_PTCR            (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register
+#define AT91C_SSC_TNPR            (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register
+#define AT91C_SSC_RNPR            (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register
+#define AT91C_SSC_TPR             (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register
+#define AT91C_SSC_RPR             (0xFFFD4100) // (PDC_SSC) Receive Pointer Register
+#define AT91C_SSC_PTSR            (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register
+#define AT91C_SSC_TNCR            (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register
+#define AT91C_SSC_RNCR            (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register
+#define AT91C_SSC_TCR             (0xFFFD410C) // (PDC_SSC) Transmit Counter Register
+#define AT91C_SSC_RCR             (0xFFFD4104) // (PDC_SSC) Receive Counter Register
+// ========== Register definition for SSC peripheral ==========
+#define AT91C_SSC_RFMR            (0xFFFD4014) // (SSC) Receive Frame Mode Register
+#define AT91C_SSC_CMR             (0xFFFD4004) // (SSC) Clock Mode Register
+#define AT91C_SSC_IDR             (0xFFFD4048) // (SSC) Interrupt Disable Register
+#define AT91C_SSC_SR              (0xFFFD4040) // (SSC) Status Register
+#define AT91C_SSC_RC0R            (0xFFFD4038) // (SSC) Receive Compare 0 Register
+#define AT91C_SSC_RSHR            (0xFFFD4030) // (SSC) Receive Sync Holding Register
+#define AT91C_SSC_RHR             (0xFFFD4020) // (SSC) Receive Holding Register
+#define AT91C_SSC_TCMR            (0xFFFD4018) // (SSC) Transmit Clock Mode Register
+#define AT91C_SSC_RCMR            (0xFFFD4010) // (SSC) Receive Clock ModeRegister
+#define AT91C_SSC_CR              (0xFFFD4000) // (SSC) Control Register
+#define AT91C_SSC_IMR             (0xFFFD404C) // (SSC) Interrupt Mask Register
+#define AT91C_SSC_IER             (0xFFFD4044) // (SSC) Interrupt Enable Register
+#define AT91C_SSC_RC1R            (0xFFFD403C) // (SSC) Receive Compare 1 Register
+#define AT91C_SSC_TSHR            (0xFFFD4034) // (SSC) Transmit Sync Holding Register
+#define AT91C_SSC_THR             (0xFFFD4024) // (SSC) Transmit Holding Register
+#define AT91C_SSC_TFMR            (0xFFFD401C) // (SSC) Transmit Frame Mode Register
+// ========== Register definition for PDC_US1 peripheral ==========
+#define AT91C_US1_PTSR            (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register
+#define AT91C_US1_TNCR            (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register
+#define AT91C_US1_RNCR            (0xFFFC4114) // (PDC_US1) Receive Next Counter Register
+#define AT91C_US1_TCR             (0xFFFC410C) // (PDC_US1) Transmit Counter Register
+#define AT91C_US1_RCR             (0xFFFC4104) // (PDC_US1) Receive Counter Register
+#define AT91C_US1_PTCR            (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register
+#define AT91C_US1_TNPR            (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register
+#define AT91C_US1_RNPR            (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register
+#define AT91C_US1_TPR             (0xFFFC4108) // (PDC_US1) Transmit Pointer Register
+#define AT91C_US1_RPR             (0xFFFC4100) // (PDC_US1) Receive Pointer Register
+// ========== Register definition for US1 peripheral ==========
+#define AT91C_US1_XXR             (0xFFFC4048) // (US1) XON_XOFF Register
+#define AT91C_US1_RHR             (0xFFFC4018) // (US1) Receiver Holding Register
+#define AT91C_US1_IMR             (0xFFFC4010) // (US1) Interrupt Mask Register
+#define AT91C_US1_IER             (0xFFFC4008) // (US1) Interrupt Enable Register
+#define AT91C_US1_CR              (0xFFFC4000) // (US1) Control Register
+#define AT91C_US1_RTOR            (0xFFFC4024) // (US1) Receiver Time-out Register
+#define AT91C_US1_THR             (0xFFFC401C) // (US1) Transmitter Holding Register
+#define AT91C_US1_CSR             (0xFFFC4014) // (US1) Channel Status Register
+#define AT91C_US1_IDR             (0xFFFC400C) // (US1) Interrupt Disable Register
+#define AT91C_US1_FIDI            (0xFFFC4040) // (US1) FI_DI_Ratio Register
+#define AT91C_US1_BRGR            (0xFFFC4020) // (US1) Baud Rate Generator Register
+#define AT91C_US1_TTGR            (0xFFFC4028) // (US1) Transmitter Time-guard Register
+#define AT91C_US1_IF              (0xFFFC404C) // (US1) IRDA_FILTER Register
+#define AT91C_US1_NER             (0xFFFC4044) // (US1) Nb Errors Register
+#define AT91C_US1_MR              (0xFFFC4004) // (US1) Mode Register
+// ========== Register definition for PDC_US0 peripheral ==========
+#define AT91C_US0_PTCR            (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register
+#define AT91C_US0_TNPR            (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register
+#define AT91C_US0_RNPR            (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register
+#define AT91C_US0_TPR             (0xFFFC0108) // (PDC_US0) Transmit Pointer Register
+#define AT91C_US0_RPR             (0xFFFC0100) // (PDC_US0) Receive Pointer Register
+#define AT91C_US0_PTSR            (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register
+#define AT91C_US0_TNCR            (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register
+#define AT91C_US0_RNCR            (0xFFFC0114) // (PDC_US0) Receive Next Counter Register
+#define AT91C_US0_TCR             (0xFFFC010C) // (PDC_US0) Transmit Counter Register
+#define AT91C_US0_RCR             (0xFFFC0104) // (PDC_US0) Receive Counter Register
+// ========== Register definition for US0 peripheral ==========
+#define AT91C_US0_TTGR            (0xFFFC0028) // (US0) Transmitter Time-guard Register
+#define AT91C_US0_BRGR            (0xFFFC0020) // (US0) Baud Rate Generator Register
+#define AT91C_US0_RHR             (0xFFFC0018) // (US0) Receiver Holding Register
+#define AT91C_US0_IMR             (0xFFFC0010) // (US0) Interrupt Mask Register
+#define AT91C_US0_NER             (0xFFFC0044) // (US0) Nb Errors Register
+#define AT91C_US0_RTOR            (0xFFFC0024) // (US0) Receiver Time-out Register
+#define AT91C_US0_XXR             (0xFFFC0048) // (US0) XON_XOFF Register
+#define AT91C_US0_FIDI            (0xFFFC0040) // (US0) FI_DI_Ratio Register
+#define AT91C_US0_CR              (0xFFFC0000) // (US0) Control Register
+#define AT91C_US0_IER             (0xFFFC0008) // (US0) Interrupt Enable Register
+#define AT91C_US0_IF              (0xFFFC004C) // (US0) IRDA_FILTER Register
+#define AT91C_US0_MR              (0xFFFC0004) // (US0) Mode Register
+#define AT91C_US0_IDR             (0xFFFC000C) // (US0) Interrupt Disable Register
+#define AT91C_US0_CSR             (0xFFFC0014) // (US0) Channel Status Register
+#define AT91C_US0_THR             (0xFFFC001C) // (US0) Transmitter Holding Register
+// ========== Register definition for TWI peripheral ==========
+#define AT91C_TWI_RHR             (0xFFFB8030) // (TWI) Receive Holding Register
+#define AT91C_TWI_IDR             (0xFFFB8028) // (TWI) Interrupt Disable Register
+#define AT91C_TWI_SR              (0xFFFB8020) // (TWI) Status Register
+#define AT91C_TWI_CWGR            (0xFFFB8010) // (TWI) Clock Waveform Generator Register
+#define AT91C_TWI_SMR             (0xFFFB8008) // (TWI) Slave Mode Register
+#define AT91C_TWI_CR              (0xFFFB8000) // (TWI) Control Register
+#define AT91C_TWI_THR             (0xFFFB8034) // (TWI) Transmit Holding Register
+#define AT91C_TWI_IMR             (0xFFFB802C) // (TWI) Interrupt Mask Register
+#define AT91C_TWI_IER             (0xFFFB8024) // (TWI) Interrupt Enable Register
+#define AT91C_TWI_IADR            (0xFFFB800C) // (TWI) Internal Address Register
+#define AT91C_TWI_MMR             (0xFFFB8004) // (TWI) Master Mode Register
+// ========== Register definition for TC2 peripheral ==========
+#define AT91C_TC2_IMR             (0xFFFA00AC) // (TC2) Interrupt Mask Register
+#define AT91C_TC2_IER             (0xFFFA00A4) // (TC2) Interrupt Enable Register
+#define AT91C_TC2_RC              (0xFFFA009C) // (TC2) Register C
+#define AT91C_TC2_RA              (0xFFFA0094) // (TC2) Register A
+#define AT91C_TC2_CMR             (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC2_IDR             (0xFFFA00A8) // (TC2) Interrupt Disable Register
+#define AT91C_TC2_SR              (0xFFFA00A0) // (TC2) Status Register
+#define AT91C_TC2_RB              (0xFFFA0098) // (TC2) Register B
+#define AT91C_TC2_CV              (0xFFFA0090) // (TC2) Counter Value
+#define AT91C_TC2_CCR             (0xFFFA0080) // (TC2) Channel Control Register
+// ========== Register definition for TC1 peripheral ==========
+#define AT91C_TC1_IMR             (0xFFFA006C) // (TC1) Interrupt Mask Register
+#define AT91C_TC1_IER             (0xFFFA0064) // (TC1) Interrupt Enable Register
+#define AT91C_TC1_RC              (0xFFFA005C) // (TC1) Register C
+#define AT91C_TC1_RA              (0xFFFA0054) // (TC1) Register A
+#define AT91C_TC1_CMR             (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC1_IDR             (0xFFFA0068) // (TC1) Interrupt Disable Register
+#define AT91C_TC1_SR              (0xFFFA0060) // (TC1) Status Register
+#define AT91C_TC1_RB              (0xFFFA0058) // (TC1) Register B
+#define AT91C_TC1_CV              (0xFFFA0050) // (TC1) Counter Value
+#define AT91C_TC1_CCR             (0xFFFA0040) // (TC1) Channel Control Register
+// ========== Register definition for TC0 peripheral ==========
+#define AT91C_TC0_IMR             (0xFFFA002C) // (TC0) Interrupt Mask Register
+#define AT91C_TC0_IER             (0xFFFA0024) // (TC0) Interrupt Enable Register
+#define AT91C_TC0_RC              (0xFFFA001C) // (TC0) Register C
+#define AT91C_TC0_RA              (0xFFFA0014) // (TC0) Register A
+#define AT91C_TC0_CMR             (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC0_IDR             (0xFFFA0028) // (TC0) Interrupt Disable Register
+#define AT91C_TC0_SR              (0xFFFA0020) // (TC0) Status Register
+#define AT91C_TC0_RB              (0xFFFA0018) // (TC0) Register B
+#define AT91C_TC0_CV              (0xFFFA0010) // (TC0) Counter Value
+#define AT91C_TC0_CCR             (0xFFFA0000) // (TC0) Channel Control Register
+// ========== Register definition for TCB peripheral ==========
+#define AT91C_TCB_BMR             (0xFFFA00C4) // (TCB) TC Block Mode Register
+#define AT91C_TCB_BCR             (0xFFFA00C0) // (TCB) TC Block Control Register
+// ========== Register definition for PWMC_CH3 peripheral ==========
+#define AT91C_CH3_CUPDR           (0xFFFCC270) // (PWMC_CH3) Channel Update Register
+#define AT91C_CH3_CPRDR           (0xFFFCC268) // (PWMC_CH3) Channel Period Register
+#define AT91C_CH3_CMR             (0xFFFCC260) // (PWMC_CH3) Channel Mode Register
+#define AT91C_CH3_Reserved        (0xFFFCC274) // (PWMC_CH3) Reserved
+#define AT91C_CH3_CCNTR           (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register
+#define AT91C_CH3_CDTYR           (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register
+// ========== Register definition for PWMC_CH2 peripheral ==========
+#define AT91C_CH2_CUPDR           (0xFFFCC250) // (PWMC_CH2) Channel Update Register
+#define AT91C_CH2_CPRDR           (0xFFFCC248) // (PWMC_CH2) Channel Period Register
+#define AT91C_CH2_CMR             (0xFFFCC240) // (PWMC_CH2) Channel Mode Register
+#define AT91C_CH2_Reserved        (0xFFFCC254) // (PWMC_CH2) Reserved
+#define AT91C_CH2_CCNTR           (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register
+#define AT91C_CH2_CDTYR           (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register
+// ========== Register definition for PWMC_CH1 peripheral ==========
+#define AT91C_CH1_CUPDR           (0xFFFCC230) // (PWMC_CH1) Channel Update Register
+#define AT91C_CH1_CPRDR           (0xFFFCC228) // (PWMC_CH1) Channel Period Register
+#define AT91C_CH1_CMR             (0xFFFCC220) // (PWMC_CH1) Channel Mode Register
+#define AT91C_CH1_Reserved        (0xFFFCC234) // (PWMC_CH1) Reserved
+#define AT91C_CH1_CCNTR           (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register
+#define AT91C_CH1_CDTYR           (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register
+// ========== Register definition for PWMC_CH0 peripheral ==========
+#define AT91C_CH0_CUPDR           (0xFFFCC210) // (PWMC_CH0) Channel Update Register
+#define AT91C_CH0_CPRDR           (0xFFFCC208) // (PWMC_CH0) Channel Period Register
+#define AT91C_CH0_CMR             (0xFFFCC200) // (PWMC_CH0) Channel Mode Register
+#define AT91C_CH0_Reserved        (0xFFFCC214) // (PWMC_CH0) Reserved
+#define AT91C_CH0_CCNTR           (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register
+#define AT91C_CH0_CDTYR           (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register
+// ========== Register definition for PWMC peripheral ==========
+#define AT91C_PWMC_VR             (0xFFFCC0FC) // (PWMC) PWMC Version Register
+#define AT91C_PWMC_ISR            (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register
+#define AT91C_PWMC_IDR            (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register
+#define AT91C_PWMC_SR             (0xFFFCC00C) // (PWMC) PWMC Status Register
+#define AT91C_PWMC_ENA            (0xFFFCC004) // (PWMC) PWMC Enable Register
+#define AT91C_PWMC_IMR            (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register
+#define AT91C_PWMC_MR             (0xFFFCC000) // (PWMC) PWMC Mode Register
+#define AT91C_PWMC_DIS            (0xFFFCC008) // (PWMC) PWMC Disable Register
+#define AT91C_PWMC_IER            (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register
+// ========== Register definition for UDP peripheral ==========
+#define AT91C_UDP_ISR             (0xFFFB001C) // (UDP) Interrupt Status Register
+#define AT91C_UDP_IDR             (0xFFFB0014) // (UDP) Interrupt Disable Register
+#define AT91C_UDP_GLBSTATE        (0xFFFB0004) // (UDP) Global State Register
+#define AT91C_UDP_FDR             (0xFFFB0050) // (UDP) Endpoint FIFO Data Register
+#define AT91C_UDP_CSR             (0xFFFB0030) // (UDP) Endpoint Control and Status Register
+#define AT91C_UDP_RSTEP           (0xFFFB0028) // (UDP) Reset Endpoint Register
+#define AT91C_UDP_ICR             (0xFFFB0020) // (UDP) Interrupt Clear Register
+#define AT91C_UDP_IMR             (0xFFFB0018) // (UDP) Interrupt Mask Register
+#define AT91C_UDP_IER             (0xFFFB0010) // (UDP) Interrupt Enable Register
+#define AT91C_UDP_FADDR           (0xFFFB0008) // (UDP) Function Address Register
+#define AT91C_UDP_NUM             (0xFFFB0000) // (UDP) Frame Number Register
+
+// *****************************************************************************
+//               PIO DEFINITIONS FOR AT91SAM7S64
+// *****************************************************************************
+#define AT91C_PIO_PA0             (1 <<  0) // Pin Controlled by PA0
+#define AT91C_PA0_PWM0            (AT91C_PIO_PA0) //  PWM Channel 0
+#define AT91C_PA0_TIOA0           (AT91C_PIO_PA0) //  Timer Counter 0 Multipurpose Timer I/O Pin A
+#define AT91C_PIO_PA1             (1 <<  1) // Pin Controlled by PA1
+#define AT91C_PA1_PWM1            (AT91C_PIO_PA1) //  PWM Channel 1
+#define AT91C_PA1_TIOB0           (AT91C_PIO_PA1) //  Timer Counter 0 Multipurpose Timer I/O Pin B
+#define AT91C_PIO_PA10            (1 << 10) // Pin Controlled by PA10
+#define AT91C_PA10_DTXD           (AT91C_PIO_PA10) //  DBGU Debug Transmit Data
+#define AT91C_PA10_NPCS2          (AT91C_PIO_PA10) //  SPI Peripheral Chip Select 2
+#define AT91C_PIO_PA11            (1 << 11) // Pin Controlled by PA11
+#define AT91C_PA11_NPCS0          (AT91C_PIO_PA11) //  SPI Peripheral Chip Select 0
+#define AT91C_PA11_PWM0           (AT91C_PIO_PA11) //  PWM Channel 0
+#define AT91C_PIO_PA12            (1 << 12) // Pin Controlled by PA12
+#define AT91C_PA12_MISO           (AT91C_PIO_PA12) //  SPI Master In Slave
+#define AT91C_PA12_PWM1           (AT91C_PIO_PA12) //  PWM Channel 1
+#define AT91C_PIO_PA13            (1 << 13) // Pin Controlled by PA13
+#define AT91C_PA13_MOSI           (AT91C_PIO_PA13) //  SPI Master Out Slave
+#define AT91C_PA13_PWM2           (AT91C_PIO_PA13) //  PWM Channel 2
+#define AT91C_PIO_PA14            (1 << 14) // Pin Controlled by PA14
+#define AT91C_PA14_SPCK           (AT91C_PIO_PA14) //  SPI Serial Clock
+#define AT91C_PA14_PWM3           (AT91C_PIO_PA14) //  PWM Channel 3
+#define AT91C_PIO_PA15            (1 << 15) // Pin Controlled by PA15
+#define AT91C_PA15_TF             (AT91C_PIO_PA15) //  SSC Transmit Frame Sync
+#define AT91C_PA15_TIOA1          (AT91C_PIO_PA15) //  Timer Counter 1 Multipurpose Timer I/O Pin A
+#define AT91C_PIO_PA16            (1 << 16) // Pin Controlled by PA16
+#define AT91C_PA16_TK             (AT91C_PIO_PA16) //  SSC Transmit Clock
+#define AT91C_PA16_TIOB1          (AT91C_PIO_PA16) //  Timer Counter 1 Multipurpose Timer I/O Pin B
+#define AT91C_PIO_PA17            (1 << 17) // Pin Controlled by PA17
+#define AT91C_PA17_TD             (AT91C_PIO_PA17) //  SSC Transmit data
+#define AT91C_PA17_PCK1           (AT91C_PIO_PA17) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PA18            (1 << 18) // Pin Controlled by PA18
+#define AT91C_PA18_RD             (AT91C_PIO_PA18) //  SSC Receive Data
+#define AT91C_PA18_PCK2           (AT91C_PIO_PA18) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PA19            (1 << 19) // Pin Controlled by PA19
+#define AT91C_PA19_RK             (AT91C_PIO_PA19) //  SSC Receive Clock
+#define AT91C_PA19_FIQ            (AT91C_PIO_PA19) //  AIC Fast Interrupt Input
+#define AT91C_PIO_PA2             (1 <<  2) // Pin Controlled by PA2
+#define AT91C_PA2_PWM2            (AT91C_PIO_PA2) //  PWM Channel 2
+#define AT91C_PA2_SCK0            (AT91C_PIO_PA2) //  USART 0 Serial Clock
+#define AT91C_PIO_PA20            (1 << 20) // Pin Controlled by PA20
+#define AT91C_PA20_RF             (AT91C_PIO_PA20) //  SSC Receive Frame Sync
+#define AT91C_PA20_IRQ0           (AT91C_PIO_PA20) //  External Interrupt 0
+#define AT91C_PIO_PA21            (1 << 21) // Pin Controlled by PA21
+#define AT91C_PA21_RXD1           (AT91C_PIO_PA21) //  USART 1 Receive Data
+#define AT91C_PA21_PCK1           (AT91C_PIO_PA21) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PA22            (1 << 22) // Pin Controlled by PA22
+#define AT91C_PA22_TXD1           (AT91C_PIO_PA22) //  USART 1 Transmit Data
+#define AT91C_PA22_NPCS3          (AT91C_PIO_PA22) //  SPI Peripheral Chip Select 3
+#define AT91C_PIO_PA23            (1 << 23) // Pin Controlled by PA23
+#define AT91C_PA23_SCK1           (AT91C_PIO_PA23) //  USART 1 Serial Clock
+#define AT91C_PA23_PWM0           (AT91C_PIO_PA23) //  PWM Channel 0
+#define AT91C_PIO_PA24            (1 << 24) // Pin Controlled by PA24
+#define AT91C_PA24_RTS1           (AT91C_PIO_PA24) //  USART 1 Ready To Send
+#define AT91C_PA24_PWM1           (AT91C_PIO_PA24) //  PWM Channel 1
+#define AT91C_PIO_PA25            (1 << 25) // Pin Controlled by PA25
+#define AT91C_PA25_CTS1           (AT91C_PIO_PA25) //  USART 1 Clear To Send
+#define AT91C_PA25_PWM2           (AT91C_PIO_PA25) //  PWM Channel 2
+#define AT91C_PIO_PA26            (1 << 26) // Pin Controlled by PA26
+#define AT91C_PA26_DCD1           (AT91C_PIO_PA26) //  USART 1 Data Carrier Detect
+#define AT91C_PA26_TIOA2          (AT91C_PIO_PA26) //  Timer Counter 2 Multipurpose Timer I/O Pin A
+#define AT91C_PIO_PA27            (1 << 27) // Pin Controlled by PA27
+#define AT91C_PA27_DTR1           (AT91C_PIO_PA27) //  USART 1 Data Terminal ready
+#define AT91C_PA27_TIOB2          (AT91C_PIO_PA27) //  Timer Counter 2 Multipurpose Timer I/O Pin B
+#define AT91C_PIO_PA28            (1 << 28) // Pin Controlled by PA28
+#define AT91C_PA28_DSR1           (AT91C_PIO_PA28) //  USART 1 Data Set ready
+#define AT91C_PA28_TCLK1          (AT91C_PIO_PA28) //  Timer Counter 1 external clock input
+#define AT91C_PIO_PA29            (1 << 29) // Pin Controlled by PA29
+#define AT91C_PA29_RI1            (AT91C_PIO_PA29) //  USART 1 Ring Indicator
+#define AT91C_PA29_TCLK2          (AT91C_PIO_PA29) //  Timer Counter 2 external clock input
+#define AT91C_PIO_PA3             (1 <<  3) // Pin Controlled by PA3
+#define AT91C_PA3_TWD             (AT91C_PIO_PA3) //  TWI Two-wire Serial Data
+#define AT91C_PA3_NPCS3           (AT91C_PIO_PA3) //  SPI Peripheral Chip Select 3
+#define AT91C_PIO_PA30            (1 << 30) // Pin Controlled by PA30
+#define AT91C_PA30_IRQ1           (AT91C_PIO_PA30) //  External Interrupt 1
+#define AT91C_PA30_NPCS2          (AT91C_PIO_PA30) //  SPI Peripheral Chip Select 2
+#define AT91C_PIO_PA31            (1 << 31) // Pin Controlled by PA31
+#define AT91C_PA31_NPCS1          (AT91C_PIO_PA31) //  SPI Peripheral Chip Select 1
+#define AT91C_PA31_PCK2           (AT91C_PIO_PA31) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PA4             (1 <<  4) // Pin Controlled by PA4
+#define AT91C_PA4_TWCK            (AT91C_PIO_PA4) //  TWI Two-wire Serial Clock
+#define AT91C_PA4_TCLK0           (AT91C_PIO_PA4) //  Timer Counter 0 external clock input
+#define AT91C_PIO_PA5             (1 <<  5) // Pin Controlled by PA5
+#define AT91C_PA5_RXD0            (AT91C_PIO_PA5) //  USART 0 Receive Data
+#define AT91C_PA5_NPCS3           (AT91C_PIO_PA5) //  SPI Peripheral Chip Select 3
+#define AT91C_PIO_PA6             (1 <<  6) // Pin Controlled by PA6
+#define AT91C_PA6_TXD0            (AT91C_PIO_PA6) //  USART 0 Transmit Data
+#define AT91C_PA6_PCK0            (AT91C_PIO_PA6) //  PMC Programmable Clock Output 0
+#define AT91C_PIO_PA7             (1 <<  7) // Pin Controlled by PA7
+#define AT91C_PA7_RTS0            (AT91C_PIO_PA7) //  USART 0 Ready To Send
+#define AT91C_PA7_PWM3            (AT91C_PIO_PA7) //  PWM Channel 3
+#define AT91C_PIO_PA8             (1 <<  8) // Pin Controlled by PA8
+#define AT91C_PA8_CTS0            (AT91C_PIO_PA8) //  USART 0 Clear To Send
+#define AT91C_PA8_ADTRG           (AT91C_PIO_PA8) //  ADC External Trigger
+#define AT91C_PIO_PA9             (1 <<  9) // Pin Controlled by PA9
+#define AT91C_PA9_DRXD            (AT91C_PIO_PA9) //  DBGU Debug Receive Data
+#define AT91C_PA9_NPCS1           (AT91C_PIO_PA9) //  SPI Peripheral Chip Select 1
+
+// *****************************************************************************
+//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7S64
+// *****************************************************************************
+#define AT91C_ID_FIQ              ( 0) // Advanced Interrupt Controller (FIQ)
+#define AT91C_ID_SYS              ( 1) // System Peripheral
+#define AT91C_ID_PIOA             ( 2) // Parallel IO Controller
+#define AT91C_ID_3_Reserved       ( 3) // Reserved
+#define AT91C_ID_ADC              ( 4) // Analog-to-Digital Converter
+#define AT91C_ID_SPI              ( 5) // Serial Peripheral Interface
+#define AT91C_ID_US0              ( 6) // USART 0
+#define AT91C_ID_US1              ( 7) // USART 1
+#define AT91C_ID_SSC              ( 8) // Serial Synchronous Controller
+#define AT91C_ID_TWI              ( 9) // Two-Wire Interface
+#define AT91C_ID_PWMC             (10) // PWM Controller
+#define AT91C_ID_UDP              (11) // USB Device Port
+#define AT91C_ID_TC0              (12) // Timer Counter 0
+#define AT91C_ID_TC1              (13) // Timer Counter 1
+#define AT91C_ID_TC2              (14) // Timer Counter 2
+#define AT91C_ID_15_Reserved      (15) // Reserved
+#define AT91C_ID_16_Reserved      (16) // Reserved
+#define AT91C_ID_17_Reserved      (17) // Reserved
+#define AT91C_ID_18_Reserved      (18) // Reserved
+#define AT91C_ID_19_Reserved      (19) // Reserved
+#define AT91C_ID_20_Reserved      (20) // Reserved
+#define AT91C_ID_21_Reserved      (21) // Reserved
+#define AT91C_ID_22_Reserved      (22) // Reserved
+#define AT91C_ID_23_Reserved      (23) // Reserved
+#define AT91C_ID_24_Reserved      (24) // Reserved
+#define AT91C_ID_25_Reserved      (25) // Reserved
+#define AT91C_ID_26_Reserved      (26) // Reserved
+#define AT91C_ID_27_Reserved      (27) // Reserved
+#define AT91C_ID_28_Reserved      (28) // Reserved
+#define AT91C_ID_29_Reserved      (29) // Reserved
+#define AT91C_ID_IRQ0             (30) // Advanced Interrupt Controller (IRQ0)
+#define AT91C_ID_IRQ1             (31) // Advanced Interrupt Controller (IRQ1)
+
+// *****************************************************************************
+//               BASE ADDRESS DEFINITIONS FOR AT91SAM7S64
+// *****************************************************************************
+#define AT91C_BASE_SYSC           (0xFFFFF000) // (SYSC) Base Address
+#define AT91C_BASE_AIC            (0xFFFFF000) // (AIC) Base Address
+#define AT91C_BASE_DBGU           (0xFFFFF200) // (DBGU) Base Address
+#define AT91C_BASE_PDC_DBGU       (0xFFFFF300) // (PDC_DBGU) Base Address
+#define AT91C_BASE_PIOA           (0xFFFFF400) // (PIOA) Base Address
+#define AT91C_BASE_CKGR           (0xFFFFFC20) // (CKGR) Base Address
+#define AT91C_BASE_PMC            (0xFFFFFC00) // (PMC) Base Address
+#define AT91C_BASE_RSTC           (0xFFFFFD00) // (RSTC) Base Address
+#define AT91C_BASE_RTTC           (0xFFFFFD20) // (RTTC) Base Address
+#define AT91C_BASE_PITC           (0xFFFFFD30) // (PITC) Base Address
+#define AT91C_BASE_WDTC           (0xFFFFFD40) // (WDTC) Base Address
+#define AT91C_BASE_MC             (0xFFFFFF00) // (MC) Base Address
+#define AT91C_BASE_PDC_SPI        (0xFFFE0100) // (PDC_SPI) Base Address
+#define AT91C_BASE_SPI            (0xFFFE0000) // (SPI) Base Address
+#define AT91C_BASE_PDC_ADC        (0xFFFD8100) // (PDC_ADC) Base Address
+#define AT91C_BASE_ADC            (0xFFFD8000) // (ADC) Base Address
+#define AT91C_BASE_PDC_SSC        (0xFFFD4100) // (PDC_SSC) Base Address
+#define AT91C_BASE_SSC            (0xFFFD4000) // (SSC) Base Address
+#define AT91C_BASE_PDC_US1        (0xFFFC4100) // (PDC_US1) Base Address
+#define AT91C_BASE_US1            (0xFFFC4000) // (US1) Base Address
+#define AT91C_BASE_PDC_US0        (0xFFFC0100) // (PDC_US0) Base Address
+#define AT91C_BASE_US0            (0xFFFC0000) // (US0) Base Address
+#define AT91C_BASE_TWI            (0xFFFB8000) // (TWI) Base Address
+#define AT91C_BASE_TC2            (0xFFFA0080) // (TC2) Base Address
+#define AT91C_BASE_TC1            (0xFFFA0040) // (TC1) Base Address
+#define AT91C_BASE_TC0            (0xFFFA0000) // (TC0) Base Address
+#define AT91C_BASE_TCB            (0xFFFA0000) // (TCB) Base Address
+#define AT91C_BASE_PWMC_CH3       (0xFFFCC260) // (PWMC_CH3) Base Address
+#define AT91C_BASE_PWMC_CH2       (0xFFFCC240) // (PWMC_CH2) Base Address
+#define AT91C_BASE_PWMC_CH1       (0xFFFCC220) // (PWMC_CH1) Base Address
+#define AT91C_BASE_PWMC_CH0       (0xFFFCC200) // (PWMC_CH0) Base Address
+#define AT91C_BASE_PWMC           (0xFFFCC000) // (PWMC) Base Address
+#define AT91C_BASE_UDP            (0xFFFB0000) // (UDP) Base Address
+
+// *****************************************************************************
+//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7S64
+// *****************************************************************************
+#define AT91C_ISRAM               (0x00200000) // Internal SRAM base address
+#define AT91C_ISRAM_SIZE             (0x00004000) // Internal SRAM size in byte (16 Kbyte)
+#define AT91C_IFLASH                 (0x00100000) // Internal ROM base address
+#define AT91C_IFLASH_SIZE           (0x00010000) // Internal ROM size in byte (64 Kbyte)
diff --git a/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h b/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h
index ae4f35f..3ebad25 100644
--- a/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h
+++ b/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h
@@ -1,2715 +1,2715 @@
-//  ----------------------------------------------------------------------------

-//          ATMEL Microcontroller Software Support  -  ROUSSET  -

-//  ----------------------------------------------------------------------------

-//  DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR

-//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

-//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE

-//  DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,

-//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

-//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,

-//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

-//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

-//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,

-//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-//  ----------------------------------------------------------------------------

-// File Name           : AT91SAM7X128.h

-// Object              : AT91SAM7X128 definitions

-// Generated           : AT91 SW Application Group  05/20/2005 (16:22:23)

-// 

-// CVS Reference       : /AT91SAM7X128.pl/1.14/Tue May 10 12:12:05 2005//

-// CVS Reference       : /SYS_SAM7X.pl/1.3/Tue Feb  1 17:01:43 2005//

-// CVS Reference       : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005//

-// CVS Reference       : /PMC_SAM7X.pl/1.4/Tue Feb  8 13:58:10 2005//

-// CVS Reference       : /RSTC_SAM7X.pl/1.1/Tue Feb  1 16:16:26 2005//

-// CVS Reference       : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005//

-// CVS Reference       : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005//

-// CVS Reference       : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005//

-// CVS Reference       : /PIO_6057A.pl/1.2/Thu Feb  3 10:18:28 2005//

-// CVS Reference       : /RTTC_6081A.pl/1.2/Tue Nov  9 14:43:58 2004//

-// CVS Reference       : /PITC_6079A.pl/1.2/Tue Nov  9 14:43:56 2004//

-// CVS Reference       : /WDTC_6080A.pl/1.3/Tue Nov  9 14:44:00 2004//

-// CVS Reference       : /VREG_6085B.pl/1.1/Tue Feb  1 16:05:48 2005//

-// CVS Reference       : /PDC_6074C.pl/1.2/Thu Feb  3 08:48:54 2005//

-// CVS Reference       : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005//

-// CVS Reference       : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005//

-// CVS Reference       : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004//

-// CVS Reference       : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004//

-// CVS Reference       : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004//

-// CVS Reference       : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005//

-// CVS Reference       : /CAN_6019B.pl/1.1/Tue Mar  8 12:42:22 2005//

-// CVS Reference       : /EMACB_6119A.pl/1.5/Thu Feb  3 15:52:04 2005//

-// CVS Reference       : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003//

-// CVS Reference       : /AES_6149A.pl/1.10/Mon Feb  7 09:44:25 2005//

-// CVS Reference       : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005//

-//  ----------------------------------------------------------------------------

-

-#ifndef AT91SAM7X128_H

-#define AT91SAM7X128_H

-

-typedef volatile unsigned int AT91_REG;// Hardware register definition

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR System Peripherals

-// *****************************************************************************

-typedef struct _AT91S_SYS {

-	AT91_REG	 AIC_SMR[32]; 	// Source Mode Register

-	AT91_REG	 AIC_SVR[32]; 	// Source Vector Register

-	AT91_REG	 AIC_IVR; 	// IRQ Vector Register

-	AT91_REG	 AIC_FVR; 	// FIQ Vector Register

-	AT91_REG	 AIC_ISR; 	// Interrupt Status Register

-	AT91_REG	 AIC_IPR; 	// Interrupt Pending Register

-	AT91_REG	 AIC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 AIC_CISR; 	// Core Interrupt Status Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 AIC_IECR; 	// Interrupt Enable Command Register

-	AT91_REG	 AIC_IDCR; 	// Interrupt Disable Command Register

-	AT91_REG	 AIC_ICCR; 	// Interrupt Clear Command Register

-	AT91_REG	 AIC_ISCR; 	// Interrupt Set Command Register

-	AT91_REG	 AIC_EOICR; 	// End of Interrupt Command Register

-	AT91_REG	 AIC_SPU; 	// Spurious Vector Register

-	AT91_REG	 AIC_DCR; 	// Debug Control Register (Protect)

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 AIC_FFER; 	// Fast Forcing Enable Register

-	AT91_REG	 AIC_FFDR; 	// Fast Forcing Disable Register

-	AT91_REG	 AIC_FFSR; 	// Fast Forcing Status Register

-	AT91_REG	 Reserved2[45]; 	// 

-	AT91_REG	 DBGU_CR; 	// Control Register

-	AT91_REG	 DBGU_MR; 	// Mode Register

-	AT91_REG	 DBGU_IER; 	// Interrupt Enable Register

-	AT91_REG	 DBGU_IDR; 	// Interrupt Disable Register

-	AT91_REG	 DBGU_IMR; 	// Interrupt Mask Register

-	AT91_REG	 DBGU_CSR; 	// Channel Status Register

-	AT91_REG	 DBGU_RHR; 	// Receiver Holding Register

-	AT91_REG	 DBGU_THR; 	// Transmitter Holding Register

-	AT91_REG	 DBGU_BRGR; 	// Baud Rate Generator Register

-	AT91_REG	 Reserved3[7]; 	// 

-	AT91_REG	 DBGU_CIDR; 	// Chip ID Register

-	AT91_REG	 DBGU_EXID; 	// Chip ID Extension Register

-	AT91_REG	 DBGU_FNTR; 	// Force NTRST Register

-	AT91_REG	 Reserved4[45]; 	// 

-	AT91_REG	 DBGU_RPR; 	// Receive Pointer Register

-	AT91_REG	 DBGU_RCR; 	// Receive Counter Register

-	AT91_REG	 DBGU_TPR; 	// Transmit Pointer Register

-	AT91_REG	 DBGU_TCR; 	// Transmit Counter Register

-	AT91_REG	 DBGU_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 DBGU_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 DBGU_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 DBGU_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 DBGU_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 DBGU_PTSR; 	// PDC Transfer Status Register

-	AT91_REG	 Reserved5[54]; 	// 

-	AT91_REG	 PIOA_PER; 	// PIO Enable Register

-	AT91_REG	 PIOA_PDR; 	// PIO Disable Register

-	AT91_REG	 PIOA_PSR; 	// PIO Status Register

-	AT91_REG	 Reserved6[1]; 	// 

-	AT91_REG	 PIOA_OER; 	// Output Enable Register

-	AT91_REG	 PIOA_ODR; 	// Output Disable Registerr

-	AT91_REG	 PIOA_OSR; 	// Output Status Register

-	AT91_REG	 Reserved7[1]; 	// 

-	AT91_REG	 PIOA_IFER; 	// Input Filter Enable Register

-	AT91_REG	 PIOA_IFDR; 	// Input Filter Disable Register

-	AT91_REG	 PIOA_IFSR; 	// Input Filter Status Register

-	AT91_REG	 Reserved8[1]; 	// 

-	AT91_REG	 PIOA_SODR; 	// Set Output Data Register

-	AT91_REG	 PIOA_CODR; 	// Clear Output Data Register

-	AT91_REG	 PIOA_ODSR; 	// Output Data Status Register

-	AT91_REG	 PIOA_PDSR; 	// Pin Data Status Register

-	AT91_REG	 PIOA_IER; 	// Interrupt Enable Register

-	AT91_REG	 PIOA_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PIOA_IMR; 	// Interrupt Mask Register

-	AT91_REG	 PIOA_ISR; 	// Interrupt Status Register

-	AT91_REG	 PIOA_MDER; 	// Multi-driver Enable Register

-	AT91_REG	 PIOA_MDDR; 	// Multi-driver Disable Register

-	AT91_REG	 PIOA_MDSR; 	// Multi-driver Status Register

-	AT91_REG	 Reserved9[1]; 	// 

-	AT91_REG	 PIOA_PPUDR; 	// Pull-up Disable Register

-	AT91_REG	 PIOA_PPUER; 	// Pull-up Enable Register

-	AT91_REG	 PIOA_PPUSR; 	// Pull-up Status Register

-	AT91_REG	 Reserved10[1]; 	// 

-	AT91_REG	 PIOA_ASR; 	// Select A Register

-	AT91_REG	 PIOA_BSR; 	// Select B Register

-	AT91_REG	 PIOA_ABSR; 	// AB Select Status Register

-	AT91_REG	 Reserved11[9]; 	// 

-	AT91_REG	 PIOA_OWER; 	// Output Write Enable Register

-	AT91_REG	 PIOA_OWDR; 	// Output Write Disable Register

-	AT91_REG	 PIOA_OWSR; 	// Output Write Status Register

-	AT91_REG	 Reserved12[85]; 	// 

-	AT91_REG	 PIOB_PER; 	// PIO Enable Register

-	AT91_REG	 PIOB_PDR; 	// PIO Disable Register

-	AT91_REG	 PIOB_PSR; 	// PIO Status Register

-	AT91_REG	 Reserved13[1]; 	// 

-	AT91_REG	 PIOB_OER; 	// Output Enable Register

-	AT91_REG	 PIOB_ODR; 	// Output Disable Registerr

-	AT91_REG	 PIOB_OSR; 	// Output Status Register

-	AT91_REG	 Reserved14[1]; 	// 

-	AT91_REG	 PIOB_IFER; 	// Input Filter Enable Register

-	AT91_REG	 PIOB_IFDR; 	// Input Filter Disable Register

-	AT91_REG	 PIOB_IFSR; 	// Input Filter Status Register

-	AT91_REG	 Reserved15[1]; 	// 

-	AT91_REG	 PIOB_SODR; 	// Set Output Data Register

-	AT91_REG	 PIOB_CODR; 	// Clear Output Data Register

-	AT91_REG	 PIOB_ODSR; 	// Output Data Status Register

-	AT91_REG	 PIOB_PDSR; 	// Pin Data Status Register

-	AT91_REG	 PIOB_IER; 	// Interrupt Enable Register

-	AT91_REG	 PIOB_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PIOB_IMR; 	// Interrupt Mask Register

-	AT91_REG	 PIOB_ISR; 	// Interrupt Status Register

-	AT91_REG	 PIOB_MDER; 	// Multi-driver Enable Register

-	AT91_REG	 PIOB_MDDR; 	// Multi-driver Disable Register

-	AT91_REG	 PIOB_MDSR; 	// Multi-driver Status Register

-	AT91_REG	 Reserved16[1]; 	// 

-	AT91_REG	 PIOB_PPUDR; 	// Pull-up Disable Register

-	AT91_REG	 PIOB_PPUER; 	// Pull-up Enable Register

-	AT91_REG	 PIOB_PPUSR; 	// Pull-up Status Register

-	AT91_REG	 Reserved17[1]; 	// 

-	AT91_REG	 PIOB_ASR; 	// Select A Register

-	AT91_REG	 PIOB_BSR; 	// Select B Register

-	AT91_REG	 PIOB_ABSR; 	// AB Select Status Register

-	AT91_REG	 Reserved18[9]; 	// 

-	AT91_REG	 PIOB_OWER; 	// Output Write Enable Register

-	AT91_REG	 PIOB_OWDR; 	// Output Write Disable Register

-	AT91_REG	 PIOB_OWSR; 	// Output Write Status Register

-	AT91_REG	 Reserved19[341]; 	// 

-	AT91_REG	 PMC_SCER; 	// System Clock Enable Register

-	AT91_REG	 PMC_SCDR; 	// System Clock Disable Register

-	AT91_REG	 PMC_SCSR; 	// System Clock Status Register

-	AT91_REG	 Reserved20[1]; 	// 

-	AT91_REG	 PMC_PCER; 	// Peripheral Clock Enable Register

-	AT91_REG	 PMC_PCDR; 	// Peripheral Clock Disable Register

-	AT91_REG	 PMC_PCSR; 	// Peripheral Clock Status Register

-	AT91_REG	 Reserved21[1]; 	// 

-	AT91_REG	 PMC_MOR; 	// Main Oscillator Register

-	AT91_REG	 PMC_MCFR; 	// Main Clock  Frequency Register

-	AT91_REG	 Reserved22[1]; 	// 

-	AT91_REG	 PMC_PLLR; 	// PLL Register

-	AT91_REG	 PMC_MCKR; 	// Master Clock Register

-	AT91_REG	 Reserved23[3]; 	// 

-	AT91_REG	 PMC_PCKR[4]; 	// Programmable Clock Register

-	AT91_REG	 Reserved24[4]; 	// 

-	AT91_REG	 PMC_IER; 	// Interrupt Enable Register

-	AT91_REG	 PMC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PMC_SR; 	// Status Register

-	AT91_REG	 PMC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 Reserved25[36]; 	// 

-	AT91_REG	 RSTC_RCR; 	// Reset Control Register

-	AT91_REG	 RSTC_RSR; 	// Reset Status Register

-	AT91_REG	 RSTC_RMR; 	// Reset Mode Register

-	AT91_REG	 Reserved26[5]; 	// 

-	AT91_REG	 RTTC_RTMR; 	// Real-time Mode Register

-	AT91_REG	 RTTC_RTAR; 	// Real-time Alarm Register

-	AT91_REG	 RTTC_RTVR; 	// Real-time Value Register

-	AT91_REG	 RTTC_RTSR; 	// Real-time Status Register

-	AT91_REG	 PITC_PIMR; 	// Period Interval Mode Register

-	AT91_REG	 PITC_PISR; 	// Period Interval Status Register

-	AT91_REG	 PITC_PIVR; 	// Period Interval Value Register

-	AT91_REG	 PITC_PIIR; 	// Period Interval Image Register

-	AT91_REG	 WDTC_WDCR; 	// Watchdog Control Register

-	AT91_REG	 WDTC_WDMR; 	// Watchdog Mode Register

-	AT91_REG	 WDTC_WDSR; 	// Watchdog Status Register

-	AT91_REG	 Reserved27[5]; 	// 

-	AT91_REG	 VREG_MR; 	// Voltage Regulator Mode Register

-} AT91S_SYS, *AT91PS_SYS;

-

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller

-// *****************************************************************************

-typedef struct _AT91S_AIC {

-	AT91_REG	 AIC_SMR[32]; 	// Source Mode Register

-	AT91_REG	 AIC_SVR[32]; 	// Source Vector Register

-	AT91_REG	 AIC_IVR; 	// IRQ Vector Register

-	AT91_REG	 AIC_FVR; 	// FIQ Vector Register

-	AT91_REG	 AIC_ISR; 	// Interrupt Status Register

-	AT91_REG	 AIC_IPR; 	// Interrupt Pending Register

-	AT91_REG	 AIC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 AIC_CISR; 	// Core Interrupt Status Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 AIC_IECR; 	// Interrupt Enable Command Register

-	AT91_REG	 AIC_IDCR; 	// Interrupt Disable Command Register

-	AT91_REG	 AIC_ICCR; 	// Interrupt Clear Command Register

-	AT91_REG	 AIC_ISCR; 	// Interrupt Set Command Register

-	AT91_REG	 AIC_EOICR; 	// End of Interrupt Command Register

-	AT91_REG	 AIC_SPU; 	// Spurious Vector Register

-	AT91_REG	 AIC_DCR; 	// Debug Control Register (Protect)

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 AIC_FFER; 	// Fast Forcing Enable Register

-	AT91_REG	 AIC_FFDR; 	// Fast Forcing Disable Register

-	AT91_REG	 AIC_FFSR; 	// Fast Forcing Status Register

-} AT91S_AIC, *AT91PS_AIC;

-

-// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- 

-#define AT91C_AIC_PRIOR       ((unsigned int) 0x7 <<  0) // (AIC) Priority Level

-#define 	AT91C_AIC_PRIOR_LOWEST               ((unsigned int) 0x0) // (AIC) Lowest priority level

-#define 	AT91C_AIC_PRIOR_HIGHEST              ((unsigned int) 0x7) // (AIC) Highest priority level

-#define AT91C_AIC_SRCTYPE     ((unsigned int) 0x3 <<  5) // (AIC) Interrupt Source Type

-#define 	AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL       ((unsigned int) 0x0 <<  5) // (AIC) Internal Sources Code Label High-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL        ((unsigned int) 0x0 <<  5) // (AIC) External Sources Code Label Low-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE    ((unsigned int) 0x1 <<  5) // (AIC) Internal Sources Code Label Positive Edge triggered

-#define 	AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE    ((unsigned int) 0x1 <<  5) // (AIC) External Sources Code Label Negative Edge triggered

-#define 	AT91C_AIC_SRCTYPE_HIGH_LEVEL           ((unsigned int) 0x2 <<  5) // (AIC) Internal Or External Sources Code Label High-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_POSITIVE_EDGE        ((unsigned int) 0x3 <<  5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered

-// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- 

-#define AT91C_AIC_NFIQ        ((unsigned int) 0x1 <<  0) // (AIC) NFIQ Status

-#define AT91C_AIC_NIRQ        ((unsigned int) 0x1 <<  1) // (AIC) NIRQ Status

-// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- 

-#define AT91C_AIC_DCR_PROT    ((unsigned int) 0x1 <<  0) // (AIC) Protection Mode

-#define AT91C_AIC_DCR_GMSK    ((unsigned int) 0x1 <<  1) // (AIC) General Mask

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Peripheral DMA Controller

-// *****************************************************************************

-typedef struct _AT91S_PDC {

-	AT91_REG	 PDC_RPR; 	// Receive Pointer Register

-	AT91_REG	 PDC_RCR; 	// Receive Counter Register

-	AT91_REG	 PDC_TPR; 	// Transmit Pointer Register

-	AT91_REG	 PDC_TCR; 	// Transmit Counter Register

-	AT91_REG	 PDC_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 PDC_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 PDC_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 PDC_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 PDC_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 PDC_PTSR; 	// PDC Transfer Status Register

-} AT91S_PDC, *AT91PS_PDC;

-

-// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- 

-#define AT91C_PDC_RXTEN       ((unsigned int) 0x1 <<  0) // (PDC) Receiver Transfer Enable

-#define AT91C_PDC_RXTDIS      ((unsigned int) 0x1 <<  1) // (PDC) Receiver Transfer Disable

-#define AT91C_PDC_TXTEN       ((unsigned int) 0x1 <<  8) // (PDC) Transmitter Transfer Enable

-#define AT91C_PDC_TXTDIS      ((unsigned int) 0x1 <<  9) // (PDC) Transmitter Transfer Disable

-// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Debug Unit

-// *****************************************************************************

-typedef struct _AT91S_DBGU {

-	AT91_REG	 DBGU_CR; 	// Control Register

-	AT91_REG	 DBGU_MR; 	// Mode Register

-	AT91_REG	 DBGU_IER; 	// Interrupt Enable Register

-	AT91_REG	 DBGU_IDR; 	// Interrupt Disable Register

-	AT91_REG	 DBGU_IMR; 	// Interrupt Mask Register

-	AT91_REG	 DBGU_CSR; 	// Channel Status Register

-	AT91_REG	 DBGU_RHR; 	// Receiver Holding Register

-	AT91_REG	 DBGU_THR; 	// Transmitter Holding Register

-	AT91_REG	 DBGU_BRGR; 	// Baud Rate Generator Register

-	AT91_REG	 Reserved0[7]; 	// 

-	AT91_REG	 DBGU_CIDR; 	// Chip ID Register

-	AT91_REG	 DBGU_EXID; 	// Chip ID Extension Register

-	AT91_REG	 DBGU_FNTR; 	// Force NTRST Register

-	AT91_REG	 Reserved1[45]; 	// 

-	AT91_REG	 DBGU_RPR; 	// Receive Pointer Register

-	AT91_REG	 DBGU_RCR; 	// Receive Counter Register

-	AT91_REG	 DBGU_TPR; 	// Transmit Pointer Register

-	AT91_REG	 DBGU_TCR; 	// Transmit Counter Register

-	AT91_REG	 DBGU_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 DBGU_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 DBGU_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 DBGU_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 DBGU_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 DBGU_PTSR; 	// PDC Transfer Status Register

-} AT91S_DBGU, *AT91PS_DBGU;

-

-// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_RSTRX        ((unsigned int) 0x1 <<  2) // (DBGU) Reset Receiver

-#define AT91C_US_RSTTX        ((unsigned int) 0x1 <<  3) // (DBGU) Reset Transmitter

-#define AT91C_US_RXEN         ((unsigned int) 0x1 <<  4) // (DBGU) Receiver Enable

-#define AT91C_US_RXDIS        ((unsigned int) 0x1 <<  5) // (DBGU) Receiver Disable

-#define AT91C_US_TXEN         ((unsigned int) 0x1 <<  6) // (DBGU) Transmitter Enable

-#define AT91C_US_TXDIS        ((unsigned int) 0x1 <<  7) // (DBGU) Transmitter Disable

-#define AT91C_US_RSTSTA       ((unsigned int) 0x1 <<  8) // (DBGU) Reset Status Bits

-// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_PAR          ((unsigned int) 0x7 <<  9) // (DBGU) Parity type

-#define 	AT91C_US_PAR_EVEN                 ((unsigned int) 0x0 <<  9) // (DBGU) Even Parity

-#define 	AT91C_US_PAR_ODD                  ((unsigned int) 0x1 <<  9) // (DBGU) Odd Parity

-#define 	AT91C_US_PAR_SPACE                ((unsigned int) 0x2 <<  9) // (DBGU) Parity forced to 0 (Space)

-#define 	AT91C_US_PAR_MARK                 ((unsigned int) 0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)

-#define 	AT91C_US_PAR_NONE                 ((unsigned int) 0x4 <<  9) // (DBGU) No Parity

-#define 	AT91C_US_PAR_MULTI_DROP           ((unsigned int) 0x6 <<  9) // (DBGU) Multi-drop mode

-#define AT91C_US_CHMODE       ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode

-#define 	AT91C_US_CHMODE_NORMAL               ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.

-#define 	AT91C_US_CHMODE_AUTO                 ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.

-#define 	AT91C_US_CHMODE_LOCAL                ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.

-#define 	AT91C_US_CHMODE_REMOTE               ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.

-// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXRDY        ((unsigned int) 0x1 <<  0) // (DBGU) RXRDY Interrupt

-#define AT91C_US_TXRDY        ((unsigned int) 0x1 <<  1) // (DBGU) TXRDY Interrupt

-#define AT91C_US_ENDRX        ((unsigned int) 0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt

-#define AT91C_US_ENDTX        ((unsigned int) 0x1 <<  4) // (DBGU) End of Transmit Interrupt

-#define AT91C_US_OVRE         ((unsigned int) 0x1 <<  5) // (DBGU) Overrun Interrupt

-#define AT91C_US_FRAME        ((unsigned int) 0x1 <<  6) // (DBGU) Framing Error Interrupt

-#define AT91C_US_PARE         ((unsigned int) 0x1 <<  7) // (DBGU) Parity Error Interrupt

-#define AT91C_US_TXEMPTY      ((unsigned int) 0x1 <<  9) // (DBGU) TXEMPTY Interrupt

-#define AT91C_US_TXBUFE       ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt

-#define AT91C_US_RXBUFF       ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt

-#define AT91C_US_COMM_TX      ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt

-#define AT91C_US_COMM_RX      ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt

-// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- 

-// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- 

-#define AT91C_US_FORCE_NTRST  ((unsigned int) 0x1 <<  0) // (DBGU) Force NTRST in JTAG

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler

-// *****************************************************************************

-typedef struct _AT91S_PIO {

-	AT91_REG	 PIO_PER; 	// PIO Enable Register

-	AT91_REG	 PIO_PDR; 	// PIO Disable Register

-	AT91_REG	 PIO_PSR; 	// PIO Status Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 PIO_OER; 	// Output Enable Register

-	AT91_REG	 PIO_ODR; 	// Output Disable Registerr

-	AT91_REG	 PIO_OSR; 	// Output Status Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 PIO_IFER; 	// Input Filter Enable Register

-	AT91_REG	 PIO_IFDR; 	// Input Filter Disable Register

-	AT91_REG	 PIO_IFSR; 	// Input Filter Status Register

-	AT91_REG	 Reserved2[1]; 	// 

-	AT91_REG	 PIO_SODR; 	// Set Output Data Register

-	AT91_REG	 PIO_CODR; 	// Clear Output Data Register

-	AT91_REG	 PIO_ODSR; 	// Output Data Status Register

-	AT91_REG	 PIO_PDSR; 	// Pin Data Status Register

-	AT91_REG	 PIO_IER; 	// Interrupt Enable Register

-	AT91_REG	 PIO_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PIO_IMR; 	// Interrupt Mask Register

-	AT91_REG	 PIO_ISR; 	// Interrupt Status Register

-	AT91_REG	 PIO_MDER; 	// Multi-driver Enable Register

-	AT91_REG	 PIO_MDDR; 	// Multi-driver Disable Register

-	AT91_REG	 PIO_MDSR; 	// Multi-driver Status Register

-	AT91_REG	 Reserved3[1]; 	// 

-	AT91_REG	 PIO_PPUDR; 	// Pull-up Disable Register

-	AT91_REG	 PIO_PPUER; 	// Pull-up Enable Register

-	AT91_REG	 PIO_PPUSR; 	// Pull-up Status Register

-	AT91_REG	 Reserved4[1]; 	// 

-	AT91_REG	 PIO_ASR; 	// Select A Register

-	AT91_REG	 PIO_BSR; 	// Select B Register

-	AT91_REG	 PIO_ABSR; 	// AB Select Status Register

-	AT91_REG	 Reserved5[9]; 	// 

-	AT91_REG	 PIO_OWER; 	// Output Write Enable Register

-	AT91_REG	 PIO_OWDR; 	// Output Write Disable Register

-	AT91_REG	 PIO_OWSR; 	// Output Write Status Register

-} AT91S_PIO, *AT91PS_PIO;

-

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Clock Generator Controler

-// *****************************************************************************

-typedef struct _AT91S_CKGR {

-	AT91_REG	 CKGR_MOR; 	// Main Oscillator Register

-	AT91_REG	 CKGR_MCFR; 	// Main Clock  Frequency Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 CKGR_PLLR; 	// PLL Register

-} AT91S_CKGR, *AT91PS_CKGR;

-

-// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- 

-#define AT91C_CKGR_MOSCEN     ((unsigned int) 0x1 <<  0) // (CKGR) Main Oscillator Enable

-#define AT91C_CKGR_OSCBYPASS  ((unsigned int) 0x1 <<  1) // (CKGR) Main Oscillator Bypass

-#define AT91C_CKGR_OSCOUNT    ((unsigned int) 0xFF <<  8) // (CKGR) Main Oscillator Start-up Time

-// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- 

-#define AT91C_CKGR_MAINF      ((unsigned int) 0xFFFF <<  0) // (CKGR) Main Clock Frequency

-#define AT91C_CKGR_MAINRDY    ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready

-// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- 

-#define AT91C_CKGR_DIV        ((unsigned int) 0xFF <<  0) // (CKGR) Divider Selected

-#define 	AT91C_CKGR_DIV_0                    ((unsigned int) 0x0) // (CKGR) Divider output is 0

-#define 	AT91C_CKGR_DIV_BYPASS               ((unsigned int) 0x1) // (CKGR) Divider is bypassed

-#define AT91C_CKGR_PLLCOUNT   ((unsigned int) 0x3F <<  8) // (CKGR) PLL Counter

-#define AT91C_CKGR_OUT        ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range

-#define 	AT91C_CKGR_OUT_0                    ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_1                    ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_2                    ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_3                    ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet

-#define AT91C_CKGR_MUL        ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier

-#define AT91C_CKGR_USBDIV     ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks

-#define 	AT91C_CKGR_USBDIV_0                    ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output

-#define 	AT91C_CKGR_USBDIV_1                    ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2

-#define 	AT91C_CKGR_USBDIV_2                    ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Power Management Controler

-// *****************************************************************************

-typedef struct _AT91S_PMC {

-	AT91_REG	 PMC_SCER; 	// System Clock Enable Register

-	AT91_REG	 PMC_SCDR; 	// System Clock Disable Register

-	AT91_REG	 PMC_SCSR; 	// System Clock Status Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 PMC_PCER; 	// Peripheral Clock Enable Register

-	AT91_REG	 PMC_PCDR; 	// Peripheral Clock Disable Register

-	AT91_REG	 PMC_PCSR; 	// Peripheral Clock Status Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 PMC_MOR; 	// Main Oscillator Register

-	AT91_REG	 PMC_MCFR; 	// Main Clock  Frequency Register

-	AT91_REG	 Reserved2[1]; 	// 

-	AT91_REG	 PMC_PLLR; 	// PLL Register

-	AT91_REG	 PMC_MCKR; 	// Master Clock Register

-	AT91_REG	 Reserved3[3]; 	// 

-	AT91_REG	 PMC_PCKR[4]; 	// Programmable Clock Register

-	AT91_REG	 Reserved4[4]; 	// 

-	AT91_REG	 PMC_IER; 	// Interrupt Enable Register

-	AT91_REG	 PMC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PMC_SR; 	// Status Register

-	AT91_REG	 PMC_IMR; 	// Interrupt Mask Register

-} AT91S_PMC, *AT91PS_PMC;

-

-// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- 

-#define AT91C_PMC_PCK         ((unsigned int) 0x1 <<  0) // (PMC) Processor Clock

-#define AT91C_PMC_UDP         ((unsigned int) 0x1 <<  7) // (PMC) USB Device Port Clock

-#define AT91C_PMC_PCK0        ((unsigned int) 0x1 <<  8) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK1        ((unsigned int) 0x1 <<  9) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK2        ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK3        ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output

-// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- 

-// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- 

-// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- 

-// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- 

-// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- 

-// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- 

-#define AT91C_PMC_CSS         ((unsigned int) 0x3 <<  0) // (PMC) Programmable Clock Selection

-#define 	AT91C_PMC_CSS_SLOW_CLK             ((unsigned int) 0x0) // (PMC) Slow Clock is selected

-#define 	AT91C_PMC_CSS_MAIN_CLK             ((unsigned int) 0x1) // (PMC) Main Clock is selected

-#define 	AT91C_PMC_CSS_PLL_CLK              ((unsigned int) 0x3) // (PMC) Clock from PLL is selected

-#define AT91C_PMC_PRES        ((unsigned int) 0x7 <<  2) // (PMC) Programmable Clock Prescaler

-#define 	AT91C_PMC_PRES_CLK                  ((unsigned int) 0x0 <<  2) // (PMC) Selected clock

-#define 	AT91C_PMC_PRES_CLK_2                ((unsigned int) 0x1 <<  2) // (PMC) Selected clock divided by 2

-#define 	AT91C_PMC_PRES_CLK_4                ((unsigned int) 0x2 <<  2) // (PMC) Selected clock divided by 4

-#define 	AT91C_PMC_PRES_CLK_8                ((unsigned int) 0x3 <<  2) // (PMC) Selected clock divided by 8

-#define 	AT91C_PMC_PRES_CLK_16               ((unsigned int) 0x4 <<  2) // (PMC) Selected clock divided by 16

-#define 	AT91C_PMC_PRES_CLK_32               ((unsigned int) 0x5 <<  2) // (PMC) Selected clock divided by 32

-#define 	AT91C_PMC_PRES_CLK_64               ((unsigned int) 0x6 <<  2) // (PMC) Selected clock divided by 64

-// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- 

-// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- 

-#define AT91C_PMC_MOSCS       ((unsigned int) 0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask

-#define AT91C_PMC_LOCK        ((unsigned int) 0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask

-#define AT91C_PMC_MCKRDY      ((unsigned int) 0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK0RDY     ((unsigned int) 0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK1RDY     ((unsigned int) 0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK2RDY     ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK3RDY     ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask

-// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- 

-// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- 

-// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Reset Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_RSTC {

-	AT91_REG	 RSTC_RCR; 	// Reset Control Register

-	AT91_REG	 RSTC_RSR; 	// Reset Status Register

-	AT91_REG	 RSTC_RMR; 	// Reset Mode Register

-} AT91S_RSTC, *AT91PS_RSTC;

-

-// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- 

-#define AT91C_RSTC_PROCRST    ((unsigned int) 0x1 <<  0) // (RSTC) Processor Reset

-#define AT91C_RSTC_PERRST     ((unsigned int) 0x1 <<  2) // (RSTC) Peripheral Reset

-#define AT91C_RSTC_EXTRST     ((unsigned int) 0x1 <<  3) // (RSTC) External Reset

-#define AT91C_RSTC_KEY        ((unsigned int) 0xFF << 24) // (RSTC) Password

-// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- 

-#define AT91C_RSTC_URSTS      ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Status

-#define AT91C_RSTC_BODSTS     ((unsigned int) 0x1 <<  1) // (RSTC) Brownout Detection Status

-#define AT91C_RSTC_RSTTYP     ((unsigned int) 0x7 <<  8) // (RSTC) Reset Type

-#define 	AT91C_RSTC_RSTTYP_POWERUP              ((unsigned int) 0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.

-#define 	AT91C_RSTC_RSTTYP_WAKEUP               ((unsigned int) 0x1 <<  8) // (RSTC) WakeUp Reset. VDDCORE rising.

-#define 	AT91C_RSTC_RSTTYP_WATCHDOG             ((unsigned int) 0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.

-#define 	AT91C_RSTC_RSTTYP_SOFTWARE             ((unsigned int) 0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.

-#define 	AT91C_RSTC_RSTTYP_USER                 ((unsigned int) 0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.

-#define 	AT91C_RSTC_RSTTYP_BROWNOUT             ((unsigned int) 0x5 <<  8) // (RSTC) Brownout Reset occured.

-#define AT91C_RSTC_NRSTL      ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level

-#define AT91C_RSTC_SRCMP      ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress.

-// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- 

-#define AT91C_RSTC_URSTEN     ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Enable

-#define AT91C_RSTC_URSTIEN    ((unsigned int) 0x1 <<  4) // (RSTC) User Reset Interrupt Enable

-#define AT91C_RSTC_ERSTL      ((unsigned int) 0xF <<  8) // (RSTC) User Reset Enable

-#define AT91C_RSTC_BODIEN     ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_RTTC {

-	AT91_REG	 RTTC_RTMR; 	// Real-time Mode Register

-	AT91_REG	 RTTC_RTAR; 	// Real-time Alarm Register

-	AT91_REG	 RTTC_RTVR; 	// Real-time Value Register

-	AT91_REG	 RTTC_RTSR; 	// Real-time Status Register

-} AT91S_RTTC, *AT91PS_RTTC;

-

-// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- 

-#define AT91C_RTTC_RTPRES     ((unsigned int) 0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value

-#define AT91C_RTTC_ALMIEN     ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable

-#define AT91C_RTTC_RTTINCIEN  ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable

-#define AT91C_RTTC_RTTRST     ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart

-// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- 

-#define AT91C_RTTC_ALMV       ((unsigned int) 0x0 <<  0) // (RTTC) Alarm Value

-// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- 

-#define AT91C_RTTC_CRTV       ((unsigned int) 0x0 <<  0) // (RTTC) Current Real-time Value

-// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- 

-#define AT91C_RTTC_ALMS       ((unsigned int) 0x1 <<  0) // (RTTC) Real-time Alarm Status

-#define AT91C_RTTC_RTTINC     ((unsigned int) 0x1 <<  1) // (RTTC) Real-time Timer Increment

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_PITC {

-	AT91_REG	 PITC_PIMR; 	// Period Interval Mode Register

-	AT91_REG	 PITC_PISR; 	// Period Interval Status Register

-	AT91_REG	 PITC_PIVR; 	// Period Interval Value Register

-	AT91_REG	 PITC_PIIR; 	// Period Interval Image Register

-} AT91S_PITC, *AT91PS_PITC;

-

-// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- 

-#define AT91C_PITC_PIV        ((unsigned int) 0xFFFFF <<  0) // (PITC) Periodic Interval Value

-#define AT91C_PITC_PITEN      ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled

-#define AT91C_PITC_PITIEN     ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable

-// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- 

-#define AT91C_PITC_PITS       ((unsigned int) 0x1 <<  0) // (PITC) Periodic Interval Timer Status

-// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- 

-#define AT91C_PITC_CPIV       ((unsigned int) 0xFFFFF <<  0) // (PITC) Current Periodic Interval Value

-#define AT91C_PITC_PICNT      ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter

-// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_WDTC {

-	AT91_REG	 WDTC_WDCR; 	// Watchdog Control Register

-	AT91_REG	 WDTC_WDMR; 	// Watchdog Mode Register

-	AT91_REG	 WDTC_WDSR; 	// Watchdog Status Register

-} AT91S_WDTC, *AT91PS_WDTC;

-

-// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- 

-#define AT91C_WDTC_WDRSTT     ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Restart

-#define AT91C_WDTC_KEY        ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password

-// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- 

-#define AT91C_WDTC_WDV        ((unsigned int) 0xFFF <<  0) // (WDTC) Watchdog Timer Restart

-#define AT91C_WDTC_WDFIEN     ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable

-#define AT91C_WDTC_WDRSTEN    ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable

-#define AT91C_WDTC_WDRPROC    ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart

-#define AT91C_WDTC_WDDIS      ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable

-#define AT91C_WDTC_WDD        ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value

-#define AT91C_WDTC_WDDBGHLT   ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt

-#define AT91C_WDTC_WDIDLEHLT  ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt

-// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- 

-#define AT91C_WDTC_WDUNF      ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Underflow

-#define AT91C_WDTC_WDERR      ((unsigned int) 0x1 <<  1) // (WDTC) Watchdog Error

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Voltage Regulator Mode Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_VREG {

-	AT91_REG	 VREG_MR; 	// Voltage Regulator Mode Register

-} AT91S_VREG, *AT91PS_VREG;

-

-// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- 

-#define AT91C_VREG_PSTDBY     ((unsigned int) 0x1 <<  0) // (VREG) Voltage Regulator Power Standby Mode

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Memory Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_MC {

-	AT91_REG	 MC_RCR; 	// MC Remap Control Register

-	AT91_REG	 MC_ASR; 	// MC Abort Status Register

-	AT91_REG	 MC_AASR; 	// MC Abort Address Status Register

-	AT91_REG	 Reserved0[21]; 	// 

-	AT91_REG	 MC_FMR; 	// MC Flash Mode Register

-	AT91_REG	 MC_FCR; 	// MC Flash Command Register

-	AT91_REG	 MC_FSR; 	// MC Flash Status Register

-} AT91S_MC, *AT91PS_MC;

-

-// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- 

-#define AT91C_MC_RCB          ((unsigned int) 0x1 <<  0) // (MC) Remap Command Bit

-// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- 

-#define AT91C_MC_UNDADD       ((unsigned int) 0x1 <<  0) // (MC) Undefined Addess Abort Status

-#define AT91C_MC_MISADD       ((unsigned int) 0x1 <<  1) // (MC) Misaligned Addess Abort Status

-#define AT91C_MC_ABTSZ        ((unsigned int) 0x3 <<  8) // (MC) Abort Size Status

-#define 	AT91C_MC_ABTSZ_BYTE                 ((unsigned int) 0x0 <<  8) // (MC) Byte

-#define 	AT91C_MC_ABTSZ_HWORD                ((unsigned int) 0x1 <<  8) // (MC) Half-word

-#define 	AT91C_MC_ABTSZ_WORD                 ((unsigned int) 0x2 <<  8) // (MC) Word

-#define AT91C_MC_ABTTYP       ((unsigned int) 0x3 << 10) // (MC) Abort Type Status

-#define 	AT91C_MC_ABTTYP_DATAR                ((unsigned int) 0x0 << 10) // (MC) Data Read

-#define 	AT91C_MC_ABTTYP_DATAW                ((unsigned int) 0x1 << 10) // (MC) Data Write

-#define 	AT91C_MC_ABTTYP_FETCH                ((unsigned int) 0x2 << 10) // (MC) Code Fetch

-#define AT91C_MC_MST0         ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source

-#define AT91C_MC_MST1         ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source

-#define AT91C_MC_SVMST0       ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source

-#define AT91C_MC_SVMST1       ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source

-// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- 

-#define AT91C_MC_FRDY         ((unsigned int) 0x1 <<  0) // (MC) Flash Ready

-#define AT91C_MC_LOCKE        ((unsigned int) 0x1 <<  2) // (MC) Lock Error

-#define AT91C_MC_PROGE        ((unsigned int) 0x1 <<  3) // (MC) Programming Error

-#define AT91C_MC_NEBP         ((unsigned int) 0x1 <<  7) // (MC) No Erase Before Programming

-#define AT91C_MC_FWS          ((unsigned int) 0x3 <<  8) // (MC) Flash Wait State

-#define 	AT91C_MC_FWS_0FWS                 ((unsigned int) 0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations

-#define 	AT91C_MC_FWS_1FWS                 ((unsigned int) 0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations

-#define 	AT91C_MC_FWS_2FWS                 ((unsigned int) 0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations

-#define 	AT91C_MC_FWS_3FWS                 ((unsigned int) 0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations

-#define AT91C_MC_FMCN         ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number

-// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- 

-#define AT91C_MC_FCMD         ((unsigned int) 0xF <<  0) // (MC) Flash Command

-#define 	AT91C_MC_FCMD_START_PROG           ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN.

-#define 	AT91C_MC_FCMD_LOCK                 ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_PROG_AND_LOCK        ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.

-#define 	AT91C_MC_FCMD_UNLOCK               ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_ERASE_ALL            ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.

-#define 	AT91C_MC_FCMD_SET_GP_NVM           ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_CLR_GP_NVM           ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_SET_SECURITY         ((unsigned int) 0xF) // (MC) Set Security Bit.

-#define AT91C_MC_PAGEN        ((unsigned int) 0x3FF <<  8) // (MC) Page Number

-#define AT91C_MC_KEY          ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key

-// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- 

-#define AT91C_MC_SECURITY     ((unsigned int) 0x1 <<  4) // (MC) Security Bit Status

-#define AT91C_MC_GPNVM0       ((unsigned int) 0x1 <<  8) // (MC) Sector 0 Lock Status

-#define AT91C_MC_GPNVM1       ((unsigned int) 0x1 <<  9) // (MC) Sector 1 Lock Status

-#define AT91C_MC_GPNVM2       ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status

-#define AT91C_MC_GPNVM3       ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status

-#define AT91C_MC_GPNVM4       ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status

-#define AT91C_MC_GPNVM5       ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status

-#define AT91C_MC_GPNVM6       ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status

-#define AT91C_MC_GPNVM7       ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS0       ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status

-#define AT91C_MC_LOCKS1       ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status

-#define AT91C_MC_LOCKS2       ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status

-#define AT91C_MC_LOCKS3       ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status

-#define AT91C_MC_LOCKS4       ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status

-#define AT91C_MC_LOCKS5       ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status

-#define AT91C_MC_LOCKS6       ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status

-#define AT91C_MC_LOCKS7       ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS8       ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status

-#define AT91C_MC_LOCKS9       ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status

-#define AT91C_MC_LOCKS10      ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status

-#define AT91C_MC_LOCKS11      ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status

-#define AT91C_MC_LOCKS12      ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status

-#define AT91C_MC_LOCKS13      ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status

-#define AT91C_MC_LOCKS14      ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status

-#define AT91C_MC_LOCKS15      ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface

-// *****************************************************************************

-typedef struct _AT91S_SPI {

-	AT91_REG	 SPI_CR; 	// Control Register

-	AT91_REG	 SPI_MR; 	// Mode Register

-	AT91_REG	 SPI_RDR; 	// Receive Data Register

-	AT91_REG	 SPI_TDR; 	// Transmit Data Register

-	AT91_REG	 SPI_SR; 	// Status Register

-	AT91_REG	 SPI_IER; 	// Interrupt Enable Register

-	AT91_REG	 SPI_IDR; 	// Interrupt Disable Register

-	AT91_REG	 SPI_IMR; 	// Interrupt Mask Register

-	AT91_REG	 Reserved0[4]; 	// 

-	AT91_REG	 SPI_CSR[4]; 	// Chip Select Register

-	AT91_REG	 Reserved1[48]; 	// 

-	AT91_REG	 SPI_RPR; 	// Receive Pointer Register

-	AT91_REG	 SPI_RCR; 	// Receive Counter Register

-	AT91_REG	 SPI_TPR; 	// Transmit Pointer Register

-	AT91_REG	 SPI_TCR; 	// Transmit Counter Register

-	AT91_REG	 SPI_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 SPI_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 SPI_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 SPI_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 SPI_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 SPI_PTSR; 	// PDC Transfer Status Register

-} AT91S_SPI, *AT91PS_SPI;

-

-// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- 

-#define AT91C_SPI_SPIEN       ((unsigned int) 0x1 <<  0) // (SPI) SPI Enable

-#define AT91C_SPI_SPIDIS      ((unsigned int) 0x1 <<  1) // (SPI) SPI Disable

-#define AT91C_SPI_SWRST       ((unsigned int) 0x1 <<  7) // (SPI) SPI Software reset

-#define AT91C_SPI_LASTXFER    ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer

-// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- 

-#define AT91C_SPI_MSTR        ((unsigned int) 0x1 <<  0) // (SPI) Master/Slave Mode

-#define AT91C_SPI_PS          ((unsigned int) 0x1 <<  1) // (SPI) Peripheral Select

-#define 	AT91C_SPI_PS_FIXED                ((unsigned int) 0x0 <<  1) // (SPI) Fixed Peripheral Select

-#define 	AT91C_SPI_PS_VARIABLE             ((unsigned int) 0x1 <<  1) // (SPI) Variable Peripheral Select

-#define AT91C_SPI_PCSDEC      ((unsigned int) 0x1 <<  2) // (SPI) Chip Select Decode

-#define AT91C_SPI_FDIV        ((unsigned int) 0x1 <<  3) // (SPI) Clock Selection

-#define AT91C_SPI_MODFDIS     ((unsigned int) 0x1 <<  4) // (SPI) Mode Fault Detection

-#define AT91C_SPI_LLB         ((unsigned int) 0x1 <<  7) // (SPI) Clock Selection

-#define AT91C_SPI_PCS         ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select

-#define AT91C_SPI_DLYBCS      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects

-// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- 

-#define AT91C_SPI_RD          ((unsigned int) 0xFFFF <<  0) // (SPI) Receive Data

-#define AT91C_SPI_RPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- 

-#define AT91C_SPI_TD          ((unsigned int) 0xFFFF <<  0) // (SPI) Transmit Data

-#define AT91C_SPI_TPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- 

-#define AT91C_SPI_RDRF        ((unsigned int) 0x1 <<  0) // (SPI) Receive Data Register Full

-#define AT91C_SPI_TDRE        ((unsigned int) 0x1 <<  1) // (SPI) Transmit Data Register Empty

-#define AT91C_SPI_MODF        ((unsigned int) 0x1 <<  2) // (SPI) Mode Fault Error

-#define AT91C_SPI_OVRES       ((unsigned int) 0x1 <<  3) // (SPI) Overrun Error Status

-#define AT91C_SPI_ENDRX       ((unsigned int) 0x1 <<  4) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_ENDTX       ((unsigned int) 0x1 <<  5) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_RXBUFF      ((unsigned int) 0x1 <<  6) // (SPI) RXBUFF Interrupt

-#define AT91C_SPI_TXBUFE      ((unsigned int) 0x1 <<  7) // (SPI) TXBUFE Interrupt

-#define AT91C_SPI_NSSR        ((unsigned int) 0x1 <<  8) // (SPI) NSSR Interrupt

-#define AT91C_SPI_TXEMPTY     ((unsigned int) 0x1 <<  9) // (SPI) TXEMPTY Interrupt

-#define AT91C_SPI_SPIENS      ((unsigned int) 0x1 << 16) // (SPI) Enable Status

-// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- 

-// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- 

-// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- 

-// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- 

-#define AT91C_SPI_CPOL        ((unsigned int) 0x1 <<  0) // (SPI) Clock Polarity

-#define AT91C_SPI_NCPHA       ((unsigned int) 0x1 <<  1) // (SPI) Clock Phase

-#define AT91C_SPI_CSAAT       ((unsigned int) 0x1 <<  3) // (SPI) Chip Select Active After Transfer

-#define AT91C_SPI_BITS        ((unsigned int) 0xF <<  4) // (SPI) Bits Per Transfer

-#define 	AT91C_SPI_BITS_8                    ((unsigned int) 0x0 <<  4) // (SPI) 8 Bits Per transfer

-#define 	AT91C_SPI_BITS_9                    ((unsigned int) 0x1 <<  4) // (SPI) 9 Bits Per transfer

-#define 	AT91C_SPI_BITS_10                   ((unsigned int) 0x2 <<  4) // (SPI) 10 Bits Per transfer

-#define 	AT91C_SPI_BITS_11                   ((unsigned int) 0x3 <<  4) // (SPI) 11 Bits Per transfer

-#define 	AT91C_SPI_BITS_12                   ((unsigned int) 0x4 <<  4) // (SPI) 12 Bits Per transfer

-#define 	AT91C_SPI_BITS_13                   ((unsigned int) 0x5 <<  4) // (SPI) 13 Bits Per transfer

-#define 	AT91C_SPI_BITS_14                   ((unsigned int) 0x6 <<  4) // (SPI) 14 Bits Per transfer

-#define 	AT91C_SPI_BITS_15                   ((unsigned int) 0x7 <<  4) // (SPI) 15 Bits Per transfer

-#define 	AT91C_SPI_BITS_16                   ((unsigned int) 0x8 <<  4) // (SPI) 16 Bits Per transfer

-#define AT91C_SPI_SCBR        ((unsigned int) 0xFF <<  8) // (SPI) Serial Clock Baud Rate

-#define AT91C_SPI_DLYBS       ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK

-#define AT91C_SPI_DLYBCT      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Usart

-// *****************************************************************************

-typedef struct _AT91S_USART {

-	AT91_REG	 US_CR; 	// Control Register

-	AT91_REG	 US_MR; 	// Mode Register

-	AT91_REG	 US_IER; 	// Interrupt Enable Register

-	AT91_REG	 US_IDR; 	// Interrupt Disable Register

-	AT91_REG	 US_IMR; 	// Interrupt Mask Register

-	AT91_REG	 US_CSR; 	// Channel Status Register

-	AT91_REG	 US_RHR; 	// Receiver Holding Register

-	AT91_REG	 US_THR; 	// Transmitter Holding Register

-	AT91_REG	 US_BRGR; 	// Baud Rate Generator Register

-	AT91_REG	 US_RTOR; 	// Receiver Time-out Register

-	AT91_REG	 US_TTGR; 	// Transmitter Time-guard Register

-	AT91_REG	 Reserved0[5]; 	// 

-	AT91_REG	 US_FIDI; 	// FI_DI_Ratio Register

-	AT91_REG	 US_NER; 	// Nb Errors Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 US_IF; 	// IRDA_FILTER Register

-	AT91_REG	 Reserved2[44]; 	// 

-	AT91_REG	 US_RPR; 	// Receive Pointer Register

-	AT91_REG	 US_RCR; 	// Receive Counter Register

-	AT91_REG	 US_TPR; 	// Transmit Pointer Register

-	AT91_REG	 US_TCR; 	// Transmit Counter Register

-	AT91_REG	 US_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 US_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 US_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 US_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 US_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 US_PTSR; 	// PDC Transfer Status Register

-} AT91S_USART, *AT91PS_USART;

-

-// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_STTBRK       ((unsigned int) 0x1 <<  9) // (USART) Start Break

-#define AT91C_US_STPBRK       ((unsigned int) 0x1 << 10) // (USART) Stop Break

-#define AT91C_US_STTTO        ((unsigned int) 0x1 << 11) // (USART) Start Time-out

-#define AT91C_US_SENDA        ((unsigned int) 0x1 << 12) // (USART) Send Address

-#define AT91C_US_RSTIT        ((unsigned int) 0x1 << 13) // (USART) Reset Iterations

-#define AT91C_US_RSTNACK      ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge

-#define AT91C_US_RETTO        ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out

-#define AT91C_US_DTREN        ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable

-#define AT91C_US_DTRDIS       ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable

-#define AT91C_US_RTSEN        ((unsigned int) 0x1 << 18) // (USART) Request to Send enable

-#define AT91C_US_RTSDIS       ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable

-// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_USMODE       ((unsigned int) 0xF <<  0) // (USART) Usart mode

-#define 	AT91C_US_USMODE_NORMAL               ((unsigned int) 0x0) // (USART) Normal

-#define 	AT91C_US_USMODE_RS485                ((unsigned int) 0x1) // (USART) RS485

-#define 	AT91C_US_USMODE_HWHSH                ((unsigned int) 0x2) // (USART) Hardware Handshaking

-#define 	AT91C_US_USMODE_MODEM                ((unsigned int) 0x3) // (USART) Modem

-#define 	AT91C_US_USMODE_ISO7816_0            ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0

-#define 	AT91C_US_USMODE_ISO7816_1            ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1

-#define 	AT91C_US_USMODE_IRDA                 ((unsigned int) 0x8) // (USART) IrDA

-#define 	AT91C_US_USMODE_SWHSH                ((unsigned int) 0xC) // (USART) Software Handshaking

-#define AT91C_US_CLKS         ((unsigned int) 0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CLKS_CLOCK                ((unsigned int) 0x0 <<  4) // (USART) Clock

-#define 	AT91C_US_CLKS_FDIV1                ((unsigned int) 0x1 <<  4) // (USART) fdiv1

-#define 	AT91C_US_CLKS_SLOW                 ((unsigned int) 0x2 <<  4) // (USART) slow_clock (ARM)

-#define 	AT91C_US_CLKS_EXT                  ((unsigned int) 0x3 <<  4) // (USART) External (SCK)

-#define AT91C_US_CHRL         ((unsigned int) 0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CHRL_5_BITS               ((unsigned int) 0x0 <<  6) // (USART) Character Length: 5 bits

-#define 	AT91C_US_CHRL_6_BITS               ((unsigned int) 0x1 <<  6) // (USART) Character Length: 6 bits

-#define 	AT91C_US_CHRL_7_BITS               ((unsigned int) 0x2 <<  6) // (USART) Character Length: 7 bits

-#define 	AT91C_US_CHRL_8_BITS               ((unsigned int) 0x3 <<  6) // (USART) Character Length: 8 bits

-#define AT91C_US_SYNC         ((unsigned int) 0x1 <<  8) // (USART) Synchronous Mode Select

-#define AT91C_US_NBSTOP       ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits

-#define 	AT91C_US_NBSTOP_1_BIT                ((unsigned int) 0x0 << 12) // (USART) 1 stop bit

-#define 	AT91C_US_NBSTOP_15_BIT               ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits

-#define 	AT91C_US_NBSTOP_2_BIT                ((unsigned int) 0x2 << 12) // (USART) 2 stop bits

-#define AT91C_US_MSBF         ((unsigned int) 0x1 << 16) // (USART) Bit Order

-#define AT91C_US_MODE9        ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length

-#define AT91C_US_CKLO         ((unsigned int) 0x1 << 18) // (USART) Clock Output Select

-#define AT91C_US_OVER         ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode

-#define AT91C_US_INACK        ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge

-#define AT91C_US_DSNACK       ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK

-#define AT91C_US_MAX_ITER     ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions

-#define AT91C_US_FILTER       ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter

-// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXBRK        ((unsigned int) 0x1 <<  2) // (USART) Break Received/End of Break

-#define AT91C_US_TIMEOUT      ((unsigned int) 0x1 <<  8) // (USART) Receiver Time-out

-#define AT91C_US_ITERATION    ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached

-#define AT91C_US_NACK         ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge

-#define AT91C_US_RIIC         ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag

-#define AT91C_US_DSRIC        ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag

-#define AT91C_US_DCDIC        ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag

-#define AT91C_US_CTSIC        ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag

-// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- 

-#define AT91C_US_RI           ((unsigned int) 0x1 << 20) // (USART) Image of RI Input

-#define AT91C_US_DSR          ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input

-#define AT91C_US_DCD          ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input

-#define AT91C_US_CTS          ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_SSC {

-	AT91_REG	 SSC_CR; 	// Control Register

-	AT91_REG	 SSC_CMR; 	// Clock Mode Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 SSC_RCMR; 	// Receive Clock ModeRegister

-	AT91_REG	 SSC_RFMR; 	// Receive Frame Mode Register

-	AT91_REG	 SSC_TCMR; 	// Transmit Clock Mode Register

-	AT91_REG	 SSC_TFMR; 	// Transmit Frame Mode Register

-	AT91_REG	 SSC_RHR; 	// Receive Holding Register

-	AT91_REG	 SSC_THR; 	// Transmit Holding Register

-	AT91_REG	 Reserved1[2]; 	// 

-	AT91_REG	 SSC_RSHR; 	// Receive Sync Holding Register

-	AT91_REG	 SSC_TSHR; 	// Transmit Sync Holding Register

-	AT91_REG	 Reserved2[2]; 	// 

-	AT91_REG	 SSC_SR; 	// Status Register

-	AT91_REG	 SSC_IER; 	// Interrupt Enable Register

-	AT91_REG	 SSC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 SSC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 Reserved3[44]; 	// 

-	AT91_REG	 SSC_RPR; 	// Receive Pointer Register

-	AT91_REG	 SSC_RCR; 	// Receive Counter Register

-	AT91_REG	 SSC_TPR; 	// Transmit Pointer Register

-	AT91_REG	 SSC_TCR; 	// Transmit Counter Register

-	AT91_REG	 SSC_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 SSC_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 SSC_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 SSC_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 SSC_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 SSC_PTSR; 	// PDC Transfer Status Register

-} AT91S_SSC, *AT91PS_SSC;

-

-// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- 

-#define AT91C_SSC_RXEN        ((unsigned int) 0x1 <<  0) // (SSC) Receive Enable

-#define AT91C_SSC_RXDIS       ((unsigned int) 0x1 <<  1) // (SSC) Receive Disable

-#define AT91C_SSC_TXEN        ((unsigned int) 0x1 <<  8) // (SSC) Transmit Enable

-#define AT91C_SSC_TXDIS       ((unsigned int) 0x1 <<  9) // (SSC) Transmit Disable

-#define AT91C_SSC_SWRST       ((unsigned int) 0x1 << 15) // (SSC) Software Reset

-// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- 

-#define AT91C_SSC_CKS         ((unsigned int) 0x3 <<  0) // (SSC) Receive/Transmit Clock Selection

-#define 	AT91C_SSC_CKS_DIV                  ((unsigned int) 0x0) // (SSC) Divided Clock

-#define 	AT91C_SSC_CKS_TK                   ((unsigned int) 0x1) // (SSC) TK Clock signal

-#define 	AT91C_SSC_CKS_RK                   ((unsigned int) 0x2) // (SSC) RK pin

-#define AT91C_SSC_CKO         ((unsigned int) 0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection

-#define 	AT91C_SSC_CKO_NONE                 ((unsigned int) 0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only

-#define 	AT91C_SSC_CKO_CONTINOUS            ((unsigned int) 0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output

-#define 	AT91C_SSC_CKO_DATA_TX              ((unsigned int) 0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output

-#define AT91C_SSC_CKI         ((unsigned int) 0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion

-#define AT91C_SSC_START       ((unsigned int) 0xF <<  8) // (SSC) Receive/Transmit Start Selection

-#define 	AT91C_SSC_START_CONTINOUS            ((unsigned int) 0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.

-#define 	AT91C_SSC_START_TX                   ((unsigned int) 0x1 <<  8) // (SSC) Transmit/Receive start

-#define 	AT91C_SSC_START_LOW_RF               ((unsigned int) 0x2 <<  8) // (SSC) Detection of a low level on RF input

-#define 	AT91C_SSC_START_HIGH_RF              ((unsigned int) 0x3 <<  8) // (SSC) Detection of a high level on RF input

-#define 	AT91C_SSC_START_FALL_RF              ((unsigned int) 0x4 <<  8) // (SSC) Detection of a falling edge on RF input

-#define 	AT91C_SSC_START_RISE_RF              ((unsigned int) 0x5 <<  8) // (SSC) Detection of a rising edge on RF input

-#define 	AT91C_SSC_START_LEVEL_RF             ((unsigned int) 0x6 <<  8) // (SSC) Detection of any level change on RF input

-#define 	AT91C_SSC_START_EDGE_RF              ((unsigned int) 0x7 <<  8) // (SSC) Detection of any edge on RF input

-#define 	AT91C_SSC_START_0                    ((unsigned int) 0x8 <<  8) // (SSC) Compare 0

-#define AT91C_SSC_STTDLY      ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay

-#define AT91C_SSC_PERIOD      ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection

-// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- 

-#define AT91C_SSC_DATLEN      ((unsigned int) 0x1F <<  0) // (SSC) Data Length

-#define AT91C_SSC_LOOP        ((unsigned int) 0x1 <<  5) // (SSC) Loop Mode

-#define AT91C_SSC_MSBF        ((unsigned int) 0x1 <<  7) // (SSC) Most Significant Bit First

-#define AT91C_SSC_DATNB       ((unsigned int) 0xF <<  8) // (SSC) Data Number per Frame

-#define AT91C_SSC_FSLEN       ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length

-#define AT91C_SSC_FSOS        ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection

-#define 	AT91C_SSC_FSOS_NONE                 ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only

-#define 	AT91C_SSC_FSOS_NEGATIVE             ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse

-#define 	AT91C_SSC_FSOS_POSITIVE             ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse

-#define 	AT91C_SSC_FSOS_LOW                  ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer

-#define 	AT91C_SSC_FSOS_HIGH                 ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer

-#define 	AT91C_SSC_FSOS_TOGGLE               ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer

-#define AT91C_SSC_FSEDGE      ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection

-// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- 

-// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- 

-#define AT91C_SSC_DATDEF      ((unsigned int) 0x1 <<  5) // (SSC) Data Default Value

-#define AT91C_SSC_FSDEN       ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable

-// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- 

-#define AT91C_SSC_TXRDY       ((unsigned int) 0x1 <<  0) // (SSC) Transmit Ready

-#define AT91C_SSC_TXEMPTY     ((unsigned int) 0x1 <<  1) // (SSC) Transmit Empty

-#define AT91C_SSC_ENDTX       ((unsigned int) 0x1 <<  2) // (SSC) End Of Transmission

-#define AT91C_SSC_TXBUFE      ((unsigned int) 0x1 <<  3) // (SSC) Transmit Buffer Empty

-#define AT91C_SSC_RXRDY       ((unsigned int) 0x1 <<  4) // (SSC) Receive Ready

-#define AT91C_SSC_OVRUN       ((unsigned int) 0x1 <<  5) // (SSC) Receive Overrun

-#define AT91C_SSC_ENDRX       ((unsigned int) 0x1 <<  6) // (SSC) End of Reception

-#define AT91C_SSC_RXBUFF      ((unsigned int) 0x1 <<  7) // (SSC) Receive Buffer Full

-#define AT91C_SSC_TXSYN       ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync

-#define AT91C_SSC_RXSYN       ((unsigned int) 0x1 << 11) // (SSC) Receive Sync

-#define AT91C_SSC_TXENA       ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable

-#define AT91C_SSC_RXENA       ((unsigned int) 0x1 << 17) // (SSC) Receive Enable

-// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- 

-// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- 

-// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Two-wire Interface

-// *****************************************************************************

-typedef struct _AT91S_TWI {

-	AT91_REG	 TWI_CR; 	// Control Register

-	AT91_REG	 TWI_MMR; 	// Master Mode Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 TWI_IADR; 	// Internal Address Register

-	AT91_REG	 TWI_CWGR; 	// Clock Waveform Generator Register

-	AT91_REG	 Reserved1[3]; 	// 

-	AT91_REG	 TWI_SR; 	// Status Register

-	AT91_REG	 TWI_IER; 	// Interrupt Enable Register

-	AT91_REG	 TWI_IDR; 	// Interrupt Disable Register

-	AT91_REG	 TWI_IMR; 	// Interrupt Mask Register

-	AT91_REG	 TWI_RHR; 	// Receive Holding Register

-	AT91_REG	 TWI_THR; 	// Transmit Holding Register

-} AT91S_TWI, *AT91PS_TWI;

-

-// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- 

-#define AT91C_TWI_START       ((unsigned int) 0x1 <<  0) // (TWI) Send a START Condition

-#define AT91C_TWI_STOP        ((unsigned int) 0x1 <<  1) // (TWI) Send a STOP Condition

-#define AT91C_TWI_MSEN        ((unsigned int) 0x1 <<  2) // (TWI) TWI Master Transfer Enabled

-#define AT91C_TWI_MSDIS       ((unsigned int) 0x1 <<  3) // (TWI) TWI Master Transfer Disabled

-#define AT91C_TWI_SWRST       ((unsigned int) 0x1 <<  7) // (TWI) Software Reset

-// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- 

-#define AT91C_TWI_IADRSZ      ((unsigned int) 0x3 <<  8) // (TWI) Internal Device Address Size

-#define 	AT91C_TWI_IADRSZ_NO                   ((unsigned int) 0x0 <<  8) // (TWI) No internal device address

-#define 	AT91C_TWI_IADRSZ_1_BYTE               ((unsigned int) 0x1 <<  8) // (TWI) One-byte internal device address

-#define 	AT91C_TWI_IADRSZ_2_BYTE               ((unsigned int) 0x2 <<  8) // (TWI) Two-byte internal device address

-#define 	AT91C_TWI_IADRSZ_3_BYTE               ((unsigned int) 0x3 <<  8) // (TWI) Three-byte internal device address

-#define AT91C_TWI_MREAD       ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction

-#define AT91C_TWI_DADR        ((unsigned int) 0x7F << 16) // (TWI) Device Address

-// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- 

-#define AT91C_TWI_CLDIV       ((unsigned int) 0xFF <<  0) // (TWI) Clock Low Divider

-#define AT91C_TWI_CHDIV       ((unsigned int) 0xFF <<  8) // (TWI) Clock High Divider

-#define AT91C_TWI_CKDIV       ((unsigned int) 0x7 << 16) // (TWI) Clock Divider

-// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- 

-#define AT91C_TWI_TXCOMP      ((unsigned int) 0x1 <<  0) // (TWI) Transmission Completed

-#define AT91C_TWI_RXRDY       ((unsigned int) 0x1 <<  1) // (TWI) Receive holding register ReaDY

-#define AT91C_TWI_TXRDY       ((unsigned int) 0x1 <<  2) // (TWI) Transmit holding register ReaDY

-#define AT91C_TWI_OVRE        ((unsigned int) 0x1 <<  6) // (TWI) Overrun Error

-#define AT91C_TWI_UNRE        ((unsigned int) 0x1 <<  7) // (TWI) Underrun Error

-#define AT91C_TWI_NACK        ((unsigned int) 0x1 <<  8) // (TWI) Not Acknowledged

-// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- 

-// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- 

-// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface

-// *****************************************************************************

-typedef struct _AT91S_PWMC_CH {

-	AT91_REG	 PWMC_CMR; 	// Channel Mode Register

-	AT91_REG	 PWMC_CDTYR; 	// Channel Duty Cycle Register

-	AT91_REG	 PWMC_CPRDR; 	// Channel Period Register

-	AT91_REG	 PWMC_CCNTR; 	// Channel Counter Register

-	AT91_REG	 PWMC_CUPDR; 	// Channel Update Register

-	AT91_REG	 PWMC_Reserved[3]; 	// Reserved

-} AT91S_PWMC_CH, *AT91PS_PWMC_CH;

-

-// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- 

-#define AT91C_PWMC_CPRE       ((unsigned int) 0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx

-#define 	AT91C_PWMC_CPRE_MCK                  ((unsigned int) 0x0) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKA                 ((unsigned int) 0xB) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKB                 ((unsigned int) 0xC) // (PWMC_CH) 

-#define AT91C_PWMC_CALG       ((unsigned int) 0x1 <<  8) // (PWMC_CH) Channel Alignment

-#define AT91C_PWMC_CPOL       ((unsigned int) 0x1 <<  9) // (PWMC_CH) Channel Polarity

-#define AT91C_PWMC_CPD        ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period

-// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- 

-#define AT91C_PWMC_CDTY       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Duty Cycle

-// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- 

-#define AT91C_PWMC_CPRD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Period

-// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- 

-#define AT91C_PWMC_CCNT       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Counter

-// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- 

-#define AT91C_PWMC_CUPD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Update

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_PWMC {

-	AT91_REG	 PWMC_MR; 	// PWMC Mode Register

-	AT91_REG	 PWMC_ENA; 	// PWMC Enable Register

-	AT91_REG	 PWMC_DIS; 	// PWMC Disable Register

-	AT91_REG	 PWMC_SR; 	// PWMC Status Register

-	AT91_REG	 PWMC_IER; 	// PWMC Interrupt Enable Register

-	AT91_REG	 PWMC_IDR; 	// PWMC Interrupt Disable Register

-	AT91_REG	 PWMC_IMR; 	// PWMC Interrupt Mask Register

-	AT91_REG	 PWMC_ISR; 	// PWMC Interrupt Status Register

-	AT91_REG	 Reserved0[55]; 	// 

-	AT91_REG	 PWMC_VR; 	// PWMC Version Register

-	AT91_REG	 Reserved1[64]; 	// 

-	AT91S_PWMC_CH	 PWMC_CH[4]; 	// PWMC Channel

-} AT91S_PWMC, *AT91PS_PWMC;

-

-// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- 

-#define AT91C_PWMC_DIVA       ((unsigned int) 0xFF <<  0) // (PWMC) CLKA divide factor.

-#define AT91C_PWMC_PREA       ((unsigned int) 0xF <<  8) // (PWMC) Divider Input Clock Prescaler A

-#define 	AT91C_PWMC_PREA_MCK                  ((unsigned int) 0x0 <<  8) // (PWMC) 

-#define AT91C_PWMC_DIVB       ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor.

-#define AT91C_PWMC_PREB       ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B

-#define 	AT91C_PWMC_PREB_MCK                  ((unsigned int) 0x0 << 24) // (PWMC) 

-// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- 

-#define AT91C_PWMC_CHID0      ((unsigned int) 0x1 <<  0) // (PWMC) Channel ID 0

-#define AT91C_PWMC_CHID1      ((unsigned int) 0x1 <<  1) // (PWMC) Channel ID 1

-#define AT91C_PWMC_CHID2      ((unsigned int) 0x1 <<  2) // (PWMC) Channel ID 2

-#define AT91C_PWMC_CHID3      ((unsigned int) 0x1 <<  3) // (PWMC) Channel ID 3

-// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- 

-// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- 

-// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- 

-// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- 

-// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- 

-// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR USB Device Interface

-// *****************************************************************************

-typedef struct _AT91S_UDP {

-	AT91_REG	 UDP_NUM; 	// Frame Number Register

-	AT91_REG	 UDP_GLBSTATE; 	// Global State Register

-	AT91_REG	 UDP_FADDR; 	// Function Address Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 UDP_IER; 	// Interrupt Enable Register

-	AT91_REG	 UDP_IDR; 	// Interrupt Disable Register

-	AT91_REG	 UDP_IMR; 	// Interrupt Mask Register

-	AT91_REG	 UDP_ISR; 	// Interrupt Status Register

-	AT91_REG	 UDP_ICR; 	// Interrupt Clear Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 UDP_RSTEP; 	// Reset Endpoint Register

-	AT91_REG	 Reserved2[1]; 	// 

-	AT91_REG	 UDP_CSR[6]; 	// Endpoint Control and Status Register

-	AT91_REG	 Reserved3[2]; 	// 

-	AT91_REG	 UDP_FDR[6]; 	// Endpoint FIFO Data Register

-	AT91_REG	 Reserved4[3]; 	// 

-	AT91_REG	 UDP_TXVC; 	// Transceiver Control Register

-} AT91S_UDP, *AT91PS_UDP;

-

-// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- 

-#define AT91C_UDP_FRM_NUM     ((unsigned int) 0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats

-#define AT91C_UDP_FRM_ERR     ((unsigned int) 0x1 << 16) // (UDP) Frame Error

-#define AT91C_UDP_FRM_OK      ((unsigned int) 0x1 << 17) // (UDP) Frame OK

-// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- 

-#define AT91C_UDP_FADDEN      ((unsigned int) 0x1 <<  0) // (UDP) Function Address Enable

-#define AT91C_UDP_CONFG       ((unsigned int) 0x1 <<  1) // (UDP) Configured

-#define AT91C_UDP_ESR         ((unsigned int) 0x1 <<  2) // (UDP) Enable Send Resume

-#define AT91C_UDP_RSMINPR     ((unsigned int) 0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host

-#define AT91C_UDP_RMWUPE      ((unsigned int) 0x1 <<  4) // (UDP) Remote Wake Up Enable

-// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- 

-#define AT91C_UDP_FADD        ((unsigned int) 0xFF <<  0) // (UDP) Function Address Value

-#define AT91C_UDP_FEN         ((unsigned int) 0x1 <<  8) // (UDP) Function Enable

-// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- 

-#define AT91C_UDP_EPINT0      ((unsigned int) 0x1 <<  0) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT1      ((unsigned int) 0x1 <<  1) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT2      ((unsigned int) 0x1 <<  2) // (UDP) Endpoint 2 Interrupt

-#define AT91C_UDP_EPINT3      ((unsigned int) 0x1 <<  3) // (UDP) Endpoint 3 Interrupt

-#define AT91C_UDP_EPINT4      ((unsigned int) 0x1 <<  4) // (UDP) Endpoint 4 Interrupt

-#define AT91C_UDP_EPINT5      ((unsigned int) 0x1 <<  5) // (UDP) Endpoint 5 Interrupt

-#define AT91C_UDP_RXSUSP      ((unsigned int) 0x1 <<  8) // (UDP) USB Suspend Interrupt

-#define AT91C_UDP_RXRSM       ((unsigned int) 0x1 <<  9) // (UDP) USB Resume Interrupt

-#define AT91C_UDP_EXTRSM      ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt

-#define AT91C_UDP_SOFINT      ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt

-#define AT91C_UDP_WAKEUP      ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt

-// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- 

-// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- 

-// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- 

-#define AT91C_UDP_ENDBUSRES   ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt

-// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- 

-// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- 

-#define AT91C_UDP_EP0         ((unsigned int) 0x1 <<  0) // (UDP) Reset Endpoint 0

-#define AT91C_UDP_EP1         ((unsigned int) 0x1 <<  1) // (UDP) Reset Endpoint 1

-#define AT91C_UDP_EP2         ((unsigned int) 0x1 <<  2) // (UDP) Reset Endpoint 2

-#define AT91C_UDP_EP3         ((unsigned int) 0x1 <<  3) // (UDP) Reset Endpoint 3

-#define AT91C_UDP_EP4         ((unsigned int) 0x1 <<  4) // (UDP) Reset Endpoint 4

-#define AT91C_UDP_EP5         ((unsigned int) 0x1 <<  5) // (UDP) Reset Endpoint 5

-// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- 

-#define AT91C_UDP_TXCOMP      ((unsigned int) 0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR

-#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 <<  1) // (UDP) Receive Data Bank 0

-#define AT91C_UDP_RXSETUP     ((unsigned int) 0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)

-#define AT91C_UDP_ISOERROR    ((unsigned int) 0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)

-#define AT91C_UDP_TXPKTRDY    ((unsigned int) 0x1 <<  4) // (UDP) Transmit Packet Ready

-#define AT91C_UDP_FORCESTALL  ((unsigned int) 0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).

-#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).

-#define AT91C_UDP_DIR         ((unsigned int) 0x1 <<  7) // (UDP) Transfer Direction

-#define AT91C_UDP_EPTYPE      ((unsigned int) 0x7 <<  8) // (UDP) Endpoint type

-#define 	AT91C_UDP_EPTYPE_CTRL                 ((unsigned int) 0x0 <<  8) // (UDP) Control

-#define 	AT91C_UDP_EPTYPE_ISO_OUT              ((unsigned int) 0x1 <<  8) // (UDP) Isochronous OUT

-#define 	AT91C_UDP_EPTYPE_BULK_OUT             ((unsigned int) 0x2 <<  8) // (UDP) Bulk OUT

-#define 	AT91C_UDP_EPTYPE_INT_OUT              ((unsigned int) 0x3 <<  8) // (UDP) Interrupt OUT

-#define 	AT91C_UDP_EPTYPE_ISO_IN               ((unsigned int) 0x5 <<  8) // (UDP) Isochronous IN

-#define 	AT91C_UDP_EPTYPE_BULK_IN              ((unsigned int) 0x6 <<  8) // (UDP) Bulk IN

-#define 	AT91C_UDP_EPTYPE_INT_IN               ((unsigned int) 0x7 <<  8) // (UDP) Interrupt IN

-#define AT91C_UDP_DTGLE       ((unsigned int) 0x1 << 11) // (UDP) Data Toggle

-#define AT91C_UDP_EPEDS       ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable

-#define AT91C_UDP_RXBYTECNT   ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO

-// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- 

-#define AT91C_UDP_TXVDIS      ((unsigned int) 0x1 <<  8) // (UDP) 

-#define AT91C_UDP_PUON        ((unsigned int) 0x1 <<  9) // (UDP) Pull-up ON

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface

-// *****************************************************************************

-typedef struct _AT91S_TC {

-	AT91_REG	 TC_CCR; 	// Channel Control Register

-	AT91_REG	 TC_CMR; 	// Channel Mode Register (Capture Mode / Waveform Mode)

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 TC_CV; 	// Counter Value

-	AT91_REG	 TC_RA; 	// Register A

-	AT91_REG	 TC_RB; 	// Register B

-	AT91_REG	 TC_RC; 	// Register C

-	AT91_REG	 TC_SR; 	// Status Register

-	AT91_REG	 TC_IER; 	// Interrupt Enable Register

-	AT91_REG	 TC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 TC_IMR; 	// Interrupt Mask Register

-} AT91S_TC, *AT91PS_TC;

-

-// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- 

-#define AT91C_TC_CLKEN        ((unsigned int) 0x1 <<  0) // (TC) Counter Clock Enable Command

-#define AT91C_TC_CLKDIS       ((unsigned int) 0x1 <<  1) // (TC) Counter Clock Disable Command

-#define AT91C_TC_SWTRG        ((unsigned int) 0x1 <<  2) // (TC) Software Trigger Command

-// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- 

-#define AT91C_TC_CLKS         ((unsigned int) 0x7 <<  0) // (TC) Clock Selection

-#define 	AT91C_TC_CLKS_TIMER_DIV1_CLOCK     ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV2_CLOCK     ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV3_CLOCK     ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV4_CLOCK     ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV5_CLOCK     ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK

-#define 	AT91C_TC_CLKS_XC0                  ((unsigned int) 0x5) // (TC) Clock selected: XC0

-#define 	AT91C_TC_CLKS_XC1                  ((unsigned int) 0x6) // (TC) Clock selected: XC1

-#define 	AT91C_TC_CLKS_XC2                  ((unsigned int) 0x7) // (TC) Clock selected: XC2

-#define AT91C_TC_CLKI         ((unsigned int) 0x1 <<  3) // (TC) Clock Invert

-#define AT91C_TC_BURST        ((unsigned int) 0x3 <<  4) // (TC) Burst Signal Selection

-#define 	AT91C_TC_BURST_NONE                 ((unsigned int) 0x0 <<  4) // (TC) The clock is not gated by an external signal

-#define 	AT91C_TC_BURST_XC0                  ((unsigned int) 0x1 <<  4) // (TC) XC0 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC1                  ((unsigned int) 0x2 <<  4) // (TC) XC1 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC2                  ((unsigned int) 0x3 <<  4) // (TC) XC2 is ANDed with the selected clock

-#define AT91C_TC_CPCSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare

-#define AT91C_TC_LDBSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading

-#define AT91C_TC_CPCDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disable with RC Compare

-#define AT91C_TC_LDBDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading

-#define AT91C_TC_ETRGEDG      ((unsigned int) 0x3 <<  8) // (TC) External Trigger Edge Selection

-#define 	AT91C_TC_ETRGEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_ETRGEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_ETRGEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_ETRGEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_EEVTEDG      ((unsigned int) 0x3 <<  8) // (TC) External Event Edge Selection

-#define 	AT91C_TC_EEVTEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_EEVTEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_EEVTEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_EEVTEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_EEVT         ((unsigned int) 0x3 << 10) // (TC) External Event  Selection

-#define 	AT91C_TC_EEVT_TIOB                 ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input

-#define 	AT91C_TC_EEVT_XC0                  ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output

-#define 	AT91C_TC_EEVT_XC1                  ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output

-#define 	AT91C_TC_EEVT_XC2                  ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output

-#define AT91C_TC_ABETRG       ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection

-#define AT91C_TC_ENETRG       ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable

-#define AT91C_TC_WAVESEL      ((unsigned int) 0x3 << 13) // (TC) Waveform  Selection

-#define 	AT91C_TC_WAVESEL_UP                   ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN               ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UP_AUTO              ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN_AUTO          ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare

-#define AT91C_TC_CPCTRG       ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable

-#define AT91C_TC_WAVE         ((unsigned int) 0x1 << 15) // (TC) 

-#define AT91C_TC_ACPA         ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA

-#define 	AT91C_TC_ACPA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Effect: none

-#define 	AT91C_TC_ACPA_SET                  ((unsigned int) 0x1 << 16) // (TC) Effect: set

-#define 	AT91C_TC_ACPA_CLEAR                ((unsigned int) 0x2 << 16) // (TC) Effect: clear

-#define 	AT91C_TC_ACPA_TOGGLE               ((unsigned int) 0x3 << 16) // (TC) Effect: toggle

-#define AT91C_TC_LDRA         ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection

-#define 	AT91C_TC_LDRA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Edge: None

-#define 	AT91C_TC_LDRA_RISING               ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRA_FALLING              ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRA_BOTH                 ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_ACPC         ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA

-#define 	AT91C_TC_ACPC_NONE                 ((unsigned int) 0x0 << 18) // (TC) Effect: none

-#define 	AT91C_TC_ACPC_SET                  ((unsigned int) 0x1 << 18) // (TC) Effect: set

-#define 	AT91C_TC_ACPC_CLEAR                ((unsigned int) 0x2 << 18) // (TC) Effect: clear

-#define 	AT91C_TC_ACPC_TOGGLE               ((unsigned int) 0x3 << 18) // (TC) Effect: toggle

-#define AT91C_TC_LDRB         ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection

-#define 	AT91C_TC_LDRB_NONE                 ((unsigned int) 0x0 << 18) // (TC) Edge: None

-#define 	AT91C_TC_LDRB_RISING               ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRB_FALLING              ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRB_BOTH                 ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_AEEVT        ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA

-#define 	AT91C_TC_AEEVT_NONE                 ((unsigned int) 0x0 << 20) // (TC) Effect: none

-#define 	AT91C_TC_AEEVT_SET                  ((unsigned int) 0x1 << 20) // (TC) Effect: set

-#define 	AT91C_TC_AEEVT_CLEAR                ((unsigned int) 0x2 << 20) // (TC) Effect: clear

-#define 	AT91C_TC_AEEVT_TOGGLE               ((unsigned int) 0x3 << 20) // (TC) Effect: toggle

-#define AT91C_TC_ASWTRG       ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA

-#define 	AT91C_TC_ASWTRG_NONE                 ((unsigned int) 0x0 << 22) // (TC) Effect: none

-#define 	AT91C_TC_ASWTRG_SET                  ((unsigned int) 0x1 << 22) // (TC) Effect: set

-#define 	AT91C_TC_ASWTRG_CLEAR                ((unsigned int) 0x2 << 22) // (TC) Effect: clear

-#define 	AT91C_TC_ASWTRG_TOGGLE               ((unsigned int) 0x3 << 22) // (TC) Effect: toggle

-#define AT91C_TC_BCPB         ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB

-#define 	AT91C_TC_BCPB_NONE                 ((unsigned int) 0x0 << 24) // (TC) Effect: none

-#define 	AT91C_TC_BCPB_SET                  ((unsigned int) 0x1 << 24) // (TC) Effect: set

-#define 	AT91C_TC_BCPB_CLEAR                ((unsigned int) 0x2 << 24) // (TC) Effect: clear

-#define 	AT91C_TC_BCPB_TOGGLE               ((unsigned int) 0x3 << 24) // (TC) Effect: toggle

-#define AT91C_TC_BCPC         ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB

-#define 	AT91C_TC_BCPC_NONE                 ((unsigned int) 0x0 << 26) // (TC) Effect: none

-#define 	AT91C_TC_BCPC_SET                  ((unsigned int) 0x1 << 26) // (TC) Effect: set

-#define 	AT91C_TC_BCPC_CLEAR                ((unsigned int) 0x2 << 26) // (TC) Effect: clear

-#define 	AT91C_TC_BCPC_TOGGLE               ((unsigned int) 0x3 << 26) // (TC) Effect: toggle

-#define AT91C_TC_BEEVT        ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB

-#define 	AT91C_TC_BEEVT_NONE                 ((unsigned int) 0x0 << 28) // (TC) Effect: none

-#define 	AT91C_TC_BEEVT_SET                  ((unsigned int) 0x1 << 28) // (TC) Effect: set

-#define 	AT91C_TC_BEEVT_CLEAR                ((unsigned int) 0x2 << 28) // (TC) Effect: clear

-#define 	AT91C_TC_BEEVT_TOGGLE               ((unsigned int) 0x3 << 28) // (TC) Effect: toggle

-#define AT91C_TC_BSWTRG       ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB

-#define 	AT91C_TC_BSWTRG_NONE                 ((unsigned int) 0x0 << 30) // (TC) Effect: none

-#define 	AT91C_TC_BSWTRG_SET                  ((unsigned int) 0x1 << 30) // (TC) Effect: set

-#define 	AT91C_TC_BSWTRG_CLEAR                ((unsigned int) 0x2 << 30) // (TC) Effect: clear

-#define 	AT91C_TC_BSWTRG_TOGGLE               ((unsigned int) 0x3 << 30) // (TC) Effect: toggle

-// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- 

-#define AT91C_TC_COVFS        ((unsigned int) 0x1 <<  0) // (TC) Counter Overflow

-#define AT91C_TC_LOVRS        ((unsigned int) 0x1 <<  1) // (TC) Load Overrun

-#define AT91C_TC_CPAS         ((unsigned int) 0x1 <<  2) // (TC) RA Compare

-#define AT91C_TC_CPBS         ((unsigned int) 0x1 <<  3) // (TC) RB Compare

-#define AT91C_TC_CPCS         ((unsigned int) 0x1 <<  4) // (TC) RC Compare

-#define AT91C_TC_LDRAS        ((unsigned int) 0x1 <<  5) // (TC) RA Loading

-#define AT91C_TC_LDRBS        ((unsigned int) 0x1 <<  6) // (TC) RB Loading

-#define AT91C_TC_ETRGS        ((unsigned int) 0x1 <<  7) // (TC) External Trigger

-#define AT91C_TC_CLKSTA       ((unsigned int) 0x1 << 16) // (TC) Clock Enabling

-#define AT91C_TC_MTIOA        ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror

-#define AT91C_TC_MTIOB        ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror

-// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- 

-// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- 

-// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Interface

-// *****************************************************************************

-typedef struct _AT91S_TCB {

-	AT91S_TC	 TCB_TC0; 	// TC Channel 0

-	AT91_REG	 Reserved0[4]; 	// 

-	AT91S_TC	 TCB_TC1; 	// TC Channel 1

-	AT91_REG	 Reserved1[4]; 	// 

-	AT91S_TC	 TCB_TC2; 	// TC Channel 2

-	AT91_REG	 Reserved2[4]; 	// 

-	AT91_REG	 TCB_BCR; 	// TC Block Control Register

-	AT91_REG	 TCB_BMR; 	// TC Block Mode Register

-} AT91S_TCB, *AT91PS_TCB;

-

-// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- 

-#define AT91C_TCB_SYNC        ((unsigned int) 0x1 <<  0) // (TCB) Synchro Command

-// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- 

-#define AT91C_TCB_TC0XC0S     ((unsigned int) 0x3 <<  0) // (TCB) External Clock Signal 0 Selection

-#define 	AT91C_TCB_TC0XC0S_TCLK0                ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_NONE                 ((unsigned int) 0x1) // (TCB) None signal connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA1                ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA2                ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0

-#define AT91C_TCB_TC1XC1S     ((unsigned int) 0x3 <<  2) // (TCB) External Clock Signal 1 Selection

-#define 	AT91C_TCB_TC1XC1S_TCLK1                ((unsigned int) 0x0 <<  2) // (TCB) TCLK1 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_NONE                 ((unsigned int) 0x1 <<  2) // (TCB) None signal connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA0                ((unsigned int) 0x2 <<  2) // (TCB) TIOA0 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA2                ((unsigned int) 0x3 <<  2) // (TCB) TIOA2 connected to XC1

-#define AT91C_TCB_TC2XC2S     ((unsigned int) 0x3 <<  4) // (TCB) External Clock Signal 2 Selection

-#define 	AT91C_TCB_TC2XC2S_TCLK2                ((unsigned int) 0x0 <<  4) // (TCB) TCLK2 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_NONE                 ((unsigned int) 0x1 <<  4) // (TCB) None signal connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA0                ((unsigned int) 0x2 <<  4) // (TCB) TIOA0 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA1                ((unsigned int) 0x3 <<  4) // (TCB) TIOA2 connected to XC2

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Control Area Network MailBox Interface

-// *****************************************************************************

-typedef struct _AT91S_CAN_MB {

-	AT91_REG	 CAN_MB_MMR; 	// MailBox Mode Register

-	AT91_REG	 CAN_MB_MAM; 	// MailBox Acceptance Mask Register

-	AT91_REG	 CAN_MB_MID; 	// MailBox ID Register

-	AT91_REG	 CAN_MB_MFID; 	// MailBox Family ID Register

-	AT91_REG	 CAN_MB_MSR; 	// MailBox Status Register

-	AT91_REG	 CAN_MB_MDL; 	// MailBox Data Low Register

-	AT91_REG	 CAN_MB_MDH; 	// MailBox Data High Register

-	AT91_REG	 CAN_MB_MCR; 	// MailBox Control Register

-} AT91S_CAN_MB, *AT91PS_CAN_MB;

-

-// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- 

-#define AT91C_CAN_MTIMEMARK   ((unsigned int) 0xFFFF <<  0) // (CAN_MB) Mailbox Timemark

-#define AT91C_CAN_PRIOR       ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority

-#define AT91C_CAN_MOT         ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type

-#define 	AT91C_CAN_MOT_DIS                  ((unsigned int) 0x0 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_RX                   ((unsigned int) 0x1 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_RXOVERWRITE          ((unsigned int) 0x2 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_TX                   ((unsigned int) 0x3 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_CONSUMER             ((unsigned int) 0x4 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_PRODUCER             ((unsigned int) 0x5 << 24) // (CAN_MB) 

-// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- 

-#define AT91C_CAN_MIDvB       ((unsigned int) 0x3FFFF <<  0) // (CAN_MB) Complementary bits for identifier in extended mode

-#define AT91C_CAN_MIDvA       ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode

-#define AT91C_CAN_MIDE        ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version

-// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- 

-// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- 

-// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- 

-#define AT91C_CAN_MTIMESTAMP  ((unsigned int) 0xFFFF <<  0) // (CAN_MB) Timer Value

-#define AT91C_CAN_MDLC        ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code

-#define AT91C_CAN_MRTR        ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request

-#define AT91C_CAN_MABT        ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort

-#define AT91C_CAN_MRDY        ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready

-#define AT91C_CAN_MMI         ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored

-// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- 

-// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- 

-// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- 

-#define AT91C_CAN_MACR        ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox

-#define AT91C_CAN_MTCR        ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Control Area Network Interface

-// *****************************************************************************

-typedef struct _AT91S_CAN {

-	AT91_REG	 CAN_MR; 	// Mode Register

-	AT91_REG	 CAN_IER; 	// Interrupt Enable Register

-	AT91_REG	 CAN_IDR; 	// Interrupt Disable Register

-	AT91_REG	 CAN_IMR; 	// Interrupt Mask Register

-	AT91_REG	 CAN_SR; 	// Status Register

-	AT91_REG	 CAN_BR; 	// Baudrate Register

-	AT91_REG	 CAN_TIM; 	// Timer Register

-	AT91_REG	 CAN_TIMESTP; 	// Time Stamp Register

-	AT91_REG	 CAN_ECR; 	// Error Counter Register

-	AT91_REG	 CAN_TCR; 	// Transfer Command Register

-	AT91_REG	 CAN_ACR; 	// Abort Command Register

-	AT91_REG	 Reserved0[52]; 	// 

-	AT91_REG	 CAN_VR; 	// Version Register

-	AT91_REG	 Reserved1[64]; 	// 

-	AT91S_CAN_MB	 CAN_MB0; 	// CAN Mailbox 0

-	AT91S_CAN_MB	 CAN_MB1; 	// CAN Mailbox 1

-	AT91S_CAN_MB	 CAN_MB2; 	// CAN Mailbox 2

-	AT91S_CAN_MB	 CAN_MB3; 	// CAN Mailbox 3

-	AT91S_CAN_MB	 CAN_MB4; 	// CAN Mailbox 4

-	AT91S_CAN_MB	 CAN_MB5; 	// CAN Mailbox 5

-	AT91S_CAN_MB	 CAN_MB6; 	// CAN Mailbox 6

-	AT91S_CAN_MB	 CAN_MB7; 	// CAN Mailbox 7

-	AT91S_CAN_MB	 CAN_MB8; 	// CAN Mailbox 8

-	AT91S_CAN_MB	 CAN_MB9; 	// CAN Mailbox 9

-	AT91S_CAN_MB	 CAN_MB10; 	// CAN Mailbox 10

-	AT91S_CAN_MB	 CAN_MB11; 	// CAN Mailbox 11

-	AT91S_CAN_MB	 CAN_MB12; 	// CAN Mailbox 12

-	AT91S_CAN_MB	 CAN_MB13; 	// CAN Mailbox 13

-	AT91S_CAN_MB	 CAN_MB14; 	// CAN Mailbox 14

-	AT91S_CAN_MB	 CAN_MB15; 	// CAN Mailbox 15

-} AT91S_CAN, *AT91PS_CAN;

-

-// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- 

-#define AT91C_CAN_CANEN       ((unsigned int) 0x1 <<  0) // (CAN) CAN Controller Enable

-#define AT91C_CAN_LPM         ((unsigned int) 0x1 <<  1) // (CAN) Disable/Enable Low Power Mode

-#define AT91C_CAN_ABM         ((unsigned int) 0x1 <<  2) // (CAN) Disable/Enable Autobaud/Listen Mode

-#define AT91C_CAN_OVL         ((unsigned int) 0x1 <<  3) // (CAN) Disable/Enable Overload Frame

-#define AT91C_CAN_TEOF        ((unsigned int) 0x1 <<  4) // (CAN) Time Stamp messages at each end of Frame

-#define AT91C_CAN_TTM         ((unsigned int) 0x1 <<  5) // (CAN) Disable/Enable Time Trigger Mode

-#define AT91C_CAN_TIMFRZ      ((unsigned int) 0x1 <<  6) // (CAN) Enable Timer Freeze

-#define AT91C_CAN_DRPT        ((unsigned int) 0x1 <<  7) // (CAN) Disable Repeat

-// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- 

-#define AT91C_CAN_MB0         ((unsigned int) 0x1 <<  0) // (CAN) Mailbox 0 Flag

-#define AT91C_CAN_MB1         ((unsigned int) 0x1 <<  1) // (CAN) Mailbox 1 Flag

-#define AT91C_CAN_MB2         ((unsigned int) 0x1 <<  2) // (CAN) Mailbox 2 Flag

-#define AT91C_CAN_MB3         ((unsigned int) 0x1 <<  3) // (CAN) Mailbox 3 Flag

-#define AT91C_CAN_MB4         ((unsigned int) 0x1 <<  4) // (CAN) Mailbox 4 Flag

-#define AT91C_CAN_MB5         ((unsigned int) 0x1 <<  5) // (CAN) Mailbox 5 Flag

-#define AT91C_CAN_MB6         ((unsigned int) 0x1 <<  6) // (CAN) Mailbox 6 Flag

-#define AT91C_CAN_MB7         ((unsigned int) 0x1 <<  7) // (CAN) Mailbox 7 Flag

-#define AT91C_CAN_MB8         ((unsigned int) 0x1 <<  8) // (CAN) Mailbox 8 Flag

-#define AT91C_CAN_MB9         ((unsigned int) 0x1 <<  9) // (CAN) Mailbox 9 Flag

-#define AT91C_CAN_MB10        ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag

-#define AT91C_CAN_MB11        ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag

-#define AT91C_CAN_MB12        ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag

-#define AT91C_CAN_MB13        ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag

-#define AT91C_CAN_MB14        ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag

-#define AT91C_CAN_MB15        ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag

-#define AT91C_CAN_ERRA        ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag

-#define AT91C_CAN_WARN        ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag

-#define AT91C_CAN_ERRP        ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag

-#define AT91C_CAN_BOFF        ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag

-#define AT91C_CAN_SLEEP       ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag

-#define AT91C_CAN_WAKEUP      ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag

-#define AT91C_CAN_TOVF        ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag

-#define AT91C_CAN_TSTP        ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag

-#define AT91C_CAN_CERR        ((unsigned int) 0x1 << 24) // (CAN) CRC Error

-#define AT91C_CAN_SERR        ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error

-#define AT91C_CAN_AERR        ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error

-#define AT91C_CAN_FERR        ((unsigned int) 0x1 << 27) // (CAN) Form Error

-#define AT91C_CAN_BERR        ((unsigned int) 0x1 << 28) // (CAN) Bit Error

-// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- 

-// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- 

-// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- 

-#define AT91C_CAN_RBSY        ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy

-#define AT91C_CAN_TBSY        ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy

-#define AT91C_CAN_OVLY        ((unsigned int) 0x1 << 31) // (CAN) Overload Busy

-// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- 

-#define AT91C_CAN_PHASE2      ((unsigned int) 0x7 <<  0) // (CAN) Phase 2 segment

-#define AT91C_CAN_PHASE1      ((unsigned int) 0x7 <<  4) // (CAN) Phase 1 segment

-#define AT91C_CAN_PROPAG      ((unsigned int) 0x7 <<  8) // (CAN) Programmation time segment

-#define AT91C_CAN_SYNC        ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment

-#define AT91C_CAN_BRP         ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler

-#define AT91C_CAN_SMP         ((unsigned int) 0x1 << 24) // (CAN) Sampling mode

-// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- 

-#define AT91C_CAN_TIMER       ((unsigned int) 0xFFFF <<  0) // (CAN) Timer field

-// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- 

-// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- 

-#define AT91C_CAN_REC         ((unsigned int) 0xFF <<  0) // (CAN) Receive Error Counter

-#define AT91C_CAN_TEC         ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter

-// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- 

-#define AT91C_CAN_TIMRST      ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field

-// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Ethernet MAC 10/100

-// *****************************************************************************

-typedef struct _AT91S_EMAC {

-	AT91_REG	 EMAC_NCR; 	// Network Control Register

-	AT91_REG	 EMAC_NCFGR; 	// Network Configuration Register

-	AT91_REG	 EMAC_NSR; 	// Network Status Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 EMAC_TSR; 	// Transmit Status Register

-	AT91_REG	 EMAC_RBQP; 	// Receive Buffer Queue Pointer

-	AT91_REG	 EMAC_TBQP; 	// Transmit Buffer Queue Pointer

-	AT91_REG	 EMAC_RSR; 	// Receive Status Register

-	AT91_REG	 EMAC_ISR; 	// Interrupt Status Register

-	AT91_REG	 EMAC_IER; 	// Interrupt Enable Register

-	AT91_REG	 EMAC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 EMAC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 EMAC_MAN; 	// PHY Maintenance Register

-	AT91_REG	 EMAC_PTR; 	// Pause Time Register

-	AT91_REG	 EMAC_PFR; 	// Pause Frames received Register

-	AT91_REG	 EMAC_FTO; 	// Frames Transmitted OK Register

-	AT91_REG	 EMAC_SCF; 	// Single Collision Frame Register

-	AT91_REG	 EMAC_MCF; 	// Multiple Collision Frame Register

-	AT91_REG	 EMAC_FRO; 	// Frames Received OK Register

-	AT91_REG	 EMAC_FCSE; 	// Frame Check Sequence Error Register

-	AT91_REG	 EMAC_ALE; 	// Alignment Error Register

-	AT91_REG	 EMAC_DTF; 	// Deferred Transmission Frame Register

-	AT91_REG	 EMAC_LCOL; 	// Late Collision Register

-	AT91_REG	 EMAC_ECOL; 	// Excessive Collision Register

-	AT91_REG	 EMAC_TUND; 	// Transmit Underrun Error Register

-	AT91_REG	 EMAC_CSE; 	// Carrier Sense Error Register

-	AT91_REG	 EMAC_RRE; 	// Receive Ressource Error Register

-	AT91_REG	 EMAC_ROV; 	// Receive Overrun Errors Register

-	AT91_REG	 EMAC_RSE; 	// Receive Symbol Errors Register

-	AT91_REG	 EMAC_ELE; 	// Excessive Length Errors Register

-	AT91_REG	 EMAC_RJA; 	// Receive Jabbers Register

-	AT91_REG	 EMAC_USF; 	// Undersize Frames Register

-	AT91_REG	 EMAC_STE; 	// SQE Test Error Register

-	AT91_REG	 EMAC_RLE; 	// Receive Length Field Mismatch Register

-	AT91_REG	 EMAC_TPF; 	// Transmitted Pause Frames Register

-	AT91_REG	 EMAC_HRB; 	// Hash Address Bottom[31:0]

-	AT91_REG	 EMAC_HRT; 	// Hash Address Top[63:32]

-	AT91_REG	 EMAC_SA1L; 	// Specific Address 1 Bottom, First 4 bytes

-	AT91_REG	 EMAC_SA1H; 	// Specific Address 1 Top, Last 2 bytes

-	AT91_REG	 EMAC_SA2L; 	// Specific Address 2 Bottom, First 4 bytes

-	AT91_REG	 EMAC_SA2H; 	// Specific Address 2 Top, Last 2 bytes

-	AT91_REG	 EMAC_SA3L; 	// Specific Address 3 Bottom, First 4 bytes

-	AT91_REG	 EMAC_SA3H; 	// Specific Address 3 Top, Last 2 bytes

-	AT91_REG	 EMAC_SA4L; 	// Specific Address 4 Bottom, First 4 bytes

-	AT91_REG	 EMAC_SA4H; 	// Specific Address 4 Top, Last 2 bytes

-	AT91_REG	 EMAC_TID; 	// Type ID Checking Register

-	AT91_REG	 EMAC_TPQ; 	// Transmit Pause Quantum Register

-	AT91_REG	 EMAC_USRIO; 	// USER Input/Output Register

-	AT91_REG	 EMAC_WOL; 	// Wake On LAN Register

-	AT91_REG	 Reserved1[13]; 	// 

-	AT91_REG	 EMAC_REV; 	// Revision Register

-} AT91S_EMAC, *AT91PS_EMAC;

-

-// -------- EMAC_NCR : (EMAC Offset: 0x0)  -------- 

-#define AT91C_EMAC_LB         ((unsigned int) 0x1 <<  0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level.

-#define AT91C_EMAC_LLB        ((unsigned int) 0x1 <<  1) // (EMAC) Loopback local. 

-#define AT91C_EMAC_RE         ((unsigned int) 0x1 <<  2) // (EMAC) Receive enable. 

-#define AT91C_EMAC_TE         ((unsigned int) 0x1 <<  3) // (EMAC) Transmit enable. 

-#define AT91C_EMAC_MPE        ((unsigned int) 0x1 <<  4) // (EMAC) Management port enable. 

-#define AT91C_EMAC_CLRSTAT    ((unsigned int) 0x1 <<  5) // (EMAC) Clear statistics registers. 

-#define AT91C_EMAC_INCSTAT    ((unsigned int) 0x1 <<  6) // (EMAC) Increment statistics registers. 

-#define AT91C_EMAC_WESTAT     ((unsigned int) 0x1 <<  7) // (EMAC) Write enable for statistics registers. 

-#define AT91C_EMAC_BP         ((unsigned int) 0x1 <<  8) // (EMAC) Back pressure. 

-#define AT91C_EMAC_TSTART     ((unsigned int) 0x1 <<  9) // (EMAC) Start Transmission. 

-#define AT91C_EMAC_THALT      ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt. 

-#define AT91C_EMAC_TPFR       ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame 

-#define AT91C_EMAC_TZQ        ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame

-// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- 

-#define AT91C_EMAC_SPD        ((unsigned int) 0x1 <<  0) // (EMAC) Speed. 

-#define AT91C_EMAC_FD         ((unsigned int) 0x1 <<  1) // (EMAC) Full duplex. 

-#define AT91C_EMAC_JFRAME     ((unsigned int) 0x1 <<  3) // (EMAC) Jumbo Frames. 

-#define AT91C_EMAC_CAF        ((unsigned int) 0x1 <<  4) // (EMAC) Copy all frames. 

-#define AT91C_EMAC_NBC        ((unsigned int) 0x1 <<  5) // (EMAC) No broadcast. 

-#define AT91C_EMAC_MTI        ((unsigned int) 0x1 <<  6) // (EMAC) Multicast hash event enable

-#define AT91C_EMAC_UNI        ((unsigned int) 0x1 <<  7) // (EMAC) Unicast hash enable. 

-#define AT91C_EMAC_BIG        ((unsigned int) 0x1 <<  8) // (EMAC) Receive 1522 bytes. 

-#define AT91C_EMAC_EAE        ((unsigned int) 0x1 <<  9) // (EMAC) External address match enable. 

-#define AT91C_EMAC_CLK        ((unsigned int) 0x3 << 10) // (EMAC) 

-#define 	AT91C_EMAC_CLK_HCLK_8               ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8

-#define 	AT91C_EMAC_CLK_HCLK_16              ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16

-#define 	AT91C_EMAC_CLK_HCLK_32              ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32

-#define 	AT91C_EMAC_CLK_HCLK_64              ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64

-#define AT91C_EMAC_RTY        ((unsigned int) 0x1 << 12) // (EMAC) 

-#define AT91C_EMAC_PAE        ((unsigned int) 0x1 << 13) // (EMAC) 

-#define AT91C_EMAC_RBOF       ((unsigned int) 0x3 << 14) // (EMAC) 

-#define 	AT91C_EMAC_RBOF_OFFSET_0             ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_1             ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_2             ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_3             ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer

-#define AT91C_EMAC_RLCE       ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable

-#define AT91C_EMAC_DRFCS      ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS

-#define AT91C_EMAC_EFRHD      ((unsigned int) 0x1 << 18) // (EMAC) 

-#define AT91C_EMAC_IRXFCS     ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS

-// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- 

-#define AT91C_EMAC_LINKR      ((unsigned int) 0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_MDIO       ((unsigned int) 0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_IDLE       ((unsigned int) 0x1 <<  2) // (EMAC) 

-// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- 

-#define AT91C_EMAC_UBR        ((unsigned int) 0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_COL        ((unsigned int) 0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_RLES       ((unsigned int) 0x1 <<  2) // (EMAC) 

-#define AT91C_EMAC_TGO        ((unsigned int) 0x1 <<  3) // (EMAC) Transmit Go

-#define AT91C_EMAC_BEX        ((unsigned int) 0x1 <<  4) // (EMAC) Buffers exhausted mid frame

-#define AT91C_EMAC_COMP       ((unsigned int) 0x1 <<  5) // (EMAC) 

-#define AT91C_EMAC_UND        ((unsigned int) 0x1 <<  6) // (EMAC) 

-// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- 

-#define AT91C_EMAC_BNA        ((unsigned int) 0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_REC        ((unsigned int) 0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_OVR        ((unsigned int) 0x1 <<  2) // (EMAC) 

-// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- 

-#define AT91C_EMAC_MFD        ((unsigned int) 0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_RCOMP      ((unsigned int) 0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_RXUBR      ((unsigned int) 0x1 <<  2) // (EMAC) 

-#define AT91C_EMAC_TXUBR      ((unsigned int) 0x1 <<  3) // (EMAC) 

-#define AT91C_EMAC_TUNDR      ((unsigned int) 0x1 <<  4) // (EMAC) 

-#define AT91C_EMAC_RLEX       ((unsigned int) 0x1 <<  5) // (EMAC) 

-#define AT91C_EMAC_TXERR      ((unsigned int) 0x1 <<  6) // (EMAC) 

-#define AT91C_EMAC_TCOMP      ((unsigned int) 0x1 <<  7) // (EMAC) 

-#define AT91C_EMAC_LINK       ((unsigned int) 0x1 <<  9) // (EMAC) 

-#define AT91C_EMAC_ROVR       ((unsigned int) 0x1 << 10) // (EMAC) 

-#define AT91C_EMAC_HRESP      ((unsigned int) 0x1 << 11) // (EMAC) 

-#define AT91C_EMAC_PFRE       ((unsigned int) 0x1 << 12) // (EMAC) 

-#define AT91C_EMAC_PTZ        ((unsigned int) 0x1 << 13) // (EMAC) 

-// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- 

-// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- 

-// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- 

-// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- 

-#define AT91C_EMAC_DATA       ((unsigned int) 0xFFFF <<  0) // (EMAC) 

-#define AT91C_EMAC_CODE       ((unsigned int) 0x3 << 16) // (EMAC) 

-#define AT91C_EMAC_REGA       ((unsigned int) 0x1F << 18) // (EMAC) 

-#define AT91C_EMAC_PHYA       ((unsigned int) 0x1F << 23) // (EMAC) 

-#define AT91C_EMAC_RW         ((unsigned int) 0x3 << 28) // (EMAC) 

-#define AT91C_EMAC_SOF        ((unsigned int) 0x3 << 30) // (EMAC) 

-// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- 

-#define AT91C_EMAC_RMII       ((unsigned int) 0x1 <<  0) // (EMAC) Reduce MII

-// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- 

-#define AT91C_EMAC_IP         ((unsigned int) 0xFFFF <<  0) // (EMAC) ARP request IP address

-#define AT91C_EMAC_MAG        ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable

-#define AT91C_EMAC_ARP        ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable

-#define AT91C_EMAC_SA1        ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable

-// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- 

-#define AT91C_EMAC_REVREF     ((unsigned int) 0xFFFF <<  0) // (EMAC) 

-#define AT91C_EMAC_PARTREF    ((unsigned int) 0xFFFF << 16) // (EMAC) 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor

-// *****************************************************************************

-typedef struct _AT91S_ADC {

-	AT91_REG	 ADC_CR; 	// ADC Control Register

-	AT91_REG	 ADC_MR; 	// ADC Mode Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 ADC_CHER; 	// ADC Channel Enable Register

-	AT91_REG	 ADC_CHDR; 	// ADC Channel Disable Register

-	AT91_REG	 ADC_CHSR; 	// ADC Channel Status Register

-	AT91_REG	 ADC_SR; 	// ADC Status Register

-	AT91_REG	 ADC_LCDR; 	// ADC Last Converted Data Register

-	AT91_REG	 ADC_IER; 	// ADC Interrupt Enable Register

-	AT91_REG	 ADC_IDR; 	// ADC Interrupt Disable Register

-	AT91_REG	 ADC_IMR; 	// ADC Interrupt Mask Register

-	AT91_REG	 ADC_CDR0; 	// ADC Channel Data Register 0

-	AT91_REG	 ADC_CDR1; 	// ADC Channel Data Register 1

-	AT91_REG	 ADC_CDR2; 	// ADC Channel Data Register 2

-	AT91_REG	 ADC_CDR3; 	// ADC Channel Data Register 3

-	AT91_REG	 ADC_CDR4; 	// ADC Channel Data Register 4

-	AT91_REG	 ADC_CDR5; 	// ADC Channel Data Register 5

-	AT91_REG	 ADC_CDR6; 	// ADC Channel Data Register 6

-	AT91_REG	 ADC_CDR7; 	// ADC Channel Data Register 7

-	AT91_REG	 Reserved1[44]; 	// 

-	AT91_REG	 ADC_RPR; 	// Receive Pointer Register

-	AT91_REG	 ADC_RCR; 	// Receive Counter Register

-	AT91_REG	 ADC_TPR; 	// Transmit Pointer Register

-	AT91_REG	 ADC_TCR; 	// Transmit Counter Register

-	AT91_REG	 ADC_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 ADC_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 ADC_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 ADC_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 ADC_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 ADC_PTSR; 	// PDC Transfer Status Register

-} AT91S_ADC, *AT91PS_ADC;

-

-// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- 

-#define AT91C_ADC_SWRST       ((unsigned int) 0x1 <<  0) // (ADC) Software Reset

-#define AT91C_ADC_START       ((unsigned int) 0x1 <<  1) // (ADC) Start Conversion

-// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- 

-#define AT91C_ADC_TRGEN       ((unsigned int) 0x1 <<  0) // (ADC) Trigger Enable

-#define 	AT91C_ADC_TRGEN_DIS                  ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software

-#define 	AT91C_ADC_TRGEN_EN                   ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.

-#define AT91C_ADC_TRGSEL      ((unsigned int) 0x7 <<  1) // (ADC) Trigger Selection

-#define 	AT91C_ADC_TRGSEL_TIOA0                ((unsigned int) 0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0

-#define 	AT91C_ADC_TRGSEL_TIOA1                ((unsigned int) 0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1

-#define 	AT91C_ADC_TRGSEL_TIOA2                ((unsigned int) 0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2

-#define 	AT91C_ADC_TRGSEL_TIOA3                ((unsigned int) 0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3

-#define 	AT91C_ADC_TRGSEL_TIOA4                ((unsigned int) 0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4

-#define 	AT91C_ADC_TRGSEL_TIOA5                ((unsigned int) 0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5

-#define 	AT91C_ADC_TRGSEL_EXT                  ((unsigned int) 0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger

-#define AT91C_ADC_LOWRES      ((unsigned int) 0x1 <<  4) // (ADC) Resolution.

-#define 	AT91C_ADC_LOWRES_10_BIT               ((unsigned int) 0x0 <<  4) // (ADC) 10-bit resolution

-#define 	AT91C_ADC_LOWRES_8_BIT                ((unsigned int) 0x1 <<  4) // (ADC) 8-bit resolution

-#define AT91C_ADC_SLEEP       ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode

-#define 	AT91C_ADC_SLEEP_NORMAL_MODE          ((unsigned int) 0x0 <<  5) // (ADC) Normal Mode

-#define 	AT91C_ADC_SLEEP_MODE                 ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode

-#define AT91C_ADC_PRESCAL     ((unsigned int) 0x3F <<  8) // (ADC) Prescaler rate selection

-#define AT91C_ADC_STARTUP     ((unsigned int) 0x1F << 16) // (ADC) Startup Time

-#define AT91C_ADC_SHTIM       ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time

-// -------- 	ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- 

-#define AT91C_ADC_CH0         ((unsigned int) 0x1 <<  0) // (ADC) Channel 0

-#define AT91C_ADC_CH1         ((unsigned int) 0x1 <<  1) // (ADC) Channel 1

-#define AT91C_ADC_CH2         ((unsigned int) 0x1 <<  2) // (ADC) Channel 2

-#define AT91C_ADC_CH3         ((unsigned int) 0x1 <<  3) // (ADC) Channel 3

-#define AT91C_ADC_CH4         ((unsigned int) 0x1 <<  4) // (ADC) Channel 4

-#define AT91C_ADC_CH5         ((unsigned int) 0x1 <<  5) // (ADC) Channel 5

-#define AT91C_ADC_CH6         ((unsigned int) 0x1 <<  6) // (ADC) Channel 6

-#define AT91C_ADC_CH7         ((unsigned int) 0x1 <<  7) // (ADC) Channel 7

-// -------- 	ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- 

-// -------- 	ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- 

-// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- 

-#define AT91C_ADC_EOC0        ((unsigned int) 0x1 <<  0) // (ADC) End of Conversion

-#define AT91C_ADC_EOC1        ((unsigned int) 0x1 <<  1) // (ADC) End of Conversion

-#define AT91C_ADC_EOC2        ((unsigned int) 0x1 <<  2) // (ADC) End of Conversion

-#define AT91C_ADC_EOC3        ((unsigned int) 0x1 <<  3) // (ADC) End of Conversion

-#define AT91C_ADC_EOC4        ((unsigned int) 0x1 <<  4) // (ADC) End of Conversion

-#define AT91C_ADC_EOC5        ((unsigned int) 0x1 <<  5) // (ADC) End of Conversion

-#define AT91C_ADC_EOC6        ((unsigned int) 0x1 <<  6) // (ADC) End of Conversion

-#define AT91C_ADC_EOC7        ((unsigned int) 0x1 <<  7) // (ADC) End of Conversion

-#define AT91C_ADC_OVRE0       ((unsigned int) 0x1 <<  8) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE1       ((unsigned int) 0x1 <<  9) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE2       ((unsigned int) 0x1 << 10) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE3       ((unsigned int) 0x1 << 11) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE4       ((unsigned int) 0x1 << 12) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE5       ((unsigned int) 0x1 << 13) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE6       ((unsigned int) 0x1 << 14) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE7       ((unsigned int) 0x1 << 15) // (ADC) Overrun Error

-#define AT91C_ADC_DRDY        ((unsigned int) 0x1 << 16) // (ADC) Data Ready

-#define AT91C_ADC_GOVRE       ((unsigned int) 0x1 << 17) // (ADC) General Overrun

-#define AT91C_ADC_ENDRX       ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer

-#define AT91C_ADC_RXBUFF      ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt

-// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- 

-#define AT91C_ADC_LDATA       ((unsigned int) 0x3FF <<  0) // (ADC) Last Data Converted

-// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- 

-// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- 

-// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- 

-// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- 

-#define AT91C_ADC_DATA        ((unsigned int) 0x3FF <<  0) // (ADC) Converted Data

-// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- 

-// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- 

-// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- 

-// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- 

-// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- 

-// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- 

-// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Advanced  Encryption Standard

-// *****************************************************************************

-typedef struct _AT91S_AES {

-	AT91_REG	 AES_CR; 	// Control Register

-	AT91_REG	 AES_MR; 	// Mode Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 AES_IER; 	// Interrupt Enable Register

-	AT91_REG	 AES_IDR; 	// Interrupt Disable Register

-	AT91_REG	 AES_IMR; 	// Interrupt Mask Register

-	AT91_REG	 AES_ISR; 	// Interrupt Status Register

-	AT91_REG	 AES_KEYWxR[4]; 	// Key Word x Register

-	AT91_REG	 Reserved1[4]; 	// 

-	AT91_REG	 AES_IDATAxR[4]; 	// Input Data x Register

-	AT91_REG	 AES_ODATAxR[4]; 	// Output Data x Register

-	AT91_REG	 AES_IVxR[4]; 	// Initialization Vector x Register

-	AT91_REG	 Reserved2[35]; 	// 

-	AT91_REG	 AES_VR; 	// AES Version Register

-	AT91_REG	 AES_RPR; 	// Receive Pointer Register

-	AT91_REG	 AES_RCR; 	// Receive Counter Register

-	AT91_REG	 AES_TPR; 	// Transmit Pointer Register

-	AT91_REG	 AES_TCR; 	// Transmit Counter Register

-	AT91_REG	 AES_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 AES_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 AES_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 AES_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 AES_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 AES_PTSR; 	// PDC Transfer Status Register

-} AT91S_AES, *AT91PS_AES;

-

-// -------- AES_CR : (AES Offset: 0x0) Control Register -------- 

-#define AT91C_AES_START       ((unsigned int) 0x1 <<  0) // (AES) Starts Processing

-#define AT91C_AES_SWRST       ((unsigned int) 0x1 <<  8) // (AES) Software Reset

-#define AT91C_AES_LOADSEED    ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading

-// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- 

-#define AT91C_AES_CIPHER      ((unsigned int) 0x1 <<  0) // (AES) Processing Mode

-#define AT91C_AES_PROCDLY     ((unsigned int) 0xF <<  4) // (AES) Processing Delay

-#define AT91C_AES_SMOD        ((unsigned int) 0x3 <<  8) // (AES) Start Mode

-#define 	AT91C_AES_SMOD_MANUAL               ((unsigned int) 0x0 <<  8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption.

-#define 	AT91C_AES_SMOD_AUTO                 ((unsigned int) 0x1 <<  8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet).

-#define 	AT91C_AES_SMOD_PDC                  ((unsigned int) 0x2 <<  8) // (AES) PDC Mode (cf datasheet).

-#define AT91C_AES_OPMOD       ((unsigned int) 0x7 << 12) // (AES) Operation Mode

-#define 	AT91C_AES_OPMOD_ECB                  ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode.

-#define 	AT91C_AES_OPMOD_CBC                  ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode.

-#define 	AT91C_AES_OPMOD_OFB                  ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode.

-#define 	AT91C_AES_OPMOD_CFB                  ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode.

-#define 	AT91C_AES_OPMOD_CTR                  ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode.

-#define AT91C_AES_LOD         ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode

-#define AT91C_AES_CFBS        ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size

-#define 	AT91C_AES_CFBS_128_BIT              ((unsigned int) 0x0 << 16) // (AES) 128-bit.

-#define 	AT91C_AES_CFBS_64_BIT               ((unsigned int) 0x1 << 16) // (AES) 64-bit.

-#define 	AT91C_AES_CFBS_32_BIT               ((unsigned int) 0x2 << 16) // (AES) 32-bit.

-#define 	AT91C_AES_CFBS_16_BIT               ((unsigned int) 0x3 << 16) // (AES) 16-bit.

-#define 	AT91C_AES_CFBS_8_BIT                ((unsigned int) 0x4 << 16) // (AES) 8-bit.

-#define AT91C_AES_CKEY        ((unsigned int) 0xF << 20) // (AES) Countermeasure Key

-#define AT91C_AES_CTYPE       ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type

-#define 	AT91C_AES_CTYPE_TYPE1_EN             ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE2_EN             ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE3_EN             ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE4_EN             ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE5_EN             ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled.

-// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- 

-#define AT91C_AES_DATRDY      ((unsigned int) 0x1 <<  0) // (AES) DATRDY

-#define AT91C_AES_ENDRX       ((unsigned int) 0x1 <<  1) // (AES) PDC Read Buffer End

-#define AT91C_AES_ENDTX       ((unsigned int) 0x1 <<  2) // (AES) PDC Write Buffer End

-#define AT91C_AES_RXBUFF      ((unsigned int) 0x1 <<  3) // (AES) PDC Read Buffer Full

-#define AT91C_AES_TXBUFE      ((unsigned int) 0x1 <<  4) // (AES) PDC Write Buffer Empty

-#define AT91C_AES_URAD        ((unsigned int) 0x1 <<  8) // (AES) Unspecified Register Access Detection

-// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- 

-// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- 

-// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- 

-#define AT91C_AES_URAT        ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status

-#define 	AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode.

-#define 	AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing.

-#define 	AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing.

-#define 	AT91C_AES_URAT_OUT_DAT_READ_SUBKEY  ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation.

-#define 	AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation.

-#define 	AT91C_AES_URAT_WO_REG_READ          ((unsigned int) 0x5 << 12) // (AES) Write-only register read access.

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Triple Data Encryption Standard

-// *****************************************************************************

-typedef struct _AT91S_TDES {

-	AT91_REG	 TDES_CR; 	// Control Register

-	AT91_REG	 TDES_MR; 	// Mode Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 TDES_IER; 	// Interrupt Enable Register

-	AT91_REG	 TDES_IDR; 	// Interrupt Disable Register

-	AT91_REG	 TDES_IMR; 	// Interrupt Mask Register

-	AT91_REG	 TDES_ISR; 	// Interrupt Status Register

-	AT91_REG	 TDES_KEY1WxR[2]; 	// Key 1 Word x Register

-	AT91_REG	 TDES_KEY2WxR[2]; 	// Key 2 Word x Register

-	AT91_REG	 TDES_KEY3WxR[2]; 	// Key 3 Word x Register

-	AT91_REG	 Reserved1[2]; 	// 

-	AT91_REG	 TDES_IDATAxR[2]; 	// Input Data x Register

-	AT91_REG	 Reserved2[2]; 	// 

-	AT91_REG	 TDES_ODATAxR[2]; 	// Output Data x Register

-	AT91_REG	 Reserved3[2]; 	// 

-	AT91_REG	 TDES_IVxR[2]; 	// Initialization Vector x Register

-	AT91_REG	 Reserved4[37]; 	// 

-	AT91_REG	 TDES_VR; 	// TDES Version Register

-	AT91_REG	 TDES_RPR; 	// Receive Pointer Register

-	AT91_REG	 TDES_RCR; 	// Receive Counter Register

-	AT91_REG	 TDES_TPR; 	// Transmit Pointer Register

-	AT91_REG	 TDES_TCR; 	// Transmit Counter Register

-	AT91_REG	 TDES_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 TDES_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 TDES_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 TDES_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 TDES_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 TDES_PTSR; 	// PDC Transfer Status Register

-} AT91S_TDES, *AT91PS_TDES;

-

-// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- 

-#define AT91C_TDES_START      ((unsigned int) 0x1 <<  0) // (TDES) Starts Processing

-#define AT91C_TDES_SWRST      ((unsigned int) 0x1 <<  8) // (TDES) Software Reset

-// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- 

-#define AT91C_TDES_CIPHER     ((unsigned int) 0x1 <<  0) // (TDES) Processing Mode

-#define AT91C_TDES_TDESMOD    ((unsigned int) 0x1 <<  1) // (TDES) Single or Triple DES Mode

-#define AT91C_TDES_KEYMOD     ((unsigned int) 0x1 <<  4) // (TDES) Key Mode

-#define AT91C_TDES_SMOD       ((unsigned int) 0x3 <<  8) // (TDES) Start Mode

-#define 	AT91C_TDES_SMOD_MANUAL               ((unsigned int) 0x0 <<  8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption.

-#define 	AT91C_TDES_SMOD_AUTO                 ((unsigned int) 0x1 <<  8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet).

-#define 	AT91C_TDES_SMOD_PDC                  ((unsigned int) 0x2 <<  8) // (TDES) PDC Mode (cf datasheet).

-#define AT91C_TDES_OPMOD      ((unsigned int) 0x3 << 12) // (TDES) Operation Mode

-#define 	AT91C_TDES_OPMOD_ECB                  ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode.

-#define 	AT91C_TDES_OPMOD_CBC                  ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode.

-#define 	AT91C_TDES_OPMOD_OFB                  ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode.

-#define 	AT91C_TDES_OPMOD_CFB                  ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode.

-#define AT91C_TDES_LOD        ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode

-#define AT91C_TDES_CFBS       ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size

-#define 	AT91C_TDES_CFBS_64_BIT               ((unsigned int) 0x0 << 16) // (TDES) 64-bit.

-#define 	AT91C_TDES_CFBS_32_BIT               ((unsigned int) 0x1 << 16) // (TDES) 32-bit.

-#define 	AT91C_TDES_CFBS_16_BIT               ((unsigned int) 0x2 << 16) // (TDES) 16-bit.

-#define 	AT91C_TDES_CFBS_8_BIT                ((unsigned int) 0x3 << 16) // (TDES) 8-bit.

-// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- 

-#define AT91C_TDES_DATRDY     ((unsigned int) 0x1 <<  0) // (TDES) DATRDY

-#define AT91C_TDES_ENDRX      ((unsigned int) 0x1 <<  1) // (TDES) PDC Read Buffer End

-#define AT91C_TDES_ENDTX      ((unsigned int) 0x1 <<  2) // (TDES) PDC Write Buffer End

-#define AT91C_TDES_RXBUFF     ((unsigned int) 0x1 <<  3) // (TDES) PDC Read Buffer Full

-#define AT91C_TDES_TXBUFE     ((unsigned int) 0x1 <<  4) // (TDES) PDC Write Buffer Empty

-#define AT91C_TDES_URAD       ((unsigned int) 0x1 <<  8) // (TDES) Unspecified Register Access Detection

-// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- 

-// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- 

-// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- 

-#define AT91C_TDES_URAT       ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status

-#define 	AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode.

-#define 	AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing.

-#define 	AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing.

-#define 	AT91C_TDES_URAT_WO_REG_READ          ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access.

-

-// *****************************************************************************

-//               REGISTER ADDRESS DEFINITION FOR AT91SAM7X128

-// *****************************************************************************

-// ========== Register definition for SYS peripheral ========== 

-// ========== Register definition for AIC peripheral ========== 

-#define AT91C_AIC_IVR   ((AT91_REG *) 	0xFFFFF100) // (AIC) IRQ Vector Register

-#define AT91C_AIC_SMR   ((AT91_REG *) 	0xFFFFF000) // (AIC) Source Mode Register

-#define AT91C_AIC_FVR   ((AT91_REG *) 	0xFFFFF104) // (AIC) FIQ Vector Register

-#define AT91C_AIC_DCR   ((AT91_REG *) 	0xFFFFF138) // (AIC) Debug Control Register (Protect)

-#define AT91C_AIC_EOICR ((AT91_REG *) 	0xFFFFF130) // (AIC) End of Interrupt Command Register

-#define AT91C_AIC_SVR   ((AT91_REG *) 	0xFFFFF080) // (AIC) Source Vector Register

-#define AT91C_AIC_FFSR  ((AT91_REG *) 	0xFFFFF148) // (AIC) Fast Forcing Status Register

-#define AT91C_AIC_ICCR  ((AT91_REG *) 	0xFFFFF128) // (AIC) Interrupt Clear Command Register

-#define AT91C_AIC_ISR   ((AT91_REG *) 	0xFFFFF108) // (AIC) Interrupt Status Register

-#define AT91C_AIC_IMR   ((AT91_REG *) 	0xFFFFF110) // (AIC) Interrupt Mask Register

-#define AT91C_AIC_IPR   ((AT91_REG *) 	0xFFFFF10C) // (AIC) Interrupt Pending Register

-#define AT91C_AIC_FFER  ((AT91_REG *) 	0xFFFFF140) // (AIC) Fast Forcing Enable Register

-#define AT91C_AIC_IECR  ((AT91_REG *) 	0xFFFFF120) // (AIC) Interrupt Enable Command Register

-#define AT91C_AIC_ISCR  ((AT91_REG *) 	0xFFFFF12C) // (AIC) Interrupt Set Command Register

-#define AT91C_AIC_FFDR  ((AT91_REG *) 	0xFFFFF144) // (AIC) Fast Forcing Disable Register

-#define AT91C_AIC_CISR  ((AT91_REG *) 	0xFFFFF114) // (AIC) Core Interrupt Status Register

-#define AT91C_AIC_IDCR  ((AT91_REG *) 	0xFFFFF124) // (AIC) Interrupt Disable Command Register

-#define AT91C_AIC_SPU   ((AT91_REG *) 	0xFFFFF134) // (AIC) Spurious Vector Register

-// ========== Register definition for PDC_DBGU peripheral ========== 

-#define AT91C_DBGU_TCR  ((AT91_REG *) 	0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register

-#define AT91C_DBGU_RNPR ((AT91_REG *) 	0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register

-#define AT91C_DBGU_TNPR ((AT91_REG *) 	0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register

-#define AT91C_DBGU_TPR  ((AT91_REG *) 	0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register

-#define AT91C_DBGU_RPR  ((AT91_REG *) 	0xFFFFF300) // (PDC_DBGU) Receive Pointer Register

-#define AT91C_DBGU_RCR  ((AT91_REG *) 	0xFFFFF304) // (PDC_DBGU) Receive Counter Register

-#define AT91C_DBGU_RNCR ((AT91_REG *) 	0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register

-#define AT91C_DBGU_PTCR ((AT91_REG *) 	0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register

-#define AT91C_DBGU_PTSR ((AT91_REG *) 	0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register

-#define AT91C_DBGU_TNCR ((AT91_REG *) 	0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register

-// ========== Register definition for DBGU peripheral ========== 

-#define AT91C_DBGU_EXID ((AT91_REG *) 	0xFFFFF244) // (DBGU) Chip ID Extension Register

-#define AT91C_DBGU_BRGR ((AT91_REG *) 	0xFFFFF220) // (DBGU) Baud Rate Generator Register

-#define AT91C_DBGU_IDR  ((AT91_REG *) 	0xFFFFF20C) // (DBGU) Interrupt Disable Register

-#define AT91C_DBGU_CSR  ((AT91_REG *) 	0xFFFFF214) // (DBGU) Channel Status Register

-#define AT91C_DBGU_CIDR ((AT91_REG *) 	0xFFFFF240) // (DBGU) Chip ID Register

-#define AT91C_DBGU_MR   ((AT91_REG *) 	0xFFFFF204) // (DBGU) Mode Register

-#define AT91C_DBGU_IMR  ((AT91_REG *) 	0xFFFFF210) // (DBGU) Interrupt Mask Register

-#define AT91C_DBGU_CR   ((AT91_REG *) 	0xFFFFF200) // (DBGU) Control Register

-#define AT91C_DBGU_FNTR ((AT91_REG *) 	0xFFFFF248) // (DBGU) Force NTRST Register

-#define AT91C_DBGU_THR  ((AT91_REG *) 	0xFFFFF21C) // (DBGU) Transmitter Holding Register

-#define AT91C_DBGU_RHR  ((AT91_REG *) 	0xFFFFF218) // (DBGU) Receiver Holding Register

-#define AT91C_DBGU_IER  ((AT91_REG *) 	0xFFFFF208) // (DBGU) Interrupt Enable Register

-// ========== Register definition for PIOA peripheral ========== 

-#define AT91C_PIOA_ODR  ((AT91_REG *) 	0xFFFFF414) // (PIOA) Output Disable Registerr

-#define AT91C_PIOA_SODR ((AT91_REG *) 	0xFFFFF430) // (PIOA) Set Output Data Register

-#define AT91C_PIOA_ISR  ((AT91_REG *) 	0xFFFFF44C) // (PIOA) Interrupt Status Register

-#define AT91C_PIOA_ABSR ((AT91_REG *) 	0xFFFFF478) // (PIOA) AB Select Status Register

-#define AT91C_PIOA_IER  ((AT91_REG *) 	0xFFFFF440) // (PIOA) Interrupt Enable Register

-#define AT91C_PIOA_PPUDR ((AT91_REG *) 	0xFFFFF460) // (PIOA) Pull-up Disable Register

-#define AT91C_PIOA_IMR  ((AT91_REG *) 	0xFFFFF448) // (PIOA) Interrupt Mask Register

-#define AT91C_PIOA_PER  ((AT91_REG *) 	0xFFFFF400) // (PIOA) PIO Enable Register

-#define AT91C_PIOA_IFDR ((AT91_REG *) 	0xFFFFF424) // (PIOA) Input Filter Disable Register

-#define AT91C_PIOA_OWDR ((AT91_REG *) 	0xFFFFF4A4) // (PIOA) Output Write Disable Register

-#define AT91C_PIOA_MDSR ((AT91_REG *) 	0xFFFFF458) // (PIOA) Multi-driver Status Register

-#define AT91C_PIOA_IDR  ((AT91_REG *) 	0xFFFFF444) // (PIOA) Interrupt Disable Register

-#define AT91C_PIOA_ODSR ((AT91_REG *) 	0xFFFFF438) // (PIOA) Output Data Status Register

-#define AT91C_PIOA_PPUSR ((AT91_REG *) 	0xFFFFF468) // (PIOA) Pull-up Status Register

-#define AT91C_PIOA_OWSR ((AT91_REG *) 	0xFFFFF4A8) // (PIOA) Output Write Status Register

-#define AT91C_PIOA_BSR  ((AT91_REG *) 	0xFFFFF474) // (PIOA) Select B Register

-#define AT91C_PIOA_OWER ((AT91_REG *) 	0xFFFFF4A0) // (PIOA) Output Write Enable Register

-#define AT91C_PIOA_IFER ((AT91_REG *) 	0xFFFFF420) // (PIOA) Input Filter Enable Register

-#define AT91C_PIOA_PDSR ((AT91_REG *) 	0xFFFFF43C) // (PIOA) Pin Data Status Register

-#define AT91C_PIOA_PPUER ((AT91_REG *) 	0xFFFFF464) // (PIOA) Pull-up Enable Register

-#define AT91C_PIOA_OSR  ((AT91_REG *) 	0xFFFFF418) // (PIOA) Output Status Register

-#define AT91C_PIOA_ASR  ((AT91_REG *) 	0xFFFFF470) // (PIOA) Select A Register

-#define AT91C_PIOA_MDDR ((AT91_REG *) 	0xFFFFF454) // (PIOA) Multi-driver Disable Register

-#define AT91C_PIOA_CODR ((AT91_REG *) 	0xFFFFF434) // (PIOA) Clear Output Data Register

-#define AT91C_PIOA_MDER ((AT91_REG *) 	0xFFFFF450) // (PIOA) Multi-driver Enable Register

-#define AT91C_PIOA_PDR  ((AT91_REG *) 	0xFFFFF404) // (PIOA) PIO Disable Register

-#define AT91C_PIOA_IFSR ((AT91_REG *) 	0xFFFFF428) // (PIOA) Input Filter Status Register

-#define AT91C_PIOA_OER  ((AT91_REG *) 	0xFFFFF410) // (PIOA) Output Enable Register

-#define AT91C_PIOA_PSR  ((AT91_REG *) 	0xFFFFF408) // (PIOA) PIO Status Register

-// ========== Register definition for PIOB peripheral ========== 

-#define AT91C_PIOB_OWDR ((AT91_REG *) 	0xFFFFF6A4) // (PIOB) Output Write Disable Register

-#define AT91C_PIOB_MDER ((AT91_REG *) 	0xFFFFF650) // (PIOB) Multi-driver Enable Register

-#define AT91C_PIOB_PPUSR ((AT91_REG *) 	0xFFFFF668) // (PIOB) Pull-up Status Register

-#define AT91C_PIOB_IMR  ((AT91_REG *) 	0xFFFFF648) // (PIOB) Interrupt Mask Register

-#define AT91C_PIOB_ASR  ((AT91_REG *) 	0xFFFFF670) // (PIOB) Select A Register

-#define AT91C_PIOB_PPUDR ((AT91_REG *) 	0xFFFFF660) // (PIOB) Pull-up Disable Register

-#define AT91C_PIOB_PSR  ((AT91_REG *) 	0xFFFFF608) // (PIOB) PIO Status Register

-#define AT91C_PIOB_IER  ((AT91_REG *) 	0xFFFFF640) // (PIOB) Interrupt Enable Register

-#define AT91C_PIOB_CODR ((AT91_REG *) 	0xFFFFF634) // (PIOB) Clear Output Data Register

-#define AT91C_PIOB_OWER ((AT91_REG *) 	0xFFFFF6A0) // (PIOB) Output Write Enable Register

-#define AT91C_PIOB_ABSR ((AT91_REG *) 	0xFFFFF678) // (PIOB) AB Select Status Register

-#define AT91C_PIOB_IFDR ((AT91_REG *) 	0xFFFFF624) // (PIOB) Input Filter Disable Register

-#define AT91C_PIOB_PDSR ((AT91_REG *) 	0xFFFFF63C) // (PIOB) Pin Data Status Register

-#define AT91C_PIOB_IDR  ((AT91_REG *) 	0xFFFFF644) // (PIOB) Interrupt Disable Register

-#define AT91C_PIOB_OWSR ((AT91_REG *) 	0xFFFFF6A8) // (PIOB) Output Write Status Register

-#define AT91C_PIOB_PDR  ((AT91_REG *) 	0xFFFFF604) // (PIOB) PIO Disable Register

-#define AT91C_PIOB_ODR  ((AT91_REG *) 	0xFFFFF614) // (PIOB) Output Disable Registerr

-#define AT91C_PIOB_IFSR ((AT91_REG *) 	0xFFFFF628) // (PIOB) Input Filter Status Register

-#define AT91C_PIOB_PPUER ((AT91_REG *) 	0xFFFFF664) // (PIOB) Pull-up Enable Register

-#define AT91C_PIOB_SODR ((AT91_REG *) 	0xFFFFF630) // (PIOB) Set Output Data Register

-#define AT91C_PIOB_ISR  ((AT91_REG *) 	0xFFFFF64C) // (PIOB) Interrupt Status Register

-#define AT91C_PIOB_ODSR ((AT91_REG *) 	0xFFFFF638) // (PIOB) Output Data Status Register

-#define AT91C_PIOB_OSR  ((AT91_REG *) 	0xFFFFF618) // (PIOB) Output Status Register

-#define AT91C_PIOB_MDSR ((AT91_REG *) 	0xFFFFF658) // (PIOB) Multi-driver Status Register

-#define AT91C_PIOB_IFER ((AT91_REG *) 	0xFFFFF620) // (PIOB) Input Filter Enable Register

-#define AT91C_PIOB_BSR  ((AT91_REG *) 	0xFFFFF674) // (PIOB) Select B Register

-#define AT91C_PIOB_MDDR ((AT91_REG *) 	0xFFFFF654) // (PIOB) Multi-driver Disable Register

-#define AT91C_PIOB_OER  ((AT91_REG *) 	0xFFFFF610) // (PIOB) Output Enable Register

-#define AT91C_PIOB_PER  ((AT91_REG *) 	0xFFFFF600) // (PIOB) PIO Enable Register

-// ========== Register definition for CKGR peripheral ========== 

-#define AT91C_CKGR_MOR  ((AT91_REG *) 	0xFFFFFC20) // (CKGR) Main Oscillator Register

-#define AT91C_CKGR_PLLR ((AT91_REG *) 	0xFFFFFC2C) // (CKGR) PLL Register

-#define AT91C_CKGR_MCFR ((AT91_REG *) 	0xFFFFFC24) // (CKGR) Main Clock  Frequency Register

-// ========== Register definition for PMC peripheral ========== 

-#define AT91C_PMC_IDR   ((AT91_REG *) 	0xFFFFFC64) // (PMC) Interrupt Disable Register

-#define AT91C_PMC_MOR   ((AT91_REG *) 	0xFFFFFC20) // (PMC) Main Oscillator Register

-#define AT91C_PMC_PLLR  ((AT91_REG *) 	0xFFFFFC2C) // (PMC) PLL Register

-#define AT91C_PMC_PCER  ((AT91_REG *) 	0xFFFFFC10) // (PMC) Peripheral Clock Enable Register

-#define AT91C_PMC_PCKR  ((AT91_REG *) 	0xFFFFFC40) // (PMC) Programmable Clock Register

-#define AT91C_PMC_MCKR  ((AT91_REG *) 	0xFFFFFC30) // (PMC) Master Clock Register

-#define AT91C_PMC_SCDR  ((AT91_REG *) 	0xFFFFFC04) // (PMC) System Clock Disable Register

-#define AT91C_PMC_PCDR  ((AT91_REG *) 	0xFFFFFC14) // (PMC) Peripheral Clock Disable Register

-#define AT91C_PMC_SCSR  ((AT91_REG *) 	0xFFFFFC08) // (PMC) System Clock Status Register

-#define AT91C_PMC_PCSR  ((AT91_REG *) 	0xFFFFFC18) // (PMC) Peripheral Clock Status Register

-#define AT91C_PMC_MCFR  ((AT91_REG *) 	0xFFFFFC24) // (PMC) Main Clock  Frequency Register

-#define AT91C_PMC_SCER  ((AT91_REG *) 	0xFFFFFC00) // (PMC) System Clock Enable Register

-#define AT91C_PMC_IMR   ((AT91_REG *) 	0xFFFFFC6C) // (PMC) Interrupt Mask Register

-#define AT91C_PMC_IER   ((AT91_REG *) 	0xFFFFFC60) // (PMC) Interrupt Enable Register

-#define AT91C_PMC_SR    ((AT91_REG *) 	0xFFFFFC68) // (PMC) Status Register

-// ========== Register definition for RSTC peripheral ========== 

-#define AT91C_RSTC_RCR  ((AT91_REG *) 	0xFFFFFD00) // (RSTC) Reset Control Register

-#define AT91C_RSTC_RMR  ((AT91_REG *) 	0xFFFFFD08) // (RSTC) Reset Mode Register

-#define AT91C_RSTC_RSR  ((AT91_REG *) 	0xFFFFFD04) // (RSTC) Reset Status Register

-// ========== Register definition for RTTC peripheral ========== 

-#define AT91C_RTTC_RTSR ((AT91_REG *) 	0xFFFFFD2C) // (RTTC) Real-time Status Register

-#define AT91C_RTTC_RTMR ((AT91_REG *) 	0xFFFFFD20) // (RTTC) Real-time Mode Register

-#define AT91C_RTTC_RTVR ((AT91_REG *) 	0xFFFFFD28) // (RTTC) Real-time Value Register

-#define AT91C_RTTC_RTAR ((AT91_REG *) 	0xFFFFFD24) // (RTTC) Real-time Alarm Register

-// ========== Register definition for PITC peripheral ========== 

-#define AT91C_PITC_PIVR ((AT91_REG *) 	0xFFFFFD38) // (PITC) Period Interval Value Register

-#define AT91C_PITC_PISR ((AT91_REG *) 	0xFFFFFD34) // (PITC) Period Interval Status Register

-#define AT91C_PITC_PIIR ((AT91_REG *) 	0xFFFFFD3C) // (PITC) Period Interval Image Register

-#define AT91C_PITC_PIMR ((AT91_REG *) 	0xFFFFFD30) // (PITC) Period Interval Mode Register

-// ========== Register definition for WDTC peripheral ========== 

-#define AT91C_WDTC_WDCR ((AT91_REG *) 	0xFFFFFD40) // (WDTC) Watchdog Control Register

-#define AT91C_WDTC_WDSR ((AT91_REG *) 	0xFFFFFD48) // (WDTC) Watchdog Status Register

-#define AT91C_WDTC_WDMR ((AT91_REG *) 	0xFFFFFD44) // (WDTC) Watchdog Mode Register

-// ========== Register definition for VREG peripheral ========== 

-#define AT91C_VREG_MR   ((AT91_REG *) 	0xFFFFFD60) // (VREG) Voltage Regulator Mode Register

-// ========== Register definition for MC peripheral ========== 

-#define AT91C_MC_ASR    ((AT91_REG *) 	0xFFFFFF04) // (MC) MC Abort Status Register

-#define AT91C_MC_RCR    ((AT91_REG *) 	0xFFFFFF00) // (MC) MC Remap Control Register

-#define AT91C_MC_FCR    ((AT91_REG *) 	0xFFFFFF64) // (MC) MC Flash Command Register

-#define AT91C_MC_AASR   ((AT91_REG *) 	0xFFFFFF08) // (MC) MC Abort Address Status Register

-#define AT91C_MC_FSR    ((AT91_REG *) 	0xFFFFFF68) // (MC) MC Flash Status Register

-#define AT91C_MC_FMR    ((AT91_REG *) 	0xFFFFFF60) // (MC) MC Flash Mode Register

-// ========== Register definition for PDC_SPI1 peripheral ========== 

-#define AT91C_SPI1_PTCR ((AT91_REG *) 	0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register

-#define AT91C_SPI1_RPR  ((AT91_REG *) 	0xFFFE4100) // (PDC_SPI1) Receive Pointer Register

-#define AT91C_SPI1_TNCR ((AT91_REG *) 	0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register

-#define AT91C_SPI1_TPR  ((AT91_REG *) 	0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register

-#define AT91C_SPI1_TNPR ((AT91_REG *) 	0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register

-#define AT91C_SPI1_TCR  ((AT91_REG *) 	0xFFFE410C) // (PDC_SPI1) Transmit Counter Register

-#define AT91C_SPI1_RCR  ((AT91_REG *) 	0xFFFE4104) // (PDC_SPI1) Receive Counter Register

-#define AT91C_SPI1_RNPR ((AT91_REG *) 	0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register

-#define AT91C_SPI1_RNCR ((AT91_REG *) 	0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register

-#define AT91C_SPI1_PTSR ((AT91_REG *) 	0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register

-// ========== Register definition for SPI1 peripheral ========== 

-#define AT91C_SPI1_IMR  ((AT91_REG *) 	0xFFFE401C) // (SPI1) Interrupt Mask Register

-#define AT91C_SPI1_IER  ((AT91_REG *) 	0xFFFE4014) // (SPI1) Interrupt Enable Register

-#define AT91C_SPI1_MR   ((AT91_REG *) 	0xFFFE4004) // (SPI1) Mode Register

-#define AT91C_SPI1_RDR  ((AT91_REG *) 	0xFFFE4008) // (SPI1) Receive Data Register

-#define AT91C_SPI1_IDR  ((AT91_REG *) 	0xFFFE4018) // (SPI1) Interrupt Disable Register

-#define AT91C_SPI1_SR   ((AT91_REG *) 	0xFFFE4010) // (SPI1) Status Register

-#define AT91C_SPI1_TDR  ((AT91_REG *) 	0xFFFE400C) // (SPI1) Transmit Data Register

-#define AT91C_SPI1_CR   ((AT91_REG *) 	0xFFFE4000) // (SPI1) Control Register

-#define AT91C_SPI1_CSR  ((AT91_REG *) 	0xFFFE4030) // (SPI1) Chip Select Register

-// ========== Register definition for PDC_SPI0 peripheral ========== 

-#define AT91C_SPI0_PTCR ((AT91_REG *) 	0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register

-#define AT91C_SPI0_TPR  ((AT91_REG *) 	0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register

-#define AT91C_SPI0_TCR  ((AT91_REG *) 	0xFFFE010C) // (PDC_SPI0) Transmit Counter Register

-#define AT91C_SPI0_RCR  ((AT91_REG *) 	0xFFFE0104) // (PDC_SPI0) Receive Counter Register

-#define AT91C_SPI0_PTSR ((AT91_REG *) 	0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register

-#define AT91C_SPI0_RNPR ((AT91_REG *) 	0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register

-#define AT91C_SPI0_RPR  ((AT91_REG *) 	0xFFFE0100) // (PDC_SPI0) Receive Pointer Register

-#define AT91C_SPI0_TNCR ((AT91_REG *) 	0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register

-#define AT91C_SPI0_RNCR ((AT91_REG *) 	0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register

-#define AT91C_SPI0_TNPR ((AT91_REG *) 	0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register

-// ========== Register definition for SPI0 peripheral ========== 

-#define AT91C_SPI0_IER  ((AT91_REG *) 	0xFFFE0014) // (SPI0) Interrupt Enable Register

-#define AT91C_SPI0_SR   ((AT91_REG *) 	0xFFFE0010) // (SPI0) Status Register

-#define AT91C_SPI0_IDR  ((AT91_REG *) 	0xFFFE0018) // (SPI0) Interrupt Disable Register

-#define AT91C_SPI0_CR   ((AT91_REG *) 	0xFFFE0000) // (SPI0) Control Register

-#define AT91C_SPI0_MR   ((AT91_REG *) 	0xFFFE0004) // (SPI0) Mode Register

-#define AT91C_SPI0_IMR  ((AT91_REG *) 	0xFFFE001C) // (SPI0) Interrupt Mask Register

-#define AT91C_SPI0_TDR  ((AT91_REG *) 	0xFFFE000C) // (SPI0) Transmit Data Register

-#define AT91C_SPI0_RDR  ((AT91_REG *) 	0xFFFE0008) // (SPI0) Receive Data Register

-#define AT91C_SPI0_CSR  ((AT91_REG *) 	0xFFFE0030) // (SPI0) Chip Select Register

-// ========== Register definition for PDC_US1 peripheral ========== 

-#define AT91C_US1_RNCR  ((AT91_REG *) 	0xFFFC4114) // (PDC_US1) Receive Next Counter Register

-#define AT91C_US1_PTCR  ((AT91_REG *) 	0xFFFC4120) // (PDC_US1) PDC Transfer Control Register

-#define AT91C_US1_TCR   ((AT91_REG *) 	0xFFFC410C) // (PDC_US1) Transmit Counter Register

-#define AT91C_US1_PTSR  ((AT91_REG *) 	0xFFFC4124) // (PDC_US1) PDC Transfer Status Register

-#define AT91C_US1_TNPR  ((AT91_REG *) 	0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register

-#define AT91C_US1_RCR   ((AT91_REG *) 	0xFFFC4104) // (PDC_US1) Receive Counter Register

-#define AT91C_US1_RNPR  ((AT91_REG *) 	0xFFFC4110) // (PDC_US1) Receive Next Pointer Register

-#define AT91C_US1_RPR   ((AT91_REG *) 	0xFFFC4100) // (PDC_US1) Receive Pointer Register

-#define AT91C_US1_TNCR  ((AT91_REG *) 	0xFFFC411C) // (PDC_US1) Transmit Next Counter Register

-#define AT91C_US1_TPR   ((AT91_REG *) 	0xFFFC4108) // (PDC_US1) Transmit Pointer Register

-// ========== Register definition for US1 peripheral ========== 

-#define AT91C_US1_IF    ((AT91_REG *) 	0xFFFC404C) // (US1) IRDA_FILTER Register

-#define AT91C_US1_NER   ((AT91_REG *) 	0xFFFC4044) // (US1) Nb Errors Register

-#define AT91C_US1_RTOR  ((AT91_REG *) 	0xFFFC4024) // (US1) Receiver Time-out Register

-#define AT91C_US1_CSR   ((AT91_REG *) 	0xFFFC4014) // (US1) Channel Status Register

-#define AT91C_US1_IDR   ((AT91_REG *) 	0xFFFC400C) // (US1) Interrupt Disable Register

-#define AT91C_US1_IER   ((AT91_REG *) 	0xFFFC4008) // (US1) Interrupt Enable Register

-#define AT91C_US1_THR   ((AT91_REG *) 	0xFFFC401C) // (US1) Transmitter Holding Register

-#define AT91C_US1_TTGR  ((AT91_REG *) 	0xFFFC4028) // (US1) Transmitter Time-guard Register

-#define AT91C_US1_RHR   ((AT91_REG *) 	0xFFFC4018) // (US1) Receiver Holding Register

-#define AT91C_US1_BRGR  ((AT91_REG *) 	0xFFFC4020) // (US1) Baud Rate Generator Register

-#define AT91C_US1_IMR   ((AT91_REG *) 	0xFFFC4010) // (US1) Interrupt Mask Register

-#define AT91C_US1_FIDI  ((AT91_REG *) 	0xFFFC4040) // (US1) FI_DI_Ratio Register

-#define AT91C_US1_CR    ((AT91_REG *) 	0xFFFC4000) // (US1) Control Register

-#define AT91C_US1_MR    ((AT91_REG *) 	0xFFFC4004) // (US1) Mode Register

-// ========== Register definition for PDC_US0 peripheral ========== 

-#define AT91C_US0_TNPR  ((AT91_REG *) 	0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register

-#define AT91C_US0_RNPR  ((AT91_REG *) 	0xFFFC0110) // (PDC_US0) Receive Next Pointer Register

-#define AT91C_US0_TCR   ((AT91_REG *) 	0xFFFC010C) // (PDC_US0) Transmit Counter Register

-#define AT91C_US0_PTCR  ((AT91_REG *) 	0xFFFC0120) // (PDC_US0) PDC Transfer Control Register

-#define AT91C_US0_PTSR  ((AT91_REG *) 	0xFFFC0124) // (PDC_US0) PDC Transfer Status Register

-#define AT91C_US0_TNCR  ((AT91_REG *) 	0xFFFC011C) // (PDC_US0) Transmit Next Counter Register

-#define AT91C_US0_TPR   ((AT91_REG *) 	0xFFFC0108) // (PDC_US0) Transmit Pointer Register

-#define AT91C_US0_RCR   ((AT91_REG *) 	0xFFFC0104) // (PDC_US0) Receive Counter Register

-#define AT91C_US0_RPR   ((AT91_REG *) 	0xFFFC0100) // (PDC_US0) Receive Pointer Register

-#define AT91C_US0_RNCR  ((AT91_REG *) 	0xFFFC0114) // (PDC_US0) Receive Next Counter Register

-// ========== Register definition for US0 peripheral ========== 

-#define AT91C_US0_BRGR  ((AT91_REG *) 	0xFFFC0020) // (US0) Baud Rate Generator Register

-#define AT91C_US0_NER   ((AT91_REG *) 	0xFFFC0044) // (US0) Nb Errors Register

-#define AT91C_US0_CR    ((AT91_REG *) 	0xFFFC0000) // (US0) Control Register

-#define AT91C_US0_IMR   ((AT91_REG *) 	0xFFFC0010) // (US0) Interrupt Mask Register

-#define AT91C_US0_FIDI  ((AT91_REG *) 	0xFFFC0040) // (US0) FI_DI_Ratio Register

-#define AT91C_US0_TTGR  ((AT91_REG *) 	0xFFFC0028) // (US0) Transmitter Time-guard Register

-#define AT91C_US0_MR    ((AT91_REG *) 	0xFFFC0004) // (US0) Mode Register

-#define AT91C_US0_RTOR  ((AT91_REG *) 	0xFFFC0024) // (US0) Receiver Time-out Register

-#define AT91C_US0_CSR   ((AT91_REG *) 	0xFFFC0014) // (US0) Channel Status Register

-#define AT91C_US0_RHR   ((AT91_REG *) 	0xFFFC0018) // (US0) Receiver Holding Register

-#define AT91C_US0_IDR   ((AT91_REG *) 	0xFFFC000C) // (US0) Interrupt Disable Register

-#define AT91C_US0_THR   ((AT91_REG *) 	0xFFFC001C) // (US0) Transmitter Holding Register

-#define AT91C_US0_IF    ((AT91_REG *) 	0xFFFC004C) // (US0) IRDA_FILTER Register

-#define AT91C_US0_IER   ((AT91_REG *) 	0xFFFC0008) // (US0) Interrupt Enable Register

-// ========== Register definition for PDC_SSC peripheral ========== 

-#define AT91C_SSC_TNCR  ((AT91_REG *) 	0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register

-#define AT91C_SSC_RPR   ((AT91_REG *) 	0xFFFD4100) // (PDC_SSC) Receive Pointer Register

-#define AT91C_SSC_RNCR  ((AT91_REG *) 	0xFFFD4114) // (PDC_SSC) Receive Next Counter Register

-#define AT91C_SSC_TPR   ((AT91_REG *) 	0xFFFD4108) // (PDC_SSC) Transmit Pointer Register

-#define AT91C_SSC_PTCR  ((AT91_REG *) 	0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register

-#define AT91C_SSC_TCR   ((AT91_REG *) 	0xFFFD410C) // (PDC_SSC) Transmit Counter Register

-#define AT91C_SSC_RCR   ((AT91_REG *) 	0xFFFD4104) // (PDC_SSC) Receive Counter Register

-#define AT91C_SSC_RNPR  ((AT91_REG *) 	0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register

-#define AT91C_SSC_TNPR  ((AT91_REG *) 	0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register

-#define AT91C_SSC_PTSR  ((AT91_REG *) 	0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register

-// ========== Register definition for SSC peripheral ========== 

-#define AT91C_SSC_RHR   ((AT91_REG *) 	0xFFFD4020) // (SSC) Receive Holding Register

-#define AT91C_SSC_RSHR  ((AT91_REG *) 	0xFFFD4030) // (SSC) Receive Sync Holding Register

-#define AT91C_SSC_TFMR  ((AT91_REG *) 	0xFFFD401C) // (SSC) Transmit Frame Mode Register

-#define AT91C_SSC_IDR   ((AT91_REG *) 	0xFFFD4048) // (SSC) Interrupt Disable Register

-#define AT91C_SSC_THR   ((AT91_REG *) 	0xFFFD4024) // (SSC) Transmit Holding Register

-#define AT91C_SSC_RCMR  ((AT91_REG *) 	0xFFFD4010) // (SSC) Receive Clock ModeRegister

-#define AT91C_SSC_IER   ((AT91_REG *) 	0xFFFD4044) // (SSC) Interrupt Enable Register

-#define AT91C_SSC_TSHR  ((AT91_REG *) 	0xFFFD4034) // (SSC) Transmit Sync Holding Register

-#define AT91C_SSC_SR    ((AT91_REG *) 	0xFFFD4040) // (SSC) Status Register

-#define AT91C_SSC_CMR   ((AT91_REG *) 	0xFFFD4004) // (SSC) Clock Mode Register

-#define AT91C_SSC_TCMR  ((AT91_REG *) 	0xFFFD4018) // (SSC) Transmit Clock Mode Register

-#define AT91C_SSC_CR    ((AT91_REG *) 	0xFFFD4000) // (SSC) Control Register

-#define AT91C_SSC_IMR   ((AT91_REG *) 	0xFFFD404C) // (SSC) Interrupt Mask Register

-#define AT91C_SSC_RFMR  ((AT91_REG *) 	0xFFFD4014) // (SSC) Receive Frame Mode Register

-// ========== Register definition for TWI peripheral ========== 

-#define AT91C_TWI_IER   ((AT91_REG *) 	0xFFFB8024) // (TWI) Interrupt Enable Register

-#define AT91C_TWI_CR    ((AT91_REG *) 	0xFFFB8000) // (TWI) Control Register

-#define AT91C_TWI_SR    ((AT91_REG *) 	0xFFFB8020) // (TWI) Status Register

-#define AT91C_TWI_IMR   ((AT91_REG *) 	0xFFFB802C) // (TWI) Interrupt Mask Register

-#define AT91C_TWI_THR   ((AT91_REG *) 	0xFFFB8034) // (TWI) Transmit Holding Register

-#define AT91C_TWI_IDR   ((AT91_REG *) 	0xFFFB8028) // (TWI) Interrupt Disable Register

-#define AT91C_TWI_IADR  ((AT91_REG *) 	0xFFFB800C) // (TWI) Internal Address Register

-#define AT91C_TWI_MMR   ((AT91_REG *) 	0xFFFB8004) // (TWI) Master Mode Register

-#define AT91C_TWI_CWGR  ((AT91_REG *) 	0xFFFB8010) // (TWI) Clock Waveform Generator Register

-#define AT91C_TWI_RHR   ((AT91_REG *) 	0xFFFB8030) // (TWI) Receive Holding Register

-// ========== Register definition for PWMC_CH3 peripheral ========== 

-#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 	0xFFFCC270) // (PWMC_CH3) Channel Update Register

-#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 	0xFFFCC274) // (PWMC_CH3) Reserved

-#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 	0xFFFCC268) // (PWMC_CH3) Channel Period Register

-#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 	0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register

-#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 	0xFFFCC26C) // (PWMC_CH3) Channel Counter Register

-#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 	0xFFFCC260) // (PWMC_CH3) Channel Mode Register

-// ========== Register definition for PWMC_CH2 peripheral ========== 

-#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 	0xFFFCC254) // (PWMC_CH2) Reserved

-#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 	0xFFFCC240) // (PWMC_CH2) Channel Mode Register

-#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 	0xFFFCC24C) // (PWMC_CH2) Channel Counter Register

-#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 	0xFFFCC248) // (PWMC_CH2) Channel Period Register

-#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 	0xFFFCC250) // (PWMC_CH2) Channel Update Register

-#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 	0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register

-// ========== Register definition for PWMC_CH1 peripheral ========== 

-#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 	0xFFFCC234) // (PWMC_CH1) Reserved

-#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 	0xFFFCC230) // (PWMC_CH1) Channel Update Register

-#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 	0xFFFCC228) // (PWMC_CH1) Channel Period Register

-#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 	0xFFFCC22C) // (PWMC_CH1) Channel Counter Register

-#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 	0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register

-#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 	0xFFFCC220) // (PWMC_CH1) Channel Mode Register

-// ========== Register definition for PWMC_CH0 peripheral ========== 

-#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 	0xFFFCC214) // (PWMC_CH0) Reserved

-#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 	0xFFFCC208) // (PWMC_CH0) Channel Period Register

-#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 	0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register

-#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 	0xFFFCC200) // (PWMC_CH0) Channel Mode Register

-#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 	0xFFFCC210) // (PWMC_CH0) Channel Update Register

-#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 	0xFFFCC20C) // (PWMC_CH0) Channel Counter Register

-// ========== Register definition for PWMC peripheral ========== 

-#define AT91C_PWMC_IDR  ((AT91_REG *) 	0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register

-#define AT91C_PWMC_DIS  ((AT91_REG *) 	0xFFFCC008) // (PWMC) PWMC Disable Register

-#define AT91C_PWMC_IER  ((AT91_REG *) 	0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register

-#define AT91C_PWMC_VR   ((AT91_REG *) 	0xFFFCC0FC) // (PWMC) PWMC Version Register

-#define AT91C_PWMC_ISR  ((AT91_REG *) 	0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register

-#define AT91C_PWMC_SR   ((AT91_REG *) 	0xFFFCC00C) // (PWMC) PWMC Status Register

-#define AT91C_PWMC_IMR  ((AT91_REG *) 	0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register

-#define AT91C_PWMC_MR   ((AT91_REG *) 	0xFFFCC000) // (PWMC) PWMC Mode Register

-#define AT91C_PWMC_ENA  ((AT91_REG *) 	0xFFFCC004) // (PWMC) PWMC Enable Register

-// ========== Register definition for UDP peripheral ========== 

-#define AT91C_UDP_IMR   ((AT91_REG *) 	0xFFFB0018) // (UDP) Interrupt Mask Register

-#define AT91C_UDP_FADDR ((AT91_REG *) 	0xFFFB0008) // (UDP) Function Address Register

-#define AT91C_UDP_NUM   ((AT91_REG *) 	0xFFFB0000) // (UDP) Frame Number Register

-#define AT91C_UDP_FDR   ((AT91_REG *) 	0xFFFB0050) // (UDP) Endpoint FIFO Data Register

-#define AT91C_UDP_ISR   ((AT91_REG *) 	0xFFFB001C) // (UDP) Interrupt Status Register

-#define AT91C_UDP_CSR   ((AT91_REG *) 	0xFFFB0030) // (UDP) Endpoint Control and Status Register

-#define AT91C_UDP_IDR   ((AT91_REG *) 	0xFFFB0014) // (UDP) Interrupt Disable Register

-#define AT91C_UDP_ICR   ((AT91_REG *) 	0xFFFB0020) // (UDP) Interrupt Clear Register

-#define AT91C_UDP_RSTEP ((AT91_REG *) 	0xFFFB0028) // (UDP) Reset Endpoint Register

-#define AT91C_UDP_TXVC  ((AT91_REG *) 	0xFFFB0074) // (UDP) Transceiver Control Register

-#define AT91C_UDP_GLBSTATE ((AT91_REG *) 	0xFFFB0004) // (UDP) Global State Register

-#define AT91C_UDP_IER   ((AT91_REG *) 	0xFFFB0010) // (UDP) Interrupt Enable Register

-// ========== Register definition for TC0 peripheral ========== 

-#define AT91C_TC0_SR    ((AT91_REG *) 	0xFFFA0020) // (TC0) Status Register

-#define AT91C_TC0_RC    ((AT91_REG *) 	0xFFFA001C) // (TC0) Register C

-#define AT91C_TC0_RB    ((AT91_REG *) 	0xFFFA0018) // (TC0) Register B

-#define AT91C_TC0_CCR   ((AT91_REG *) 	0xFFFA0000) // (TC0) Channel Control Register

-#define AT91C_TC0_CMR   ((AT91_REG *) 	0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC0_IER   ((AT91_REG *) 	0xFFFA0024) // (TC0) Interrupt Enable Register

-#define AT91C_TC0_RA    ((AT91_REG *) 	0xFFFA0014) // (TC0) Register A

-#define AT91C_TC0_IDR   ((AT91_REG *) 	0xFFFA0028) // (TC0) Interrupt Disable Register

-#define AT91C_TC0_CV    ((AT91_REG *) 	0xFFFA0010) // (TC0) Counter Value

-#define AT91C_TC0_IMR   ((AT91_REG *) 	0xFFFA002C) // (TC0) Interrupt Mask Register

-// ========== Register definition for TC1 peripheral ========== 

-#define AT91C_TC1_RB    ((AT91_REG *) 	0xFFFA0058) // (TC1) Register B

-#define AT91C_TC1_CCR   ((AT91_REG *) 	0xFFFA0040) // (TC1) Channel Control Register

-#define AT91C_TC1_IER   ((AT91_REG *) 	0xFFFA0064) // (TC1) Interrupt Enable Register

-#define AT91C_TC1_IDR   ((AT91_REG *) 	0xFFFA0068) // (TC1) Interrupt Disable Register

-#define AT91C_TC1_SR    ((AT91_REG *) 	0xFFFA0060) // (TC1) Status Register

-#define AT91C_TC1_CMR   ((AT91_REG *) 	0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC1_RA    ((AT91_REG *) 	0xFFFA0054) // (TC1) Register A

-#define AT91C_TC1_RC    ((AT91_REG *) 	0xFFFA005C) // (TC1) Register C

-#define AT91C_TC1_IMR   ((AT91_REG *) 	0xFFFA006C) // (TC1) Interrupt Mask Register

-#define AT91C_TC1_CV    ((AT91_REG *) 	0xFFFA0050) // (TC1) Counter Value

-// ========== Register definition for TC2 peripheral ========== 

-#define AT91C_TC2_CMR   ((AT91_REG *) 	0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC2_CCR   ((AT91_REG *) 	0xFFFA0080) // (TC2) Channel Control Register

-#define AT91C_TC2_CV    ((AT91_REG *) 	0xFFFA0090) // (TC2) Counter Value

-#define AT91C_TC2_RA    ((AT91_REG *) 	0xFFFA0094) // (TC2) Register A

-#define AT91C_TC2_RB    ((AT91_REG *) 	0xFFFA0098) // (TC2) Register B

-#define AT91C_TC2_IDR   ((AT91_REG *) 	0xFFFA00A8) // (TC2) Interrupt Disable Register

-#define AT91C_TC2_IMR   ((AT91_REG *) 	0xFFFA00AC) // (TC2) Interrupt Mask Register

-#define AT91C_TC2_RC    ((AT91_REG *) 	0xFFFA009C) // (TC2) Register C

-#define AT91C_TC2_IER   ((AT91_REG *) 	0xFFFA00A4) // (TC2) Interrupt Enable Register

-#define AT91C_TC2_SR    ((AT91_REG *) 	0xFFFA00A0) // (TC2) Status Register

-// ========== Register definition for TCB peripheral ========== 

-#define AT91C_TCB_BMR   ((AT91_REG *) 	0xFFFA00C4) // (TCB) TC Block Mode Register

-#define AT91C_TCB_BCR   ((AT91_REG *) 	0xFFFA00C0) // (TCB) TC Block Control Register

-// ========== Register definition for CAN_MB0 peripheral ========== 

-#define AT91C_CAN_MB0_MDL ((AT91_REG *) 	0xFFFD0214) // (CAN_MB0) MailBox Data Low Register

-#define AT91C_CAN_MB0_MAM ((AT91_REG *) 	0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB0_MCR ((AT91_REG *) 	0xFFFD021C) // (CAN_MB0) MailBox Control Register

-#define AT91C_CAN_MB0_MID ((AT91_REG *) 	0xFFFD0208) // (CAN_MB0) MailBox ID Register

-#define AT91C_CAN_MB0_MSR ((AT91_REG *) 	0xFFFD0210) // (CAN_MB0) MailBox Status Register

-#define AT91C_CAN_MB0_MFID ((AT91_REG *) 	0xFFFD020C) // (CAN_MB0) MailBox Family ID Register

-#define AT91C_CAN_MB0_MDH ((AT91_REG *) 	0xFFFD0218) // (CAN_MB0) MailBox Data High Register

-#define AT91C_CAN_MB0_MMR ((AT91_REG *) 	0xFFFD0200) // (CAN_MB0) MailBox Mode Register

-// ========== Register definition for CAN_MB1 peripheral ========== 

-#define AT91C_CAN_MB1_MDL ((AT91_REG *) 	0xFFFD0234) // (CAN_MB1) MailBox Data Low Register

-#define AT91C_CAN_MB1_MID ((AT91_REG *) 	0xFFFD0228) // (CAN_MB1) MailBox ID Register

-#define AT91C_CAN_MB1_MMR ((AT91_REG *) 	0xFFFD0220) // (CAN_MB1) MailBox Mode Register

-#define AT91C_CAN_MB1_MSR ((AT91_REG *) 	0xFFFD0230) // (CAN_MB1) MailBox Status Register

-#define AT91C_CAN_MB1_MAM ((AT91_REG *) 	0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB1_MDH ((AT91_REG *) 	0xFFFD0238) // (CAN_MB1) MailBox Data High Register

-#define AT91C_CAN_MB1_MCR ((AT91_REG *) 	0xFFFD023C) // (CAN_MB1) MailBox Control Register

-#define AT91C_CAN_MB1_MFID ((AT91_REG *) 	0xFFFD022C) // (CAN_MB1) MailBox Family ID Register

-// ========== Register definition for CAN_MB2 peripheral ========== 

-#define AT91C_CAN_MB2_MCR ((AT91_REG *) 	0xFFFD025C) // (CAN_MB2) MailBox Control Register

-#define AT91C_CAN_MB2_MDH ((AT91_REG *) 	0xFFFD0258) // (CAN_MB2) MailBox Data High Register

-#define AT91C_CAN_MB2_MID ((AT91_REG *) 	0xFFFD0248) // (CAN_MB2) MailBox ID Register

-#define AT91C_CAN_MB2_MDL ((AT91_REG *) 	0xFFFD0254) // (CAN_MB2) MailBox Data Low Register

-#define AT91C_CAN_MB2_MMR ((AT91_REG *) 	0xFFFD0240) // (CAN_MB2) MailBox Mode Register

-#define AT91C_CAN_MB2_MAM ((AT91_REG *) 	0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB2_MFID ((AT91_REG *) 	0xFFFD024C) // (CAN_MB2) MailBox Family ID Register

-#define AT91C_CAN_MB2_MSR ((AT91_REG *) 	0xFFFD0250) // (CAN_MB2) MailBox Status Register

-// ========== Register definition for CAN_MB3 peripheral ========== 

-#define AT91C_CAN_MB3_MFID ((AT91_REG *) 	0xFFFD026C) // (CAN_MB3) MailBox Family ID Register

-#define AT91C_CAN_MB3_MAM ((AT91_REG *) 	0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB3_MID ((AT91_REG *) 	0xFFFD0268) // (CAN_MB3) MailBox ID Register

-#define AT91C_CAN_MB3_MCR ((AT91_REG *) 	0xFFFD027C) // (CAN_MB3) MailBox Control Register

-#define AT91C_CAN_MB3_MMR ((AT91_REG *) 	0xFFFD0260) // (CAN_MB3) MailBox Mode Register

-#define AT91C_CAN_MB3_MSR ((AT91_REG *) 	0xFFFD0270) // (CAN_MB3) MailBox Status Register

-#define AT91C_CAN_MB3_MDL ((AT91_REG *) 	0xFFFD0274) // (CAN_MB3) MailBox Data Low Register

-#define AT91C_CAN_MB3_MDH ((AT91_REG *) 	0xFFFD0278) // (CAN_MB3) MailBox Data High Register

-// ========== Register definition for CAN_MB4 peripheral ========== 

-#define AT91C_CAN_MB4_MID ((AT91_REG *) 	0xFFFD0288) // (CAN_MB4) MailBox ID Register

-#define AT91C_CAN_MB4_MMR ((AT91_REG *) 	0xFFFD0280) // (CAN_MB4) MailBox Mode Register

-#define AT91C_CAN_MB4_MDH ((AT91_REG *) 	0xFFFD0298) // (CAN_MB4) MailBox Data High Register

-#define AT91C_CAN_MB4_MFID ((AT91_REG *) 	0xFFFD028C) // (CAN_MB4) MailBox Family ID Register

-#define AT91C_CAN_MB4_MSR ((AT91_REG *) 	0xFFFD0290) // (CAN_MB4) MailBox Status Register

-#define AT91C_CAN_MB4_MCR ((AT91_REG *) 	0xFFFD029C) // (CAN_MB4) MailBox Control Register

-#define AT91C_CAN_MB4_MDL ((AT91_REG *) 	0xFFFD0294) // (CAN_MB4) MailBox Data Low Register

-#define AT91C_CAN_MB4_MAM ((AT91_REG *) 	0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register

-// ========== Register definition for CAN_MB5 peripheral ========== 

-#define AT91C_CAN_MB5_MSR ((AT91_REG *) 	0xFFFD02B0) // (CAN_MB5) MailBox Status Register

-#define AT91C_CAN_MB5_MCR ((AT91_REG *) 	0xFFFD02BC) // (CAN_MB5) MailBox Control Register

-#define AT91C_CAN_MB5_MFID ((AT91_REG *) 	0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register

-#define AT91C_CAN_MB5_MDH ((AT91_REG *) 	0xFFFD02B8) // (CAN_MB5) MailBox Data High Register

-#define AT91C_CAN_MB5_MID ((AT91_REG *) 	0xFFFD02A8) // (CAN_MB5) MailBox ID Register

-#define AT91C_CAN_MB5_MMR ((AT91_REG *) 	0xFFFD02A0) // (CAN_MB5) MailBox Mode Register

-#define AT91C_CAN_MB5_MDL ((AT91_REG *) 	0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register

-#define AT91C_CAN_MB5_MAM ((AT91_REG *) 	0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register

-// ========== Register definition for CAN_MB6 peripheral ========== 

-#define AT91C_CAN_MB6_MFID ((AT91_REG *) 	0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register

-#define AT91C_CAN_MB6_MID ((AT91_REG *) 	0xFFFD02C8) // (CAN_MB6) MailBox ID Register

-#define AT91C_CAN_MB6_MAM ((AT91_REG *) 	0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB6_MSR ((AT91_REG *) 	0xFFFD02D0) // (CAN_MB6) MailBox Status Register

-#define AT91C_CAN_MB6_MDL ((AT91_REG *) 	0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register

-#define AT91C_CAN_MB6_MCR ((AT91_REG *) 	0xFFFD02DC) // (CAN_MB6) MailBox Control Register

-#define AT91C_CAN_MB6_MDH ((AT91_REG *) 	0xFFFD02D8) // (CAN_MB6) MailBox Data High Register

-#define AT91C_CAN_MB6_MMR ((AT91_REG *) 	0xFFFD02C0) // (CAN_MB6) MailBox Mode Register

-// ========== Register definition for CAN_MB7 peripheral ========== 

-#define AT91C_CAN_MB7_MCR ((AT91_REG *) 	0xFFFD02FC) // (CAN_MB7) MailBox Control Register

-#define AT91C_CAN_MB7_MDH ((AT91_REG *) 	0xFFFD02F8) // (CAN_MB7) MailBox Data High Register

-#define AT91C_CAN_MB7_MFID ((AT91_REG *) 	0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register

-#define AT91C_CAN_MB7_MDL ((AT91_REG *) 	0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register

-#define AT91C_CAN_MB7_MID ((AT91_REG *) 	0xFFFD02E8) // (CAN_MB7) MailBox ID Register

-#define AT91C_CAN_MB7_MMR ((AT91_REG *) 	0xFFFD02E0) // (CAN_MB7) MailBox Mode Register

-#define AT91C_CAN_MB7_MAM ((AT91_REG *) 	0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB7_MSR ((AT91_REG *) 	0xFFFD02F0) // (CAN_MB7) MailBox Status Register

-// ========== Register definition for CAN peripheral ========== 

-#define AT91C_CAN_TCR   ((AT91_REG *) 	0xFFFD0024) // (CAN) Transfer Command Register

-#define AT91C_CAN_IMR   ((AT91_REG *) 	0xFFFD000C) // (CAN) Interrupt Mask Register

-#define AT91C_CAN_IER   ((AT91_REG *) 	0xFFFD0004) // (CAN) Interrupt Enable Register

-#define AT91C_CAN_ECR   ((AT91_REG *) 	0xFFFD0020) // (CAN) Error Counter Register

-#define AT91C_CAN_TIMESTP ((AT91_REG *) 	0xFFFD001C) // (CAN) Time Stamp Register

-#define AT91C_CAN_MR    ((AT91_REG *) 	0xFFFD0000) // (CAN) Mode Register

-#define AT91C_CAN_IDR   ((AT91_REG *) 	0xFFFD0008) // (CAN) Interrupt Disable Register

-#define AT91C_CAN_ACR   ((AT91_REG *) 	0xFFFD0028) // (CAN) Abort Command Register

-#define AT91C_CAN_TIM   ((AT91_REG *) 	0xFFFD0018) // (CAN) Timer Register

-#define AT91C_CAN_SR    ((AT91_REG *) 	0xFFFD0010) // (CAN) Status Register

-#define AT91C_CAN_BR    ((AT91_REG *) 	0xFFFD0014) // (CAN) Baudrate Register

-#define AT91C_CAN_VR    ((AT91_REG *) 	0xFFFD00FC) // (CAN) Version Register

-// ========== Register definition for EMAC peripheral ========== 

-#define AT91C_EMAC_ISR  ((AT91_REG *) 	0xFFFDC024) // (EMAC) Interrupt Status Register

-#define AT91C_EMAC_SA4H ((AT91_REG *) 	0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes

-#define AT91C_EMAC_SA1L ((AT91_REG *) 	0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes

-#define AT91C_EMAC_ELE  ((AT91_REG *) 	0xFFFDC078) // (EMAC) Excessive Length Errors Register

-#define AT91C_EMAC_LCOL ((AT91_REG *) 	0xFFFDC05C) // (EMAC) Late Collision Register

-#define AT91C_EMAC_RLE  ((AT91_REG *) 	0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register

-#define AT91C_EMAC_WOL  ((AT91_REG *) 	0xFFFDC0C4) // (EMAC) Wake On LAN Register

-#define AT91C_EMAC_DTF  ((AT91_REG *) 	0xFFFDC058) // (EMAC) Deferred Transmission Frame Register

-#define AT91C_EMAC_TUND ((AT91_REG *) 	0xFFFDC064) // (EMAC) Transmit Underrun Error Register

-#define AT91C_EMAC_NCR  ((AT91_REG *) 	0xFFFDC000) // (EMAC) Network Control Register

-#define AT91C_EMAC_SA4L ((AT91_REG *) 	0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes

-#define AT91C_EMAC_RSR  ((AT91_REG *) 	0xFFFDC020) // (EMAC) Receive Status Register

-#define AT91C_EMAC_SA3L ((AT91_REG *) 	0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes

-#define AT91C_EMAC_TSR  ((AT91_REG *) 	0xFFFDC014) // (EMAC) Transmit Status Register

-#define AT91C_EMAC_IDR  ((AT91_REG *) 	0xFFFDC02C) // (EMAC) Interrupt Disable Register

-#define AT91C_EMAC_RSE  ((AT91_REG *) 	0xFFFDC074) // (EMAC) Receive Symbol Errors Register

-#define AT91C_EMAC_ECOL ((AT91_REG *) 	0xFFFDC060) // (EMAC) Excessive Collision Register

-#define AT91C_EMAC_TID  ((AT91_REG *) 	0xFFFDC0B8) // (EMAC) Type ID Checking Register

-#define AT91C_EMAC_HRB  ((AT91_REG *) 	0xFFFDC090) // (EMAC) Hash Address Bottom[31:0]

-#define AT91C_EMAC_TBQP ((AT91_REG *) 	0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer

-#define AT91C_EMAC_USRIO ((AT91_REG *) 	0xFFFDC0C0) // (EMAC) USER Input/Output Register

-#define AT91C_EMAC_PTR  ((AT91_REG *) 	0xFFFDC038) // (EMAC) Pause Time Register

-#define AT91C_EMAC_SA2H ((AT91_REG *) 	0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes

-#define AT91C_EMAC_ROV  ((AT91_REG *) 	0xFFFDC070) // (EMAC) Receive Overrun Errors Register

-#define AT91C_EMAC_ALE  ((AT91_REG *) 	0xFFFDC054) // (EMAC) Alignment Error Register

-#define AT91C_EMAC_RJA  ((AT91_REG *) 	0xFFFDC07C) // (EMAC) Receive Jabbers Register

-#define AT91C_EMAC_RBQP ((AT91_REG *) 	0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer

-#define AT91C_EMAC_TPF  ((AT91_REG *) 	0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register

-#define AT91C_EMAC_NCFGR ((AT91_REG *) 	0xFFFDC004) // (EMAC) Network Configuration Register

-#define AT91C_EMAC_HRT  ((AT91_REG *) 	0xFFFDC094) // (EMAC) Hash Address Top[63:32]

-#define AT91C_EMAC_USF  ((AT91_REG *) 	0xFFFDC080) // (EMAC) Undersize Frames Register

-#define AT91C_EMAC_FCSE ((AT91_REG *) 	0xFFFDC050) // (EMAC) Frame Check Sequence Error Register

-#define AT91C_EMAC_TPQ  ((AT91_REG *) 	0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register

-#define AT91C_EMAC_MAN  ((AT91_REG *) 	0xFFFDC034) // (EMAC) PHY Maintenance Register

-#define AT91C_EMAC_FTO  ((AT91_REG *) 	0xFFFDC040) // (EMAC) Frames Transmitted OK Register

-#define AT91C_EMAC_REV  ((AT91_REG *) 	0xFFFDC0FC) // (EMAC) Revision Register

-#define AT91C_EMAC_IMR  ((AT91_REG *) 	0xFFFDC030) // (EMAC) Interrupt Mask Register

-#define AT91C_EMAC_SCF  ((AT91_REG *) 	0xFFFDC044) // (EMAC) Single Collision Frame Register

-#define AT91C_EMAC_PFR  ((AT91_REG *) 	0xFFFDC03C) // (EMAC) Pause Frames received Register

-#define AT91C_EMAC_MCF  ((AT91_REG *) 	0xFFFDC048) // (EMAC) Multiple Collision Frame Register

-#define AT91C_EMAC_NSR  ((AT91_REG *) 	0xFFFDC008) // (EMAC) Network Status Register

-#define AT91C_EMAC_SA2L ((AT91_REG *) 	0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes

-#define AT91C_EMAC_FRO  ((AT91_REG *) 	0xFFFDC04C) // (EMAC) Frames Received OK Register

-#define AT91C_EMAC_IER  ((AT91_REG *) 	0xFFFDC028) // (EMAC) Interrupt Enable Register

-#define AT91C_EMAC_SA1H ((AT91_REG *) 	0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes

-#define AT91C_EMAC_CSE  ((AT91_REG *) 	0xFFFDC068) // (EMAC) Carrier Sense Error Register

-#define AT91C_EMAC_SA3H ((AT91_REG *) 	0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes

-#define AT91C_EMAC_RRE  ((AT91_REG *) 	0xFFFDC06C) // (EMAC) Receive Ressource Error Register

-#define AT91C_EMAC_STE  ((AT91_REG *) 	0xFFFDC084) // (EMAC) SQE Test Error Register

-// ========== Register definition for PDC_ADC peripheral ========== 

-#define AT91C_ADC_PTSR  ((AT91_REG *) 	0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register

-#define AT91C_ADC_PTCR  ((AT91_REG *) 	0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register

-#define AT91C_ADC_TNPR  ((AT91_REG *) 	0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register

-#define AT91C_ADC_TNCR  ((AT91_REG *) 	0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register

-#define AT91C_ADC_RNPR  ((AT91_REG *) 	0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register

-#define AT91C_ADC_RNCR  ((AT91_REG *) 	0xFFFD8114) // (PDC_ADC) Receive Next Counter Register

-#define AT91C_ADC_RPR   ((AT91_REG *) 	0xFFFD8100) // (PDC_ADC) Receive Pointer Register

-#define AT91C_ADC_TCR   ((AT91_REG *) 	0xFFFD810C) // (PDC_ADC) Transmit Counter Register

-#define AT91C_ADC_TPR   ((AT91_REG *) 	0xFFFD8108) // (PDC_ADC) Transmit Pointer Register

-#define AT91C_ADC_RCR   ((AT91_REG *) 	0xFFFD8104) // (PDC_ADC) Receive Counter Register

-// ========== Register definition for ADC peripheral ========== 

-#define AT91C_ADC_CDR2  ((AT91_REG *) 	0xFFFD8038) // (ADC) ADC Channel Data Register 2

-#define AT91C_ADC_CDR3  ((AT91_REG *) 	0xFFFD803C) // (ADC) ADC Channel Data Register 3

-#define AT91C_ADC_CDR0  ((AT91_REG *) 	0xFFFD8030) // (ADC) ADC Channel Data Register 0

-#define AT91C_ADC_CDR5  ((AT91_REG *) 	0xFFFD8044) // (ADC) ADC Channel Data Register 5

-#define AT91C_ADC_CHDR  ((AT91_REG *) 	0xFFFD8014) // (ADC) ADC Channel Disable Register

-#define AT91C_ADC_SR    ((AT91_REG *) 	0xFFFD801C) // (ADC) ADC Status Register

-#define AT91C_ADC_CDR4  ((AT91_REG *) 	0xFFFD8040) // (ADC) ADC Channel Data Register 4

-#define AT91C_ADC_CDR1  ((AT91_REG *) 	0xFFFD8034) // (ADC) ADC Channel Data Register 1

-#define AT91C_ADC_LCDR  ((AT91_REG *) 	0xFFFD8020) // (ADC) ADC Last Converted Data Register

-#define AT91C_ADC_IDR   ((AT91_REG *) 	0xFFFD8028) // (ADC) ADC Interrupt Disable Register

-#define AT91C_ADC_CR    ((AT91_REG *) 	0xFFFD8000) // (ADC) ADC Control Register

-#define AT91C_ADC_CDR7  ((AT91_REG *) 	0xFFFD804C) // (ADC) ADC Channel Data Register 7

-#define AT91C_ADC_CDR6  ((AT91_REG *) 	0xFFFD8048) // (ADC) ADC Channel Data Register 6

-#define AT91C_ADC_IER   ((AT91_REG *) 	0xFFFD8024) // (ADC) ADC Interrupt Enable Register

-#define AT91C_ADC_CHER  ((AT91_REG *) 	0xFFFD8010) // (ADC) ADC Channel Enable Register

-#define AT91C_ADC_CHSR  ((AT91_REG *) 	0xFFFD8018) // (ADC) ADC Channel Status Register

-#define AT91C_ADC_MR    ((AT91_REG *) 	0xFFFD8004) // (ADC) ADC Mode Register

-#define AT91C_ADC_IMR   ((AT91_REG *) 	0xFFFD802C) // (ADC) ADC Interrupt Mask Register

-// ========== Register definition for PDC_AES peripheral ========== 

-#define AT91C_AES_TPR   ((AT91_REG *) 	0xFFFA4108) // (PDC_AES) Transmit Pointer Register

-#define AT91C_AES_PTCR  ((AT91_REG *) 	0xFFFA4120) // (PDC_AES) PDC Transfer Control Register

-#define AT91C_AES_RNPR  ((AT91_REG *) 	0xFFFA4110) // (PDC_AES) Receive Next Pointer Register

-#define AT91C_AES_TNCR  ((AT91_REG *) 	0xFFFA411C) // (PDC_AES) Transmit Next Counter Register

-#define AT91C_AES_TCR   ((AT91_REG *) 	0xFFFA410C) // (PDC_AES) Transmit Counter Register

-#define AT91C_AES_RCR   ((AT91_REG *) 	0xFFFA4104) // (PDC_AES) Receive Counter Register

-#define AT91C_AES_RNCR  ((AT91_REG *) 	0xFFFA4114) // (PDC_AES) Receive Next Counter Register

-#define AT91C_AES_TNPR  ((AT91_REG *) 	0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register

-#define AT91C_AES_RPR   ((AT91_REG *) 	0xFFFA4100) // (PDC_AES) Receive Pointer Register

-#define AT91C_AES_PTSR  ((AT91_REG *) 	0xFFFA4124) // (PDC_AES) PDC Transfer Status Register

-// ========== Register definition for AES peripheral ========== 

-#define AT91C_AES_IVxR  ((AT91_REG *) 	0xFFFA4060) // (AES) Initialization Vector x Register

-#define AT91C_AES_MR    ((AT91_REG *) 	0xFFFA4004) // (AES) Mode Register

-#define AT91C_AES_VR    ((AT91_REG *) 	0xFFFA40FC) // (AES) AES Version Register

-#define AT91C_AES_ODATAxR ((AT91_REG *) 	0xFFFA4050) // (AES) Output Data x Register

-#define AT91C_AES_IDATAxR ((AT91_REG *) 	0xFFFA4040) // (AES) Input Data x Register

-#define AT91C_AES_CR    ((AT91_REG *) 	0xFFFA4000) // (AES) Control Register

-#define AT91C_AES_IDR   ((AT91_REG *) 	0xFFFA4014) // (AES) Interrupt Disable Register

-#define AT91C_AES_IMR   ((AT91_REG *) 	0xFFFA4018) // (AES) Interrupt Mask Register

-#define AT91C_AES_IER   ((AT91_REG *) 	0xFFFA4010) // (AES) Interrupt Enable Register

-#define AT91C_AES_KEYWxR ((AT91_REG *) 	0xFFFA4020) // (AES) Key Word x Register

-#define AT91C_AES_ISR   ((AT91_REG *) 	0xFFFA401C) // (AES) Interrupt Status Register

-// ========== Register definition for PDC_TDES peripheral ========== 

-#define AT91C_TDES_RNCR ((AT91_REG *) 	0xFFFA8114) // (PDC_TDES) Receive Next Counter Register

-#define AT91C_TDES_TCR  ((AT91_REG *) 	0xFFFA810C) // (PDC_TDES) Transmit Counter Register

-#define AT91C_TDES_RCR  ((AT91_REG *) 	0xFFFA8104) // (PDC_TDES) Receive Counter Register

-#define AT91C_TDES_TNPR ((AT91_REG *) 	0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register

-#define AT91C_TDES_RNPR ((AT91_REG *) 	0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register

-#define AT91C_TDES_RPR  ((AT91_REG *) 	0xFFFA8100) // (PDC_TDES) Receive Pointer Register

-#define AT91C_TDES_TNCR ((AT91_REG *) 	0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register

-#define AT91C_TDES_TPR  ((AT91_REG *) 	0xFFFA8108) // (PDC_TDES) Transmit Pointer Register

-#define AT91C_TDES_PTSR ((AT91_REG *) 	0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register

-#define AT91C_TDES_PTCR ((AT91_REG *) 	0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register

-// ========== Register definition for TDES peripheral ========== 

-#define AT91C_TDES_KEY2WxR ((AT91_REG *) 	0xFFFA8028) // (TDES) Key 2 Word x Register

-#define AT91C_TDES_KEY3WxR ((AT91_REG *) 	0xFFFA8030) // (TDES) Key 3 Word x Register

-#define AT91C_TDES_IDR  ((AT91_REG *) 	0xFFFA8014) // (TDES) Interrupt Disable Register

-#define AT91C_TDES_VR   ((AT91_REG *) 	0xFFFA80FC) // (TDES) TDES Version Register

-#define AT91C_TDES_IVxR ((AT91_REG *) 	0xFFFA8060) // (TDES) Initialization Vector x Register

-#define AT91C_TDES_ODATAxR ((AT91_REG *) 	0xFFFA8050) // (TDES) Output Data x Register

-#define AT91C_TDES_IMR  ((AT91_REG *) 	0xFFFA8018) // (TDES) Interrupt Mask Register

-#define AT91C_TDES_MR   ((AT91_REG *) 	0xFFFA8004) // (TDES) Mode Register

-#define AT91C_TDES_CR   ((AT91_REG *) 	0xFFFA8000) // (TDES) Control Register

-#define AT91C_TDES_IER  ((AT91_REG *) 	0xFFFA8010) // (TDES) Interrupt Enable Register

-#define AT91C_TDES_ISR  ((AT91_REG *) 	0xFFFA801C) // (TDES) Interrupt Status Register

-#define AT91C_TDES_IDATAxR ((AT91_REG *) 	0xFFFA8040) // (TDES) Input Data x Register

-#define AT91C_TDES_KEY1WxR ((AT91_REG *) 	0xFFFA8020) // (TDES) Key 1 Word x Register

-

-// *****************************************************************************

-//               PIO DEFINITIONS FOR AT91SAM7X128

-// *****************************************************************************

-#define AT91C_PIO_PA0        ((unsigned int) 1 <<  0) // Pin Controlled by PA0

-#define AT91C_PA0_RXD0     ((unsigned int) AT91C_PIO_PA0) //  USART 0 Receive Data

-#define AT91C_PIO_PA1        ((unsigned int) 1 <<  1) // Pin Controlled by PA1

-#define AT91C_PA1_TXD0     ((unsigned int) AT91C_PIO_PA1) //  USART 0 Transmit Data

-#define AT91C_PIO_PA10       ((unsigned int) 1 << 10) // Pin Controlled by PA10

-#define AT91C_PA10_TWD      ((unsigned int) AT91C_PIO_PA10) //  TWI Two-wire Serial Data

-#define AT91C_PIO_PA11       ((unsigned int) 1 << 11) // Pin Controlled by PA11

-#define AT91C_PA11_TWCK     ((unsigned int) AT91C_PIO_PA11) //  TWI Two-wire Serial Clock

-#define AT91C_PIO_PA12       ((unsigned int) 1 << 12) // Pin Controlled by PA12

-#define AT91C_PA12_NPCS00   ((unsigned int) AT91C_PIO_PA12) //  SPI 0 Peripheral Chip Select 0

-#define AT91C_PIO_PA13       ((unsigned int) 1 << 13) // Pin Controlled by PA13

-#define AT91C_PA13_NPCS01   ((unsigned int) AT91C_PIO_PA13) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PA13_PCK1     ((unsigned int) AT91C_PIO_PA13) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PA14       ((unsigned int) 1 << 14) // Pin Controlled by PA14

-#define AT91C_PA14_NPCS02   ((unsigned int) AT91C_PIO_PA14) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PA14_IRQ1     ((unsigned int) AT91C_PIO_PA14) //  External Interrupt 1

-#define AT91C_PIO_PA15       ((unsigned int) 1 << 15) // Pin Controlled by PA15

-#define AT91C_PA15_NPCS03   ((unsigned int) AT91C_PIO_PA15) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PA15_TCLK2    ((unsigned int) AT91C_PIO_PA15) //  Timer Counter 2 external clock input

-#define AT91C_PIO_PA16       ((unsigned int) 1 << 16) // Pin Controlled by PA16

-#define AT91C_PA16_MISO0    ((unsigned int) AT91C_PIO_PA16) //  SPI 0 Master In Slave

-#define AT91C_PIO_PA17       ((unsigned int) 1 << 17) // Pin Controlled by PA17

-#define AT91C_PA17_MOSI0    ((unsigned int) AT91C_PIO_PA17) //  SPI 0 Master Out Slave

-#define AT91C_PIO_PA18       ((unsigned int) 1 << 18) // Pin Controlled by PA18

-#define AT91C_PA18_SPCK0    ((unsigned int) AT91C_PIO_PA18) //  SPI 0 Serial Clock

-#define AT91C_PIO_PA19       ((unsigned int) 1 << 19) // Pin Controlled by PA19

-#define AT91C_PA19_CANRX    ((unsigned int) AT91C_PIO_PA19) //  CAN Receive

-#define AT91C_PIO_PA2        ((unsigned int) 1 <<  2) // Pin Controlled by PA2

-#define AT91C_PA2_SCK0     ((unsigned int) AT91C_PIO_PA2) //  USART 0 Serial Clock

-#define AT91C_PA2_NPCS11   ((unsigned int) AT91C_PIO_PA2) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PA20       ((unsigned int) 1 << 20) // Pin Controlled by PA20

-#define AT91C_PA20_CANTX    ((unsigned int) AT91C_PIO_PA20) //  CAN Transmit

-#define AT91C_PIO_PA21       ((unsigned int) 1 << 21) // Pin Controlled by PA21

-#define AT91C_PA21_TF       ((unsigned int) AT91C_PIO_PA21) //  SSC Transmit Frame Sync

-#define AT91C_PA21_NPCS10   ((unsigned int) AT91C_PIO_PA21) //  SPI 1 Peripheral Chip Select 0

-#define AT91C_PIO_PA22       ((unsigned int) 1 << 22) // Pin Controlled by PA22

-#define AT91C_PA22_TK       ((unsigned int) AT91C_PIO_PA22) //  SSC Transmit Clock

-#define AT91C_PA22_SPCK1    ((unsigned int) AT91C_PIO_PA22) //  SPI 1 Serial Clock

-#define AT91C_PIO_PA23       ((unsigned int) 1 << 23) // Pin Controlled by PA23

-#define AT91C_PA23_TD       ((unsigned int) AT91C_PIO_PA23) //  SSC Transmit data

-#define AT91C_PA23_MOSI1    ((unsigned int) AT91C_PIO_PA23) //  SPI 1 Master Out Slave

-#define AT91C_PIO_PA24       ((unsigned int) 1 << 24) // Pin Controlled by PA24

-#define AT91C_PA24_RD       ((unsigned int) AT91C_PIO_PA24) //  SSC Receive Data

-#define AT91C_PA24_MISO1    ((unsigned int) AT91C_PIO_PA24) //  SPI 1 Master In Slave

-#define AT91C_PIO_PA25       ((unsigned int) 1 << 25) // Pin Controlled by PA25

-#define AT91C_PA25_RK       ((unsigned int) AT91C_PIO_PA25) //  SSC Receive Clock

-#define AT91C_PA25_NPCS11   ((unsigned int) AT91C_PIO_PA25) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PA26       ((unsigned int) 1 << 26) // Pin Controlled by PA26

-#define AT91C_PA26_RF       ((unsigned int) AT91C_PIO_PA26) //  SSC Receive Frame Sync

-#define AT91C_PA26_NPCS12   ((unsigned int) AT91C_PIO_PA26) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PA27       ((unsigned int) 1 << 27) // Pin Controlled by PA27

-#define AT91C_PA27_DRXD     ((unsigned int) AT91C_PIO_PA27) //  DBGU Debug Receive Data

-#define AT91C_PA27_PCK3     ((unsigned int) AT91C_PIO_PA27) //  PMC Programmable Clock Output 3

-#define AT91C_PIO_PA28       ((unsigned int) 1 << 28) // Pin Controlled by PA28

-#define AT91C_PA28_DTXD     ((unsigned int) AT91C_PIO_PA28) //  DBGU Debug Transmit Data

-#define AT91C_PIO_PA29       ((unsigned int) 1 << 29) // Pin Controlled by PA29

-#define AT91C_PA29_FIQ      ((unsigned int) AT91C_PIO_PA29) //  AIC Fast Interrupt Input

-#define AT91C_PA29_NPCS13   ((unsigned int) AT91C_PIO_PA29) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PA3        ((unsigned int) 1 <<  3) // Pin Controlled by PA3

-#define AT91C_PA3_RTS0     ((unsigned int) AT91C_PIO_PA3) //  USART 0 Ready To Send

-#define AT91C_PA3_NPCS12   ((unsigned int) AT91C_PIO_PA3) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PA30       ((unsigned int) 1 << 30) // Pin Controlled by PA30

-#define AT91C_PA30_IRQ0     ((unsigned int) AT91C_PIO_PA30) //  External Interrupt 0

-#define AT91C_PA30_PCK2     ((unsigned int) AT91C_PIO_PA30) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PA4        ((unsigned int) 1 <<  4) // Pin Controlled by PA4

-#define AT91C_PA4_CTS0     ((unsigned int) AT91C_PIO_PA4) //  USART 0 Clear To Send

-#define AT91C_PA4_NPCS13   ((unsigned int) AT91C_PIO_PA4) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PA5        ((unsigned int) 1 <<  5) // Pin Controlled by PA5

-#define AT91C_PA5_RXD1     ((unsigned int) AT91C_PIO_PA5) //  USART 1 Receive Data

-#define AT91C_PIO_PA6        ((unsigned int) 1 <<  6) // Pin Controlled by PA6

-#define AT91C_PA6_TXD1     ((unsigned int) AT91C_PIO_PA6) //  USART 1 Transmit Data

-#define AT91C_PIO_PA7        ((unsigned int) 1 <<  7) // Pin Controlled by PA7

-#define AT91C_PA7_SCK1     ((unsigned int) AT91C_PIO_PA7) //  USART 1 Serial Clock

-#define AT91C_PA7_NPCS01   ((unsigned int) AT91C_PIO_PA7) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PIO_PA8        ((unsigned int) 1 <<  8) // Pin Controlled by PA8

-#define AT91C_PA8_RTS1     ((unsigned int) AT91C_PIO_PA8) //  USART 1 Ready To Send

-#define AT91C_PA8_NPCS02   ((unsigned int) AT91C_PIO_PA8) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PIO_PA9        ((unsigned int) 1 <<  9) // Pin Controlled by PA9

-#define AT91C_PA9_CTS1     ((unsigned int) AT91C_PIO_PA9) //  USART 1 Clear To Send

-#define AT91C_PA9_NPCS03   ((unsigned int) AT91C_PIO_PA9) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PIO_PB0        ((unsigned int) 1 <<  0) // Pin Controlled by PB0

-#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) //  Ethernet MAC Transmit Clock/Reference Clock

-#define AT91C_PB0_PCK0     ((unsigned int) AT91C_PIO_PB0) //  PMC Programmable Clock Output 0

-#define AT91C_PIO_PB1        ((unsigned int) 1 <<  1) // Pin Controlled by PB1

-#define AT91C_PB1_ETXEN    ((unsigned int) AT91C_PIO_PB1) //  Ethernet MAC Transmit Enable

-#define AT91C_PIO_PB10       ((unsigned int) 1 << 10) // Pin Controlled by PB10

-#define AT91C_PB10_ETX2     ((unsigned int) AT91C_PIO_PB10) //  Ethernet MAC Transmit Data 2

-#define AT91C_PB10_NPCS11   ((unsigned int) AT91C_PIO_PB10) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PB11       ((unsigned int) 1 << 11) // Pin Controlled by PB11

-#define AT91C_PB11_ETX3     ((unsigned int) AT91C_PIO_PB11) //  Ethernet MAC Transmit Data 3

-#define AT91C_PB11_NPCS12   ((unsigned int) AT91C_PIO_PB11) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PB12       ((unsigned int) 1 << 12) // Pin Controlled by PB12

-#define AT91C_PB12_ETXER    ((unsigned int) AT91C_PIO_PB12) //  Ethernet MAC Transmikt Coding Error

-#define AT91C_PB12_TCLK0    ((unsigned int) AT91C_PIO_PB12) //  Timer Counter 0 external clock input

-#define AT91C_PIO_PB13       ((unsigned int) 1 << 13) // Pin Controlled by PB13

-#define AT91C_PB13_ERX2     ((unsigned int) AT91C_PIO_PB13) //  Ethernet MAC Receive Data 2

-#define AT91C_PB13_NPCS01   ((unsigned int) AT91C_PIO_PB13) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PIO_PB14       ((unsigned int) 1 << 14) // Pin Controlled by PB14

-#define AT91C_PB14_ERX3     ((unsigned int) AT91C_PIO_PB14) //  Ethernet MAC Receive Data 3

-#define AT91C_PB14_NPCS02   ((unsigned int) AT91C_PIO_PB14) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PIO_PB15       ((unsigned int) 1 << 15) // Pin Controlled by PB15

-#define AT91C_PB15_ERXDV    ((unsigned int) AT91C_PIO_PB15) //  Ethernet MAC Receive Data Valid

-#define AT91C_PIO_PB16       ((unsigned int) 1 << 16) // Pin Controlled by PB16

-#define AT91C_PB16_ECOL     ((unsigned int) AT91C_PIO_PB16) //  Ethernet MAC Collision Detected

-#define AT91C_PB16_NPCS13   ((unsigned int) AT91C_PIO_PB16) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PB17       ((unsigned int) 1 << 17) // Pin Controlled by PB17

-#define AT91C_PB17_ERXCK    ((unsigned int) AT91C_PIO_PB17) //  Ethernet MAC Receive Clock

-#define AT91C_PB17_NPCS03   ((unsigned int) AT91C_PIO_PB17) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PIO_PB18       ((unsigned int) 1 << 18) // Pin Controlled by PB18

-#define AT91C_PB18_EF100    ((unsigned int) AT91C_PIO_PB18) //  Ethernet MAC Force 100 Mbits/sec

-#define AT91C_PB18_ADTRG    ((unsigned int) AT91C_PIO_PB18) //  ADC External Trigger

-#define AT91C_PIO_PB19       ((unsigned int) 1 << 19) // Pin Controlled by PB19

-#define AT91C_PB19_PWM0     ((unsigned int) AT91C_PIO_PB19) //  PWM Channel 0

-#define AT91C_PB19_TCLK1    ((unsigned int) AT91C_PIO_PB19) //  Timer Counter 1 external clock input

-#define AT91C_PIO_PB2        ((unsigned int) 1 <<  2) // Pin Controlled by PB2

-#define AT91C_PB2_ETX0     ((unsigned int) AT91C_PIO_PB2) //  Ethernet MAC Transmit Data 0

-#define AT91C_PIO_PB20       ((unsigned int) 1 << 20) // Pin Controlled by PB20

-#define AT91C_PB20_PWM1     ((unsigned int) AT91C_PIO_PB20) //  PWM Channel 1

-#define AT91C_PB20_PCK0     ((unsigned int) AT91C_PIO_PB20) //  PMC Programmable Clock Output 0

-#define AT91C_PIO_PB21       ((unsigned int) 1 << 21) // Pin Controlled by PB21

-#define AT91C_PB21_PWM2     ((unsigned int) AT91C_PIO_PB21) //  PWM Channel 2

-#define AT91C_PB21_PCK1     ((unsigned int) AT91C_PIO_PB21) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PB22       ((unsigned int) 1 << 22) // Pin Controlled by PB22

-#define AT91C_PB22_PWM3     ((unsigned int) AT91C_PIO_PB22) //  PWM Channel 3

-#define AT91C_PB22_PCK2     ((unsigned int) AT91C_PIO_PB22) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PB23       ((unsigned int) 1 << 23) // Pin Controlled by PB23

-#define AT91C_PB23_TIOA0    ((unsigned int) AT91C_PIO_PB23) //  Timer Counter 0 Multipurpose Timer I/O Pin A

-#define AT91C_PB23_DCD1     ((unsigned int) AT91C_PIO_PB23) //  USART 1 Data Carrier Detect

-#define AT91C_PIO_PB24       ((unsigned int) 1 << 24) // Pin Controlled by PB24

-#define AT91C_PB24_TIOB0    ((unsigned int) AT91C_PIO_PB24) //  Timer Counter 0 Multipurpose Timer I/O Pin B

-#define AT91C_PB24_DSR1     ((unsigned int) AT91C_PIO_PB24) //  USART 1 Data Set ready

-#define AT91C_PIO_PB25       ((unsigned int) 1 << 25) // Pin Controlled by PB25

-#define AT91C_PB25_TIOA1    ((unsigned int) AT91C_PIO_PB25) //  Timer Counter 1 Multipurpose Timer I/O Pin A

-#define AT91C_PB25_DTR1     ((unsigned int) AT91C_PIO_PB25) //  USART 1 Data Terminal ready

-#define AT91C_PIO_PB26       ((unsigned int) 1 << 26) // Pin Controlled by PB26

-#define AT91C_PB26_TIOB1    ((unsigned int) AT91C_PIO_PB26) //  Timer Counter 1 Multipurpose Timer I/O Pin B

-#define AT91C_PB26_RI1      ((unsigned int) AT91C_PIO_PB26) //  USART 1 Ring Indicator

-#define AT91C_PIO_PB27       ((unsigned int) 1 << 27) // Pin Controlled by PB27

-#define AT91C_PB27_TIOA2    ((unsigned int) AT91C_PIO_PB27) //  Timer Counter 2 Multipurpose Timer I/O Pin A

-#define AT91C_PB27_PWM0     ((unsigned int) AT91C_PIO_PB27) //  PWM Channel 0

-#define AT91C_PIO_PB28       ((unsigned int) 1 << 28) // Pin Controlled by PB28

-#define AT91C_PB28_TIOB2    ((unsigned int) AT91C_PIO_PB28) //  Timer Counter 2 Multipurpose Timer I/O Pin B

-#define AT91C_PB28_PWM1     ((unsigned int) AT91C_PIO_PB28) //  PWM Channel 1

-#define AT91C_PIO_PB29       ((unsigned int) 1 << 29) // Pin Controlled by PB29

-#define AT91C_PB29_PCK1     ((unsigned int) AT91C_PIO_PB29) //  PMC Programmable Clock Output 1

-#define AT91C_PB29_PWM2     ((unsigned int) AT91C_PIO_PB29) //  PWM Channel 2

-#define AT91C_PIO_PB3        ((unsigned int) 1 <<  3) // Pin Controlled by PB3

-#define AT91C_PB3_ETX1     ((unsigned int) AT91C_PIO_PB3) //  Ethernet MAC Transmit Data 1

-#define AT91C_PIO_PB30       ((unsigned int) 1 << 30) // Pin Controlled by PB30

-#define AT91C_PB30_PCK2     ((unsigned int) AT91C_PIO_PB30) //  PMC Programmable Clock Output 2

-#define AT91C_PB30_PWM3     ((unsigned int) AT91C_PIO_PB30) //  PWM Channel 3

-#define AT91C_PIO_PB4        ((unsigned int) 1 <<  4) // Pin Controlled by PB4

-#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) //  Ethernet MAC Carrier Sense/Carrier Sense and Data Valid

-#define AT91C_PIO_PB5        ((unsigned int) 1 <<  5) // Pin Controlled by PB5

-#define AT91C_PB5_ERX0     ((unsigned int) AT91C_PIO_PB5) //  Ethernet MAC Receive Data 0

-#define AT91C_PIO_PB6        ((unsigned int) 1 <<  6) // Pin Controlled by PB6

-#define AT91C_PB6_ERX1     ((unsigned int) AT91C_PIO_PB6) //  Ethernet MAC Receive Data 1

-#define AT91C_PIO_PB7        ((unsigned int) 1 <<  7) // Pin Controlled by PB7

-#define AT91C_PB7_ERXER    ((unsigned int) AT91C_PIO_PB7) //  Ethernet MAC Receive Error

-#define AT91C_PIO_PB8        ((unsigned int) 1 <<  8) // Pin Controlled by PB8

-#define AT91C_PB8_EMDC     ((unsigned int) AT91C_PIO_PB8) //  Ethernet MAC Management Data Clock

-#define AT91C_PIO_PB9        ((unsigned int) 1 <<  9) // Pin Controlled by PB9

-#define AT91C_PB9_EMDIO    ((unsigned int) AT91C_PIO_PB9) //  Ethernet MAC Management Data Input/Output

-

-// *****************************************************************************

-//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7X128

-// *****************************************************************************

-#define AT91C_ID_FIQ    ((unsigned int)  0) // Advanced Interrupt Controller (FIQ)

-#define AT91C_ID_SYS    ((unsigned int)  1) // System Peripheral

-#define AT91C_ID_PIOA   ((unsigned int)  2) // Parallel IO Controller A

-#define AT91C_ID_PIOB   ((unsigned int)  3) // Parallel IO Controller B

-#define AT91C_ID_SPI0   ((unsigned int)  4) // Serial Peripheral Interface 0

-#define AT91C_ID_SPI1   ((unsigned int)  5) // Serial Peripheral Interface 1

-#define AT91C_ID_US0    ((unsigned int)  6) // USART 0

-#define AT91C_ID_US1    ((unsigned int)  7) // USART 1

-#define AT91C_ID_SSC    ((unsigned int)  8) // Serial Synchronous Controller

-#define AT91C_ID_TWI    ((unsigned int)  9) // Two-Wire Interface

-#define AT91C_ID_PWMC   ((unsigned int) 10) // PWM Controller

-#define AT91C_ID_UDP    ((unsigned int) 11) // USB Device Port

-#define AT91C_ID_TC0    ((unsigned int) 12) // Timer Counter 0

-#define AT91C_ID_TC1    ((unsigned int) 13) // Timer Counter 1

-#define AT91C_ID_TC2    ((unsigned int) 14) // Timer Counter 2

-#define AT91C_ID_CAN    ((unsigned int) 15) // Control Area Network Controller

-#define AT91C_ID_EMAC   ((unsigned int) 16) // Ethernet MAC

-#define AT91C_ID_ADC    ((unsigned int) 17) // Analog-to-Digital Converter

-#define AT91C_ID_AES    ((unsigned int) 18) // Advanced Encryption Standard 128-bit

-#define AT91C_ID_TDES   ((unsigned int) 19) // Triple Data Encryption Standard

-#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved

-#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved

-#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved

-#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved

-#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved

-#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved

-#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved

-#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved

-#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved

-#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved

-#define AT91C_ID_IRQ0   ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0)

-#define AT91C_ID_IRQ1   ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1)

-

-// *****************************************************************************

-//               BASE ADDRESS DEFINITIONS FOR AT91SAM7X128

-// *****************************************************************************

-#define AT91C_BASE_SYS       ((AT91PS_SYS) 	0xFFFFF000) // (SYS) Base Address

-#define AT91C_BASE_AIC       ((AT91PS_AIC) 	0xFFFFF000) // (AIC) Base Address

-#define AT91C_BASE_PDC_DBGU  ((AT91PS_PDC) 	0xFFFFF300) // (PDC_DBGU) Base Address

-#define AT91C_BASE_DBGU      ((AT91PS_DBGU) 	0xFFFFF200) // (DBGU) Base Address

-#define AT91C_BASE_PIOA      ((AT91PS_PIO) 	0xFFFFF400) // (PIOA) Base Address

-#define AT91C_BASE_PIOB      ((AT91PS_PIO) 	0xFFFFF600) // (PIOB) Base Address

-#define AT91C_BASE_CKGR      ((AT91PS_CKGR) 	0xFFFFFC20) // (CKGR) Base Address

-#define AT91C_BASE_PMC       ((AT91PS_PMC) 	0xFFFFFC00) // (PMC) Base Address

-#define AT91C_BASE_RSTC      ((AT91PS_RSTC) 	0xFFFFFD00) // (RSTC) Base Address

-#define AT91C_BASE_RTTC      ((AT91PS_RTTC) 	0xFFFFFD20) // (RTTC) Base Address

-#define AT91C_BASE_PITC      ((AT91PS_PITC) 	0xFFFFFD30) // (PITC) Base Address

-#define AT91C_BASE_WDTC      ((AT91PS_WDTC) 	0xFFFFFD40) // (WDTC) Base Address

-#define AT91C_BASE_VREG      ((AT91PS_VREG) 	0xFFFFFD60) // (VREG) Base Address

-#define AT91C_BASE_MC        ((AT91PS_MC) 	0xFFFFFF00) // (MC) Base Address

-#define AT91C_BASE_PDC_SPI1  ((AT91PS_PDC) 	0xFFFE4100) // (PDC_SPI1) Base Address

-#define AT91C_BASE_SPI1      ((AT91PS_SPI) 	0xFFFE4000) // (SPI1) Base Address

-#define AT91C_BASE_PDC_SPI0  ((AT91PS_PDC) 	0xFFFE0100) // (PDC_SPI0) Base Address

-#define AT91C_BASE_SPI0      ((AT91PS_SPI) 	0xFFFE0000) // (SPI0) Base Address

-#define AT91C_BASE_PDC_US1   ((AT91PS_PDC) 	0xFFFC4100) // (PDC_US1) Base Address

-#define AT91C_BASE_US1       ((AT91PS_USART) 	0xFFFC4000) // (US1) Base Address

-#define AT91C_BASE_PDC_US0   ((AT91PS_PDC) 	0xFFFC0100) // (PDC_US0) Base Address

-#define AT91C_BASE_US0       ((AT91PS_USART) 	0xFFFC0000) // (US0) Base Address

-#define AT91C_BASE_PDC_SSC   ((AT91PS_PDC) 	0xFFFD4100) // (PDC_SSC) Base Address

-#define AT91C_BASE_SSC       ((AT91PS_SSC) 	0xFFFD4000) // (SSC) Base Address

-#define AT91C_BASE_TWI       ((AT91PS_TWI) 	0xFFFB8000) // (TWI) Base Address

-#define AT91C_BASE_PWMC_CH3  ((AT91PS_PWMC_CH) 	0xFFFCC260) // (PWMC_CH3) Base Address

-#define AT91C_BASE_PWMC_CH2  ((AT91PS_PWMC_CH) 	0xFFFCC240) // (PWMC_CH2) Base Address

-#define AT91C_BASE_PWMC_CH1  ((AT91PS_PWMC_CH) 	0xFFFCC220) // (PWMC_CH1) Base Address

-#define AT91C_BASE_PWMC_CH0  ((AT91PS_PWMC_CH) 	0xFFFCC200) // (PWMC_CH0) Base Address

-#define AT91C_BASE_PWMC      ((AT91PS_PWMC) 	0xFFFCC000) // (PWMC) Base Address

-#define AT91C_BASE_UDP       ((AT91PS_UDP) 	0xFFFB0000) // (UDP) Base Address

-#define AT91C_BASE_TC0       ((AT91PS_TC) 	0xFFFA0000) // (TC0) Base Address

-#define AT91C_BASE_TC1       ((AT91PS_TC) 	0xFFFA0040) // (TC1) Base Address

-#define AT91C_BASE_TC2       ((AT91PS_TC) 	0xFFFA0080) // (TC2) Base Address

-#define AT91C_BASE_TCB       ((AT91PS_TCB) 	0xFFFA0000) // (TCB) Base Address

-#define AT91C_BASE_CAN_MB0   ((AT91PS_CAN_MB) 	0xFFFD0200) // (CAN_MB0) Base Address

-#define AT91C_BASE_CAN_MB1   ((AT91PS_CAN_MB) 	0xFFFD0220) // (CAN_MB1) Base Address

-#define AT91C_BASE_CAN_MB2   ((AT91PS_CAN_MB) 	0xFFFD0240) // (CAN_MB2) Base Address

-#define AT91C_BASE_CAN_MB3   ((AT91PS_CAN_MB) 	0xFFFD0260) // (CAN_MB3) Base Address

-#define AT91C_BASE_CAN_MB4   ((AT91PS_CAN_MB) 	0xFFFD0280) // (CAN_MB4) Base Address

-#define AT91C_BASE_CAN_MB5   ((AT91PS_CAN_MB) 	0xFFFD02A0) // (CAN_MB5) Base Address

-#define AT91C_BASE_CAN_MB6   ((AT91PS_CAN_MB) 	0xFFFD02C0) // (CAN_MB6) Base Address

-#define AT91C_BASE_CAN_MB7   ((AT91PS_CAN_MB) 	0xFFFD02E0) // (CAN_MB7) Base Address

-#define AT91C_BASE_CAN       ((AT91PS_CAN) 	0xFFFD0000) // (CAN) Base Address

-#define AT91C_BASE_EMAC      ((AT91PS_EMAC) 	0xFFFDC000) // (EMAC) Base Address

-#define AT91C_BASE_PDC_ADC   ((AT91PS_PDC) 	0xFFFD8100) // (PDC_ADC) Base Address

-#define AT91C_BASE_ADC       ((AT91PS_ADC) 	0xFFFD8000) // (ADC) Base Address

-#define AT91C_BASE_PDC_AES   ((AT91PS_PDC) 	0xFFFA4100) // (PDC_AES) Base Address

-#define AT91C_BASE_AES       ((AT91PS_AES) 	0xFFFA4000) // (AES) Base Address

-#define AT91C_BASE_PDC_TDES  ((AT91PS_PDC) 	0xFFFA8100) // (PDC_TDES) Base Address

-#define AT91C_BASE_TDES      ((AT91PS_TDES) 	0xFFFA8000) // (TDES) Base Address

-

-// *****************************************************************************

-//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7X128

-// *****************************************************************************

-#define AT91C_ISRAM	 ((char *) 	0x00200000) // Internal SRAM base address

-#define AT91C_ISRAM_SIZE	 ((unsigned int) 0x00008000) // Internal SRAM size in byte (32 Kbyte)

-#define AT91C_IFLASH	 ((char *) 	0x00100000) // Internal ROM base address

-#define AT91C_IFLASH_SIZE	 ((unsigned int) 0x00020000) // Internal ROM size in byte (128 Kbyte)

-

-#endif

+//  ----------------------------------------------------------------------------
+//          ATMEL Microcontroller Software Support  -  ROUSSET  -
+//  ----------------------------------------------------------------------------
+//  DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+//  DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//  ----------------------------------------------------------------------------
+// File Name           : AT91SAM7X128.h
+// Object              : AT91SAM7X128 definitions
+// Generated           : AT91 SW Application Group  05/20/2005 (16:22:23)
+//
+// CVS Reference       : /AT91SAM7X128.pl/1.14/Tue May 10 12:12:05 2005//
+// CVS Reference       : /SYS_SAM7X.pl/1.3/Tue Feb  1 17:01:43 2005//
+// CVS Reference       : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005//
+// CVS Reference       : /PMC_SAM7X.pl/1.4/Tue Feb  8 13:58:10 2005//
+// CVS Reference       : /RSTC_SAM7X.pl/1.1/Tue Feb  1 16:16:26 2005//
+// CVS Reference       : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005//
+// CVS Reference       : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005//
+// CVS Reference       : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005//
+// CVS Reference       : /PIO_6057A.pl/1.2/Thu Feb  3 10:18:28 2005//
+// CVS Reference       : /RTTC_6081A.pl/1.2/Tue Nov  9 14:43:58 2004//
+// CVS Reference       : /PITC_6079A.pl/1.2/Tue Nov  9 14:43:56 2004//
+// CVS Reference       : /WDTC_6080A.pl/1.3/Tue Nov  9 14:44:00 2004//
+// CVS Reference       : /VREG_6085B.pl/1.1/Tue Feb  1 16:05:48 2005//
+// CVS Reference       : /PDC_6074C.pl/1.2/Thu Feb  3 08:48:54 2005//
+// CVS Reference       : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005//
+// CVS Reference       : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005//
+// CVS Reference       : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004//
+// CVS Reference       : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004//
+// CVS Reference       : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004//
+// CVS Reference       : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005//
+// CVS Reference       : /CAN_6019B.pl/1.1/Tue Mar  8 12:42:22 2005//
+// CVS Reference       : /EMACB_6119A.pl/1.5/Thu Feb  3 15:52:04 2005//
+// CVS Reference       : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003//
+// CVS Reference       : /AES_6149A.pl/1.10/Mon Feb  7 09:44:25 2005//
+// CVS Reference       : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005//
+//  ----------------------------------------------------------------------------
+
+#ifndef AT91SAM7X128_H
+#define AT91SAM7X128_H
+
+typedef volatile unsigned int AT91_REG;// Hardware register definition
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR System Peripherals
+// *****************************************************************************
+typedef struct _AT91S_SYS {
+    AT91_REG     AIC_SMR[32];   // Source Mode Register
+    AT91_REG     AIC_SVR[32];   // Source Vector Register
+    AT91_REG     AIC_IVR;   // IRQ Vector Register
+    AT91_REG     AIC_FVR;   // FIQ Vector Register
+    AT91_REG     AIC_ISR;   // Interrupt Status Register
+    AT91_REG     AIC_IPR;   // Interrupt Pending Register
+    AT91_REG     AIC_IMR;   // Interrupt Mask Register
+    AT91_REG     AIC_CISR;  // Core Interrupt Status Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     AIC_IECR;  // Interrupt Enable Command Register
+    AT91_REG     AIC_IDCR;  // Interrupt Disable Command Register
+    AT91_REG     AIC_ICCR;  // Interrupt Clear Command Register
+    AT91_REG     AIC_ISCR;  // Interrupt Set Command Register
+    AT91_REG     AIC_EOICR;     // End of Interrupt Command Register
+    AT91_REG     AIC_SPU;   // Spurious Vector Register
+    AT91_REG     AIC_DCR;   // Debug Control Register (Protect)
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     AIC_FFER;  // Fast Forcing Enable Register
+    AT91_REG     AIC_FFDR;  // Fast Forcing Disable Register
+    AT91_REG     AIC_FFSR;  // Fast Forcing Status Register
+    AT91_REG     Reserved2[45];     //
+    AT91_REG     DBGU_CR;   // Control Register
+    AT91_REG     DBGU_MR;   // Mode Register
+    AT91_REG     DBGU_IER;  // Interrupt Enable Register
+    AT91_REG     DBGU_IDR;  // Interrupt Disable Register
+    AT91_REG     DBGU_IMR;  // Interrupt Mask Register
+    AT91_REG     DBGU_CSR;  // Channel Status Register
+    AT91_REG     DBGU_RHR;  // Receiver Holding Register
+    AT91_REG     DBGU_THR;  // Transmitter Holding Register
+    AT91_REG     DBGU_BRGR;     // Baud Rate Generator Register
+    AT91_REG     Reserved3[7];  //
+    AT91_REG     DBGU_CIDR;     // Chip ID Register
+    AT91_REG     DBGU_EXID;     // Chip ID Extension Register
+    AT91_REG     DBGU_FNTR;     // Force NTRST Register
+    AT91_REG     Reserved4[45];     //
+    AT91_REG     DBGU_RPR;  // Receive Pointer Register
+    AT91_REG     DBGU_RCR;  // Receive Counter Register
+    AT91_REG     DBGU_TPR;  // Transmit Pointer Register
+    AT91_REG     DBGU_TCR;  // Transmit Counter Register
+    AT91_REG     DBGU_RNPR;     // Receive Next Pointer Register
+    AT91_REG     DBGU_RNCR;     // Receive Next Counter Register
+    AT91_REG     DBGU_TNPR;     // Transmit Next Pointer Register
+    AT91_REG     DBGU_TNCR;     // Transmit Next Counter Register
+    AT91_REG     DBGU_PTCR;     // PDC Transfer Control Register
+    AT91_REG     DBGU_PTSR;     // PDC Transfer Status Register
+    AT91_REG     Reserved5[54];     //
+    AT91_REG     PIOA_PER;  // PIO Enable Register
+    AT91_REG     PIOA_PDR;  // PIO Disable Register
+    AT91_REG     PIOA_PSR;  // PIO Status Register
+    AT91_REG     Reserved6[1];  //
+    AT91_REG     PIOA_OER;  // Output Enable Register
+    AT91_REG     PIOA_ODR;  // Output Disable Registerr
+    AT91_REG     PIOA_OSR;  // Output Status Register
+    AT91_REG     Reserved7[1];  //
+    AT91_REG     PIOA_IFER;     // Input Filter Enable Register
+    AT91_REG     PIOA_IFDR;     // Input Filter Disable Register
+    AT91_REG     PIOA_IFSR;     // Input Filter Status Register
+    AT91_REG     Reserved8[1];  //
+    AT91_REG     PIOA_SODR;     // Set Output Data Register
+    AT91_REG     PIOA_CODR;     // Clear Output Data Register
+    AT91_REG     PIOA_ODSR;     // Output Data Status Register
+    AT91_REG     PIOA_PDSR;     // Pin Data Status Register
+    AT91_REG     PIOA_IER;  // Interrupt Enable Register
+    AT91_REG     PIOA_IDR;  // Interrupt Disable Register
+    AT91_REG     PIOA_IMR;  // Interrupt Mask Register
+    AT91_REG     PIOA_ISR;  // Interrupt Status Register
+    AT91_REG     PIOA_MDER;     // Multi-driver Enable Register
+    AT91_REG     PIOA_MDDR;     // Multi-driver Disable Register
+    AT91_REG     PIOA_MDSR;     // Multi-driver Status Register
+    AT91_REG     Reserved9[1];  //
+    AT91_REG     PIOA_PPUDR;    // Pull-up Disable Register
+    AT91_REG     PIOA_PPUER;    // Pull-up Enable Register
+    AT91_REG     PIOA_PPUSR;    // Pull-up Status Register
+    AT91_REG     Reserved10[1];     //
+    AT91_REG     PIOA_ASR;  // Select A Register
+    AT91_REG     PIOA_BSR;  // Select B Register
+    AT91_REG     PIOA_ABSR;     // AB Select Status Register
+    AT91_REG     Reserved11[9];     //
+    AT91_REG     PIOA_OWER;     // Output Write Enable Register
+    AT91_REG     PIOA_OWDR;     // Output Write Disable Register
+    AT91_REG     PIOA_OWSR;     // Output Write Status Register
+    AT91_REG     Reserved12[85];    //
+    AT91_REG     PIOB_PER;  // PIO Enable Register
+    AT91_REG     PIOB_PDR;  // PIO Disable Register
+    AT91_REG     PIOB_PSR;  // PIO Status Register
+    AT91_REG     Reserved13[1];     //
+    AT91_REG     PIOB_OER;  // Output Enable Register
+    AT91_REG     PIOB_ODR;  // Output Disable Registerr
+    AT91_REG     PIOB_OSR;  // Output Status Register
+    AT91_REG     Reserved14[1];     //
+    AT91_REG     PIOB_IFER;     // Input Filter Enable Register
+    AT91_REG     PIOB_IFDR;     // Input Filter Disable Register
+    AT91_REG     PIOB_IFSR;     // Input Filter Status Register
+    AT91_REG     Reserved15[1];     //
+    AT91_REG     PIOB_SODR;     // Set Output Data Register
+    AT91_REG     PIOB_CODR;     // Clear Output Data Register
+    AT91_REG     PIOB_ODSR;     // Output Data Status Register
+    AT91_REG     PIOB_PDSR;     // Pin Data Status Register
+    AT91_REG     PIOB_IER;  // Interrupt Enable Register
+    AT91_REG     PIOB_IDR;  // Interrupt Disable Register
+    AT91_REG     PIOB_IMR;  // Interrupt Mask Register
+    AT91_REG     PIOB_ISR;  // Interrupt Status Register
+    AT91_REG     PIOB_MDER;     // Multi-driver Enable Register
+    AT91_REG     PIOB_MDDR;     // Multi-driver Disable Register
+    AT91_REG     PIOB_MDSR;     // Multi-driver Status Register
+    AT91_REG     Reserved16[1];     //
+    AT91_REG     PIOB_PPUDR;    // Pull-up Disable Register
+    AT91_REG     PIOB_PPUER;    // Pull-up Enable Register
+    AT91_REG     PIOB_PPUSR;    // Pull-up Status Register
+    AT91_REG     Reserved17[1];     //
+    AT91_REG     PIOB_ASR;  // Select A Register
+    AT91_REG     PIOB_BSR;  // Select B Register
+    AT91_REG     PIOB_ABSR;     // AB Select Status Register
+    AT91_REG     Reserved18[9];     //
+    AT91_REG     PIOB_OWER;     // Output Write Enable Register
+    AT91_REG     PIOB_OWDR;     // Output Write Disable Register
+    AT91_REG     PIOB_OWSR;     // Output Write Status Register
+    AT91_REG     Reserved19[341];   //
+    AT91_REG     PMC_SCER;  // System Clock Enable Register
+    AT91_REG     PMC_SCDR;  // System Clock Disable Register
+    AT91_REG     PMC_SCSR;  // System Clock Status Register
+    AT91_REG     Reserved20[1];     //
+    AT91_REG     PMC_PCER;  // Peripheral Clock Enable Register
+    AT91_REG     PMC_PCDR;  // Peripheral Clock Disable Register
+    AT91_REG     PMC_PCSR;  // Peripheral Clock Status Register
+    AT91_REG     Reserved21[1];     //
+    AT91_REG     PMC_MOR;   // Main Oscillator Register
+    AT91_REG     PMC_MCFR;  // Main Clock  Frequency Register
+    AT91_REG     Reserved22[1];     //
+    AT91_REG     PMC_PLLR;  // PLL Register
+    AT91_REG     PMC_MCKR;  // Master Clock Register
+    AT91_REG     Reserved23[3];     //
+    AT91_REG     PMC_PCKR[4];   // Programmable Clock Register
+    AT91_REG     Reserved24[4];     //
+    AT91_REG     PMC_IER;   // Interrupt Enable Register
+    AT91_REG     PMC_IDR;   // Interrupt Disable Register
+    AT91_REG     PMC_SR;    // Status Register
+    AT91_REG     PMC_IMR;   // Interrupt Mask Register
+    AT91_REG     Reserved25[36];    //
+    AT91_REG     RSTC_RCR;  // Reset Control Register
+    AT91_REG     RSTC_RSR;  // Reset Status Register
+    AT91_REG     RSTC_RMR;  // Reset Mode Register
+    AT91_REG     Reserved26[5];     //
+    AT91_REG     RTTC_RTMR;     // Real-time Mode Register
+    AT91_REG     RTTC_RTAR;     // Real-time Alarm Register
+    AT91_REG     RTTC_RTVR;     // Real-time Value Register
+    AT91_REG     RTTC_RTSR;     // Real-time Status Register
+    AT91_REG     PITC_PIMR;     // Period Interval Mode Register
+    AT91_REG     PITC_PISR;     // Period Interval Status Register
+    AT91_REG     PITC_PIVR;     // Period Interval Value Register
+    AT91_REG     PITC_PIIR;     // Period Interval Image Register
+    AT91_REG     WDTC_WDCR;     // Watchdog Control Register
+    AT91_REG     WDTC_WDMR;     // Watchdog Mode Register
+    AT91_REG     WDTC_WDSR;     // Watchdog Status Register
+    AT91_REG     Reserved27[5];     //
+    AT91_REG     VREG_MR;   // Voltage Regulator Mode Register
+} AT91S_SYS, *AT91PS_SYS;
+
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller
+// *****************************************************************************
+typedef struct _AT91S_AIC {
+    AT91_REG     AIC_SMR[32];   // Source Mode Register
+    AT91_REG     AIC_SVR[32];   // Source Vector Register
+    AT91_REG     AIC_IVR;   // IRQ Vector Register
+    AT91_REG     AIC_FVR;   // FIQ Vector Register
+    AT91_REG     AIC_ISR;   // Interrupt Status Register
+    AT91_REG     AIC_IPR;   // Interrupt Pending Register
+    AT91_REG     AIC_IMR;   // Interrupt Mask Register
+    AT91_REG     AIC_CISR;  // Core Interrupt Status Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     AIC_IECR;  // Interrupt Enable Command Register
+    AT91_REG     AIC_IDCR;  // Interrupt Disable Command Register
+    AT91_REG     AIC_ICCR;  // Interrupt Clear Command Register
+    AT91_REG     AIC_ISCR;  // Interrupt Set Command Register
+    AT91_REG     AIC_EOICR;     // End of Interrupt Command Register
+    AT91_REG     AIC_SPU;   // Spurious Vector Register
+    AT91_REG     AIC_DCR;   // Debug Control Register (Protect)
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     AIC_FFER;  // Fast Forcing Enable Register
+    AT91_REG     AIC_FFDR;  // Fast Forcing Disable Register
+    AT91_REG     AIC_FFSR;  // Fast Forcing Status Register
+} AT91S_AIC, *AT91PS_AIC;
+
+// -------- AIC_SMR : (AIC Offset: 0x0) Control Register --------
+#define AT91C_AIC_PRIOR       ((unsigned int) 0x7 <<  0) // (AIC) Priority Level
+#define     AT91C_AIC_PRIOR_LOWEST               ((unsigned int) 0x0) // (AIC) Lowest priority level
+#define     AT91C_AIC_PRIOR_HIGHEST              ((unsigned int) 0x7) // (AIC) Highest priority level
+#define AT91C_AIC_SRCTYPE     ((unsigned int) 0x3 <<  5) // (AIC) Interrupt Source Type
+#define     AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL       ((unsigned int) 0x0 <<  5) // (AIC) Internal Sources Code Label High-level Sensitive
+#define     AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL        ((unsigned int) 0x0 <<  5) // (AIC) External Sources Code Label Low-level Sensitive
+#define     AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE    ((unsigned int) 0x1 <<  5) // (AIC) Internal Sources Code Label Positive Edge triggered
+#define     AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE    ((unsigned int) 0x1 <<  5) // (AIC) External Sources Code Label Negative Edge triggered
+#define     AT91C_AIC_SRCTYPE_HIGH_LEVEL           ((unsigned int) 0x2 <<  5) // (AIC) Internal Or External Sources Code Label High-level Sensitive
+#define     AT91C_AIC_SRCTYPE_POSITIVE_EDGE        ((unsigned int) 0x3 <<  5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered
+// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register --------
+#define AT91C_AIC_NFIQ        ((unsigned int) 0x1 <<  0) // (AIC) NFIQ Status
+#define AT91C_AIC_NIRQ        ((unsigned int) 0x1 <<  1) // (AIC) NIRQ Status
+// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) --------
+#define AT91C_AIC_DCR_PROT    ((unsigned int) 0x1 <<  0) // (AIC) Protection Mode
+#define AT91C_AIC_DCR_GMSK    ((unsigned int) 0x1 <<  1) // (AIC) General Mask
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Peripheral DMA Controller
+// *****************************************************************************
+typedef struct _AT91S_PDC {
+    AT91_REG     PDC_RPR;   // Receive Pointer Register
+    AT91_REG     PDC_RCR;   // Receive Counter Register
+    AT91_REG     PDC_TPR;   // Transmit Pointer Register
+    AT91_REG     PDC_TCR;   // Transmit Counter Register
+    AT91_REG     PDC_RNPR;  // Receive Next Pointer Register
+    AT91_REG     PDC_RNCR;  // Receive Next Counter Register
+    AT91_REG     PDC_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     PDC_TNCR;  // Transmit Next Counter Register
+    AT91_REG     PDC_PTCR;  // PDC Transfer Control Register
+    AT91_REG     PDC_PTSR;  // PDC Transfer Status Register
+} AT91S_PDC, *AT91PS_PDC;
+
+// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register --------
+#define AT91C_PDC_RXTEN       ((unsigned int) 0x1 <<  0) // (PDC) Receiver Transfer Enable
+#define AT91C_PDC_RXTDIS      ((unsigned int) 0x1 <<  1) // (PDC) Receiver Transfer Disable
+#define AT91C_PDC_TXTEN       ((unsigned int) 0x1 <<  8) // (PDC) Transmitter Transfer Enable
+#define AT91C_PDC_TXTDIS      ((unsigned int) 0x1 <<  9) // (PDC) Transmitter Transfer Disable
+// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Debug Unit
+// *****************************************************************************
+typedef struct _AT91S_DBGU {
+    AT91_REG     DBGU_CR;   // Control Register
+    AT91_REG     DBGU_MR;   // Mode Register
+    AT91_REG     DBGU_IER;  // Interrupt Enable Register
+    AT91_REG     DBGU_IDR;  // Interrupt Disable Register
+    AT91_REG     DBGU_IMR;  // Interrupt Mask Register
+    AT91_REG     DBGU_CSR;  // Channel Status Register
+    AT91_REG     DBGU_RHR;  // Receiver Holding Register
+    AT91_REG     DBGU_THR;  // Transmitter Holding Register
+    AT91_REG     DBGU_BRGR;     // Baud Rate Generator Register
+    AT91_REG     Reserved0[7];  //
+    AT91_REG     DBGU_CIDR;     // Chip ID Register
+    AT91_REG     DBGU_EXID;     // Chip ID Extension Register
+    AT91_REG     DBGU_FNTR;     // Force NTRST Register
+    AT91_REG     Reserved1[45];     //
+    AT91_REG     DBGU_RPR;  // Receive Pointer Register
+    AT91_REG     DBGU_RCR;  // Receive Counter Register
+    AT91_REG     DBGU_TPR;  // Transmit Pointer Register
+    AT91_REG     DBGU_TCR;  // Transmit Counter Register
+    AT91_REG     DBGU_RNPR;     // Receive Next Pointer Register
+    AT91_REG     DBGU_RNCR;     // Receive Next Counter Register
+    AT91_REG     DBGU_TNPR;     // Transmit Next Pointer Register
+    AT91_REG     DBGU_TNCR;     // Transmit Next Counter Register
+    AT91_REG     DBGU_PTCR;     // PDC Transfer Control Register
+    AT91_REG     DBGU_PTSR;     // PDC Transfer Status Register
+} AT91S_DBGU, *AT91PS_DBGU;
+
+// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_RSTRX        ((unsigned int) 0x1 <<  2) // (DBGU) Reset Receiver
+#define AT91C_US_RSTTX        ((unsigned int) 0x1 <<  3) // (DBGU) Reset Transmitter
+#define AT91C_US_RXEN         ((unsigned int) 0x1 <<  4) // (DBGU) Receiver Enable
+#define AT91C_US_RXDIS        ((unsigned int) 0x1 <<  5) // (DBGU) Receiver Disable
+#define AT91C_US_TXEN         ((unsigned int) 0x1 <<  6) // (DBGU) Transmitter Enable
+#define AT91C_US_TXDIS        ((unsigned int) 0x1 <<  7) // (DBGU) Transmitter Disable
+#define AT91C_US_RSTSTA       ((unsigned int) 0x1 <<  8) // (DBGU) Reset Status Bits
+// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_PAR          ((unsigned int) 0x7 <<  9) // (DBGU) Parity type
+#define     AT91C_US_PAR_EVEN                 ((unsigned int) 0x0 <<  9) // (DBGU) Even Parity
+#define     AT91C_US_PAR_ODD                  ((unsigned int) 0x1 <<  9) // (DBGU) Odd Parity
+#define     AT91C_US_PAR_SPACE                ((unsigned int) 0x2 <<  9) // (DBGU) Parity forced to 0 (Space)
+#define     AT91C_US_PAR_MARK                 ((unsigned int) 0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)
+#define     AT91C_US_PAR_NONE                 ((unsigned int) 0x4 <<  9) // (DBGU) No Parity
+#define     AT91C_US_PAR_MULTI_DROP           ((unsigned int) 0x6 <<  9) // (DBGU) Multi-drop mode
+#define AT91C_US_CHMODE       ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode
+#define     AT91C_US_CHMODE_NORMAL               ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.
+#define     AT91C_US_CHMODE_AUTO                 ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.
+#define     AT91C_US_CHMODE_LOCAL                ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.
+#define     AT91C_US_CHMODE_REMOTE               ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.
+// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXRDY        ((unsigned int) 0x1 <<  0) // (DBGU) RXRDY Interrupt
+#define AT91C_US_TXRDY        ((unsigned int) 0x1 <<  1) // (DBGU) TXRDY Interrupt
+#define AT91C_US_ENDRX        ((unsigned int) 0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt
+#define AT91C_US_ENDTX        ((unsigned int) 0x1 <<  4) // (DBGU) End of Transmit Interrupt
+#define AT91C_US_OVRE         ((unsigned int) 0x1 <<  5) // (DBGU) Overrun Interrupt
+#define AT91C_US_FRAME        ((unsigned int) 0x1 <<  6) // (DBGU) Framing Error Interrupt
+#define AT91C_US_PARE         ((unsigned int) 0x1 <<  7) // (DBGU) Parity Error Interrupt
+#define AT91C_US_TXEMPTY      ((unsigned int) 0x1 <<  9) // (DBGU) TXEMPTY Interrupt
+#define AT91C_US_TXBUFE       ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt
+#define AT91C_US_RXBUFF       ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt
+#define AT91C_US_COMM_TX      ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt
+#define AT91C_US_COMM_RX      ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt
+// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register --------
+// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register --------
+#define AT91C_US_FORCE_NTRST  ((unsigned int) 0x1 <<  0) // (DBGU) Force NTRST in JTAG
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler
+// *****************************************************************************
+typedef struct _AT91S_PIO {
+    AT91_REG     PIO_PER;   // PIO Enable Register
+    AT91_REG     PIO_PDR;   // PIO Disable Register
+    AT91_REG     PIO_PSR;   // PIO Status Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     PIO_OER;   // Output Enable Register
+    AT91_REG     PIO_ODR;   // Output Disable Registerr
+    AT91_REG     PIO_OSR;   // Output Status Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     PIO_IFER;  // Input Filter Enable Register
+    AT91_REG     PIO_IFDR;  // Input Filter Disable Register
+    AT91_REG     PIO_IFSR;  // Input Filter Status Register
+    AT91_REG     Reserved2[1];  //
+    AT91_REG     PIO_SODR;  // Set Output Data Register
+    AT91_REG     PIO_CODR;  // Clear Output Data Register
+    AT91_REG     PIO_ODSR;  // Output Data Status Register
+    AT91_REG     PIO_PDSR;  // Pin Data Status Register
+    AT91_REG     PIO_IER;   // Interrupt Enable Register
+    AT91_REG     PIO_IDR;   // Interrupt Disable Register
+    AT91_REG     PIO_IMR;   // Interrupt Mask Register
+    AT91_REG     PIO_ISR;   // Interrupt Status Register
+    AT91_REG     PIO_MDER;  // Multi-driver Enable Register
+    AT91_REG     PIO_MDDR;  // Multi-driver Disable Register
+    AT91_REG     PIO_MDSR;  // Multi-driver Status Register
+    AT91_REG     Reserved3[1];  //
+    AT91_REG     PIO_PPUDR;     // Pull-up Disable Register
+    AT91_REG     PIO_PPUER;     // Pull-up Enable Register
+    AT91_REG     PIO_PPUSR;     // Pull-up Status Register
+    AT91_REG     Reserved4[1];  //
+    AT91_REG     PIO_ASR;   // Select A Register
+    AT91_REG     PIO_BSR;   // Select B Register
+    AT91_REG     PIO_ABSR;  // AB Select Status Register
+    AT91_REG     Reserved5[9];  //
+    AT91_REG     PIO_OWER;  // Output Write Enable Register
+    AT91_REG     PIO_OWDR;  // Output Write Disable Register
+    AT91_REG     PIO_OWSR;  // Output Write Status Register
+} AT91S_PIO, *AT91PS_PIO;
+
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Clock Generator Controler
+// *****************************************************************************
+typedef struct _AT91S_CKGR {
+    AT91_REG     CKGR_MOR;  // Main Oscillator Register
+    AT91_REG     CKGR_MCFR;     // Main Clock  Frequency Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     CKGR_PLLR;     // PLL Register
+} AT91S_CKGR, *AT91PS_CKGR;
+
+// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register --------
+#define AT91C_CKGR_MOSCEN     ((unsigned int) 0x1 <<  0) // (CKGR) Main Oscillator Enable
+#define AT91C_CKGR_OSCBYPASS  ((unsigned int) 0x1 <<  1) // (CKGR) Main Oscillator Bypass
+#define AT91C_CKGR_OSCOUNT    ((unsigned int) 0xFF <<  8) // (CKGR) Main Oscillator Start-up Time
+// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register --------
+#define AT91C_CKGR_MAINF      ((unsigned int) 0xFFFF <<  0) // (CKGR) Main Clock Frequency
+#define AT91C_CKGR_MAINRDY    ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready
+// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register --------
+#define AT91C_CKGR_DIV        ((unsigned int) 0xFF <<  0) // (CKGR) Divider Selected
+#define     AT91C_CKGR_DIV_0                    ((unsigned int) 0x0) // (CKGR) Divider output is 0
+#define     AT91C_CKGR_DIV_BYPASS               ((unsigned int) 0x1) // (CKGR) Divider is bypassed
+#define AT91C_CKGR_PLLCOUNT   ((unsigned int) 0x3F <<  8) // (CKGR) PLL Counter
+#define AT91C_CKGR_OUT        ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range
+#define     AT91C_CKGR_OUT_0                    ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_1                    ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_2                    ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_3                    ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet
+#define AT91C_CKGR_MUL        ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier
+#define AT91C_CKGR_USBDIV     ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks
+#define     AT91C_CKGR_USBDIV_0                    ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output
+#define     AT91C_CKGR_USBDIV_1                    ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2
+#define     AT91C_CKGR_USBDIV_2                    ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Power Management Controler
+// *****************************************************************************
+typedef struct _AT91S_PMC {
+    AT91_REG     PMC_SCER;  // System Clock Enable Register
+    AT91_REG     PMC_SCDR;  // System Clock Disable Register
+    AT91_REG     PMC_SCSR;  // System Clock Status Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     PMC_PCER;  // Peripheral Clock Enable Register
+    AT91_REG     PMC_PCDR;  // Peripheral Clock Disable Register
+    AT91_REG     PMC_PCSR;  // Peripheral Clock Status Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     PMC_MOR;   // Main Oscillator Register
+    AT91_REG     PMC_MCFR;  // Main Clock  Frequency Register
+    AT91_REG     Reserved2[1];  //
+    AT91_REG     PMC_PLLR;  // PLL Register
+    AT91_REG     PMC_MCKR;  // Master Clock Register
+    AT91_REG     Reserved3[3];  //
+    AT91_REG     PMC_PCKR[4];   // Programmable Clock Register
+    AT91_REG     Reserved4[4];  //
+    AT91_REG     PMC_IER;   // Interrupt Enable Register
+    AT91_REG     PMC_IDR;   // Interrupt Disable Register
+    AT91_REG     PMC_SR;    // Status Register
+    AT91_REG     PMC_IMR;   // Interrupt Mask Register
+} AT91S_PMC, *AT91PS_PMC;
+
+// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register --------
+#define AT91C_PMC_PCK         ((unsigned int) 0x1 <<  0) // (PMC) Processor Clock
+#define AT91C_PMC_UDP         ((unsigned int) 0x1 <<  7) // (PMC) USB Device Port Clock
+#define AT91C_PMC_PCK0        ((unsigned int) 0x1 <<  8) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK1        ((unsigned int) 0x1 <<  9) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK2        ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK3        ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output
+// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register --------
+// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register --------
+// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register --------
+// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register --------
+// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register --------
+// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register --------
+#define AT91C_PMC_CSS         ((unsigned int) 0x3 <<  0) // (PMC) Programmable Clock Selection
+#define     AT91C_PMC_CSS_SLOW_CLK             ((unsigned int) 0x0) // (PMC) Slow Clock is selected
+#define     AT91C_PMC_CSS_MAIN_CLK             ((unsigned int) 0x1) // (PMC) Main Clock is selected
+#define     AT91C_PMC_CSS_PLL_CLK              ((unsigned int) 0x3) // (PMC) Clock from PLL is selected
+#define AT91C_PMC_PRES        ((unsigned int) 0x7 <<  2) // (PMC) Programmable Clock Prescaler
+#define     AT91C_PMC_PRES_CLK                  ((unsigned int) 0x0 <<  2) // (PMC) Selected clock
+#define     AT91C_PMC_PRES_CLK_2                ((unsigned int) 0x1 <<  2) // (PMC) Selected clock divided by 2
+#define     AT91C_PMC_PRES_CLK_4                ((unsigned int) 0x2 <<  2) // (PMC) Selected clock divided by 4
+#define     AT91C_PMC_PRES_CLK_8                ((unsigned int) 0x3 <<  2) // (PMC) Selected clock divided by 8
+#define     AT91C_PMC_PRES_CLK_16               ((unsigned int) 0x4 <<  2) // (PMC) Selected clock divided by 16
+#define     AT91C_PMC_PRES_CLK_32               ((unsigned int) 0x5 <<  2) // (PMC) Selected clock divided by 32
+#define     AT91C_PMC_PRES_CLK_64               ((unsigned int) 0x6 <<  2) // (PMC) Selected clock divided by 64
+// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register --------
+// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register --------
+#define AT91C_PMC_MOSCS       ((unsigned int) 0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask
+#define AT91C_PMC_LOCK        ((unsigned int) 0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask
+#define AT91C_PMC_MCKRDY      ((unsigned int) 0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK0RDY     ((unsigned int) 0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK1RDY     ((unsigned int) 0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK2RDY     ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK3RDY     ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask
+// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register --------
+// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register --------
+// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Reset Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_RSTC {
+    AT91_REG     RSTC_RCR;  // Reset Control Register
+    AT91_REG     RSTC_RSR;  // Reset Status Register
+    AT91_REG     RSTC_RMR;  // Reset Mode Register
+} AT91S_RSTC, *AT91PS_RSTC;
+
+// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register --------
+#define AT91C_RSTC_PROCRST    ((unsigned int) 0x1 <<  0) // (RSTC) Processor Reset
+#define AT91C_RSTC_PERRST     ((unsigned int) 0x1 <<  2) // (RSTC) Peripheral Reset
+#define AT91C_RSTC_EXTRST     ((unsigned int) 0x1 <<  3) // (RSTC) External Reset
+#define AT91C_RSTC_KEY        ((unsigned int) 0xFF << 24) // (RSTC) Password
+// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register --------
+#define AT91C_RSTC_URSTS      ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Status
+#define AT91C_RSTC_BODSTS     ((unsigned int) 0x1 <<  1) // (RSTC) Brownout Detection Status
+#define AT91C_RSTC_RSTTYP     ((unsigned int) 0x7 <<  8) // (RSTC) Reset Type
+#define     AT91C_RSTC_RSTTYP_POWERUP              ((unsigned int) 0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.
+#define     AT91C_RSTC_RSTTYP_WAKEUP               ((unsigned int) 0x1 <<  8) // (RSTC) WakeUp Reset. VDDCORE rising.
+#define     AT91C_RSTC_RSTTYP_WATCHDOG             ((unsigned int) 0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.
+#define     AT91C_RSTC_RSTTYP_SOFTWARE             ((unsigned int) 0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.
+#define     AT91C_RSTC_RSTTYP_USER                 ((unsigned int) 0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.
+#define     AT91C_RSTC_RSTTYP_BROWNOUT             ((unsigned int) 0x5 <<  8) // (RSTC) Brownout Reset occured.
+#define AT91C_RSTC_NRSTL      ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level
+#define AT91C_RSTC_SRCMP      ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress.
+// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register --------
+#define AT91C_RSTC_URSTEN     ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Enable
+#define AT91C_RSTC_URSTIEN    ((unsigned int) 0x1 <<  4) // (RSTC) User Reset Interrupt Enable
+#define AT91C_RSTC_ERSTL      ((unsigned int) 0xF <<  8) // (RSTC) User Reset Enable
+#define AT91C_RSTC_BODIEN     ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_RTTC {
+    AT91_REG     RTTC_RTMR;     // Real-time Mode Register
+    AT91_REG     RTTC_RTAR;     // Real-time Alarm Register
+    AT91_REG     RTTC_RTVR;     // Real-time Value Register
+    AT91_REG     RTTC_RTSR;     // Real-time Status Register
+} AT91S_RTTC, *AT91PS_RTTC;
+
+// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register --------
+#define AT91C_RTTC_RTPRES     ((unsigned int) 0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value
+#define AT91C_RTTC_ALMIEN     ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable
+#define AT91C_RTTC_RTTINCIEN  ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable
+#define AT91C_RTTC_RTTRST     ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart
+// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register --------
+#define AT91C_RTTC_ALMV       ((unsigned int) 0x0 <<  0) // (RTTC) Alarm Value
+// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register --------
+#define AT91C_RTTC_CRTV       ((unsigned int) 0x0 <<  0) // (RTTC) Current Real-time Value
+// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register --------
+#define AT91C_RTTC_ALMS       ((unsigned int) 0x1 <<  0) // (RTTC) Real-time Alarm Status
+#define AT91C_RTTC_RTTINC     ((unsigned int) 0x1 <<  1) // (RTTC) Real-time Timer Increment
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_PITC {
+    AT91_REG     PITC_PIMR;     // Period Interval Mode Register
+    AT91_REG     PITC_PISR;     // Period Interval Status Register
+    AT91_REG     PITC_PIVR;     // Period Interval Value Register
+    AT91_REG     PITC_PIIR;     // Period Interval Image Register
+} AT91S_PITC, *AT91PS_PITC;
+
+// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register --------
+#define AT91C_PITC_PIV        ((unsigned int) 0xFFFFF <<  0) // (PITC) Periodic Interval Value
+#define AT91C_PITC_PITEN      ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled
+#define AT91C_PITC_PITIEN     ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable
+// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register --------
+#define AT91C_PITC_PITS       ((unsigned int) 0x1 <<  0) // (PITC) Periodic Interval Timer Status
+// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register --------
+#define AT91C_PITC_CPIV       ((unsigned int) 0xFFFFF <<  0) // (PITC) Current Periodic Interval Value
+#define AT91C_PITC_PICNT      ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter
+// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_WDTC {
+    AT91_REG     WDTC_WDCR;     // Watchdog Control Register
+    AT91_REG     WDTC_WDMR;     // Watchdog Mode Register
+    AT91_REG     WDTC_WDSR;     // Watchdog Status Register
+} AT91S_WDTC, *AT91PS_WDTC;
+
+// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register --------
+#define AT91C_WDTC_WDRSTT     ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Restart
+#define AT91C_WDTC_KEY        ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password
+// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register --------
+#define AT91C_WDTC_WDV        ((unsigned int) 0xFFF <<  0) // (WDTC) Watchdog Timer Restart
+#define AT91C_WDTC_WDFIEN     ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable
+#define AT91C_WDTC_WDRSTEN    ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable
+#define AT91C_WDTC_WDRPROC    ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart
+#define AT91C_WDTC_WDDIS      ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable
+#define AT91C_WDTC_WDD        ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value
+#define AT91C_WDTC_WDDBGHLT   ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt
+#define AT91C_WDTC_WDIDLEHLT  ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt
+// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register --------
+#define AT91C_WDTC_WDUNF      ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Underflow
+#define AT91C_WDTC_WDERR      ((unsigned int) 0x1 <<  1) // (WDTC) Watchdog Error
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Voltage Regulator Mode Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_VREG {
+    AT91_REG     VREG_MR;   // Voltage Regulator Mode Register
+} AT91S_VREG, *AT91PS_VREG;
+
+// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register --------
+#define AT91C_VREG_PSTDBY     ((unsigned int) 0x1 <<  0) // (VREG) Voltage Regulator Power Standby Mode
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Memory Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_MC {
+    AT91_REG     MC_RCR;    // MC Remap Control Register
+    AT91_REG     MC_ASR;    // MC Abort Status Register
+    AT91_REG     MC_AASR;   // MC Abort Address Status Register
+    AT91_REG     Reserved0[21];     //
+    AT91_REG     MC_FMR;    // MC Flash Mode Register
+    AT91_REG     MC_FCR;    // MC Flash Command Register
+    AT91_REG     MC_FSR;    // MC Flash Status Register
+} AT91S_MC, *AT91PS_MC;
+
+// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register --------
+#define AT91C_MC_RCB          ((unsigned int) 0x1 <<  0) // (MC) Remap Command Bit
+// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register --------
+#define AT91C_MC_UNDADD       ((unsigned int) 0x1 <<  0) // (MC) Undefined Addess Abort Status
+#define AT91C_MC_MISADD       ((unsigned int) 0x1 <<  1) // (MC) Misaligned Addess Abort Status
+#define AT91C_MC_ABTSZ        ((unsigned int) 0x3 <<  8) // (MC) Abort Size Status
+#define     AT91C_MC_ABTSZ_BYTE                 ((unsigned int) 0x0 <<  8) // (MC) Byte
+#define     AT91C_MC_ABTSZ_HWORD                ((unsigned int) 0x1 <<  8) // (MC) Half-word
+#define     AT91C_MC_ABTSZ_WORD                 ((unsigned int) 0x2 <<  8) // (MC) Word
+#define AT91C_MC_ABTTYP       ((unsigned int) 0x3 << 10) // (MC) Abort Type Status
+#define     AT91C_MC_ABTTYP_DATAR                ((unsigned int) 0x0 << 10) // (MC) Data Read
+#define     AT91C_MC_ABTTYP_DATAW                ((unsigned int) 0x1 << 10) // (MC) Data Write
+#define     AT91C_MC_ABTTYP_FETCH                ((unsigned int) 0x2 << 10) // (MC) Code Fetch
+#define AT91C_MC_MST0         ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source
+#define AT91C_MC_MST1         ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source
+#define AT91C_MC_SVMST0       ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source
+#define AT91C_MC_SVMST1       ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source
+// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register --------
+#define AT91C_MC_FRDY         ((unsigned int) 0x1 <<  0) // (MC) Flash Ready
+#define AT91C_MC_LOCKE        ((unsigned int) 0x1 <<  2) // (MC) Lock Error
+#define AT91C_MC_PROGE        ((unsigned int) 0x1 <<  3) // (MC) Programming Error
+#define AT91C_MC_NEBP         ((unsigned int) 0x1 <<  7) // (MC) No Erase Before Programming
+#define AT91C_MC_FWS          ((unsigned int) 0x3 <<  8) // (MC) Flash Wait State
+#define     AT91C_MC_FWS_0FWS                 ((unsigned int) 0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations
+#define     AT91C_MC_FWS_1FWS                 ((unsigned int) 0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations
+#define     AT91C_MC_FWS_2FWS                 ((unsigned int) 0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations
+#define     AT91C_MC_FWS_3FWS                 ((unsigned int) 0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations
+#define AT91C_MC_FMCN         ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number
+// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register --------
+#define AT91C_MC_FCMD         ((unsigned int) 0xF <<  0) // (MC) Flash Command
+#define     AT91C_MC_FCMD_START_PROG           ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN.
+#define     AT91C_MC_FCMD_LOCK                 ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_PROG_AND_LOCK        ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.
+#define     AT91C_MC_FCMD_UNLOCK               ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_ERASE_ALL            ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.
+#define     AT91C_MC_FCMD_SET_GP_NVM           ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits.
+#define     AT91C_MC_FCMD_CLR_GP_NVM           ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits.
+#define     AT91C_MC_FCMD_SET_SECURITY         ((unsigned int) 0xF) // (MC) Set Security Bit.
+#define AT91C_MC_PAGEN        ((unsigned int) 0x3FF <<  8) // (MC) Page Number
+#define AT91C_MC_KEY          ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key
+// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register --------
+#define AT91C_MC_SECURITY     ((unsigned int) 0x1 <<  4) // (MC) Security Bit Status
+#define AT91C_MC_GPNVM0       ((unsigned int) 0x1 <<  8) // (MC) Sector 0 Lock Status
+#define AT91C_MC_GPNVM1       ((unsigned int) 0x1 <<  9) // (MC) Sector 1 Lock Status
+#define AT91C_MC_GPNVM2       ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status
+#define AT91C_MC_GPNVM3       ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status
+#define AT91C_MC_GPNVM4       ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status
+#define AT91C_MC_GPNVM5       ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status
+#define AT91C_MC_GPNVM6       ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status
+#define AT91C_MC_GPNVM7       ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS0       ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status
+#define AT91C_MC_LOCKS1       ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status
+#define AT91C_MC_LOCKS2       ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status
+#define AT91C_MC_LOCKS3       ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status
+#define AT91C_MC_LOCKS4       ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status
+#define AT91C_MC_LOCKS5       ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status
+#define AT91C_MC_LOCKS6       ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status
+#define AT91C_MC_LOCKS7       ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS8       ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status
+#define AT91C_MC_LOCKS9       ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status
+#define AT91C_MC_LOCKS10      ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status
+#define AT91C_MC_LOCKS11      ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status
+#define AT91C_MC_LOCKS12      ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status
+#define AT91C_MC_LOCKS13      ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status
+#define AT91C_MC_LOCKS14      ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status
+#define AT91C_MC_LOCKS15      ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface
+// *****************************************************************************
+typedef struct _AT91S_SPI {
+    AT91_REG     SPI_CR;    // Control Register
+    AT91_REG     SPI_MR;    // Mode Register
+    AT91_REG     SPI_RDR;   // Receive Data Register
+    AT91_REG     SPI_TDR;   // Transmit Data Register
+    AT91_REG     SPI_SR;    // Status Register
+    AT91_REG     SPI_IER;   // Interrupt Enable Register
+    AT91_REG     SPI_IDR;   // Interrupt Disable Register
+    AT91_REG     SPI_IMR;   // Interrupt Mask Register
+    AT91_REG     Reserved0[4];  //
+    AT91_REG     SPI_CSR[4];    // Chip Select Register
+    AT91_REG     Reserved1[48];     //
+    AT91_REG     SPI_RPR;   // Receive Pointer Register
+    AT91_REG     SPI_RCR;   // Receive Counter Register
+    AT91_REG     SPI_TPR;   // Transmit Pointer Register
+    AT91_REG     SPI_TCR;   // Transmit Counter Register
+    AT91_REG     SPI_RNPR;  // Receive Next Pointer Register
+    AT91_REG     SPI_RNCR;  // Receive Next Counter Register
+    AT91_REG     SPI_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     SPI_TNCR;  // Transmit Next Counter Register
+    AT91_REG     SPI_PTCR;  // PDC Transfer Control Register
+    AT91_REG     SPI_PTSR;  // PDC Transfer Status Register
+} AT91S_SPI, *AT91PS_SPI;
+
+// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register --------
+#define AT91C_SPI_SPIEN       ((unsigned int) 0x1 <<  0) // (SPI) SPI Enable
+#define AT91C_SPI_SPIDIS      ((unsigned int) 0x1 <<  1) // (SPI) SPI Disable
+#define AT91C_SPI_SWRST       ((unsigned int) 0x1 <<  7) // (SPI) SPI Software reset
+#define AT91C_SPI_LASTXFER    ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer
+// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register --------
+#define AT91C_SPI_MSTR        ((unsigned int) 0x1 <<  0) // (SPI) Master/Slave Mode
+#define AT91C_SPI_PS          ((unsigned int) 0x1 <<  1) // (SPI) Peripheral Select
+#define     AT91C_SPI_PS_FIXED                ((unsigned int) 0x0 <<  1) // (SPI) Fixed Peripheral Select
+#define     AT91C_SPI_PS_VARIABLE             ((unsigned int) 0x1 <<  1) // (SPI) Variable Peripheral Select
+#define AT91C_SPI_PCSDEC      ((unsigned int) 0x1 <<  2) // (SPI) Chip Select Decode
+#define AT91C_SPI_FDIV        ((unsigned int) 0x1 <<  3) // (SPI) Clock Selection
+#define AT91C_SPI_MODFDIS     ((unsigned int) 0x1 <<  4) // (SPI) Mode Fault Detection
+#define AT91C_SPI_LLB         ((unsigned int) 0x1 <<  7) // (SPI) Clock Selection
+#define AT91C_SPI_PCS         ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select
+#define AT91C_SPI_DLYBCS      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects
+// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register --------
+#define AT91C_SPI_RD          ((unsigned int) 0xFFFF <<  0) // (SPI) Receive Data
+#define AT91C_SPI_RPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register --------
+#define AT91C_SPI_TD          ((unsigned int) 0xFFFF <<  0) // (SPI) Transmit Data
+#define AT91C_SPI_TPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_SR : (SPI Offset: 0x10) Status Register --------
+#define AT91C_SPI_RDRF        ((unsigned int) 0x1 <<  0) // (SPI) Receive Data Register Full
+#define AT91C_SPI_TDRE        ((unsigned int) 0x1 <<  1) // (SPI) Transmit Data Register Empty
+#define AT91C_SPI_MODF        ((unsigned int) 0x1 <<  2) // (SPI) Mode Fault Error
+#define AT91C_SPI_OVRES       ((unsigned int) 0x1 <<  3) // (SPI) Overrun Error Status
+#define AT91C_SPI_ENDRX       ((unsigned int) 0x1 <<  4) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_ENDTX       ((unsigned int) 0x1 <<  5) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_RXBUFF      ((unsigned int) 0x1 <<  6) // (SPI) RXBUFF Interrupt
+#define AT91C_SPI_TXBUFE      ((unsigned int) 0x1 <<  7) // (SPI) TXBUFE Interrupt
+#define AT91C_SPI_NSSR        ((unsigned int) 0x1 <<  8) // (SPI) NSSR Interrupt
+#define AT91C_SPI_TXEMPTY     ((unsigned int) 0x1 <<  9) // (SPI) TXEMPTY Interrupt
+#define AT91C_SPI_SPIENS      ((unsigned int) 0x1 << 16) // (SPI) Enable Status
+// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register --------
+// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register --------
+// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register --------
+// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register --------
+#define AT91C_SPI_CPOL        ((unsigned int) 0x1 <<  0) // (SPI) Clock Polarity
+#define AT91C_SPI_NCPHA       ((unsigned int) 0x1 <<  1) // (SPI) Clock Phase
+#define AT91C_SPI_CSAAT       ((unsigned int) 0x1 <<  3) // (SPI) Chip Select Active After Transfer
+#define AT91C_SPI_BITS        ((unsigned int) 0xF <<  4) // (SPI) Bits Per Transfer
+#define     AT91C_SPI_BITS_8                    ((unsigned int) 0x0 <<  4) // (SPI) 8 Bits Per transfer
+#define     AT91C_SPI_BITS_9                    ((unsigned int) 0x1 <<  4) // (SPI) 9 Bits Per transfer
+#define     AT91C_SPI_BITS_10                   ((unsigned int) 0x2 <<  4) // (SPI) 10 Bits Per transfer
+#define     AT91C_SPI_BITS_11                   ((unsigned int) 0x3 <<  4) // (SPI) 11 Bits Per transfer
+#define     AT91C_SPI_BITS_12                   ((unsigned int) 0x4 <<  4) // (SPI) 12 Bits Per transfer
+#define     AT91C_SPI_BITS_13                   ((unsigned int) 0x5 <<  4) // (SPI) 13 Bits Per transfer
+#define     AT91C_SPI_BITS_14                   ((unsigned int) 0x6 <<  4) // (SPI) 14 Bits Per transfer
+#define     AT91C_SPI_BITS_15                   ((unsigned int) 0x7 <<  4) // (SPI) 15 Bits Per transfer
+#define     AT91C_SPI_BITS_16                   ((unsigned int) 0x8 <<  4) // (SPI) 16 Bits Per transfer
+#define AT91C_SPI_SCBR        ((unsigned int) 0xFF <<  8) // (SPI) Serial Clock Baud Rate
+#define AT91C_SPI_DLYBS       ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK
+#define AT91C_SPI_DLYBCT      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Usart
+// *****************************************************************************
+typedef struct _AT91S_USART {
+    AT91_REG     US_CR;     // Control Register
+    AT91_REG     US_MR;     // Mode Register
+    AT91_REG     US_IER;    // Interrupt Enable Register
+    AT91_REG     US_IDR;    // Interrupt Disable Register
+    AT91_REG     US_IMR;    // Interrupt Mask Register
+    AT91_REG     US_CSR;    // Channel Status Register
+    AT91_REG     US_RHR;    // Receiver Holding Register
+    AT91_REG     US_THR;    // Transmitter Holding Register
+    AT91_REG     US_BRGR;   // Baud Rate Generator Register
+    AT91_REG     US_RTOR;   // Receiver Time-out Register
+    AT91_REG     US_TTGR;   // Transmitter Time-guard Register
+    AT91_REG     Reserved0[5];  //
+    AT91_REG     US_FIDI;   // FI_DI_Ratio Register
+    AT91_REG     US_NER;    // Nb Errors Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     US_IF;     // IRDA_FILTER Register
+    AT91_REG     Reserved2[44];     //
+    AT91_REG     US_RPR;    // Receive Pointer Register
+    AT91_REG     US_RCR;    // Receive Counter Register
+    AT91_REG     US_TPR;    // Transmit Pointer Register
+    AT91_REG     US_TCR;    // Transmit Counter Register
+    AT91_REG     US_RNPR;   // Receive Next Pointer Register
+    AT91_REG     US_RNCR;   // Receive Next Counter Register
+    AT91_REG     US_TNPR;   // Transmit Next Pointer Register
+    AT91_REG     US_TNCR;   // Transmit Next Counter Register
+    AT91_REG     US_PTCR;   // PDC Transfer Control Register
+    AT91_REG     US_PTSR;   // PDC Transfer Status Register
+} AT91S_USART, *AT91PS_USART;
+
+// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_STTBRK       ((unsigned int) 0x1 <<  9) // (USART) Start Break
+#define AT91C_US_STPBRK       ((unsigned int) 0x1 << 10) // (USART) Stop Break
+#define AT91C_US_STTTO        ((unsigned int) 0x1 << 11) // (USART) Start Time-out
+#define AT91C_US_SENDA        ((unsigned int) 0x1 << 12) // (USART) Send Address
+#define AT91C_US_RSTIT        ((unsigned int) 0x1 << 13) // (USART) Reset Iterations
+#define AT91C_US_RSTNACK      ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge
+#define AT91C_US_RETTO        ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out
+#define AT91C_US_DTREN        ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable
+#define AT91C_US_DTRDIS       ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable
+#define AT91C_US_RTSEN        ((unsigned int) 0x1 << 18) // (USART) Request to Send enable
+#define AT91C_US_RTSDIS       ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable
+// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_USMODE       ((unsigned int) 0xF <<  0) // (USART) Usart mode
+#define     AT91C_US_USMODE_NORMAL               ((unsigned int) 0x0) // (USART) Normal
+#define     AT91C_US_USMODE_RS485                ((unsigned int) 0x1) // (USART) RS485
+#define     AT91C_US_USMODE_HWHSH                ((unsigned int) 0x2) // (USART) Hardware Handshaking
+#define     AT91C_US_USMODE_MODEM                ((unsigned int) 0x3) // (USART) Modem
+#define     AT91C_US_USMODE_ISO7816_0            ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0
+#define     AT91C_US_USMODE_ISO7816_1            ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1
+#define     AT91C_US_USMODE_IRDA                 ((unsigned int) 0x8) // (USART) IrDA
+#define     AT91C_US_USMODE_SWHSH                ((unsigned int) 0xC) // (USART) Software Handshaking
+#define AT91C_US_CLKS         ((unsigned int) 0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CLKS_CLOCK                ((unsigned int) 0x0 <<  4) // (USART) Clock
+#define     AT91C_US_CLKS_FDIV1                ((unsigned int) 0x1 <<  4) // (USART) fdiv1
+#define     AT91C_US_CLKS_SLOW                 ((unsigned int) 0x2 <<  4) // (USART) slow_clock (ARM)
+#define     AT91C_US_CLKS_EXT                  ((unsigned int) 0x3 <<  4) // (USART) External (SCK)
+#define AT91C_US_CHRL         ((unsigned int) 0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CHRL_5_BITS               ((unsigned int) 0x0 <<  6) // (USART) Character Length: 5 bits
+#define     AT91C_US_CHRL_6_BITS               ((unsigned int) 0x1 <<  6) // (USART) Character Length: 6 bits
+#define     AT91C_US_CHRL_7_BITS               ((unsigned int) 0x2 <<  6) // (USART) Character Length: 7 bits
+#define     AT91C_US_CHRL_8_BITS               ((unsigned int) 0x3 <<  6) // (USART) Character Length: 8 bits
+#define AT91C_US_SYNC         ((unsigned int) 0x1 <<  8) // (USART) Synchronous Mode Select
+#define AT91C_US_NBSTOP       ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits
+#define     AT91C_US_NBSTOP_1_BIT                ((unsigned int) 0x0 << 12) // (USART) 1 stop bit
+#define     AT91C_US_NBSTOP_15_BIT               ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits
+#define     AT91C_US_NBSTOP_2_BIT                ((unsigned int) 0x2 << 12) // (USART) 2 stop bits
+#define AT91C_US_MSBF         ((unsigned int) 0x1 << 16) // (USART) Bit Order
+#define AT91C_US_MODE9        ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length
+#define AT91C_US_CKLO         ((unsigned int) 0x1 << 18) // (USART) Clock Output Select
+#define AT91C_US_OVER         ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode
+#define AT91C_US_INACK        ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge
+#define AT91C_US_DSNACK       ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK
+#define AT91C_US_MAX_ITER     ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions
+#define AT91C_US_FILTER       ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter
+// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXBRK        ((unsigned int) 0x1 <<  2) // (USART) Break Received/End of Break
+#define AT91C_US_TIMEOUT      ((unsigned int) 0x1 <<  8) // (USART) Receiver Time-out
+#define AT91C_US_ITERATION    ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached
+#define AT91C_US_NACK         ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge
+#define AT91C_US_RIIC         ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag
+#define AT91C_US_DSRIC        ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag
+#define AT91C_US_DCDIC        ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag
+#define AT91C_US_CTSIC        ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag
+// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register --------
+#define AT91C_US_RI           ((unsigned int) 0x1 << 20) // (USART) Image of RI Input
+#define AT91C_US_DSR          ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input
+#define AT91C_US_DCD          ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input
+#define AT91C_US_CTS          ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_SSC {
+    AT91_REG     SSC_CR;    // Control Register
+    AT91_REG     SSC_CMR;   // Clock Mode Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     SSC_RCMR;  // Receive Clock ModeRegister
+    AT91_REG     SSC_RFMR;  // Receive Frame Mode Register
+    AT91_REG     SSC_TCMR;  // Transmit Clock Mode Register
+    AT91_REG     SSC_TFMR;  // Transmit Frame Mode Register
+    AT91_REG     SSC_RHR;   // Receive Holding Register
+    AT91_REG     SSC_THR;   // Transmit Holding Register
+    AT91_REG     Reserved1[2];  //
+    AT91_REG     SSC_RSHR;  // Receive Sync Holding Register
+    AT91_REG     SSC_TSHR;  // Transmit Sync Holding Register
+    AT91_REG     Reserved2[2];  //
+    AT91_REG     SSC_SR;    // Status Register
+    AT91_REG     SSC_IER;   // Interrupt Enable Register
+    AT91_REG     SSC_IDR;   // Interrupt Disable Register
+    AT91_REG     SSC_IMR;   // Interrupt Mask Register
+    AT91_REG     Reserved3[44];     //
+    AT91_REG     SSC_RPR;   // Receive Pointer Register
+    AT91_REG     SSC_RCR;   // Receive Counter Register
+    AT91_REG     SSC_TPR;   // Transmit Pointer Register
+    AT91_REG     SSC_TCR;   // Transmit Counter Register
+    AT91_REG     SSC_RNPR;  // Receive Next Pointer Register
+    AT91_REG     SSC_RNCR;  // Receive Next Counter Register
+    AT91_REG     SSC_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     SSC_TNCR;  // Transmit Next Counter Register
+    AT91_REG     SSC_PTCR;  // PDC Transfer Control Register
+    AT91_REG     SSC_PTSR;  // PDC Transfer Status Register
+} AT91S_SSC, *AT91PS_SSC;
+
+// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register --------
+#define AT91C_SSC_RXEN        ((unsigned int) 0x1 <<  0) // (SSC) Receive Enable
+#define AT91C_SSC_RXDIS       ((unsigned int) 0x1 <<  1) // (SSC) Receive Disable
+#define AT91C_SSC_TXEN        ((unsigned int) 0x1 <<  8) // (SSC) Transmit Enable
+#define AT91C_SSC_TXDIS       ((unsigned int) 0x1 <<  9) // (SSC) Transmit Disable
+#define AT91C_SSC_SWRST       ((unsigned int) 0x1 << 15) // (SSC) Software Reset
+// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register --------
+#define AT91C_SSC_CKS         ((unsigned int) 0x3 <<  0) // (SSC) Receive/Transmit Clock Selection
+#define     AT91C_SSC_CKS_DIV                  ((unsigned int) 0x0) // (SSC) Divided Clock
+#define     AT91C_SSC_CKS_TK                   ((unsigned int) 0x1) // (SSC) TK Clock signal
+#define     AT91C_SSC_CKS_RK                   ((unsigned int) 0x2) // (SSC) RK pin
+#define AT91C_SSC_CKO         ((unsigned int) 0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection
+#define     AT91C_SSC_CKO_NONE                 ((unsigned int) 0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only
+#define     AT91C_SSC_CKO_CONTINOUS            ((unsigned int) 0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output
+#define     AT91C_SSC_CKO_DATA_TX              ((unsigned int) 0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output
+#define AT91C_SSC_CKI         ((unsigned int) 0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion
+#define AT91C_SSC_START       ((unsigned int) 0xF <<  8) // (SSC) Receive/Transmit Start Selection
+#define     AT91C_SSC_START_CONTINOUS            ((unsigned int) 0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.
+#define     AT91C_SSC_START_TX                   ((unsigned int) 0x1 <<  8) // (SSC) Transmit/Receive start
+#define     AT91C_SSC_START_LOW_RF               ((unsigned int) 0x2 <<  8) // (SSC) Detection of a low level on RF input
+#define     AT91C_SSC_START_HIGH_RF              ((unsigned int) 0x3 <<  8) // (SSC) Detection of a high level on RF input
+#define     AT91C_SSC_START_FALL_RF              ((unsigned int) 0x4 <<  8) // (SSC) Detection of a falling edge on RF input
+#define     AT91C_SSC_START_RISE_RF              ((unsigned int) 0x5 <<  8) // (SSC) Detection of a rising edge on RF input
+#define     AT91C_SSC_START_LEVEL_RF             ((unsigned int) 0x6 <<  8) // (SSC) Detection of any level change on RF input
+#define     AT91C_SSC_START_EDGE_RF              ((unsigned int) 0x7 <<  8) // (SSC) Detection of any edge on RF input
+#define     AT91C_SSC_START_0                    ((unsigned int) 0x8 <<  8) // (SSC) Compare 0
+#define AT91C_SSC_STTDLY      ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay
+#define AT91C_SSC_PERIOD      ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection
+// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register --------
+#define AT91C_SSC_DATLEN      ((unsigned int) 0x1F <<  0) // (SSC) Data Length
+#define AT91C_SSC_LOOP        ((unsigned int) 0x1 <<  5) // (SSC) Loop Mode
+#define AT91C_SSC_MSBF        ((unsigned int) 0x1 <<  7) // (SSC) Most Significant Bit First
+#define AT91C_SSC_DATNB       ((unsigned int) 0xF <<  8) // (SSC) Data Number per Frame
+#define AT91C_SSC_FSLEN       ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length
+#define AT91C_SSC_FSOS        ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection
+#define     AT91C_SSC_FSOS_NONE                 ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only
+#define     AT91C_SSC_FSOS_NEGATIVE             ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse
+#define     AT91C_SSC_FSOS_POSITIVE             ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse
+#define     AT91C_SSC_FSOS_LOW                  ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer
+#define     AT91C_SSC_FSOS_HIGH                 ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer
+#define     AT91C_SSC_FSOS_TOGGLE               ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer
+#define AT91C_SSC_FSEDGE      ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection
+// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register --------
+// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register --------
+#define AT91C_SSC_DATDEF      ((unsigned int) 0x1 <<  5) // (SSC) Data Default Value
+#define AT91C_SSC_FSDEN       ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable
+// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register --------
+#define AT91C_SSC_TXRDY       ((unsigned int) 0x1 <<  0) // (SSC) Transmit Ready
+#define AT91C_SSC_TXEMPTY     ((unsigned int) 0x1 <<  1) // (SSC) Transmit Empty
+#define AT91C_SSC_ENDTX       ((unsigned int) 0x1 <<  2) // (SSC) End Of Transmission
+#define AT91C_SSC_TXBUFE      ((unsigned int) 0x1 <<  3) // (SSC) Transmit Buffer Empty
+#define AT91C_SSC_RXRDY       ((unsigned int) 0x1 <<  4) // (SSC) Receive Ready
+#define AT91C_SSC_OVRUN       ((unsigned int) 0x1 <<  5) // (SSC) Receive Overrun
+#define AT91C_SSC_ENDRX       ((unsigned int) 0x1 <<  6) // (SSC) End of Reception
+#define AT91C_SSC_RXBUFF      ((unsigned int) 0x1 <<  7) // (SSC) Receive Buffer Full
+#define AT91C_SSC_TXSYN       ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync
+#define AT91C_SSC_RXSYN       ((unsigned int) 0x1 << 11) // (SSC) Receive Sync
+#define AT91C_SSC_TXENA       ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable
+#define AT91C_SSC_RXENA       ((unsigned int) 0x1 << 17) // (SSC) Receive Enable
+// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register --------
+// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register --------
+// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Two-wire Interface
+// *****************************************************************************
+typedef struct _AT91S_TWI {
+    AT91_REG     TWI_CR;    // Control Register
+    AT91_REG     TWI_MMR;   // Master Mode Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     TWI_IADR;  // Internal Address Register
+    AT91_REG     TWI_CWGR;  // Clock Waveform Generator Register
+    AT91_REG     Reserved1[3];  //
+    AT91_REG     TWI_SR;    // Status Register
+    AT91_REG     TWI_IER;   // Interrupt Enable Register
+    AT91_REG     TWI_IDR;   // Interrupt Disable Register
+    AT91_REG     TWI_IMR;   // Interrupt Mask Register
+    AT91_REG     TWI_RHR;   // Receive Holding Register
+    AT91_REG     TWI_THR;   // Transmit Holding Register
+} AT91S_TWI, *AT91PS_TWI;
+
+// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register --------
+#define AT91C_TWI_START       ((unsigned int) 0x1 <<  0) // (TWI) Send a START Condition
+#define AT91C_TWI_STOP        ((unsigned int) 0x1 <<  1) // (TWI) Send a STOP Condition
+#define AT91C_TWI_MSEN        ((unsigned int) 0x1 <<  2) // (TWI) TWI Master Transfer Enabled
+#define AT91C_TWI_MSDIS       ((unsigned int) 0x1 <<  3) // (TWI) TWI Master Transfer Disabled
+#define AT91C_TWI_SWRST       ((unsigned int) 0x1 <<  7) // (TWI) Software Reset
+// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register --------
+#define AT91C_TWI_IADRSZ      ((unsigned int) 0x3 <<  8) // (TWI) Internal Device Address Size
+#define     AT91C_TWI_IADRSZ_NO                   ((unsigned int) 0x0 <<  8) // (TWI) No internal device address
+#define     AT91C_TWI_IADRSZ_1_BYTE               ((unsigned int) 0x1 <<  8) // (TWI) One-byte internal device address
+#define     AT91C_TWI_IADRSZ_2_BYTE               ((unsigned int) 0x2 <<  8) // (TWI) Two-byte internal device address
+#define     AT91C_TWI_IADRSZ_3_BYTE               ((unsigned int) 0x3 <<  8) // (TWI) Three-byte internal device address
+#define AT91C_TWI_MREAD       ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction
+#define AT91C_TWI_DADR        ((unsigned int) 0x7F << 16) // (TWI) Device Address
+// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register --------
+#define AT91C_TWI_CLDIV       ((unsigned int) 0xFF <<  0) // (TWI) Clock Low Divider
+#define AT91C_TWI_CHDIV       ((unsigned int) 0xFF <<  8) // (TWI) Clock High Divider
+#define AT91C_TWI_CKDIV       ((unsigned int) 0x7 << 16) // (TWI) Clock Divider
+// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register --------
+#define AT91C_TWI_TXCOMP      ((unsigned int) 0x1 <<  0) // (TWI) Transmission Completed
+#define AT91C_TWI_RXRDY       ((unsigned int) 0x1 <<  1) // (TWI) Receive holding register ReaDY
+#define AT91C_TWI_TXRDY       ((unsigned int) 0x1 <<  2) // (TWI) Transmit holding register ReaDY
+#define AT91C_TWI_OVRE        ((unsigned int) 0x1 <<  6) // (TWI) Overrun Error
+#define AT91C_TWI_UNRE        ((unsigned int) 0x1 <<  7) // (TWI) Underrun Error
+#define AT91C_TWI_NACK        ((unsigned int) 0x1 <<  8) // (TWI) Not Acknowledged
+// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register --------
+// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register --------
+// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface
+// *****************************************************************************
+typedef struct _AT91S_PWMC_CH {
+    AT91_REG     PWMC_CMR;  // Channel Mode Register
+    AT91_REG     PWMC_CDTYR;    // Channel Duty Cycle Register
+    AT91_REG     PWMC_CPRDR;    // Channel Period Register
+    AT91_REG     PWMC_CCNTR;    // Channel Counter Register
+    AT91_REG     PWMC_CUPDR;    // Channel Update Register
+    AT91_REG     PWMC_Reserved[3];  // Reserved
+} AT91S_PWMC_CH, *AT91PS_PWMC_CH;
+
+// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register --------
+#define AT91C_PWMC_CPRE       ((unsigned int) 0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx
+#define     AT91C_PWMC_CPRE_MCK                  ((unsigned int) 0x0) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKA                 ((unsigned int) 0xB) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKB                 ((unsigned int) 0xC) // (PWMC_CH)
+#define AT91C_PWMC_CALG       ((unsigned int) 0x1 <<  8) // (PWMC_CH) Channel Alignment
+#define AT91C_PWMC_CPOL       ((unsigned int) 0x1 <<  9) // (PWMC_CH) Channel Polarity
+#define AT91C_PWMC_CPD        ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period
+// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register --------
+#define AT91C_PWMC_CDTY       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Duty Cycle
+// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register --------
+#define AT91C_PWMC_CPRD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Period
+// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register --------
+#define AT91C_PWMC_CCNT       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Counter
+// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register --------
+#define AT91C_PWMC_CUPD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Update
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_PWMC {
+    AT91_REG     PWMC_MR;   // PWMC Mode Register
+    AT91_REG     PWMC_ENA;  // PWMC Enable Register
+    AT91_REG     PWMC_DIS;  // PWMC Disable Register
+    AT91_REG     PWMC_SR;   // PWMC Status Register
+    AT91_REG     PWMC_IER;  // PWMC Interrupt Enable Register
+    AT91_REG     PWMC_IDR;  // PWMC Interrupt Disable Register
+    AT91_REG     PWMC_IMR;  // PWMC Interrupt Mask Register
+    AT91_REG     PWMC_ISR;  // PWMC Interrupt Status Register
+    AT91_REG     Reserved0[55];     //
+    AT91_REG     PWMC_VR;   // PWMC Version Register
+    AT91_REG     Reserved1[64];     //
+    AT91S_PWMC_CH    PWMC_CH[4];    // PWMC Channel
+} AT91S_PWMC, *AT91PS_PWMC;
+
+// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register --------
+#define AT91C_PWMC_DIVA       ((unsigned int) 0xFF <<  0) // (PWMC) CLKA divide factor.
+#define AT91C_PWMC_PREA       ((unsigned int) 0xF <<  8) // (PWMC) Divider Input Clock Prescaler A
+#define     AT91C_PWMC_PREA_MCK                  ((unsigned int) 0x0 <<  8) // (PWMC)
+#define AT91C_PWMC_DIVB       ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor.
+#define AT91C_PWMC_PREB       ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B
+#define     AT91C_PWMC_PREB_MCK                  ((unsigned int) 0x0 << 24) // (PWMC)
+// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register --------
+#define AT91C_PWMC_CHID0      ((unsigned int) 0x1 <<  0) // (PWMC) Channel ID 0
+#define AT91C_PWMC_CHID1      ((unsigned int) 0x1 <<  1) // (PWMC) Channel ID 1
+#define AT91C_PWMC_CHID2      ((unsigned int) 0x1 <<  2) // (PWMC) Channel ID 2
+#define AT91C_PWMC_CHID3      ((unsigned int) 0x1 <<  3) // (PWMC) Channel ID 3
+// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register --------
+// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register --------
+// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register --------
+// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register --------
+// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register --------
+// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR USB Device Interface
+// *****************************************************************************
+typedef struct _AT91S_UDP {
+    AT91_REG     UDP_NUM;   // Frame Number Register
+    AT91_REG     UDP_GLBSTATE;  // Global State Register
+    AT91_REG     UDP_FADDR;     // Function Address Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     UDP_IER;   // Interrupt Enable Register
+    AT91_REG     UDP_IDR;   // Interrupt Disable Register
+    AT91_REG     UDP_IMR;   // Interrupt Mask Register
+    AT91_REG     UDP_ISR;   // Interrupt Status Register
+    AT91_REG     UDP_ICR;   // Interrupt Clear Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     UDP_RSTEP;     // Reset Endpoint Register
+    AT91_REG     Reserved2[1];  //
+    AT91_REG     UDP_CSR[6];    // Endpoint Control and Status Register
+    AT91_REG     Reserved3[2];  //
+    AT91_REG     UDP_FDR[6];    // Endpoint FIFO Data Register
+    AT91_REG     Reserved4[3];  //
+    AT91_REG     UDP_TXVC;  // Transceiver Control Register
+} AT91S_UDP, *AT91PS_UDP;
+
+// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register --------
+#define AT91C_UDP_FRM_NUM     ((unsigned int) 0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats
+#define AT91C_UDP_FRM_ERR     ((unsigned int) 0x1 << 16) // (UDP) Frame Error
+#define AT91C_UDP_FRM_OK      ((unsigned int) 0x1 << 17) // (UDP) Frame OK
+// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register --------
+#define AT91C_UDP_FADDEN      ((unsigned int) 0x1 <<  0) // (UDP) Function Address Enable
+#define AT91C_UDP_CONFG       ((unsigned int) 0x1 <<  1) // (UDP) Configured
+#define AT91C_UDP_ESR         ((unsigned int) 0x1 <<  2) // (UDP) Enable Send Resume
+#define AT91C_UDP_RSMINPR     ((unsigned int) 0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host
+#define AT91C_UDP_RMWUPE      ((unsigned int) 0x1 <<  4) // (UDP) Remote Wake Up Enable
+// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register --------
+#define AT91C_UDP_FADD        ((unsigned int) 0xFF <<  0) // (UDP) Function Address Value
+#define AT91C_UDP_FEN         ((unsigned int) 0x1 <<  8) // (UDP) Function Enable
+// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register --------
+#define AT91C_UDP_EPINT0      ((unsigned int) 0x1 <<  0) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT1      ((unsigned int) 0x1 <<  1) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT2      ((unsigned int) 0x1 <<  2) // (UDP) Endpoint 2 Interrupt
+#define AT91C_UDP_EPINT3      ((unsigned int) 0x1 <<  3) // (UDP) Endpoint 3 Interrupt
+#define AT91C_UDP_EPINT4      ((unsigned int) 0x1 <<  4) // (UDP) Endpoint 4 Interrupt
+#define AT91C_UDP_EPINT5      ((unsigned int) 0x1 <<  5) // (UDP) Endpoint 5 Interrupt
+#define AT91C_UDP_RXSUSP      ((unsigned int) 0x1 <<  8) // (UDP) USB Suspend Interrupt
+#define AT91C_UDP_RXRSM       ((unsigned int) 0x1 <<  9) // (UDP) USB Resume Interrupt
+#define AT91C_UDP_EXTRSM      ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt
+#define AT91C_UDP_SOFINT      ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt
+#define AT91C_UDP_WAKEUP      ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt
+// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register --------
+// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register --------
+// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register --------
+#define AT91C_UDP_ENDBUSRES   ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt
+// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register --------
+// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register --------
+#define AT91C_UDP_EP0         ((unsigned int) 0x1 <<  0) // (UDP) Reset Endpoint 0
+#define AT91C_UDP_EP1         ((unsigned int) 0x1 <<  1) // (UDP) Reset Endpoint 1
+#define AT91C_UDP_EP2         ((unsigned int) 0x1 <<  2) // (UDP) Reset Endpoint 2
+#define AT91C_UDP_EP3         ((unsigned int) 0x1 <<  3) // (UDP) Reset Endpoint 3
+#define AT91C_UDP_EP4         ((unsigned int) 0x1 <<  4) // (UDP) Reset Endpoint 4
+#define AT91C_UDP_EP5         ((unsigned int) 0x1 <<  5) // (UDP) Reset Endpoint 5
+// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register --------
+#define AT91C_UDP_TXCOMP      ((unsigned int) 0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR
+#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 <<  1) // (UDP) Receive Data Bank 0
+#define AT91C_UDP_RXSETUP     ((unsigned int) 0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)
+#define AT91C_UDP_ISOERROR    ((unsigned int) 0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)
+#define AT91C_UDP_TXPKTRDY    ((unsigned int) 0x1 <<  4) // (UDP) Transmit Packet Ready
+#define AT91C_UDP_FORCESTALL  ((unsigned int) 0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).
+#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).
+#define AT91C_UDP_DIR         ((unsigned int) 0x1 <<  7) // (UDP) Transfer Direction
+#define AT91C_UDP_EPTYPE      ((unsigned int) 0x7 <<  8) // (UDP) Endpoint type
+#define     AT91C_UDP_EPTYPE_CTRL                 ((unsigned int) 0x0 <<  8) // (UDP) Control
+#define     AT91C_UDP_EPTYPE_ISO_OUT              ((unsigned int) 0x1 <<  8) // (UDP) Isochronous OUT
+#define     AT91C_UDP_EPTYPE_BULK_OUT             ((unsigned int) 0x2 <<  8) // (UDP) Bulk OUT
+#define     AT91C_UDP_EPTYPE_INT_OUT              ((unsigned int) 0x3 <<  8) // (UDP) Interrupt OUT
+#define     AT91C_UDP_EPTYPE_ISO_IN               ((unsigned int) 0x5 <<  8) // (UDP) Isochronous IN
+#define     AT91C_UDP_EPTYPE_BULK_IN              ((unsigned int) 0x6 <<  8) // (UDP) Bulk IN
+#define     AT91C_UDP_EPTYPE_INT_IN               ((unsigned int) 0x7 <<  8) // (UDP) Interrupt IN
+#define AT91C_UDP_DTGLE       ((unsigned int) 0x1 << 11) // (UDP) Data Toggle
+#define AT91C_UDP_EPEDS       ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable
+#define AT91C_UDP_RXBYTECNT   ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO
+// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register --------
+#define AT91C_UDP_TXVDIS      ((unsigned int) 0x1 <<  8) // (UDP)
+#define AT91C_UDP_PUON        ((unsigned int) 0x1 <<  9) // (UDP) Pull-up ON
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface
+// *****************************************************************************
+typedef struct _AT91S_TC {
+    AT91_REG     TC_CCR;    // Channel Control Register
+    AT91_REG     TC_CMR;    // Channel Mode Register (Capture Mode / Waveform Mode)
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     TC_CV;     // Counter Value
+    AT91_REG     TC_RA;     // Register A
+    AT91_REG     TC_RB;     // Register B
+    AT91_REG     TC_RC;     // Register C
+    AT91_REG     TC_SR;     // Status Register
+    AT91_REG     TC_IER;    // Interrupt Enable Register
+    AT91_REG     TC_IDR;    // Interrupt Disable Register
+    AT91_REG     TC_IMR;    // Interrupt Mask Register
+} AT91S_TC, *AT91PS_TC;
+
+// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register --------
+#define AT91C_TC_CLKEN        ((unsigned int) 0x1 <<  0) // (TC) Counter Clock Enable Command
+#define AT91C_TC_CLKDIS       ((unsigned int) 0x1 <<  1) // (TC) Counter Clock Disable Command
+#define AT91C_TC_SWTRG        ((unsigned int) 0x1 <<  2) // (TC) Software Trigger Command
+// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode --------
+#define AT91C_TC_CLKS         ((unsigned int) 0x7 <<  0) // (TC) Clock Selection
+#define     AT91C_TC_CLKS_TIMER_DIV1_CLOCK     ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV2_CLOCK     ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV3_CLOCK     ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV4_CLOCK     ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV5_CLOCK     ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK
+#define     AT91C_TC_CLKS_XC0                  ((unsigned int) 0x5) // (TC) Clock selected: XC0
+#define     AT91C_TC_CLKS_XC1                  ((unsigned int) 0x6) // (TC) Clock selected: XC1
+#define     AT91C_TC_CLKS_XC2                  ((unsigned int) 0x7) // (TC) Clock selected: XC2
+#define AT91C_TC_CLKI         ((unsigned int) 0x1 <<  3) // (TC) Clock Invert
+#define AT91C_TC_BURST        ((unsigned int) 0x3 <<  4) // (TC) Burst Signal Selection
+#define     AT91C_TC_BURST_NONE                 ((unsigned int) 0x0 <<  4) // (TC) The clock is not gated by an external signal
+#define     AT91C_TC_BURST_XC0                  ((unsigned int) 0x1 <<  4) // (TC) XC0 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC1                  ((unsigned int) 0x2 <<  4) // (TC) XC1 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC2                  ((unsigned int) 0x3 <<  4) // (TC) XC2 is ANDed with the selected clock
+#define AT91C_TC_CPCSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare
+#define AT91C_TC_LDBSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading
+#define AT91C_TC_CPCDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disable with RC Compare
+#define AT91C_TC_LDBDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading
+#define AT91C_TC_ETRGEDG      ((unsigned int) 0x3 <<  8) // (TC) External Trigger Edge Selection
+#define     AT91C_TC_ETRGEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_ETRGEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_ETRGEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_ETRGEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_EEVTEDG      ((unsigned int) 0x3 <<  8) // (TC) External Event Edge Selection
+#define     AT91C_TC_EEVTEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_EEVTEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_EEVTEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_EEVTEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_EEVT         ((unsigned int) 0x3 << 10) // (TC) External Event  Selection
+#define     AT91C_TC_EEVT_TIOB                 ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input
+#define     AT91C_TC_EEVT_XC0                  ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output
+#define     AT91C_TC_EEVT_XC1                  ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output
+#define     AT91C_TC_EEVT_XC2                  ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output
+#define AT91C_TC_ABETRG       ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection
+#define AT91C_TC_ENETRG       ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable
+#define AT91C_TC_WAVESEL      ((unsigned int) 0x3 << 13) // (TC) Waveform  Selection
+#define     AT91C_TC_WAVESEL_UP                   ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN               ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UP_AUTO              ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN_AUTO          ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare
+#define AT91C_TC_CPCTRG       ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable
+#define AT91C_TC_WAVE         ((unsigned int) 0x1 << 15) // (TC)
+#define AT91C_TC_ACPA         ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA
+#define     AT91C_TC_ACPA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Effect: none
+#define     AT91C_TC_ACPA_SET                  ((unsigned int) 0x1 << 16) // (TC) Effect: set
+#define     AT91C_TC_ACPA_CLEAR                ((unsigned int) 0x2 << 16) // (TC) Effect: clear
+#define     AT91C_TC_ACPA_TOGGLE               ((unsigned int) 0x3 << 16) // (TC) Effect: toggle
+#define AT91C_TC_LDRA         ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection
+#define     AT91C_TC_LDRA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Edge: None
+#define     AT91C_TC_LDRA_RISING               ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRA_FALLING              ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRA_BOTH                 ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_ACPC         ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA
+#define     AT91C_TC_ACPC_NONE                 ((unsigned int) 0x0 << 18) // (TC) Effect: none
+#define     AT91C_TC_ACPC_SET                  ((unsigned int) 0x1 << 18) // (TC) Effect: set
+#define     AT91C_TC_ACPC_CLEAR                ((unsigned int) 0x2 << 18) // (TC) Effect: clear
+#define     AT91C_TC_ACPC_TOGGLE               ((unsigned int) 0x3 << 18) // (TC) Effect: toggle
+#define AT91C_TC_LDRB         ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection
+#define     AT91C_TC_LDRB_NONE                 ((unsigned int) 0x0 << 18) // (TC) Edge: None
+#define     AT91C_TC_LDRB_RISING               ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRB_FALLING              ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRB_BOTH                 ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_AEEVT        ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA
+#define     AT91C_TC_AEEVT_NONE                 ((unsigned int) 0x0 << 20) // (TC) Effect: none
+#define     AT91C_TC_AEEVT_SET                  ((unsigned int) 0x1 << 20) // (TC) Effect: set
+#define     AT91C_TC_AEEVT_CLEAR                ((unsigned int) 0x2 << 20) // (TC) Effect: clear
+#define     AT91C_TC_AEEVT_TOGGLE               ((unsigned int) 0x3 << 20) // (TC) Effect: toggle
+#define AT91C_TC_ASWTRG       ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA
+#define     AT91C_TC_ASWTRG_NONE                 ((unsigned int) 0x0 << 22) // (TC) Effect: none
+#define     AT91C_TC_ASWTRG_SET                  ((unsigned int) 0x1 << 22) // (TC) Effect: set
+#define     AT91C_TC_ASWTRG_CLEAR                ((unsigned int) 0x2 << 22) // (TC) Effect: clear
+#define     AT91C_TC_ASWTRG_TOGGLE               ((unsigned int) 0x3 << 22) // (TC) Effect: toggle
+#define AT91C_TC_BCPB         ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB
+#define     AT91C_TC_BCPB_NONE                 ((unsigned int) 0x0 << 24) // (TC) Effect: none
+#define     AT91C_TC_BCPB_SET                  ((unsigned int) 0x1 << 24) // (TC) Effect: set
+#define     AT91C_TC_BCPB_CLEAR                ((unsigned int) 0x2 << 24) // (TC) Effect: clear
+#define     AT91C_TC_BCPB_TOGGLE               ((unsigned int) 0x3 << 24) // (TC) Effect: toggle
+#define AT91C_TC_BCPC         ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB
+#define     AT91C_TC_BCPC_NONE                 ((unsigned int) 0x0 << 26) // (TC) Effect: none
+#define     AT91C_TC_BCPC_SET                  ((unsigned int) 0x1 << 26) // (TC) Effect: set
+#define     AT91C_TC_BCPC_CLEAR                ((unsigned int) 0x2 << 26) // (TC) Effect: clear
+#define     AT91C_TC_BCPC_TOGGLE               ((unsigned int) 0x3 << 26) // (TC) Effect: toggle
+#define AT91C_TC_BEEVT        ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB
+#define     AT91C_TC_BEEVT_NONE                 ((unsigned int) 0x0 << 28) // (TC) Effect: none
+#define     AT91C_TC_BEEVT_SET                  ((unsigned int) 0x1 << 28) // (TC) Effect: set
+#define     AT91C_TC_BEEVT_CLEAR                ((unsigned int) 0x2 << 28) // (TC) Effect: clear
+#define     AT91C_TC_BEEVT_TOGGLE               ((unsigned int) 0x3 << 28) // (TC) Effect: toggle
+#define AT91C_TC_BSWTRG       ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB
+#define     AT91C_TC_BSWTRG_NONE                 ((unsigned int) 0x0 << 30) // (TC) Effect: none
+#define     AT91C_TC_BSWTRG_SET                  ((unsigned int) 0x1 << 30) // (TC) Effect: set
+#define     AT91C_TC_BSWTRG_CLEAR                ((unsigned int) 0x2 << 30) // (TC) Effect: clear
+#define     AT91C_TC_BSWTRG_TOGGLE               ((unsigned int) 0x3 << 30) // (TC) Effect: toggle
+// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register --------
+#define AT91C_TC_COVFS        ((unsigned int) 0x1 <<  0) // (TC) Counter Overflow
+#define AT91C_TC_LOVRS        ((unsigned int) 0x1 <<  1) // (TC) Load Overrun
+#define AT91C_TC_CPAS         ((unsigned int) 0x1 <<  2) // (TC) RA Compare
+#define AT91C_TC_CPBS         ((unsigned int) 0x1 <<  3) // (TC) RB Compare
+#define AT91C_TC_CPCS         ((unsigned int) 0x1 <<  4) // (TC) RC Compare
+#define AT91C_TC_LDRAS        ((unsigned int) 0x1 <<  5) // (TC) RA Loading
+#define AT91C_TC_LDRBS        ((unsigned int) 0x1 <<  6) // (TC) RB Loading
+#define AT91C_TC_ETRGS        ((unsigned int) 0x1 <<  7) // (TC) External Trigger
+#define AT91C_TC_CLKSTA       ((unsigned int) 0x1 << 16) // (TC) Clock Enabling
+#define AT91C_TC_MTIOA        ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror
+#define AT91C_TC_MTIOB        ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror
+// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register --------
+// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register --------
+// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Interface
+// *****************************************************************************
+typedef struct _AT91S_TCB {
+    AT91S_TC     TCB_TC0;   // TC Channel 0
+    AT91_REG     Reserved0[4];  //
+    AT91S_TC     TCB_TC1;   // TC Channel 1
+    AT91_REG     Reserved1[4];  //
+    AT91S_TC     TCB_TC2;   // TC Channel 2
+    AT91_REG     Reserved2[4];  //
+    AT91_REG     TCB_BCR;   // TC Block Control Register
+    AT91_REG     TCB_BMR;   // TC Block Mode Register
+} AT91S_TCB, *AT91PS_TCB;
+
+// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register --------
+#define AT91C_TCB_SYNC        ((unsigned int) 0x1 <<  0) // (TCB) Synchro Command
+// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register --------
+#define AT91C_TCB_TC0XC0S     ((unsigned int) 0x3 <<  0) // (TCB) External Clock Signal 0 Selection
+#define     AT91C_TCB_TC0XC0S_TCLK0                ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0
+#define     AT91C_TCB_TC0XC0S_NONE                 ((unsigned int) 0x1) // (TCB) None signal connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA1                ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA2                ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0
+#define AT91C_TCB_TC1XC1S     ((unsigned int) 0x3 <<  2) // (TCB) External Clock Signal 1 Selection
+#define     AT91C_TCB_TC1XC1S_TCLK1                ((unsigned int) 0x0 <<  2) // (TCB) TCLK1 connected to XC1
+#define     AT91C_TCB_TC1XC1S_NONE                 ((unsigned int) 0x1 <<  2) // (TCB) None signal connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA0                ((unsigned int) 0x2 <<  2) // (TCB) TIOA0 connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA2                ((unsigned int) 0x3 <<  2) // (TCB) TIOA2 connected to XC1
+#define AT91C_TCB_TC2XC2S     ((unsigned int) 0x3 <<  4) // (TCB) External Clock Signal 2 Selection
+#define     AT91C_TCB_TC2XC2S_TCLK2                ((unsigned int) 0x0 <<  4) // (TCB) TCLK2 connected to XC2
+#define     AT91C_TCB_TC2XC2S_NONE                 ((unsigned int) 0x1 <<  4) // (TCB) None signal connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA0                ((unsigned int) 0x2 <<  4) // (TCB) TIOA0 connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA1                ((unsigned int) 0x3 <<  4) // (TCB) TIOA2 connected to XC2
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Control Area Network MailBox Interface
+// *****************************************************************************
+typedef struct _AT91S_CAN_MB {
+    AT91_REG     CAN_MB_MMR;    // MailBox Mode Register
+    AT91_REG     CAN_MB_MAM;    // MailBox Acceptance Mask Register
+    AT91_REG     CAN_MB_MID;    // MailBox ID Register
+    AT91_REG     CAN_MB_MFID;   // MailBox Family ID Register
+    AT91_REG     CAN_MB_MSR;    // MailBox Status Register
+    AT91_REG     CAN_MB_MDL;    // MailBox Data Low Register
+    AT91_REG     CAN_MB_MDH;    // MailBox Data High Register
+    AT91_REG     CAN_MB_MCR;    // MailBox Control Register
+} AT91S_CAN_MB, *AT91PS_CAN_MB;
+
+// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register --------
+#define AT91C_CAN_MTIMEMARK   ((unsigned int) 0xFFFF <<  0) // (CAN_MB) Mailbox Timemark
+#define AT91C_CAN_PRIOR       ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority
+#define AT91C_CAN_MOT         ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type
+#define     AT91C_CAN_MOT_DIS                  ((unsigned int) 0x0 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_RX                   ((unsigned int) 0x1 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_RXOVERWRITE          ((unsigned int) 0x2 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_TX                   ((unsigned int) 0x3 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_CONSUMER             ((unsigned int) 0x4 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_PRODUCER             ((unsigned int) 0x5 << 24) // (CAN_MB)
+// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register --------
+#define AT91C_CAN_MIDvB       ((unsigned int) 0x3FFFF <<  0) // (CAN_MB) Complementary bits for identifier in extended mode
+#define AT91C_CAN_MIDvA       ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode
+#define AT91C_CAN_MIDE        ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version
+// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register --------
+// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register --------
+// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register --------
+#define AT91C_CAN_MTIMESTAMP  ((unsigned int) 0xFFFF <<  0) // (CAN_MB) Timer Value
+#define AT91C_CAN_MDLC        ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code
+#define AT91C_CAN_MRTR        ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request
+#define AT91C_CAN_MABT        ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort
+#define AT91C_CAN_MRDY        ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready
+#define AT91C_CAN_MMI         ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored
+// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register --------
+// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register --------
+// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register --------
+#define AT91C_CAN_MACR        ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox
+#define AT91C_CAN_MTCR        ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Control Area Network Interface
+// *****************************************************************************
+typedef struct _AT91S_CAN {
+    AT91_REG     CAN_MR;    // Mode Register
+    AT91_REG     CAN_IER;   // Interrupt Enable Register
+    AT91_REG     CAN_IDR;   // Interrupt Disable Register
+    AT91_REG     CAN_IMR;   // Interrupt Mask Register
+    AT91_REG     CAN_SR;    // Status Register
+    AT91_REG     CAN_BR;    // Baudrate Register
+    AT91_REG     CAN_TIM;   // Timer Register
+    AT91_REG     CAN_TIMESTP;   // Time Stamp Register
+    AT91_REG     CAN_ECR;   // Error Counter Register
+    AT91_REG     CAN_TCR;   // Transfer Command Register
+    AT91_REG     CAN_ACR;   // Abort Command Register
+    AT91_REG     Reserved0[52];     //
+    AT91_REG     CAN_VR;    // Version Register
+    AT91_REG     Reserved1[64];     //
+    AT91S_CAN_MB     CAN_MB0;   // CAN Mailbox 0
+    AT91S_CAN_MB     CAN_MB1;   // CAN Mailbox 1
+    AT91S_CAN_MB     CAN_MB2;   // CAN Mailbox 2
+    AT91S_CAN_MB     CAN_MB3;   // CAN Mailbox 3
+    AT91S_CAN_MB     CAN_MB4;   // CAN Mailbox 4
+    AT91S_CAN_MB     CAN_MB5;   // CAN Mailbox 5
+    AT91S_CAN_MB     CAN_MB6;   // CAN Mailbox 6
+    AT91S_CAN_MB     CAN_MB7;   // CAN Mailbox 7
+    AT91S_CAN_MB     CAN_MB8;   // CAN Mailbox 8
+    AT91S_CAN_MB     CAN_MB9;   // CAN Mailbox 9
+    AT91S_CAN_MB     CAN_MB10;  // CAN Mailbox 10
+    AT91S_CAN_MB     CAN_MB11;  // CAN Mailbox 11
+    AT91S_CAN_MB     CAN_MB12;  // CAN Mailbox 12
+    AT91S_CAN_MB     CAN_MB13;  // CAN Mailbox 13
+    AT91S_CAN_MB     CAN_MB14;  // CAN Mailbox 14
+    AT91S_CAN_MB     CAN_MB15;  // CAN Mailbox 15
+} AT91S_CAN, *AT91PS_CAN;
+
+// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register --------
+#define AT91C_CAN_CANEN       ((unsigned int) 0x1 <<  0) // (CAN) CAN Controller Enable
+#define AT91C_CAN_LPM         ((unsigned int) 0x1 <<  1) // (CAN) Disable/Enable Low Power Mode
+#define AT91C_CAN_ABM         ((unsigned int) 0x1 <<  2) // (CAN) Disable/Enable Autobaud/Listen Mode
+#define AT91C_CAN_OVL         ((unsigned int) 0x1 <<  3) // (CAN) Disable/Enable Overload Frame
+#define AT91C_CAN_TEOF        ((unsigned int) 0x1 <<  4) // (CAN) Time Stamp messages at each end of Frame
+#define AT91C_CAN_TTM         ((unsigned int) 0x1 <<  5) // (CAN) Disable/Enable Time Trigger Mode
+#define AT91C_CAN_TIMFRZ      ((unsigned int) 0x1 <<  6) // (CAN) Enable Timer Freeze
+#define AT91C_CAN_DRPT        ((unsigned int) 0x1 <<  7) // (CAN) Disable Repeat
+// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register --------
+#define AT91C_CAN_MB0         ((unsigned int) 0x1 <<  0) // (CAN) Mailbox 0 Flag
+#define AT91C_CAN_MB1         ((unsigned int) 0x1 <<  1) // (CAN) Mailbox 1 Flag
+#define AT91C_CAN_MB2         ((unsigned int) 0x1 <<  2) // (CAN) Mailbox 2 Flag
+#define AT91C_CAN_MB3         ((unsigned int) 0x1 <<  3) // (CAN) Mailbox 3 Flag
+#define AT91C_CAN_MB4         ((unsigned int) 0x1 <<  4) // (CAN) Mailbox 4 Flag
+#define AT91C_CAN_MB5         ((unsigned int) 0x1 <<  5) // (CAN) Mailbox 5 Flag
+#define AT91C_CAN_MB6         ((unsigned int) 0x1 <<  6) // (CAN) Mailbox 6 Flag
+#define AT91C_CAN_MB7         ((unsigned int) 0x1 <<  7) // (CAN) Mailbox 7 Flag
+#define AT91C_CAN_MB8         ((unsigned int) 0x1 <<  8) // (CAN) Mailbox 8 Flag
+#define AT91C_CAN_MB9         ((unsigned int) 0x1 <<  9) // (CAN) Mailbox 9 Flag
+#define AT91C_CAN_MB10        ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag
+#define AT91C_CAN_MB11        ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag
+#define AT91C_CAN_MB12        ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag
+#define AT91C_CAN_MB13        ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag
+#define AT91C_CAN_MB14        ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag
+#define AT91C_CAN_MB15        ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag
+#define AT91C_CAN_ERRA        ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag
+#define AT91C_CAN_WARN        ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag
+#define AT91C_CAN_ERRP        ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag
+#define AT91C_CAN_BOFF        ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag
+#define AT91C_CAN_SLEEP       ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag
+#define AT91C_CAN_WAKEUP      ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag
+#define AT91C_CAN_TOVF        ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag
+#define AT91C_CAN_TSTP        ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag
+#define AT91C_CAN_CERR        ((unsigned int) 0x1 << 24) // (CAN) CRC Error
+#define AT91C_CAN_SERR        ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error
+#define AT91C_CAN_AERR        ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error
+#define AT91C_CAN_FERR        ((unsigned int) 0x1 << 27) // (CAN) Form Error
+#define AT91C_CAN_BERR        ((unsigned int) 0x1 << 28) // (CAN) Bit Error
+// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register --------
+// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register --------
+// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register --------
+#define AT91C_CAN_RBSY        ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy
+#define AT91C_CAN_TBSY        ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy
+#define AT91C_CAN_OVLY        ((unsigned int) 0x1 << 31) // (CAN) Overload Busy
+// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register --------
+#define AT91C_CAN_PHASE2      ((unsigned int) 0x7 <<  0) // (CAN) Phase 2 segment
+#define AT91C_CAN_PHASE1      ((unsigned int) 0x7 <<  4) // (CAN) Phase 1 segment
+#define AT91C_CAN_PROPAG      ((unsigned int) 0x7 <<  8) // (CAN) Programmation time segment
+#define AT91C_CAN_SYNC        ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment
+#define AT91C_CAN_BRP         ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler
+#define AT91C_CAN_SMP         ((unsigned int) 0x1 << 24) // (CAN) Sampling mode
+// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register --------
+#define AT91C_CAN_TIMER       ((unsigned int) 0xFFFF <<  0) // (CAN) Timer field
+// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register --------
+// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register --------
+#define AT91C_CAN_REC         ((unsigned int) 0xFF <<  0) // (CAN) Receive Error Counter
+#define AT91C_CAN_TEC         ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter
+// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register --------
+#define AT91C_CAN_TIMRST      ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field
+// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Ethernet MAC 10/100
+// *****************************************************************************
+typedef struct _AT91S_EMAC {
+    AT91_REG     EMAC_NCR;  // Network Control Register
+    AT91_REG     EMAC_NCFGR;    // Network Configuration Register
+    AT91_REG     EMAC_NSR;  // Network Status Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     EMAC_TSR;  // Transmit Status Register
+    AT91_REG     EMAC_RBQP;     // Receive Buffer Queue Pointer
+    AT91_REG     EMAC_TBQP;     // Transmit Buffer Queue Pointer
+    AT91_REG     EMAC_RSR;  // Receive Status Register
+    AT91_REG     EMAC_ISR;  // Interrupt Status Register
+    AT91_REG     EMAC_IER;  // Interrupt Enable Register
+    AT91_REG     EMAC_IDR;  // Interrupt Disable Register
+    AT91_REG     EMAC_IMR;  // Interrupt Mask Register
+    AT91_REG     EMAC_MAN;  // PHY Maintenance Register
+    AT91_REG     EMAC_PTR;  // Pause Time Register
+    AT91_REG     EMAC_PFR;  // Pause Frames received Register
+    AT91_REG     EMAC_FTO;  // Frames Transmitted OK Register
+    AT91_REG     EMAC_SCF;  // Single Collision Frame Register
+    AT91_REG     EMAC_MCF;  // Multiple Collision Frame Register
+    AT91_REG     EMAC_FRO;  // Frames Received OK Register
+    AT91_REG     EMAC_FCSE;     // Frame Check Sequence Error Register
+    AT91_REG     EMAC_ALE;  // Alignment Error Register
+    AT91_REG     EMAC_DTF;  // Deferred Transmission Frame Register
+    AT91_REG     EMAC_LCOL;     // Late Collision Register
+    AT91_REG     EMAC_ECOL;     // Excessive Collision Register
+    AT91_REG     EMAC_TUND;     // Transmit Underrun Error Register
+    AT91_REG     EMAC_CSE;  // Carrier Sense Error Register
+    AT91_REG     EMAC_RRE;  // Receive Ressource Error Register
+    AT91_REG     EMAC_ROV;  // Receive Overrun Errors Register
+    AT91_REG     EMAC_RSE;  // Receive Symbol Errors Register
+    AT91_REG     EMAC_ELE;  // Excessive Length Errors Register
+    AT91_REG     EMAC_RJA;  // Receive Jabbers Register
+    AT91_REG     EMAC_USF;  // Undersize Frames Register
+    AT91_REG     EMAC_STE;  // SQE Test Error Register
+    AT91_REG     EMAC_RLE;  // Receive Length Field Mismatch Register
+    AT91_REG     EMAC_TPF;  // Transmitted Pause Frames Register
+    AT91_REG     EMAC_HRB;  // Hash Address Bottom[31:0]
+    AT91_REG     EMAC_HRT;  // Hash Address Top[63:32]
+    AT91_REG     EMAC_SA1L;     // Specific Address 1 Bottom, First 4 bytes
+    AT91_REG     EMAC_SA1H;     // Specific Address 1 Top, Last 2 bytes
+    AT91_REG     EMAC_SA2L;     // Specific Address 2 Bottom, First 4 bytes
+    AT91_REG     EMAC_SA2H;     // Specific Address 2 Top, Last 2 bytes
+    AT91_REG     EMAC_SA3L;     // Specific Address 3 Bottom, First 4 bytes
+    AT91_REG     EMAC_SA3H;     // Specific Address 3 Top, Last 2 bytes
+    AT91_REG     EMAC_SA4L;     // Specific Address 4 Bottom, First 4 bytes
+    AT91_REG     EMAC_SA4H;     // Specific Address 4 Top, Last 2 bytes
+    AT91_REG     EMAC_TID;  // Type ID Checking Register
+    AT91_REG     EMAC_TPQ;  // Transmit Pause Quantum Register
+    AT91_REG     EMAC_USRIO;    // USER Input/Output Register
+    AT91_REG     EMAC_WOL;  // Wake On LAN Register
+    AT91_REG     Reserved1[13];     //
+    AT91_REG     EMAC_REV;  // Revision Register
+} AT91S_EMAC, *AT91PS_EMAC;
+
+// -------- EMAC_NCR : (EMAC Offset: 0x0)  --------
+#define AT91C_EMAC_LB         ((unsigned int) 0x1 <<  0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level.
+#define AT91C_EMAC_LLB        ((unsigned int) 0x1 <<  1) // (EMAC) Loopback local.
+#define AT91C_EMAC_RE         ((unsigned int) 0x1 <<  2) // (EMAC) Receive enable.
+#define AT91C_EMAC_TE         ((unsigned int) 0x1 <<  3) // (EMAC) Transmit enable.
+#define AT91C_EMAC_MPE        ((unsigned int) 0x1 <<  4) // (EMAC) Management port enable.
+#define AT91C_EMAC_CLRSTAT    ((unsigned int) 0x1 <<  5) // (EMAC) Clear statistics registers.
+#define AT91C_EMAC_INCSTAT    ((unsigned int) 0x1 <<  6) // (EMAC) Increment statistics registers.
+#define AT91C_EMAC_WESTAT     ((unsigned int) 0x1 <<  7) // (EMAC) Write enable for statistics registers.
+#define AT91C_EMAC_BP         ((unsigned int) 0x1 <<  8) // (EMAC) Back pressure.
+#define AT91C_EMAC_TSTART     ((unsigned int) 0x1 <<  9) // (EMAC) Start Transmission.
+#define AT91C_EMAC_THALT      ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt.
+#define AT91C_EMAC_TPFR       ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame
+#define AT91C_EMAC_TZQ        ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame
+// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register --------
+#define AT91C_EMAC_SPD        ((unsigned int) 0x1 <<  0) // (EMAC) Speed.
+#define AT91C_EMAC_FD         ((unsigned int) 0x1 <<  1) // (EMAC) Full duplex.
+#define AT91C_EMAC_JFRAME     ((unsigned int) 0x1 <<  3) // (EMAC) Jumbo Frames.
+#define AT91C_EMAC_CAF        ((unsigned int) 0x1 <<  4) // (EMAC) Copy all frames.
+#define AT91C_EMAC_NBC        ((unsigned int) 0x1 <<  5) // (EMAC) No broadcast.
+#define AT91C_EMAC_MTI        ((unsigned int) 0x1 <<  6) // (EMAC) Multicast hash event enable
+#define AT91C_EMAC_UNI        ((unsigned int) 0x1 <<  7) // (EMAC) Unicast hash enable.
+#define AT91C_EMAC_BIG        ((unsigned int) 0x1 <<  8) // (EMAC) Receive 1522 bytes.
+#define AT91C_EMAC_EAE        ((unsigned int) 0x1 <<  9) // (EMAC) External address match enable.
+#define AT91C_EMAC_CLK        ((unsigned int) 0x3 << 10) // (EMAC)
+#define     AT91C_EMAC_CLK_HCLK_8               ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8
+#define     AT91C_EMAC_CLK_HCLK_16              ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16
+#define     AT91C_EMAC_CLK_HCLK_32              ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32
+#define     AT91C_EMAC_CLK_HCLK_64              ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64
+#define AT91C_EMAC_RTY        ((unsigned int) 0x1 << 12) // (EMAC)
+#define AT91C_EMAC_PAE        ((unsigned int) 0x1 << 13) // (EMAC)
+#define AT91C_EMAC_RBOF       ((unsigned int) 0x3 << 14) // (EMAC)
+#define     AT91C_EMAC_RBOF_OFFSET_0             ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_1             ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_2             ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_3             ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer
+#define AT91C_EMAC_RLCE       ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable
+#define AT91C_EMAC_DRFCS      ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS
+#define AT91C_EMAC_EFRHD      ((unsigned int) 0x1 << 18) // (EMAC)
+#define AT91C_EMAC_IRXFCS     ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS
+// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register --------
+#define AT91C_EMAC_LINKR      ((unsigned int) 0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_MDIO       ((unsigned int) 0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_IDLE       ((unsigned int) 0x1 <<  2) // (EMAC)
+// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register --------
+#define AT91C_EMAC_UBR        ((unsigned int) 0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_COL        ((unsigned int) 0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_RLES       ((unsigned int) 0x1 <<  2) // (EMAC)
+#define AT91C_EMAC_TGO        ((unsigned int) 0x1 <<  3) // (EMAC) Transmit Go
+#define AT91C_EMAC_BEX        ((unsigned int) 0x1 <<  4) // (EMAC) Buffers exhausted mid frame
+#define AT91C_EMAC_COMP       ((unsigned int) 0x1 <<  5) // (EMAC)
+#define AT91C_EMAC_UND        ((unsigned int) 0x1 <<  6) // (EMAC)
+// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register --------
+#define AT91C_EMAC_BNA        ((unsigned int) 0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_REC        ((unsigned int) 0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_OVR        ((unsigned int) 0x1 <<  2) // (EMAC)
+// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register --------
+#define AT91C_EMAC_MFD        ((unsigned int) 0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_RCOMP      ((unsigned int) 0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_RXUBR      ((unsigned int) 0x1 <<  2) // (EMAC)
+#define AT91C_EMAC_TXUBR      ((unsigned int) 0x1 <<  3) // (EMAC)
+#define AT91C_EMAC_TUNDR      ((unsigned int) 0x1 <<  4) // (EMAC)
+#define AT91C_EMAC_RLEX       ((unsigned int) 0x1 <<  5) // (EMAC)
+#define AT91C_EMAC_TXERR      ((unsigned int) 0x1 <<  6) // (EMAC)
+#define AT91C_EMAC_TCOMP      ((unsigned int) 0x1 <<  7) // (EMAC)
+#define AT91C_EMAC_LINK       ((unsigned int) 0x1 <<  9) // (EMAC)
+#define AT91C_EMAC_ROVR       ((unsigned int) 0x1 << 10) // (EMAC)
+#define AT91C_EMAC_HRESP      ((unsigned int) 0x1 << 11) // (EMAC)
+#define AT91C_EMAC_PFRE       ((unsigned int) 0x1 << 12) // (EMAC)
+#define AT91C_EMAC_PTZ        ((unsigned int) 0x1 << 13) // (EMAC)
+// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register --------
+// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register --------
+// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register --------
+// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register --------
+#define AT91C_EMAC_DATA       ((unsigned int) 0xFFFF <<  0) // (EMAC)
+#define AT91C_EMAC_CODE       ((unsigned int) 0x3 << 16) // (EMAC)
+#define AT91C_EMAC_REGA       ((unsigned int) 0x1F << 18) // (EMAC)
+#define AT91C_EMAC_PHYA       ((unsigned int) 0x1F << 23) // (EMAC)
+#define AT91C_EMAC_RW         ((unsigned int) 0x3 << 28) // (EMAC)
+#define AT91C_EMAC_SOF        ((unsigned int) 0x3 << 30) // (EMAC)
+// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register --------
+#define AT91C_EMAC_RMII       ((unsigned int) 0x1 <<  0) // (EMAC) Reduce MII
+// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register --------
+#define AT91C_EMAC_IP         ((unsigned int) 0xFFFF <<  0) // (EMAC) ARP request IP address
+#define AT91C_EMAC_MAG        ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable
+#define AT91C_EMAC_ARP        ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable
+#define AT91C_EMAC_SA1        ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable
+// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register --------
+#define AT91C_EMAC_REVREF     ((unsigned int) 0xFFFF <<  0) // (EMAC)
+#define AT91C_EMAC_PARTREF    ((unsigned int) 0xFFFF << 16) // (EMAC)
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor
+// *****************************************************************************
+typedef struct _AT91S_ADC {
+    AT91_REG     ADC_CR;    // ADC Control Register
+    AT91_REG     ADC_MR;    // ADC Mode Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     ADC_CHER;  // ADC Channel Enable Register
+    AT91_REG     ADC_CHDR;  // ADC Channel Disable Register
+    AT91_REG     ADC_CHSR;  // ADC Channel Status Register
+    AT91_REG     ADC_SR;    // ADC Status Register
+    AT91_REG     ADC_LCDR;  // ADC Last Converted Data Register
+    AT91_REG     ADC_IER;   // ADC Interrupt Enable Register
+    AT91_REG     ADC_IDR;   // ADC Interrupt Disable Register
+    AT91_REG     ADC_IMR;   // ADC Interrupt Mask Register
+    AT91_REG     ADC_CDR0;  // ADC Channel Data Register 0
+    AT91_REG     ADC_CDR1;  // ADC Channel Data Register 1
+    AT91_REG     ADC_CDR2;  // ADC Channel Data Register 2
+    AT91_REG     ADC_CDR3;  // ADC Channel Data Register 3
+    AT91_REG     ADC_CDR4;  // ADC Channel Data Register 4
+    AT91_REG     ADC_CDR5;  // ADC Channel Data Register 5
+    AT91_REG     ADC_CDR6;  // ADC Channel Data Register 6
+    AT91_REG     ADC_CDR7;  // ADC Channel Data Register 7
+    AT91_REG     Reserved1[44];     //
+    AT91_REG     ADC_RPR;   // Receive Pointer Register
+    AT91_REG     ADC_RCR;   // Receive Counter Register
+    AT91_REG     ADC_TPR;   // Transmit Pointer Register
+    AT91_REG     ADC_TCR;   // Transmit Counter Register
+    AT91_REG     ADC_RNPR;  // Receive Next Pointer Register
+    AT91_REG     ADC_RNCR;  // Receive Next Counter Register
+    AT91_REG     ADC_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     ADC_TNCR;  // Transmit Next Counter Register
+    AT91_REG     ADC_PTCR;  // PDC Transfer Control Register
+    AT91_REG     ADC_PTSR;  // PDC Transfer Status Register
+} AT91S_ADC, *AT91PS_ADC;
+
+// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register --------
+#define AT91C_ADC_SWRST       ((unsigned int) 0x1 <<  0) // (ADC) Software Reset
+#define AT91C_ADC_START       ((unsigned int) 0x1 <<  1) // (ADC) Start Conversion
+// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register --------
+#define AT91C_ADC_TRGEN       ((unsigned int) 0x1 <<  0) // (ADC) Trigger Enable
+#define     AT91C_ADC_TRGEN_DIS                  ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software
+#define     AT91C_ADC_TRGEN_EN                   ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.
+#define AT91C_ADC_TRGSEL      ((unsigned int) 0x7 <<  1) // (ADC) Trigger Selection
+#define     AT91C_ADC_TRGSEL_TIOA0                ((unsigned int) 0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0
+#define     AT91C_ADC_TRGSEL_TIOA1                ((unsigned int) 0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1
+#define     AT91C_ADC_TRGSEL_TIOA2                ((unsigned int) 0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2
+#define     AT91C_ADC_TRGSEL_TIOA3                ((unsigned int) 0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3
+#define     AT91C_ADC_TRGSEL_TIOA4                ((unsigned int) 0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4
+#define     AT91C_ADC_TRGSEL_TIOA5                ((unsigned int) 0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5
+#define     AT91C_ADC_TRGSEL_EXT                  ((unsigned int) 0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger
+#define AT91C_ADC_LOWRES      ((unsigned int) 0x1 <<  4) // (ADC) Resolution.
+#define     AT91C_ADC_LOWRES_10_BIT               ((unsigned int) 0x0 <<  4) // (ADC) 10-bit resolution
+#define     AT91C_ADC_LOWRES_8_BIT                ((unsigned int) 0x1 <<  4) // (ADC) 8-bit resolution
+#define AT91C_ADC_SLEEP       ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode
+#define     AT91C_ADC_SLEEP_NORMAL_MODE          ((unsigned int) 0x0 <<  5) // (ADC) Normal Mode
+#define     AT91C_ADC_SLEEP_MODE                 ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode
+#define AT91C_ADC_PRESCAL     ((unsigned int) 0x3F <<  8) // (ADC) Prescaler rate selection
+#define AT91C_ADC_STARTUP     ((unsigned int) 0x1F << 16) // (ADC) Startup Time
+#define AT91C_ADC_SHTIM       ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time
+// --------     ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register --------
+#define AT91C_ADC_CH0         ((unsigned int) 0x1 <<  0) // (ADC) Channel 0
+#define AT91C_ADC_CH1         ((unsigned int) 0x1 <<  1) // (ADC) Channel 1
+#define AT91C_ADC_CH2         ((unsigned int) 0x1 <<  2) // (ADC) Channel 2
+#define AT91C_ADC_CH3         ((unsigned int) 0x1 <<  3) // (ADC) Channel 3
+#define AT91C_ADC_CH4         ((unsigned int) 0x1 <<  4) // (ADC) Channel 4
+#define AT91C_ADC_CH5         ((unsigned int) 0x1 <<  5) // (ADC) Channel 5
+#define AT91C_ADC_CH6         ((unsigned int) 0x1 <<  6) // (ADC) Channel 6
+#define AT91C_ADC_CH7         ((unsigned int) 0x1 <<  7) // (ADC) Channel 7
+// --------     ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register --------
+// --------     ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register --------
+// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register --------
+#define AT91C_ADC_EOC0        ((unsigned int) 0x1 <<  0) // (ADC) End of Conversion
+#define AT91C_ADC_EOC1        ((unsigned int) 0x1 <<  1) // (ADC) End of Conversion
+#define AT91C_ADC_EOC2        ((unsigned int) 0x1 <<  2) // (ADC) End of Conversion
+#define AT91C_ADC_EOC3        ((unsigned int) 0x1 <<  3) // (ADC) End of Conversion
+#define AT91C_ADC_EOC4        ((unsigned int) 0x1 <<  4) // (ADC) End of Conversion
+#define AT91C_ADC_EOC5        ((unsigned int) 0x1 <<  5) // (ADC) End of Conversion
+#define AT91C_ADC_EOC6        ((unsigned int) 0x1 <<  6) // (ADC) End of Conversion
+#define AT91C_ADC_EOC7        ((unsigned int) 0x1 <<  7) // (ADC) End of Conversion
+#define AT91C_ADC_OVRE0       ((unsigned int) 0x1 <<  8) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE1       ((unsigned int) 0x1 <<  9) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE2       ((unsigned int) 0x1 << 10) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE3       ((unsigned int) 0x1 << 11) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE4       ((unsigned int) 0x1 << 12) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE5       ((unsigned int) 0x1 << 13) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE6       ((unsigned int) 0x1 << 14) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE7       ((unsigned int) 0x1 << 15) // (ADC) Overrun Error
+#define AT91C_ADC_DRDY        ((unsigned int) 0x1 << 16) // (ADC) Data Ready
+#define AT91C_ADC_GOVRE       ((unsigned int) 0x1 << 17) // (ADC) General Overrun
+#define AT91C_ADC_ENDRX       ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer
+#define AT91C_ADC_RXBUFF      ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt
+// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register --------
+#define AT91C_ADC_LDATA       ((unsigned int) 0x3FF <<  0) // (ADC) Last Data Converted
+// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register --------
+// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register --------
+// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register --------
+// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 --------
+#define AT91C_ADC_DATA        ((unsigned int) 0x3FF <<  0) // (ADC) Converted Data
+// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 --------
+// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 --------
+// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 --------
+// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 --------
+// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 --------
+// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 --------
+// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Advanced  Encryption Standard
+// *****************************************************************************
+typedef struct _AT91S_AES {
+    AT91_REG     AES_CR;    // Control Register
+    AT91_REG     AES_MR;    // Mode Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     AES_IER;   // Interrupt Enable Register
+    AT91_REG     AES_IDR;   // Interrupt Disable Register
+    AT91_REG     AES_IMR;   // Interrupt Mask Register
+    AT91_REG     AES_ISR;   // Interrupt Status Register
+    AT91_REG     AES_KEYWxR[4];     // Key Word x Register
+    AT91_REG     Reserved1[4];  //
+    AT91_REG     AES_IDATAxR[4];    // Input Data x Register
+    AT91_REG     AES_ODATAxR[4];    // Output Data x Register
+    AT91_REG     AES_IVxR[4];   // Initialization Vector x Register
+    AT91_REG     Reserved2[35];     //
+    AT91_REG     AES_VR;    // AES Version Register
+    AT91_REG     AES_RPR;   // Receive Pointer Register
+    AT91_REG     AES_RCR;   // Receive Counter Register
+    AT91_REG     AES_TPR;   // Transmit Pointer Register
+    AT91_REG     AES_TCR;   // Transmit Counter Register
+    AT91_REG     AES_RNPR;  // Receive Next Pointer Register
+    AT91_REG     AES_RNCR;  // Receive Next Counter Register
+    AT91_REG     AES_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     AES_TNCR;  // Transmit Next Counter Register
+    AT91_REG     AES_PTCR;  // PDC Transfer Control Register
+    AT91_REG     AES_PTSR;  // PDC Transfer Status Register
+} AT91S_AES, *AT91PS_AES;
+
+// -------- AES_CR : (AES Offset: 0x0) Control Register --------
+#define AT91C_AES_START       ((unsigned int) 0x1 <<  0) // (AES) Starts Processing
+#define AT91C_AES_SWRST       ((unsigned int) 0x1 <<  8) // (AES) Software Reset
+#define AT91C_AES_LOADSEED    ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading
+// -------- AES_MR : (AES Offset: 0x4) Mode Register --------
+#define AT91C_AES_CIPHER      ((unsigned int) 0x1 <<  0) // (AES) Processing Mode
+#define AT91C_AES_PROCDLY     ((unsigned int) 0xF <<  4) // (AES) Processing Delay
+#define AT91C_AES_SMOD        ((unsigned int) 0x3 <<  8) // (AES) Start Mode
+#define     AT91C_AES_SMOD_MANUAL               ((unsigned int) 0x0 <<  8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption.
+#define     AT91C_AES_SMOD_AUTO                 ((unsigned int) 0x1 <<  8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet).
+#define     AT91C_AES_SMOD_PDC                  ((unsigned int) 0x2 <<  8) // (AES) PDC Mode (cf datasheet).
+#define AT91C_AES_OPMOD       ((unsigned int) 0x7 << 12) // (AES) Operation Mode
+#define     AT91C_AES_OPMOD_ECB                  ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode.
+#define     AT91C_AES_OPMOD_CBC                  ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode.
+#define     AT91C_AES_OPMOD_OFB                  ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode.
+#define     AT91C_AES_OPMOD_CFB                  ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode.
+#define     AT91C_AES_OPMOD_CTR                  ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode.
+#define AT91C_AES_LOD         ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode
+#define AT91C_AES_CFBS        ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size
+#define     AT91C_AES_CFBS_128_BIT              ((unsigned int) 0x0 << 16) // (AES) 128-bit.
+#define     AT91C_AES_CFBS_64_BIT               ((unsigned int) 0x1 << 16) // (AES) 64-bit.
+#define     AT91C_AES_CFBS_32_BIT               ((unsigned int) 0x2 << 16) // (AES) 32-bit.
+#define     AT91C_AES_CFBS_16_BIT               ((unsigned int) 0x3 << 16) // (AES) 16-bit.
+#define     AT91C_AES_CFBS_8_BIT                ((unsigned int) 0x4 << 16) // (AES) 8-bit.
+#define AT91C_AES_CKEY        ((unsigned int) 0xF << 20) // (AES) Countermeasure Key
+#define AT91C_AES_CTYPE       ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type
+#define     AT91C_AES_CTYPE_TYPE1_EN             ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled.
+#define     AT91C_AES_CTYPE_TYPE2_EN             ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled.
+#define     AT91C_AES_CTYPE_TYPE3_EN             ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled.
+#define     AT91C_AES_CTYPE_TYPE4_EN             ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled.
+#define     AT91C_AES_CTYPE_TYPE5_EN             ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled.
+// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register --------
+#define AT91C_AES_DATRDY      ((unsigned int) 0x1 <<  0) // (AES) DATRDY
+#define AT91C_AES_ENDRX       ((unsigned int) 0x1 <<  1) // (AES) PDC Read Buffer End
+#define AT91C_AES_ENDTX       ((unsigned int) 0x1 <<  2) // (AES) PDC Write Buffer End
+#define AT91C_AES_RXBUFF      ((unsigned int) 0x1 <<  3) // (AES) PDC Read Buffer Full
+#define AT91C_AES_TXBUFE      ((unsigned int) 0x1 <<  4) // (AES) PDC Write Buffer Empty
+#define AT91C_AES_URAD        ((unsigned int) 0x1 <<  8) // (AES) Unspecified Register Access Detection
+// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register --------
+// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register --------
+// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register --------
+#define AT91C_AES_URAT        ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status
+#define     AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode.
+#define     AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing.
+#define     AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing.
+#define     AT91C_AES_URAT_OUT_DAT_READ_SUBKEY  ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation.
+#define     AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation.
+#define     AT91C_AES_URAT_WO_REG_READ          ((unsigned int) 0x5 << 12) // (AES) Write-only register read access.
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Triple Data Encryption Standard
+// *****************************************************************************
+typedef struct _AT91S_TDES {
+    AT91_REG     TDES_CR;   // Control Register
+    AT91_REG     TDES_MR;   // Mode Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     TDES_IER;  // Interrupt Enable Register
+    AT91_REG     TDES_IDR;  // Interrupt Disable Register
+    AT91_REG     TDES_IMR;  // Interrupt Mask Register
+    AT91_REG     TDES_ISR;  // Interrupt Status Register
+    AT91_REG     TDES_KEY1WxR[2];   // Key 1 Word x Register
+    AT91_REG     TDES_KEY2WxR[2];   // Key 2 Word x Register
+    AT91_REG     TDES_KEY3WxR[2];   // Key 3 Word x Register
+    AT91_REG     Reserved1[2];  //
+    AT91_REG     TDES_IDATAxR[2];   // Input Data x Register
+    AT91_REG     Reserved2[2];  //
+    AT91_REG     TDES_ODATAxR[2];   // Output Data x Register
+    AT91_REG     Reserved3[2];  //
+    AT91_REG     TDES_IVxR[2];  // Initialization Vector x Register
+    AT91_REG     Reserved4[37];     //
+    AT91_REG     TDES_VR;   // TDES Version Register
+    AT91_REG     TDES_RPR;  // Receive Pointer Register
+    AT91_REG     TDES_RCR;  // Receive Counter Register
+    AT91_REG     TDES_TPR;  // Transmit Pointer Register
+    AT91_REG     TDES_TCR;  // Transmit Counter Register
+    AT91_REG     TDES_RNPR;     // Receive Next Pointer Register
+    AT91_REG     TDES_RNCR;     // Receive Next Counter Register
+    AT91_REG     TDES_TNPR;     // Transmit Next Pointer Register
+    AT91_REG     TDES_TNCR;     // Transmit Next Counter Register
+    AT91_REG     TDES_PTCR;     // PDC Transfer Control Register
+    AT91_REG     TDES_PTSR;     // PDC Transfer Status Register
+} AT91S_TDES, *AT91PS_TDES;
+
+// -------- TDES_CR : (TDES Offset: 0x0) Control Register --------
+#define AT91C_TDES_START      ((unsigned int) 0x1 <<  0) // (TDES) Starts Processing
+#define AT91C_TDES_SWRST      ((unsigned int) 0x1 <<  8) // (TDES) Software Reset
+// -------- TDES_MR : (TDES Offset: 0x4) Mode Register --------
+#define AT91C_TDES_CIPHER     ((unsigned int) 0x1 <<  0) // (TDES) Processing Mode
+#define AT91C_TDES_TDESMOD    ((unsigned int) 0x1 <<  1) // (TDES) Single or Triple DES Mode
+#define AT91C_TDES_KEYMOD     ((unsigned int) 0x1 <<  4) // (TDES) Key Mode
+#define AT91C_TDES_SMOD       ((unsigned int) 0x3 <<  8) // (TDES) Start Mode
+#define     AT91C_TDES_SMOD_MANUAL               ((unsigned int) 0x0 <<  8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption.
+#define     AT91C_TDES_SMOD_AUTO                 ((unsigned int) 0x1 <<  8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet).
+#define     AT91C_TDES_SMOD_PDC                  ((unsigned int) 0x2 <<  8) // (TDES) PDC Mode (cf datasheet).
+#define AT91C_TDES_OPMOD      ((unsigned int) 0x3 << 12) // (TDES) Operation Mode
+#define     AT91C_TDES_OPMOD_ECB                  ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode.
+#define     AT91C_TDES_OPMOD_CBC                  ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode.
+#define     AT91C_TDES_OPMOD_OFB                  ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode.
+#define     AT91C_TDES_OPMOD_CFB                  ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode.
+#define AT91C_TDES_LOD        ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode
+#define AT91C_TDES_CFBS       ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size
+#define     AT91C_TDES_CFBS_64_BIT               ((unsigned int) 0x0 << 16) // (TDES) 64-bit.
+#define     AT91C_TDES_CFBS_32_BIT               ((unsigned int) 0x1 << 16) // (TDES) 32-bit.
+#define     AT91C_TDES_CFBS_16_BIT               ((unsigned int) 0x2 << 16) // (TDES) 16-bit.
+#define     AT91C_TDES_CFBS_8_BIT                ((unsigned int) 0x3 << 16) // (TDES) 8-bit.
+// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register --------
+#define AT91C_TDES_DATRDY     ((unsigned int) 0x1 <<  0) // (TDES) DATRDY
+#define AT91C_TDES_ENDRX      ((unsigned int) 0x1 <<  1) // (TDES) PDC Read Buffer End
+#define AT91C_TDES_ENDTX      ((unsigned int) 0x1 <<  2) // (TDES) PDC Write Buffer End
+#define AT91C_TDES_RXBUFF     ((unsigned int) 0x1 <<  3) // (TDES) PDC Read Buffer Full
+#define AT91C_TDES_TXBUFE     ((unsigned int) 0x1 <<  4) // (TDES) PDC Write Buffer Empty
+#define AT91C_TDES_URAD       ((unsigned int) 0x1 <<  8) // (TDES) Unspecified Register Access Detection
+// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register --------
+// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register --------
+// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register --------
+#define AT91C_TDES_URAT       ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status
+#define     AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode.
+#define     AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing.
+#define     AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing.
+#define     AT91C_TDES_URAT_WO_REG_READ          ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access.
+
+// *****************************************************************************
+//               REGISTER ADDRESS DEFINITION FOR AT91SAM7X128
+// *****************************************************************************
+// ========== Register definition for SYS peripheral ==========
+// ========== Register definition for AIC peripheral ==========
+#define AT91C_AIC_IVR   ((AT91_REG *)   0xFFFFF100) // (AIC) IRQ Vector Register
+#define AT91C_AIC_SMR   ((AT91_REG *)   0xFFFFF000) // (AIC) Source Mode Register
+#define AT91C_AIC_FVR   ((AT91_REG *)   0xFFFFF104) // (AIC) FIQ Vector Register
+#define AT91C_AIC_DCR   ((AT91_REG *)   0xFFFFF138) // (AIC) Debug Control Register (Protect)
+#define AT91C_AIC_EOICR ((AT91_REG *)   0xFFFFF130) // (AIC) End of Interrupt Command Register
+#define AT91C_AIC_SVR   ((AT91_REG *)   0xFFFFF080) // (AIC) Source Vector Register
+#define AT91C_AIC_FFSR  ((AT91_REG *)   0xFFFFF148) // (AIC) Fast Forcing Status Register
+#define AT91C_AIC_ICCR  ((AT91_REG *)   0xFFFFF128) // (AIC) Interrupt Clear Command Register
+#define AT91C_AIC_ISR   ((AT91_REG *)   0xFFFFF108) // (AIC) Interrupt Status Register
+#define AT91C_AIC_IMR   ((AT91_REG *)   0xFFFFF110) // (AIC) Interrupt Mask Register
+#define AT91C_AIC_IPR   ((AT91_REG *)   0xFFFFF10C) // (AIC) Interrupt Pending Register
+#define AT91C_AIC_FFER  ((AT91_REG *)   0xFFFFF140) // (AIC) Fast Forcing Enable Register
+#define AT91C_AIC_IECR  ((AT91_REG *)   0xFFFFF120) // (AIC) Interrupt Enable Command Register
+#define AT91C_AIC_ISCR  ((AT91_REG *)   0xFFFFF12C) // (AIC) Interrupt Set Command Register
+#define AT91C_AIC_FFDR  ((AT91_REG *)   0xFFFFF144) // (AIC) Fast Forcing Disable Register
+#define AT91C_AIC_CISR  ((AT91_REG *)   0xFFFFF114) // (AIC) Core Interrupt Status Register
+#define AT91C_AIC_IDCR  ((AT91_REG *)   0xFFFFF124) // (AIC) Interrupt Disable Command Register
+#define AT91C_AIC_SPU   ((AT91_REG *)   0xFFFFF134) // (AIC) Spurious Vector Register
+// ========== Register definition for PDC_DBGU peripheral ==========
+#define AT91C_DBGU_TCR  ((AT91_REG *)   0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register
+#define AT91C_DBGU_RNPR ((AT91_REG *)   0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register
+#define AT91C_DBGU_TNPR ((AT91_REG *)   0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register
+#define AT91C_DBGU_TPR  ((AT91_REG *)   0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register
+#define AT91C_DBGU_RPR  ((AT91_REG *)   0xFFFFF300) // (PDC_DBGU) Receive Pointer Register
+#define AT91C_DBGU_RCR  ((AT91_REG *)   0xFFFFF304) // (PDC_DBGU) Receive Counter Register
+#define AT91C_DBGU_RNCR ((AT91_REG *)   0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register
+#define AT91C_DBGU_PTCR ((AT91_REG *)   0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register
+#define AT91C_DBGU_PTSR ((AT91_REG *)   0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register
+#define AT91C_DBGU_TNCR ((AT91_REG *)   0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register
+// ========== Register definition for DBGU peripheral ==========
+#define AT91C_DBGU_EXID ((AT91_REG *)   0xFFFFF244) // (DBGU) Chip ID Extension Register
+#define AT91C_DBGU_BRGR ((AT91_REG *)   0xFFFFF220) // (DBGU) Baud Rate Generator Register
+#define AT91C_DBGU_IDR  ((AT91_REG *)   0xFFFFF20C) // (DBGU) Interrupt Disable Register
+#define AT91C_DBGU_CSR  ((AT91_REG *)   0xFFFFF214) // (DBGU) Channel Status Register
+#define AT91C_DBGU_CIDR ((AT91_REG *)   0xFFFFF240) // (DBGU) Chip ID Register
+#define AT91C_DBGU_MR   ((AT91_REG *)   0xFFFFF204) // (DBGU) Mode Register
+#define AT91C_DBGU_IMR  ((AT91_REG *)   0xFFFFF210) // (DBGU) Interrupt Mask Register
+#define AT91C_DBGU_CR   ((AT91_REG *)   0xFFFFF200) // (DBGU) Control Register
+#define AT91C_DBGU_FNTR ((AT91_REG *)   0xFFFFF248) // (DBGU) Force NTRST Register
+#define AT91C_DBGU_THR  ((AT91_REG *)   0xFFFFF21C) // (DBGU) Transmitter Holding Register
+#define AT91C_DBGU_RHR  ((AT91_REG *)   0xFFFFF218) // (DBGU) Receiver Holding Register
+#define AT91C_DBGU_IER  ((AT91_REG *)   0xFFFFF208) // (DBGU) Interrupt Enable Register
+// ========== Register definition for PIOA peripheral ==========
+#define AT91C_PIOA_ODR  ((AT91_REG *)   0xFFFFF414) // (PIOA) Output Disable Registerr
+#define AT91C_PIOA_SODR ((AT91_REG *)   0xFFFFF430) // (PIOA) Set Output Data Register
+#define AT91C_PIOA_ISR  ((AT91_REG *)   0xFFFFF44C) // (PIOA) Interrupt Status Register
+#define AT91C_PIOA_ABSR ((AT91_REG *)   0xFFFFF478) // (PIOA) AB Select Status Register
+#define AT91C_PIOA_IER  ((AT91_REG *)   0xFFFFF440) // (PIOA) Interrupt Enable Register
+#define AT91C_PIOA_PPUDR ((AT91_REG *)  0xFFFFF460) // (PIOA) Pull-up Disable Register
+#define AT91C_PIOA_IMR  ((AT91_REG *)   0xFFFFF448) // (PIOA) Interrupt Mask Register
+#define AT91C_PIOA_PER  ((AT91_REG *)   0xFFFFF400) // (PIOA) PIO Enable Register
+#define AT91C_PIOA_IFDR ((AT91_REG *)   0xFFFFF424) // (PIOA) Input Filter Disable Register
+#define AT91C_PIOA_OWDR ((AT91_REG *)   0xFFFFF4A4) // (PIOA) Output Write Disable Register
+#define AT91C_PIOA_MDSR ((AT91_REG *)   0xFFFFF458) // (PIOA) Multi-driver Status Register
+#define AT91C_PIOA_IDR  ((AT91_REG *)   0xFFFFF444) // (PIOA) Interrupt Disable Register
+#define AT91C_PIOA_ODSR ((AT91_REG *)   0xFFFFF438) // (PIOA) Output Data Status Register
+#define AT91C_PIOA_PPUSR ((AT91_REG *)  0xFFFFF468) // (PIOA) Pull-up Status Register
+#define AT91C_PIOA_OWSR ((AT91_REG *)   0xFFFFF4A8) // (PIOA) Output Write Status Register
+#define AT91C_PIOA_BSR  ((AT91_REG *)   0xFFFFF474) // (PIOA) Select B Register
+#define AT91C_PIOA_OWER ((AT91_REG *)   0xFFFFF4A0) // (PIOA) Output Write Enable Register
+#define AT91C_PIOA_IFER ((AT91_REG *)   0xFFFFF420) // (PIOA) Input Filter Enable Register
+#define AT91C_PIOA_PDSR ((AT91_REG *)   0xFFFFF43C) // (PIOA) Pin Data Status Register
+#define AT91C_PIOA_PPUER ((AT91_REG *)  0xFFFFF464) // (PIOA) Pull-up Enable Register
+#define AT91C_PIOA_OSR  ((AT91_REG *)   0xFFFFF418) // (PIOA) Output Status Register
+#define AT91C_PIOA_ASR  ((AT91_REG *)   0xFFFFF470) // (PIOA) Select A Register
+#define AT91C_PIOA_MDDR ((AT91_REG *)   0xFFFFF454) // (PIOA) Multi-driver Disable Register
+#define AT91C_PIOA_CODR ((AT91_REG *)   0xFFFFF434) // (PIOA) Clear Output Data Register
+#define AT91C_PIOA_MDER ((AT91_REG *)   0xFFFFF450) // (PIOA) Multi-driver Enable Register
+#define AT91C_PIOA_PDR  ((AT91_REG *)   0xFFFFF404) // (PIOA) PIO Disable Register
+#define AT91C_PIOA_IFSR ((AT91_REG *)   0xFFFFF428) // (PIOA) Input Filter Status Register
+#define AT91C_PIOA_OER  ((AT91_REG *)   0xFFFFF410) // (PIOA) Output Enable Register
+#define AT91C_PIOA_PSR  ((AT91_REG *)   0xFFFFF408) // (PIOA) PIO Status Register
+// ========== Register definition for PIOB peripheral ==========
+#define AT91C_PIOB_OWDR ((AT91_REG *)   0xFFFFF6A4) // (PIOB) Output Write Disable Register
+#define AT91C_PIOB_MDER ((AT91_REG *)   0xFFFFF650) // (PIOB) Multi-driver Enable Register
+#define AT91C_PIOB_PPUSR ((AT91_REG *)  0xFFFFF668) // (PIOB) Pull-up Status Register
+#define AT91C_PIOB_IMR  ((AT91_REG *)   0xFFFFF648) // (PIOB) Interrupt Mask Register
+#define AT91C_PIOB_ASR  ((AT91_REG *)   0xFFFFF670) // (PIOB) Select A Register
+#define AT91C_PIOB_PPUDR ((AT91_REG *)  0xFFFFF660) // (PIOB) Pull-up Disable Register
+#define AT91C_PIOB_PSR  ((AT91_REG *)   0xFFFFF608) // (PIOB) PIO Status Register
+#define AT91C_PIOB_IER  ((AT91_REG *)   0xFFFFF640) // (PIOB) Interrupt Enable Register
+#define AT91C_PIOB_CODR ((AT91_REG *)   0xFFFFF634) // (PIOB) Clear Output Data Register
+#define AT91C_PIOB_OWER ((AT91_REG *)   0xFFFFF6A0) // (PIOB) Output Write Enable Register
+#define AT91C_PIOB_ABSR ((AT91_REG *)   0xFFFFF678) // (PIOB) AB Select Status Register
+#define AT91C_PIOB_IFDR ((AT91_REG *)   0xFFFFF624) // (PIOB) Input Filter Disable Register
+#define AT91C_PIOB_PDSR ((AT91_REG *)   0xFFFFF63C) // (PIOB) Pin Data Status Register
+#define AT91C_PIOB_IDR  ((AT91_REG *)   0xFFFFF644) // (PIOB) Interrupt Disable Register
+#define AT91C_PIOB_OWSR ((AT91_REG *)   0xFFFFF6A8) // (PIOB) Output Write Status Register
+#define AT91C_PIOB_PDR  ((AT91_REG *)   0xFFFFF604) // (PIOB) PIO Disable Register
+#define AT91C_PIOB_ODR  ((AT91_REG *)   0xFFFFF614) // (PIOB) Output Disable Registerr
+#define AT91C_PIOB_IFSR ((AT91_REG *)   0xFFFFF628) // (PIOB) Input Filter Status Register
+#define AT91C_PIOB_PPUER ((AT91_REG *)  0xFFFFF664) // (PIOB) Pull-up Enable Register
+#define AT91C_PIOB_SODR ((AT91_REG *)   0xFFFFF630) // (PIOB) Set Output Data Register
+#define AT91C_PIOB_ISR  ((AT91_REG *)   0xFFFFF64C) // (PIOB) Interrupt Status Register
+#define AT91C_PIOB_ODSR ((AT91_REG *)   0xFFFFF638) // (PIOB) Output Data Status Register
+#define AT91C_PIOB_OSR  ((AT91_REG *)   0xFFFFF618) // (PIOB) Output Status Register
+#define AT91C_PIOB_MDSR ((AT91_REG *)   0xFFFFF658) // (PIOB) Multi-driver Status Register
+#define AT91C_PIOB_IFER ((AT91_REG *)   0xFFFFF620) // (PIOB) Input Filter Enable Register
+#define AT91C_PIOB_BSR  ((AT91_REG *)   0xFFFFF674) // (PIOB) Select B Register
+#define AT91C_PIOB_MDDR ((AT91_REG *)   0xFFFFF654) // (PIOB) Multi-driver Disable Register
+#define AT91C_PIOB_OER  ((AT91_REG *)   0xFFFFF610) // (PIOB) Output Enable Register
+#define AT91C_PIOB_PER  ((AT91_REG *)   0xFFFFF600) // (PIOB) PIO Enable Register
+// ========== Register definition for CKGR peripheral ==========
+#define AT91C_CKGR_MOR  ((AT91_REG *)   0xFFFFFC20) // (CKGR) Main Oscillator Register
+#define AT91C_CKGR_PLLR ((AT91_REG *)   0xFFFFFC2C) // (CKGR) PLL Register
+#define AT91C_CKGR_MCFR ((AT91_REG *)   0xFFFFFC24) // (CKGR) Main Clock  Frequency Register
+// ========== Register definition for PMC peripheral ==========
+#define AT91C_PMC_IDR   ((AT91_REG *)   0xFFFFFC64) // (PMC) Interrupt Disable Register
+#define AT91C_PMC_MOR   ((AT91_REG *)   0xFFFFFC20) // (PMC) Main Oscillator Register
+#define AT91C_PMC_PLLR  ((AT91_REG *)   0xFFFFFC2C) // (PMC) PLL Register
+#define AT91C_PMC_PCER  ((AT91_REG *)   0xFFFFFC10) // (PMC) Peripheral Clock Enable Register
+#define AT91C_PMC_PCKR  ((AT91_REG *)   0xFFFFFC40) // (PMC) Programmable Clock Register
+#define AT91C_PMC_MCKR  ((AT91_REG *)   0xFFFFFC30) // (PMC) Master Clock Register
+#define AT91C_PMC_SCDR  ((AT91_REG *)   0xFFFFFC04) // (PMC) System Clock Disable Register
+#define AT91C_PMC_PCDR  ((AT91_REG *)   0xFFFFFC14) // (PMC) Peripheral Clock Disable Register
+#define AT91C_PMC_SCSR  ((AT91_REG *)   0xFFFFFC08) // (PMC) System Clock Status Register
+#define AT91C_PMC_PCSR  ((AT91_REG *)   0xFFFFFC18) // (PMC) Peripheral Clock Status Register
+#define AT91C_PMC_MCFR  ((AT91_REG *)   0xFFFFFC24) // (PMC) Main Clock  Frequency Register
+#define AT91C_PMC_SCER  ((AT91_REG *)   0xFFFFFC00) // (PMC) System Clock Enable Register
+#define AT91C_PMC_IMR   ((AT91_REG *)   0xFFFFFC6C) // (PMC) Interrupt Mask Register
+#define AT91C_PMC_IER   ((AT91_REG *)   0xFFFFFC60) // (PMC) Interrupt Enable Register
+#define AT91C_PMC_SR    ((AT91_REG *)   0xFFFFFC68) // (PMC) Status Register
+// ========== Register definition for RSTC peripheral ==========
+#define AT91C_RSTC_RCR  ((AT91_REG *)   0xFFFFFD00) // (RSTC) Reset Control Register
+#define AT91C_RSTC_RMR  ((AT91_REG *)   0xFFFFFD08) // (RSTC) Reset Mode Register
+#define AT91C_RSTC_RSR  ((AT91_REG *)   0xFFFFFD04) // (RSTC) Reset Status Register
+// ========== Register definition for RTTC peripheral ==========
+#define AT91C_RTTC_RTSR ((AT91_REG *)   0xFFFFFD2C) // (RTTC) Real-time Status Register
+#define AT91C_RTTC_RTMR ((AT91_REG *)   0xFFFFFD20) // (RTTC) Real-time Mode Register
+#define AT91C_RTTC_RTVR ((AT91_REG *)   0xFFFFFD28) // (RTTC) Real-time Value Register
+#define AT91C_RTTC_RTAR ((AT91_REG *)   0xFFFFFD24) // (RTTC) Real-time Alarm Register
+// ========== Register definition for PITC peripheral ==========
+#define AT91C_PITC_PIVR ((AT91_REG *)   0xFFFFFD38) // (PITC) Period Interval Value Register
+#define AT91C_PITC_PISR ((AT91_REG *)   0xFFFFFD34) // (PITC) Period Interval Status Register
+#define AT91C_PITC_PIIR ((AT91_REG *)   0xFFFFFD3C) // (PITC) Period Interval Image Register
+#define AT91C_PITC_PIMR ((AT91_REG *)   0xFFFFFD30) // (PITC) Period Interval Mode Register
+// ========== Register definition for WDTC peripheral ==========
+#define AT91C_WDTC_WDCR ((AT91_REG *)   0xFFFFFD40) // (WDTC) Watchdog Control Register
+#define AT91C_WDTC_WDSR ((AT91_REG *)   0xFFFFFD48) // (WDTC) Watchdog Status Register
+#define AT91C_WDTC_WDMR ((AT91_REG *)   0xFFFFFD44) // (WDTC) Watchdog Mode Register
+// ========== Register definition for VREG peripheral ==========
+#define AT91C_VREG_MR   ((AT91_REG *)   0xFFFFFD60) // (VREG) Voltage Regulator Mode Register
+// ========== Register definition for MC peripheral ==========
+#define AT91C_MC_ASR    ((AT91_REG *)   0xFFFFFF04) // (MC) MC Abort Status Register
+#define AT91C_MC_RCR    ((AT91_REG *)   0xFFFFFF00) // (MC) MC Remap Control Register
+#define AT91C_MC_FCR    ((AT91_REG *)   0xFFFFFF64) // (MC) MC Flash Command Register
+#define AT91C_MC_AASR   ((AT91_REG *)   0xFFFFFF08) // (MC) MC Abort Address Status Register
+#define AT91C_MC_FSR    ((AT91_REG *)   0xFFFFFF68) // (MC) MC Flash Status Register
+#define AT91C_MC_FMR    ((AT91_REG *)   0xFFFFFF60) // (MC) MC Flash Mode Register
+// ========== Register definition for PDC_SPI1 peripheral ==========
+#define AT91C_SPI1_PTCR ((AT91_REG *)   0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register
+#define AT91C_SPI1_RPR  ((AT91_REG *)   0xFFFE4100) // (PDC_SPI1) Receive Pointer Register
+#define AT91C_SPI1_TNCR ((AT91_REG *)   0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register
+#define AT91C_SPI1_TPR  ((AT91_REG *)   0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register
+#define AT91C_SPI1_TNPR ((AT91_REG *)   0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register
+#define AT91C_SPI1_TCR  ((AT91_REG *)   0xFFFE410C) // (PDC_SPI1) Transmit Counter Register
+#define AT91C_SPI1_RCR  ((AT91_REG *)   0xFFFE4104) // (PDC_SPI1) Receive Counter Register
+#define AT91C_SPI1_RNPR ((AT91_REG *)   0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register
+#define AT91C_SPI1_RNCR ((AT91_REG *)   0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register
+#define AT91C_SPI1_PTSR ((AT91_REG *)   0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register
+// ========== Register definition for SPI1 peripheral ==========
+#define AT91C_SPI1_IMR  ((AT91_REG *)   0xFFFE401C) // (SPI1) Interrupt Mask Register
+#define AT91C_SPI1_IER  ((AT91_REG *)   0xFFFE4014) // (SPI1) Interrupt Enable Register
+#define AT91C_SPI1_MR   ((AT91_REG *)   0xFFFE4004) // (SPI1) Mode Register
+#define AT91C_SPI1_RDR  ((AT91_REG *)   0xFFFE4008) // (SPI1) Receive Data Register
+#define AT91C_SPI1_IDR  ((AT91_REG *)   0xFFFE4018) // (SPI1) Interrupt Disable Register
+#define AT91C_SPI1_SR   ((AT91_REG *)   0xFFFE4010) // (SPI1) Status Register
+#define AT91C_SPI1_TDR  ((AT91_REG *)   0xFFFE400C) // (SPI1) Transmit Data Register
+#define AT91C_SPI1_CR   ((AT91_REG *)   0xFFFE4000) // (SPI1) Control Register
+#define AT91C_SPI1_CSR  ((AT91_REG *)   0xFFFE4030) // (SPI1) Chip Select Register
+// ========== Register definition for PDC_SPI0 peripheral ==========
+#define AT91C_SPI0_PTCR ((AT91_REG *)   0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register
+#define AT91C_SPI0_TPR  ((AT91_REG *)   0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register
+#define AT91C_SPI0_TCR  ((AT91_REG *)   0xFFFE010C) // (PDC_SPI0) Transmit Counter Register
+#define AT91C_SPI0_RCR  ((AT91_REG *)   0xFFFE0104) // (PDC_SPI0) Receive Counter Register
+#define AT91C_SPI0_PTSR ((AT91_REG *)   0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register
+#define AT91C_SPI0_RNPR ((AT91_REG *)   0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register
+#define AT91C_SPI0_RPR  ((AT91_REG *)   0xFFFE0100) // (PDC_SPI0) Receive Pointer Register
+#define AT91C_SPI0_TNCR ((AT91_REG *)   0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register
+#define AT91C_SPI0_RNCR ((AT91_REG *)   0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register
+#define AT91C_SPI0_TNPR ((AT91_REG *)   0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register
+// ========== Register definition for SPI0 peripheral ==========
+#define AT91C_SPI0_IER  ((AT91_REG *)   0xFFFE0014) // (SPI0) Interrupt Enable Register
+#define AT91C_SPI0_SR   ((AT91_REG *)   0xFFFE0010) // (SPI0) Status Register
+#define AT91C_SPI0_IDR  ((AT91_REG *)   0xFFFE0018) // (SPI0) Interrupt Disable Register
+#define AT91C_SPI0_CR   ((AT91_REG *)   0xFFFE0000) // (SPI0) Control Register
+#define AT91C_SPI0_MR   ((AT91_REG *)   0xFFFE0004) // (SPI0) Mode Register
+#define AT91C_SPI0_IMR  ((AT91_REG *)   0xFFFE001C) // (SPI0) Interrupt Mask Register
+#define AT91C_SPI0_TDR  ((AT91_REG *)   0xFFFE000C) // (SPI0) Transmit Data Register
+#define AT91C_SPI0_RDR  ((AT91_REG *)   0xFFFE0008) // (SPI0) Receive Data Register
+#define AT91C_SPI0_CSR  ((AT91_REG *)   0xFFFE0030) // (SPI0) Chip Select Register
+// ========== Register definition for PDC_US1 peripheral ==========
+#define AT91C_US1_RNCR  ((AT91_REG *)   0xFFFC4114) // (PDC_US1) Receive Next Counter Register
+#define AT91C_US1_PTCR  ((AT91_REG *)   0xFFFC4120) // (PDC_US1) PDC Transfer Control Register
+#define AT91C_US1_TCR   ((AT91_REG *)   0xFFFC410C) // (PDC_US1) Transmit Counter Register
+#define AT91C_US1_PTSR  ((AT91_REG *)   0xFFFC4124) // (PDC_US1) PDC Transfer Status Register
+#define AT91C_US1_TNPR  ((AT91_REG *)   0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register
+#define AT91C_US1_RCR   ((AT91_REG *)   0xFFFC4104) // (PDC_US1) Receive Counter Register
+#define AT91C_US1_RNPR  ((AT91_REG *)   0xFFFC4110) // (PDC_US1) Receive Next Pointer Register
+#define AT91C_US1_RPR   ((AT91_REG *)   0xFFFC4100) // (PDC_US1) Receive Pointer Register
+#define AT91C_US1_TNCR  ((AT91_REG *)   0xFFFC411C) // (PDC_US1) Transmit Next Counter Register
+#define AT91C_US1_TPR   ((AT91_REG *)   0xFFFC4108) // (PDC_US1) Transmit Pointer Register
+// ========== Register definition for US1 peripheral ==========
+#define AT91C_US1_IF    ((AT91_REG *)   0xFFFC404C) // (US1) IRDA_FILTER Register
+#define AT91C_US1_NER   ((AT91_REG *)   0xFFFC4044) // (US1) Nb Errors Register
+#define AT91C_US1_RTOR  ((AT91_REG *)   0xFFFC4024) // (US1) Receiver Time-out Register
+#define AT91C_US1_CSR   ((AT91_REG *)   0xFFFC4014) // (US1) Channel Status Register
+#define AT91C_US1_IDR   ((AT91_REG *)   0xFFFC400C) // (US1) Interrupt Disable Register
+#define AT91C_US1_IER   ((AT91_REG *)   0xFFFC4008) // (US1) Interrupt Enable Register
+#define AT91C_US1_THR   ((AT91_REG *)   0xFFFC401C) // (US1) Transmitter Holding Register
+#define AT91C_US1_TTGR  ((AT91_REG *)   0xFFFC4028) // (US1) Transmitter Time-guard Register
+#define AT91C_US1_RHR   ((AT91_REG *)   0xFFFC4018) // (US1) Receiver Holding Register
+#define AT91C_US1_BRGR  ((AT91_REG *)   0xFFFC4020) // (US1) Baud Rate Generator Register
+#define AT91C_US1_IMR   ((AT91_REG *)   0xFFFC4010) // (US1) Interrupt Mask Register
+#define AT91C_US1_FIDI  ((AT91_REG *)   0xFFFC4040) // (US1) FI_DI_Ratio Register
+#define AT91C_US1_CR    ((AT91_REG *)   0xFFFC4000) // (US1) Control Register
+#define AT91C_US1_MR    ((AT91_REG *)   0xFFFC4004) // (US1) Mode Register
+// ========== Register definition for PDC_US0 peripheral ==========
+#define AT91C_US0_TNPR  ((AT91_REG *)   0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register
+#define AT91C_US0_RNPR  ((AT91_REG *)   0xFFFC0110) // (PDC_US0) Receive Next Pointer Register
+#define AT91C_US0_TCR   ((AT91_REG *)   0xFFFC010C) // (PDC_US0) Transmit Counter Register
+#define AT91C_US0_PTCR  ((AT91_REG *)   0xFFFC0120) // (PDC_US0) PDC Transfer Control Register
+#define AT91C_US0_PTSR  ((AT91_REG *)   0xFFFC0124) // (PDC_US0) PDC Transfer Status Register
+#define AT91C_US0_TNCR  ((AT91_REG *)   0xFFFC011C) // (PDC_US0) Transmit Next Counter Register
+#define AT91C_US0_TPR   ((AT91_REG *)   0xFFFC0108) // (PDC_US0) Transmit Pointer Register
+#define AT91C_US0_RCR   ((AT91_REG *)   0xFFFC0104) // (PDC_US0) Receive Counter Register
+#define AT91C_US0_RPR   ((AT91_REG *)   0xFFFC0100) // (PDC_US0) Receive Pointer Register
+#define AT91C_US0_RNCR  ((AT91_REG *)   0xFFFC0114) // (PDC_US0) Receive Next Counter Register
+// ========== Register definition for US0 peripheral ==========
+#define AT91C_US0_BRGR  ((AT91_REG *)   0xFFFC0020) // (US0) Baud Rate Generator Register
+#define AT91C_US0_NER   ((AT91_REG *)   0xFFFC0044) // (US0) Nb Errors Register
+#define AT91C_US0_CR    ((AT91_REG *)   0xFFFC0000) // (US0) Control Register
+#define AT91C_US0_IMR   ((AT91_REG *)   0xFFFC0010) // (US0) Interrupt Mask Register
+#define AT91C_US0_FIDI  ((AT91_REG *)   0xFFFC0040) // (US0) FI_DI_Ratio Register
+#define AT91C_US0_TTGR  ((AT91_REG *)   0xFFFC0028) // (US0) Transmitter Time-guard Register
+#define AT91C_US0_MR    ((AT91_REG *)   0xFFFC0004) // (US0) Mode Register
+#define AT91C_US0_RTOR  ((AT91_REG *)   0xFFFC0024) // (US0) Receiver Time-out Register
+#define AT91C_US0_CSR   ((AT91_REG *)   0xFFFC0014) // (US0) Channel Status Register
+#define AT91C_US0_RHR   ((AT91_REG *)   0xFFFC0018) // (US0) Receiver Holding Register
+#define AT91C_US0_IDR   ((AT91_REG *)   0xFFFC000C) // (US0) Interrupt Disable Register
+#define AT91C_US0_THR   ((AT91_REG *)   0xFFFC001C) // (US0) Transmitter Holding Register
+#define AT91C_US0_IF    ((AT91_REG *)   0xFFFC004C) // (US0) IRDA_FILTER Register
+#define AT91C_US0_IER   ((AT91_REG *)   0xFFFC0008) // (US0) Interrupt Enable Register
+// ========== Register definition for PDC_SSC peripheral ==========
+#define AT91C_SSC_TNCR  ((AT91_REG *)   0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register
+#define AT91C_SSC_RPR   ((AT91_REG *)   0xFFFD4100) // (PDC_SSC) Receive Pointer Register
+#define AT91C_SSC_RNCR  ((AT91_REG *)   0xFFFD4114) // (PDC_SSC) Receive Next Counter Register
+#define AT91C_SSC_TPR   ((AT91_REG *)   0xFFFD4108) // (PDC_SSC) Transmit Pointer Register
+#define AT91C_SSC_PTCR  ((AT91_REG *)   0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register
+#define AT91C_SSC_TCR   ((AT91_REG *)   0xFFFD410C) // (PDC_SSC) Transmit Counter Register
+#define AT91C_SSC_RCR   ((AT91_REG *)   0xFFFD4104) // (PDC_SSC) Receive Counter Register
+#define AT91C_SSC_RNPR  ((AT91_REG *)   0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register
+#define AT91C_SSC_TNPR  ((AT91_REG *)   0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register
+#define AT91C_SSC_PTSR  ((AT91_REG *)   0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register
+// ========== Register definition for SSC peripheral ==========
+#define AT91C_SSC_RHR   ((AT91_REG *)   0xFFFD4020) // (SSC) Receive Holding Register
+#define AT91C_SSC_RSHR  ((AT91_REG *)   0xFFFD4030) // (SSC) Receive Sync Holding Register
+#define AT91C_SSC_TFMR  ((AT91_REG *)   0xFFFD401C) // (SSC) Transmit Frame Mode Register
+#define AT91C_SSC_IDR   ((AT91_REG *)   0xFFFD4048) // (SSC) Interrupt Disable Register
+#define AT91C_SSC_THR   ((AT91_REG *)   0xFFFD4024) // (SSC) Transmit Holding Register
+#define AT91C_SSC_RCMR  ((AT91_REG *)   0xFFFD4010) // (SSC) Receive Clock ModeRegister
+#define AT91C_SSC_IER   ((AT91_REG *)   0xFFFD4044) // (SSC) Interrupt Enable Register
+#define AT91C_SSC_TSHR  ((AT91_REG *)   0xFFFD4034) // (SSC) Transmit Sync Holding Register
+#define AT91C_SSC_SR    ((AT91_REG *)   0xFFFD4040) // (SSC) Status Register
+#define AT91C_SSC_CMR   ((AT91_REG *)   0xFFFD4004) // (SSC) Clock Mode Register
+#define AT91C_SSC_TCMR  ((AT91_REG *)   0xFFFD4018) // (SSC) Transmit Clock Mode Register
+#define AT91C_SSC_CR    ((AT91_REG *)   0xFFFD4000) // (SSC) Control Register
+#define AT91C_SSC_IMR   ((AT91_REG *)   0xFFFD404C) // (SSC) Interrupt Mask Register
+#define AT91C_SSC_RFMR  ((AT91_REG *)   0xFFFD4014) // (SSC) Receive Frame Mode Register
+// ========== Register definition for TWI peripheral ==========
+#define AT91C_TWI_IER   ((AT91_REG *)   0xFFFB8024) // (TWI) Interrupt Enable Register
+#define AT91C_TWI_CR    ((AT91_REG *)   0xFFFB8000) // (TWI) Control Register
+#define AT91C_TWI_SR    ((AT91_REG *)   0xFFFB8020) // (TWI) Status Register
+#define AT91C_TWI_IMR   ((AT91_REG *)   0xFFFB802C) // (TWI) Interrupt Mask Register
+#define AT91C_TWI_THR   ((AT91_REG *)   0xFFFB8034) // (TWI) Transmit Holding Register
+#define AT91C_TWI_IDR   ((AT91_REG *)   0xFFFB8028) // (TWI) Interrupt Disable Register
+#define AT91C_TWI_IADR  ((AT91_REG *)   0xFFFB800C) // (TWI) Internal Address Register
+#define AT91C_TWI_MMR   ((AT91_REG *)   0xFFFB8004) // (TWI) Master Mode Register
+#define AT91C_TWI_CWGR  ((AT91_REG *)   0xFFFB8010) // (TWI) Clock Waveform Generator Register
+#define AT91C_TWI_RHR   ((AT91_REG *)   0xFFFB8030) // (TWI) Receive Holding Register
+// ========== Register definition for PWMC_CH3 peripheral ==========
+#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *)  0xFFFCC270) // (PWMC_CH3) Channel Update Register
+#define AT91C_PWMC_CH3_Reserved ((AT91_REG *)   0xFFFCC274) // (PWMC_CH3) Reserved
+#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *)  0xFFFCC268) // (PWMC_CH3) Channel Period Register
+#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *)  0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register
+#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *)  0xFFFCC26C) // (PWMC_CH3) Channel Counter Register
+#define AT91C_PWMC_CH3_CMR ((AT91_REG *)    0xFFFCC260) // (PWMC_CH3) Channel Mode Register
+// ========== Register definition for PWMC_CH2 peripheral ==========
+#define AT91C_PWMC_CH2_Reserved ((AT91_REG *)   0xFFFCC254) // (PWMC_CH2) Reserved
+#define AT91C_PWMC_CH2_CMR ((AT91_REG *)    0xFFFCC240) // (PWMC_CH2) Channel Mode Register
+#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *)  0xFFFCC24C) // (PWMC_CH2) Channel Counter Register
+#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *)  0xFFFCC248) // (PWMC_CH2) Channel Period Register
+#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *)  0xFFFCC250) // (PWMC_CH2) Channel Update Register
+#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *)  0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register
+// ========== Register definition for PWMC_CH1 peripheral ==========
+#define AT91C_PWMC_CH1_Reserved ((AT91_REG *)   0xFFFCC234) // (PWMC_CH1) Reserved
+#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *)  0xFFFCC230) // (PWMC_CH1) Channel Update Register
+#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *)  0xFFFCC228) // (PWMC_CH1) Channel Period Register
+#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *)  0xFFFCC22C) // (PWMC_CH1) Channel Counter Register
+#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *)  0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register
+#define AT91C_PWMC_CH1_CMR ((AT91_REG *)    0xFFFCC220) // (PWMC_CH1) Channel Mode Register
+// ========== Register definition for PWMC_CH0 peripheral ==========
+#define AT91C_PWMC_CH0_Reserved ((AT91_REG *)   0xFFFCC214) // (PWMC_CH0) Reserved
+#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *)  0xFFFCC208) // (PWMC_CH0) Channel Period Register
+#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *)  0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register
+#define AT91C_PWMC_CH0_CMR ((AT91_REG *)    0xFFFCC200) // (PWMC_CH0) Channel Mode Register
+#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *)  0xFFFCC210) // (PWMC_CH0) Channel Update Register
+#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *)  0xFFFCC20C) // (PWMC_CH0) Channel Counter Register
+// ========== Register definition for PWMC peripheral ==========
+#define AT91C_PWMC_IDR  ((AT91_REG *)   0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register
+#define AT91C_PWMC_DIS  ((AT91_REG *)   0xFFFCC008) // (PWMC) PWMC Disable Register
+#define AT91C_PWMC_IER  ((AT91_REG *)   0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register
+#define AT91C_PWMC_VR   ((AT91_REG *)   0xFFFCC0FC) // (PWMC) PWMC Version Register
+#define AT91C_PWMC_ISR  ((AT91_REG *)   0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register
+#define AT91C_PWMC_SR   ((AT91_REG *)   0xFFFCC00C) // (PWMC) PWMC Status Register
+#define AT91C_PWMC_IMR  ((AT91_REG *)   0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register
+#define AT91C_PWMC_MR   ((AT91_REG *)   0xFFFCC000) // (PWMC) PWMC Mode Register
+#define AT91C_PWMC_ENA  ((AT91_REG *)   0xFFFCC004) // (PWMC) PWMC Enable Register
+// ========== Register definition for UDP peripheral ==========
+#define AT91C_UDP_IMR   ((AT91_REG *)   0xFFFB0018) // (UDP) Interrupt Mask Register
+#define AT91C_UDP_FADDR ((AT91_REG *)   0xFFFB0008) // (UDP) Function Address Register
+#define AT91C_UDP_NUM   ((AT91_REG *)   0xFFFB0000) // (UDP) Frame Number Register
+#define AT91C_UDP_FDR   ((AT91_REG *)   0xFFFB0050) // (UDP) Endpoint FIFO Data Register
+#define AT91C_UDP_ISR   ((AT91_REG *)   0xFFFB001C) // (UDP) Interrupt Status Register
+#define AT91C_UDP_CSR   ((AT91_REG *)   0xFFFB0030) // (UDP) Endpoint Control and Status Register
+#define AT91C_UDP_IDR   ((AT91_REG *)   0xFFFB0014) // (UDP) Interrupt Disable Register
+#define AT91C_UDP_ICR   ((AT91_REG *)   0xFFFB0020) // (UDP) Interrupt Clear Register
+#define AT91C_UDP_RSTEP ((AT91_REG *)   0xFFFB0028) // (UDP) Reset Endpoint Register
+#define AT91C_UDP_TXVC  ((AT91_REG *)   0xFFFB0074) // (UDP) Transceiver Control Register
+#define AT91C_UDP_GLBSTATE ((AT91_REG *)    0xFFFB0004) // (UDP) Global State Register
+#define AT91C_UDP_IER   ((AT91_REG *)   0xFFFB0010) // (UDP) Interrupt Enable Register
+// ========== Register definition for TC0 peripheral ==========
+#define AT91C_TC0_SR    ((AT91_REG *)   0xFFFA0020) // (TC0) Status Register
+#define AT91C_TC0_RC    ((AT91_REG *)   0xFFFA001C) // (TC0) Register C
+#define AT91C_TC0_RB    ((AT91_REG *)   0xFFFA0018) // (TC0) Register B
+#define AT91C_TC0_CCR   ((AT91_REG *)   0xFFFA0000) // (TC0) Channel Control Register
+#define AT91C_TC0_CMR   ((AT91_REG *)   0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC0_IER   ((AT91_REG *)   0xFFFA0024) // (TC0) Interrupt Enable Register
+#define AT91C_TC0_RA    ((AT91_REG *)   0xFFFA0014) // (TC0) Register A
+#define AT91C_TC0_IDR   ((AT91_REG *)   0xFFFA0028) // (TC0) Interrupt Disable Register
+#define AT91C_TC0_CV    ((AT91_REG *)   0xFFFA0010) // (TC0) Counter Value
+#define AT91C_TC0_IMR   ((AT91_REG *)   0xFFFA002C) // (TC0) Interrupt Mask Register
+// ========== Register definition for TC1 peripheral ==========
+#define AT91C_TC1_RB    ((AT91_REG *)   0xFFFA0058) // (TC1) Register B
+#define AT91C_TC1_CCR   ((AT91_REG *)   0xFFFA0040) // (TC1) Channel Control Register
+#define AT91C_TC1_IER   ((AT91_REG *)   0xFFFA0064) // (TC1) Interrupt Enable Register
+#define AT91C_TC1_IDR   ((AT91_REG *)   0xFFFA0068) // (TC1) Interrupt Disable Register
+#define AT91C_TC1_SR    ((AT91_REG *)   0xFFFA0060) // (TC1) Status Register
+#define AT91C_TC1_CMR   ((AT91_REG *)   0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC1_RA    ((AT91_REG *)   0xFFFA0054) // (TC1) Register A
+#define AT91C_TC1_RC    ((AT91_REG *)   0xFFFA005C) // (TC1) Register C
+#define AT91C_TC1_IMR   ((AT91_REG *)   0xFFFA006C) // (TC1) Interrupt Mask Register
+#define AT91C_TC1_CV    ((AT91_REG *)   0xFFFA0050) // (TC1) Counter Value
+// ========== Register definition for TC2 peripheral ==========
+#define AT91C_TC2_CMR   ((AT91_REG *)   0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC2_CCR   ((AT91_REG *)   0xFFFA0080) // (TC2) Channel Control Register
+#define AT91C_TC2_CV    ((AT91_REG *)   0xFFFA0090) // (TC2) Counter Value
+#define AT91C_TC2_RA    ((AT91_REG *)   0xFFFA0094) // (TC2) Register A
+#define AT91C_TC2_RB    ((AT91_REG *)   0xFFFA0098) // (TC2) Register B
+#define AT91C_TC2_IDR   ((AT91_REG *)   0xFFFA00A8) // (TC2) Interrupt Disable Register
+#define AT91C_TC2_IMR   ((AT91_REG *)   0xFFFA00AC) // (TC2) Interrupt Mask Register
+#define AT91C_TC2_RC    ((AT91_REG *)   0xFFFA009C) // (TC2) Register C
+#define AT91C_TC2_IER   ((AT91_REG *)   0xFFFA00A4) // (TC2) Interrupt Enable Register
+#define AT91C_TC2_SR    ((AT91_REG *)   0xFFFA00A0) // (TC2) Status Register
+// ========== Register definition for TCB peripheral ==========
+#define AT91C_TCB_BMR   ((AT91_REG *)   0xFFFA00C4) // (TCB) TC Block Mode Register
+#define AT91C_TCB_BCR   ((AT91_REG *)   0xFFFA00C0) // (TCB) TC Block Control Register
+// ========== Register definition for CAN_MB0 peripheral ==========
+#define AT91C_CAN_MB0_MDL ((AT91_REG *)     0xFFFD0214) // (CAN_MB0) MailBox Data Low Register
+#define AT91C_CAN_MB0_MAM ((AT91_REG *)     0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB0_MCR ((AT91_REG *)     0xFFFD021C) // (CAN_MB0) MailBox Control Register
+#define AT91C_CAN_MB0_MID ((AT91_REG *)     0xFFFD0208) // (CAN_MB0) MailBox ID Register
+#define AT91C_CAN_MB0_MSR ((AT91_REG *)     0xFFFD0210) // (CAN_MB0) MailBox Status Register
+#define AT91C_CAN_MB0_MFID ((AT91_REG *)    0xFFFD020C) // (CAN_MB0) MailBox Family ID Register
+#define AT91C_CAN_MB0_MDH ((AT91_REG *)     0xFFFD0218) // (CAN_MB0) MailBox Data High Register
+#define AT91C_CAN_MB0_MMR ((AT91_REG *)     0xFFFD0200) // (CAN_MB0) MailBox Mode Register
+// ========== Register definition for CAN_MB1 peripheral ==========
+#define AT91C_CAN_MB1_MDL ((AT91_REG *)     0xFFFD0234) // (CAN_MB1) MailBox Data Low Register
+#define AT91C_CAN_MB1_MID ((AT91_REG *)     0xFFFD0228) // (CAN_MB1) MailBox ID Register
+#define AT91C_CAN_MB1_MMR ((AT91_REG *)     0xFFFD0220) // (CAN_MB1) MailBox Mode Register
+#define AT91C_CAN_MB1_MSR ((AT91_REG *)     0xFFFD0230) // (CAN_MB1) MailBox Status Register
+#define AT91C_CAN_MB1_MAM ((AT91_REG *)     0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB1_MDH ((AT91_REG *)     0xFFFD0238) // (CAN_MB1) MailBox Data High Register
+#define AT91C_CAN_MB1_MCR ((AT91_REG *)     0xFFFD023C) // (CAN_MB1) MailBox Control Register
+#define AT91C_CAN_MB1_MFID ((AT91_REG *)    0xFFFD022C) // (CAN_MB1) MailBox Family ID Register
+// ========== Register definition for CAN_MB2 peripheral ==========
+#define AT91C_CAN_MB2_MCR ((AT91_REG *)     0xFFFD025C) // (CAN_MB2) MailBox Control Register
+#define AT91C_CAN_MB2_MDH ((AT91_REG *)     0xFFFD0258) // (CAN_MB2) MailBox Data High Register
+#define AT91C_CAN_MB2_MID ((AT91_REG *)     0xFFFD0248) // (CAN_MB2) MailBox ID Register
+#define AT91C_CAN_MB2_MDL ((AT91_REG *)     0xFFFD0254) // (CAN_MB2) MailBox Data Low Register
+#define AT91C_CAN_MB2_MMR ((AT91_REG *)     0xFFFD0240) // (CAN_MB2) MailBox Mode Register
+#define AT91C_CAN_MB2_MAM ((AT91_REG *)     0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB2_MFID ((AT91_REG *)    0xFFFD024C) // (CAN_MB2) MailBox Family ID Register
+#define AT91C_CAN_MB2_MSR ((AT91_REG *)     0xFFFD0250) // (CAN_MB2) MailBox Status Register
+// ========== Register definition for CAN_MB3 peripheral ==========
+#define AT91C_CAN_MB3_MFID ((AT91_REG *)    0xFFFD026C) // (CAN_MB3) MailBox Family ID Register
+#define AT91C_CAN_MB3_MAM ((AT91_REG *)     0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB3_MID ((AT91_REG *)     0xFFFD0268) // (CAN_MB3) MailBox ID Register
+#define AT91C_CAN_MB3_MCR ((AT91_REG *)     0xFFFD027C) // (CAN_MB3) MailBox Control Register
+#define AT91C_CAN_MB3_MMR ((AT91_REG *)     0xFFFD0260) // (CAN_MB3) MailBox Mode Register
+#define AT91C_CAN_MB3_MSR ((AT91_REG *)     0xFFFD0270) // (CAN_MB3) MailBox Status Register
+#define AT91C_CAN_MB3_MDL ((AT91_REG *)     0xFFFD0274) // (CAN_MB3) MailBox Data Low Register
+#define AT91C_CAN_MB3_MDH ((AT91_REG *)     0xFFFD0278) // (CAN_MB3) MailBox Data High Register
+// ========== Register definition for CAN_MB4 peripheral ==========
+#define AT91C_CAN_MB4_MID ((AT91_REG *)     0xFFFD0288) // (CAN_MB4) MailBox ID Register
+#define AT91C_CAN_MB4_MMR ((AT91_REG *)     0xFFFD0280) // (CAN_MB4) MailBox Mode Register
+#define AT91C_CAN_MB4_MDH ((AT91_REG *)     0xFFFD0298) // (CAN_MB4) MailBox Data High Register
+#define AT91C_CAN_MB4_MFID ((AT91_REG *)    0xFFFD028C) // (CAN_MB4) MailBox Family ID Register
+#define AT91C_CAN_MB4_MSR ((AT91_REG *)     0xFFFD0290) // (CAN_MB4) MailBox Status Register
+#define AT91C_CAN_MB4_MCR ((AT91_REG *)     0xFFFD029C) // (CAN_MB4) MailBox Control Register
+#define AT91C_CAN_MB4_MDL ((AT91_REG *)     0xFFFD0294) // (CAN_MB4) MailBox Data Low Register
+#define AT91C_CAN_MB4_MAM ((AT91_REG *)     0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register
+// ========== Register definition for CAN_MB5 peripheral ==========
+#define AT91C_CAN_MB5_MSR ((AT91_REG *)     0xFFFD02B0) // (CAN_MB5) MailBox Status Register
+#define AT91C_CAN_MB5_MCR ((AT91_REG *)     0xFFFD02BC) // (CAN_MB5) MailBox Control Register
+#define AT91C_CAN_MB5_MFID ((AT91_REG *)    0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register
+#define AT91C_CAN_MB5_MDH ((AT91_REG *)     0xFFFD02B8) // (CAN_MB5) MailBox Data High Register
+#define AT91C_CAN_MB5_MID ((AT91_REG *)     0xFFFD02A8) // (CAN_MB5) MailBox ID Register
+#define AT91C_CAN_MB5_MMR ((AT91_REG *)     0xFFFD02A0) // (CAN_MB5) MailBox Mode Register
+#define AT91C_CAN_MB5_MDL ((AT91_REG *)     0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register
+#define AT91C_CAN_MB5_MAM ((AT91_REG *)     0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register
+// ========== Register definition for CAN_MB6 peripheral ==========
+#define AT91C_CAN_MB6_MFID ((AT91_REG *)    0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register
+#define AT91C_CAN_MB6_MID ((AT91_REG *)     0xFFFD02C8) // (CAN_MB6) MailBox ID Register
+#define AT91C_CAN_MB6_MAM ((AT91_REG *)     0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB6_MSR ((AT91_REG *)     0xFFFD02D0) // (CAN_MB6) MailBox Status Register
+#define AT91C_CAN_MB6_MDL ((AT91_REG *)     0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register
+#define AT91C_CAN_MB6_MCR ((AT91_REG *)     0xFFFD02DC) // (CAN_MB6) MailBox Control Register
+#define AT91C_CAN_MB6_MDH ((AT91_REG *)     0xFFFD02D8) // (CAN_MB6) MailBox Data High Register
+#define AT91C_CAN_MB6_MMR ((AT91_REG *)     0xFFFD02C0) // (CAN_MB6) MailBox Mode Register
+// ========== Register definition for CAN_MB7 peripheral ==========
+#define AT91C_CAN_MB7_MCR ((AT91_REG *)     0xFFFD02FC) // (CAN_MB7) MailBox Control Register
+#define AT91C_CAN_MB7_MDH ((AT91_REG *)     0xFFFD02F8) // (CAN_MB7) MailBox Data High Register
+#define AT91C_CAN_MB7_MFID ((AT91_REG *)    0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register
+#define AT91C_CAN_MB7_MDL ((AT91_REG *)     0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register
+#define AT91C_CAN_MB7_MID ((AT91_REG *)     0xFFFD02E8) // (CAN_MB7) MailBox ID Register
+#define AT91C_CAN_MB7_MMR ((AT91_REG *)     0xFFFD02E0) // (CAN_MB7) MailBox Mode Register
+#define AT91C_CAN_MB7_MAM ((AT91_REG *)     0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB7_MSR ((AT91_REG *)     0xFFFD02F0) // (CAN_MB7) MailBox Status Register
+// ========== Register definition for CAN peripheral ==========
+#define AT91C_CAN_TCR   ((AT91_REG *)   0xFFFD0024) // (CAN) Transfer Command Register
+#define AT91C_CAN_IMR   ((AT91_REG *)   0xFFFD000C) // (CAN) Interrupt Mask Register
+#define AT91C_CAN_IER   ((AT91_REG *)   0xFFFD0004) // (CAN) Interrupt Enable Register
+#define AT91C_CAN_ECR   ((AT91_REG *)   0xFFFD0020) // (CAN) Error Counter Register
+#define AT91C_CAN_TIMESTP ((AT91_REG *)     0xFFFD001C) // (CAN) Time Stamp Register
+#define AT91C_CAN_MR    ((AT91_REG *)   0xFFFD0000) // (CAN) Mode Register
+#define AT91C_CAN_IDR   ((AT91_REG *)   0xFFFD0008) // (CAN) Interrupt Disable Register
+#define AT91C_CAN_ACR   ((AT91_REG *)   0xFFFD0028) // (CAN) Abort Command Register
+#define AT91C_CAN_TIM   ((AT91_REG *)   0xFFFD0018) // (CAN) Timer Register
+#define AT91C_CAN_SR    ((AT91_REG *)   0xFFFD0010) // (CAN) Status Register
+#define AT91C_CAN_BR    ((AT91_REG *)   0xFFFD0014) // (CAN) Baudrate Register
+#define AT91C_CAN_VR    ((AT91_REG *)   0xFFFD00FC) // (CAN) Version Register
+// ========== Register definition for EMAC peripheral ==========
+#define AT91C_EMAC_ISR  ((AT91_REG *)   0xFFFDC024) // (EMAC) Interrupt Status Register
+#define AT91C_EMAC_SA4H ((AT91_REG *)   0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes
+#define AT91C_EMAC_SA1L ((AT91_REG *)   0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes
+#define AT91C_EMAC_ELE  ((AT91_REG *)   0xFFFDC078) // (EMAC) Excessive Length Errors Register
+#define AT91C_EMAC_LCOL ((AT91_REG *)   0xFFFDC05C) // (EMAC) Late Collision Register
+#define AT91C_EMAC_RLE  ((AT91_REG *)   0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register
+#define AT91C_EMAC_WOL  ((AT91_REG *)   0xFFFDC0C4) // (EMAC) Wake On LAN Register
+#define AT91C_EMAC_DTF  ((AT91_REG *)   0xFFFDC058) // (EMAC) Deferred Transmission Frame Register
+#define AT91C_EMAC_TUND ((AT91_REG *)   0xFFFDC064) // (EMAC) Transmit Underrun Error Register
+#define AT91C_EMAC_NCR  ((AT91_REG *)   0xFFFDC000) // (EMAC) Network Control Register
+#define AT91C_EMAC_SA4L ((AT91_REG *)   0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes
+#define AT91C_EMAC_RSR  ((AT91_REG *)   0xFFFDC020) // (EMAC) Receive Status Register
+#define AT91C_EMAC_SA3L ((AT91_REG *)   0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes
+#define AT91C_EMAC_TSR  ((AT91_REG *)   0xFFFDC014) // (EMAC) Transmit Status Register
+#define AT91C_EMAC_IDR  ((AT91_REG *)   0xFFFDC02C) // (EMAC) Interrupt Disable Register
+#define AT91C_EMAC_RSE  ((AT91_REG *)   0xFFFDC074) // (EMAC) Receive Symbol Errors Register
+#define AT91C_EMAC_ECOL ((AT91_REG *)   0xFFFDC060) // (EMAC) Excessive Collision Register
+#define AT91C_EMAC_TID  ((AT91_REG *)   0xFFFDC0B8) // (EMAC) Type ID Checking Register
+#define AT91C_EMAC_HRB  ((AT91_REG *)   0xFFFDC090) // (EMAC) Hash Address Bottom[31:0]
+#define AT91C_EMAC_TBQP ((AT91_REG *)   0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer
+#define AT91C_EMAC_USRIO ((AT91_REG *)  0xFFFDC0C0) // (EMAC) USER Input/Output Register
+#define AT91C_EMAC_PTR  ((AT91_REG *)   0xFFFDC038) // (EMAC) Pause Time Register
+#define AT91C_EMAC_SA2H ((AT91_REG *)   0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes
+#define AT91C_EMAC_ROV  ((AT91_REG *)   0xFFFDC070) // (EMAC) Receive Overrun Errors Register
+#define AT91C_EMAC_ALE  ((AT91_REG *)   0xFFFDC054) // (EMAC) Alignment Error Register
+#define AT91C_EMAC_RJA  ((AT91_REG *)   0xFFFDC07C) // (EMAC) Receive Jabbers Register
+#define AT91C_EMAC_RBQP ((AT91_REG *)   0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer
+#define AT91C_EMAC_TPF  ((AT91_REG *)   0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register
+#define AT91C_EMAC_NCFGR ((AT91_REG *)  0xFFFDC004) // (EMAC) Network Configuration Register
+#define AT91C_EMAC_HRT  ((AT91_REG *)   0xFFFDC094) // (EMAC) Hash Address Top[63:32]
+#define AT91C_EMAC_USF  ((AT91_REG *)   0xFFFDC080) // (EMAC) Undersize Frames Register
+#define AT91C_EMAC_FCSE ((AT91_REG *)   0xFFFDC050) // (EMAC) Frame Check Sequence Error Register
+#define AT91C_EMAC_TPQ  ((AT91_REG *)   0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register
+#define AT91C_EMAC_MAN  ((AT91_REG *)   0xFFFDC034) // (EMAC) PHY Maintenance Register
+#define AT91C_EMAC_FTO  ((AT91_REG *)   0xFFFDC040) // (EMAC) Frames Transmitted OK Register
+#define AT91C_EMAC_REV  ((AT91_REG *)   0xFFFDC0FC) // (EMAC) Revision Register
+#define AT91C_EMAC_IMR  ((AT91_REG *)   0xFFFDC030) // (EMAC) Interrupt Mask Register
+#define AT91C_EMAC_SCF  ((AT91_REG *)   0xFFFDC044) // (EMAC) Single Collision Frame Register
+#define AT91C_EMAC_PFR  ((AT91_REG *)   0xFFFDC03C) // (EMAC) Pause Frames received Register
+#define AT91C_EMAC_MCF  ((AT91_REG *)   0xFFFDC048) // (EMAC) Multiple Collision Frame Register
+#define AT91C_EMAC_NSR  ((AT91_REG *)   0xFFFDC008) // (EMAC) Network Status Register
+#define AT91C_EMAC_SA2L ((AT91_REG *)   0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes
+#define AT91C_EMAC_FRO  ((AT91_REG *)   0xFFFDC04C) // (EMAC) Frames Received OK Register
+#define AT91C_EMAC_IER  ((AT91_REG *)   0xFFFDC028) // (EMAC) Interrupt Enable Register
+#define AT91C_EMAC_SA1H ((AT91_REG *)   0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes
+#define AT91C_EMAC_CSE  ((AT91_REG *)   0xFFFDC068) // (EMAC) Carrier Sense Error Register
+#define AT91C_EMAC_SA3H ((AT91_REG *)   0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes
+#define AT91C_EMAC_RRE  ((AT91_REG *)   0xFFFDC06C) // (EMAC) Receive Ressource Error Register
+#define AT91C_EMAC_STE  ((AT91_REG *)   0xFFFDC084) // (EMAC) SQE Test Error Register
+// ========== Register definition for PDC_ADC peripheral ==========
+#define AT91C_ADC_PTSR  ((AT91_REG *)   0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register
+#define AT91C_ADC_PTCR  ((AT91_REG *)   0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register
+#define AT91C_ADC_TNPR  ((AT91_REG *)   0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register
+#define AT91C_ADC_TNCR  ((AT91_REG *)   0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register
+#define AT91C_ADC_RNPR  ((AT91_REG *)   0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register
+#define AT91C_ADC_RNCR  ((AT91_REG *)   0xFFFD8114) // (PDC_ADC) Receive Next Counter Register
+#define AT91C_ADC_RPR   ((AT91_REG *)   0xFFFD8100) // (PDC_ADC) Receive Pointer Register
+#define AT91C_ADC_TCR   ((AT91_REG *)   0xFFFD810C) // (PDC_ADC) Transmit Counter Register
+#define AT91C_ADC_TPR   ((AT91_REG *)   0xFFFD8108) // (PDC_ADC) Transmit Pointer Register
+#define AT91C_ADC_RCR   ((AT91_REG *)   0xFFFD8104) // (PDC_ADC) Receive Counter Register
+// ========== Register definition for ADC peripheral ==========
+#define AT91C_ADC_CDR2  ((AT91_REG *)   0xFFFD8038) // (ADC) ADC Channel Data Register 2
+#define AT91C_ADC_CDR3  ((AT91_REG *)   0xFFFD803C) // (ADC) ADC Channel Data Register 3
+#define AT91C_ADC_CDR0  ((AT91_REG *)   0xFFFD8030) // (ADC) ADC Channel Data Register 0
+#define AT91C_ADC_CDR5  ((AT91_REG *)   0xFFFD8044) // (ADC) ADC Channel Data Register 5
+#define AT91C_ADC_CHDR  ((AT91_REG *)   0xFFFD8014) // (ADC) ADC Channel Disable Register
+#define AT91C_ADC_SR    ((AT91_REG *)   0xFFFD801C) // (ADC) ADC Status Register
+#define AT91C_ADC_CDR4  ((AT91_REG *)   0xFFFD8040) // (ADC) ADC Channel Data Register 4
+#define AT91C_ADC_CDR1  ((AT91_REG *)   0xFFFD8034) // (ADC) ADC Channel Data Register 1
+#define AT91C_ADC_LCDR  ((AT91_REG *)   0xFFFD8020) // (ADC) ADC Last Converted Data Register
+#define AT91C_ADC_IDR   ((AT91_REG *)   0xFFFD8028) // (ADC) ADC Interrupt Disable Register
+#define AT91C_ADC_CR    ((AT91_REG *)   0xFFFD8000) // (ADC) ADC Control Register
+#define AT91C_ADC_CDR7  ((AT91_REG *)   0xFFFD804C) // (ADC) ADC Channel Data Register 7
+#define AT91C_ADC_CDR6  ((AT91_REG *)   0xFFFD8048) // (ADC) ADC Channel Data Register 6
+#define AT91C_ADC_IER   ((AT91_REG *)   0xFFFD8024) // (ADC) ADC Interrupt Enable Register
+#define AT91C_ADC_CHER  ((AT91_REG *)   0xFFFD8010) // (ADC) ADC Channel Enable Register
+#define AT91C_ADC_CHSR  ((AT91_REG *)   0xFFFD8018) // (ADC) ADC Channel Status Register
+#define AT91C_ADC_MR    ((AT91_REG *)   0xFFFD8004) // (ADC) ADC Mode Register
+#define AT91C_ADC_IMR   ((AT91_REG *)   0xFFFD802C) // (ADC) ADC Interrupt Mask Register
+// ========== Register definition for PDC_AES peripheral ==========
+#define AT91C_AES_TPR   ((AT91_REG *)   0xFFFA4108) // (PDC_AES) Transmit Pointer Register
+#define AT91C_AES_PTCR  ((AT91_REG *)   0xFFFA4120) // (PDC_AES) PDC Transfer Control Register
+#define AT91C_AES_RNPR  ((AT91_REG *)   0xFFFA4110) // (PDC_AES) Receive Next Pointer Register
+#define AT91C_AES_TNCR  ((AT91_REG *)   0xFFFA411C) // (PDC_AES) Transmit Next Counter Register
+#define AT91C_AES_TCR   ((AT91_REG *)   0xFFFA410C) // (PDC_AES) Transmit Counter Register
+#define AT91C_AES_RCR   ((AT91_REG *)   0xFFFA4104) // (PDC_AES) Receive Counter Register
+#define AT91C_AES_RNCR  ((AT91_REG *)   0xFFFA4114) // (PDC_AES) Receive Next Counter Register
+#define AT91C_AES_TNPR  ((AT91_REG *)   0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register
+#define AT91C_AES_RPR   ((AT91_REG *)   0xFFFA4100) // (PDC_AES) Receive Pointer Register
+#define AT91C_AES_PTSR  ((AT91_REG *)   0xFFFA4124) // (PDC_AES) PDC Transfer Status Register
+// ========== Register definition for AES peripheral ==========
+#define AT91C_AES_IVxR  ((AT91_REG *)   0xFFFA4060) // (AES) Initialization Vector x Register
+#define AT91C_AES_MR    ((AT91_REG *)   0xFFFA4004) // (AES) Mode Register
+#define AT91C_AES_VR    ((AT91_REG *)   0xFFFA40FC) // (AES) AES Version Register
+#define AT91C_AES_ODATAxR ((AT91_REG *)     0xFFFA4050) // (AES) Output Data x Register
+#define AT91C_AES_IDATAxR ((AT91_REG *)     0xFFFA4040) // (AES) Input Data x Register
+#define AT91C_AES_CR    ((AT91_REG *)   0xFFFA4000) // (AES) Control Register
+#define AT91C_AES_IDR   ((AT91_REG *)   0xFFFA4014) // (AES) Interrupt Disable Register
+#define AT91C_AES_IMR   ((AT91_REG *)   0xFFFA4018) // (AES) Interrupt Mask Register
+#define AT91C_AES_IER   ((AT91_REG *)   0xFFFA4010) // (AES) Interrupt Enable Register
+#define AT91C_AES_KEYWxR ((AT91_REG *)  0xFFFA4020) // (AES) Key Word x Register
+#define AT91C_AES_ISR   ((AT91_REG *)   0xFFFA401C) // (AES) Interrupt Status Register
+// ========== Register definition for PDC_TDES peripheral ==========
+#define AT91C_TDES_RNCR ((AT91_REG *)   0xFFFA8114) // (PDC_TDES) Receive Next Counter Register
+#define AT91C_TDES_TCR  ((AT91_REG *)   0xFFFA810C) // (PDC_TDES) Transmit Counter Register
+#define AT91C_TDES_RCR  ((AT91_REG *)   0xFFFA8104) // (PDC_TDES) Receive Counter Register
+#define AT91C_TDES_TNPR ((AT91_REG *)   0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register
+#define AT91C_TDES_RNPR ((AT91_REG *)   0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register
+#define AT91C_TDES_RPR  ((AT91_REG *)   0xFFFA8100) // (PDC_TDES) Receive Pointer Register
+#define AT91C_TDES_TNCR ((AT91_REG *)   0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register
+#define AT91C_TDES_TPR  ((AT91_REG *)   0xFFFA8108) // (PDC_TDES) Transmit Pointer Register
+#define AT91C_TDES_PTSR ((AT91_REG *)   0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register
+#define AT91C_TDES_PTCR ((AT91_REG *)   0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register
+// ========== Register definition for TDES peripheral ==========
+#define AT91C_TDES_KEY2WxR ((AT91_REG *)    0xFFFA8028) // (TDES) Key 2 Word x Register
+#define AT91C_TDES_KEY3WxR ((AT91_REG *)    0xFFFA8030) // (TDES) Key 3 Word x Register
+#define AT91C_TDES_IDR  ((AT91_REG *)   0xFFFA8014) // (TDES) Interrupt Disable Register
+#define AT91C_TDES_VR   ((AT91_REG *)   0xFFFA80FC) // (TDES) TDES Version Register
+#define AT91C_TDES_IVxR ((AT91_REG *)   0xFFFA8060) // (TDES) Initialization Vector x Register
+#define AT91C_TDES_ODATAxR ((AT91_REG *)    0xFFFA8050) // (TDES) Output Data x Register
+#define AT91C_TDES_IMR  ((AT91_REG *)   0xFFFA8018) // (TDES) Interrupt Mask Register
+#define AT91C_TDES_MR   ((AT91_REG *)   0xFFFA8004) // (TDES) Mode Register
+#define AT91C_TDES_CR   ((AT91_REG *)   0xFFFA8000) // (TDES) Control Register
+#define AT91C_TDES_IER  ((AT91_REG *)   0xFFFA8010) // (TDES) Interrupt Enable Register
+#define AT91C_TDES_ISR  ((AT91_REG *)   0xFFFA801C) // (TDES) Interrupt Status Register
+#define AT91C_TDES_IDATAxR ((AT91_REG *)    0xFFFA8040) // (TDES) Input Data x Register
+#define AT91C_TDES_KEY1WxR ((AT91_REG *)    0xFFFA8020) // (TDES) Key 1 Word x Register
+
+// *****************************************************************************
+//               PIO DEFINITIONS FOR AT91SAM7X128
+// *****************************************************************************
+#define AT91C_PIO_PA0        ((unsigned int) 1 <<  0) // Pin Controlled by PA0
+#define AT91C_PA0_RXD0     ((unsigned int) AT91C_PIO_PA0) //  USART 0 Receive Data
+#define AT91C_PIO_PA1        ((unsigned int) 1 <<  1) // Pin Controlled by PA1
+#define AT91C_PA1_TXD0     ((unsigned int) AT91C_PIO_PA1) //  USART 0 Transmit Data
+#define AT91C_PIO_PA10       ((unsigned int) 1 << 10) // Pin Controlled by PA10
+#define AT91C_PA10_TWD      ((unsigned int) AT91C_PIO_PA10) //  TWI Two-wire Serial Data
+#define AT91C_PIO_PA11       ((unsigned int) 1 << 11) // Pin Controlled by PA11
+#define AT91C_PA11_TWCK     ((unsigned int) AT91C_PIO_PA11) //  TWI Two-wire Serial Clock
+#define AT91C_PIO_PA12       ((unsigned int) 1 << 12) // Pin Controlled by PA12
+#define AT91C_PA12_NPCS00   ((unsigned int) AT91C_PIO_PA12) //  SPI 0 Peripheral Chip Select 0
+#define AT91C_PIO_PA13       ((unsigned int) 1 << 13) // Pin Controlled by PA13
+#define AT91C_PA13_NPCS01   ((unsigned int) AT91C_PIO_PA13) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PA13_PCK1     ((unsigned int) AT91C_PIO_PA13) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PA14       ((unsigned int) 1 << 14) // Pin Controlled by PA14
+#define AT91C_PA14_NPCS02   ((unsigned int) AT91C_PIO_PA14) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PA14_IRQ1     ((unsigned int) AT91C_PIO_PA14) //  External Interrupt 1
+#define AT91C_PIO_PA15       ((unsigned int) 1 << 15) // Pin Controlled by PA15
+#define AT91C_PA15_NPCS03   ((unsigned int) AT91C_PIO_PA15) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PA15_TCLK2    ((unsigned int) AT91C_PIO_PA15) //  Timer Counter 2 external clock input
+#define AT91C_PIO_PA16       ((unsigned int) 1 << 16) // Pin Controlled by PA16
+#define AT91C_PA16_MISO0    ((unsigned int) AT91C_PIO_PA16) //  SPI 0 Master In Slave
+#define AT91C_PIO_PA17       ((unsigned int) 1 << 17) // Pin Controlled by PA17
+#define AT91C_PA17_MOSI0    ((unsigned int) AT91C_PIO_PA17) //  SPI 0 Master Out Slave
+#define AT91C_PIO_PA18       ((unsigned int) 1 << 18) // Pin Controlled by PA18
+#define AT91C_PA18_SPCK0    ((unsigned int) AT91C_PIO_PA18) //  SPI 0 Serial Clock
+#define AT91C_PIO_PA19       ((unsigned int) 1 << 19) // Pin Controlled by PA19
+#define AT91C_PA19_CANRX    ((unsigned int) AT91C_PIO_PA19) //  CAN Receive
+#define AT91C_PIO_PA2        ((unsigned int) 1 <<  2) // Pin Controlled by PA2
+#define AT91C_PA2_SCK0     ((unsigned int) AT91C_PIO_PA2) //  USART 0 Serial Clock
+#define AT91C_PA2_NPCS11   ((unsigned int) AT91C_PIO_PA2) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PA20       ((unsigned int) 1 << 20) // Pin Controlled by PA20
+#define AT91C_PA20_CANTX    ((unsigned int) AT91C_PIO_PA20) //  CAN Transmit
+#define AT91C_PIO_PA21       ((unsigned int) 1 << 21) // Pin Controlled by PA21
+#define AT91C_PA21_TF       ((unsigned int) AT91C_PIO_PA21) //  SSC Transmit Frame Sync
+#define AT91C_PA21_NPCS10   ((unsigned int) AT91C_PIO_PA21) //  SPI 1 Peripheral Chip Select 0
+#define AT91C_PIO_PA22       ((unsigned int) 1 << 22) // Pin Controlled by PA22
+#define AT91C_PA22_TK       ((unsigned int) AT91C_PIO_PA22) //  SSC Transmit Clock
+#define AT91C_PA22_SPCK1    ((unsigned int) AT91C_PIO_PA22) //  SPI 1 Serial Clock
+#define AT91C_PIO_PA23       ((unsigned int) 1 << 23) // Pin Controlled by PA23
+#define AT91C_PA23_TD       ((unsigned int) AT91C_PIO_PA23) //  SSC Transmit data
+#define AT91C_PA23_MOSI1    ((unsigned int) AT91C_PIO_PA23) //  SPI 1 Master Out Slave
+#define AT91C_PIO_PA24       ((unsigned int) 1 << 24) // Pin Controlled by PA24
+#define AT91C_PA24_RD       ((unsigned int) AT91C_PIO_PA24) //  SSC Receive Data
+#define AT91C_PA24_MISO1    ((unsigned int) AT91C_PIO_PA24) //  SPI 1 Master In Slave
+#define AT91C_PIO_PA25       ((unsigned int) 1 << 25) // Pin Controlled by PA25
+#define AT91C_PA25_RK       ((unsigned int) AT91C_PIO_PA25) //  SSC Receive Clock
+#define AT91C_PA25_NPCS11   ((unsigned int) AT91C_PIO_PA25) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PA26       ((unsigned int) 1 << 26) // Pin Controlled by PA26
+#define AT91C_PA26_RF       ((unsigned int) AT91C_PIO_PA26) //  SSC Receive Frame Sync
+#define AT91C_PA26_NPCS12   ((unsigned int) AT91C_PIO_PA26) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PA27       ((unsigned int) 1 << 27) // Pin Controlled by PA27
+#define AT91C_PA27_DRXD     ((unsigned int) AT91C_PIO_PA27) //  DBGU Debug Receive Data
+#define AT91C_PA27_PCK3     ((unsigned int) AT91C_PIO_PA27) //  PMC Programmable Clock Output 3
+#define AT91C_PIO_PA28       ((unsigned int) 1 << 28) // Pin Controlled by PA28
+#define AT91C_PA28_DTXD     ((unsigned int) AT91C_PIO_PA28) //  DBGU Debug Transmit Data
+#define AT91C_PIO_PA29       ((unsigned int) 1 << 29) // Pin Controlled by PA29
+#define AT91C_PA29_FIQ      ((unsigned int) AT91C_PIO_PA29) //  AIC Fast Interrupt Input
+#define AT91C_PA29_NPCS13   ((unsigned int) AT91C_PIO_PA29) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PA3        ((unsigned int) 1 <<  3) // Pin Controlled by PA3
+#define AT91C_PA3_RTS0     ((unsigned int) AT91C_PIO_PA3) //  USART 0 Ready To Send
+#define AT91C_PA3_NPCS12   ((unsigned int) AT91C_PIO_PA3) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PA30       ((unsigned int) 1 << 30) // Pin Controlled by PA30
+#define AT91C_PA30_IRQ0     ((unsigned int) AT91C_PIO_PA30) //  External Interrupt 0
+#define AT91C_PA30_PCK2     ((unsigned int) AT91C_PIO_PA30) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PA4        ((unsigned int) 1 <<  4) // Pin Controlled by PA4
+#define AT91C_PA4_CTS0     ((unsigned int) AT91C_PIO_PA4) //  USART 0 Clear To Send
+#define AT91C_PA4_NPCS13   ((unsigned int) AT91C_PIO_PA4) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PA5        ((unsigned int) 1 <<  5) // Pin Controlled by PA5
+#define AT91C_PA5_RXD1     ((unsigned int) AT91C_PIO_PA5) //  USART 1 Receive Data
+#define AT91C_PIO_PA6        ((unsigned int) 1 <<  6) // Pin Controlled by PA6
+#define AT91C_PA6_TXD1     ((unsigned int) AT91C_PIO_PA6) //  USART 1 Transmit Data
+#define AT91C_PIO_PA7        ((unsigned int) 1 <<  7) // Pin Controlled by PA7
+#define AT91C_PA7_SCK1     ((unsigned int) AT91C_PIO_PA7) //  USART 1 Serial Clock
+#define AT91C_PA7_NPCS01   ((unsigned int) AT91C_PIO_PA7) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PIO_PA8        ((unsigned int) 1 <<  8) // Pin Controlled by PA8
+#define AT91C_PA8_RTS1     ((unsigned int) AT91C_PIO_PA8) //  USART 1 Ready To Send
+#define AT91C_PA8_NPCS02   ((unsigned int) AT91C_PIO_PA8) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PIO_PA9        ((unsigned int) 1 <<  9) // Pin Controlled by PA9
+#define AT91C_PA9_CTS1     ((unsigned int) AT91C_PIO_PA9) //  USART 1 Clear To Send
+#define AT91C_PA9_NPCS03   ((unsigned int) AT91C_PIO_PA9) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PIO_PB0        ((unsigned int) 1 <<  0) // Pin Controlled by PB0
+#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) //  Ethernet MAC Transmit Clock/Reference Clock
+#define AT91C_PB0_PCK0     ((unsigned int) AT91C_PIO_PB0) //  PMC Programmable Clock Output 0
+#define AT91C_PIO_PB1        ((unsigned int) 1 <<  1) // Pin Controlled by PB1
+#define AT91C_PB1_ETXEN    ((unsigned int) AT91C_PIO_PB1) //  Ethernet MAC Transmit Enable
+#define AT91C_PIO_PB10       ((unsigned int) 1 << 10) // Pin Controlled by PB10
+#define AT91C_PB10_ETX2     ((unsigned int) AT91C_PIO_PB10) //  Ethernet MAC Transmit Data 2
+#define AT91C_PB10_NPCS11   ((unsigned int) AT91C_PIO_PB10) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PB11       ((unsigned int) 1 << 11) // Pin Controlled by PB11
+#define AT91C_PB11_ETX3     ((unsigned int) AT91C_PIO_PB11) //  Ethernet MAC Transmit Data 3
+#define AT91C_PB11_NPCS12   ((unsigned int) AT91C_PIO_PB11) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PB12       ((unsigned int) 1 << 12) // Pin Controlled by PB12
+#define AT91C_PB12_ETXER    ((unsigned int) AT91C_PIO_PB12) //  Ethernet MAC Transmikt Coding Error
+#define AT91C_PB12_TCLK0    ((unsigned int) AT91C_PIO_PB12) //  Timer Counter 0 external clock input
+#define AT91C_PIO_PB13       ((unsigned int) 1 << 13) // Pin Controlled by PB13
+#define AT91C_PB13_ERX2     ((unsigned int) AT91C_PIO_PB13) //  Ethernet MAC Receive Data 2
+#define AT91C_PB13_NPCS01   ((unsigned int) AT91C_PIO_PB13) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PIO_PB14       ((unsigned int) 1 << 14) // Pin Controlled by PB14
+#define AT91C_PB14_ERX3     ((unsigned int) AT91C_PIO_PB14) //  Ethernet MAC Receive Data 3
+#define AT91C_PB14_NPCS02   ((unsigned int) AT91C_PIO_PB14) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PIO_PB15       ((unsigned int) 1 << 15) // Pin Controlled by PB15
+#define AT91C_PB15_ERXDV    ((unsigned int) AT91C_PIO_PB15) //  Ethernet MAC Receive Data Valid
+#define AT91C_PIO_PB16       ((unsigned int) 1 << 16) // Pin Controlled by PB16
+#define AT91C_PB16_ECOL     ((unsigned int) AT91C_PIO_PB16) //  Ethernet MAC Collision Detected
+#define AT91C_PB16_NPCS13   ((unsigned int) AT91C_PIO_PB16) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PB17       ((unsigned int) 1 << 17) // Pin Controlled by PB17
+#define AT91C_PB17_ERXCK    ((unsigned int) AT91C_PIO_PB17) //  Ethernet MAC Receive Clock
+#define AT91C_PB17_NPCS03   ((unsigned int) AT91C_PIO_PB17) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PIO_PB18       ((unsigned int) 1 << 18) // Pin Controlled by PB18
+#define AT91C_PB18_EF100    ((unsigned int) AT91C_PIO_PB18) //  Ethernet MAC Force 100 Mbits/sec
+#define AT91C_PB18_ADTRG    ((unsigned int) AT91C_PIO_PB18) //  ADC External Trigger
+#define AT91C_PIO_PB19       ((unsigned int) 1 << 19) // Pin Controlled by PB19
+#define AT91C_PB19_PWM0     ((unsigned int) AT91C_PIO_PB19) //  PWM Channel 0
+#define AT91C_PB19_TCLK1    ((unsigned int) AT91C_PIO_PB19) //  Timer Counter 1 external clock input
+#define AT91C_PIO_PB2        ((unsigned int) 1 <<  2) // Pin Controlled by PB2
+#define AT91C_PB2_ETX0     ((unsigned int) AT91C_PIO_PB2) //  Ethernet MAC Transmit Data 0
+#define AT91C_PIO_PB20       ((unsigned int) 1 << 20) // Pin Controlled by PB20
+#define AT91C_PB20_PWM1     ((unsigned int) AT91C_PIO_PB20) //  PWM Channel 1
+#define AT91C_PB20_PCK0     ((unsigned int) AT91C_PIO_PB20) //  PMC Programmable Clock Output 0
+#define AT91C_PIO_PB21       ((unsigned int) 1 << 21) // Pin Controlled by PB21
+#define AT91C_PB21_PWM2     ((unsigned int) AT91C_PIO_PB21) //  PWM Channel 2
+#define AT91C_PB21_PCK1     ((unsigned int) AT91C_PIO_PB21) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PB22       ((unsigned int) 1 << 22) // Pin Controlled by PB22
+#define AT91C_PB22_PWM3     ((unsigned int) AT91C_PIO_PB22) //  PWM Channel 3
+#define AT91C_PB22_PCK2     ((unsigned int) AT91C_PIO_PB22) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PB23       ((unsigned int) 1 << 23) // Pin Controlled by PB23
+#define AT91C_PB23_TIOA0    ((unsigned int) AT91C_PIO_PB23) //  Timer Counter 0 Multipurpose Timer I/O Pin A
+#define AT91C_PB23_DCD1     ((unsigned int) AT91C_PIO_PB23) //  USART 1 Data Carrier Detect
+#define AT91C_PIO_PB24       ((unsigned int) 1 << 24) // Pin Controlled by PB24
+#define AT91C_PB24_TIOB0    ((unsigned int) AT91C_PIO_PB24) //  Timer Counter 0 Multipurpose Timer I/O Pin B
+#define AT91C_PB24_DSR1     ((unsigned int) AT91C_PIO_PB24) //  USART 1 Data Set ready
+#define AT91C_PIO_PB25       ((unsigned int) 1 << 25) // Pin Controlled by PB25
+#define AT91C_PB25_TIOA1    ((unsigned int) AT91C_PIO_PB25) //  Timer Counter 1 Multipurpose Timer I/O Pin A
+#define AT91C_PB25_DTR1     ((unsigned int) AT91C_PIO_PB25) //  USART 1 Data Terminal ready
+#define AT91C_PIO_PB26       ((unsigned int) 1 << 26) // Pin Controlled by PB26
+#define AT91C_PB26_TIOB1    ((unsigned int) AT91C_PIO_PB26) //  Timer Counter 1 Multipurpose Timer I/O Pin B
+#define AT91C_PB26_RI1      ((unsigned int) AT91C_PIO_PB26) //  USART 1 Ring Indicator
+#define AT91C_PIO_PB27       ((unsigned int) 1 << 27) // Pin Controlled by PB27
+#define AT91C_PB27_TIOA2    ((unsigned int) AT91C_PIO_PB27) //  Timer Counter 2 Multipurpose Timer I/O Pin A
+#define AT91C_PB27_PWM0     ((unsigned int) AT91C_PIO_PB27) //  PWM Channel 0
+#define AT91C_PIO_PB28       ((unsigned int) 1 << 28) // Pin Controlled by PB28
+#define AT91C_PB28_TIOB2    ((unsigned int) AT91C_PIO_PB28) //  Timer Counter 2 Multipurpose Timer I/O Pin B
+#define AT91C_PB28_PWM1     ((unsigned int) AT91C_PIO_PB28) //  PWM Channel 1
+#define AT91C_PIO_PB29       ((unsigned int) 1 << 29) // Pin Controlled by PB29
+#define AT91C_PB29_PCK1     ((unsigned int) AT91C_PIO_PB29) //  PMC Programmable Clock Output 1
+#define AT91C_PB29_PWM2     ((unsigned int) AT91C_PIO_PB29) //  PWM Channel 2
+#define AT91C_PIO_PB3        ((unsigned int) 1 <<  3) // Pin Controlled by PB3
+#define AT91C_PB3_ETX1     ((unsigned int) AT91C_PIO_PB3) //  Ethernet MAC Transmit Data 1
+#define AT91C_PIO_PB30       ((unsigned int) 1 << 30) // Pin Controlled by PB30
+#define AT91C_PB30_PCK2     ((unsigned int) AT91C_PIO_PB30) //  PMC Programmable Clock Output 2
+#define AT91C_PB30_PWM3     ((unsigned int) AT91C_PIO_PB30) //  PWM Channel 3
+#define AT91C_PIO_PB4        ((unsigned int) 1 <<  4) // Pin Controlled by PB4
+#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) //  Ethernet MAC Carrier Sense/Carrier Sense and Data Valid
+#define AT91C_PIO_PB5        ((unsigned int) 1 <<  5) // Pin Controlled by PB5
+#define AT91C_PB5_ERX0     ((unsigned int) AT91C_PIO_PB5) //  Ethernet MAC Receive Data 0
+#define AT91C_PIO_PB6        ((unsigned int) 1 <<  6) // Pin Controlled by PB6
+#define AT91C_PB6_ERX1     ((unsigned int) AT91C_PIO_PB6) //  Ethernet MAC Receive Data 1
+#define AT91C_PIO_PB7        ((unsigned int) 1 <<  7) // Pin Controlled by PB7
+#define AT91C_PB7_ERXER    ((unsigned int) AT91C_PIO_PB7) //  Ethernet MAC Receive Error
+#define AT91C_PIO_PB8        ((unsigned int) 1 <<  8) // Pin Controlled by PB8
+#define AT91C_PB8_EMDC     ((unsigned int) AT91C_PIO_PB8) //  Ethernet MAC Management Data Clock
+#define AT91C_PIO_PB9        ((unsigned int) 1 <<  9) // Pin Controlled by PB9
+#define AT91C_PB9_EMDIO    ((unsigned int) AT91C_PIO_PB9) //  Ethernet MAC Management Data Input/Output
+
+// *****************************************************************************
+//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7X128
+// *****************************************************************************
+#define AT91C_ID_FIQ    ((unsigned int)  0) // Advanced Interrupt Controller (FIQ)
+#define AT91C_ID_SYS    ((unsigned int)  1) // System Peripheral
+#define AT91C_ID_PIOA   ((unsigned int)  2) // Parallel IO Controller A
+#define AT91C_ID_PIOB   ((unsigned int)  3) // Parallel IO Controller B
+#define AT91C_ID_SPI0   ((unsigned int)  4) // Serial Peripheral Interface 0
+#define AT91C_ID_SPI1   ((unsigned int)  5) // Serial Peripheral Interface 1
+#define AT91C_ID_US0    ((unsigned int)  6) // USART 0
+#define AT91C_ID_US1    ((unsigned int)  7) // USART 1
+#define AT91C_ID_SSC    ((unsigned int)  8) // Serial Synchronous Controller
+#define AT91C_ID_TWI    ((unsigned int)  9) // Two-Wire Interface
+#define AT91C_ID_PWMC   ((unsigned int) 10) // PWM Controller
+#define AT91C_ID_UDP    ((unsigned int) 11) // USB Device Port
+#define AT91C_ID_TC0    ((unsigned int) 12) // Timer Counter 0
+#define AT91C_ID_TC1    ((unsigned int) 13) // Timer Counter 1
+#define AT91C_ID_TC2    ((unsigned int) 14) // Timer Counter 2
+#define AT91C_ID_CAN    ((unsigned int) 15) // Control Area Network Controller
+#define AT91C_ID_EMAC   ((unsigned int) 16) // Ethernet MAC
+#define AT91C_ID_ADC    ((unsigned int) 17) // Analog-to-Digital Converter
+#define AT91C_ID_AES    ((unsigned int) 18) // Advanced Encryption Standard 128-bit
+#define AT91C_ID_TDES   ((unsigned int) 19) // Triple Data Encryption Standard
+#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved
+#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved
+#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved
+#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved
+#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved
+#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved
+#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved
+#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved
+#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved
+#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved
+#define AT91C_ID_IRQ0   ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0)
+#define AT91C_ID_IRQ1   ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1)
+
+// *****************************************************************************
+//               BASE ADDRESS DEFINITIONS FOR AT91SAM7X128
+// *****************************************************************************
+#define AT91C_BASE_SYS       ((AT91PS_SYS)  0xFFFFF000) // (SYS) Base Address
+#define AT91C_BASE_AIC       ((AT91PS_AIC)  0xFFFFF000) // (AIC) Base Address
+#define AT91C_BASE_PDC_DBGU  ((AT91PS_PDC)  0xFFFFF300) // (PDC_DBGU) Base Address
+#define AT91C_BASE_DBGU      ((AT91PS_DBGU)     0xFFFFF200) // (DBGU) Base Address
+#define AT91C_BASE_PIOA      ((AT91PS_PIO)  0xFFFFF400) // (PIOA) Base Address
+#define AT91C_BASE_PIOB      ((AT91PS_PIO)  0xFFFFF600) // (PIOB) Base Address
+#define AT91C_BASE_CKGR      ((AT91PS_CKGR)     0xFFFFFC20) // (CKGR) Base Address
+#define AT91C_BASE_PMC       ((AT91PS_PMC)  0xFFFFFC00) // (PMC) Base Address
+#define AT91C_BASE_RSTC      ((AT91PS_RSTC)     0xFFFFFD00) // (RSTC) Base Address
+#define AT91C_BASE_RTTC      ((AT91PS_RTTC)     0xFFFFFD20) // (RTTC) Base Address
+#define AT91C_BASE_PITC      ((AT91PS_PITC)     0xFFFFFD30) // (PITC) Base Address
+#define AT91C_BASE_WDTC      ((AT91PS_WDTC)     0xFFFFFD40) // (WDTC) Base Address
+#define AT91C_BASE_VREG      ((AT91PS_VREG)     0xFFFFFD60) // (VREG) Base Address
+#define AT91C_BASE_MC        ((AT91PS_MC)   0xFFFFFF00) // (MC) Base Address
+#define AT91C_BASE_PDC_SPI1  ((AT91PS_PDC)  0xFFFE4100) // (PDC_SPI1) Base Address
+#define AT91C_BASE_SPI1      ((AT91PS_SPI)  0xFFFE4000) // (SPI1) Base Address
+#define AT91C_BASE_PDC_SPI0  ((AT91PS_PDC)  0xFFFE0100) // (PDC_SPI0) Base Address
+#define AT91C_BASE_SPI0      ((AT91PS_SPI)  0xFFFE0000) // (SPI0) Base Address
+#define AT91C_BASE_PDC_US1   ((AT91PS_PDC)  0xFFFC4100) // (PDC_US1) Base Address
+#define AT91C_BASE_US1       ((AT91PS_USART)    0xFFFC4000) // (US1) Base Address
+#define AT91C_BASE_PDC_US0   ((AT91PS_PDC)  0xFFFC0100) // (PDC_US0) Base Address
+#define AT91C_BASE_US0       ((AT91PS_USART)    0xFFFC0000) // (US0) Base Address
+#define AT91C_BASE_PDC_SSC   ((AT91PS_PDC)  0xFFFD4100) // (PDC_SSC) Base Address
+#define AT91C_BASE_SSC       ((AT91PS_SSC)  0xFFFD4000) // (SSC) Base Address
+#define AT91C_BASE_TWI       ((AT91PS_TWI)  0xFFFB8000) // (TWI) Base Address
+#define AT91C_BASE_PWMC_CH3  ((AT91PS_PWMC_CH)  0xFFFCC260) // (PWMC_CH3) Base Address
+#define AT91C_BASE_PWMC_CH2  ((AT91PS_PWMC_CH)  0xFFFCC240) // (PWMC_CH2) Base Address
+#define AT91C_BASE_PWMC_CH1  ((AT91PS_PWMC_CH)  0xFFFCC220) // (PWMC_CH1) Base Address
+#define AT91C_BASE_PWMC_CH0  ((AT91PS_PWMC_CH)  0xFFFCC200) // (PWMC_CH0) Base Address
+#define AT91C_BASE_PWMC      ((AT91PS_PWMC)     0xFFFCC000) // (PWMC) Base Address
+#define AT91C_BASE_UDP       ((AT91PS_UDP)  0xFFFB0000) // (UDP) Base Address
+#define AT91C_BASE_TC0       ((AT91PS_TC)   0xFFFA0000) // (TC0) Base Address
+#define AT91C_BASE_TC1       ((AT91PS_TC)   0xFFFA0040) // (TC1) Base Address
+#define AT91C_BASE_TC2       ((AT91PS_TC)   0xFFFA0080) // (TC2) Base Address
+#define AT91C_BASE_TCB       ((AT91PS_TCB)  0xFFFA0000) // (TCB) Base Address
+#define AT91C_BASE_CAN_MB0   ((AT91PS_CAN_MB)   0xFFFD0200) // (CAN_MB0) Base Address
+#define AT91C_BASE_CAN_MB1   ((AT91PS_CAN_MB)   0xFFFD0220) // (CAN_MB1) Base Address
+#define AT91C_BASE_CAN_MB2   ((AT91PS_CAN_MB)   0xFFFD0240) // (CAN_MB2) Base Address
+#define AT91C_BASE_CAN_MB3   ((AT91PS_CAN_MB)   0xFFFD0260) // (CAN_MB3) Base Address
+#define AT91C_BASE_CAN_MB4   ((AT91PS_CAN_MB)   0xFFFD0280) // (CAN_MB4) Base Address
+#define AT91C_BASE_CAN_MB5   ((AT91PS_CAN_MB)   0xFFFD02A0) // (CAN_MB5) Base Address
+#define AT91C_BASE_CAN_MB6   ((AT91PS_CAN_MB)   0xFFFD02C0) // (CAN_MB6) Base Address
+#define AT91C_BASE_CAN_MB7   ((AT91PS_CAN_MB)   0xFFFD02E0) // (CAN_MB7) Base Address
+#define AT91C_BASE_CAN       ((AT91PS_CAN)  0xFFFD0000) // (CAN) Base Address
+#define AT91C_BASE_EMAC      ((AT91PS_EMAC)     0xFFFDC000) // (EMAC) Base Address
+#define AT91C_BASE_PDC_ADC   ((AT91PS_PDC)  0xFFFD8100) // (PDC_ADC) Base Address
+#define AT91C_BASE_ADC       ((AT91PS_ADC)  0xFFFD8000) // (ADC) Base Address
+#define AT91C_BASE_PDC_AES   ((AT91PS_PDC)  0xFFFA4100) // (PDC_AES) Base Address
+#define AT91C_BASE_AES       ((AT91PS_AES)  0xFFFA4000) // (AES) Base Address
+#define AT91C_BASE_PDC_TDES  ((AT91PS_PDC)  0xFFFA8100) // (PDC_TDES) Base Address
+#define AT91C_BASE_TDES      ((AT91PS_TDES)     0xFFFA8000) // (TDES) Base Address
+
+// *****************************************************************************
+//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7X128
+// *****************************************************************************
+#define AT91C_ISRAM  ((char *)  0x00200000) // Internal SRAM base address
+#define AT91C_ISRAM_SIZE     ((unsigned int) 0x00008000) // Internal SRAM size in byte (32 Kbyte)
+#define AT91C_IFLASH     ((char *)  0x00100000) // Internal ROM base address
+#define AT91C_IFLASH_SIZE    ((unsigned int) 0x00020000) // Internal ROM size in byte (128 Kbyte)
+
+#endif
diff --git a/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h b/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h
index 96b680a..e76fdd7 100644
--- a/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h
+++ b/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h
@@ -1,2446 +1,2444 @@
-//  ----------------------------------------------------------------------------

-//          ATMEL Microcontroller Software Support  -  ROUSSET  -

-//  ----------------------------------------------------------------------------

-//  DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR

-//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

-//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE

-//  DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,

-//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

-//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,

-//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

-//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

-//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,

-//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-//  ----------------------------------------------------------------------------

-// File Name           : AT91SAM7X128.h

-// Object              : AT91SAM7X128 definitions

-// Generated           : AT91 SW Application Group  05/20/2005 (16:22:23)

-// 

-// CVS Reference       : /AT91SAM7X128.pl/1.14/Tue May 10 12:12:05 2005//

-// CVS Reference       : /SYS_SAM7X.pl/1.3/Tue Feb  1 17:01:43 2005//

-// CVS Reference       : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005//

-// CVS Reference       : /PMC_SAM7X.pl/1.4/Tue Feb  8 13:58:10 2005//

-// CVS Reference       : /RSTC_SAM7X.pl/1.1/Tue Feb  1 16:16:26 2005//

-// CVS Reference       : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005//

-// CVS Reference       : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005//

-// CVS Reference       : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005//

-// CVS Reference       : /PIO_6057A.pl/1.2/Thu Feb  3 10:18:28 2005//

-// CVS Reference       : /RTTC_6081A.pl/1.2/Tue Nov  9 14:43:58 2004//

-// CVS Reference       : /PITC_6079A.pl/1.2/Tue Nov  9 14:43:56 2004//

-// CVS Reference       : /WDTC_6080A.pl/1.3/Tue Nov  9 14:44:00 2004//

-// CVS Reference       : /VREG_6085B.pl/1.1/Tue Feb  1 16:05:48 2005//

-// CVS Reference       : /PDC_6074C.pl/1.2/Thu Feb  3 08:48:54 2005//

-// CVS Reference       : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005//

-// CVS Reference       : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005//

-// CVS Reference       : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004//

-// CVS Reference       : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004//

-// CVS Reference       : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004//

-// CVS Reference       : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005//

-// CVS Reference       : /CAN_6019B.pl/1.1/Tue Mar  8 12:42:22 2005//

-// CVS Reference       : /EMACB_6119A.pl/1.5/Thu Feb  3 15:52:04 2005//

-// CVS Reference       : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003//

-// CVS Reference       : /AES_6149A.pl/1.10/Mon Feb  7 09:44:25 2005//

-// CVS Reference       : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005//

-//  ----------------------------------------------------------------------------

-

-// Hardware register definition

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR System Peripherals

-// *****************************************************************************

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller

-// *****************************************************************************

-// *** Register offset in AT91S_AIC structure ***

-#define AIC_SMR         ( 0) // Source Mode Register

-#define AIC_SVR         (128) // Source Vector Register

-#define AIC_IVR         (256) // IRQ Vector Register

-#define AIC_FVR         (260) // FIQ Vector Register

-#define AIC_ISR         (264) // Interrupt Status Register

-#define AIC_IPR         (268) // Interrupt Pending Register

-#define AIC_IMR         (272) // Interrupt Mask Register

-#define AIC_CISR        (276) // Core Interrupt Status Register

-#define AIC_IECR        (288) // Interrupt Enable Command Register

-#define AIC_IDCR        (292) // Interrupt Disable Command Register

-#define AIC_ICCR        (296) // Interrupt Clear Command Register

-#define AIC_ISCR        (300) // Interrupt Set Command Register

-#define AIC_EOICR       (304) // End of Interrupt Command Register

-#define AIC_SPU         (308) // Spurious Vector Register

-#define AIC_DCR         (312) // Debug Control Register (Protect)

-#define AIC_FFER        (320) // Fast Forcing Enable Register

-#define AIC_FFDR        (324) // Fast Forcing Disable Register

-#define AIC_FFSR        (328) // Fast Forcing Status Register

-// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- 

-#define AT91C_AIC_PRIOR           (0x7 <<  0) // (AIC) Priority Level

-#define 	AT91C_AIC_PRIOR_LOWEST               (0x0) // (AIC) Lowest priority level

-#define 	AT91C_AIC_PRIOR_HIGHEST              (0x7) // (AIC) Highest priority level

-#define AT91C_AIC_SRCTYPE         (0x3 <<  5) // (AIC) Interrupt Source Type

-#define 	AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL       (0x0 <<  5) // (AIC) Internal Sources Code Label High-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL        (0x0 <<  5) // (AIC) External Sources Code Label Low-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE    (0x1 <<  5) // (AIC) Internal Sources Code Label Positive Edge triggered

-#define 	AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE    (0x1 <<  5) // (AIC) External Sources Code Label Negative Edge triggered

-#define 	AT91C_AIC_SRCTYPE_HIGH_LEVEL           (0x2 <<  5) // (AIC) Internal Or External Sources Code Label High-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_POSITIVE_EDGE        (0x3 <<  5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered

-// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- 

-#define AT91C_AIC_NFIQ            (0x1 <<  0) // (AIC) NFIQ Status

-#define AT91C_AIC_NIRQ            (0x1 <<  1) // (AIC) NIRQ Status

-// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- 

-#define AT91C_AIC_DCR_PROT        (0x1 <<  0) // (AIC) Protection Mode

-#define AT91C_AIC_DCR_GMSK        (0x1 <<  1) // (AIC) General Mask

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Peripheral DMA Controller

-// *****************************************************************************

-// *** Register offset in AT91S_PDC structure ***

-#define PDC_RPR         ( 0) // Receive Pointer Register

-#define PDC_RCR         ( 4) // Receive Counter Register

-#define PDC_TPR         ( 8) // Transmit Pointer Register

-#define PDC_TCR         (12) // Transmit Counter Register

-#define PDC_RNPR        (16) // Receive Next Pointer Register

-#define PDC_RNCR        (20) // Receive Next Counter Register

-#define PDC_TNPR        (24) // Transmit Next Pointer Register

-#define PDC_TNCR        (28) // Transmit Next Counter Register

-#define PDC_PTCR        (32) // PDC Transfer Control Register

-#define PDC_PTSR        (36) // PDC Transfer Status Register

-// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- 

-#define AT91C_PDC_RXTEN           (0x1 <<  0) // (PDC) Receiver Transfer Enable

-#define AT91C_PDC_RXTDIS          (0x1 <<  1) // (PDC) Receiver Transfer Disable

-#define AT91C_PDC_TXTEN           (0x1 <<  8) // (PDC) Transmitter Transfer Enable

-#define AT91C_PDC_TXTDIS          (0x1 <<  9) // (PDC) Transmitter Transfer Disable

-// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Debug Unit

-// *****************************************************************************

-// *** Register offset in AT91S_DBGU structure ***

-#define DBGU_CR         ( 0) // Control Register

-#define DBGU_MR         ( 4) // Mode Register

-#define DBGU_IER        ( 8) // Interrupt Enable Register

-#define DBGU_IDR        (12) // Interrupt Disable Register

-#define DBGU_IMR        (16) // Interrupt Mask Register

-#define DBGU_CSR        (20) // Channel Status Register

-#define DBGU_RHR        (24) // Receiver Holding Register

-#define DBGU_THR        (28) // Transmitter Holding Register

-#define DBGU_BRGR       (32) // Baud Rate Generator Register

-#define DBGU_CIDR       (64) // Chip ID Register

-#define DBGU_EXID       (68) // Chip ID Extension Register

-#define DBGU_FNTR       (72) // Force NTRST Register

-#define DBGU_RPR        (256) // Receive Pointer Register

-#define DBGU_RCR        (260) // Receive Counter Register

-#define DBGU_TPR        (264) // Transmit Pointer Register

-#define DBGU_TCR        (268) // Transmit Counter Register

-#define DBGU_RNPR       (272) // Receive Next Pointer Register

-#define DBGU_RNCR       (276) // Receive Next Counter Register

-#define DBGU_TNPR       (280) // Transmit Next Pointer Register

-#define DBGU_TNCR       (284) // Transmit Next Counter Register

-#define DBGU_PTCR       (288) // PDC Transfer Control Register

-#define DBGU_PTSR       (292) // PDC Transfer Status Register

-// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_RSTRX            (0x1 <<  2) // (DBGU) Reset Receiver

-#define AT91C_US_RSTTX            (0x1 <<  3) // (DBGU) Reset Transmitter

-#define AT91C_US_RXEN             (0x1 <<  4) // (DBGU) Receiver Enable

-#define AT91C_US_RXDIS            (0x1 <<  5) // (DBGU) Receiver Disable

-#define AT91C_US_TXEN             (0x1 <<  6) // (DBGU) Transmitter Enable

-#define AT91C_US_TXDIS            (0x1 <<  7) // (DBGU) Transmitter Disable

-#define AT91C_US_RSTSTA           (0x1 <<  8) // (DBGU) Reset Status Bits

-// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_PAR              (0x7 <<  9) // (DBGU) Parity type

-#define 	AT91C_US_PAR_EVEN                 (0x0 <<  9) // (DBGU) Even Parity

-#define 	AT91C_US_PAR_ODD                  (0x1 <<  9) // (DBGU) Odd Parity

-#define 	AT91C_US_PAR_SPACE                (0x2 <<  9) // (DBGU) Parity forced to 0 (Space)

-#define 	AT91C_US_PAR_MARK                 (0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)

-#define 	AT91C_US_PAR_NONE                 (0x4 <<  9) // (DBGU) No Parity

-#define 	AT91C_US_PAR_MULTI_DROP           (0x6 <<  9) // (DBGU) Multi-drop mode

-#define AT91C_US_CHMODE           (0x3 << 14) // (DBGU) Channel Mode

-#define 	AT91C_US_CHMODE_NORMAL               (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.

-#define 	AT91C_US_CHMODE_AUTO                 (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.

-#define 	AT91C_US_CHMODE_LOCAL                (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.

-#define 	AT91C_US_CHMODE_REMOTE               (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.

-// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXRDY            (0x1 <<  0) // (DBGU) RXRDY Interrupt

-#define AT91C_US_TXRDY            (0x1 <<  1) // (DBGU) TXRDY Interrupt

-#define AT91C_US_ENDRX            (0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt

-#define AT91C_US_ENDTX            (0x1 <<  4) // (DBGU) End of Transmit Interrupt

-#define AT91C_US_OVRE             (0x1 <<  5) // (DBGU) Overrun Interrupt

-#define AT91C_US_FRAME            (0x1 <<  6) // (DBGU) Framing Error Interrupt

-#define AT91C_US_PARE             (0x1 <<  7) // (DBGU) Parity Error Interrupt

-#define AT91C_US_TXEMPTY          (0x1 <<  9) // (DBGU) TXEMPTY Interrupt

-#define AT91C_US_TXBUFE           (0x1 << 11) // (DBGU) TXBUFE Interrupt

-#define AT91C_US_RXBUFF           (0x1 << 12) // (DBGU) RXBUFF Interrupt

-#define AT91C_US_COMM_TX          (0x1 << 30) // (DBGU) COMM_TX Interrupt

-#define AT91C_US_COMM_RX          (0x1 << 31) // (DBGU) COMM_RX Interrupt

-// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- 

-// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- 

-#define AT91C_US_FORCE_NTRST      (0x1 <<  0) // (DBGU) Force NTRST in JTAG

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler

-// *****************************************************************************

-// *** Register offset in AT91S_PIO structure ***

-#define PIO_PER         ( 0) // PIO Enable Register

-#define PIO_PDR         ( 4) // PIO Disable Register

-#define PIO_PSR         ( 8) // PIO Status Register

-#define PIO_OER         (16) // Output Enable Register

-#define PIO_ODR         (20) // Output Disable Registerr

-#define PIO_OSR         (24) // Output Status Register

-#define PIO_IFER        (32) // Input Filter Enable Register

-#define PIO_IFDR        (36) // Input Filter Disable Register

-#define PIO_IFSR        (40) // Input Filter Status Register

-#define PIO_SODR        (48) // Set Output Data Register

-#define PIO_CODR        (52) // Clear Output Data Register

-#define PIO_ODSR        (56) // Output Data Status Register

-#define PIO_PDSR        (60) // Pin Data Status Register

-#define PIO_IER         (64) // Interrupt Enable Register

-#define PIO_IDR         (68) // Interrupt Disable Register

-#define PIO_IMR         (72) // Interrupt Mask Register

-#define PIO_ISR         (76) // Interrupt Status Register

-#define PIO_MDER        (80) // Multi-driver Enable Register

-#define PIO_MDDR        (84) // Multi-driver Disable Register

-#define PIO_MDSR        (88) // Multi-driver Status Register

-#define PIO_PPUDR       (96) // Pull-up Disable Register

-#define PIO_PPUER       (100) // Pull-up Enable Register

-#define PIO_PPUSR       (104) // Pull-up Status Register

-#define PIO_ASR         (112) // Select A Register

-#define PIO_BSR         (116) // Select B Register

-#define PIO_ABSR        (120) // AB Select Status Register

-#define PIO_OWER        (160) // Output Write Enable Register

-#define PIO_OWDR        (164) // Output Write Disable Register

-#define PIO_OWSR        (168) // Output Write Status Register

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Clock Generator Controler

-// *****************************************************************************

-// *** Register offset in AT91S_CKGR structure ***

-#define CKGR_MOR        ( 0) // Main Oscillator Register

-#define CKGR_MCFR       ( 4) // Main Clock  Frequency Register

-#define CKGR_PLLR       (12) // PLL Register

-// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- 

-#define AT91C_CKGR_MOSCEN         (0x1 <<  0) // (CKGR) Main Oscillator Enable

-#define AT91C_CKGR_OSCBYPASS      (0x1 <<  1) // (CKGR) Main Oscillator Bypass

-#define AT91C_CKGR_OSCOUNT        (0xFF <<  8) // (CKGR) Main Oscillator Start-up Time

-// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- 

-#define AT91C_CKGR_MAINF          (0xFFFF <<  0) // (CKGR) Main Clock Frequency

-#define AT91C_CKGR_MAINRDY        (0x1 << 16) // (CKGR) Main Clock Ready

-// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- 

-#define AT91C_CKGR_DIV            (0xFF <<  0) // (CKGR) Divider Selected

-#define 	AT91C_CKGR_DIV_0                    (0x0) // (CKGR) Divider output is 0

-#define 	AT91C_CKGR_DIV_BYPASS               (0x1) // (CKGR) Divider is bypassed

-#define AT91C_CKGR_PLLCOUNT       (0x3F <<  8) // (CKGR) PLL Counter

-#define AT91C_CKGR_OUT            (0x3 << 14) // (CKGR) PLL Output Frequency Range

-#define 	AT91C_CKGR_OUT_0                    (0x0 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_1                    (0x1 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_2                    (0x2 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_3                    (0x3 << 14) // (CKGR) Please refer to the PLL datasheet

-#define AT91C_CKGR_MUL            (0x7FF << 16) // (CKGR) PLL Multiplier

-#define AT91C_CKGR_USBDIV         (0x3 << 28) // (CKGR) Divider for USB Clocks

-#define 	AT91C_CKGR_USBDIV_0                    (0x0 << 28) // (CKGR) Divider output is PLL clock output

-#define 	AT91C_CKGR_USBDIV_1                    (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2

-#define 	AT91C_CKGR_USBDIV_2                    (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Power Management Controler

-// *****************************************************************************

-// *** Register offset in AT91S_PMC structure ***

-#define PMC_SCER        ( 0) // System Clock Enable Register

-#define PMC_SCDR        ( 4) // System Clock Disable Register

-#define PMC_SCSR        ( 8) // System Clock Status Register

-#define PMC_PCER        (16) // Peripheral Clock Enable Register

-#define PMC_PCDR        (20) // Peripheral Clock Disable Register

-#define PMC_PCSR        (24) // Peripheral Clock Status Register

-#define PMC_MOR         (32) // Main Oscillator Register

-#define PMC_MCFR        (36) // Main Clock  Frequency Register

-#define PMC_PLLR        (44) // PLL Register

-#define PMC_MCKR        (48) // Master Clock Register

-#define PMC_PCKR        (64) // Programmable Clock Register

-#define PMC_IER         (96) // Interrupt Enable Register

-#define PMC_IDR         (100) // Interrupt Disable Register

-#define PMC_SR          (104) // Status Register

-#define PMC_IMR         (108) // Interrupt Mask Register

-// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- 

-#define AT91C_PMC_PCK             (0x1 <<  0) // (PMC) Processor Clock

-#define AT91C_PMC_UDP             (0x1 <<  7) // (PMC) USB Device Port Clock

-#define AT91C_PMC_PCK0            (0x1 <<  8) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK1            (0x1 <<  9) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK2            (0x1 << 10) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK3            (0x1 << 11) // (PMC) Programmable Clock Output

-// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- 

-// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- 

-// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- 

-// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- 

-// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- 

-// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- 

-#define AT91C_PMC_CSS             (0x3 <<  0) // (PMC) Programmable Clock Selection

-#define 	AT91C_PMC_CSS_SLOW_CLK             (0x0) // (PMC) Slow Clock is selected

-#define 	AT91C_PMC_CSS_MAIN_CLK             (0x1) // (PMC) Main Clock is selected

-#define 	AT91C_PMC_CSS_PLL_CLK              (0x3) // (PMC) Clock from PLL is selected

-#define AT91C_PMC_PRES            (0x7 <<  2) // (PMC) Programmable Clock Prescaler

-#define 	AT91C_PMC_PRES_CLK                  (0x0 <<  2) // (PMC) Selected clock

-#define 	AT91C_PMC_PRES_CLK_2                (0x1 <<  2) // (PMC) Selected clock divided by 2

-#define 	AT91C_PMC_PRES_CLK_4                (0x2 <<  2) // (PMC) Selected clock divided by 4

-#define 	AT91C_PMC_PRES_CLK_8                (0x3 <<  2) // (PMC) Selected clock divided by 8

-#define 	AT91C_PMC_PRES_CLK_16               (0x4 <<  2) // (PMC) Selected clock divided by 16

-#define 	AT91C_PMC_PRES_CLK_32               (0x5 <<  2) // (PMC) Selected clock divided by 32

-#define 	AT91C_PMC_PRES_CLK_64               (0x6 <<  2) // (PMC) Selected clock divided by 64

-// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- 

-// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- 

-#define AT91C_PMC_MOSCS           (0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask

-#define AT91C_PMC_LOCK            (0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask

-#define AT91C_PMC_MCKRDY          (0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK0RDY         (0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK1RDY         (0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK2RDY         (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK3RDY         (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask

-// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- 

-// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- 

-// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Reset Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_RSTC structure ***

-#define RSTC_RCR        ( 0) // Reset Control Register

-#define RSTC_RSR        ( 4) // Reset Status Register

-#define RSTC_RMR        ( 8) // Reset Mode Register

-// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- 

-#define AT91C_RSTC_PROCRST        (0x1 <<  0) // (RSTC) Processor Reset

-#define AT91C_RSTC_PERRST         (0x1 <<  2) // (RSTC) Peripheral Reset

-#define AT91C_RSTC_EXTRST         (0x1 <<  3) // (RSTC) External Reset

-#define AT91C_RSTC_KEY            (0xFF << 24) // (RSTC) Password

-// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- 

-#define AT91C_RSTC_URSTS          (0x1 <<  0) // (RSTC) User Reset Status

-#define AT91C_RSTC_BODSTS         (0x1 <<  1) // (RSTC) Brownout Detection Status

-#define AT91C_RSTC_RSTTYP         (0x7 <<  8) // (RSTC) Reset Type

-#define 	AT91C_RSTC_RSTTYP_POWERUP              (0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.

-#define 	AT91C_RSTC_RSTTYP_WAKEUP               (0x1 <<  8) // (RSTC) WakeUp Reset. VDDCORE rising.

-#define 	AT91C_RSTC_RSTTYP_WATCHDOG             (0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.

-#define 	AT91C_RSTC_RSTTYP_SOFTWARE             (0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.

-#define 	AT91C_RSTC_RSTTYP_USER                 (0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.

-#define 	AT91C_RSTC_RSTTYP_BROWNOUT             (0x5 <<  8) // (RSTC) Brownout Reset occured.

-#define AT91C_RSTC_NRSTL          (0x1 << 16) // (RSTC) NRST pin level

-#define AT91C_RSTC_SRCMP          (0x1 << 17) // (RSTC) Software Reset Command in Progress.

-// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- 

-#define AT91C_RSTC_URSTEN         (0x1 <<  0) // (RSTC) User Reset Enable

-#define AT91C_RSTC_URSTIEN        (0x1 <<  4) // (RSTC) User Reset Interrupt Enable

-#define AT91C_RSTC_ERSTL          (0xF <<  8) // (RSTC) User Reset Enable

-#define AT91C_RSTC_BODIEN         (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_RTTC structure ***

-#define RTTC_RTMR       ( 0) // Real-time Mode Register

-#define RTTC_RTAR       ( 4) // Real-time Alarm Register

-#define RTTC_RTVR       ( 8) // Real-time Value Register

-#define RTTC_RTSR       (12) // Real-time Status Register

-// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- 

-#define AT91C_RTTC_RTPRES         (0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value

-#define AT91C_RTTC_ALMIEN         (0x1 << 16) // (RTTC) Alarm Interrupt Enable

-#define AT91C_RTTC_RTTINCIEN      (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable

-#define AT91C_RTTC_RTTRST         (0x1 << 18) // (RTTC) Real Time Timer Restart

-// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- 

-#define AT91C_RTTC_ALMV           (0x0 <<  0) // (RTTC) Alarm Value

-// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- 

-#define AT91C_RTTC_CRTV           (0x0 <<  0) // (RTTC) Current Real-time Value

-// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- 

-#define AT91C_RTTC_ALMS           (0x1 <<  0) // (RTTC) Real-time Alarm Status

-#define AT91C_RTTC_RTTINC         (0x1 <<  1) // (RTTC) Real-time Timer Increment

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_PITC structure ***

-#define PITC_PIMR       ( 0) // Period Interval Mode Register

-#define PITC_PISR       ( 4) // Period Interval Status Register

-#define PITC_PIVR       ( 8) // Period Interval Value Register

-#define PITC_PIIR       (12) // Period Interval Image Register

-// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- 

-#define AT91C_PITC_PIV            (0xFFFFF <<  0) // (PITC) Periodic Interval Value

-#define AT91C_PITC_PITEN          (0x1 << 24) // (PITC) Periodic Interval Timer Enabled

-#define AT91C_PITC_PITIEN         (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable

-// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- 

-#define AT91C_PITC_PITS           (0x1 <<  0) // (PITC) Periodic Interval Timer Status

-// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- 

-#define AT91C_PITC_CPIV           (0xFFFFF <<  0) // (PITC) Current Periodic Interval Value

-#define AT91C_PITC_PICNT          (0xFFF << 20) // (PITC) Periodic Interval Counter

-// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_WDTC structure ***

-#define WDTC_WDCR       ( 0) // Watchdog Control Register

-#define WDTC_WDMR       ( 4) // Watchdog Mode Register

-#define WDTC_WDSR       ( 8) // Watchdog Status Register

-// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- 

-#define AT91C_WDTC_WDRSTT         (0x1 <<  0) // (WDTC) Watchdog Restart

-#define AT91C_WDTC_KEY            (0xFF << 24) // (WDTC) Watchdog KEY Password

-// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- 

-#define AT91C_WDTC_WDV            (0xFFF <<  0) // (WDTC) Watchdog Timer Restart

-#define AT91C_WDTC_WDFIEN         (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable

-#define AT91C_WDTC_WDRSTEN        (0x1 << 13) // (WDTC) Watchdog Reset Enable

-#define AT91C_WDTC_WDRPROC        (0x1 << 14) // (WDTC) Watchdog Timer Restart

-#define AT91C_WDTC_WDDIS          (0x1 << 15) // (WDTC) Watchdog Disable

-#define AT91C_WDTC_WDD            (0xFFF << 16) // (WDTC) Watchdog Delta Value

-#define AT91C_WDTC_WDDBGHLT       (0x1 << 28) // (WDTC) Watchdog Debug Halt

-#define AT91C_WDTC_WDIDLEHLT      (0x1 << 29) // (WDTC) Watchdog Idle Halt

-// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- 

-#define AT91C_WDTC_WDUNF          (0x1 <<  0) // (WDTC) Watchdog Underflow

-#define AT91C_WDTC_WDERR          (0x1 <<  1) // (WDTC) Watchdog Error

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Voltage Regulator Mode Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_VREG structure ***

-#define VREG_MR         ( 0) // Voltage Regulator Mode Register

-// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- 

-#define AT91C_VREG_PSTDBY         (0x1 <<  0) // (VREG) Voltage Regulator Power Standby Mode

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Memory Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_MC structure ***

-#define MC_RCR          ( 0) // MC Remap Control Register

-#define MC_ASR          ( 4) // MC Abort Status Register

-#define MC_AASR         ( 8) // MC Abort Address Status Register

-#define MC_FMR          (96) // MC Flash Mode Register

-#define MC_FCR          (100) // MC Flash Command Register

-#define MC_FSR          (104) // MC Flash Status Register

-// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- 

-#define AT91C_MC_RCB              (0x1 <<  0) // (MC) Remap Command Bit

-// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- 

-#define AT91C_MC_UNDADD           (0x1 <<  0) // (MC) Undefined Addess Abort Status

-#define AT91C_MC_MISADD           (0x1 <<  1) // (MC) Misaligned Addess Abort Status

-#define AT91C_MC_ABTSZ            (0x3 <<  8) // (MC) Abort Size Status

-#define 	AT91C_MC_ABTSZ_BYTE                 (0x0 <<  8) // (MC) Byte

-#define 	AT91C_MC_ABTSZ_HWORD                (0x1 <<  8) // (MC) Half-word

-#define 	AT91C_MC_ABTSZ_WORD                 (0x2 <<  8) // (MC) Word

-#define AT91C_MC_ABTTYP           (0x3 << 10) // (MC) Abort Type Status

-#define 	AT91C_MC_ABTTYP_DATAR                (0x0 << 10) // (MC) Data Read

-#define 	AT91C_MC_ABTTYP_DATAW                (0x1 << 10) // (MC) Data Write

-#define 	AT91C_MC_ABTTYP_FETCH                (0x2 << 10) // (MC) Code Fetch

-#define AT91C_MC_MST0             (0x1 << 16) // (MC) Master 0 Abort Source

-#define AT91C_MC_MST1             (0x1 << 17) // (MC) Master 1 Abort Source

-#define AT91C_MC_SVMST0           (0x1 << 24) // (MC) Saved Master 0 Abort Source

-#define AT91C_MC_SVMST1           (0x1 << 25) // (MC) Saved Master 1 Abort Source

-// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- 

-#define AT91C_MC_FRDY             (0x1 <<  0) // (MC) Flash Ready

-#define AT91C_MC_LOCKE            (0x1 <<  2) // (MC) Lock Error

-#define AT91C_MC_PROGE            (0x1 <<  3) // (MC) Programming Error

-#define AT91C_MC_NEBP             (0x1 <<  7) // (MC) No Erase Before Programming

-#define AT91C_MC_FWS              (0x3 <<  8) // (MC) Flash Wait State

-#define 	AT91C_MC_FWS_0FWS                 (0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations

-#define 	AT91C_MC_FWS_1FWS                 (0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations

-#define 	AT91C_MC_FWS_2FWS                 (0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations

-#define 	AT91C_MC_FWS_3FWS                 (0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations

-#define AT91C_MC_FMCN             (0xFF << 16) // (MC) Flash Microsecond Cycle Number

-// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- 

-#define AT91C_MC_FCMD             (0xF <<  0) // (MC) Flash Command

-#define 	AT91C_MC_FCMD_START_PROG           (0x1) // (MC) Starts the programming of th epage specified by PAGEN.

-#define 	AT91C_MC_FCMD_LOCK                 (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_PROG_AND_LOCK        (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.

-#define 	AT91C_MC_FCMD_UNLOCK               (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_ERASE_ALL            (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.

-#define 	AT91C_MC_FCMD_SET_GP_NVM           (0xB) // (MC) Set General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_CLR_GP_NVM           (0xD) // (MC) Clear General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_SET_SECURITY         (0xF) // (MC) Set Security Bit.

-#define AT91C_MC_PAGEN            (0x3FF <<  8) // (MC) Page Number

-#define AT91C_MC_KEY              (0xFF << 24) // (MC) Writing Protect Key

-// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- 

-#define AT91C_MC_SECURITY         (0x1 <<  4) // (MC) Security Bit Status

-#define AT91C_MC_GPNVM0           (0x1 <<  8) // (MC) Sector 0 Lock Status

-#define AT91C_MC_GPNVM1           (0x1 <<  9) // (MC) Sector 1 Lock Status

-#define AT91C_MC_GPNVM2           (0x1 << 10) // (MC) Sector 2 Lock Status

-#define AT91C_MC_GPNVM3           (0x1 << 11) // (MC) Sector 3 Lock Status

-#define AT91C_MC_GPNVM4           (0x1 << 12) // (MC) Sector 4 Lock Status

-#define AT91C_MC_GPNVM5           (0x1 << 13) // (MC) Sector 5 Lock Status

-#define AT91C_MC_GPNVM6           (0x1 << 14) // (MC) Sector 6 Lock Status

-#define AT91C_MC_GPNVM7           (0x1 << 15) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS0           (0x1 << 16) // (MC) Sector 0 Lock Status

-#define AT91C_MC_LOCKS1           (0x1 << 17) // (MC) Sector 1 Lock Status

-#define AT91C_MC_LOCKS2           (0x1 << 18) // (MC) Sector 2 Lock Status

-#define AT91C_MC_LOCKS3           (0x1 << 19) // (MC) Sector 3 Lock Status

-#define AT91C_MC_LOCKS4           (0x1 << 20) // (MC) Sector 4 Lock Status

-#define AT91C_MC_LOCKS5           (0x1 << 21) // (MC) Sector 5 Lock Status

-#define AT91C_MC_LOCKS6           (0x1 << 22) // (MC) Sector 6 Lock Status

-#define AT91C_MC_LOCKS7           (0x1 << 23) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS8           (0x1 << 24) // (MC) Sector 8 Lock Status

-#define AT91C_MC_LOCKS9           (0x1 << 25) // (MC) Sector 9 Lock Status

-#define AT91C_MC_LOCKS10          (0x1 << 26) // (MC) Sector 10 Lock Status

-#define AT91C_MC_LOCKS11          (0x1 << 27) // (MC) Sector 11 Lock Status

-#define AT91C_MC_LOCKS12          (0x1 << 28) // (MC) Sector 12 Lock Status

-#define AT91C_MC_LOCKS13          (0x1 << 29) // (MC) Sector 13 Lock Status

-#define AT91C_MC_LOCKS14          (0x1 << 30) // (MC) Sector 14 Lock Status

-#define AT91C_MC_LOCKS15          (0x1 << 31) // (MC) Sector 15 Lock Status

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface

-// *****************************************************************************

-// *** Register offset in AT91S_SPI structure ***

-#define SPI_CR          ( 0) // Control Register

-#define SPI_MR          ( 4) // Mode Register

-#define SPI_RDR         ( 8) // Receive Data Register

-#define SPI_TDR         (12) // Transmit Data Register

-#define SPI_SR          (16) // Status Register

-#define SPI_IER         (20) // Interrupt Enable Register

-#define SPI_IDR         (24) // Interrupt Disable Register

-#define SPI_IMR         (28) // Interrupt Mask Register

-#define SPI_CSR         (48) // Chip Select Register

-#define SPI_RPR         (256) // Receive Pointer Register

-#define SPI_RCR         (260) // Receive Counter Register

-#define SPI_TPR         (264) // Transmit Pointer Register

-#define SPI_TCR         (268) // Transmit Counter Register

-#define SPI_RNPR        (272) // Receive Next Pointer Register

-#define SPI_RNCR        (276) // Receive Next Counter Register

-#define SPI_TNPR        (280) // Transmit Next Pointer Register

-#define SPI_TNCR        (284) // Transmit Next Counter Register

-#define SPI_PTCR        (288) // PDC Transfer Control Register

-#define SPI_PTSR        (292) // PDC Transfer Status Register

-// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- 

-#define AT91C_SPI_SPIEN           (0x1 <<  0) // (SPI) SPI Enable

-#define AT91C_SPI_SPIDIS          (0x1 <<  1) // (SPI) SPI Disable

-#define AT91C_SPI_SWRST           (0x1 <<  7) // (SPI) SPI Software reset

-#define AT91C_SPI_LASTXFER        (0x1 << 24) // (SPI) SPI Last Transfer

-// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- 

-#define AT91C_SPI_MSTR            (0x1 <<  0) // (SPI) Master/Slave Mode

-#define AT91C_SPI_PS              (0x1 <<  1) // (SPI) Peripheral Select

-#define 	AT91C_SPI_PS_FIXED                (0x0 <<  1) // (SPI) Fixed Peripheral Select

-#define 	AT91C_SPI_PS_VARIABLE             (0x1 <<  1) // (SPI) Variable Peripheral Select

-#define AT91C_SPI_PCSDEC          (0x1 <<  2) // (SPI) Chip Select Decode

-#define AT91C_SPI_FDIV            (0x1 <<  3) // (SPI) Clock Selection

-#define AT91C_SPI_MODFDIS         (0x1 <<  4) // (SPI) Mode Fault Detection

-#define AT91C_SPI_LLB             (0x1 <<  7) // (SPI) Clock Selection

-#define AT91C_SPI_PCS             (0xF << 16) // (SPI) Peripheral Chip Select

-#define AT91C_SPI_DLYBCS          (0xFF << 24) // (SPI) Delay Between Chip Selects

-// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- 

-#define AT91C_SPI_RD              (0xFFFF <<  0) // (SPI) Receive Data

-#define AT91C_SPI_RPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- 

-#define AT91C_SPI_TD              (0xFFFF <<  0) // (SPI) Transmit Data

-#define AT91C_SPI_TPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- 

-#define AT91C_SPI_RDRF            (0x1 <<  0) // (SPI) Receive Data Register Full

-#define AT91C_SPI_TDRE            (0x1 <<  1) // (SPI) Transmit Data Register Empty

-#define AT91C_SPI_MODF            (0x1 <<  2) // (SPI) Mode Fault Error

-#define AT91C_SPI_OVRES           (0x1 <<  3) // (SPI) Overrun Error Status

-#define AT91C_SPI_ENDRX           (0x1 <<  4) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_ENDTX           (0x1 <<  5) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_RXBUFF          (0x1 <<  6) // (SPI) RXBUFF Interrupt

-#define AT91C_SPI_TXBUFE          (0x1 <<  7) // (SPI) TXBUFE Interrupt

-#define AT91C_SPI_NSSR            (0x1 <<  8) // (SPI) NSSR Interrupt

-#define AT91C_SPI_TXEMPTY         (0x1 <<  9) // (SPI) TXEMPTY Interrupt

-#define AT91C_SPI_SPIENS          (0x1 << 16) // (SPI) Enable Status

-// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- 

-// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- 

-// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- 

-// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- 

-#define AT91C_SPI_CPOL            (0x1 <<  0) // (SPI) Clock Polarity

-#define AT91C_SPI_NCPHA           (0x1 <<  1) // (SPI) Clock Phase

-#define AT91C_SPI_CSAAT           (0x1 <<  3) // (SPI) Chip Select Active After Transfer

-#define AT91C_SPI_BITS            (0xF <<  4) // (SPI) Bits Per Transfer

-#define 	AT91C_SPI_BITS_8                    (0x0 <<  4) // (SPI) 8 Bits Per transfer

-#define 	AT91C_SPI_BITS_9                    (0x1 <<  4) // (SPI) 9 Bits Per transfer

-#define 	AT91C_SPI_BITS_10                   (0x2 <<  4) // (SPI) 10 Bits Per transfer

-#define 	AT91C_SPI_BITS_11                   (0x3 <<  4) // (SPI) 11 Bits Per transfer

-#define 	AT91C_SPI_BITS_12                   (0x4 <<  4) // (SPI) 12 Bits Per transfer

-#define 	AT91C_SPI_BITS_13                   (0x5 <<  4) // (SPI) 13 Bits Per transfer

-#define 	AT91C_SPI_BITS_14                   (0x6 <<  4) // (SPI) 14 Bits Per transfer

-#define 	AT91C_SPI_BITS_15                   (0x7 <<  4) // (SPI) 15 Bits Per transfer

-#define 	AT91C_SPI_BITS_16                   (0x8 <<  4) // (SPI) 16 Bits Per transfer

-#define AT91C_SPI_SCBR            (0xFF <<  8) // (SPI) Serial Clock Baud Rate

-#define AT91C_SPI_DLYBS           (0xFF << 16) // (SPI) Delay Before SPCK

-#define AT91C_SPI_DLYBCT          (0xFF << 24) // (SPI) Delay Between Consecutive Transfers

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Usart

-// *****************************************************************************

-// *** Register offset in AT91S_USART structure ***

-#define US_CR           ( 0) // Control Register

-#define US_MR           ( 4) // Mode Register

-#define US_IER          ( 8) // Interrupt Enable Register

-#define US_IDR          (12) // Interrupt Disable Register

-#define US_IMR          (16) // Interrupt Mask Register

-#define US_CSR          (20) // Channel Status Register

-#define US_RHR          (24) // Receiver Holding Register

-#define US_THR          (28) // Transmitter Holding Register

-#define US_BRGR         (32) // Baud Rate Generator Register

-#define US_RTOR         (36) // Receiver Time-out Register

-#define US_TTGR         (40) // Transmitter Time-guard Register

-#define US_FIDI         (64) // FI_DI_Ratio Register

-#define US_NER          (68) // Nb Errors Register

-#define US_IF           (76) // IRDA_FILTER Register

-#define US_RPR          (256) // Receive Pointer Register

-#define US_RCR          (260) // Receive Counter Register

-#define US_TPR          (264) // Transmit Pointer Register

-#define US_TCR          (268) // Transmit Counter Register

-#define US_RNPR         (272) // Receive Next Pointer Register

-#define US_RNCR         (276) // Receive Next Counter Register

-#define US_TNPR         (280) // Transmit Next Pointer Register

-#define US_TNCR         (284) // Transmit Next Counter Register

-#define US_PTCR         (288) // PDC Transfer Control Register

-#define US_PTSR         (292) // PDC Transfer Status Register

-// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_STTBRK           (0x1 <<  9) // (USART) Start Break

-#define AT91C_US_STPBRK           (0x1 << 10) // (USART) Stop Break

-#define AT91C_US_STTTO            (0x1 << 11) // (USART) Start Time-out

-#define AT91C_US_SENDA            (0x1 << 12) // (USART) Send Address

-#define AT91C_US_RSTIT            (0x1 << 13) // (USART) Reset Iterations

-#define AT91C_US_RSTNACK          (0x1 << 14) // (USART) Reset Non Acknowledge

-#define AT91C_US_RETTO            (0x1 << 15) // (USART) Rearm Time-out

-#define AT91C_US_DTREN            (0x1 << 16) // (USART) Data Terminal ready Enable

-#define AT91C_US_DTRDIS           (0x1 << 17) // (USART) Data Terminal ready Disable

-#define AT91C_US_RTSEN            (0x1 << 18) // (USART) Request to Send enable

-#define AT91C_US_RTSDIS           (0x1 << 19) // (USART) Request to Send Disable

-// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_USMODE           (0xF <<  0) // (USART) Usart mode

-#define 	AT91C_US_USMODE_NORMAL               (0x0) // (USART) Normal

-#define 	AT91C_US_USMODE_RS485                (0x1) // (USART) RS485

-#define 	AT91C_US_USMODE_HWHSH                (0x2) // (USART) Hardware Handshaking

-#define 	AT91C_US_USMODE_MODEM                (0x3) // (USART) Modem

-#define 	AT91C_US_USMODE_ISO7816_0            (0x4) // (USART) ISO7816 protocol: T = 0

-#define 	AT91C_US_USMODE_ISO7816_1            (0x6) // (USART) ISO7816 protocol: T = 1

-#define 	AT91C_US_USMODE_IRDA                 (0x8) // (USART) IrDA

-#define 	AT91C_US_USMODE_SWHSH                (0xC) // (USART) Software Handshaking

-#define AT91C_US_CLKS             (0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CLKS_CLOCK                (0x0 <<  4) // (USART) Clock

-#define 	AT91C_US_CLKS_FDIV1                (0x1 <<  4) // (USART) fdiv1

-#define 	AT91C_US_CLKS_SLOW                 (0x2 <<  4) // (USART) slow_clock (ARM)

-#define 	AT91C_US_CLKS_EXT                  (0x3 <<  4) // (USART) External (SCK)

-#define AT91C_US_CHRL             (0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CHRL_5_BITS               (0x0 <<  6) // (USART) Character Length: 5 bits

-#define 	AT91C_US_CHRL_6_BITS               (0x1 <<  6) // (USART) Character Length: 6 bits

-#define 	AT91C_US_CHRL_7_BITS               (0x2 <<  6) // (USART) Character Length: 7 bits

-#define 	AT91C_US_CHRL_8_BITS               (0x3 <<  6) // (USART) Character Length: 8 bits

-#define AT91C_US_SYNC             (0x1 <<  8) // (USART) Synchronous Mode Select

-#define AT91C_US_NBSTOP           (0x3 << 12) // (USART) Number of Stop bits

-#define 	AT91C_US_NBSTOP_1_BIT                (0x0 << 12) // (USART) 1 stop bit

-#define 	AT91C_US_NBSTOP_15_BIT               (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits

-#define 	AT91C_US_NBSTOP_2_BIT                (0x2 << 12) // (USART) 2 stop bits

-#define AT91C_US_MSBF             (0x1 << 16) // (USART) Bit Order

-#define AT91C_US_MODE9            (0x1 << 17) // (USART) 9-bit Character length

-#define AT91C_US_CKLO             (0x1 << 18) // (USART) Clock Output Select

-#define AT91C_US_OVER             (0x1 << 19) // (USART) Over Sampling Mode

-#define AT91C_US_INACK            (0x1 << 20) // (USART) Inhibit Non Acknowledge

-#define AT91C_US_DSNACK           (0x1 << 21) // (USART) Disable Successive NACK

-#define AT91C_US_MAX_ITER         (0x1 << 24) // (USART) Number of Repetitions

-#define AT91C_US_FILTER           (0x1 << 28) // (USART) Receive Line Filter

-// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXBRK            (0x1 <<  2) // (USART) Break Received/End of Break

-#define AT91C_US_TIMEOUT          (0x1 <<  8) // (USART) Receiver Time-out

-#define AT91C_US_ITERATION        (0x1 << 10) // (USART) Max number of Repetitions Reached

-#define AT91C_US_NACK             (0x1 << 13) // (USART) Non Acknowledge

-#define AT91C_US_RIIC             (0x1 << 16) // (USART) Ring INdicator Input Change Flag

-#define AT91C_US_DSRIC            (0x1 << 17) // (USART) Data Set Ready Input Change Flag

-#define AT91C_US_DCDIC            (0x1 << 18) // (USART) Data Carrier Flag

-#define AT91C_US_CTSIC            (0x1 << 19) // (USART) Clear To Send Input Change Flag

-// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- 

-#define AT91C_US_RI               (0x1 << 20) // (USART) Image of RI Input

-#define AT91C_US_DSR              (0x1 << 21) // (USART) Image of DSR Input

-#define AT91C_US_DCD              (0x1 << 22) // (USART) Image of DCD Input

-#define AT91C_US_CTS              (0x1 << 23) // (USART) Image of CTS Input

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_SSC structure ***

-#define SSC_CR          ( 0) // Control Register

-#define SSC_CMR         ( 4) // Clock Mode Register

-#define SSC_RCMR        (16) // Receive Clock ModeRegister

-#define SSC_RFMR        (20) // Receive Frame Mode Register

-#define SSC_TCMR        (24) // Transmit Clock Mode Register

-#define SSC_TFMR        (28) // Transmit Frame Mode Register

-#define SSC_RHR         (32) // Receive Holding Register

-#define SSC_THR         (36) // Transmit Holding Register

-#define SSC_RSHR        (48) // Receive Sync Holding Register

-#define SSC_TSHR        (52) // Transmit Sync Holding Register

-#define SSC_SR          (64) // Status Register

-#define SSC_IER         (68) // Interrupt Enable Register

-#define SSC_IDR         (72) // Interrupt Disable Register

-#define SSC_IMR         (76) // Interrupt Mask Register

-#define SSC_RPR         (256) // Receive Pointer Register

-#define SSC_RCR         (260) // Receive Counter Register

-#define SSC_TPR         (264) // Transmit Pointer Register

-#define SSC_TCR         (268) // Transmit Counter Register

-#define SSC_RNPR        (272) // Receive Next Pointer Register

-#define SSC_RNCR        (276) // Receive Next Counter Register

-#define SSC_TNPR        (280) // Transmit Next Pointer Register

-#define SSC_TNCR        (284) // Transmit Next Counter Register

-#define SSC_PTCR        (288) // PDC Transfer Control Register

-#define SSC_PTSR        (292) // PDC Transfer Status Register

-// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- 

-#define AT91C_SSC_RXEN            (0x1 <<  0) // (SSC) Receive Enable

-#define AT91C_SSC_RXDIS           (0x1 <<  1) // (SSC) Receive Disable

-#define AT91C_SSC_TXEN            (0x1 <<  8) // (SSC) Transmit Enable

-#define AT91C_SSC_TXDIS           (0x1 <<  9) // (SSC) Transmit Disable

-#define AT91C_SSC_SWRST           (0x1 << 15) // (SSC) Software Reset

-// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- 

-#define AT91C_SSC_CKS             (0x3 <<  0) // (SSC) Receive/Transmit Clock Selection

-#define 	AT91C_SSC_CKS_DIV                  (0x0) // (SSC) Divided Clock

-#define 	AT91C_SSC_CKS_TK                   (0x1) // (SSC) TK Clock signal

-#define 	AT91C_SSC_CKS_RK                   (0x2) // (SSC) RK pin

-#define AT91C_SSC_CKO             (0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection

-#define 	AT91C_SSC_CKO_NONE                 (0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only

-#define 	AT91C_SSC_CKO_CONTINOUS            (0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output

-#define 	AT91C_SSC_CKO_DATA_TX              (0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output

-#define AT91C_SSC_CKI             (0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion

-#define AT91C_SSC_START           (0xF <<  8) // (SSC) Receive/Transmit Start Selection

-#define 	AT91C_SSC_START_CONTINOUS            (0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.

-#define 	AT91C_SSC_START_TX                   (0x1 <<  8) // (SSC) Transmit/Receive start

-#define 	AT91C_SSC_START_LOW_RF               (0x2 <<  8) // (SSC) Detection of a low level on RF input

-#define 	AT91C_SSC_START_HIGH_RF              (0x3 <<  8) // (SSC) Detection of a high level on RF input

-#define 	AT91C_SSC_START_FALL_RF              (0x4 <<  8) // (SSC) Detection of a falling edge on RF input

-#define 	AT91C_SSC_START_RISE_RF              (0x5 <<  8) // (SSC) Detection of a rising edge on RF input

-#define 	AT91C_SSC_START_LEVEL_RF             (0x6 <<  8) // (SSC) Detection of any level change on RF input

-#define 	AT91C_SSC_START_EDGE_RF              (0x7 <<  8) // (SSC) Detection of any edge on RF input

-#define 	AT91C_SSC_START_0                    (0x8 <<  8) // (SSC) Compare 0

-#define AT91C_SSC_STTDLY          (0xFF << 16) // (SSC) Receive/Transmit Start Delay

-#define AT91C_SSC_PERIOD          (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection

-// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- 

-#define AT91C_SSC_DATLEN          (0x1F <<  0) // (SSC) Data Length

-#define AT91C_SSC_LOOP            (0x1 <<  5) // (SSC) Loop Mode

-#define AT91C_SSC_MSBF            (0x1 <<  7) // (SSC) Most Significant Bit First

-#define AT91C_SSC_DATNB           (0xF <<  8) // (SSC) Data Number per Frame

-#define AT91C_SSC_FSLEN           (0xF << 16) // (SSC) Receive/Transmit Frame Sync length

-#define AT91C_SSC_FSOS            (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection

-#define 	AT91C_SSC_FSOS_NONE                 (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only

-#define 	AT91C_SSC_FSOS_NEGATIVE             (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse

-#define 	AT91C_SSC_FSOS_POSITIVE             (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse

-#define 	AT91C_SSC_FSOS_LOW                  (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer

-#define 	AT91C_SSC_FSOS_HIGH                 (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer

-#define 	AT91C_SSC_FSOS_TOGGLE               (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer

-#define AT91C_SSC_FSEDGE          (0x1 << 24) // (SSC) Frame Sync Edge Detection

-// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- 

-// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- 

-#define AT91C_SSC_DATDEF          (0x1 <<  5) // (SSC) Data Default Value

-#define AT91C_SSC_FSDEN           (0x1 << 23) // (SSC) Frame Sync Data Enable

-// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- 

-#define AT91C_SSC_TXRDY           (0x1 <<  0) // (SSC) Transmit Ready

-#define AT91C_SSC_TXEMPTY         (0x1 <<  1) // (SSC) Transmit Empty

-#define AT91C_SSC_ENDTX           (0x1 <<  2) // (SSC) End Of Transmission

-#define AT91C_SSC_TXBUFE          (0x1 <<  3) // (SSC) Transmit Buffer Empty

-#define AT91C_SSC_RXRDY           (0x1 <<  4) // (SSC) Receive Ready

-#define AT91C_SSC_OVRUN           (0x1 <<  5) // (SSC) Receive Overrun

-#define AT91C_SSC_ENDRX           (0x1 <<  6) // (SSC) End of Reception

-#define AT91C_SSC_RXBUFF          (0x1 <<  7) // (SSC) Receive Buffer Full

-#define AT91C_SSC_TXSYN           (0x1 << 10) // (SSC) Transmit Sync

-#define AT91C_SSC_RXSYN           (0x1 << 11) // (SSC) Receive Sync

-#define AT91C_SSC_TXENA           (0x1 << 16) // (SSC) Transmit Enable

-#define AT91C_SSC_RXENA           (0x1 << 17) // (SSC) Receive Enable

-// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- 

-// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- 

-// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Two-wire Interface

-// *****************************************************************************

-// *** Register offset in AT91S_TWI structure ***

-#define TWI_CR          ( 0) // Control Register

-#define TWI_MMR         ( 4) // Master Mode Register

-#define TWI_IADR        (12) // Internal Address Register

-#define TWI_CWGR        (16) // Clock Waveform Generator Register

-#define TWI_SR          (32) // Status Register

-#define TWI_IER         (36) // Interrupt Enable Register

-#define TWI_IDR         (40) // Interrupt Disable Register

-#define TWI_IMR         (44) // Interrupt Mask Register

-#define TWI_RHR         (48) // Receive Holding Register

-#define TWI_THR         (52) // Transmit Holding Register

-// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- 

-#define AT91C_TWI_START           (0x1 <<  0) // (TWI) Send a START Condition

-#define AT91C_TWI_STOP            (0x1 <<  1) // (TWI) Send a STOP Condition

-#define AT91C_TWI_MSEN            (0x1 <<  2) // (TWI) TWI Master Transfer Enabled

-#define AT91C_TWI_MSDIS           (0x1 <<  3) // (TWI) TWI Master Transfer Disabled

-#define AT91C_TWI_SWRST           (0x1 <<  7) // (TWI) Software Reset

-// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- 

-#define AT91C_TWI_IADRSZ          (0x3 <<  8) // (TWI) Internal Device Address Size

-#define 	AT91C_TWI_IADRSZ_NO                   (0x0 <<  8) // (TWI) No internal device address

-#define 	AT91C_TWI_IADRSZ_1_BYTE               (0x1 <<  8) // (TWI) One-byte internal device address

-#define 	AT91C_TWI_IADRSZ_2_BYTE               (0x2 <<  8) // (TWI) Two-byte internal device address

-#define 	AT91C_TWI_IADRSZ_3_BYTE               (0x3 <<  8) // (TWI) Three-byte internal device address

-#define AT91C_TWI_MREAD           (0x1 << 12) // (TWI) Master Read Direction

-#define AT91C_TWI_DADR            (0x7F << 16) // (TWI) Device Address

-// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- 

-#define AT91C_TWI_CLDIV           (0xFF <<  0) // (TWI) Clock Low Divider

-#define AT91C_TWI_CHDIV           (0xFF <<  8) // (TWI) Clock High Divider

-#define AT91C_TWI_CKDIV           (0x7 << 16) // (TWI) Clock Divider

-// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- 

-#define AT91C_TWI_TXCOMP          (0x1 <<  0) // (TWI) Transmission Completed

-#define AT91C_TWI_RXRDY           (0x1 <<  1) // (TWI) Receive holding register ReaDY

-#define AT91C_TWI_TXRDY           (0x1 <<  2) // (TWI) Transmit holding register ReaDY

-#define AT91C_TWI_OVRE            (0x1 <<  6) // (TWI) Overrun Error

-#define AT91C_TWI_UNRE            (0x1 <<  7) // (TWI) Underrun Error

-#define AT91C_TWI_NACK            (0x1 <<  8) // (TWI) Not Acknowledged

-// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- 

-// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- 

-// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface

-// *****************************************************************************

-// *** Register offset in AT91S_PWMC_CH structure ***

-#define PWMC_CMR        ( 0) // Channel Mode Register

-#define PWMC_CDTYR      ( 4) // Channel Duty Cycle Register

-#define PWMC_CPRDR      ( 8) // Channel Period Register

-#define PWMC_CCNTR      (12) // Channel Counter Register

-#define PWMC_CUPDR      (16) // Channel Update Register

-#define PWMC_Reserved   (20) // Reserved

-// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- 

-#define AT91C_PWMC_CPRE           (0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx

-#define 	AT91C_PWMC_CPRE_MCK                  (0x0) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKA                 (0xB) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKB                 (0xC) // (PWMC_CH) 

-#define AT91C_PWMC_CALG           (0x1 <<  8) // (PWMC_CH) Channel Alignment

-#define AT91C_PWMC_CPOL           (0x1 <<  9) // (PWMC_CH) Channel Polarity

-#define AT91C_PWMC_CPD            (0x1 << 10) // (PWMC_CH) Channel Update Period

-// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- 

-#define AT91C_PWMC_CDTY           (0x0 <<  0) // (PWMC_CH) Channel Duty Cycle

-// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- 

-#define AT91C_PWMC_CPRD           (0x0 <<  0) // (PWMC_CH) Channel Period

-// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- 

-#define AT91C_PWMC_CCNT           (0x0 <<  0) // (PWMC_CH) Channel Counter

-// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- 

-#define AT91C_PWMC_CUPD           (0x0 <<  0) // (PWMC_CH) Channel Update

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_PWMC structure ***

-#define PWMC_MR         ( 0) // PWMC Mode Register

-#define PWMC_ENA        ( 4) // PWMC Enable Register

-#define PWMC_DIS        ( 8) // PWMC Disable Register

-#define PWMC_SR         (12) // PWMC Status Register

-#define PWMC_IER        (16) // PWMC Interrupt Enable Register

-#define PWMC_IDR        (20) // PWMC Interrupt Disable Register

-#define PWMC_IMR        (24) // PWMC Interrupt Mask Register

-#define PWMC_ISR        (28) // PWMC Interrupt Status Register

-#define PWMC_VR         (252) // PWMC Version Register

-#define PWMC_CH         (512) // PWMC Channel

-// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- 

-#define AT91C_PWMC_DIVA           (0xFF <<  0) // (PWMC) CLKA divide factor.

-#define AT91C_PWMC_PREA           (0xF <<  8) // (PWMC) Divider Input Clock Prescaler A

-#define 	AT91C_PWMC_PREA_MCK                  (0x0 <<  8) // (PWMC) 

-#define AT91C_PWMC_DIVB           (0xFF << 16) // (PWMC) CLKB divide factor.

-#define AT91C_PWMC_PREB           (0xF << 24) // (PWMC) Divider Input Clock Prescaler B

-#define 	AT91C_PWMC_PREB_MCK                  (0x0 << 24) // (PWMC) 

-// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- 

-#define AT91C_PWMC_CHID0          (0x1 <<  0) // (PWMC) Channel ID 0

-#define AT91C_PWMC_CHID1          (0x1 <<  1) // (PWMC) Channel ID 1

-#define AT91C_PWMC_CHID2          (0x1 <<  2) // (PWMC) Channel ID 2

-#define AT91C_PWMC_CHID3          (0x1 <<  3) // (PWMC) Channel ID 3

-// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- 

-// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- 

-// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- 

-// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- 

-// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- 

-// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR USB Device Interface

-// *****************************************************************************

-// *** Register offset in AT91S_UDP structure ***

-#define UDP_NUM         ( 0) // Frame Number Register

-#define UDP_GLBSTATE    ( 4) // Global State Register

-#define UDP_FADDR       ( 8) // Function Address Register

-#define UDP_IER         (16) // Interrupt Enable Register

-#define UDP_IDR         (20) // Interrupt Disable Register

-#define UDP_IMR         (24) // Interrupt Mask Register

-#define UDP_ISR         (28) // Interrupt Status Register

-#define UDP_ICR         (32) // Interrupt Clear Register

-#define UDP_RSTEP       (40) // Reset Endpoint Register

-#define UDP_CSR         (48) // Endpoint Control and Status Register

-#define UDP_FDR         (80) // Endpoint FIFO Data Register

-#define UDP_TXVC        (116) // Transceiver Control Register

-// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- 

-#define AT91C_UDP_FRM_NUM         (0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats

-#define AT91C_UDP_FRM_ERR         (0x1 << 16) // (UDP) Frame Error

-#define AT91C_UDP_FRM_OK          (0x1 << 17) // (UDP) Frame OK

-// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- 

-#define AT91C_UDP_FADDEN          (0x1 <<  0) // (UDP) Function Address Enable

-#define AT91C_UDP_CONFG           (0x1 <<  1) // (UDP) Configured

-#define AT91C_UDP_ESR             (0x1 <<  2) // (UDP) Enable Send Resume

-#define AT91C_UDP_RSMINPR         (0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host

-#define AT91C_UDP_RMWUPE          (0x1 <<  4) // (UDP) Remote Wake Up Enable

-// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- 

-#define AT91C_UDP_FADD            (0xFF <<  0) // (UDP) Function Address Value

-#define AT91C_UDP_FEN             (0x1 <<  8) // (UDP) Function Enable

-// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- 

-#define AT91C_UDP_EPINT0          (0x1 <<  0) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT1          (0x1 <<  1) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT2          (0x1 <<  2) // (UDP) Endpoint 2 Interrupt

-#define AT91C_UDP_EPINT3          (0x1 <<  3) // (UDP) Endpoint 3 Interrupt

-#define AT91C_UDP_EPINT4          (0x1 <<  4) // (UDP) Endpoint 4 Interrupt

-#define AT91C_UDP_EPINT5          (0x1 <<  5) // (UDP) Endpoint 5 Interrupt

-#define AT91C_UDP_RXSUSP          (0x1 <<  8) // (UDP) USB Suspend Interrupt

-#define AT91C_UDP_RXRSM           (0x1 <<  9) // (UDP) USB Resume Interrupt

-#define AT91C_UDP_EXTRSM          (0x1 << 10) // (UDP) USB External Resume Interrupt

-#define AT91C_UDP_SOFINT          (0x1 << 11) // (UDP) USB Start Of frame Interrupt

-#define AT91C_UDP_WAKEUP          (0x1 << 13) // (UDP) USB Resume Interrupt

-// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- 

-// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- 

-// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- 

-#define AT91C_UDP_ENDBUSRES       (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt

-// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- 

-// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- 

-#define AT91C_UDP_EP0             (0x1 <<  0) // (UDP) Reset Endpoint 0

-#define AT91C_UDP_EP1             (0x1 <<  1) // (UDP) Reset Endpoint 1

-#define AT91C_UDP_EP2             (0x1 <<  2) // (UDP) Reset Endpoint 2

-#define AT91C_UDP_EP3             (0x1 <<  3) // (UDP) Reset Endpoint 3

-#define AT91C_UDP_EP4             (0x1 <<  4) // (UDP) Reset Endpoint 4

-#define AT91C_UDP_EP5             (0x1 <<  5) // (UDP) Reset Endpoint 5

-// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- 

-#define AT91C_UDP_TXCOMP          (0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR

-#define AT91C_UDP_RX_DATA_BK0     (0x1 <<  1) // (UDP) Receive Data Bank 0

-#define AT91C_UDP_RXSETUP         (0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)

-#define AT91C_UDP_ISOERROR        (0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)

-#define AT91C_UDP_TXPKTRDY        (0x1 <<  4) // (UDP) Transmit Packet Ready

-#define AT91C_UDP_FORCESTALL      (0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).

-#define AT91C_UDP_RX_DATA_BK1     (0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).

-#define AT91C_UDP_DIR             (0x1 <<  7) // (UDP) Transfer Direction

-#define AT91C_UDP_EPTYPE          (0x7 <<  8) // (UDP) Endpoint type

-#define 	AT91C_UDP_EPTYPE_CTRL                 (0x0 <<  8) // (UDP) Control

-#define 	AT91C_UDP_EPTYPE_ISO_OUT              (0x1 <<  8) // (UDP) Isochronous OUT

-#define 	AT91C_UDP_EPTYPE_BULK_OUT             (0x2 <<  8) // (UDP) Bulk OUT

-#define 	AT91C_UDP_EPTYPE_INT_OUT              (0x3 <<  8) // (UDP) Interrupt OUT

-#define 	AT91C_UDP_EPTYPE_ISO_IN               (0x5 <<  8) // (UDP) Isochronous IN

-#define 	AT91C_UDP_EPTYPE_BULK_IN              (0x6 <<  8) // (UDP) Bulk IN

-#define 	AT91C_UDP_EPTYPE_INT_IN               (0x7 <<  8) // (UDP) Interrupt IN

-#define AT91C_UDP_DTGLE           (0x1 << 11) // (UDP) Data Toggle

-#define AT91C_UDP_EPEDS           (0x1 << 15) // (UDP) Endpoint Enable Disable

-#define AT91C_UDP_RXBYTECNT       (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO

-// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- 

-#define AT91C_UDP_TXVDIS          (0x1 <<  8) // (UDP) 

-#define AT91C_UDP_PUON            (0x1 <<  9) // (UDP) Pull-up ON

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface

-// *****************************************************************************

-// *** Register offset in AT91S_TC structure ***

-#define TC_CCR          ( 0) // Channel Control Register

-#define TC_CMR          ( 4) // Channel Mode Register (Capture Mode / Waveform Mode)

-#define TC_CV           (16) // Counter Value

-#define TC_RA           (20) // Register A

-#define TC_RB           (24) // Register B

-#define TC_RC           (28) // Register C

-#define TC_SR           (32) // Status Register

-#define TC_IER          (36) // Interrupt Enable Register

-#define TC_IDR          (40) // Interrupt Disable Register

-#define TC_IMR          (44) // Interrupt Mask Register

-// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- 

-#define AT91C_TC_CLKEN            (0x1 <<  0) // (TC) Counter Clock Enable Command

-#define AT91C_TC_CLKDIS           (0x1 <<  1) // (TC) Counter Clock Disable Command

-#define AT91C_TC_SWTRG            (0x1 <<  2) // (TC) Software Trigger Command

-// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- 

-#define AT91C_TC_CLKS             (0x7 <<  0) // (TC) Clock Selection

-#define 	AT91C_TC_CLKS_TIMER_DIV1_CLOCK     (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV2_CLOCK     (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV3_CLOCK     (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV4_CLOCK     (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV5_CLOCK     (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK

-#define 	AT91C_TC_CLKS_XC0                  (0x5) // (TC) Clock selected: XC0

-#define 	AT91C_TC_CLKS_XC1                  (0x6) // (TC) Clock selected: XC1

-#define 	AT91C_TC_CLKS_XC2                  (0x7) // (TC) Clock selected: XC2

-#define AT91C_TC_CLKI             (0x1 <<  3) // (TC) Clock Invert

-#define AT91C_TC_BURST            (0x3 <<  4) // (TC) Burst Signal Selection

-#define 	AT91C_TC_BURST_NONE                 (0x0 <<  4) // (TC) The clock is not gated by an external signal

-#define 	AT91C_TC_BURST_XC0                  (0x1 <<  4) // (TC) XC0 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC1                  (0x2 <<  4) // (TC) XC1 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC2                  (0x3 <<  4) // (TC) XC2 is ANDed with the selected clock

-#define AT91C_TC_CPCSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare

-#define AT91C_TC_LDBSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading

-#define AT91C_TC_CPCDIS           (0x1 <<  7) // (TC) Counter Clock Disable with RC Compare

-#define AT91C_TC_LDBDIS           (0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading

-#define AT91C_TC_ETRGEDG          (0x3 <<  8) // (TC) External Trigger Edge Selection

-#define 	AT91C_TC_ETRGEDG_NONE                 (0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_ETRGEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_ETRGEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_ETRGEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_EEVTEDG          (0x3 <<  8) // (TC) External Event Edge Selection

-#define 	AT91C_TC_EEVTEDG_NONE                 (0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_EEVTEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_EEVTEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_EEVTEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_EEVT             (0x3 << 10) // (TC) External Event  Selection

-#define 	AT91C_TC_EEVT_TIOB                 (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input

-#define 	AT91C_TC_EEVT_XC0                  (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output

-#define 	AT91C_TC_EEVT_XC1                  (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output

-#define 	AT91C_TC_EEVT_XC2                  (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output

-#define AT91C_TC_ABETRG           (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection

-#define AT91C_TC_ENETRG           (0x1 << 12) // (TC) External Event Trigger enable

-#define AT91C_TC_WAVESEL          (0x3 << 13) // (TC) Waveform  Selection

-#define 	AT91C_TC_WAVESEL_UP                   (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN               (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UP_AUTO              (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN_AUTO          (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare

-#define AT91C_TC_CPCTRG           (0x1 << 14) // (TC) RC Compare Trigger Enable

-#define AT91C_TC_WAVE             (0x1 << 15) // (TC) 

-#define AT91C_TC_ACPA             (0x3 << 16) // (TC) RA Compare Effect on TIOA

-#define 	AT91C_TC_ACPA_NONE                 (0x0 << 16) // (TC) Effect: none

-#define 	AT91C_TC_ACPA_SET                  (0x1 << 16) // (TC) Effect: set

-#define 	AT91C_TC_ACPA_CLEAR                (0x2 << 16) // (TC) Effect: clear

-#define 	AT91C_TC_ACPA_TOGGLE               (0x3 << 16) // (TC) Effect: toggle

-#define AT91C_TC_LDRA             (0x3 << 16) // (TC) RA Loading Selection

-#define 	AT91C_TC_LDRA_NONE                 (0x0 << 16) // (TC) Edge: None

-#define 	AT91C_TC_LDRA_RISING               (0x1 << 16) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRA_FALLING              (0x2 << 16) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRA_BOTH                 (0x3 << 16) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_ACPC             (0x3 << 18) // (TC) RC Compare Effect on TIOA

-#define 	AT91C_TC_ACPC_NONE                 (0x0 << 18) // (TC) Effect: none

-#define 	AT91C_TC_ACPC_SET                  (0x1 << 18) // (TC) Effect: set

-#define 	AT91C_TC_ACPC_CLEAR                (0x2 << 18) // (TC) Effect: clear

-#define 	AT91C_TC_ACPC_TOGGLE               (0x3 << 18) // (TC) Effect: toggle

-#define AT91C_TC_LDRB             (0x3 << 18) // (TC) RB Loading Selection

-#define 	AT91C_TC_LDRB_NONE                 (0x0 << 18) // (TC) Edge: None

-#define 	AT91C_TC_LDRB_RISING               (0x1 << 18) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRB_FALLING              (0x2 << 18) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRB_BOTH                 (0x3 << 18) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_AEEVT            (0x3 << 20) // (TC) External Event Effect on TIOA

-#define 	AT91C_TC_AEEVT_NONE                 (0x0 << 20) // (TC) Effect: none

-#define 	AT91C_TC_AEEVT_SET                  (0x1 << 20) // (TC) Effect: set

-#define 	AT91C_TC_AEEVT_CLEAR                (0x2 << 20) // (TC) Effect: clear

-#define 	AT91C_TC_AEEVT_TOGGLE               (0x3 << 20) // (TC) Effect: toggle

-#define AT91C_TC_ASWTRG           (0x3 << 22) // (TC) Software Trigger Effect on TIOA

-#define 	AT91C_TC_ASWTRG_NONE                 (0x0 << 22) // (TC) Effect: none

-#define 	AT91C_TC_ASWTRG_SET                  (0x1 << 22) // (TC) Effect: set

-#define 	AT91C_TC_ASWTRG_CLEAR                (0x2 << 22) // (TC) Effect: clear

-#define 	AT91C_TC_ASWTRG_TOGGLE               (0x3 << 22) // (TC) Effect: toggle

-#define AT91C_TC_BCPB             (0x3 << 24) // (TC) RB Compare Effect on TIOB

-#define 	AT91C_TC_BCPB_NONE                 (0x0 << 24) // (TC) Effect: none

-#define 	AT91C_TC_BCPB_SET                  (0x1 << 24) // (TC) Effect: set

-#define 	AT91C_TC_BCPB_CLEAR                (0x2 << 24) // (TC) Effect: clear

-#define 	AT91C_TC_BCPB_TOGGLE               (0x3 << 24) // (TC) Effect: toggle

-#define AT91C_TC_BCPC             (0x3 << 26) // (TC) RC Compare Effect on TIOB

-#define 	AT91C_TC_BCPC_NONE                 (0x0 << 26) // (TC) Effect: none

-#define 	AT91C_TC_BCPC_SET                  (0x1 << 26) // (TC) Effect: set

-#define 	AT91C_TC_BCPC_CLEAR                (0x2 << 26) // (TC) Effect: clear

-#define 	AT91C_TC_BCPC_TOGGLE               (0x3 << 26) // (TC) Effect: toggle

-#define AT91C_TC_BEEVT            (0x3 << 28) // (TC) External Event Effect on TIOB

-#define 	AT91C_TC_BEEVT_NONE                 (0x0 << 28) // (TC) Effect: none

-#define 	AT91C_TC_BEEVT_SET                  (0x1 << 28) // (TC) Effect: set

-#define 	AT91C_TC_BEEVT_CLEAR                (0x2 << 28) // (TC) Effect: clear

-#define 	AT91C_TC_BEEVT_TOGGLE               (0x3 << 28) // (TC) Effect: toggle

-#define AT91C_TC_BSWTRG           (0x3 << 30) // (TC) Software Trigger Effect on TIOB

-#define 	AT91C_TC_BSWTRG_NONE                 (0x0 << 30) // (TC) Effect: none

-#define 	AT91C_TC_BSWTRG_SET                  (0x1 << 30) // (TC) Effect: set

-#define 	AT91C_TC_BSWTRG_CLEAR                (0x2 << 30) // (TC) Effect: clear

-#define 	AT91C_TC_BSWTRG_TOGGLE               (0x3 << 30) // (TC) Effect: toggle

-// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- 

-#define AT91C_TC_COVFS            (0x1 <<  0) // (TC) Counter Overflow

-#define AT91C_TC_LOVRS            (0x1 <<  1) // (TC) Load Overrun

-#define AT91C_TC_CPAS             (0x1 <<  2) // (TC) RA Compare

-#define AT91C_TC_CPBS             (0x1 <<  3) // (TC) RB Compare

-#define AT91C_TC_CPCS             (0x1 <<  4) // (TC) RC Compare

-#define AT91C_TC_LDRAS            (0x1 <<  5) // (TC) RA Loading

-#define AT91C_TC_LDRBS            (0x1 <<  6) // (TC) RB Loading

-#define AT91C_TC_ETRGS            (0x1 <<  7) // (TC) External Trigger

-#define AT91C_TC_CLKSTA           (0x1 << 16) // (TC) Clock Enabling

-#define AT91C_TC_MTIOA            (0x1 << 17) // (TC) TIOA Mirror

-#define AT91C_TC_MTIOB            (0x1 << 18) // (TC) TIOA Mirror

-// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- 

-// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- 

-// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Interface

-// *****************************************************************************

-// *** Register offset in AT91S_TCB structure ***

-#define TCB_TC0         ( 0) // TC Channel 0

-#define TCB_TC1         (64) // TC Channel 1

-#define TCB_TC2         (128) // TC Channel 2

-#define TCB_BCR         (192) // TC Block Control Register

-#define TCB_BMR         (196) // TC Block Mode Register

-// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- 

-#define AT91C_TCB_SYNC            (0x1 <<  0) // (TCB) Synchro Command

-// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- 

-#define AT91C_TCB_TC0XC0S         (0x3 <<  0) // (TCB) External Clock Signal 0 Selection

-#define 	AT91C_TCB_TC0XC0S_TCLK0                (0x0) // (TCB) TCLK0 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_NONE                 (0x1) // (TCB) None signal connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA1                (0x2) // (TCB) TIOA1 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA2                (0x3) // (TCB) TIOA2 connected to XC0

-#define AT91C_TCB_TC1XC1S         (0x3 <<  2) // (TCB) External Clock Signal 1 Selection

-#define 	AT91C_TCB_TC1XC1S_TCLK1                (0x0 <<  2) // (TCB) TCLK1 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_NONE                 (0x1 <<  2) // (TCB) None signal connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA0                (0x2 <<  2) // (TCB) TIOA0 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA2                (0x3 <<  2) // (TCB) TIOA2 connected to XC1

-#define AT91C_TCB_TC2XC2S         (0x3 <<  4) // (TCB) External Clock Signal 2 Selection

-#define 	AT91C_TCB_TC2XC2S_TCLK2                (0x0 <<  4) // (TCB) TCLK2 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_NONE                 (0x1 <<  4) // (TCB) None signal connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA0                (0x2 <<  4) // (TCB) TIOA0 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA1                (0x3 <<  4) // (TCB) TIOA2 connected to XC2

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Control Area Network MailBox Interface

-// *****************************************************************************

-// *** Register offset in AT91S_CAN_MB structure ***

-#define CAN_MB_MMR      ( 0) // MailBox Mode Register

-#define CAN_MB_MAM      ( 4) // MailBox Acceptance Mask Register

-#define CAN_MB_MID      ( 8) // MailBox ID Register

-#define CAN_MB_MFID     (12) // MailBox Family ID Register

-#define CAN_MB_MSR      (16) // MailBox Status Register

-#define CAN_MB_MDL      (20) // MailBox Data Low Register

-#define CAN_MB_MDH      (24) // MailBox Data High Register

-#define CAN_MB_MCR      (28) // MailBox Control Register

-// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- 

-#define AT91C_CAN_MTIMEMARK       (0xFFFF <<  0) // (CAN_MB) Mailbox Timemark

-#define AT91C_CAN_PRIOR           (0xF << 16) // (CAN_MB) Mailbox Priority

-#define AT91C_CAN_MOT             (0x7 << 24) // (CAN_MB) Mailbox Object Type

-#define 	AT91C_CAN_MOT_DIS                  (0x0 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_RX                   (0x1 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_RXOVERWRITE          (0x2 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_TX                   (0x3 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_CONSUMER             (0x4 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_PRODUCER             (0x5 << 24) // (CAN_MB) 

-// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- 

-#define AT91C_CAN_MIDvB           (0x3FFFF <<  0) // (CAN_MB) Complementary bits for identifier in extended mode

-#define AT91C_CAN_MIDvA           (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode

-#define AT91C_CAN_MIDE            (0x1 << 29) // (CAN_MB) Identifier Version

-// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- 

-// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- 

-// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- 

-#define AT91C_CAN_MTIMESTAMP      (0xFFFF <<  0) // (CAN_MB) Timer Value

-#define AT91C_CAN_MDLC            (0xF << 16) // (CAN_MB) Mailbox Data Length Code

-#define AT91C_CAN_MRTR            (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request

-#define AT91C_CAN_MABT            (0x1 << 22) // (CAN_MB) Mailbox Message Abort

-#define AT91C_CAN_MRDY            (0x1 << 23) // (CAN_MB) Mailbox Ready

-#define AT91C_CAN_MMI             (0x1 << 24) // (CAN_MB) Mailbox Message Ignored

-// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- 

-// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- 

-// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- 

-#define AT91C_CAN_MACR            (0x1 << 22) // (CAN_MB) Abort Request for Mailbox

-#define AT91C_CAN_MTCR            (0x1 << 23) // (CAN_MB) Mailbox Transfer Command

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Control Area Network Interface

-// *****************************************************************************

-// *** Register offset in AT91S_CAN structure ***

-#define CAN_MR          ( 0) // Mode Register

-#define CAN_IER         ( 4) // Interrupt Enable Register

-#define CAN_IDR         ( 8) // Interrupt Disable Register

-#define CAN_IMR         (12) // Interrupt Mask Register

-#define CAN_SR          (16) // Status Register

-#define CAN_BR          (20) // Baudrate Register

-#define CAN_TIM         (24) // Timer Register

-#define CAN_TIMESTP     (28) // Time Stamp Register

-#define CAN_ECR         (32) // Error Counter Register

-#define CAN_TCR         (36) // Transfer Command Register

-#define CAN_ACR         (40) // Abort Command Register

-#define CAN_VR          (252) // Version Register

-#define CAN_MB0         (512) // CAN Mailbox 0

-#define CAN_MB1         (544) // CAN Mailbox 1

-#define CAN_MB2         (576) // CAN Mailbox 2

-#define CAN_MB3         (608) // CAN Mailbox 3

-#define CAN_MB4         (640) // CAN Mailbox 4

-#define CAN_MB5         (672) // CAN Mailbox 5

-#define CAN_MB6         (704) // CAN Mailbox 6

-#define CAN_MB7         (736) // CAN Mailbox 7

-#define CAN_MB8         (768) // CAN Mailbox 8

-#define CAN_MB9         (800) // CAN Mailbox 9

-#define CAN_MB10        (832) // CAN Mailbox 10

-#define CAN_MB11        (864) // CAN Mailbox 11

-#define CAN_MB12        (896) // CAN Mailbox 12

-#define CAN_MB13        (928) // CAN Mailbox 13

-#define CAN_MB14        (960) // CAN Mailbox 14

-#define CAN_MB15        (992) // CAN Mailbox 15

-// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- 

-#define AT91C_CAN_CANEN           (0x1 <<  0) // (CAN) CAN Controller Enable

-#define AT91C_CAN_LPM             (0x1 <<  1) // (CAN) Disable/Enable Low Power Mode

-#define AT91C_CAN_ABM             (0x1 <<  2) // (CAN) Disable/Enable Autobaud/Listen Mode

-#define AT91C_CAN_OVL             (0x1 <<  3) // (CAN) Disable/Enable Overload Frame

-#define AT91C_CAN_TEOF            (0x1 <<  4) // (CAN) Time Stamp messages at each end of Frame

-#define AT91C_CAN_TTM             (0x1 <<  5) // (CAN) Disable/Enable Time Trigger Mode

-#define AT91C_CAN_TIMFRZ          (0x1 <<  6) // (CAN) Enable Timer Freeze

-#define AT91C_CAN_DRPT            (0x1 <<  7) // (CAN) Disable Repeat

-// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- 

-#define AT91C_CAN_MB0             (0x1 <<  0) // (CAN) Mailbox 0 Flag

-#define AT91C_CAN_MB1             (0x1 <<  1) // (CAN) Mailbox 1 Flag

-#define AT91C_CAN_MB2             (0x1 <<  2) // (CAN) Mailbox 2 Flag

-#define AT91C_CAN_MB3             (0x1 <<  3) // (CAN) Mailbox 3 Flag

-#define AT91C_CAN_MB4             (0x1 <<  4) // (CAN) Mailbox 4 Flag

-#define AT91C_CAN_MB5             (0x1 <<  5) // (CAN) Mailbox 5 Flag

-#define AT91C_CAN_MB6             (0x1 <<  6) // (CAN) Mailbox 6 Flag

-#define AT91C_CAN_MB7             (0x1 <<  7) // (CAN) Mailbox 7 Flag

-#define AT91C_CAN_MB8             (0x1 <<  8) // (CAN) Mailbox 8 Flag

-#define AT91C_CAN_MB9             (0x1 <<  9) // (CAN) Mailbox 9 Flag

-#define AT91C_CAN_MB10            (0x1 << 10) // (CAN) Mailbox 10 Flag

-#define AT91C_CAN_MB11            (0x1 << 11) // (CAN) Mailbox 11 Flag

-#define AT91C_CAN_MB12            (0x1 << 12) // (CAN) Mailbox 12 Flag

-#define AT91C_CAN_MB13            (0x1 << 13) // (CAN) Mailbox 13 Flag

-#define AT91C_CAN_MB14            (0x1 << 14) // (CAN) Mailbox 14 Flag

-#define AT91C_CAN_MB15            (0x1 << 15) // (CAN) Mailbox 15 Flag

-#define AT91C_CAN_ERRA            (0x1 << 16) // (CAN) Error Active Mode Flag

-#define AT91C_CAN_WARN            (0x1 << 17) // (CAN) Warning Limit Flag

-#define AT91C_CAN_ERRP            (0x1 << 18) // (CAN) Error Passive Mode Flag

-#define AT91C_CAN_BOFF            (0x1 << 19) // (CAN) Bus Off Mode Flag

-#define AT91C_CAN_SLEEP           (0x1 << 20) // (CAN) Sleep Flag

-#define AT91C_CAN_WAKEUP          (0x1 << 21) // (CAN) Wakeup Flag

-#define AT91C_CAN_TOVF            (0x1 << 22) // (CAN) Timer Overflow Flag

-#define AT91C_CAN_TSTP            (0x1 << 23) // (CAN) Timestamp Flag

-#define AT91C_CAN_CERR            (0x1 << 24) // (CAN) CRC Error

-#define AT91C_CAN_SERR            (0x1 << 25) // (CAN) Stuffing Error

-#define AT91C_CAN_AERR            (0x1 << 26) // (CAN) Acknowledgment Error

-#define AT91C_CAN_FERR            (0x1 << 27) // (CAN) Form Error

-#define AT91C_CAN_BERR            (0x1 << 28) // (CAN) Bit Error

-// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- 

-// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- 

-// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- 

-#define AT91C_CAN_RBSY            (0x1 << 29) // (CAN) Receiver Busy

-#define AT91C_CAN_TBSY            (0x1 << 30) // (CAN) Transmitter Busy

-#define AT91C_CAN_OVLY            (0x1 << 31) // (CAN) Overload Busy

-// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- 

-#define AT91C_CAN_PHASE2          (0x7 <<  0) // (CAN) Phase 2 segment

-#define AT91C_CAN_PHASE1          (0x7 <<  4) // (CAN) Phase 1 segment

-#define AT91C_CAN_PROPAG          (0x7 <<  8) // (CAN) Programmation time segment

-#define AT91C_CAN_SYNC            (0x3 << 12) // (CAN) Re-synchronization jump width segment

-#define AT91C_CAN_BRP             (0x7F << 16) // (CAN) Baudrate Prescaler

-#define AT91C_CAN_SMP             (0x1 << 24) // (CAN) Sampling mode

-// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- 

-#define AT91C_CAN_TIMER           (0xFFFF <<  0) // (CAN) Timer field

-// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- 

-// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- 

-#define AT91C_CAN_REC             (0xFF <<  0) // (CAN) Receive Error Counter

-#define AT91C_CAN_TEC             (0xFF << 16) // (CAN) Transmit Error Counter

-// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- 

-#define AT91C_CAN_TIMRST          (0x1 << 31) // (CAN) Timer Reset Field

-// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Ethernet MAC 10/100

-// *****************************************************************************

-// *** Register offset in AT91S_EMAC structure ***

-#define EMAC_NCR        ( 0) // Network Control Register

-#define EMAC_NCFGR      ( 4) // Network Configuration Register

-#define EMAC_NSR        ( 8) // Network Status Register

-#define EMAC_TSR        (20) // Transmit Status Register

-#define EMAC_RBQP       (24) // Receive Buffer Queue Pointer

-#define EMAC_TBQP       (28) // Transmit Buffer Queue Pointer

-#define EMAC_RSR        (32) // Receive Status Register

-#define EMAC_ISR        (36) // Interrupt Status Register

-#define EMAC_IER        (40) // Interrupt Enable Register

-#define EMAC_IDR        (44) // Interrupt Disable Register

-#define EMAC_IMR        (48) // Interrupt Mask Register

-#define EMAC_MAN        (52) // PHY Maintenance Register

-#define EMAC_PTR        (56) // Pause Time Register

-#define EMAC_PFR        (60) // Pause Frames received Register

-#define EMAC_FTO        (64) // Frames Transmitted OK Register

-#define EMAC_SCF        (68) // Single Collision Frame Register

-#define EMAC_MCF        (72) // Multiple Collision Frame Register

-#define EMAC_FRO        (76) // Frames Received OK Register

-#define EMAC_FCSE       (80) // Frame Check Sequence Error Register

-#define EMAC_ALE        (84) // Alignment Error Register

-#define EMAC_DTF        (88) // Deferred Transmission Frame Register

-#define EMAC_LCOL       (92) // Late Collision Register

-#define EMAC_ECOL       (96) // Excessive Collision Register

-#define EMAC_TUND       (100) // Transmit Underrun Error Register

-#define EMAC_CSE        (104) // Carrier Sense Error Register

-#define EMAC_RRE        (108) // Receive Ressource Error Register

-#define EMAC_ROV        (112) // Receive Overrun Errors Register

-#define EMAC_RSE        (116) // Receive Symbol Errors Register

-#define EMAC_ELE        (120) // Excessive Length Errors Register

-#define EMAC_RJA        (124) // Receive Jabbers Register

-#define EMAC_USF        (128) // Undersize Frames Register

-#define EMAC_STE        (132) // SQE Test Error Register

-#define EMAC_RLE        (136) // Receive Length Field Mismatch Register

-#define EMAC_TPF        (140) // Transmitted Pause Frames Register

-#define EMAC_HRB        (144) // Hash Address Bottom[31:0]

-#define EMAC_HRT        (148) // Hash Address Top[63:32]

-#define EMAC_SA1L       (152) // Specific Address 1 Bottom, First 4 bytes

-#define EMAC_SA1H       (156) // Specific Address 1 Top, Last 2 bytes

-#define EMAC_SA2L       (160) // Specific Address 2 Bottom, First 4 bytes

-#define EMAC_SA2H       (164) // Specific Address 2 Top, Last 2 bytes

-#define EMAC_SA3L       (168) // Specific Address 3 Bottom, First 4 bytes

-#define EMAC_SA3H       (172) // Specific Address 3 Top, Last 2 bytes

-#define EMAC_SA4L       (176) // Specific Address 4 Bottom, First 4 bytes

-#define EMAC_SA4H       (180) // Specific Address 4 Top, Last 2 bytes

-#define EMAC_TID        (184) // Type ID Checking Register

-#define EMAC_TPQ        (188) // Transmit Pause Quantum Register

-#define EMAC_USRIO      (192) // USER Input/Output Register

-#define EMAC_WOL        (196) // Wake On LAN Register

-#define EMAC_REV        (252) // Revision Register

-// -------- EMAC_NCR : (EMAC Offset: 0x0)  -------- 

-#define AT91C_EMAC_LB             (0x1 <<  0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level.

-#define AT91C_EMAC_LLB            (0x1 <<  1) // (EMAC) Loopback local. 

-#define AT91C_EMAC_RE             (0x1 <<  2) // (EMAC) Receive enable. 

-#define AT91C_EMAC_TE             (0x1 <<  3) // (EMAC) Transmit enable. 

-#define AT91C_EMAC_MPE            (0x1 <<  4) // (EMAC) Management port enable. 

-#define AT91C_EMAC_CLRSTAT        (0x1 <<  5) // (EMAC) Clear statistics registers. 

-#define AT91C_EMAC_INCSTAT        (0x1 <<  6) // (EMAC) Increment statistics registers. 

-#define AT91C_EMAC_WESTAT         (0x1 <<  7) // (EMAC) Write enable for statistics registers. 

-#define AT91C_EMAC_BP             (0x1 <<  8) // (EMAC) Back pressure. 

-#define AT91C_EMAC_TSTART         (0x1 <<  9) // (EMAC) Start Transmission. 

-#define AT91C_EMAC_THALT          (0x1 << 10) // (EMAC) Transmission Halt. 

-#define AT91C_EMAC_TPFR           (0x1 << 11) // (EMAC) Transmit pause frame 

-#define AT91C_EMAC_TZQ            (0x1 << 12) // (EMAC) Transmit zero quantum pause frame

-// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- 

-#define AT91C_EMAC_SPD            (0x1 <<  0) // (EMAC) Speed. 

-#define AT91C_EMAC_FD             (0x1 <<  1) // (EMAC) Full duplex. 

-#define AT91C_EMAC_JFRAME         (0x1 <<  3) // (EMAC) Jumbo Frames. 

-#define AT91C_EMAC_CAF            (0x1 <<  4) // (EMAC) Copy all frames. 

-#define AT91C_EMAC_NBC            (0x1 <<  5) // (EMAC) No broadcast. 

-#define AT91C_EMAC_MTI            (0x1 <<  6) // (EMAC) Multicast hash event enable

-#define AT91C_EMAC_UNI            (0x1 <<  7) // (EMAC) Unicast hash enable. 

-#define AT91C_EMAC_BIG            (0x1 <<  8) // (EMAC) Receive 1522 bytes. 

-#define AT91C_EMAC_EAE            (0x1 <<  9) // (EMAC) External address match enable. 

-#define AT91C_EMAC_CLK            (0x3 << 10) // (EMAC) 

-#define 	AT91C_EMAC_CLK_HCLK_8               (0x0 << 10) // (EMAC) HCLK divided by 8

-#define 	AT91C_EMAC_CLK_HCLK_16              (0x1 << 10) // (EMAC) HCLK divided by 16

-#define 	AT91C_EMAC_CLK_HCLK_32              (0x2 << 10) // (EMAC) HCLK divided by 32

-#define 	AT91C_EMAC_CLK_HCLK_64              (0x3 << 10) // (EMAC) HCLK divided by 64

-#define AT91C_EMAC_RTY            (0x1 << 12) // (EMAC) 

-#define AT91C_EMAC_PAE            (0x1 << 13) // (EMAC) 

-#define AT91C_EMAC_RBOF           (0x3 << 14) // (EMAC) 

-#define 	AT91C_EMAC_RBOF_OFFSET_0             (0x0 << 14) // (EMAC) no offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_1             (0x1 << 14) // (EMAC) one byte offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_2             (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_3             (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer

-#define AT91C_EMAC_RLCE           (0x1 << 16) // (EMAC) Receive Length field Checking Enable

-#define AT91C_EMAC_DRFCS          (0x1 << 17) // (EMAC) Discard Receive FCS

-#define AT91C_EMAC_EFRHD          (0x1 << 18) // (EMAC) 

-#define AT91C_EMAC_IRXFCS         (0x1 << 19) // (EMAC) Ignore RX FCS

-// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- 

-#define AT91C_EMAC_LINKR          (0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_MDIO           (0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_IDLE           (0x1 <<  2) // (EMAC) 

-// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- 

-#define AT91C_EMAC_UBR            (0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_COL            (0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_RLES           (0x1 <<  2) // (EMAC) 

-#define AT91C_EMAC_TGO            (0x1 <<  3) // (EMAC) Transmit Go

-#define AT91C_EMAC_BEX            (0x1 <<  4) // (EMAC) Buffers exhausted mid frame

-#define AT91C_EMAC_COMP           (0x1 <<  5) // (EMAC) 

-#define AT91C_EMAC_UND            (0x1 <<  6) // (EMAC) 

-// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- 

-#define AT91C_EMAC_BNA            (0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_REC            (0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_OVR            (0x1 <<  2) // (EMAC) 

-// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- 

-#define AT91C_EMAC_MFD            (0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_RCOMP          (0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_RXUBR          (0x1 <<  2) // (EMAC) 

-#define AT91C_EMAC_TXUBR          (0x1 <<  3) // (EMAC) 

-#define AT91C_EMAC_TUNDR          (0x1 <<  4) // (EMAC) 

-#define AT91C_EMAC_RLEX           (0x1 <<  5) // (EMAC) 

-#define AT91C_EMAC_TXERR          (0x1 <<  6) // (EMAC) 

-#define AT91C_EMAC_TCOMP          (0x1 <<  7) // (EMAC) 

-#define AT91C_EMAC_LINK           (0x1 <<  9) // (EMAC) 

-#define AT91C_EMAC_ROVR           (0x1 << 10) // (EMAC) 

-#define AT91C_EMAC_HRESP          (0x1 << 11) // (EMAC) 

-#define AT91C_EMAC_PFRE           (0x1 << 12) // (EMAC) 

-#define AT91C_EMAC_PTZ            (0x1 << 13) // (EMAC) 

-// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- 

-// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- 

-// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- 

-// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- 

-#define AT91C_EMAC_DATA           (0xFFFF <<  0) // (EMAC) 

-#define AT91C_EMAC_CODE           (0x3 << 16) // (EMAC) 

-#define AT91C_EMAC_REGA           (0x1F << 18) // (EMAC) 

-#define AT91C_EMAC_PHYA           (0x1F << 23) // (EMAC) 

-#define AT91C_EMAC_RW             (0x3 << 28) // (EMAC) 

-#define AT91C_EMAC_SOF            (0x3 << 30) // (EMAC) 

-// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- 

-#define AT91C_EMAC_RMII           (0x1 <<  0) // (EMAC) Reduce MII

-// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- 

-#define AT91C_EMAC_IP             (0xFFFF <<  0) // (EMAC) ARP request IP address

-#define AT91C_EMAC_MAG            (0x1 << 16) // (EMAC) Magic packet event enable

-#define AT91C_EMAC_ARP            (0x1 << 17) // (EMAC) ARP request event enable

-#define AT91C_EMAC_SA1            (0x1 << 18) // (EMAC) Specific address register 1 event enable

-// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- 

-#define AT91C_EMAC_REVREF         (0xFFFF <<  0) // (EMAC) 

-#define AT91C_EMAC_PARTREF        (0xFFFF << 16) // (EMAC) 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor

-// *****************************************************************************

-// *** Register offset in AT91S_ADC structure ***

-#define ADC_CR          ( 0) // ADC Control Register

-#define ADC_MR          ( 4) // ADC Mode Register

-#define ADC_CHER        (16) // ADC Channel Enable Register

-#define ADC_CHDR        (20) // ADC Channel Disable Register

-#define ADC_CHSR        (24) // ADC Channel Status Register

-#define ADC_SR          (28) // ADC Status Register

-#define ADC_LCDR        (32) // ADC Last Converted Data Register

-#define ADC_IER         (36) // ADC Interrupt Enable Register

-#define ADC_IDR         (40) // ADC Interrupt Disable Register

-#define ADC_IMR         (44) // ADC Interrupt Mask Register

-#define ADC_CDR0        (48) // ADC Channel Data Register 0

-#define ADC_CDR1        (52) // ADC Channel Data Register 1

-#define ADC_CDR2        (56) // ADC Channel Data Register 2

-#define ADC_CDR3        (60) // ADC Channel Data Register 3

-#define ADC_CDR4        (64) // ADC Channel Data Register 4

-#define ADC_CDR5        (68) // ADC Channel Data Register 5

-#define ADC_CDR6        (72) // ADC Channel Data Register 6

-#define ADC_CDR7        (76) // ADC Channel Data Register 7

-#define ADC_RPR         (256) // Receive Pointer Register

-#define ADC_RCR         (260) // Receive Counter Register

-#define ADC_TPR         (264) // Transmit Pointer Register

-#define ADC_TCR         (268) // Transmit Counter Register

-#define ADC_RNPR        (272) // Receive Next Pointer Register

-#define ADC_RNCR        (276) // Receive Next Counter Register

-#define ADC_TNPR        (280) // Transmit Next Pointer Register

-#define ADC_TNCR        (284) // Transmit Next Counter Register

-#define ADC_PTCR        (288) // PDC Transfer Control Register

-#define ADC_PTSR        (292) // PDC Transfer Status Register

-// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- 

-#define AT91C_ADC_SWRST           (0x1 <<  0) // (ADC) Software Reset

-#define AT91C_ADC_START           (0x1 <<  1) // (ADC) Start Conversion

-// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- 

-#define AT91C_ADC_TRGEN           (0x1 <<  0) // (ADC) Trigger Enable

-#define 	AT91C_ADC_TRGEN_DIS                  (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software

-#define 	AT91C_ADC_TRGEN_EN                   (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.

-#define AT91C_ADC_TRGSEL          (0x7 <<  1) // (ADC) Trigger Selection

-#define 	AT91C_ADC_TRGSEL_TIOA0                (0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0

-#define 	AT91C_ADC_TRGSEL_TIOA1                (0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1

-#define 	AT91C_ADC_TRGSEL_TIOA2                (0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2

-#define 	AT91C_ADC_TRGSEL_TIOA3                (0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3

-#define 	AT91C_ADC_TRGSEL_TIOA4                (0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4

-#define 	AT91C_ADC_TRGSEL_TIOA5                (0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5

-#define 	AT91C_ADC_TRGSEL_EXT                  (0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger

-#define AT91C_ADC_LOWRES          (0x1 <<  4) // (ADC) Resolution.

-#define 	AT91C_ADC_LOWRES_10_BIT               (0x0 <<  4) // (ADC) 10-bit resolution

-#define 	AT91C_ADC_LOWRES_8_BIT                (0x1 <<  4) // (ADC) 8-bit resolution

-#define AT91C_ADC_SLEEP           (0x1 <<  5) // (ADC) Sleep Mode

-#define 	AT91C_ADC_SLEEP_NORMAL_MODE          (0x0 <<  5) // (ADC) Normal Mode

-#define 	AT91C_ADC_SLEEP_MODE                 (0x1 <<  5) // (ADC) Sleep Mode

-#define AT91C_ADC_PRESCAL         (0x3F <<  8) // (ADC) Prescaler rate selection

-#define AT91C_ADC_STARTUP         (0x1F << 16) // (ADC) Startup Time

-#define AT91C_ADC_SHTIM           (0xF << 24) // (ADC) Sample & Hold Time

-// -------- 	ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- 

-#define AT91C_ADC_CH0             (0x1 <<  0) // (ADC) Channel 0

-#define AT91C_ADC_CH1             (0x1 <<  1) // (ADC) Channel 1

-#define AT91C_ADC_CH2             (0x1 <<  2) // (ADC) Channel 2

-#define AT91C_ADC_CH3             (0x1 <<  3) // (ADC) Channel 3

-#define AT91C_ADC_CH4             (0x1 <<  4) // (ADC) Channel 4

-#define AT91C_ADC_CH5             (0x1 <<  5) // (ADC) Channel 5

-#define AT91C_ADC_CH6             (0x1 <<  6) // (ADC) Channel 6

-#define AT91C_ADC_CH7             (0x1 <<  7) // (ADC) Channel 7

-// -------- 	ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- 

-// -------- 	ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- 

-// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- 

-#define AT91C_ADC_EOC0            (0x1 <<  0) // (ADC) End of Conversion

-#define AT91C_ADC_EOC1            (0x1 <<  1) // (ADC) End of Conversion

-#define AT91C_ADC_EOC2            (0x1 <<  2) // (ADC) End of Conversion

-#define AT91C_ADC_EOC3            (0x1 <<  3) // (ADC) End of Conversion

-#define AT91C_ADC_EOC4            (0x1 <<  4) // (ADC) End of Conversion

-#define AT91C_ADC_EOC5            (0x1 <<  5) // (ADC) End of Conversion

-#define AT91C_ADC_EOC6            (0x1 <<  6) // (ADC) End of Conversion

-#define AT91C_ADC_EOC7            (0x1 <<  7) // (ADC) End of Conversion

-#define AT91C_ADC_OVRE0           (0x1 <<  8) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE1           (0x1 <<  9) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE2           (0x1 << 10) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE3           (0x1 << 11) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE4           (0x1 << 12) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE5           (0x1 << 13) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE6           (0x1 << 14) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE7           (0x1 << 15) // (ADC) Overrun Error

-#define AT91C_ADC_DRDY            (0x1 << 16) // (ADC) Data Ready

-#define AT91C_ADC_GOVRE           (0x1 << 17) // (ADC) General Overrun

-#define AT91C_ADC_ENDRX           (0x1 << 18) // (ADC) End of Receiver Transfer

-#define AT91C_ADC_RXBUFF          (0x1 << 19) // (ADC) RXBUFF Interrupt

-// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- 

-#define AT91C_ADC_LDATA           (0x3FF <<  0) // (ADC) Last Data Converted

-// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- 

-// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- 

-// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- 

-// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- 

-#define AT91C_ADC_DATA            (0x3FF <<  0) // (ADC) Converted Data

-// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- 

-// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- 

-// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- 

-// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- 

-// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- 

-// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- 

-// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Advanced  Encryption Standard

-// *****************************************************************************

-// *** Register offset in AT91S_AES structure ***

-#define AES_CR          ( 0) // Control Register

-#define AES_MR          ( 4) // Mode Register

-#define AES_IER         (16) // Interrupt Enable Register

-#define AES_IDR         (20) // Interrupt Disable Register

-#define AES_IMR         (24) // Interrupt Mask Register

-#define AES_ISR         (28) // Interrupt Status Register

-#define AES_KEYWxR      (32) // Key Word x Register

-#define AES_IDATAxR     (64) // Input Data x Register

-#define AES_ODATAxR     (80) // Output Data x Register

-#define AES_IVxR        (96) // Initialization Vector x Register

-#define AES_VR          (252) // AES Version Register

-#define AES_RPR         (256) // Receive Pointer Register

-#define AES_RCR         (260) // Receive Counter Register

-#define AES_TPR         (264) // Transmit Pointer Register

-#define AES_TCR         (268) // Transmit Counter Register

-#define AES_RNPR        (272) // Receive Next Pointer Register

-#define AES_RNCR        (276) // Receive Next Counter Register

-#define AES_TNPR        (280) // Transmit Next Pointer Register

-#define AES_TNCR        (284) // Transmit Next Counter Register

-#define AES_PTCR        (288) // PDC Transfer Control Register

-#define AES_PTSR        (292) // PDC Transfer Status Register

-// -------- AES_CR : (AES Offset: 0x0) Control Register -------- 

-#define AT91C_AES_START           (0x1 <<  0) // (AES) Starts Processing

-#define AT91C_AES_SWRST           (0x1 <<  8) // (AES) Software Reset

-#define AT91C_AES_LOADSEED        (0x1 << 16) // (AES) Random Number Generator Seed Loading

-// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- 

-#define AT91C_AES_CIPHER          (0x1 <<  0) // (AES) Processing Mode

-#define AT91C_AES_PROCDLY         (0xF <<  4) // (AES) Processing Delay

-#define AT91C_AES_SMOD            (0x3 <<  8) // (AES) Start Mode

-#define 	AT91C_AES_SMOD_MANUAL               (0x0 <<  8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption.

-#define 	AT91C_AES_SMOD_AUTO                 (0x1 <<  8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet).

-#define 	AT91C_AES_SMOD_PDC                  (0x2 <<  8) // (AES) PDC Mode (cf datasheet).

-#define AT91C_AES_OPMOD           (0x7 << 12) // (AES) Operation Mode

-#define 	AT91C_AES_OPMOD_ECB                  (0x0 << 12) // (AES) ECB Electronic CodeBook mode.

-#define 	AT91C_AES_OPMOD_CBC                  (0x1 << 12) // (AES) CBC Cipher Block Chaining mode.

-#define 	AT91C_AES_OPMOD_OFB                  (0x2 << 12) // (AES) OFB Output Feedback mode.

-#define 	AT91C_AES_OPMOD_CFB                  (0x3 << 12) // (AES) CFB Cipher Feedback mode.

-#define 	AT91C_AES_OPMOD_CTR                  (0x4 << 12) // (AES) CTR Counter mode.

-#define AT91C_AES_LOD             (0x1 << 15) // (AES) Last Output Data Mode

-#define AT91C_AES_CFBS            (0x7 << 16) // (AES) Cipher Feedback Data Size

-#define 	AT91C_AES_CFBS_128_BIT              (0x0 << 16) // (AES) 128-bit.

-#define 	AT91C_AES_CFBS_64_BIT               (0x1 << 16) // (AES) 64-bit.

-#define 	AT91C_AES_CFBS_32_BIT               (0x2 << 16) // (AES) 32-bit.

-#define 	AT91C_AES_CFBS_16_BIT               (0x3 << 16) // (AES) 16-bit.

-#define 	AT91C_AES_CFBS_8_BIT                (0x4 << 16) // (AES) 8-bit.

-#define AT91C_AES_CKEY            (0xF << 20) // (AES) Countermeasure Key

-#define AT91C_AES_CTYPE           (0x1F << 24) // (AES) Countermeasure Type

-#define 	AT91C_AES_CTYPE_TYPE1_EN             (0x1 << 24) // (AES) Countermeasure type 1 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE2_EN             (0x2 << 24) // (AES) Countermeasure type 2 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE3_EN             (0x4 << 24) // (AES) Countermeasure type 3 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE4_EN             (0x8 << 24) // (AES) Countermeasure type 4 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE5_EN             (0x10 << 24) // (AES) Countermeasure type 5 is enabled.

-// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- 

-#define AT91C_AES_DATRDY          (0x1 <<  0) // (AES) DATRDY

-#define AT91C_AES_ENDRX           (0x1 <<  1) // (AES) PDC Read Buffer End

-#define AT91C_AES_ENDTX           (0x1 <<  2) // (AES) PDC Write Buffer End

-#define AT91C_AES_RXBUFF          (0x1 <<  3) // (AES) PDC Read Buffer Full

-#define AT91C_AES_TXBUFE          (0x1 <<  4) // (AES) PDC Write Buffer Empty

-#define AT91C_AES_URAD            (0x1 <<  8) // (AES) Unspecified Register Access Detection

-// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- 

-// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- 

-// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- 

-#define AT91C_AES_URAT            (0x7 << 12) // (AES) Unspecified Register Access Type Status

-#define 	AT91C_AES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (AES) Input data register written during the data processing in PDC mode.

-#define 	AT91C_AES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (AES) Output data register read during the data processing.

-#define 	AT91C_AES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (AES) Mode register written during the data processing.

-#define 	AT91C_AES_URAT_OUT_DAT_READ_SUBKEY  (0x3 << 12) // (AES) Output data register read during the sub-keys generation.

-#define 	AT91C_AES_URAT_MODEREG_WRITE_SUBKEY (0x4 << 12) // (AES) Mode register written during the sub-keys generation.

-#define 	AT91C_AES_URAT_WO_REG_READ          (0x5 << 12) // (AES) Write-only register read access.

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Triple Data Encryption Standard

-// *****************************************************************************

-// *** Register offset in AT91S_TDES structure ***

-#define TDES_CR         ( 0) // Control Register

-#define TDES_MR         ( 4) // Mode Register

-#define TDES_IER        (16) // Interrupt Enable Register

-#define TDES_IDR        (20) // Interrupt Disable Register

-#define TDES_IMR        (24) // Interrupt Mask Register

-#define TDES_ISR        (28) // Interrupt Status Register

-#define TDES_KEY1WxR    (32) // Key 1 Word x Register

-#define TDES_KEY2WxR    (40) // Key 2 Word x Register

-#define TDES_KEY3WxR    (48) // Key 3 Word x Register

-#define TDES_IDATAxR    (64) // Input Data x Register

-#define TDES_ODATAxR    (80) // Output Data x Register

-#define TDES_IVxR       (96) // Initialization Vector x Register

-#define TDES_VR         (252) // TDES Version Register

-#define TDES_RPR        (256) // Receive Pointer Register

-#define TDES_RCR        (260) // Receive Counter Register

-#define TDES_TPR        (264) // Transmit Pointer Register

-#define TDES_TCR        (268) // Transmit Counter Register

-#define TDES_RNPR       (272) // Receive Next Pointer Register

-#define TDES_RNCR       (276) // Receive Next Counter Register

-#define TDES_TNPR       (280) // Transmit Next Pointer Register

-#define TDES_TNCR       (284) // Transmit Next Counter Register

-#define TDES_PTCR       (288) // PDC Transfer Control Register

-#define TDES_PTSR       (292) // PDC Transfer Status Register

-// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- 

-#define AT91C_TDES_START          (0x1 <<  0) // (TDES) Starts Processing

-#define AT91C_TDES_SWRST          (0x1 <<  8) // (TDES) Software Reset

-// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- 

-#define AT91C_TDES_CIPHER         (0x1 <<  0) // (TDES) Processing Mode

-#define AT91C_TDES_TDESMOD        (0x1 <<  1) // (TDES) Single or Triple DES Mode

-#define AT91C_TDES_KEYMOD         (0x1 <<  4) // (TDES) Key Mode

-#define AT91C_TDES_SMOD           (0x3 <<  8) // (TDES) Start Mode

-#define 	AT91C_TDES_SMOD_MANUAL               (0x0 <<  8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption.

-#define 	AT91C_TDES_SMOD_AUTO                 (0x1 <<  8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet).

-#define 	AT91C_TDES_SMOD_PDC                  (0x2 <<  8) // (TDES) PDC Mode (cf datasheet).

-#define AT91C_TDES_OPMOD          (0x3 << 12) // (TDES) Operation Mode

-#define 	AT91C_TDES_OPMOD_ECB                  (0x0 << 12) // (TDES) ECB Electronic CodeBook mode.

-#define 	AT91C_TDES_OPMOD_CBC                  (0x1 << 12) // (TDES) CBC Cipher Block Chaining mode.

-#define 	AT91C_TDES_OPMOD_OFB                  (0x2 << 12) // (TDES) OFB Output Feedback mode.

-#define 	AT91C_TDES_OPMOD_CFB                  (0x3 << 12) // (TDES) CFB Cipher Feedback mode.

-#define AT91C_TDES_LOD            (0x1 << 15) // (TDES) Last Output Data Mode

-#define AT91C_TDES_CFBS           (0x3 << 16) // (TDES) Cipher Feedback Data Size

-#define 	AT91C_TDES_CFBS_64_BIT               (0x0 << 16) // (TDES) 64-bit.

-#define 	AT91C_TDES_CFBS_32_BIT               (0x1 << 16) // (TDES) 32-bit.

-#define 	AT91C_TDES_CFBS_16_BIT               (0x2 << 16) // (TDES) 16-bit.

-#define 	AT91C_TDES_CFBS_8_BIT                (0x3 << 16) // (TDES) 8-bit.

-// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- 

-#define AT91C_TDES_DATRDY         (0x1 <<  0) // (TDES) DATRDY

-#define AT91C_TDES_ENDRX          (0x1 <<  1) // (TDES) PDC Read Buffer End

-#define AT91C_TDES_ENDTX          (0x1 <<  2) // (TDES) PDC Write Buffer End

-#define AT91C_TDES_RXBUFF         (0x1 <<  3) // (TDES) PDC Read Buffer Full

-#define AT91C_TDES_TXBUFE         (0x1 <<  4) // (TDES) PDC Write Buffer Empty

-#define AT91C_TDES_URAD           (0x1 <<  8) // (TDES) Unspecified Register Access Detection

-// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- 

-// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- 

-// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- 

-#define AT91C_TDES_URAT           (0x3 << 12) // (TDES) Unspecified Register Access Type Status

-#define 	AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode.

-#define 	AT91C_TDES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (TDES) Output data register read during the data processing.

-#define 	AT91C_TDES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (TDES) Mode register written during the data processing.

-#define 	AT91C_TDES_URAT_WO_REG_READ          (0x3 << 12) // (TDES) Write-only register read access.

-

-// *****************************************************************************

-//               REGISTER ADDRESS DEFINITION FOR AT91SAM7X128

-// *****************************************************************************

-// ========== Register definition for SYS peripheral ========== 

-// ========== Register definition for AIC peripheral ========== 

-#define AT91C_AIC_IVR             (0xFFFFF100) // (AIC) IRQ Vector Register

-#define AT91C_AIC_SMR             (0xFFFFF000) // (AIC) Source Mode Register

-#define AT91C_AIC_FVR             (0xFFFFF104) // (AIC) FIQ Vector Register

-#define AT91C_AIC_DCR             (0xFFFFF138) // (AIC) Debug Control Register (Protect)

-#define AT91C_AIC_EOICR           (0xFFFFF130) // (AIC) End of Interrupt Command Register

-#define AT91C_AIC_SVR             (0xFFFFF080) // (AIC) Source Vector Register

-#define AT91C_AIC_FFSR            (0xFFFFF148) // (AIC) Fast Forcing Status Register

-#define AT91C_AIC_ICCR            (0xFFFFF128) // (AIC) Interrupt Clear Command Register

-#define AT91C_AIC_ISR             (0xFFFFF108) // (AIC) Interrupt Status Register

-#define AT91C_AIC_IMR             (0xFFFFF110) // (AIC) Interrupt Mask Register

-#define AT91C_AIC_IPR             (0xFFFFF10C) // (AIC) Interrupt Pending Register

-#define AT91C_AIC_FFER            (0xFFFFF140) // (AIC) Fast Forcing Enable Register

-#define AT91C_AIC_IECR            (0xFFFFF120) // (AIC) Interrupt Enable Command Register

-#define AT91C_AIC_ISCR            (0xFFFFF12C) // (AIC) Interrupt Set Command Register

-#define AT91C_AIC_FFDR            (0xFFFFF144) // (AIC) Fast Forcing Disable Register

-#define AT91C_AIC_CISR            (0xFFFFF114) // (AIC) Core Interrupt Status Register

-#define AT91C_AIC_IDCR            (0xFFFFF124) // (AIC) Interrupt Disable Command Register

-#define AT91C_AIC_SPU             (0xFFFFF134) // (AIC) Spurious Vector Register

-// ========== Register definition for PDC_DBGU peripheral ========== 

-#define AT91C_DBGU_TCR            (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register

-#define AT91C_DBGU_RNPR           (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register

-#define AT91C_DBGU_TNPR           (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register

-#define AT91C_DBGU_TPR            (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register

-#define AT91C_DBGU_RPR            (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register

-#define AT91C_DBGU_RCR            (0xFFFFF304) // (PDC_DBGU) Receive Counter Register

-#define AT91C_DBGU_RNCR           (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register

-#define AT91C_DBGU_PTCR           (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register

-#define AT91C_DBGU_PTSR           (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register

-#define AT91C_DBGU_TNCR           (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register

-// ========== Register definition for DBGU peripheral ========== 

-#define AT91C_DBGU_EXID           (0xFFFFF244) // (DBGU) Chip ID Extension Register

-#define AT91C_DBGU_BRGR           (0xFFFFF220) // (DBGU) Baud Rate Generator Register

-#define AT91C_DBGU_IDR            (0xFFFFF20C) // (DBGU) Interrupt Disable Register

-#define AT91C_DBGU_CSR            (0xFFFFF214) // (DBGU) Channel Status Register

-#define AT91C_DBGU_CIDR           (0xFFFFF240) // (DBGU) Chip ID Register

-#define AT91C_DBGU_MR             (0xFFFFF204) // (DBGU) Mode Register

-#define AT91C_DBGU_IMR            (0xFFFFF210) // (DBGU) Interrupt Mask Register

-#define AT91C_DBGU_CR             (0xFFFFF200) // (DBGU) Control Register

-#define AT91C_DBGU_FNTR           (0xFFFFF248) // (DBGU) Force NTRST Register

-#define AT91C_DBGU_THR            (0xFFFFF21C) // (DBGU) Transmitter Holding Register

-#define AT91C_DBGU_RHR            (0xFFFFF218) // (DBGU) Receiver Holding Register

-#define AT91C_DBGU_IER            (0xFFFFF208) // (DBGU) Interrupt Enable Register

-// ========== Register definition for PIOA peripheral ========== 

-#define AT91C_PIOA_ODR            (0xFFFFF414) // (PIOA) Output Disable Registerr

-#define AT91C_PIOA_SODR           (0xFFFFF430) // (PIOA) Set Output Data Register

-#define AT91C_PIOA_ISR            (0xFFFFF44C) // (PIOA) Interrupt Status Register

-#define AT91C_PIOA_ABSR           (0xFFFFF478) // (PIOA) AB Select Status Register

-#define AT91C_PIOA_IER            (0xFFFFF440) // (PIOA) Interrupt Enable Register

-#define AT91C_PIOA_PPUDR          (0xFFFFF460) // (PIOA) Pull-up Disable Register

-#define AT91C_PIOA_IMR            (0xFFFFF448) // (PIOA) Interrupt Mask Register

-#define AT91C_PIOA_PER            (0xFFFFF400) // (PIOA) PIO Enable Register

-#define AT91C_PIOA_IFDR           (0xFFFFF424) // (PIOA) Input Filter Disable Register

-#define AT91C_PIOA_OWDR           (0xFFFFF4A4) // (PIOA) Output Write Disable Register

-#define AT91C_PIOA_MDSR           (0xFFFFF458) // (PIOA) Multi-driver Status Register

-#define AT91C_PIOA_IDR            (0xFFFFF444) // (PIOA) Interrupt Disable Register

-#define AT91C_PIOA_ODSR           (0xFFFFF438) // (PIOA) Output Data Status Register

-#define AT91C_PIOA_PPUSR          (0xFFFFF468) // (PIOA) Pull-up Status Register

-#define AT91C_PIOA_OWSR           (0xFFFFF4A8) // (PIOA) Output Write Status Register

-#define AT91C_PIOA_BSR            (0xFFFFF474) // (PIOA) Select B Register

-#define AT91C_PIOA_OWER           (0xFFFFF4A0) // (PIOA) Output Write Enable Register

-#define AT91C_PIOA_IFER           (0xFFFFF420) // (PIOA) Input Filter Enable Register

-#define AT91C_PIOA_PDSR           (0xFFFFF43C) // (PIOA) Pin Data Status Register

-#define AT91C_PIOA_PPUER          (0xFFFFF464) // (PIOA) Pull-up Enable Register

-#define AT91C_PIOA_OSR            (0xFFFFF418) // (PIOA) Output Status Register

-#define AT91C_PIOA_ASR            (0xFFFFF470) // (PIOA) Select A Register

-#define AT91C_PIOA_MDDR           (0xFFFFF454) // (PIOA) Multi-driver Disable Register

-#define AT91C_PIOA_CODR           (0xFFFFF434) // (PIOA) Clear Output Data Register

-#define AT91C_PIOA_MDER           (0xFFFFF450) // (PIOA) Multi-driver Enable Register

-#define AT91C_PIOA_PDR            (0xFFFFF404) // (PIOA) PIO Disable Register

-#define AT91C_PIOA_IFSR           (0xFFFFF428) // (PIOA) Input Filter Status Register

-#define AT91C_PIOA_OER            (0xFFFFF410) // (PIOA) Output Enable Register

-#define AT91C_PIOA_PSR            (0xFFFFF408) // (PIOA) PIO Status Register

-// ========== Register definition for PIOB peripheral ========== 

-#define AT91C_PIOB_OWDR           (0xFFFFF6A4) // (PIOB) Output Write Disable Register

-#define AT91C_PIOB_MDER           (0xFFFFF650) // (PIOB) Multi-driver Enable Register

-#define AT91C_PIOB_PPUSR          (0xFFFFF668) // (PIOB) Pull-up Status Register

-#define AT91C_PIOB_IMR            (0xFFFFF648) // (PIOB) Interrupt Mask Register

-#define AT91C_PIOB_ASR            (0xFFFFF670) // (PIOB) Select A Register

-#define AT91C_PIOB_PPUDR          (0xFFFFF660) // (PIOB) Pull-up Disable Register

-#define AT91C_PIOB_PSR            (0xFFFFF608) // (PIOB) PIO Status Register

-#define AT91C_PIOB_IER            (0xFFFFF640) // (PIOB) Interrupt Enable Register

-#define AT91C_PIOB_CODR           (0xFFFFF634) // (PIOB) Clear Output Data Register

-#define AT91C_PIOB_OWER           (0xFFFFF6A0) // (PIOB) Output Write Enable Register

-#define AT91C_PIOB_ABSR           (0xFFFFF678) // (PIOB) AB Select Status Register

-#define AT91C_PIOB_IFDR           (0xFFFFF624) // (PIOB) Input Filter Disable Register

-#define AT91C_PIOB_PDSR           (0xFFFFF63C) // (PIOB) Pin Data Status Register

-#define AT91C_PIOB_IDR            (0xFFFFF644) // (PIOB) Interrupt Disable Register

-#define AT91C_PIOB_OWSR           (0xFFFFF6A8) // (PIOB) Output Write Status Register

-#define AT91C_PIOB_PDR            (0xFFFFF604) // (PIOB) PIO Disable Register

-#define AT91C_PIOB_ODR            (0xFFFFF614) // (PIOB) Output Disable Registerr

-#define AT91C_PIOB_IFSR           (0xFFFFF628) // (PIOB) Input Filter Status Register

-#define AT91C_PIOB_PPUER          (0xFFFFF664) // (PIOB) Pull-up Enable Register

-#define AT91C_PIOB_SODR           (0xFFFFF630) // (PIOB) Set Output Data Register

-#define AT91C_PIOB_ISR            (0xFFFFF64C) // (PIOB) Interrupt Status Register

-#define AT91C_PIOB_ODSR           (0xFFFFF638) // (PIOB) Output Data Status Register

-#define AT91C_PIOB_OSR            (0xFFFFF618) // (PIOB) Output Status Register

-#define AT91C_PIOB_MDSR           (0xFFFFF658) // (PIOB) Multi-driver Status Register

-#define AT91C_PIOB_IFER           (0xFFFFF620) // (PIOB) Input Filter Enable Register

-#define AT91C_PIOB_BSR            (0xFFFFF674) // (PIOB) Select B Register

-#define AT91C_PIOB_MDDR           (0xFFFFF654) // (PIOB) Multi-driver Disable Register

-#define AT91C_PIOB_OER            (0xFFFFF610) // (PIOB) Output Enable Register

-#define AT91C_PIOB_PER            (0xFFFFF600) // (PIOB) PIO Enable Register

-// ========== Register definition for CKGR peripheral ========== 

-#define AT91C_CKGR_MOR            (0xFFFFFC20) // (CKGR) Main Oscillator Register

-#define AT91C_CKGR_PLLR           (0xFFFFFC2C) // (CKGR) PLL Register

-#define AT91C_CKGR_MCFR           (0xFFFFFC24) // (CKGR) Main Clock  Frequency Register

-// ========== Register definition for PMC peripheral ========== 

-#define AT91C_PMC_IDR             (0xFFFFFC64) // (PMC) Interrupt Disable Register

-#define AT91C_PMC_MOR             (0xFFFFFC20) // (PMC) Main Oscillator Register

-#define AT91C_PMC_PLLR            (0xFFFFFC2C) // (PMC) PLL Register

-#define AT91C_PMC_PCER            (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register

-#define AT91C_PMC_PCKR            (0xFFFFFC40) // (PMC) Programmable Clock Register

-#define AT91C_PMC_MCKR            (0xFFFFFC30) // (PMC) Master Clock Register

-#define AT91C_PMC_SCDR            (0xFFFFFC04) // (PMC) System Clock Disable Register

-#define AT91C_PMC_PCDR            (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register

-#define AT91C_PMC_SCSR            (0xFFFFFC08) // (PMC) System Clock Status Register

-#define AT91C_PMC_PCSR            (0xFFFFFC18) // (PMC) Peripheral Clock Status Register

-#define AT91C_PMC_MCFR            (0xFFFFFC24) // (PMC) Main Clock  Frequency Register

-#define AT91C_PMC_SCER            (0xFFFFFC00) // (PMC) System Clock Enable Register

-#define AT91C_PMC_IMR             (0xFFFFFC6C) // (PMC) Interrupt Mask Register

-#define AT91C_PMC_IER             (0xFFFFFC60) // (PMC) Interrupt Enable Register

-#define AT91C_PMC_SR              (0xFFFFFC68) // (PMC) Status Register

-// ========== Register definition for RSTC peripheral ========== 

-#define AT91C_RSTC_RCR            (0xFFFFFD00) // (RSTC) Reset Control Register

-#define AT91C_RSTC_RMR            (0xFFFFFD08) // (RSTC) Reset Mode Register

-#define AT91C_RSTC_RSR            (0xFFFFFD04) // (RSTC) Reset Status Register

-// ========== Register definition for RTTC peripheral ========== 

-#define AT91C_RTTC_RTSR           (0xFFFFFD2C) // (RTTC) Real-time Status Register

-#define AT91C_RTTC_RTMR           (0xFFFFFD20) // (RTTC) Real-time Mode Register

-#define AT91C_RTTC_RTVR           (0xFFFFFD28) // (RTTC) Real-time Value Register

-#define AT91C_RTTC_RTAR           (0xFFFFFD24) // (RTTC) Real-time Alarm Register

-// ========== Register definition for PITC peripheral ========== 

-#define AT91C_PITC_PIVR           (0xFFFFFD38) // (PITC) Period Interval Value Register

-#define AT91C_PITC_PISR           (0xFFFFFD34) // (PITC) Period Interval Status Register

-#define AT91C_PITC_PIIR           (0xFFFFFD3C) // (PITC) Period Interval Image Register

-#define AT91C_PITC_PIMR           (0xFFFFFD30) // (PITC) Period Interval Mode Register

-// ========== Register definition for WDTC peripheral ========== 

-#define AT91C_WDTC_WDCR           (0xFFFFFD40) // (WDTC) Watchdog Control Register

-#define AT91C_WDTC_WDSR           (0xFFFFFD48) // (WDTC) Watchdog Status Register

-#define AT91C_WDTC_WDMR           (0xFFFFFD44) // (WDTC) Watchdog Mode Register

-// ========== Register definition for VREG peripheral ========== 

-#define AT91C_VREG_MR             (0xFFFFFD60) // (VREG) Voltage Regulator Mode Register

-// ========== Register definition for MC peripheral ========== 

-#define AT91C_MC_ASR              (0xFFFFFF04) // (MC) MC Abort Status Register

-#define AT91C_MC_RCR              (0xFFFFFF00) // (MC) MC Remap Control Register

-#define AT91C_MC_FCR              (0xFFFFFF64) // (MC) MC Flash Command Register

-#define AT91C_MC_AASR             (0xFFFFFF08) // (MC) MC Abort Address Status Register

-#define AT91C_MC_FSR              (0xFFFFFF68) // (MC) MC Flash Status Register

-#define AT91C_MC_FMR              (0xFFFFFF60) // (MC) MC Flash Mode Register

-// ========== Register definition for PDC_SPI1 peripheral ========== 

-#define AT91C_SPI1_PTCR           (0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register

-#define AT91C_SPI1_RPR            (0xFFFE4100) // (PDC_SPI1) Receive Pointer Register

-#define AT91C_SPI1_TNCR           (0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register

-#define AT91C_SPI1_TPR            (0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register

-#define AT91C_SPI1_TNPR           (0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register

-#define AT91C_SPI1_TCR            (0xFFFE410C) // (PDC_SPI1) Transmit Counter Register

-#define AT91C_SPI1_RCR            (0xFFFE4104) // (PDC_SPI1) Receive Counter Register

-#define AT91C_SPI1_RNPR           (0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register

-#define AT91C_SPI1_RNCR           (0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register

-#define AT91C_SPI1_PTSR           (0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register

-// ========== Register definition for SPI1 peripheral ========== 

-#define AT91C_SPI1_IMR            (0xFFFE401C) // (SPI1) Interrupt Mask Register

-#define AT91C_SPI1_IER            (0xFFFE4014) // (SPI1) Interrupt Enable Register

-#define AT91C_SPI1_MR             (0xFFFE4004) // (SPI1) Mode Register

-#define AT91C_SPI1_RDR            (0xFFFE4008) // (SPI1) Receive Data Register

-#define AT91C_SPI1_IDR            (0xFFFE4018) // (SPI1) Interrupt Disable Register

-#define AT91C_SPI1_SR             (0xFFFE4010) // (SPI1) Status Register

-#define AT91C_SPI1_TDR            (0xFFFE400C) // (SPI1) Transmit Data Register

-#define AT91C_SPI1_CR             (0xFFFE4000) // (SPI1) Control Register

-#define AT91C_SPI1_CSR            (0xFFFE4030) // (SPI1) Chip Select Register

-// ========== Register definition for PDC_SPI0 peripheral ========== 

-#define AT91C_SPI0_PTCR           (0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register

-#define AT91C_SPI0_TPR            (0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register

-#define AT91C_SPI0_TCR            (0xFFFE010C) // (PDC_SPI0) Transmit Counter Register

-#define AT91C_SPI0_RCR            (0xFFFE0104) // (PDC_SPI0) Receive Counter Register

-#define AT91C_SPI0_PTSR           (0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register

-#define AT91C_SPI0_RNPR           (0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register

-#define AT91C_SPI0_RPR            (0xFFFE0100) // (PDC_SPI0) Receive Pointer Register

-#define AT91C_SPI0_TNCR           (0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register

-#define AT91C_SPI0_RNCR           (0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register

-#define AT91C_SPI0_TNPR           (0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register

-// ========== Register definition for SPI0 peripheral ========== 

-#define AT91C_SPI0_IER            (0xFFFE0014) // (SPI0) Interrupt Enable Register

-#define AT91C_SPI0_SR             (0xFFFE0010) // (SPI0) Status Register

-#define AT91C_SPI0_IDR            (0xFFFE0018) // (SPI0) Interrupt Disable Register

-#define AT91C_SPI0_CR             (0xFFFE0000) // (SPI0) Control Register

-#define AT91C_SPI0_MR             (0xFFFE0004) // (SPI0) Mode Register

-#define AT91C_SPI0_IMR            (0xFFFE001C) // (SPI0) Interrupt Mask Register

-#define AT91C_SPI0_TDR            (0xFFFE000C) // (SPI0) Transmit Data Register

-#define AT91C_SPI0_RDR            (0xFFFE0008) // (SPI0) Receive Data Register

-#define AT91C_SPI0_CSR            (0xFFFE0030) // (SPI0) Chip Select Register

-// ========== Register definition for PDC_US1 peripheral ========== 

-#define AT91C_US1_RNCR            (0xFFFC4114) // (PDC_US1) Receive Next Counter Register

-#define AT91C_US1_PTCR            (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register

-#define AT91C_US1_TCR             (0xFFFC410C) // (PDC_US1) Transmit Counter Register

-#define AT91C_US1_PTSR            (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register

-#define AT91C_US1_TNPR            (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register

-#define AT91C_US1_RCR             (0xFFFC4104) // (PDC_US1) Receive Counter Register

-#define AT91C_US1_RNPR            (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register

-#define AT91C_US1_RPR             (0xFFFC4100) // (PDC_US1) Receive Pointer Register

-#define AT91C_US1_TNCR            (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register

-#define AT91C_US1_TPR             (0xFFFC4108) // (PDC_US1) Transmit Pointer Register

-// ========== Register definition for US1 peripheral ========== 

-#define AT91C_US1_IF              (0xFFFC404C) // (US1) IRDA_FILTER Register

-#define AT91C_US1_NER             (0xFFFC4044) // (US1) Nb Errors Register

-#define AT91C_US1_RTOR            (0xFFFC4024) // (US1) Receiver Time-out Register

-#define AT91C_US1_CSR             (0xFFFC4014) // (US1) Channel Status Register

-#define AT91C_US1_IDR             (0xFFFC400C) // (US1) Interrupt Disable Register

-#define AT91C_US1_IER             (0xFFFC4008) // (US1) Interrupt Enable Register

-#define AT91C_US1_THR             (0xFFFC401C) // (US1) Transmitter Holding Register

-#define AT91C_US1_TTGR            (0xFFFC4028) // (US1) Transmitter Time-guard Register

-#define AT91C_US1_RHR             (0xFFFC4018) // (US1) Receiver Holding Register

-#define AT91C_US1_BRGR            (0xFFFC4020) // (US1) Baud Rate Generator Register

-#define AT91C_US1_IMR             (0xFFFC4010) // (US1) Interrupt Mask Register

-#define AT91C_US1_FIDI            (0xFFFC4040) // (US1) FI_DI_Ratio Register

-#define AT91C_US1_CR              (0xFFFC4000) // (US1) Control Register

-#define AT91C_US1_MR              (0xFFFC4004) // (US1) Mode Register

-// ========== Register definition for PDC_US0 peripheral ========== 

-#define AT91C_US0_TNPR            (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register

-#define AT91C_US0_RNPR            (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register

-#define AT91C_US0_TCR             (0xFFFC010C) // (PDC_US0) Transmit Counter Register

-#define AT91C_US0_PTCR            (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register

-#define AT91C_US0_PTSR            (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register

-#define AT91C_US0_TNCR            (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register

-#define AT91C_US0_TPR             (0xFFFC0108) // (PDC_US0) Transmit Pointer Register

-#define AT91C_US0_RCR             (0xFFFC0104) // (PDC_US0) Receive Counter Register

-#define AT91C_US0_RPR             (0xFFFC0100) // (PDC_US0) Receive Pointer Register

-#define AT91C_US0_RNCR            (0xFFFC0114) // (PDC_US0) Receive Next Counter Register

-// ========== Register definition for US0 peripheral ========== 

-#define AT91C_US0_BRGR            (0xFFFC0020) // (US0) Baud Rate Generator Register

-#define AT91C_US0_NER             (0xFFFC0044) // (US0) Nb Errors Register

-#define AT91C_US0_CR              (0xFFFC0000) // (US0) Control Register

-#define AT91C_US0_IMR             (0xFFFC0010) // (US0) Interrupt Mask Register

-#define AT91C_US0_FIDI            (0xFFFC0040) // (US0) FI_DI_Ratio Register

-#define AT91C_US0_TTGR            (0xFFFC0028) // (US0) Transmitter Time-guard Register

-#define AT91C_US0_MR              (0xFFFC0004) // (US0) Mode Register

-#define AT91C_US0_RTOR            (0xFFFC0024) // (US0) Receiver Time-out Register

-#define AT91C_US0_CSR             (0xFFFC0014) // (US0) Channel Status Register

-#define AT91C_US0_RHR             (0xFFFC0018) // (US0) Receiver Holding Register

-#define AT91C_US0_IDR             (0xFFFC000C) // (US0) Interrupt Disable Register

-#define AT91C_US0_THR             (0xFFFC001C) // (US0) Transmitter Holding Register

-#define AT91C_US0_IF              (0xFFFC004C) // (US0) IRDA_FILTER Register

-#define AT91C_US0_IER             (0xFFFC0008) // (US0) Interrupt Enable Register

-// ========== Register definition for PDC_SSC peripheral ========== 

-#define AT91C_SSC_TNCR            (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register

-#define AT91C_SSC_RPR             (0xFFFD4100) // (PDC_SSC) Receive Pointer Register

-#define AT91C_SSC_RNCR            (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register

-#define AT91C_SSC_TPR             (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register

-#define AT91C_SSC_PTCR            (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register

-#define AT91C_SSC_TCR             (0xFFFD410C) // (PDC_SSC) Transmit Counter Register

-#define AT91C_SSC_RCR             (0xFFFD4104) // (PDC_SSC) Receive Counter Register

-#define AT91C_SSC_RNPR            (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register

-#define AT91C_SSC_TNPR            (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register

-#define AT91C_SSC_PTSR            (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register

-// ========== Register definition for SSC peripheral ========== 

-#define AT91C_SSC_RHR             (0xFFFD4020) // (SSC) Receive Holding Register

-#define AT91C_SSC_RSHR            (0xFFFD4030) // (SSC) Receive Sync Holding Register

-#define AT91C_SSC_TFMR            (0xFFFD401C) // (SSC) Transmit Frame Mode Register

-#define AT91C_SSC_IDR             (0xFFFD4048) // (SSC) Interrupt Disable Register

-#define AT91C_SSC_THR             (0xFFFD4024) // (SSC) Transmit Holding Register

-#define AT91C_SSC_RCMR            (0xFFFD4010) // (SSC) Receive Clock ModeRegister

-#define AT91C_SSC_IER             (0xFFFD4044) // (SSC) Interrupt Enable Register

-#define AT91C_SSC_TSHR            (0xFFFD4034) // (SSC) Transmit Sync Holding Register

-#define AT91C_SSC_SR              (0xFFFD4040) // (SSC) Status Register

-#define AT91C_SSC_CMR             (0xFFFD4004) // (SSC) Clock Mode Register

-#define AT91C_SSC_TCMR            (0xFFFD4018) // (SSC) Transmit Clock Mode Register

-#define AT91C_SSC_CR              (0xFFFD4000) // (SSC) Control Register

-#define AT91C_SSC_IMR             (0xFFFD404C) // (SSC) Interrupt Mask Register

-#define AT91C_SSC_RFMR            (0xFFFD4014) // (SSC) Receive Frame Mode Register

-// ========== Register definition for TWI peripheral ========== 

-#define AT91C_TWI_IER             (0xFFFB8024) // (TWI) Interrupt Enable Register

-#define AT91C_TWI_CR              (0xFFFB8000) // (TWI) Control Register

-#define AT91C_TWI_SR              (0xFFFB8020) // (TWI) Status Register

-#define AT91C_TWI_IMR             (0xFFFB802C) // (TWI) Interrupt Mask Register

-#define AT91C_TWI_THR             (0xFFFB8034) // (TWI) Transmit Holding Register

-#define AT91C_TWI_IDR             (0xFFFB8028) // (TWI) Interrupt Disable Register

-#define AT91C_TWI_IADR            (0xFFFB800C) // (TWI) Internal Address Register

-#define AT91C_TWI_MMR             (0xFFFB8004) // (TWI) Master Mode Register

-#define AT91C_TWI_CWGR            (0xFFFB8010) // (TWI) Clock Waveform Generator Register

-#define AT91C_TWI_RHR             (0xFFFB8030) // (TWI) Receive Holding Register

-// ========== Register definition for PWMC_CH3 peripheral ========== 

-#define AT91C_PWMC_CH3_CUPDR      (0xFFFCC270) // (PWMC_CH3) Channel Update Register

-#define AT91C_PWMC_CH3_Reserved   (0xFFFCC274) // (PWMC_CH3) Reserved

-#define AT91C_PWMC_CH3_CPRDR      (0xFFFCC268) // (PWMC_CH3) Channel Period Register

-#define AT91C_PWMC_CH3_CDTYR      (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register

-#define AT91C_PWMC_CH3_CCNTR      (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register

-#define AT91C_PWMC_CH3_CMR        (0xFFFCC260) // (PWMC_CH3) Channel Mode Register

-// ========== Register definition for PWMC_CH2 peripheral ========== 

-#define AT91C_PWMC_CH2_Reserved   (0xFFFCC254) // (PWMC_CH2) Reserved

-#define AT91C_PWMC_CH2_CMR        (0xFFFCC240) // (PWMC_CH2) Channel Mode Register

-#define AT91C_PWMC_CH2_CCNTR      (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register

-#define AT91C_PWMC_CH2_CPRDR      (0xFFFCC248) // (PWMC_CH2) Channel Period Register

-#define AT91C_PWMC_CH2_CUPDR      (0xFFFCC250) // (PWMC_CH2) Channel Update Register

-#define AT91C_PWMC_CH2_CDTYR      (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register

-// ========== Register definition for PWMC_CH1 peripheral ========== 

-#define AT91C_PWMC_CH1_Reserved   (0xFFFCC234) // (PWMC_CH1) Reserved

-#define AT91C_PWMC_CH1_CUPDR      (0xFFFCC230) // (PWMC_CH1) Channel Update Register

-#define AT91C_PWMC_CH1_CPRDR      (0xFFFCC228) // (PWMC_CH1) Channel Period Register

-#define AT91C_PWMC_CH1_CCNTR      (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register

-#define AT91C_PWMC_CH1_CDTYR      (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register

-#define AT91C_PWMC_CH1_CMR        (0xFFFCC220) // (PWMC_CH1) Channel Mode Register

-// ========== Register definition for PWMC_CH0 peripheral ========== 

-#define AT91C_PWMC_CH0_Reserved   (0xFFFCC214) // (PWMC_CH0) Reserved

-#define AT91C_PWMC_CH0_CPRDR      (0xFFFCC208) // (PWMC_CH0) Channel Period Register

-#define AT91C_PWMC_CH0_CDTYR      (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register

-#define AT91C_PWMC_CH0_CMR        (0xFFFCC200) // (PWMC_CH0) Channel Mode Register

-#define AT91C_PWMC_CH0_CUPDR      (0xFFFCC210) // (PWMC_CH0) Channel Update Register

-#define AT91C_PWMC_CH0_CCNTR      (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register

-// ========== Register definition for PWMC peripheral ========== 

-#define AT91C_PWMC_IDR            (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register

-#define AT91C_PWMC_DIS            (0xFFFCC008) // (PWMC) PWMC Disable Register

-#define AT91C_PWMC_IER            (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register

-#define AT91C_PWMC_VR             (0xFFFCC0FC) // (PWMC) PWMC Version Register

-#define AT91C_PWMC_ISR            (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register

-#define AT91C_PWMC_SR             (0xFFFCC00C) // (PWMC) PWMC Status Register

-#define AT91C_PWMC_IMR            (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register

-#define AT91C_PWMC_MR             (0xFFFCC000) // (PWMC) PWMC Mode Register

-#define AT91C_PWMC_ENA            (0xFFFCC004) // (PWMC) PWMC Enable Register

-// ========== Register definition for UDP peripheral ========== 

-#define AT91C_UDP_IMR             (0xFFFB0018) // (UDP) Interrupt Mask Register

-#define AT91C_UDP_FADDR           (0xFFFB0008) // (UDP) Function Address Register

-#define AT91C_UDP_NUM             (0xFFFB0000) // (UDP) Frame Number Register

-#define AT91C_UDP_FDR             (0xFFFB0050) // (UDP) Endpoint FIFO Data Register

-#define AT91C_UDP_ISR             (0xFFFB001C) // (UDP) Interrupt Status Register

-#define AT91C_UDP_CSR             (0xFFFB0030) // (UDP) Endpoint Control and Status Register

-#define AT91C_UDP_IDR             (0xFFFB0014) // (UDP) Interrupt Disable Register

-#define AT91C_UDP_ICR             (0xFFFB0020) // (UDP) Interrupt Clear Register

-#define AT91C_UDP_RSTEP           (0xFFFB0028) // (UDP) Reset Endpoint Register

-#define AT91C_UDP_TXVC            (0xFFFB0074) // (UDP) Transceiver Control Register

-#define AT91C_UDP_GLBSTATE        (0xFFFB0004) // (UDP) Global State Register

-#define AT91C_UDP_IER             (0xFFFB0010) // (UDP) Interrupt Enable Register

-// ========== Register definition for TC0 peripheral ========== 

-#define AT91C_TC0_SR              (0xFFFA0020) // (TC0) Status Register

-#define AT91C_TC0_RC              (0xFFFA001C) // (TC0) Register C

-#define AT91C_TC0_RB              (0xFFFA0018) // (TC0) Register B

-#define AT91C_TC0_CCR             (0xFFFA0000) // (TC0) Channel Control Register

-#define AT91C_TC0_CMR             (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC0_IER             (0xFFFA0024) // (TC0) Interrupt Enable Register

-#define AT91C_TC0_RA              (0xFFFA0014) // (TC0) Register A

-#define AT91C_TC0_IDR             (0xFFFA0028) // (TC0) Interrupt Disable Register

-#define AT91C_TC0_CV              (0xFFFA0010) // (TC0) Counter Value

-#define AT91C_TC0_IMR             (0xFFFA002C) // (TC0) Interrupt Mask Register

-// ========== Register definition for TC1 peripheral ========== 

-#define AT91C_TC1_RB              (0xFFFA0058) // (TC1) Register B

-#define AT91C_TC1_CCR             (0xFFFA0040) // (TC1) Channel Control Register

-#define AT91C_TC1_IER             (0xFFFA0064) // (TC1) Interrupt Enable Register

-#define AT91C_TC1_IDR             (0xFFFA0068) // (TC1) Interrupt Disable Register

-#define AT91C_TC1_SR              (0xFFFA0060) // (TC1) Status Register

-#define AT91C_TC1_CMR             (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC1_RA              (0xFFFA0054) // (TC1) Register A

-#define AT91C_TC1_RC              (0xFFFA005C) // (TC1) Register C

-#define AT91C_TC1_IMR             (0xFFFA006C) // (TC1) Interrupt Mask Register

-#define AT91C_TC1_CV              (0xFFFA0050) // (TC1) Counter Value

-// ========== Register definition for TC2 peripheral ========== 

-#define AT91C_TC2_CMR             (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC2_CCR             (0xFFFA0080) // (TC2) Channel Control Register

-#define AT91C_TC2_CV              (0xFFFA0090) // (TC2) Counter Value

-#define AT91C_TC2_RA              (0xFFFA0094) // (TC2) Register A

-#define AT91C_TC2_RB              (0xFFFA0098) // (TC2) Register B

-#define AT91C_TC2_IDR             (0xFFFA00A8) // (TC2) Interrupt Disable Register

-#define AT91C_TC2_IMR             (0xFFFA00AC) // (TC2) Interrupt Mask Register

-#define AT91C_TC2_RC              (0xFFFA009C) // (TC2) Register C

-#define AT91C_TC2_IER             (0xFFFA00A4) // (TC2) Interrupt Enable Register

-#define AT91C_TC2_SR              (0xFFFA00A0) // (TC2) Status Register

-// ========== Register definition for TCB peripheral ========== 

-#define AT91C_TCB_BMR             (0xFFFA00C4) // (TCB) TC Block Mode Register

-#define AT91C_TCB_BCR             (0xFFFA00C0) // (TCB) TC Block Control Register

-// ========== Register definition for CAN_MB0 peripheral ========== 

-#define AT91C_CAN_MB0_MDL         (0xFFFD0214) // (CAN_MB0) MailBox Data Low Register

-#define AT91C_CAN_MB0_MAM         (0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB0_MCR         (0xFFFD021C) // (CAN_MB0) MailBox Control Register

-#define AT91C_CAN_MB0_MID         (0xFFFD0208) // (CAN_MB0) MailBox ID Register

-#define AT91C_CAN_MB0_MSR         (0xFFFD0210) // (CAN_MB0) MailBox Status Register

-#define AT91C_CAN_MB0_MFID        (0xFFFD020C) // (CAN_MB0) MailBox Family ID Register

-#define AT91C_CAN_MB0_MDH         (0xFFFD0218) // (CAN_MB0) MailBox Data High Register

-#define AT91C_CAN_MB0_MMR         (0xFFFD0200) // (CAN_MB0) MailBox Mode Register

-// ========== Register definition for CAN_MB1 peripheral ========== 

-#define AT91C_CAN_MB1_MDL         (0xFFFD0234) // (CAN_MB1) MailBox Data Low Register

-#define AT91C_CAN_MB1_MID         (0xFFFD0228) // (CAN_MB1) MailBox ID Register

-#define AT91C_CAN_MB1_MMR         (0xFFFD0220) // (CAN_MB1) MailBox Mode Register

-#define AT91C_CAN_MB1_MSR         (0xFFFD0230) // (CAN_MB1) MailBox Status Register

-#define AT91C_CAN_MB1_MAM         (0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB1_MDH         (0xFFFD0238) // (CAN_MB1) MailBox Data High Register

-#define AT91C_CAN_MB1_MCR         (0xFFFD023C) // (CAN_MB1) MailBox Control Register

-#define AT91C_CAN_MB1_MFID        (0xFFFD022C) // (CAN_MB1) MailBox Family ID Register

-// ========== Register definition for CAN_MB2 peripheral ========== 

-#define AT91C_CAN_MB2_MCR         (0xFFFD025C) // (CAN_MB2) MailBox Control Register

-#define AT91C_CAN_MB2_MDH         (0xFFFD0258) // (CAN_MB2) MailBox Data High Register

-#define AT91C_CAN_MB2_MID         (0xFFFD0248) // (CAN_MB2) MailBox ID Register

-#define AT91C_CAN_MB2_MDL         (0xFFFD0254) // (CAN_MB2) MailBox Data Low Register

-#define AT91C_CAN_MB2_MMR         (0xFFFD0240) // (CAN_MB2) MailBox Mode Register

-#define AT91C_CAN_MB2_MAM         (0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB2_MFID        (0xFFFD024C) // (CAN_MB2) MailBox Family ID Register

-#define AT91C_CAN_MB2_MSR         (0xFFFD0250) // (CAN_MB2) MailBox Status Register

-// ========== Register definition for CAN_MB3 peripheral ========== 

-#define AT91C_CAN_MB3_MFID        (0xFFFD026C) // (CAN_MB3) MailBox Family ID Register

-#define AT91C_CAN_MB3_MAM         (0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB3_MID         (0xFFFD0268) // (CAN_MB3) MailBox ID Register

-#define AT91C_CAN_MB3_MCR         (0xFFFD027C) // (CAN_MB3) MailBox Control Register

-#define AT91C_CAN_MB3_MMR         (0xFFFD0260) // (CAN_MB3) MailBox Mode Register

-#define AT91C_CAN_MB3_MSR         (0xFFFD0270) // (CAN_MB3) MailBox Status Register

-#define AT91C_CAN_MB3_MDL         (0xFFFD0274) // (CAN_MB3) MailBox Data Low Register

-#define AT91C_CAN_MB3_MDH         (0xFFFD0278) // (CAN_MB3) MailBox Data High Register

-// ========== Register definition for CAN_MB4 peripheral ========== 

-#define AT91C_CAN_MB4_MID         (0xFFFD0288) // (CAN_MB4) MailBox ID Register

-#define AT91C_CAN_MB4_MMR         (0xFFFD0280) // (CAN_MB4) MailBox Mode Register

-#define AT91C_CAN_MB4_MDH         (0xFFFD0298) // (CAN_MB4) MailBox Data High Register

-#define AT91C_CAN_MB4_MFID        (0xFFFD028C) // (CAN_MB4) MailBox Family ID Register

-#define AT91C_CAN_MB4_MSR         (0xFFFD0290) // (CAN_MB4) MailBox Status Register

-#define AT91C_CAN_MB4_MCR         (0xFFFD029C) // (CAN_MB4) MailBox Control Register

-#define AT91C_CAN_MB4_MDL         (0xFFFD0294) // (CAN_MB4) MailBox Data Low Register

-#define AT91C_CAN_MB4_MAM         (0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register

-// ========== Register definition for CAN_MB5 peripheral ========== 

-#define AT91C_CAN_MB5_MSR         (0xFFFD02B0) // (CAN_MB5) MailBox Status Register

-#define AT91C_CAN_MB5_MCR         (0xFFFD02BC) // (CAN_MB5) MailBox Control Register

-#define AT91C_CAN_MB5_MFID        (0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register

-#define AT91C_CAN_MB5_MDH         (0xFFFD02B8) // (CAN_MB5) MailBox Data High Register

-#define AT91C_CAN_MB5_MID         (0xFFFD02A8) // (CAN_MB5) MailBox ID Register

-#define AT91C_CAN_MB5_MMR         (0xFFFD02A0) // (CAN_MB5) MailBox Mode Register

-#define AT91C_CAN_MB5_MDL         (0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register

-#define AT91C_CAN_MB5_MAM         (0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register

-// ========== Register definition for CAN_MB6 peripheral ========== 

-#define AT91C_CAN_MB6_MFID        (0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register

-#define AT91C_CAN_MB6_MID         (0xFFFD02C8) // (CAN_MB6) MailBox ID Register

-#define AT91C_CAN_MB6_MAM         (0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB6_MSR         (0xFFFD02D0) // (CAN_MB6) MailBox Status Register

-#define AT91C_CAN_MB6_MDL         (0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register

-#define AT91C_CAN_MB6_MCR         (0xFFFD02DC) // (CAN_MB6) MailBox Control Register

-#define AT91C_CAN_MB6_MDH         (0xFFFD02D8) // (CAN_MB6) MailBox Data High Register

-#define AT91C_CAN_MB6_MMR         (0xFFFD02C0) // (CAN_MB6) MailBox Mode Register

-// ========== Register definition for CAN_MB7 peripheral ========== 

-#define AT91C_CAN_MB7_MCR         (0xFFFD02FC) // (CAN_MB7) MailBox Control Register

-#define AT91C_CAN_MB7_MDH         (0xFFFD02F8) // (CAN_MB7) MailBox Data High Register

-#define AT91C_CAN_MB7_MFID        (0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register

-#define AT91C_CAN_MB7_MDL         (0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register

-#define AT91C_CAN_MB7_MID         (0xFFFD02E8) // (CAN_MB7) MailBox ID Register

-#define AT91C_CAN_MB7_MMR         (0xFFFD02E0) // (CAN_MB7) MailBox Mode Register

-#define AT91C_CAN_MB7_MAM         (0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB7_MSR         (0xFFFD02F0) // (CAN_MB7) MailBox Status Register

-// ========== Register definition for CAN peripheral ========== 

-#define AT91C_CAN_TCR             (0xFFFD0024) // (CAN) Transfer Command Register

-#define AT91C_CAN_IMR             (0xFFFD000C) // (CAN) Interrupt Mask Register

-#define AT91C_CAN_IER             (0xFFFD0004) // (CAN) Interrupt Enable Register

-#define AT91C_CAN_ECR             (0xFFFD0020) // (CAN) Error Counter Register

-#define AT91C_CAN_TIMESTP         (0xFFFD001C) // (CAN) Time Stamp Register

-#define AT91C_CAN_MR              (0xFFFD0000) // (CAN) Mode Register

-#define AT91C_CAN_IDR             (0xFFFD0008) // (CAN) Interrupt Disable Register

-#define AT91C_CAN_ACR             (0xFFFD0028) // (CAN) Abort Command Register

-#define AT91C_CAN_TIM             (0xFFFD0018) // (CAN) Timer Register

-#define AT91C_CAN_SR              (0xFFFD0010) // (CAN) Status Register

-#define AT91C_CAN_BR              (0xFFFD0014) // (CAN) Baudrate Register

-#define AT91C_CAN_VR              (0xFFFD00FC) // (CAN) Version Register

-// ========== Register definition for EMAC peripheral ========== 

-#define AT91C_EMAC_ISR            (0xFFFDC024) // (EMAC) Interrupt Status Register

-#define AT91C_EMAC_SA4H           (0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes

-#define AT91C_EMAC_SA1L           (0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes

-#define AT91C_EMAC_ELE            (0xFFFDC078) // (EMAC) Excessive Length Errors Register

-#define AT91C_EMAC_LCOL           (0xFFFDC05C) // (EMAC) Late Collision Register

-#define AT91C_EMAC_RLE            (0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register

-#define AT91C_EMAC_WOL            (0xFFFDC0C4) // (EMAC) Wake On LAN Register

-#define AT91C_EMAC_DTF            (0xFFFDC058) // (EMAC) Deferred Transmission Frame Register

-#define AT91C_EMAC_TUND           (0xFFFDC064) // (EMAC) Transmit Underrun Error Register

-#define AT91C_EMAC_NCR            (0xFFFDC000) // (EMAC) Network Control Register

-#define AT91C_EMAC_SA4L           (0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes

-#define AT91C_EMAC_RSR            (0xFFFDC020) // (EMAC) Receive Status Register

-#define AT91C_EMAC_SA3L           (0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes

-#define AT91C_EMAC_TSR            (0xFFFDC014) // (EMAC) Transmit Status Register

-#define AT91C_EMAC_IDR            (0xFFFDC02C) // (EMAC) Interrupt Disable Register

-#define AT91C_EMAC_RSE            (0xFFFDC074) // (EMAC) Receive Symbol Errors Register

-#define AT91C_EMAC_ECOL           (0xFFFDC060) // (EMAC) Excessive Collision Register

-#define AT91C_EMAC_TID            (0xFFFDC0B8) // (EMAC) Type ID Checking Register

-#define AT91C_EMAC_HRB            (0xFFFDC090) // (EMAC) Hash Address Bottom[31:0]

-#define AT91C_EMAC_TBQP           (0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer

-#define AT91C_EMAC_USRIO          (0xFFFDC0C0) // (EMAC) USER Input/Output Register

-#define AT91C_EMAC_PTR            (0xFFFDC038) // (EMAC) Pause Time Register

-#define AT91C_EMAC_SA2H           (0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes

-#define AT91C_EMAC_ROV            (0xFFFDC070) // (EMAC) Receive Overrun Errors Register

-#define AT91C_EMAC_ALE            (0xFFFDC054) // (EMAC) Alignment Error Register

-#define AT91C_EMAC_RJA            (0xFFFDC07C) // (EMAC) Receive Jabbers Register

-#define AT91C_EMAC_RBQP           (0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer

-#define AT91C_EMAC_TPF            (0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register

-#define AT91C_EMAC_NCFGR          (0xFFFDC004) // (EMAC) Network Configuration Register

-#define AT91C_EMAC_HRT            (0xFFFDC094) // (EMAC) Hash Address Top[63:32]

-#define AT91C_EMAC_USF            (0xFFFDC080) // (EMAC) Undersize Frames Register

-#define AT91C_EMAC_FCSE           (0xFFFDC050) // (EMAC) Frame Check Sequence Error Register

-#define AT91C_EMAC_TPQ            (0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register

-#define AT91C_EMAC_MAN            (0xFFFDC034) // (EMAC) PHY Maintenance Register

-#define AT91C_EMAC_FTO            (0xFFFDC040) // (EMAC) Frames Transmitted OK Register

-#define AT91C_EMAC_REV            (0xFFFDC0FC) // (EMAC) Revision Register

-#define AT91C_EMAC_IMR            (0xFFFDC030) // (EMAC) Interrupt Mask Register

-#define AT91C_EMAC_SCF            (0xFFFDC044) // (EMAC) Single Collision Frame Register

-#define AT91C_EMAC_PFR            (0xFFFDC03C) // (EMAC) Pause Frames received Register

-#define AT91C_EMAC_MCF            (0xFFFDC048) // (EMAC) Multiple Collision Frame Register

-#define AT91C_EMAC_NSR            (0xFFFDC008) // (EMAC) Network Status Register

-#define AT91C_EMAC_SA2L           (0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes

-#define AT91C_EMAC_FRO            (0xFFFDC04C) // (EMAC) Frames Received OK Register

-#define AT91C_EMAC_IER            (0xFFFDC028) // (EMAC) Interrupt Enable Register

-#define AT91C_EMAC_SA1H           (0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes

-#define AT91C_EMAC_CSE            (0xFFFDC068) // (EMAC) Carrier Sense Error Register

-#define AT91C_EMAC_SA3H           (0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes

-#define AT91C_EMAC_RRE            (0xFFFDC06C) // (EMAC) Receive Ressource Error Register

-#define AT91C_EMAC_STE            (0xFFFDC084) // (EMAC) SQE Test Error Register

-// ========== Register definition for PDC_ADC peripheral ========== 

-#define AT91C_ADC_PTSR            (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register

-#define AT91C_ADC_PTCR            (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register

-#define AT91C_ADC_TNPR            (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register

-#define AT91C_ADC_TNCR            (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register

-#define AT91C_ADC_RNPR            (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register

-#define AT91C_ADC_RNCR            (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register

-#define AT91C_ADC_RPR             (0xFFFD8100) // (PDC_ADC) Receive Pointer Register

-#define AT91C_ADC_TCR             (0xFFFD810C) // (PDC_ADC) Transmit Counter Register

-#define AT91C_ADC_TPR             (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register

-#define AT91C_ADC_RCR             (0xFFFD8104) // (PDC_ADC) Receive Counter Register

-// ========== Register definition for ADC peripheral ========== 

-#define AT91C_ADC_CDR2            (0xFFFD8038) // (ADC) ADC Channel Data Register 2

-#define AT91C_ADC_CDR3            (0xFFFD803C) // (ADC) ADC Channel Data Register 3

-#define AT91C_ADC_CDR0            (0xFFFD8030) // (ADC) ADC Channel Data Register 0

-#define AT91C_ADC_CDR5            (0xFFFD8044) // (ADC) ADC Channel Data Register 5

-#define AT91C_ADC_CHDR            (0xFFFD8014) // (ADC) ADC Channel Disable Register

-#define AT91C_ADC_SR              (0xFFFD801C) // (ADC) ADC Status Register

-#define AT91C_ADC_CDR4            (0xFFFD8040) // (ADC) ADC Channel Data Register 4

-#define AT91C_ADC_CDR1            (0xFFFD8034) // (ADC) ADC Channel Data Register 1

-#define AT91C_ADC_LCDR            (0xFFFD8020) // (ADC) ADC Last Converted Data Register

-#define AT91C_ADC_IDR             (0xFFFD8028) // (ADC) ADC Interrupt Disable Register

-#define AT91C_ADC_CR              (0xFFFD8000) // (ADC) ADC Control Register

-#define AT91C_ADC_CDR7            (0xFFFD804C) // (ADC) ADC Channel Data Register 7

-#define AT91C_ADC_CDR6            (0xFFFD8048) // (ADC) ADC Channel Data Register 6

-#define AT91C_ADC_IER             (0xFFFD8024) // (ADC) ADC Interrupt Enable Register

-#define AT91C_ADC_CHER            (0xFFFD8010) // (ADC) ADC Channel Enable Register

-#define AT91C_ADC_CHSR            (0xFFFD8018) // (ADC) ADC Channel Status Register

-#define AT91C_ADC_MR              (0xFFFD8004) // (ADC) ADC Mode Register

-#define AT91C_ADC_IMR             (0xFFFD802C) // (ADC) ADC Interrupt Mask Register

-// ========== Register definition for PDC_AES peripheral ========== 

-#define AT91C_AES_TPR             (0xFFFA4108) // (PDC_AES) Transmit Pointer Register

-#define AT91C_AES_PTCR            (0xFFFA4120) // (PDC_AES) PDC Transfer Control Register

-#define AT91C_AES_RNPR            (0xFFFA4110) // (PDC_AES) Receive Next Pointer Register

-#define AT91C_AES_TNCR            (0xFFFA411C) // (PDC_AES) Transmit Next Counter Register

-#define AT91C_AES_TCR             (0xFFFA410C) // (PDC_AES) Transmit Counter Register

-#define AT91C_AES_RCR             (0xFFFA4104) // (PDC_AES) Receive Counter Register

-#define AT91C_AES_RNCR            (0xFFFA4114) // (PDC_AES) Receive Next Counter Register

-#define AT91C_AES_TNPR            (0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register

-#define AT91C_AES_RPR             (0xFFFA4100) // (PDC_AES) Receive Pointer Register

-#define AT91C_AES_PTSR            (0xFFFA4124) // (PDC_AES) PDC Transfer Status Register

-// ========== Register definition for AES peripheral ========== 

-#define AT91C_AES_IVxR            (0xFFFA4060) // (AES) Initialization Vector x Register

-#define AT91C_AES_MR              (0xFFFA4004) // (AES) Mode Register

-#define AT91C_AES_VR              (0xFFFA40FC) // (AES) AES Version Register

-#define AT91C_AES_ODATAxR         (0xFFFA4050) // (AES) Output Data x Register

-#define AT91C_AES_IDATAxR         (0xFFFA4040) // (AES) Input Data x Register

-#define AT91C_AES_CR              (0xFFFA4000) // (AES) Control Register

-#define AT91C_AES_IDR             (0xFFFA4014) // (AES) Interrupt Disable Register

-#define AT91C_AES_IMR             (0xFFFA4018) // (AES) Interrupt Mask Register

-#define AT91C_AES_IER             (0xFFFA4010) // (AES) Interrupt Enable Register

-#define AT91C_AES_KEYWxR          (0xFFFA4020) // (AES) Key Word x Register

-#define AT91C_AES_ISR             (0xFFFA401C) // (AES) Interrupt Status Register

-// ========== Register definition for PDC_TDES peripheral ========== 

-#define AT91C_TDES_RNCR           (0xFFFA8114) // (PDC_TDES) Receive Next Counter Register

-#define AT91C_TDES_TCR            (0xFFFA810C) // (PDC_TDES) Transmit Counter Register

-#define AT91C_TDES_RCR            (0xFFFA8104) // (PDC_TDES) Receive Counter Register

-#define AT91C_TDES_TNPR           (0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register

-#define AT91C_TDES_RNPR           (0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register

-#define AT91C_TDES_RPR            (0xFFFA8100) // (PDC_TDES) Receive Pointer Register

-#define AT91C_TDES_TNCR           (0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register

-#define AT91C_TDES_TPR            (0xFFFA8108) // (PDC_TDES) Transmit Pointer Register

-#define AT91C_TDES_PTSR           (0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register

-#define AT91C_TDES_PTCR           (0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register

-// ========== Register definition for TDES peripheral ========== 

-#define AT91C_TDES_KEY2WxR        (0xFFFA8028) // (TDES) Key 2 Word x Register

-#define AT91C_TDES_KEY3WxR        (0xFFFA8030) // (TDES) Key 3 Word x Register

-#define AT91C_TDES_IDR            (0xFFFA8014) // (TDES) Interrupt Disable Register

-#define AT91C_TDES_VR             (0xFFFA80FC) // (TDES) TDES Version Register

-#define AT91C_TDES_IVxR           (0xFFFA8060) // (TDES) Initialization Vector x Register

-#define AT91C_TDES_ODATAxR        (0xFFFA8050) // (TDES) Output Data x Register

-#define AT91C_TDES_IMR            (0xFFFA8018) // (TDES) Interrupt Mask Register

-#define AT91C_TDES_MR             (0xFFFA8004) // (TDES) Mode Register

-#define AT91C_TDES_CR             (0xFFFA8000) // (TDES) Control Register

-#define AT91C_TDES_IER            (0xFFFA8010) // (TDES) Interrupt Enable Register

-#define AT91C_TDES_ISR            (0xFFFA801C) // (TDES) Interrupt Status Register

-#define AT91C_TDES_IDATAxR        (0xFFFA8040) // (TDES) Input Data x Register

-#define AT91C_TDES_KEY1WxR        (0xFFFA8020) // (TDES) Key 1 Word x Register

-

-// *****************************************************************************

-//               PIO DEFINITIONS FOR AT91SAM7X128

-// *****************************************************************************

-#define AT91C_PIO_PA0             (1 <<  0) // Pin Controlled by PA0

-#define AT91C_PA0_RXD0            (AT91C_PIO_PA0) //  USART 0 Receive Data

-#define AT91C_PIO_PA1             (1 <<  1) // Pin Controlled by PA1

-#define AT91C_PA1_TXD0            (AT91C_PIO_PA1) //  USART 0 Transmit Data

-#define AT91C_PIO_PA10            (1 << 10) // Pin Controlled by PA10

-#define AT91C_PA10_TWD            (AT91C_PIO_PA10) //  TWI Two-wire Serial Data

-#define AT91C_PIO_PA11            (1 << 11) // Pin Controlled by PA11

-#define AT91C_PA11_TWCK           (AT91C_PIO_PA11) //  TWI Two-wire Serial Clock

-#define AT91C_PIO_PA12            (1 << 12) // Pin Controlled by PA12

-#define AT91C_PA12_NPCS00         (AT91C_PIO_PA12) //  SPI 0 Peripheral Chip Select 0

-#define AT91C_PIO_PA13            (1 << 13) // Pin Controlled by PA13

-#define AT91C_PA13_NPCS01         (AT91C_PIO_PA13) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PA13_PCK1           (AT91C_PIO_PA13) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PA14            (1 << 14) // Pin Controlled by PA14

-#define AT91C_PA14_NPCS02         (AT91C_PIO_PA14) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PA14_IRQ1           (AT91C_PIO_PA14) //  External Interrupt 1

-#define AT91C_PIO_PA15            (1 << 15) // Pin Controlled by PA15

-#define AT91C_PA15_NPCS03         (AT91C_PIO_PA15) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PA15_TCLK2          (AT91C_PIO_PA15) //  Timer Counter 2 external clock input

-#define AT91C_PIO_PA16            (1 << 16) // Pin Controlled by PA16

-#define AT91C_PA16_MISO0          (AT91C_PIO_PA16) //  SPI 0 Master In Slave

-#define AT91C_PIO_PA17            (1 << 17) // Pin Controlled by PA17

-#define AT91C_PA17_MOSI0          (AT91C_PIO_PA17) //  SPI 0 Master Out Slave

-#define AT91C_PIO_PA18            (1 << 18) // Pin Controlled by PA18

-#define AT91C_PA18_SPCK0          (AT91C_PIO_PA18) //  SPI 0 Serial Clock

-#define AT91C_PIO_PA19            (1 << 19) // Pin Controlled by PA19

-#define AT91C_PA19_CANRX          (AT91C_PIO_PA19) //  CAN Receive

-#define AT91C_PIO_PA2             (1 <<  2) // Pin Controlled by PA2

-#define AT91C_PA2_SCK0            (AT91C_PIO_PA2) //  USART 0 Serial Clock

-#define AT91C_PA2_NPCS11          (AT91C_PIO_PA2) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PA20            (1 << 20) // Pin Controlled by PA20

-#define AT91C_PA20_CANTX          (AT91C_PIO_PA20) //  CAN Transmit

-#define AT91C_PIO_PA21            (1 << 21) // Pin Controlled by PA21

-#define AT91C_PA21_TF             (AT91C_PIO_PA21) //  SSC Transmit Frame Sync

-#define AT91C_PA21_NPCS10         (AT91C_PIO_PA21) //  SPI 1 Peripheral Chip Select 0

-#define AT91C_PIO_PA22            (1 << 22) // Pin Controlled by PA22

-#define AT91C_PA22_TK             (AT91C_PIO_PA22) //  SSC Transmit Clock

-#define AT91C_PA22_SPCK1          (AT91C_PIO_PA22) //  SPI 1 Serial Clock

-#define AT91C_PIO_PA23            (1 << 23) // Pin Controlled by PA23

-#define AT91C_PA23_TD             (AT91C_PIO_PA23) //  SSC Transmit data

-#define AT91C_PA23_MOSI1          (AT91C_PIO_PA23) //  SPI 1 Master Out Slave

-#define AT91C_PIO_PA24            (1 << 24) // Pin Controlled by PA24

-#define AT91C_PA24_RD             (AT91C_PIO_PA24) //  SSC Receive Data

-#define AT91C_PA24_MISO1          (AT91C_PIO_PA24) //  SPI 1 Master In Slave

-#define AT91C_PIO_PA25            (1 << 25) // Pin Controlled by PA25

-#define AT91C_PA25_RK             (AT91C_PIO_PA25) //  SSC Receive Clock

-#define AT91C_PA25_NPCS11         (AT91C_PIO_PA25) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PA26            (1 << 26) // Pin Controlled by PA26

-#define AT91C_PA26_RF             (AT91C_PIO_PA26) //  SSC Receive Frame Sync

-#define AT91C_PA26_NPCS12         (AT91C_PIO_PA26) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PA27            (1 << 27) // Pin Controlled by PA27

-#define AT91C_PA27_DRXD           (AT91C_PIO_PA27) //  DBGU Debug Receive Data

-#define AT91C_PA27_PCK3           (AT91C_PIO_PA27) //  PMC Programmable Clock Output 3

-#define AT91C_PIO_PA28            (1 << 28) // Pin Controlled by PA28

-#define AT91C_PA28_DTXD           (AT91C_PIO_PA28) //  DBGU Debug Transmit Data

-#define AT91C_PIO_PA29            (1 << 29) // Pin Controlled by PA29

-#define AT91C_PA29_FIQ            (AT91C_PIO_PA29) //  AIC Fast Interrupt Input

-#define AT91C_PA29_NPCS13         (AT91C_PIO_PA29) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PA3             (1 <<  3) // Pin Controlled by PA3

-#define AT91C_PA3_RTS0            (AT91C_PIO_PA3) //  USART 0 Ready To Send

-#define AT91C_PA3_NPCS12          (AT91C_PIO_PA3) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PA30            (1 << 30) // Pin Controlled by PA30

-#define AT91C_PA30_IRQ0           (AT91C_PIO_PA30) //  External Interrupt 0

-#define AT91C_PA30_PCK2           (AT91C_PIO_PA30) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PA4             (1 <<  4) // Pin Controlled by PA4

-#define AT91C_PA4_CTS0            (AT91C_PIO_PA4) //  USART 0 Clear To Send

-#define AT91C_PA4_NPCS13          (AT91C_PIO_PA4) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PA5             (1 <<  5) // Pin Controlled by PA5

-#define AT91C_PA5_RXD1            (AT91C_PIO_PA5) //  USART 1 Receive Data

-#define AT91C_PIO_PA6             (1 <<  6) // Pin Controlled by PA6

-#define AT91C_PA6_TXD1            (AT91C_PIO_PA6) //  USART 1 Transmit Data

-#define AT91C_PIO_PA7             (1 <<  7) // Pin Controlled by PA7

-#define AT91C_PA7_SCK1            (AT91C_PIO_PA7) //  USART 1 Serial Clock

-#define AT91C_PA7_NPCS01          (AT91C_PIO_PA7) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PIO_PA8             (1 <<  8) // Pin Controlled by PA8

-#define AT91C_PA8_RTS1            (AT91C_PIO_PA8) //  USART 1 Ready To Send

-#define AT91C_PA8_NPCS02          (AT91C_PIO_PA8) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PIO_PA9             (1 <<  9) // Pin Controlled by PA9

-#define AT91C_PA9_CTS1            (AT91C_PIO_PA9) //  USART 1 Clear To Send

-#define AT91C_PA9_NPCS03          (AT91C_PIO_PA9) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PIO_PB0             (1 <<  0) // Pin Controlled by PB0

-#define AT91C_PB0_ETXCK_EREFCK    (AT91C_PIO_PB0) //  Ethernet MAC Transmit Clock/Reference Clock

-#define AT91C_PB0_PCK0            (AT91C_PIO_PB0) //  PMC Programmable Clock Output 0

-#define AT91C_PIO_PB1             (1 <<  1) // Pin Controlled by PB1

-#define AT91C_PB1_ETXEN           (AT91C_PIO_PB1) //  Ethernet MAC Transmit Enable

-#define AT91C_PIO_PB10            (1 << 10) // Pin Controlled by PB10

-#define AT91C_PB10_ETX2           (AT91C_PIO_PB10) //  Ethernet MAC Transmit Data 2

-#define AT91C_PB10_NPCS11         (AT91C_PIO_PB10) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PB11            (1 << 11) // Pin Controlled by PB11

-#define AT91C_PB11_ETX3           (AT91C_PIO_PB11) //  Ethernet MAC Transmit Data 3

-#define AT91C_PB11_NPCS12         (AT91C_PIO_PB11) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PB12            (1 << 12) // Pin Controlled by PB12

-#define AT91C_PB12_ETXER          (AT91C_PIO_PB12) //  Ethernet MAC Transmikt Coding Error

-#define AT91C_PB12_TCLK0          (AT91C_PIO_PB12) //  Timer Counter 0 external clock input

-#define AT91C_PIO_PB13            (1 << 13) // Pin Controlled by PB13

-#define AT91C_PB13_ERX2           (AT91C_PIO_PB13) //  Ethernet MAC Receive Data 2

-#define AT91C_PB13_NPCS01         (AT91C_PIO_PB13) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PIO_PB14            (1 << 14) // Pin Controlled by PB14

-#define AT91C_PB14_ERX3           (AT91C_PIO_PB14) //  Ethernet MAC Receive Data 3

-#define AT91C_PB14_NPCS02         (AT91C_PIO_PB14) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PIO_PB15            (1 << 15) // Pin Controlled by PB15

-#define AT91C_PB15_ERXDV          (AT91C_PIO_PB15) //  Ethernet MAC Receive Data Valid

-#define AT91C_PIO_PB16            (1 << 16) // Pin Controlled by PB16

-#define AT91C_PB16_ECOL           (AT91C_PIO_PB16) //  Ethernet MAC Collision Detected

-#define AT91C_PB16_NPCS13         (AT91C_PIO_PB16) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PB17            (1 << 17) // Pin Controlled by PB17

-#define AT91C_PB17_ERXCK          (AT91C_PIO_PB17) //  Ethernet MAC Receive Clock

-#define AT91C_PB17_NPCS03         (AT91C_PIO_PB17) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PIO_PB18            (1 << 18) // Pin Controlled by PB18

-#define AT91C_PB18_EF100          (AT91C_PIO_PB18) //  Ethernet MAC Force 100 Mbits/sec

-#define AT91C_PB18_ADTRG          (AT91C_PIO_PB18) //  ADC External Trigger

-#define AT91C_PIO_PB19            (1 << 19) // Pin Controlled by PB19

-#define AT91C_PB19_PWM0           (AT91C_PIO_PB19) //  PWM Channel 0

-#define AT91C_PB19_TCLK1          (AT91C_PIO_PB19) //  Timer Counter 1 external clock input

-#define AT91C_PIO_PB2             (1 <<  2) // Pin Controlled by PB2

-#define AT91C_PB2_ETX0            (AT91C_PIO_PB2) //  Ethernet MAC Transmit Data 0

-#define AT91C_PIO_PB20            (1 << 20) // Pin Controlled by PB20

-#define AT91C_PB20_PWM1           (AT91C_PIO_PB20) //  PWM Channel 1

-#define AT91C_PB20_PCK0           (AT91C_PIO_PB20) //  PMC Programmable Clock Output 0

-#define AT91C_PIO_PB21            (1 << 21) // Pin Controlled by PB21

-#define AT91C_PB21_PWM2           (AT91C_PIO_PB21) //  PWM Channel 2

-#define AT91C_PB21_PCK1           (AT91C_PIO_PB21) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PB22            (1 << 22) // Pin Controlled by PB22

-#define AT91C_PB22_PWM3           (AT91C_PIO_PB22) //  PWM Channel 3

-#define AT91C_PB22_PCK2           (AT91C_PIO_PB22) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PB23            (1 << 23) // Pin Controlled by PB23

-#define AT91C_PB23_TIOA0          (AT91C_PIO_PB23) //  Timer Counter 0 Multipurpose Timer I/O Pin A

-#define AT91C_PB23_DCD1           (AT91C_PIO_PB23) //  USART 1 Data Carrier Detect

-#define AT91C_PIO_PB24            (1 << 24) // Pin Controlled by PB24

-#define AT91C_PB24_TIOB0          (AT91C_PIO_PB24) //  Timer Counter 0 Multipurpose Timer I/O Pin B

-#define AT91C_PB24_DSR1           (AT91C_PIO_PB24) //  USART 1 Data Set ready

-#define AT91C_PIO_PB25            (1 << 25) // Pin Controlled by PB25

-#define AT91C_PB25_TIOA1          (AT91C_PIO_PB25) //  Timer Counter 1 Multipurpose Timer I/O Pin A

-#define AT91C_PB25_DTR1           (AT91C_PIO_PB25) //  USART 1 Data Terminal ready

-#define AT91C_PIO_PB26            (1 << 26) // Pin Controlled by PB26

-#define AT91C_PB26_TIOB1          (AT91C_PIO_PB26) //  Timer Counter 1 Multipurpose Timer I/O Pin B

-#define AT91C_PB26_RI1            (AT91C_PIO_PB26) //  USART 1 Ring Indicator

-#define AT91C_PIO_PB27            (1 << 27) // Pin Controlled by PB27

-#define AT91C_PB27_TIOA2          (AT91C_PIO_PB27) //  Timer Counter 2 Multipurpose Timer I/O Pin A

-#define AT91C_PB27_PWM0           (AT91C_PIO_PB27) //  PWM Channel 0

-#define AT91C_PIO_PB28            (1 << 28) // Pin Controlled by PB28

-#define AT91C_PB28_TIOB2          (AT91C_PIO_PB28) //  Timer Counter 2 Multipurpose Timer I/O Pin B

-#define AT91C_PB28_PWM1           (AT91C_PIO_PB28) //  PWM Channel 1

-#define AT91C_PIO_PB29            (1 << 29) // Pin Controlled by PB29

-#define AT91C_PB29_PCK1           (AT91C_PIO_PB29) //  PMC Programmable Clock Output 1

-#define AT91C_PB29_PWM2           (AT91C_PIO_PB29) //  PWM Channel 2

-#define AT91C_PIO_PB3             (1 <<  3) // Pin Controlled by PB3

-#define AT91C_PB3_ETX1            (AT91C_PIO_PB3) //  Ethernet MAC Transmit Data 1

-#define AT91C_PIO_PB30            (1 << 30) // Pin Controlled by PB30

-#define AT91C_PB30_PCK2           (AT91C_PIO_PB30) //  PMC Programmable Clock Output 2

-#define AT91C_PB30_PWM3           (AT91C_PIO_PB30) //  PWM Channel 3

-#define AT91C_PIO_PB4             (1 <<  4) // Pin Controlled by PB4

-#define AT91C_PB4_ECRS_ECRSDV     (AT91C_PIO_PB4) //  Ethernet MAC Carrier Sense/Carrier Sense and Data Valid

-#define AT91C_PIO_PB5             (1 <<  5) // Pin Controlled by PB5

-#define AT91C_PB5_ERX0            (AT91C_PIO_PB5) //  Ethernet MAC Receive Data 0

-#define AT91C_PIO_PB6             (1 <<  6) // Pin Controlled by PB6

-#define AT91C_PB6_ERX1            (AT91C_PIO_PB6) //  Ethernet MAC Receive Data 1

-#define AT91C_PIO_PB7             (1 <<  7) // Pin Controlled by PB7

-#define AT91C_PB7_ERXER           (AT91C_PIO_PB7) //  Ethernet MAC Receive Error

-#define AT91C_PIO_PB8             (1 <<  8) // Pin Controlled by PB8

-#define AT91C_PB8_EMDC            (AT91C_PIO_PB8) //  Ethernet MAC Management Data Clock

-#define AT91C_PIO_PB9             (1 <<  9) // Pin Controlled by PB9

-#define AT91C_PB9_EMDIO           (AT91C_PIO_PB9) //  Ethernet MAC Management Data Input/Output

-

-// *****************************************************************************

-//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7X128

-// *****************************************************************************

-#define AT91C_ID_FIQ              ( 0) // Advanced Interrupt Controller (FIQ)

-#define AT91C_ID_SYS              ( 1) // System Peripheral

-#define AT91C_ID_PIOA             ( 2) // Parallel IO Controller A

-#define AT91C_ID_PIOB             ( 3) // Parallel IO Controller B

-#define AT91C_ID_SPI0             ( 4) // Serial Peripheral Interface 0

-#define AT91C_ID_SPI1             ( 5) // Serial Peripheral Interface 1

-#define AT91C_ID_US0              ( 6) // USART 0

-#define AT91C_ID_US1              ( 7) // USART 1

-#define AT91C_ID_SSC              ( 8) // Serial Synchronous Controller

-#define AT91C_ID_TWI              ( 9) // Two-Wire Interface

-#define AT91C_ID_PWMC             (10) // PWM Controller

-#define AT91C_ID_UDP              (11) // USB Device Port

-#define AT91C_ID_TC0              (12) // Timer Counter 0

-#define AT91C_ID_TC1              (13) // Timer Counter 1

-#define AT91C_ID_TC2              (14) // Timer Counter 2

-#define AT91C_ID_CAN              (15) // Control Area Network Controller

-#define AT91C_ID_EMAC             (16) // Ethernet MAC

-#define AT91C_ID_ADC              (17) // Analog-to-Digital Converter

-#define AT91C_ID_AES              (18) // Advanced Encryption Standard 128-bit

-#define AT91C_ID_TDES             (19) // Triple Data Encryption Standard

-#define AT91C_ID_20_Reserved      (20) // Reserved

-#define AT91C_ID_21_Reserved      (21) // Reserved

-#define AT91C_ID_22_Reserved      (22) // Reserved

-#define AT91C_ID_23_Reserved      (23) // Reserved

-#define AT91C_ID_24_Reserved      (24) // Reserved

-#define AT91C_ID_25_Reserved      (25) // Reserved

-#define AT91C_ID_26_Reserved      (26) // Reserved

-#define AT91C_ID_27_Reserved      (27) // Reserved

-#define AT91C_ID_28_Reserved      (28) // Reserved

-#define AT91C_ID_29_Reserved      (29) // Reserved

-#define AT91C_ID_IRQ0             (30) // Advanced Interrupt Controller (IRQ0)

-#define AT91C_ID_IRQ1             (31) // Advanced Interrupt Controller (IRQ1)

-

-// *****************************************************************************

-//               BASE ADDRESS DEFINITIONS FOR AT91SAM7X128

-// *****************************************************************************

-#define AT91C_BASE_SYS            (0xFFFFF000) // (SYS) Base Address

-#define AT91C_BASE_AIC            (0xFFFFF000) // (AIC) Base Address

-#define AT91C_BASE_PDC_DBGU       (0xFFFFF300) // (PDC_DBGU) Base Address

-#define AT91C_BASE_DBGU           (0xFFFFF200) // (DBGU) Base Address

-#define AT91C_BASE_PIOA           (0xFFFFF400) // (PIOA) Base Address

-#define AT91C_BASE_PIOB           (0xFFFFF600) // (PIOB) Base Address

-#define AT91C_BASE_CKGR           (0xFFFFFC20) // (CKGR) Base Address

-#define AT91C_BASE_PMC            (0xFFFFFC00) // (PMC) Base Address

-#define AT91C_BASE_RSTC           (0xFFFFFD00) // (RSTC) Base Address

-#define AT91C_BASE_RTTC           (0xFFFFFD20) // (RTTC) Base Address

-#define AT91C_BASE_PITC           (0xFFFFFD30) // (PITC) Base Address

-#define AT91C_BASE_WDTC           (0xFFFFFD40) // (WDTC) Base Address

-#define AT91C_BASE_VREG           (0xFFFFFD60) // (VREG) Base Address

-#define AT91C_BASE_MC             (0xFFFFFF00) // (MC) Base Address

-#define AT91C_BASE_PDC_SPI1       (0xFFFE4100) // (PDC_SPI1) Base Address

-#define AT91C_BASE_SPI1           (0xFFFE4000) // (SPI1) Base Address

-#define AT91C_BASE_PDC_SPI0       (0xFFFE0100) // (PDC_SPI0) Base Address

-#define AT91C_BASE_SPI0           (0xFFFE0000) // (SPI0) Base Address

-#define AT91C_BASE_PDC_US1        (0xFFFC4100) // (PDC_US1) Base Address

-#define AT91C_BASE_US1            (0xFFFC4000) // (US1) Base Address

-#define AT91C_BASE_PDC_US0        (0xFFFC0100) // (PDC_US0) Base Address

-#define AT91C_BASE_US0            (0xFFFC0000) // (US0) Base Address

-#define AT91C_BASE_PDC_SSC        (0xFFFD4100) // (PDC_SSC) Base Address

-#define AT91C_BASE_SSC            (0xFFFD4000) // (SSC) Base Address

-#define AT91C_BASE_TWI            (0xFFFB8000) // (TWI) Base Address

-#define AT91C_BASE_PWMC_CH3       (0xFFFCC260) // (PWMC_CH3) Base Address

-#define AT91C_BASE_PWMC_CH2       (0xFFFCC240) // (PWMC_CH2) Base Address

-#define AT91C_BASE_PWMC_CH1       (0xFFFCC220) // (PWMC_CH1) Base Address

-#define AT91C_BASE_PWMC_CH0       (0xFFFCC200) // (PWMC_CH0) Base Address

-#define AT91C_BASE_PWMC           (0xFFFCC000) // (PWMC) Base Address

-#define AT91C_BASE_UDP            (0xFFFB0000) // (UDP) Base Address

-#define AT91C_BASE_TC0            (0xFFFA0000) // (TC0) Base Address

-#define AT91C_BASE_TC1            (0xFFFA0040) // (TC1) Base Address

-#define AT91C_BASE_TC2            (0xFFFA0080) // (TC2) Base Address

-#define AT91C_BASE_TCB            (0xFFFA0000) // (TCB) Base Address

-#define AT91C_BASE_CAN_MB0        (0xFFFD0200) // (CAN_MB0) Base Address

-#define AT91C_BASE_CAN_MB1        (0xFFFD0220) // (CAN_MB1) Base Address

-#define AT91C_BASE_CAN_MB2        (0xFFFD0240) // (CAN_MB2) Base Address

-#define AT91C_BASE_CAN_MB3        (0xFFFD0260) // (CAN_MB3) Base Address

-#define AT91C_BASE_CAN_MB4        (0xFFFD0280) // (CAN_MB4) Base Address

-#define AT91C_BASE_CAN_MB5        (0xFFFD02A0) // (CAN_MB5) Base Address

-#define AT91C_BASE_CAN_MB6        (0xFFFD02C0) // (CAN_MB6) Base Address

-#define AT91C_BASE_CAN_MB7        (0xFFFD02E0) // (CAN_MB7) Base Address

-#define AT91C_BASE_CAN            (0xFFFD0000) // (CAN) Base Address

-#define AT91C_BASE_EMAC           (0xFFFDC000) // (EMAC) Base Address

-#define AT91C_BASE_PDC_ADC        (0xFFFD8100) // (PDC_ADC) Base Address

-#define AT91C_BASE_ADC            (0xFFFD8000) // (ADC) Base Address

-#define AT91C_BASE_PDC_AES        (0xFFFA4100) // (PDC_AES) Base Address

-#define AT91C_BASE_AES            (0xFFFA4000) // (AES) Base Address

-#define AT91C_BASE_PDC_TDES       (0xFFFA8100) // (PDC_TDES) Base Address

-#define AT91C_BASE_TDES           (0xFFFA8000) // (TDES) Base Address

-

-// *****************************************************************************

-//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7X128

-// *****************************************************************************

-#define AT91C_ISRAM	              (0x00200000) // Internal SRAM base address

-#define AT91C_ISRAM_SIZE	         (0x00008000) // Internal SRAM size in byte (32 Kbyte)

-#define AT91C_IFLASH	             (0x00100000) // Internal ROM base address

-#define AT91C_IFLASH_SIZE	        (0x00020000) // Internal ROM size in byte (128 Kbyte)

-

-

+//  ----------------------------------------------------------------------------
+//          ATMEL Microcontroller Software Support  -  ROUSSET  -
+//  ----------------------------------------------------------------------------
+//  DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+//  DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//  ----------------------------------------------------------------------------
+// File Name           : AT91SAM7X128.h
+// Object              : AT91SAM7X128 definitions
+// Generated           : AT91 SW Application Group  05/20/2005 (16:22:23)
+//
+// CVS Reference       : /AT91SAM7X128.pl/1.14/Tue May 10 12:12:05 2005//
+// CVS Reference       : /SYS_SAM7X.pl/1.3/Tue Feb  1 17:01:43 2005//
+// CVS Reference       : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005//
+// CVS Reference       : /PMC_SAM7X.pl/1.4/Tue Feb  8 13:58:10 2005//
+// CVS Reference       : /RSTC_SAM7X.pl/1.1/Tue Feb  1 16:16:26 2005//
+// CVS Reference       : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005//
+// CVS Reference       : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005//
+// CVS Reference       : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005//
+// CVS Reference       : /PIO_6057A.pl/1.2/Thu Feb  3 10:18:28 2005//
+// CVS Reference       : /RTTC_6081A.pl/1.2/Tue Nov  9 14:43:58 2004//
+// CVS Reference       : /PITC_6079A.pl/1.2/Tue Nov  9 14:43:56 2004//
+// CVS Reference       : /WDTC_6080A.pl/1.3/Tue Nov  9 14:44:00 2004//
+// CVS Reference       : /VREG_6085B.pl/1.1/Tue Feb  1 16:05:48 2005//
+// CVS Reference       : /PDC_6074C.pl/1.2/Thu Feb  3 08:48:54 2005//
+// CVS Reference       : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005//
+// CVS Reference       : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005//
+// CVS Reference       : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004//
+// CVS Reference       : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004//
+// CVS Reference       : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004//
+// CVS Reference       : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005//
+// CVS Reference       : /CAN_6019B.pl/1.1/Tue Mar  8 12:42:22 2005//
+// CVS Reference       : /EMACB_6119A.pl/1.5/Thu Feb  3 15:52:04 2005//
+// CVS Reference       : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003//
+// CVS Reference       : /AES_6149A.pl/1.10/Mon Feb  7 09:44:25 2005//
+// CVS Reference       : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005//
+//  ----------------------------------------------------------------------------
+
+// Hardware register definition
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR System Peripherals
+// *****************************************************************************
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller
+// *****************************************************************************
+// *** Register offset in AT91S_AIC structure ***
+#define AIC_SMR         ( 0) // Source Mode Register
+#define AIC_SVR         (128) // Source Vector Register
+#define AIC_IVR         (256) // IRQ Vector Register
+#define AIC_FVR         (260) // FIQ Vector Register
+#define AIC_ISR         (264) // Interrupt Status Register
+#define AIC_IPR         (268) // Interrupt Pending Register
+#define AIC_IMR         (272) // Interrupt Mask Register
+#define AIC_CISR        (276) // Core Interrupt Status Register
+#define AIC_IECR        (288) // Interrupt Enable Command Register
+#define AIC_IDCR        (292) // Interrupt Disable Command Register
+#define AIC_ICCR        (296) // Interrupt Clear Command Register
+#define AIC_ISCR        (300) // Interrupt Set Command Register
+#define AIC_EOICR       (304) // End of Interrupt Command Register
+#define AIC_SPU         (308) // Spurious Vector Register
+#define AIC_DCR         (312) // Debug Control Register (Protect)
+#define AIC_FFER        (320) // Fast Forcing Enable Register
+#define AIC_FFDR        (324) // Fast Forcing Disable Register
+#define AIC_FFSR        (328) // Fast Forcing Status Register
+// -------- AIC_SMR : (AIC Offset: 0x0) Control Register --------
+#define AT91C_AIC_PRIOR           (0x7 <<  0) // (AIC) Priority Level
+#define     AT91C_AIC_PRIOR_LOWEST               (0x0) // (AIC) Lowest priority level
+#define     AT91C_AIC_PRIOR_HIGHEST              (0x7) // (AIC) Highest priority level
+#define AT91C_AIC_SRCTYPE         (0x3 <<  5) // (AIC) Interrupt Source Type
+#define     AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL       (0x0 <<  5) // (AIC) Internal Sources Code Label High-level Sensitive
+#define     AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL        (0x0 <<  5) // (AIC) External Sources Code Label Low-level Sensitive
+#define     AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE    (0x1 <<  5) // (AIC) Internal Sources Code Label Positive Edge triggered
+#define     AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE    (0x1 <<  5) // (AIC) External Sources Code Label Negative Edge triggered
+#define     AT91C_AIC_SRCTYPE_HIGH_LEVEL           (0x2 <<  5) // (AIC) Internal Or External Sources Code Label High-level Sensitive
+#define     AT91C_AIC_SRCTYPE_POSITIVE_EDGE        (0x3 <<  5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered
+// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register --------
+#define AT91C_AIC_NFIQ            (0x1 <<  0) // (AIC) NFIQ Status
+#define AT91C_AIC_NIRQ            (0x1 <<  1) // (AIC) NIRQ Status
+// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) --------
+#define AT91C_AIC_DCR_PROT        (0x1 <<  0) // (AIC) Protection Mode
+#define AT91C_AIC_DCR_GMSK        (0x1 <<  1) // (AIC) General Mask
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Peripheral DMA Controller
+// *****************************************************************************
+// *** Register offset in AT91S_PDC structure ***
+#define PDC_RPR         ( 0) // Receive Pointer Register
+#define PDC_RCR         ( 4) // Receive Counter Register
+#define PDC_TPR         ( 8) // Transmit Pointer Register
+#define PDC_TCR         (12) // Transmit Counter Register
+#define PDC_RNPR        (16) // Receive Next Pointer Register
+#define PDC_RNCR        (20) // Receive Next Counter Register
+#define PDC_TNPR        (24) // Transmit Next Pointer Register
+#define PDC_TNCR        (28) // Transmit Next Counter Register
+#define PDC_PTCR        (32) // PDC Transfer Control Register
+#define PDC_PTSR        (36) // PDC Transfer Status Register
+// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register --------
+#define AT91C_PDC_RXTEN           (0x1 <<  0) // (PDC) Receiver Transfer Enable
+#define AT91C_PDC_RXTDIS          (0x1 <<  1) // (PDC) Receiver Transfer Disable
+#define AT91C_PDC_TXTEN           (0x1 <<  8) // (PDC) Transmitter Transfer Enable
+#define AT91C_PDC_TXTDIS          (0x1 <<  9) // (PDC) Transmitter Transfer Disable
+// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Debug Unit
+// *****************************************************************************
+// *** Register offset in AT91S_DBGU structure ***
+#define DBGU_CR         ( 0) // Control Register
+#define DBGU_MR         ( 4) // Mode Register
+#define DBGU_IER        ( 8) // Interrupt Enable Register
+#define DBGU_IDR        (12) // Interrupt Disable Register
+#define DBGU_IMR        (16) // Interrupt Mask Register
+#define DBGU_CSR        (20) // Channel Status Register
+#define DBGU_RHR        (24) // Receiver Holding Register
+#define DBGU_THR        (28) // Transmitter Holding Register
+#define DBGU_BRGR       (32) // Baud Rate Generator Register
+#define DBGU_CIDR       (64) // Chip ID Register
+#define DBGU_EXID       (68) // Chip ID Extension Register
+#define DBGU_FNTR       (72) // Force NTRST Register
+#define DBGU_RPR        (256) // Receive Pointer Register
+#define DBGU_RCR        (260) // Receive Counter Register
+#define DBGU_TPR        (264) // Transmit Pointer Register
+#define DBGU_TCR        (268) // Transmit Counter Register
+#define DBGU_RNPR       (272) // Receive Next Pointer Register
+#define DBGU_RNCR       (276) // Receive Next Counter Register
+#define DBGU_TNPR       (280) // Transmit Next Pointer Register
+#define DBGU_TNCR       (284) // Transmit Next Counter Register
+#define DBGU_PTCR       (288) // PDC Transfer Control Register
+#define DBGU_PTSR       (292) // PDC Transfer Status Register
+// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_RSTRX            (0x1 <<  2) // (DBGU) Reset Receiver
+#define AT91C_US_RSTTX            (0x1 <<  3) // (DBGU) Reset Transmitter
+#define AT91C_US_RXEN             (0x1 <<  4) // (DBGU) Receiver Enable
+#define AT91C_US_RXDIS            (0x1 <<  5) // (DBGU) Receiver Disable
+#define AT91C_US_TXEN             (0x1 <<  6) // (DBGU) Transmitter Enable
+#define AT91C_US_TXDIS            (0x1 <<  7) // (DBGU) Transmitter Disable
+#define AT91C_US_RSTSTA           (0x1 <<  8) // (DBGU) Reset Status Bits
+// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_PAR              (0x7 <<  9) // (DBGU) Parity type
+#define     AT91C_US_PAR_EVEN                 (0x0 <<  9) // (DBGU) Even Parity
+#define     AT91C_US_PAR_ODD                  (0x1 <<  9) // (DBGU) Odd Parity
+#define     AT91C_US_PAR_SPACE                (0x2 <<  9) // (DBGU) Parity forced to 0 (Space)
+#define     AT91C_US_PAR_MARK                 (0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)
+#define     AT91C_US_PAR_NONE                 (0x4 <<  9) // (DBGU) No Parity
+#define     AT91C_US_PAR_MULTI_DROP           (0x6 <<  9) // (DBGU) Multi-drop mode
+#define AT91C_US_CHMODE           (0x3 << 14) // (DBGU) Channel Mode
+#define     AT91C_US_CHMODE_NORMAL               (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.
+#define     AT91C_US_CHMODE_AUTO                 (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.
+#define     AT91C_US_CHMODE_LOCAL                (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.
+#define     AT91C_US_CHMODE_REMOTE               (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.
+// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXRDY            (0x1 <<  0) // (DBGU) RXRDY Interrupt
+#define AT91C_US_TXRDY            (0x1 <<  1) // (DBGU) TXRDY Interrupt
+#define AT91C_US_ENDRX            (0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt
+#define AT91C_US_ENDTX            (0x1 <<  4) // (DBGU) End of Transmit Interrupt
+#define AT91C_US_OVRE             (0x1 <<  5) // (DBGU) Overrun Interrupt
+#define AT91C_US_FRAME            (0x1 <<  6) // (DBGU) Framing Error Interrupt
+#define AT91C_US_PARE             (0x1 <<  7) // (DBGU) Parity Error Interrupt
+#define AT91C_US_TXEMPTY          (0x1 <<  9) // (DBGU) TXEMPTY Interrupt
+#define AT91C_US_TXBUFE           (0x1 << 11) // (DBGU) TXBUFE Interrupt
+#define AT91C_US_RXBUFF           (0x1 << 12) // (DBGU) RXBUFF Interrupt
+#define AT91C_US_COMM_TX          (0x1 << 30) // (DBGU) COMM_TX Interrupt
+#define AT91C_US_COMM_RX          (0x1 << 31) // (DBGU) COMM_RX Interrupt
+// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register --------
+// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register --------
+#define AT91C_US_FORCE_NTRST      (0x1 <<  0) // (DBGU) Force NTRST in JTAG
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler
+// *****************************************************************************
+// *** Register offset in AT91S_PIO structure ***
+#define PIO_PER         ( 0) // PIO Enable Register
+#define PIO_PDR         ( 4) // PIO Disable Register
+#define PIO_PSR         ( 8) // PIO Status Register
+#define PIO_OER         (16) // Output Enable Register
+#define PIO_ODR         (20) // Output Disable Registerr
+#define PIO_OSR         (24) // Output Status Register
+#define PIO_IFER        (32) // Input Filter Enable Register
+#define PIO_IFDR        (36) // Input Filter Disable Register
+#define PIO_IFSR        (40) // Input Filter Status Register
+#define PIO_SODR        (48) // Set Output Data Register
+#define PIO_CODR        (52) // Clear Output Data Register
+#define PIO_ODSR        (56) // Output Data Status Register
+#define PIO_PDSR        (60) // Pin Data Status Register
+#define PIO_IER         (64) // Interrupt Enable Register
+#define PIO_IDR         (68) // Interrupt Disable Register
+#define PIO_IMR         (72) // Interrupt Mask Register
+#define PIO_ISR         (76) // Interrupt Status Register
+#define PIO_MDER        (80) // Multi-driver Enable Register
+#define PIO_MDDR        (84) // Multi-driver Disable Register
+#define PIO_MDSR        (88) // Multi-driver Status Register
+#define PIO_PPUDR       (96) // Pull-up Disable Register
+#define PIO_PPUER       (100) // Pull-up Enable Register
+#define PIO_PPUSR       (104) // Pull-up Status Register
+#define PIO_ASR         (112) // Select A Register
+#define PIO_BSR         (116) // Select B Register
+#define PIO_ABSR        (120) // AB Select Status Register
+#define PIO_OWER        (160) // Output Write Enable Register
+#define PIO_OWDR        (164) // Output Write Disable Register
+#define PIO_OWSR        (168) // Output Write Status Register
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Clock Generator Controler
+// *****************************************************************************
+// *** Register offset in AT91S_CKGR structure ***
+#define CKGR_MOR        ( 0) // Main Oscillator Register
+#define CKGR_MCFR       ( 4) // Main Clock  Frequency Register
+#define CKGR_PLLR       (12) // PLL Register
+// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register --------
+#define AT91C_CKGR_MOSCEN         (0x1 <<  0) // (CKGR) Main Oscillator Enable
+#define AT91C_CKGR_OSCBYPASS      (0x1 <<  1) // (CKGR) Main Oscillator Bypass
+#define AT91C_CKGR_OSCOUNT        (0xFF <<  8) // (CKGR) Main Oscillator Start-up Time
+// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register --------
+#define AT91C_CKGR_MAINF          (0xFFFF <<  0) // (CKGR) Main Clock Frequency
+#define AT91C_CKGR_MAINRDY        (0x1 << 16) // (CKGR) Main Clock Ready
+// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register --------
+#define AT91C_CKGR_DIV            (0xFF <<  0) // (CKGR) Divider Selected
+#define     AT91C_CKGR_DIV_0                    (0x0) // (CKGR) Divider output is 0
+#define     AT91C_CKGR_DIV_BYPASS               (0x1) // (CKGR) Divider is bypassed
+#define AT91C_CKGR_PLLCOUNT       (0x3F <<  8) // (CKGR) PLL Counter
+#define AT91C_CKGR_OUT            (0x3 << 14) // (CKGR) PLL Output Frequency Range
+#define     AT91C_CKGR_OUT_0                    (0x0 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_1                    (0x1 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_2                    (0x2 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_3                    (0x3 << 14) // (CKGR) Please refer to the PLL datasheet
+#define AT91C_CKGR_MUL            (0x7FF << 16) // (CKGR) PLL Multiplier
+#define AT91C_CKGR_USBDIV         (0x3 << 28) // (CKGR) Divider for USB Clocks
+#define     AT91C_CKGR_USBDIV_0                    (0x0 << 28) // (CKGR) Divider output is PLL clock output
+#define     AT91C_CKGR_USBDIV_1                    (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2
+#define     AT91C_CKGR_USBDIV_2                    (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Power Management Controler
+// *****************************************************************************
+// *** Register offset in AT91S_PMC structure ***
+#define PMC_SCER        ( 0) // System Clock Enable Register
+#define PMC_SCDR        ( 4) // System Clock Disable Register
+#define PMC_SCSR        ( 8) // System Clock Status Register
+#define PMC_PCER        (16) // Peripheral Clock Enable Register
+#define PMC_PCDR        (20) // Peripheral Clock Disable Register
+#define PMC_PCSR        (24) // Peripheral Clock Status Register
+#define PMC_MOR         (32) // Main Oscillator Register
+#define PMC_MCFR        (36) // Main Clock  Frequency Register
+#define PMC_PLLR        (44) // PLL Register
+#define PMC_MCKR        (48) // Master Clock Register
+#define PMC_PCKR        (64) // Programmable Clock Register
+#define PMC_IER         (96) // Interrupt Enable Register
+#define PMC_IDR         (100) // Interrupt Disable Register
+#define PMC_SR          (104) // Status Register
+#define PMC_IMR         (108) // Interrupt Mask Register
+// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register --------
+#define AT91C_PMC_PCK             (0x1 <<  0) // (PMC) Processor Clock
+#define AT91C_PMC_UDP             (0x1 <<  7) // (PMC) USB Device Port Clock
+#define AT91C_PMC_PCK0            (0x1 <<  8) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK1            (0x1 <<  9) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK2            (0x1 << 10) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK3            (0x1 << 11) // (PMC) Programmable Clock Output
+// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register --------
+// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register --------
+// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register --------
+// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register --------
+// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register --------
+// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register --------
+#define AT91C_PMC_CSS             (0x3 <<  0) // (PMC) Programmable Clock Selection
+#define     AT91C_PMC_CSS_SLOW_CLK             (0x0) // (PMC) Slow Clock is selected
+#define     AT91C_PMC_CSS_MAIN_CLK             (0x1) // (PMC) Main Clock is selected
+#define     AT91C_PMC_CSS_PLL_CLK              (0x3) // (PMC) Clock from PLL is selected
+#define AT91C_PMC_PRES            (0x7 <<  2) // (PMC) Programmable Clock Prescaler
+#define     AT91C_PMC_PRES_CLK                  (0x0 <<  2) // (PMC) Selected clock
+#define     AT91C_PMC_PRES_CLK_2                (0x1 <<  2) // (PMC) Selected clock divided by 2
+#define     AT91C_PMC_PRES_CLK_4                (0x2 <<  2) // (PMC) Selected clock divided by 4
+#define     AT91C_PMC_PRES_CLK_8                (0x3 <<  2) // (PMC) Selected clock divided by 8
+#define     AT91C_PMC_PRES_CLK_16               (0x4 <<  2) // (PMC) Selected clock divided by 16
+#define     AT91C_PMC_PRES_CLK_32               (0x5 <<  2) // (PMC) Selected clock divided by 32
+#define     AT91C_PMC_PRES_CLK_64               (0x6 <<  2) // (PMC) Selected clock divided by 64
+// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register --------
+// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register --------
+#define AT91C_PMC_MOSCS           (0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask
+#define AT91C_PMC_LOCK            (0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask
+#define AT91C_PMC_MCKRDY          (0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK0RDY         (0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK1RDY         (0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK2RDY         (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK3RDY         (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask
+// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register --------
+// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register --------
+// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Reset Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_RSTC structure ***
+#define RSTC_RCR        ( 0) // Reset Control Register
+#define RSTC_RSR        ( 4) // Reset Status Register
+#define RSTC_RMR        ( 8) // Reset Mode Register
+// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register --------
+#define AT91C_RSTC_PROCRST        (0x1 <<  0) // (RSTC) Processor Reset
+#define AT91C_RSTC_PERRST         (0x1 <<  2) // (RSTC) Peripheral Reset
+#define AT91C_RSTC_EXTRST         (0x1 <<  3) // (RSTC) External Reset
+#define AT91C_RSTC_KEY            (0xFF << 24) // (RSTC) Password
+// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register --------
+#define AT91C_RSTC_URSTS          (0x1 <<  0) // (RSTC) User Reset Status
+#define AT91C_RSTC_BODSTS         (0x1 <<  1) // (RSTC) Brownout Detection Status
+#define AT91C_RSTC_RSTTYP         (0x7 <<  8) // (RSTC) Reset Type
+#define     AT91C_RSTC_RSTTYP_POWERUP              (0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.
+#define     AT91C_RSTC_RSTTYP_WAKEUP               (0x1 <<  8) // (RSTC) WakeUp Reset. VDDCORE rising.
+#define     AT91C_RSTC_RSTTYP_WATCHDOG             (0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.
+#define     AT91C_RSTC_RSTTYP_SOFTWARE             (0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.
+#define     AT91C_RSTC_RSTTYP_USER                 (0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.
+#define     AT91C_RSTC_RSTTYP_BROWNOUT             (0x5 <<  8) // (RSTC) Brownout Reset occured.
+#define AT91C_RSTC_NRSTL          (0x1 << 16) // (RSTC) NRST pin level
+#define AT91C_RSTC_SRCMP          (0x1 << 17) // (RSTC) Software Reset Command in Progress.
+// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register --------
+#define AT91C_RSTC_URSTEN         (0x1 <<  0) // (RSTC) User Reset Enable
+#define AT91C_RSTC_URSTIEN        (0x1 <<  4) // (RSTC) User Reset Interrupt Enable
+#define AT91C_RSTC_ERSTL          (0xF <<  8) // (RSTC) User Reset Enable
+#define AT91C_RSTC_BODIEN         (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_RTTC structure ***
+#define RTTC_RTMR       ( 0) // Real-time Mode Register
+#define RTTC_RTAR       ( 4) // Real-time Alarm Register
+#define RTTC_RTVR       ( 8) // Real-time Value Register
+#define RTTC_RTSR       (12) // Real-time Status Register
+// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register --------
+#define AT91C_RTTC_RTPRES         (0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value
+#define AT91C_RTTC_ALMIEN         (0x1 << 16) // (RTTC) Alarm Interrupt Enable
+#define AT91C_RTTC_RTTINCIEN      (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable
+#define AT91C_RTTC_RTTRST         (0x1 << 18) // (RTTC) Real Time Timer Restart
+// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register --------
+#define AT91C_RTTC_ALMV           (0x0 <<  0) // (RTTC) Alarm Value
+// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register --------
+#define AT91C_RTTC_CRTV           (0x0 <<  0) // (RTTC) Current Real-time Value
+// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register --------
+#define AT91C_RTTC_ALMS           (0x1 <<  0) // (RTTC) Real-time Alarm Status
+#define AT91C_RTTC_RTTINC         (0x1 <<  1) // (RTTC) Real-time Timer Increment
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_PITC structure ***
+#define PITC_PIMR       ( 0) // Period Interval Mode Register
+#define PITC_PISR       ( 4) // Period Interval Status Register
+#define PITC_PIVR       ( 8) // Period Interval Value Register
+#define PITC_PIIR       (12) // Period Interval Image Register
+// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register --------
+#define AT91C_PITC_PIV            (0xFFFFF <<  0) // (PITC) Periodic Interval Value
+#define AT91C_PITC_PITEN          (0x1 << 24) // (PITC) Periodic Interval Timer Enabled
+#define AT91C_PITC_PITIEN         (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable
+// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register --------
+#define AT91C_PITC_PITS           (0x1 <<  0) // (PITC) Periodic Interval Timer Status
+// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register --------
+#define AT91C_PITC_CPIV           (0xFFFFF <<  0) // (PITC) Current Periodic Interval Value
+#define AT91C_PITC_PICNT          (0xFFF << 20) // (PITC) Periodic Interval Counter
+// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_WDTC structure ***
+#define WDTC_WDCR       ( 0) // Watchdog Control Register
+#define WDTC_WDMR       ( 4) // Watchdog Mode Register
+#define WDTC_WDSR       ( 8) // Watchdog Status Register
+// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register --------
+#define AT91C_WDTC_WDRSTT         (0x1 <<  0) // (WDTC) Watchdog Restart
+#define AT91C_WDTC_KEY            (0xFF << 24) // (WDTC) Watchdog KEY Password
+// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register --------
+#define AT91C_WDTC_WDV            (0xFFF <<  0) // (WDTC) Watchdog Timer Restart
+#define AT91C_WDTC_WDFIEN         (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable
+#define AT91C_WDTC_WDRSTEN        (0x1 << 13) // (WDTC) Watchdog Reset Enable
+#define AT91C_WDTC_WDRPROC        (0x1 << 14) // (WDTC) Watchdog Timer Restart
+#define AT91C_WDTC_WDDIS          (0x1 << 15) // (WDTC) Watchdog Disable
+#define AT91C_WDTC_WDD            (0xFFF << 16) // (WDTC) Watchdog Delta Value
+#define AT91C_WDTC_WDDBGHLT       (0x1 << 28) // (WDTC) Watchdog Debug Halt
+#define AT91C_WDTC_WDIDLEHLT      (0x1 << 29) // (WDTC) Watchdog Idle Halt
+// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register --------
+#define AT91C_WDTC_WDUNF          (0x1 <<  0) // (WDTC) Watchdog Underflow
+#define AT91C_WDTC_WDERR          (0x1 <<  1) // (WDTC) Watchdog Error
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Voltage Regulator Mode Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_VREG structure ***
+#define VREG_MR         ( 0) // Voltage Regulator Mode Register
+// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register --------
+#define AT91C_VREG_PSTDBY         (0x1 <<  0) // (VREG) Voltage Regulator Power Standby Mode
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Memory Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_MC structure ***
+#define MC_RCR          ( 0) // MC Remap Control Register
+#define MC_ASR          ( 4) // MC Abort Status Register
+#define MC_AASR         ( 8) // MC Abort Address Status Register
+#define MC_FMR          (96) // MC Flash Mode Register
+#define MC_FCR          (100) // MC Flash Command Register
+#define MC_FSR          (104) // MC Flash Status Register
+// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register --------
+#define AT91C_MC_RCB              (0x1 <<  0) // (MC) Remap Command Bit
+// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register --------
+#define AT91C_MC_UNDADD           (0x1 <<  0) // (MC) Undefined Addess Abort Status
+#define AT91C_MC_MISADD           (0x1 <<  1) // (MC) Misaligned Addess Abort Status
+#define AT91C_MC_ABTSZ            (0x3 <<  8) // (MC) Abort Size Status
+#define     AT91C_MC_ABTSZ_BYTE                 (0x0 <<  8) // (MC) Byte
+#define     AT91C_MC_ABTSZ_HWORD                (0x1 <<  8) // (MC) Half-word
+#define     AT91C_MC_ABTSZ_WORD                 (0x2 <<  8) // (MC) Word
+#define AT91C_MC_ABTTYP           (0x3 << 10) // (MC) Abort Type Status
+#define     AT91C_MC_ABTTYP_DATAR                (0x0 << 10) // (MC) Data Read
+#define     AT91C_MC_ABTTYP_DATAW                (0x1 << 10) // (MC) Data Write
+#define     AT91C_MC_ABTTYP_FETCH                (0x2 << 10) // (MC) Code Fetch
+#define AT91C_MC_MST0             (0x1 << 16) // (MC) Master 0 Abort Source
+#define AT91C_MC_MST1             (0x1 << 17) // (MC) Master 1 Abort Source
+#define AT91C_MC_SVMST0           (0x1 << 24) // (MC) Saved Master 0 Abort Source
+#define AT91C_MC_SVMST1           (0x1 << 25) // (MC) Saved Master 1 Abort Source
+// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register --------
+#define AT91C_MC_FRDY             (0x1 <<  0) // (MC) Flash Ready
+#define AT91C_MC_LOCKE            (0x1 <<  2) // (MC) Lock Error
+#define AT91C_MC_PROGE            (0x1 <<  3) // (MC) Programming Error
+#define AT91C_MC_NEBP             (0x1 <<  7) // (MC) No Erase Before Programming
+#define AT91C_MC_FWS              (0x3 <<  8) // (MC) Flash Wait State
+#define     AT91C_MC_FWS_0FWS                 (0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations
+#define     AT91C_MC_FWS_1FWS                 (0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations
+#define     AT91C_MC_FWS_2FWS                 (0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations
+#define     AT91C_MC_FWS_3FWS                 (0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations
+#define AT91C_MC_FMCN             (0xFF << 16) // (MC) Flash Microsecond Cycle Number
+// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register --------
+#define AT91C_MC_FCMD             (0xF <<  0) // (MC) Flash Command
+#define     AT91C_MC_FCMD_START_PROG           (0x1) // (MC) Starts the programming of th epage specified by PAGEN.
+#define     AT91C_MC_FCMD_LOCK                 (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_PROG_AND_LOCK        (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.
+#define     AT91C_MC_FCMD_UNLOCK               (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_ERASE_ALL            (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.
+#define     AT91C_MC_FCMD_SET_GP_NVM           (0xB) // (MC) Set General Purpose NVM bits.
+#define     AT91C_MC_FCMD_CLR_GP_NVM           (0xD) // (MC) Clear General Purpose NVM bits.
+#define     AT91C_MC_FCMD_SET_SECURITY         (0xF) // (MC) Set Security Bit.
+#define AT91C_MC_PAGEN            (0x3FF <<  8) // (MC) Page Number
+#define AT91C_MC_KEY              (0xFF << 24) // (MC) Writing Protect Key
+// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register --------
+#define AT91C_MC_SECURITY         (0x1 <<  4) // (MC) Security Bit Status
+#define AT91C_MC_GPNVM0           (0x1 <<  8) // (MC) Sector 0 Lock Status
+#define AT91C_MC_GPNVM1           (0x1 <<  9) // (MC) Sector 1 Lock Status
+#define AT91C_MC_GPNVM2           (0x1 << 10) // (MC) Sector 2 Lock Status
+#define AT91C_MC_GPNVM3           (0x1 << 11) // (MC) Sector 3 Lock Status
+#define AT91C_MC_GPNVM4           (0x1 << 12) // (MC) Sector 4 Lock Status
+#define AT91C_MC_GPNVM5           (0x1 << 13) // (MC) Sector 5 Lock Status
+#define AT91C_MC_GPNVM6           (0x1 << 14) // (MC) Sector 6 Lock Status
+#define AT91C_MC_GPNVM7           (0x1 << 15) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS0           (0x1 << 16) // (MC) Sector 0 Lock Status
+#define AT91C_MC_LOCKS1           (0x1 << 17) // (MC) Sector 1 Lock Status
+#define AT91C_MC_LOCKS2           (0x1 << 18) // (MC) Sector 2 Lock Status
+#define AT91C_MC_LOCKS3           (0x1 << 19) // (MC) Sector 3 Lock Status
+#define AT91C_MC_LOCKS4           (0x1 << 20) // (MC) Sector 4 Lock Status
+#define AT91C_MC_LOCKS5           (0x1 << 21) // (MC) Sector 5 Lock Status
+#define AT91C_MC_LOCKS6           (0x1 << 22) // (MC) Sector 6 Lock Status
+#define AT91C_MC_LOCKS7           (0x1 << 23) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS8           (0x1 << 24) // (MC) Sector 8 Lock Status
+#define AT91C_MC_LOCKS9           (0x1 << 25) // (MC) Sector 9 Lock Status
+#define AT91C_MC_LOCKS10          (0x1 << 26) // (MC) Sector 10 Lock Status
+#define AT91C_MC_LOCKS11          (0x1 << 27) // (MC) Sector 11 Lock Status
+#define AT91C_MC_LOCKS12          (0x1 << 28) // (MC) Sector 12 Lock Status
+#define AT91C_MC_LOCKS13          (0x1 << 29) // (MC) Sector 13 Lock Status
+#define AT91C_MC_LOCKS14          (0x1 << 30) // (MC) Sector 14 Lock Status
+#define AT91C_MC_LOCKS15          (0x1 << 31) // (MC) Sector 15 Lock Status
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface
+// *****************************************************************************
+// *** Register offset in AT91S_SPI structure ***
+#define SPI_CR          ( 0) // Control Register
+#define SPI_MR          ( 4) // Mode Register
+#define SPI_RDR         ( 8) // Receive Data Register
+#define SPI_TDR         (12) // Transmit Data Register
+#define SPI_SR          (16) // Status Register
+#define SPI_IER         (20) // Interrupt Enable Register
+#define SPI_IDR         (24) // Interrupt Disable Register
+#define SPI_IMR         (28) // Interrupt Mask Register
+#define SPI_CSR         (48) // Chip Select Register
+#define SPI_RPR         (256) // Receive Pointer Register
+#define SPI_RCR         (260) // Receive Counter Register
+#define SPI_TPR         (264) // Transmit Pointer Register
+#define SPI_TCR         (268) // Transmit Counter Register
+#define SPI_RNPR        (272) // Receive Next Pointer Register
+#define SPI_RNCR        (276) // Receive Next Counter Register
+#define SPI_TNPR        (280) // Transmit Next Pointer Register
+#define SPI_TNCR        (284) // Transmit Next Counter Register
+#define SPI_PTCR        (288) // PDC Transfer Control Register
+#define SPI_PTSR        (292) // PDC Transfer Status Register
+// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register --------
+#define AT91C_SPI_SPIEN           (0x1 <<  0) // (SPI) SPI Enable
+#define AT91C_SPI_SPIDIS          (0x1 <<  1) // (SPI) SPI Disable
+#define AT91C_SPI_SWRST           (0x1 <<  7) // (SPI) SPI Software reset
+#define AT91C_SPI_LASTXFER        (0x1 << 24) // (SPI) SPI Last Transfer
+// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register --------
+#define AT91C_SPI_MSTR            (0x1 <<  0) // (SPI) Master/Slave Mode
+#define AT91C_SPI_PS              (0x1 <<  1) // (SPI) Peripheral Select
+#define     AT91C_SPI_PS_FIXED                (0x0 <<  1) // (SPI) Fixed Peripheral Select
+#define     AT91C_SPI_PS_VARIABLE             (0x1 <<  1) // (SPI) Variable Peripheral Select
+#define AT91C_SPI_PCSDEC          (0x1 <<  2) // (SPI) Chip Select Decode
+#define AT91C_SPI_FDIV            (0x1 <<  3) // (SPI) Clock Selection
+#define AT91C_SPI_MODFDIS         (0x1 <<  4) // (SPI) Mode Fault Detection
+#define AT91C_SPI_LLB             (0x1 <<  7) // (SPI) Clock Selection
+#define AT91C_SPI_PCS             (0xF << 16) // (SPI) Peripheral Chip Select
+#define AT91C_SPI_DLYBCS          (0xFF << 24) // (SPI) Delay Between Chip Selects
+// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register --------
+#define AT91C_SPI_RD              (0xFFFF <<  0) // (SPI) Receive Data
+#define AT91C_SPI_RPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register --------
+#define AT91C_SPI_TD              (0xFFFF <<  0) // (SPI) Transmit Data
+#define AT91C_SPI_TPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_SR : (SPI Offset: 0x10) Status Register --------
+#define AT91C_SPI_RDRF            (0x1 <<  0) // (SPI) Receive Data Register Full
+#define AT91C_SPI_TDRE            (0x1 <<  1) // (SPI) Transmit Data Register Empty
+#define AT91C_SPI_MODF            (0x1 <<  2) // (SPI) Mode Fault Error
+#define AT91C_SPI_OVRES           (0x1 <<  3) // (SPI) Overrun Error Status
+#define AT91C_SPI_ENDRX           (0x1 <<  4) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_ENDTX           (0x1 <<  5) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_RXBUFF          (0x1 <<  6) // (SPI) RXBUFF Interrupt
+#define AT91C_SPI_TXBUFE          (0x1 <<  7) // (SPI) TXBUFE Interrupt
+#define AT91C_SPI_NSSR            (0x1 <<  8) // (SPI) NSSR Interrupt
+#define AT91C_SPI_TXEMPTY         (0x1 <<  9) // (SPI) TXEMPTY Interrupt
+#define AT91C_SPI_SPIENS          (0x1 << 16) // (SPI) Enable Status
+// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register --------
+// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register --------
+// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register --------
+// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register --------
+#define AT91C_SPI_CPOL            (0x1 <<  0) // (SPI) Clock Polarity
+#define AT91C_SPI_NCPHA           (0x1 <<  1) // (SPI) Clock Phase
+#define AT91C_SPI_CSAAT           (0x1 <<  3) // (SPI) Chip Select Active After Transfer
+#define AT91C_SPI_BITS            (0xF <<  4) // (SPI) Bits Per Transfer
+#define     AT91C_SPI_BITS_8                    (0x0 <<  4) // (SPI) 8 Bits Per transfer
+#define     AT91C_SPI_BITS_9                    (0x1 <<  4) // (SPI) 9 Bits Per transfer
+#define     AT91C_SPI_BITS_10                   (0x2 <<  4) // (SPI) 10 Bits Per transfer
+#define     AT91C_SPI_BITS_11                   (0x3 <<  4) // (SPI) 11 Bits Per transfer
+#define     AT91C_SPI_BITS_12                   (0x4 <<  4) // (SPI) 12 Bits Per transfer
+#define     AT91C_SPI_BITS_13                   (0x5 <<  4) // (SPI) 13 Bits Per transfer
+#define     AT91C_SPI_BITS_14                   (0x6 <<  4) // (SPI) 14 Bits Per transfer
+#define     AT91C_SPI_BITS_15                   (0x7 <<  4) // (SPI) 15 Bits Per transfer
+#define     AT91C_SPI_BITS_16                   (0x8 <<  4) // (SPI) 16 Bits Per transfer
+#define AT91C_SPI_SCBR            (0xFF <<  8) // (SPI) Serial Clock Baud Rate
+#define AT91C_SPI_DLYBS           (0xFF << 16) // (SPI) Delay Before SPCK
+#define AT91C_SPI_DLYBCT          (0xFF << 24) // (SPI) Delay Between Consecutive Transfers
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Usart
+// *****************************************************************************
+// *** Register offset in AT91S_USART structure ***
+#define US_CR           ( 0) // Control Register
+#define US_MR           ( 4) // Mode Register
+#define US_IER          ( 8) // Interrupt Enable Register
+#define US_IDR          (12) // Interrupt Disable Register
+#define US_IMR          (16) // Interrupt Mask Register
+#define US_CSR          (20) // Channel Status Register
+#define US_RHR          (24) // Receiver Holding Register
+#define US_THR          (28) // Transmitter Holding Register
+#define US_BRGR         (32) // Baud Rate Generator Register
+#define US_RTOR         (36) // Receiver Time-out Register
+#define US_TTGR         (40) // Transmitter Time-guard Register
+#define US_FIDI         (64) // FI_DI_Ratio Register
+#define US_NER          (68) // Nb Errors Register
+#define US_IF           (76) // IRDA_FILTER Register
+#define US_RPR          (256) // Receive Pointer Register
+#define US_RCR          (260) // Receive Counter Register
+#define US_TPR          (264) // Transmit Pointer Register
+#define US_TCR          (268) // Transmit Counter Register
+#define US_RNPR         (272) // Receive Next Pointer Register
+#define US_RNCR         (276) // Receive Next Counter Register
+#define US_TNPR         (280) // Transmit Next Pointer Register
+#define US_TNCR         (284) // Transmit Next Counter Register
+#define US_PTCR         (288) // PDC Transfer Control Register
+#define US_PTSR         (292) // PDC Transfer Status Register
+// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_STTBRK           (0x1 <<  9) // (USART) Start Break
+#define AT91C_US_STPBRK           (0x1 << 10) // (USART) Stop Break
+#define AT91C_US_STTTO            (0x1 << 11) // (USART) Start Time-out
+#define AT91C_US_SENDA            (0x1 << 12) // (USART) Send Address
+#define AT91C_US_RSTIT            (0x1 << 13) // (USART) Reset Iterations
+#define AT91C_US_RSTNACK          (0x1 << 14) // (USART) Reset Non Acknowledge
+#define AT91C_US_RETTO            (0x1 << 15) // (USART) Rearm Time-out
+#define AT91C_US_DTREN            (0x1 << 16) // (USART) Data Terminal ready Enable
+#define AT91C_US_DTRDIS           (0x1 << 17) // (USART) Data Terminal ready Disable
+#define AT91C_US_RTSEN            (0x1 << 18) // (USART) Request to Send enable
+#define AT91C_US_RTSDIS           (0x1 << 19) // (USART) Request to Send Disable
+// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_USMODE           (0xF <<  0) // (USART) Usart mode
+#define     AT91C_US_USMODE_NORMAL               (0x0) // (USART) Normal
+#define     AT91C_US_USMODE_RS485                (0x1) // (USART) RS485
+#define     AT91C_US_USMODE_HWHSH                (0x2) // (USART) Hardware Handshaking
+#define     AT91C_US_USMODE_MODEM                (0x3) // (USART) Modem
+#define     AT91C_US_USMODE_ISO7816_0            (0x4) // (USART) ISO7816 protocol: T = 0
+#define     AT91C_US_USMODE_ISO7816_1            (0x6) // (USART) ISO7816 protocol: T = 1
+#define     AT91C_US_USMODE_IRDA                 (0x8) // (USART) IrDA
+#define     AT91C_US_USMODE_SWHSH                (0xC) // (USART) Software Handshaking
+#define AT91C_US_CLKS             (0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CLKS_CLOCK                (0x0 <<  4) // (USART) Clock
+#define     AT91C_US_CLKS_FDIV1                (0x1 <<  4) // (USART) fdiv1
+#define     AT91C_US_CLKS_SLOW                 (0x2 <<  4) // (USART) slow_clock (ARM)
+#define     AT91C_US_CLKS_EXT                  (0x3 <<  4) // (USART) External (SCK)
+#define AT91C_US_CHRL             (0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CHRL_5_BITS               (0x0 <<  6) // (USART) Character Length: 5 bits
+#define     AT91C_US_CHRL_6_BITS               (0x1 <<  6) // (USART) Character Length: 6 bits
+#define     AT91C_US_CHRL_7_BITS               (0x2 <<  6) // (USART) Character Length: 7 bits
+#define     AT91C_US_CHRL_8_BITS               (0x3 <<  6) // (USART) Character Length: 8 bits
+#define AT91C_US_SYNC             (0x1 <<  8) // (USART) Synchronous Mode Select
+#define AT91C_US_NBSTOP           (0x3 << 12) // (USART) Number of Stop bits
+#define     AT91C_US_NBSTOP_1_BIT                (0x0 << 12) // (USART) 1 stop bit
+#define     AT91C_US_NBSTOP_15_BIT               (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits
+#define     AT91C_US_NBSTOP_2_BIT                (0x2 << 12) // (USART) 2 stop bits
+#define AT91C_US_MSBF             (0x1 << 16) // (USART) Bit Order
+#define AT91C_US_MODE9            (0x1 << 17) // (USART) 9-bit Character length
+#define AT91C_US_CKLO             (0x1 << 18) // (USART) Clock Output Select
+#define AT91C_US_OVER             (0x1 << 19) // (USART) Over Sampling Mode
+#define AT91C_US_INACK            (0x1 << 20) // (USART) Inhibit Non Acknowledge
+#define AT91C_US_DSNACK           (0x1 << 21) // (USART) Disable Successive NACK
+#define AT91C_US_MAX_ITER         (0x1 << 24) // (USART) Number of Repetitions
+#define AT91C_US_FILTER           (0x1 << 28) // (USART) Receive Line Filter
+// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXBRK            (0x1 <<  2) // (USART) Break Received/End of Break
+#define AT91C_US_TIMEOUT          (0x1 <<  8) // (USART) Receiver Time-out
+#define AT91C_US_ITERATION        (0x1 << 10) // (USART) Max number of Repetitions Reached
+#define AT91C_US_NACK             (0x1 << 13) // (USART) Non Acknowledge
+#define AT91C_US_RIIC             (0x1 << 16) // (USART) Ring INdicator Input Change Flag
+#define AT91C_US_DSRIC            (0x1 << 17) // (USART) Data Set Ready Input Change Flag
+#define AT91C_US_DCDIC            (0x1 << 18) // (USART) Data Carrier Flag
+#define AT91C_US_CTSIC            (0x1 << 19) // (USART) Clear To Send Input Change Flag
+// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register --------
+#define AT91C_US_RI               (0x1 << 20) // (USART) Image of RI Input
+#define AT91C_US_DSR              (0x1 << 21) // (USART) Image of DSR Input
+#define AT91C_US_DCD              (0x1 << 22) // (USART) Image of DCD Input
+#define AT91C_US_CTS              (0x1 << 23) // (USART) Image of CTS Input
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_SSC structure ***
+#define SSC_CR          ( 0) // Control Register
+#define SSC_CMR         ( 4) // Clock Mode Register
+#define SSC_RCMR        (16) // Receive Clock ModeRegister
+#define SSC_RFMR        (20) // Receive Frame Mode Register
+#define SSC_TCMR        (24) // Transmit Clock Mode Register
+#define SSC_TFMR        (28) // Transmit Frame Mode Register
+#define SSC_RHR         (32) // Receive Holding Register
+#define SSC_THR         (36) // Transmit Holding Register
+#define SSC_RSHR        (48) // Receive Sync Holding Register
+#define SSC_TSHR        (52) // Transmit Sync Holding Register
+#define SSC_SR          (64) // Status Register
+#define SSC_IER         (68) // Interrupt Enable Register
+#define SSC_IDR         (72) // Interrupt Disable Register
+#define SSC_IMR         (76) // Interrupt Mask Register
+#define SSC_RPR         (256) // Receive Pointer Register
+#define SSC_RCR         (260) // Receive Counter Register
+#define SSC_TPR         (264) // Transmit Pointer Register
+#define SSC_TCR         (268) // Transmit Counter Register
+#define SSC_RNPR        (272) // Receive Next Pointer Register
+#define SSC_RNCR        (276) // Receive Next Counter Register
+#define SSC_TNPR        (280) // Transmit Next Pointer Register
+#define SSC_TNCR        (284) // Transmit Next Counter Register
+#define SSC_PTCR        (288) // PDC Transfer Control Register
+#define SSC_PTSR        (292) // PDC Transfer Status Register
+// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register --------
+#define AT91C_SSC_RXEN            (0x1 <<  0) // (SSC) Receive Enable
+#define AT91C_SSC_RXDIS           (0x1 <<  1) // (SSC) Receive Disable
+#define AT91C_SSC_TXEN            (0x1 <<  8) // (SSC) Transmit Enable
+#define AT91C_SSC_TXDIS           (0x1 <<  9) // (SSC) Transmit Disable
+#define AT91C_SSC_SWRST           (0x1 << 15) // (SSC) Software Reset
+// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register --------
+#define AT91C_SSC_CKS             (0x3 <<  0) // (SSC) Receive/Transmit Clock Selection
+#define     AT91C_SSC_CKS_DIV                  (0x0) // (SSC) Divided Clock
+#define     AT91C_SSC_CKS_TK                   (0x1) // (SSC) TK Clock signal
+#define     AT91C_SSC_CKS_RK                   (0x2) // (SSC) RK pin
+#define AT91C_SSC_CKO             (0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection
+#define     AT91C_SSC_CKO_NONE                 (0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only
+#define     AT91C_SSC_CKO_CONTINOUS            (0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output
+#define     AT91C_SSC_CKO_DATA_TX              (0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output
+#define AT91C_SSC_CKI             (0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion
+#define AT91C_SSC_START           (0xF <<  8) // (SSC) Receive/Transmit Start Selection
+#define     AT91C_SSC_START_CONTINOUS            (0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.
+#define     AT91C_SSC_START_TX                   (0x1 <<  8) // (SSC) Transmit/Receive start
+#define     AT91C_SSC_START_LOW_RF               (0x2 <<  8) // (SSC) Detection of a low level on RF input
+#define     AT91C_SSC_START_HIGH_RF              (0x3 <<  8) // (SSC) Detection of a high level on RF input
+#define     AT91C_SSC_START_FALL_RF              (0x4 <<  8) // (SSC) Detection of a falling edge on RF input
+#define     AT91C_SSC_START_RISE_RF              (0x5 <<  8) // (SSC) Detection of a rising edge on RF input
+#define     AT91C_SSC_START_LEVEL_RF             (0x6 <<  8) // (SSC) Detection of any level change on RF input
+#define     AT91C_SSC_START_EDGE_RF              (0x7 <<  8) // (SSC) Detection of any edge on RF input
+#define     AT91C_SSC_START_0                    (0x8 <<  8) // (SSC) Compare 0
+#define AT91C_SSC_STTDLY          (0xFF << 16) // (SSC) Receive/Transmit Start Delay
+#define AT91C_SSC_PERIOD          (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection
+// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register --------
+#define AT91C_SSC_DATLEN          (0x1F <<  0) // (SSC) Data Length
+#define AT91C_SSC_LOOP            (0x1 <<  5) // (SSC) Loop Mode
+#define AT91C_SSC_MSBF            (0x1 <<  7) // (SSC) Most Significant Bit First
+#define AT91C_SSC_DATNB           (0xF <<  8) // (SSC) Data Number per Frame
+#define AT91C_SSC_FSLEN           (0xF << 16) // (SSC) Receive/Transmit Frame Sync length
+#define AT91C_SSC_FSOS            (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection
+#define     AT91C_SSC_FSOS_NONE                 (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only
+#define     AT91C_SSC_FSOS_NEGATIVE             (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse
+#define     AT91C_SSC_FSOS_POSITIVE             (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse
+#define     AT91C_SSC_FSOS_LOW                  (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer
+#define     AT91C_SSC_FSOS_HIGH                 (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer
+#define     AT91C_SSC_FSOS_TOGGLE               (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer
+#define AT91C_SSC_FSEDGE          (0x1 << 24) // (SSC) Frame Sync Edge Detection
+// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register --------
+// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register --------
+#define AT91C_SSC_DATDEF          (0x1 <<  5) // (SSC) Data Default Value
+#define AT91C_SSC_FSDEN           (0x1 << 23) // (SSC) Frame Sync Data Enable
+// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register --------
+#define AT91C_SSC_TXRDY           (0x1 <<  0) // (SSC) Transmit Ready
+#define AT91C_SSC_TXEMPTY         (0x1 <<  1) // (SSC) Transmit Empty
+#define AT91C_SSC_ENDTX           (0x1 <<  2) // (SSC) End Of Transmission
+#define AT91C_SSC_TXBUFE          (0x1 <<  3) // (SSC) Transmit Buffer Empty
+#define AT91C_SSC_RXRDY           (0x1 <<  4) // (SSC) Receive Ready
+#define AT91C_SSC_OVRUN           (0x1 <<  5) // (SSC) Receive Overrun
+#define AT91C_SSC_ENDRX           (0x1 <<  6) // (SSC) End of Reception
+#define AT91C_SSC_RXBUFF          (0x1 <<  7) // (SSC) Receive Buffer Full
+#define AT91C_SSC_TXSYN           (0x1 << 10) // (SSC) Transmit Sync
+#define AT91C_SSC_RXSYN           (0x1 << 11) // (SSC) Receive Sync
+#define AT91C_SSC_TXENA           (0x1 << 16) // (SSC) Transmit Enable
+#define AT91C_SSC_RXENA           (0x1 << 17) // (SSC) Receive Enable
+// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register --------
+// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register --------
+// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Two-wire Interface
+// *****************************************************************************
+// *** Register offset in AT91S_TWI structure ***
+#define TWI_CR          ( 0) // Control Register
+#define TWI_MMR         ( 4) // Master Mode Register
+#define TWI_IADR        (12) // Internal Address Register
+#define TWI_CWGR        (16) // Clock Waveform Generator Register
+#define TWI_SR          (32) // Status Register
+#define TWI_IER         (36) // Interrupt Enable Register
+#define TWI_IDR         (40) // Interrupt Disable Register
+#define TWI_IMR         (44) // Interrupt Mask Register
+#define TWI_RHR         (48) // Receive Holding Register
+#define TWI_THR         (52) // Transmit Holding Register
+// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register --------
+#define AT91C_TWI_START           (0x1 <<  0) // (TWI) Send a START Condition
+#define AT91C_TWI_STOP            (0x1 <<  1) // (TWI) Send a STOP Condition
+#define AT91C_TWI_MSEN            (0x1 <<  2) // (TWI) TWI Master Transfer Enabled
+#define AT91C_TWI_MSDIS           (0x1 <<  3) // (TWI) TWI Master Transfer Disabled
+#define AT91C_TWI_SWRST           (0x1 <<  7) // (TWI) Software Reset
+// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register --------
+#define AT91C_TWI_IADRSZ          (0x3 <<  8) // (TWI) Internal Device Address Size
+#define     AT91C_TWI_IADRSZ_NO                   (0x0 <<  8) // (TWI) No internal device address
+#define     AT91C_TWI_IADRSZ_1_BYTE               (0x1 <<  8) // (TWI) One-byte internal device address
+#define     AT91C_TWI_IADRSZ_2_BYTE               (0x2 <<  8) // (TWI) Two-byte internal device address
+#define     AT91C_TWI_IADRSZ_3_BYTE               (0x3 <<  8) // (TWI) Three-byte internal device address
+#define AT91C_TWI_MREAD           (0x1 << 12) // (TWI) Master Read Direction
+#define AT91C_TWI_DADR            (0x7F << 16) // (TWI) Device Address
+// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register --------
+#define AT91C_TWI_CLDIV           (0xFF <<  0) // (TWI) Clock Low Divider
+#define AT91C_TWI_CHDIV           (0xFF <<  8) // (TWI) Clock High Divider
+#define AT91C_TWI_CKDIV           (0x7 << 16) // (TWI) Clock Divider
+// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register --------
+#define AT91C_TWI_TXCOMP          (0x1 <<  0) // (TWI) Transmission Completed
+#define AT91C_TWI_RXRDY           (0x1 <<  1) // (TWI) Receive holding register ReaDY
+#define AT91C_TWI_TXRDY           (0x1 <<  2) // (TWI) Transmit holding register ReaDY
+#define AT91C_TWI_OVRE            (0x1 <<  6) // (TWI) Overrun Error
+#define AT91C_TWI_UNRE            (0x1 <<  7) // (TWI) Underrun Error
+#define AT91C_TWI_NACK            (0x1 <<  8) // (TWI) Not Acknowledged
+// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register --------
+// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register --------
+// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface
+// *****************************************************************************
+// *** Register offset in AT91S_PWMC_CH structure ***
+#define PWMC_CMR        ( 0) // Channel Mode Register
+#define PWMC_CDTYR      ( 4) // Channel Duty Cycle Register
+#define PWMC_CPRDR      ( 8) // Channel Period Register
+#define PWMC_CCNTR      (12) // Channel Counter Register
+#define PWMC_CUPDR      (16) // Channel Update Register
+#define PWMC_Reserved   (20) // Reserved
+// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register --------
+#define AT91C_PWMC_CPRE           (0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx
+#define     AT91C_PWMC_CPRE_MCK                  (0x0) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKA                 (0xB) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKB                 (0xC) // (PWMC_CH)
+#define AT91C_PWMC_CALG           (0x1 <<  8) // (PWMC_CH) Channel Alignment
+#define AT91C_PWMC_CPOL           (0x1 <<  9) // (PWMC_CH) Channel Polarity
+#define AT91C_PWMC_CPD            (0x1 << 10) // (PWMC_CH) Channel Update Period
+// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register --------
+#define AT91C_PWMC_CDTY           (0x0 <<  0) // (PWMC_CH) Channel Duty Cycle
+// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register --------
+#define AT91C_PWMC_CPRD           (0x0 <<  0) // (PWMC_CH) Channel Period
+// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register --------
+#define AT91C_PWMC_CCNT           (0x0 <<  0) // (PWMC_CH) Channel Counter
+// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register --------
+#define AT91C_PWMC_CUPD           (0x0 <<  0) // (PWMC_CH) Channel Update
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_PWMC structure ***
+#define PWMC_MR         ( 0) // PWMC Mode Register
+#define PWMC_ENA        ( 4) // PWMC Enable Register
+#define PWMC_DIS        ( 8) // PWMC Disable Register
+#define PWMC_SR         (12) // PWMC Status Register
+#define PWMC_IER        (16) // PWMC Interrupt Enable Register
+#define PWMC_IDR        (20) // PWMC Interrupt Disable Register
+#define PWMC_IMR        (24) // PWMC Interrupt Mask Register
+#define PWMC_ISR        (28) // PWMC Interrupt Status Register
+#define PWMC_VR         (252) // PWMC Version Register
+#define PWMC_CH         (512) // PWMC Channel
+// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register --------
+#define AT91C_PWMC_DIVA           (0xFF <<  0) // (PWMC) CLKA divide factor.
+#define AT91C_PWMC_PREA           (0xF <<  8) // (PWMC) Divider Input Clock Prescaler A
+#define     AT91C_PWMC_PREA_MCK                  (0x0 <<  8) // (PWMC)
+#define AT91C_PWMC_DIVB           (0xFF << 16) // (PWMC) CLKB divide factor.
+#define AT91C_PWMC_PREB           (0xF << 24) // (PWMC) Divider Input Clock Prescaler B
+#define     AT91C_PWMC_PREB_MCK                  (0x0 << 24) // (PWMC)
+// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register --------
+#define AT91C_PWMC_CHID0          (0x1 <<  0) // (PWMC) Channel ID 0
+#define AT91C_PWMC_CHID1          (0x1 <<  1) // (PWMC) Channel ID 1
+#define AT91C_PWMC_CHID2          (0x1 <<  2) // (PWMC) Channel ID 2
+#define AT91C_PWMC_CHID3          (0x1 <<  3) // (PWMC) Channel ID 3
+// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register --------
+// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register --------
+// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register --------
+// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register --------
+// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register --------
+// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR USB Device Interface
+// *****************************************************************************
+// *** Register offset in AT91S_UDP structure ***
+#define UDP_NUM         ( 0) // Frame Number Register
+#define UDP_GLBSTATE    ( 4) // Global State Register
+#define UDP_FADDR       ( 8) // Function Address Register
+#define UDP_IER         (16) // Interrupt Enable Register
+#define UDP_IDR         (20) // Interrupt Disable Register
+#define UDP_IMR         (24) // Interrupt Mask Register
+#define UDP_ISR         (28) // Interrupt Status Register
+#define UDP_ICR         (32) // Interrupt Clear Register
+#define UDP_RSTEP       (40) // Reset Endpoint Register
+#define UDP_CSR         (48) // Endpoint Control and Status Register
+#define UDP_FDR         (80) // Endpoint FIFO Data Register
+#define UDP_TXVC        (116) // Transceiver Control Register
+// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register --------
+#define AT91C_UDP_FRM_NUM         (0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats
+#define AT91C_UDP_FRM_ERR         (0x1 << 16) // (UDP) Frame Error
+#define AT91C_UDP_FRM_OK          (0x1 << 17) // (UDP) Frame OK
+// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register --------
+#define AT91C_UDP_FADDEN          (0x1 <<  0) // (UDP) Function Address Enable
+#define AT91C_UDP_CONFG           (0x1 <<  1) // (UDP) Configured
+#define AT91C_UDP_ESR             (0x1 <<  2) // (UDP) Enable Send Resume
+#define AT91C_UDP_RSMINPR         (0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host
+#define AT91C_UDP_RMWUPE          (0x1 <<  4) // (UDP) Remote Wake Up Enable
+// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register --------
+#define AT91C_UDP_FADD            (0xFF <<  0) // (UDP) Function Address Value
+#define AT91C_UDP_FEN             (0x1 <<  8) // (UDP) Function Enable
+// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register --------
+#define AT91C_UDP_EPINT0          (0x1 <<  0) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT1          (0x1 <<  1) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT2          (0x1 <<  2) // (UDP) Endpoint 2 Interrupt
+#define AT91C_UDP_EPINT3          (0x1 <<  3) // (UDP) Endpoint 3 Interrupt
+#define AT91C_UDP_EPINT4          (0x1 <<  4) // (UDP) Endpoint 4 Interrupt
+#define AT91C_UDP_EPINT5          (0x1 <<  5) // (UDP) Endpoint 5 Interrupt
+#define AT91C_UDP_RXSUSP          (0x1 <<  8) // (UDP) USB Suspend Interrupt
+#define AT91C_UDP_RXRSM           (0x1 <<  9) // (UDP) USB Resume Interrupt
+#define AT91C_UDP_EXTRSM          (0x1 << 10) // (UDP) USB External Resume Interrupt
+#define AT91C_UDP_SOFINT          (0x1 << 11) // (UDP) USB Start Of frame Interrupt
+#define AT91C_UDP_WAKEUP          (0x1 << 13) // (UDP) USB Resume Interrupt
+// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register --------
+// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register --------
+// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register --------
+#define AT91C_UDP_ENDBUSRES       (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt
+// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register --------
+// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register --------
+#define AT91C_UDP_EP0             (0x1 <<  0) // (UDP) Reset Endpoint 0
+#define AT91C_UDP_EP1             (0x1 <<  1) // (UDP) Reset Endpoint 1
+#define AT91C_UDP_EP2             (0x1 <<  2) // (UDP) Reset Endpoint 2
+#define AT91C_UDP_EP3             (0x1 <<  3) // (UDP) Reset Endpoint 3
+#define AT91C_UDP_EP4             (0x1 <<  4) // (UDP) Reset Endpoint 4
+#define AT91C_UDP_EP5             (0x1 <<  5) // (UDP) Reset Endpoint 5
+// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register --------
+#define AT91C_UDP_TXCOMP          (0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR
+#define AT91C_UDP_RX_DATA_BK0     (0x1 <<  1) // (UDP) Receive Data Bank 0
+#define AT91C_UDP_RXSETUP         (0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)
+#define AT91C_UDP_ISOERROR        (0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)
+#define AT91C_UDP_TXPKTRDY        (0x1 <<  4) // (UDP) Transmit Packet Ready
+#define AT91C_UDP_FORCESTALL      (0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).
+#define AT91C_UDP_RX_DATA_BK1     (0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).
+#define AT91C_UDP_DIR             (0x1 <<  7) // (UDP) Transfer Direction
+#define AT91C_UDP_EPTYPE          (0x7 <<  8) // (UDP) Endpoint type
+#define     AT91C_UDP_EPTYPE_CTRL                 (0x0 <<  8) // (UDP) Control
+#define     AT91C_UDP_EPTYPE_ISO_OUT              (0x1 <<  8) // (UDP) Isochronous OUT
+#define     AT91C_UDP_EPTYPE_BULK_OUT             (0x2 <<  8) // (UDP) Bulk OUT
+#define     AT91C_UDP_EPTYPE_INT_OUT              (0x3 <<  8) // (UDP) Interrupt OUT
+#define     AT91C_UDP_EPTYPE_ISO_IN               (0x5 <<  8) // (UDP) Isochronous IN
+#define     AT91C_UDP_EPTYPE_BULK_IN              (0x6 <<  8) // (UDP) Bulk IN
+#define     AT91C_UDP_EPTYPE_INT_IN               (0x7 <<  8) // (UDP) Interrupt IN
+#define AT91C_UDP_DTGLE           (0x1 << 11) // (UDP) Data Toggle
+#define AT91C_UDP_EPEDS           (0x1 << 15) // (UDP) Endpoint Enable Disable
+#define AT91C_UDP_RXBYTECNT       (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO
+// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register --------
+#define AT91C_UDP_TXVDIS          (0x1 <<  8) // (UDP)
+#define AT91C_UDP_PUON            (0x1 <<  9) // (UDP) Pull-up ON
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface
+// *****************************************************************************
+// *** Register offset in AT91S_TC structure ***
+#define TC_CCR          ( 0) // Channel Control Register
+#define TC_CMR          ( 4) // Channel Mode Register (Capture Mode / Waveform Mode)
+#define TC_CV           (16) // Counter Value
+#define TC_RA           (20) // Register A
+#define TC_RB           (24) // Register B
+#define TC_RC           (28) // Register C
+#define TC_SR           (32) // Status Register
+#define TC_IER          (36) // Interrupt Enable Register
+#define TC_IDR          (40) // Interrupt Disable Register
+#define TC_IMR          (44) // Interrupt Mask Register
+// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register --------
+#define AT91C_TC_CLKEN            (0x1 <<  0) // (TC) Counter Clock Enable Command
+#define AT91C_TC_CLKDIS           (0x1 <<  1) // (TC) Counter Clock Disable Command
+#define AT91C_TC_SWTRG            (0x1 <<  2) // (TC) Software Trigger Command
+// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode --------
+#define AT91C_TC_CLKS             (0x7 <<  0) // (TC) Clock Selection
+#define     AT91C_TC_CLKS_TIMER_DIV1_CLOCK     (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV2_CLOCK     (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV3_CLOCK     (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV4_CLOCK     (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV5_CLOCK     (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK
+#define     AT91C_TC_CLKS_XC0                  (0x5) // (TC) Clock selected: XC0
+#define     AT91C_TC_CLKS_XC1                  (0x6) // (TC) Clock selected: XC1
+#define     AT91C_TC_CLKS_XC2                  (0x7) // (TC) Clock selected: XC2
+#define AT91C_TC_CLKI             (0x1 <<  3) // (TC) Clock Invert
+#define AT91C_TC_BURST            (0x3 <<  4) // (TC) Burst Signal Selection
+#define     AT91C_TC_BURST_NONE                 (0x0 <<  4) // (TC) The clock is not gated by an external signal
+#define     AT91C_TC_BURST_XC0                  (0x1 <<  4) // (TC) XC0 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC1                  (0x2 <<  4) // (TC) XC1 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC2                  (0x3 <<  4) // (TC) XC2 is ANDed with the selected clock
+#define AT91C_TC_CPCSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare
+#define AT91C_TC_LDBSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading
+#define AT91C_TC_CPCDIS           (0x1 <<  7) // (TC) Counter Clock Disable with RC Compare
+#define AT91C_TC_LDBDIS           (0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading
+#define AT91C_TC_ETRGEDG          (0x3 <<  8) // (TC) External Trigger Edge Selection
+#define     AT91C_TC_ETRGEDG_NONE                 (0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_ETRGEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_ETRGEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_ETRGEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_EEVTEDG          (0x3 <<  8) // (TC) External Event Edge Selection
+#define     AT91C_TC_EEVTEDG_NONE                 (0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_EEVTEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_EEVTEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_EEVTEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_EEVT             (0x3 << 10) // (TC) External Event  Selection
+#define     AT91C_TC_EEVT_TIOB                 (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input
+#define     AT91C_TC_EEVT_XC0                  (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output
+#define     AT91C_TC_EEVT_XC1                  (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output
+#define     AT91C_TC_EEVT_XC2                  (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output
+#define AT91C_TC_ABETRG           (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection
+#define AT91C_TC_ENETRG           (0x1 << 12) // (TC) External Event Trigger enable
+#define AT91C_TC_WAVESEL          (0x3 << 13) // (TC) Waveform  Selection
+#define     AT91C_TC_WAVESEL_UP                   (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN               (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UP_AUTO              (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN_AUTO          (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare
+#define AT91C_TC_CPCTRG           (0x1 << 14) // (TC) RC Compare Trigger Enable
+#define AT91C_TC_WAVE             (0x1 << 15) // (TC)
+#define AT91C_TC_ACPA             (0x3 << 16) // (TC) RA Compare Effect on TIOA
+#define     AT91C_TC_ACPA_NONE                 (0x0 << 16) // (TC) Effect: none
+#define     AT91C_TC_ACPA_SET                  (0x1 << 16) // (TC) Effect: set
+#define     AT91C_TC_ACPA_CLEAR                (0x2 << 16) // (TC) Effect: clear
+#define     AT91C_TC_ACPA_TOGGLE               (0x3 << 16) // (TC) Effect: toggle
+#define AT91C_TC_LDRA             (0x3 << 16) // (TC) RA Loading Selection
+#define     AT91C_TC_LDRA_NONE                 (0x0 << 16) // (TC) Edge: None
+#define     AT91C_TC_LDRA_RISING               (0x1 << 16) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRA_FALLING              (0x2 << 16) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRA_BOTH                 (0x3 << 16) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_ACPC             (0x3 << 18) // (TC) RC Compare Effect on TIOA
+#define     AT91C_TC_ACPC_NONE                 (0x0 << 18) // (TC) Effect: none
+#define     AT91C_TC_ACPC_SET                  (0x1 << 18) // (TC) Effect: set
+#define     AT91C_TC_ACPC_CLEAR                (0x2 << 18) // (TC) Effect: clear
+#define     AT91C_TC_ACPC_TOGGLE               (0x3 << 18) // (TC) Effect: toggle
+#define AT91C_TC_LDRB             (0x3 << 18) // (TC) RB Loading Selection
+#define     AT91C_TC_LDRB_NONE                 (0x0 << 18) // (TC) Edge: None
+#define     AT91C_TC_LDRB_RISING               (0x1 << 18) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRB_FALLING              (0x2 << 18) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRB_BOTH                 (0x3 << 18) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_AEEVT            (0x3 << 20) // (TC) External Event Effect on TIOA
+#define     AT91C_TC_AEEVT_NONE                 (0x0 << 20) // (TC) Effect: none
+#define     AT91C_TC_AEEVT_SET                  (0x1 << 20) // (TC) Effect: set
+#define     AT91C_TC_AEEVT_CLEAR                (0x2 << 20) // (TC) Effect: clear
+#define     AT91C_TC_AEEVT_TOGGLE               (0x3 << 20) // (TC) Effect: toggle
+#define AT91C_TC_ASWTRG           (0x3 << 22) // (TC) Software Trigger Effect on TIOA
+#define     AT91C_TC_ASWTRG_NONE                 (0x0 << 22) // (TC) Effect: none
+#define     AT91C_TC_ASWTRG_SET                  (0x1 << 22) // (TC) Effect: set
+#define     AT91C_TC_ASWTRG_CLEAR                (0x2 << 22) // (TC) Effect: clear
+#define     AT91C_TC_ASWTRG_TOGGLE               (0x3 << 22) // (TC) Effect: toggle
+#define AT91C_TC_BCPB             (0x3 << 24) // (TC) RB Compare Effect on TIOB
+#define     AT91C_TC_BCPB_NONE                 (0x0 << 24) // (TC) Effect: none
+#define     AT91C_TC_BCPB_SET                  (0x1 << 24) // (TC) Effect: set
+#define     AT91C_TC_BCPB_CLEAR                (0x2 << 24) // (TC) Effect: clear
+#define     AT91C_TC_BCPB_TOGGLE               (0x3 << 24) // (TC) Effect: toggle
+#define AT91C_TC_BCPC             (0x3 << 26) // (TC) RC Compare Effect on TIOB
+#define     AT91C_TC_BCPC_NONE                 (0x0 << 26) // (TC) Effect: none
+#define     AT91C_TC_BCPC_SET                  (0x1 << 26) // (TC) Effect: set
+#define     AT91C_TC_BCPC_CLEAR                (0x2 << 26) // (TC) Effect: clear
+#define     AT91C_TC_BCPC_TOGGLE               (0x3 << 26) // (TC) Effect: toggle
+#define AT91C_TC_BEEVT            (0x3 << 28) // (TC) External Event Effect on TIOB
+#define     AT91C_TC_BEEVT_NONE                 (0x0 << 28) // (TC) Effect: none
+#define     AT91C_TC_BEEVT_SET                  (0x1 << 28) // (TC) Effect: set
+#define     AT91C_TC_BEEVT_CLEAR                (0x2 << 28) // (TC) Effect: clear
+#define     AT91C_TC_BEEVT_TOGGLE               (0x3 << 28) // (TC) Effect: toggle
+#define AT91C_TC_BSWTRG           (0x3 << 30) // (TC) Software Trigger Effect on TIOB
+#define     AT91C_TC_BSWTRG_NONE                 (0x0 << 30) // (TC) Effect: none
+#define     AT91C_TC_BSWTRG_SET                  (0x1 << 30) // (TC) Effect: set
+#define     AT91C_TC_BSWTRG_CLEAR                (0x2 << 30) // (TC) Effect: clear
+#define     AT91C_TC_BSWTRG_TOGGLE               (0x3 << 30) // (TC) Effect: toggle
+// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register --------
+#define AT91C_TC_COVFS            (0x1 <<  0) // (TC) Counter Overflow
+#define AT91C_TC_LOVRS            (0x1 <<  1) // (TC) Load Overrun
+#define AT91C_TC_CPAS             (0x1 <<  2) // (TC) RA Compare
+#define AT91C_TC_CPBS             (0x1 <<  3) // (TC) RB Compare
+#define AT91C_TC_CPCS             (0x1 <<  4) // (TC) RC Compare
+#define AT91C_TC_LDRAS            (0x1 <<  5) // (TC) RA Loading
+#define AT91C_TC_LDRBS            (0x1 <<  6) // (TC) RB Loading
+#define AT91C_TC_ETRGS            (0x1 <<  7) // (TC) External Trigger
+#define AT91C_TC_CLKSTA           (0x1 << 16) // (TC) Clock Enabling
+#define AT91C_TC_MTIOA            (0x1 << 17) // (TC) TIOA Mirror
+#define AT91C_TC_MTIOB            (0x1 << 18) // (TC) TIOA Mirror
+// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register --------
+// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register --------
+// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Interface
+// *****************************************************************************
+// *** Register offset in AT91S_TCB structure ***
+#define TCB_TC0         ( 0) // TC Channel 0
+#define TCB_TC1         (64) // TC Channel 1
+#define TCB_TC2         (128) // TC Channel 2
+#define TCB_BCR         (192) // TC Block Control Register
+#define TCB_BMR         (196) // TC Block Mode Register
+// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register --------
+#define AT91C_TCB_SYNC            (0x1 <<  0) // (TCB) Synchro Command
+// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register --------
+#define AT91C_TCB_TC0XC0S         (0x3 <<  0) // (TCB) External Clock Signal 0 Selection
+#define     AT91C_TCB_TC0XC0S_TCLK0                (0x0) // (TCB) TCLK0 connected to XC0
+#define     AT91C_TCB_TC0XC0S_NONE                 (0x1) // (TCB) None signal connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA1                (0x2) // (TCB) TIOA1 connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA2                (0x3) // (TCB) TIOA2 connected to XC0
+#define AT91C_TCB_TC1XC1S         (0x3 <<  2) // (TCB) External Clock Signal 1 Selection
+#define     AT91C_TCB_TC1XC1S_TCLK1                (0x0 <<  2) // (TCB) TCLK1 connected to XC1
+#define     AT91C_TCB_TC1XC1S_NONE                 (0x1 <<  2) // (TCB) None signal connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA0                (0x2 <<  2) // (TCB) TIOA0 connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA2                (0x3 <<  2) // (TCB) TIOA2 connected to XC1
+#define AT91C_TCB_TC2XC2S         (0x3 <<  4) // (TCB) External Clock Signal 2 Selection
+#define     AT91C_TCB_TC2XC2S_TCLK2                (0x0 <<  4) // (TCB) TCLK2 connected to XC2
+#define     AT91C_TCB_TC2XC2S_NONE                 (0x1 <<  4) // (TCB) None signal connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA0                (0x2 <<  4) // (TCB) TIOA0 connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA1                (0x3 <<  4) // (TCB) TIOA2 connected to XC2
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Control Area Network MailBox Interface
+// *****************************************************************************
+// *** Register offset in AT91S_CAN_MB structure ***
+#define CAN_MB_MMR      ( 0) // MailBox Mode Register
+#define CAN_MB_MAM      ( 4) // MailBox Acceptance Mask Register
+#define CAN_MB_MID      ( 8) // MailBox ID Register
+#define CAN_MB_MFID     (12) // MailBox Family ID Register
+#define CAN_MB_MSR      (16) // MailBox Status Register
+#define CAN_MB_MDL      (20) // MailBox Data Low Register
+#define CAN_MB_MDH      (24) // MailBox Data High Register
+#define CAN_MB_MCR      (28) // MailBox Control Register
+// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register --------
+#define AT91C_CAN_MTIMEMARK       (0xFFFF <<  0) // (CAN_MB) Mailbox Timemark
+#define AT91C_CAN_PRIOR           (0xF << 16) // (CAN_MB) Mailbox Priority
+#define AT91C_CAN_MOT             (0x7 << 24) // (CAN_MB) Mailbox Object Type
+#define     AT91C_CAN_MOT_DIS                  (0x0 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_RX                   (0x1 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_RXOVERWRITE          (0x2 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_TX                   (0x3 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_CONSUMER             (0x4 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_PRODUCER             (0x5 << 24) // (CAN_MB)
+// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register --------
+#define AT91C_CAN_MIDvB           (0x3FFFF <<  0) // (CAN_MB) Complementary bits for identifier in extended mode
+#define AT91C_CAN_MIDvA           (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode
+#define AT91C_CAN_MIDE            (0x1 << 29) // (CAN_MB) Identifier Version
+// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register --------
+// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register --------
+// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register --------
+#define AT91C_CAN_MTIMESTAMP      (0xFFFF <<  0) // (CAN_MB) Timer Value
+#define AT91C_CAN_MDLC            (0xF << 16) // (CAN_MB) Mailbox Data Length Code
+#define AT91C_CAN_MRTR            (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request
+#define AT91C_CAN_MABT            (0x1 << 22) // (CAN_MB) Mailbox Message Abort
+#define AT91C_CAN_MRDY            (0x1 << 23) // (CAN_MB) Mailbox Ready
+#define AT91C_CAN_MMI             (0x1 << 24) // (CAN_MB) Mailbox Message Ignored
+// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register --------
+// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register --------
+// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register --------
+#define AT91C_CAN_MACR            (0x1 << 22) // (CAN_MB) Abort Request for Mailbox
+#define AT91C_CAN_MTCR            (0x1 << 23) // (CAN_MB) Mailbox Transfer Command
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Control Area Network Interface
+// *****************************************************************************
+// *** Register offset in AT91S_CAN structure ***
+#define CAN_MR          ( 0) // Mode Register
+#define CAN_IER         ( 4) // Interrupt Enable Register
+#define CAN_IDR         ( 8) // Interrupt Disable Register
+#define CAN_IMR         (12) // Interrupt Mask Register
+#define CAN_SR          (16) // Status Register
+#define CAN_BR          (20) // Baudrate Register
+#define CAN_TIM         (24) // Timer Register
+#define CAN_TIMESTP     (28) // Time Stamp Register
+#define CAN_ECR         (32) // Error Counter Register
+#define CAN_TCR         (36) // Transfer Command Register
+#define CAN_ACR         (40) // Abort Command Register
+#define CAN_VR          (252) // Version Register
+#define CAN_MB0         (512) // CAN Mailbox 0
+#define CAN_MB1         (544) // CAN Mailbox 1
+#define CAN_MB2         (576) // CAN Mailbox 2
+#define CAN_MB3         (608) // CAN Mailbox 3
+#define CAN_MB4         (640) // CAN Mailbox 4
+#define CAN_MB5         (672) // CAN Mailbox 5
+#define CAN_MB6         (704) // CAN Mailbox 6
+#define CAN_MB7         (736) // CAN Mailbox 7
+#define CAN_MB8         (768) // CAN Mailbox 8
+#define CAN_MB9         (800) // CAN Mailbox 9
+#define CAN_MB10        (832) // CAN Mailbox 10
+#define CAN_MB11        (864) // CAN Mailbox 11
+#define CAN_MB12        (896) // CAN Mailbox 12
+#define CAN_MB13        (928) // CAN Mailbox 13
+#define CAN_MB14        (960) // CAN Mailbox 14
+#define CAN_MB15        (992) // CAN Mailbox 15
+// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register --------
+#define AT91C_CAN_CANEN           (0x1 <<  0) // (CAN) CAN Controller Enable
+#define AT91C_CAN_LPM             (0x1 <<  1) // (CAN) Disable/Enable Low Power Mode
+#define AT91C_CAN_ABM             (0x1 <<  2) // (CAN) Disable/Enable Autobaud/Listen Mode
+#define AT91C_CAN_OVL             (0x1 <<  3) // (CAN) Disable/Enable Overload Frame
+#define AT91C_CAN_TEOF            (0x1 <<  4) // (CAN) Time Stamp messages at each end of Frame
+#define AT91C_CAN_TTM             (0x1 <<  5) // (CAN) Disable/Enable Time Trigger Mode
+#define AT91C_CAN_TIMFRZ          (0x1 <<  6) // (CAN) Enable Timer Freeze
+#define AT91C_CAN_DRPT            (0x1 <<  7) // (CAN) Disable Repeat
+// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register --------
+#define AT91C_CAN_MB0             (0x1 <<  0) // (CAN) Mailbox 0 Flag
+#define AT91C_CAN_MB1             (0x1 <<  1) // (CAN) Mailbox 1 Flag
+#define AT91C_CAN_MB2             (0x1 <<  2) // (CAN) Mailbox 2 Flag
+#define AT91C_CAN_MB3             (0x1 <<  3) // (CAN) Mailbox 3 Flag
+#define AT91C_CAN_MB4             (0x1 <<  4) // (CAN) Mailbox 4 Flag
+#define AT91C_CAN_MB5             (0x1 <<  5) // (CAN) Mailbox 5 Flag
+#define AT91C_CAN_MB6             (0x1 <<  6) // (CAN) Mailbox 6 Flag
+#define AT91C_CAN_MB7             (0x1 <<  7) // (CAN) Mailbox 7 Flag
+#define AT91C_CAN_MB8             (0x1 <<  8) // (CAN) Mailbox 8 Flag
+#define AT91C_CAN_MB9             (0x1 <<  9) // (CAN) Mailbox 9 Flag
+#define AT91C_CAN_MB10            (0x1 << 10) // (CAN) Mailbox 10 Flag
+#define AT91C_CAN_MB11            (0x1 << 11) // (CAN) Mailbox 11 Flag
+#define AT91C_CAN_MB12            (0x1 << 12) // (CAN) Mailbox 12 Flag
+#define AT91C_CAN_MB13            (0x1 << 13) // (CAN) Mailbox 13 Flag
+#define AT91C_CAN_MB14            (0x1 << 14) // (CAN) Mailbox 14 Flag
+#define AT91C_CAN_MB15            (0x1 << 15) // (CAN) Mailbox 15 Flag
+#define AT91C_CAN_ERRA            (0x1 << 16) // (CAN) Error Active Mode Flag
+#define AT91C_CAN_WARN            (0x1 << 17) // (CAN) Warning Limit Flag
+#define AT91C_CAN_ERRP            (0x1 << 18) // (CAN) Error Passive Mode Flag
+#define AT91C_CAN_BOFF            (0x1 << 19) // (CAN) Bus Off Mode Flag
+#define AT91C_CAN_SLEEP           (0x1 << 20) // (CAN) Sleep Flag
+#define AT91C_CAN_WAKEUP          (0x1 << 21) // (CAN) Wakeup Flag
+#define AT91C_CAN_TOVF            (0x1 << 22) // (CAN) Timer Overflow Flag
+#define AT91C_CAN_TSTP            (0x1 << 23) // (CAN) Timestamp Flag
+#define AT91C_CAN_CERR            (0x1 << 24) // (CAN) CRC Error
+#define AT91C_CAN_SERR            (0x1 << 25) // (CAN) Stuffing Error
+#define AT91C_CAN_AERR            (0x1 << 26) // (CAN) Acknowledgment Error
+#define AT91C_CAN_FERR            (0x1 << 27) // (CAN) Form Error
+#define AT91C_CAN_BERR            (0x1 << 28) // (CAN) Bit Error
+// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register --------
+// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register --------
+// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register --------
+#define AT91C_CAN_RBSY            (0x1 << 29) // (CAN) Receiver Busy
+#define AT91C_CAN_TBSY            (0x1 << 30) // (CAN) Transmitter Busy
+#define AT91C_CAN_OVLY            (0x1 << 31) // (CAN) Overload Busy
+// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register --------
+#define AT91C_CAN_PHASE2          (0x7 <<  0) // (CAN) Phase 2 segment
+#define AT91C_CAN_PHASE1          (0x7 <<  4) // (CAN) Phase 1 segment
+#define AT91C_CAN_PROPAG          (0x7 <<  8) // (CAN) Programmation time segment
+#define AT91C_CAN_SYNC            (0x3 << 12) // (CAN) Re-synchronization jump width segment
+#define AT91C_CAN_BRP             (0x7F << 16) // (CAN) Baudrate Prescaler
+#define AT91C_CAN_SMP             (0x1 << 24) // (CAN) Sampling mode
+// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register --------
+#define AT91C_CAN_TIMER           (0xFFFF <<  0) // (CAN) Timer field
+// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register --------
+// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register --------
+#define AT91C_CAN_REC             (0xFF <<  0) // (CAN) Receive Error Counter
+#define AT91C_CAN_TEC             (0xFF << 16) // (CAN) Transmit Error Counter
+// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register --------
+#define AT91C_CAN_TIMRST          (0x1 << 31) // (CAN) Timer Reset Field
+// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Ethernet MAC 10/100
+// *****************************************************************************
+// *** Register offset in AT91S_EMAC structure ***
+#define EMAC_NCR        ( 0) // Network Control Register
+#define EMAC_NCFGR      ( 4) // Network Configuration Register
+#define EMAC_NSR        ( 8) // Network Status Register
+#define EMAC_TSR        (20) // Transmit Status Register
+#define EMAC_RBQP       (24) // Receive Buffer Queue Pointer
+#define EMAC_TBQP       (28) // Transmit Buffer Queue Pointer
+#define EMAC_RSR        (32) // Receive Status Register
+#define EMAC_ISR        (36) // Interrupt Status Register
+#define EMAC_IER        (40) // Interrupt Enable Register
+#define EMAC_IDR        (44) // Interrupt Disable Register
+#define EMAC_IMR        (48) // Interrupt Mask Register
+#define EMAC_MAN        (52) // PHY Maintenance Register
+#define EMAC_PTR        (56) // Pause Time Register
+#define EMAC_PFR        (60) // Pause Frames received Register
+#define EMAC_FTO        (64) // Frames Transmitted OK Register
+#define EMAC_SCF        (68) // Single Collision Frame Register
+#define EMAC_MCF        (72) // Multiple Collision Frame Register
+#define EMAC_FRO        (76) // Frames Received OK Register
+#define EMAC_FCSE       (80) // Frame Check Sequence Error Register
+#define EMAC_ALE        (84) // Alignment Error Register
+#define EMAC_DTF        (88) // Deferred Transmission Frame Register
+#define EMAC_LCOL       (92) // Late Collision Register
+#define EMAC_ECOL       (96) // Excessive Collision Register
+#define EMAC_TUND       (100) // Transmit Underrun Error Register
+#define EMAC_CSE        (104) // Carrier Sense Error Register
+#define EMAC_RRE        (108) // Receive Ressource Error Register
+#define EMAC_ROV        (112) // Receive Overrun Errors Register
+#define EMAC_RSE        (116) // Receive Symbol Errors Register
+#define EMAC_ELE        (120) // Excessive Length Errors Register
+#define EMAC_RJA        (124) // Receive Jabbers Register
+#define EMAC_USF        (128) // Undersize Frames Register
+#define EMAC_STE        (132) // SQE Test Error Register
+#define EMAC_RLE        (136) // Receive Length Field Mismatch Register
+#define EMAC_TPF        (140) // Transmitted Pause Frames Register
+#define EMAC_HRB        (144) // Hash Address Bottom[31:0]
+#define EMAC_HRT        (148) // Hash Address Top[63:32]
+#define EMAC_SA1L       (152) // Specific Address 1 Bottom, First 4 bytes
+#define EMAC_SA1H       (156) // Specific Address 1 Top, Last 2 bytes
+#define EMAC_SA2L       (160) // Specific Address 2 Bottom, First 4 bytes
+#define EMAC_SA2H       (164) // Specific Address 2 Top, Last 2 bytes
+#define EMAC_SA3L       (168) // Specific Address 3 Bottom, First 4 bytes
+#define EMAC_SA3H       (172) // Specific Address 3 Top, Last 2 bytes
+#define EMAC_SA4L       (176) // Specific Address 4 Bottom, First 4 bytes
+#define EMAC_SA4H       (180) // Specific Address 4 Top, Last 2 bytes
+#define EMAC_TID        (184) // Type ID Checking Register
+#define EMAC_TPQ        (188) // Transmit Pause Quantum Register
+#define EMAC_USRIO      (192) // USER Input/Output Register
+#define EMAC_WOL        (196) // Wake On LAN Register
+#define EMAC_REV        (252) // Revision Register
+// -------- EMAC_NCR : (EMAC Offset: 0x0)  --------
+#define AT91C_EMAC_LB             (0x1 <<  0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level.
+#define AT91C_EMAC_LLB            (0x1 <<  1) // (EMAC) Loopback local.
+#define AT91C_EMAC_RE             (0x1 <<  2) // (EMAC) Receive enable.
+#define AT91C_EMAC_TE             (0x1 <<  3) // (EMAC) Transmit enable.
+#define AT91C_EMAC_MPE            (0x1 <<  4) // (EMAC) Management port enable.
+#define AT91C_EMAC_CLRSTAT        (0x1 <<  5) // (EMAC) Clear statistics registers.
+#define AT91C_EMAC_INCSTAT        (0x1 <<  6) // (EMAC) Increment statistics registers.
+#define AT91C_EMAC_WESTAT         (0x1 <<  7) // (EMAC) Write enable for statistics registers.
+#define AT91C_EMAC_BP             (0x1 <<  8) // (EMAC) Back pressure.
+#define AT91C_EMAC_TSTART         (0x1 <<  9) // (EMAC) Start Transmission.
+#define AT91C_EMAC_THALT          (0x1 << 10) // (EMAC) Transmission Halt.
+#define AT91C_EMAC_TPFR           (0x1 << 11) // (EMAC) Transmit pause frame
+#define AT91C_EMAC_TZQ            (0x1 << 12) // (EMAC) Transmit zero quantum pause frame
+// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register --------
+#define AT91C_EMAC_SPD            (0x1 <<  0) // (EMAC) Speed.
+#define AT91C_EMAC_FD             (0x1 <<  1) // (EMAC) Full duplex.
+#define AT91C_EMAC_JFRAME         (0x1 <<  3) // (EMAC) Jumbo Frames.
+#define AT91C_EMAC_CAF            (0x1 <<  4) // (EMAC) Copy all frames.
+#define AT91C_EMAC_NBC            (0x1 <<  5) // (EMAC) No broadcast.
+#define AT91C_EMAC_MTI            (0x1 <<  6) // (EMAC) Multicast hash event enable
+#define AT91C_EMAC_UNI            (0x1 <<  7) // (EMAC) Unicast hash enable.
+#define AT91C_EMAC_BIG            (0x1 <<  8) // (EMAC) Receive 1522 bytes.
+#define AT91C_EMAC_EAE            (0x1 <<  9) // (EMAC) External address match enable.
+#define AT91C_EMAC_CLK            (0x3 << 10) // (EMAC)
+#define     AT91C_EMAC_CLK_HCLK_8               (0x0 << 10) // (EMAC) HCLK divided by 8
+#define     AT91C_EMAC_CLK_HCLK_16              (0x1 << 10) // (EMAC) HCLK divided by 16
+#define     AT91C_EMAC_CLK_HCLK_32              (0x2 << 10) // (EMAC) HCLK divided by 32
+#define     AT91C_EMAC_CLK_HCLK_64              (0x3 << 10) // (EMAC) HCLK divided by 64
+#define AT91C_EMAC_RTY            (0x1 << 12) // (EMAC)
+#define AT91C_EMAC_PAE            (0x1 << 13) // (EMAC)
+#define AT91C_EMAC_RBOF           (0x3 << 14) // (EMAC)
+#define     AT91C_EMAC_RBOF_OFFSET_0             (0x0 << 14) // (EMAC) no offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_1             (0x1 << 14) // (EMAC) one byte offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_2             (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_3             (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer
+#define AT91C_EMAC_RLCE           (0x1 << 16) // (EMAC) Receive Length field Checking Enable
+#define AT91C_EMAC_DRFCS          (0x1 << 17) // (EMAC) Discard Receive FCS
+#define AT91C_EMAC_EFRHD          (0x1 << 18) // (EMAC)
+#define AT91C_EMAC_IRXFCS         (0x1 << 19) // (EMAC) Ignore RX FCS
+// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register --------
+#define AT91C_EMAC_LINKR          (0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_MDIO           (0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_IDLE           (0x1 <<  2) // (EMAC)
+// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register --------
+#define AT91C_EMAC_UBR            (0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_COL            (0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_RLES           (0x1 <<  2) // (EMAC)
+#define AT91C_EMAC_TGO            (0x1 <<  3) // (EMAC) Transmit Go
+#define AT91C_EMAC_BEX            (0x1 <<  4) // (EMAC) Buffers exhausted mid frame
+#define AT91C_EMAC_COMP           (0x1 <<  5) // (EMAC)
+#define AT91C_EMAC_UND            (0x1 <<  6) // (EMAC)
+// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register --------
+#define AT91C_EMAC_BNA            (0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_REC            (0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_OVR            (0x1 <<  2) // (EMAC)
+// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register --------
+#define AT91C_EMAC_MFD            (0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_RCOMP          (0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_RXUBR          (0x1 <<  2) // (EMAC)
+#define AT91C_EMAC_TXUBR          (0x1 <<  3) // (EMAC)
+#define AT91C_EMAC_TUNDR          (0x1 <<  4) // (EMAC)
+#define AT91C_EMAC_RLEX           (0x1 <<  5) // (EMAC)
+#define AT91C_EMAC_TXERR          (0x1 <<  6) // (EMAC)
+#define AT91C_EMAC_TCOMP          (0x1 <<  7) // (EMAC)
+#define AT91C_EMAC_LINK           (0x1 <<  9) // (EMAC)
+#define AT91C_EMAC_ROVR           (0x1 << 10) // (EMAC)
+#define AT91C_EMAC_HRESP          (0x1 << 11) // (EMAC)
+#define AT91C_EMAC_PFRE           (0x1 << 12) // (EMAC)
+#define AT91C_EMAC_PTZ            (0x1 << 13) // (EMAC)
+// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register --------
+// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register --------
+// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register --------
+// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register --------
+#define AT91C_EMAC_DATA           (0xFFFF <<  0) // (EMAC)
+#define AT91C_EMAC_CODE           (0x3 << 16) // (EMAC)
+#define AT91C_EMAC_REGA           (0x1F << 18) // (EMAC)
+#define AT91C_EMAC_PHYA           (0x1F << 23) // (EMAC)
+#define AT91C_EMAC_RW             (0x3 << 28) // (EMAC)
+#define AT91C_EMAC_SOF            (0x3 << 30) // (EMAC)
+// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register --------
+#define AT91C_EMAC_RMII           (0x1 <<  0) // (EMAC) Reduce MII
+// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register --------
+#define AT91C_EMAC_IP             (0xFFFF <<  0) // (EMAC) ARP request IP address
+#define AT91C_EMAC_MAG            (0x1 << 16) // (EMAC) Magic packet event enable
+#define AT91C_EMAC_ARP            (0x1 << 17) // (EMAC) ARP request event enable
+#define AT91C_EMAC_SA1            (0x1 << 18) // (EMAC) Specific address register 1 event enable
+// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register --------
+#define AT91C_EMAC_REVREF         (0xFFFF <<  0) // (EMAC)
+#define AT91C_EMAC_PARTREF        (0xFFFF << 16) // (EMAC)
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor
+// *****************************************************************************
+// *** Register offset in AT91S_ADC structure ***
+#define ADC_CR          ( 0) // ADC Control Register
+#define ADC_MR          ( 4) // ADC Mode Register
+#define ADC_CHER        (16) // ADC Channel Enable Register
+#define ADC_CHDR        (20) // ADC Channel Disable Register
+#define ADC_CHSR        (24) // ADC Channel Status Register
+#define ADC_SR          (28) // ADC Status Register
+#define ADC_LCDR        (32) // ADC Last Converted Data Register
+#define ADC_IER         (36) // ADC Interrupt Enable Register
+#define ADC_IDR         (40) // ADC Interrupt Disable Register
+#define ADC_IMR         (44) // ADC Interrupt Mask Register
+#define ADC_CDR0        (48) // ADC Channel Data Register 0
+#define ADC_CDR1        (52) // ADC Channel Data Register 1
+#define ADC_CDR2        (56) // ADC Channel Data Register 2
+#define ADC_CDR3        (60) // ADC Channel Data Register 3
+#define ADC_CDR4        (64) // ADC Channel Data Register 4
+#define ADC_CDR5        (68) // ADC Channel Data Register 5
+#define ADC_CDR6        (72) // ADC Channel Data Register 6
+#define ADC_CDR7        (76) // ADC Channel Data Register 7
+#define ADC_RPR         (256) // Receive Pointer Register
+#define ADC_RCR         (260) // Receive Counter Register
+#define ADC_TPR         (264) // Transmit Pointer Register
+#define ADC_TCR         (268) // Transmit Counter Register
+#define ADC_RNPR        (272) // Receive Next Pointer Register
+#define ADC_RNCR        (276) // Receive Next Counter Register
+#define ADC_TNPR        (280) // Transmit Next Pointer Register
+#define ADC_TNCR        (284) // Transmit Next Counter Register
+#define ADC_PTCR        (288) // PDC Transfer Control Register
+#define ADC_PTSR        (292) // PDC Transfer Status Register
+// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register --------
+#define AT91C_ADC_SWRST           (0x1 <<  0) // (ADC) Software Reset
+#define AT91C_ADC_START           (0x1 <<  1) // (ADC) Start Conversion
+// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register --------
+#define AT91C_ADC_TRGEN           (0x1 <<  0) // (ADC) Trigger Enable
+#define     AT91C_ADC_TRGEN_DIS                  (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software
+#define     AT91C_ADC_TRGEN_EN                   (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.
+#define AT91C_ADC_TRGSEL          (0x7 <<  1) // (ADC) Trigger Selection
+#define     AT91C_ADC_TRGSEL_TIOA0                (0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0
+#define     AT91C_ADC_TRGSEL_TIOA1                (0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1
+#define     AT91C_ADC_TRGSEL_TIOA2                (0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2
+#define     AT91C_ADC_TRGSEL_TIOA3                (0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3
+#define     AT91C_ADC_TRGSEL_TIOA4                (0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4
+#define     AT91C_ADC_TRGSEL_TIOA5                (0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5
+#define     AT91C_ADC_TRGSEL_EXT                  (0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger
+#define AT91C_ADC_LOWRES          (0x1 <<  4) // (ADC) Resolution.
+#define     AT91C_ADC_LOWRES_10_BIT               (0x0 <<  4) // (ADC) 10-bit resolution
+#define     AT91C_ADC_LOWRES_8_BIT                (0x1 <<  4) // (ADC) 8-bit resolution
+#define AT91C_ADC_SLEEP           (0x1 <<  5) // (ADC) Sleep Mode
+#define     AT91C_ADC_SLEEP_NORMAL_MODE          (0x0 <<  5) // (ADC) Normal Mode
+#define     AT91C_ADC_SLEEP_MODE                 (0x1 <<  5) // (ADC) Sleep Mode
+#define AT91C_ADC_PRESCAL         (0x3F <<  8) // (ADC) Prescaler rate selection
+#define AT91C_ADC_STARTUP         (0x1F << 16) // (ADC) Startup Time
+#define AT91C_ADC_SHTIM           (0xF << 24) // (ADC) Sample & Hold Time
+// --------     ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register --------
+#define AT91C_ADC_CH0             (0x1 <<  0) // (ADC) Channel 0
+#define AT91C_ADC_CH1             (0x1 <<  1) // (ADC) Channel 1
+#define AT91C_ADC_CH2             (0x1 <<  2) // (ADC) Channel 2
+#define AT91C_ADC_CH3             (0x1 <<  3) // (ADC) Channel 3
+#define AT91C_ADC_CH4             (0x1 <<  4) // (ADC) Channel 4
+#define AT91C_ADC_CH5             (0x1 <<  5) // (ADC) Channel 5
+#define AT91C_ADC_CH6             (0x1 <<  6) // (ADC) Channel 6
+#define AT91C_ADC_CH7             (0x1 <<  7) // (ADC) Channel 7
+// --------     ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register --------
+// --------     ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register --------
+// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register --------
+#define AT91C_ADC_EOC0            (0x1 <<  0) // (ADC) End of Conversion
+#define AT91C_ADC_EOC1            (0x1 <<  1) // (ADC) End of Conversion
+#define AT91C_ADC_EOC2            (0x1 <<  2) // (ADC) End of Conversion
+#define AT91C_ADC_EOC3            (0x1 <<  3) // (ADC) End of Conversion
+#define AT91C_ADC_EOC4            (0x1 <<  4) // (ADC) End of Conversion
+#define AT91C_ADC_EOC5            (0x1 <<  5) // (ADC) End of Conversion
+#define AT91C_ADC_EOC6            (0x1 <<  6) // (ADC) End of Conversion
+#define AT91C_ADC_EOC7            (0x1 <<  7) // (ADC) End of Conversion
+#define AT91C_ADC_OVRE0           (0x1 <<  8) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE1           (0x1 <<  9) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE2           (0x1 << 10) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE3           (0x1 << 11) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE4           (0x1 << 12) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE5           (0x1 << 13) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE6           (0x1 << 14) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE7           (0x1 << 15) // (ADC) Overrun Error
+#define AT91C_ADC_DRDY            (0x1 << 16) // (ADC) Data Ready
+#define AT91C_ADC_GOVRE           (0x1 << 17) // (ADC) General Overrun
+#define AT91C_ADC_ENDRX           (0x1 << 18) // (ADC) End of Receiver Transfer
+#define AT91C_ADC_RXBUFF          (0x1 << 19) // (ADC) RXBUFF Interrupt
+// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register --------
+#define AT91C_ADC_LDATA           (0x3FF <<  0) // (ADC) Last Data Converted
+// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register --------
+// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register --------
+// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register --------
+// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 --------
+#define AT91C_ADC_DATA            (0x3FF <<  0) // (ADC) Converted Data
+// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 --------
+// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 --------
+// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 --------
+// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 --------
+// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 --------
+// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 --------
+// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Advanced  Encryption Standard
+// *****************************************************************************
+// *** Register offset in AT91S_AES structure ***
+#define AES_CR          ( 0) // Control Register
+#define AES_MR          ( 4) // Mode Register
+#define AES_IER         (16) // Interrupt Enable Register
+#define AES_IDR         (20) // Interrupt Disable Register
+#define AES_IMR         (24) // Interrupt Mask Register
+#define AES_ISR         (28) // Interrupt Status Register
+#define AES_KEYWxR      (32) // Key Word x Register
+#define AES_IDATAxR     (64) // Input Data x Register
+#define AES_ODATAxR     (80) // Output Data x Register
+#define AES_IVxR        (96) // Initialization Vector x Register
+#define AES_VR          (252) // AES Version Register
+#define AES_RPR         (256) // Receive Pointer Register
+#define AES_RCR         (260) // Receive Counter Register
+#define AES_TPR         (264) // Transmit Pointer Register
+#define AES_TCR         (268) // Transmit Counter Register
+#define AES_RNPR        (272) // Receive Next Pointer Register
+#define AES_RNCR        (276) // Receive Next Counter Register
+#define AES_TNPR        (280) // Transmit Next Pointer Register
+#define AES_TNCR        (284) // Transmit Next Counter Register
+#define AES_PTCR        (288) // PDC Transfer Control Register
+#define AES_PTSR        (292) // PDC Transfer Status Register
+// -------- AES_CR : (AES Offset: 0x0) Control Register --------
+#define AT91C_AES_START           (0x1 <<  0) // (AES) Starts Processing
+#define AT91C_AES_SWRST           (0x1 <<  8) // (AES) Software Reset
+#define AT91C_AES_LOADSEED        (0x1 << 16) // (AES) Random Number Generator Seed Loading
+// -------- AES_MR : (AES Offset: 0x4) Mode Register --------
+#define AT91C_AES_CIPHER          (0x1 <<  0) // (AES) Processing Mode
+#define AT91C_AES_PROCDLY         (0xF <<  4) // (AES) Processing Delay
+#define AT91C_AES_SMOD            (0x3 <<  8) // (AES) Start Mode
+#define     AT91C_AES_SMOD_MANUAL               (0x0 <<  8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption.
+#define     AT91C_AES_SMOD_AUTO                 (0x1 <<  8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet).
+#define     AT91C_AES_SMOD_PDC                  (0x2 <<  8) // (AES) PDC Mode (cf datasheet).
+#define AT91C_AES_OPMOD           (0x7 << 12) // (AES) Operation Mode
+#define     AT91C_AES_OPMOD_ECB                  (0x0 << 12) // (AES) ECB Electronic CodeBook mode.
+#define     AT91C_AES_OPMOD_CBC                  (0x1 << 12) // (AES) CBC Cipher Block Chaining mode.
+#define     AT91C_AES_OPMOD_OFB                  (0x2 << 12) // (AES) OFB Output Feedback mode.
+#define     AT91C_AES_OPMOD_CFB                  (0x3 << 12) // (AES) CFB Cipher Feedback mode.
+#define     AT91C_AES_OPMOD_CTR                  (0x4 << 12) // (AES) CTR Counter mode.
+#define AT91C_AES_LOD             (0x1 << 15) // (AES) Last Output Data Mode
+#define AT91C_AES_CFBS            (0x7 << 16) // (AES) Cipher Feedback Data Size
+#define     AT91C_AES_CFBS_128_BIT              (0x0 << 16) // (AES) 128-bit.
+#define     AT91C_AES_CFBS_64_BIT               (0x1 << 16) // (AES) 64-bit.
+#define     AT91C_AES_CFBS_32_BIT               (0x2 << 16) // (AES) 32-bit.
+#define     AT91C_AES_CFBS_16_BIT               (0x3 << 16) // (AES) 16-bit.
+#define     AT91C_AES_CFBS_8_BIT                (0x4 << 16) // (AES) 8-bit.
+#define AT91C_AES_CKEY            (0xF << 20) // (AES) Countermeasure Key
+#define AT91C_AES_CTYPE           (0x1F << 24) // (AES) Countermeasure Type
+#define     AT91C_AES_CTYPE_TYPE1_EN             (0x1 << 24) // (AES) Countermeasure type 1 is enabled.
+#define     AT91C_AES_CTYPE_TYPE2_EN             (0x2 << 24) // (AES) Countermeasure type 2 is enabled.
+#define     AT91C_AES_CTYPE_TYPE3_EN             (0x4 << 24) // (AES) Countermeasure type 3 is enabled.
+#define     AT91C_AES_CTYPE_TYPE4_EN             (0x8 << 24) // (AES) Countermeasure type 4 is enabled.
+#define     AT91C_AES_CTYPE_TYPE5_EN             (0x10 << 24) // (AES) Countermeasure type 5 is enabled.
+// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register --------
+#define AT91C_AES_DATRDY          (0x1 <<  0) // (AES) DATRDY
+#define AT91C_AES_ENDRX           (0x1 <<  1) // (AES) PDC Read Buffer End
+#define AT91C_AES_ENDTX           (0x1 <<  2) // (AES) PDC Write Buffer End
+#define AT91C_AES_RXBUFF          (0x1 <<  3) // (AES) PDC Read Buffer Full
+#define AT91C_AES_TXBUFE          (0x1 <<  4) // (AES) PDC Write Buffer Empty
+#define AT91C_AES_URAD            (0x1 <<  8) // (AES) Unspecified Register Access Detection
+// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register --------
+// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register --------
+// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register --------
+#define AT91C_AES_URAT            (0x7 << 12) // (AES) Unspecified Register Access Type Status
+#define     AT91C_AES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (AES) Input data register written during the data processing in PDC mode.
+#define     AT91C_AES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (AES) Output data register read during the data processing.
+#define     AT91C_AES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (AES) Mode register written during the data processing.
+#define     AT91C_AES_URAT_OUT_DAT_READ_SUBKEY  (0x3 << 12) // (AES) Output data register read during the sub-keys generation.
+#define     AT91C_AES_URAT_MODEREG_WRITE_SUBKEY (0x4 << 12) // (AES) Mode register written during the sub-keys generation.
+#define     AT91C_AES_URAT_WO_REG_READ          (0x5 << 12) // (AES) Write-only register read access.
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Triple Data Encryption Standard
+// *****************************************************************************
+// *** Register offset in AT91S_TDES structure ***
+#define TDES_CR         ( 0) // Control Register
+#define TDES_MR         ( 4) // Mode Register
+#define TDES_IER        (16) // Interrupt Enable Register
+#define TDES_IDR        (20) // Interrupt Disable Register
+#define TDES_IMR        (24) // Interrupt Mask Register
+#define TDES_ISR        (28) // Interrupt Status Register
+#define TDES_KEY1WxR    (32) // Key 1 Word x Register
+#define TDES_KEY2WxR    (40) // Key 2 Word x Register
+#define TDES_KEY3WxR    (48) // Key 3 Word x Register
+#define TDES_IDATAxR    (64) // Input Data x Register
+#define TDES_ODATAxR    (80) // Output Data x Register
+#define TDES_IVxR       (96) // Initialization Vector x Register
+#define TDES_VR         (252) // TDES Version Register
+#define TDES_RPR        (256) // Receive Pointer Register
+#define TDES_RCR        (260) // Receive Counter Register
+#define TDES_TPR        (264) // Transmit Pointer Register
+#define TDES_TCR        (268) // Transmit Counter Register
+#define TDES_RNPR       (272) // Receive Next Pointer Register
+#define TDES_RNCR       (276) // Receive Next Counter Register
+#define TDES_TNPR       (280) // Transmit Next Pointer Register
+#define TDES_TNCR       (284) // Transmit Next Counter Register
+#define TDES_PTCR       (288) // PDC Transfer Control Register
+#define TDES_PTSR       (292) // PDC Transfer Status Register
+// -------- TDES_CR : (TDES Offset: 0x0) Control Register --------
+#define AT91C_TDES_START          (0x1 <<  0) // (TDES) Starts Processing
+#define AT91C_TDES_SWRST          (0x1 <<  8) // (TDES) Software Reset
+// -------- TDES_MR : (TDES Offset: 0x4) Mode Register --------
+#define AT91C_TDES_CIPHER         (0x1 <<  0) // (TDES) Processing Mode
+#define AT91C_TDES_TDESMOD        (0x1 <<  1) // (TDES) Single or Triple DES Mode
+#define AT91C_TDES_KEYMOD         (0x1 <<  4) // (TDES) Key Mode
+#define AT91C_TDES_SMOD           (0x3 <<  8) // (TDES) Start Mode
+#define     AT91C_TDES_SMOD_MANUAL               (0x0 <<  8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption.
+#define     AT91C_TDES_SMOD_AUTO                 (0x1 <<  8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet).
+#define     AT91C_TDES_SMOD_PDC                  (0x2 <<  8) // (TDES) PDC Mode (cf datasheet).
+#define AT91C_TDES_OPMOD          (0x3 << 12) // (TDES) Operation Mode
+#define     AT91C_TDES_OPMOD_ECB                  (0x0 << 12) // (TDES) ECB Electronic CodeBook mode.
+#define     AT91C_TDES_OPMOD_CBC                  (0x1 << 12) // (TDES) CBC Cipher Block Chaining mode.
+#define     AT91C_TDES_OPMOD_OFB                  (0x2 << 12) // (TDES) OFB Output Feedback mode.
+#define     AT91C_TDES_OPMOD_CFB                  (0x3 << 12) // (TDES) CFB Cipher Feedback mode.
+#define AT91C_TDES_LOD            (0x1 << 15) // (TDES) Last Output Data Mode
+#define AT91C_TDES_CFBS           (0x3 << 16) // (TDES) Cipher Feedback Data Size
+#define     AT91C_TDES_CFBS_64_BIT               (0x0 << 16) // (TDES) 64-bit.
+#define     AT91C_TDES_CFBS_32_BIT               (0x1 << 16) // (TDES) 32-bit.
+#define     AT91C_TDES_CFBS_16_BIT               (0x2 << 16) // (TDES) 16-bit.
+#define     AT91C_TDES_CFBS_8_BIT                (0x3 << 16) // (TDES) 8-bit.
+// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register --------
+#define AT91C_TDES_DATRDY         (0x1 <<  0) // (TDES) DATRDY
+#define AT91C_TDES_ENDRX          (0x1 <<  1) // (TDES) PDC Read Buffer End
+#define AT91C_TDES_ENDTX          (0x1 <<  2) // (TDES) PDC Write Buffer End
+#define AT91C_TDES_RXBUFF         (0x1 <<  3) // (TDES) PDC Read Buffer Full
+#define AT91C_TDES_TXBUFE         (0x1 <<  4) // (TDES) PDC Write Buffer Empty
+#define AT91C_TDES_URAD           (0x1 <<  8) // (TDES) Unspecified Register Access Detection
+// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register --------
+// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register --------
+// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register --------
+#define AT91C_TDES_URAT           (0x3 << 12) // (TDES) Unspecified Register Access Type Status
+#define     AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode.
+#define     AT91C_TDES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (TDES) Output data register read during the data processing.
+#define     AT91C_TDES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (TDES) Mode register written during the data processing.
+#define     AT91C_TDES_URAT_WO_REG_READ          (0x3 << 12) // (TDES) Write-only register read access.
+
+// *****************************************************************************
+//               REGISTER ADDRESS DEFINITION FOR AT91SAM7X128
+// *****************************************************************************
+// ========== Register definition for SYS peripheral ==========
+// ========== Register definition for AIC peripheral ==========
+#define AT91C_AIC_IVR             (0xFFFFF100) // (AIC) IRQ Vector Register
+#define AT91C_AIC_SMR             (0xFFFFF000) // (AIC) Source Mode Register
+#define AT91C_AIC_FVR             (0xFFFFF104) // (AIC) FIQ Vector Register
+#define AT91C_AIC_DCR             (0xFFFFF138) // (AIC) Debug Control Register (Protect)
+#define AT91C_AIC_EOICR           (0xFFFFF130) // (AIC) End of Interrupt Command Register
+#define AT91C_AIC_SVR             (0xFFFFF080) // (AIC) Source Vector Register
+#define AT91C_AIC_FFSR            (0xFFFFF148) // (AIC) Fast Forcing Status Register
+#define AT91C_AIC_ICCR            (0xFFFFF128) // (AIC) Interrupt Clear Command Register
+#define AT91C_AIC_ISR             (0xFFFFF108) // (AIC) Interrupt Status Register
+#define AT91C_AIC_IMR             (0xFFFFF110) // (AIC) Interrupt Mask Register
+#define AT91C_AIC_IPR             (0xFFFFF10C) // (AIC) Interrupt Pending Register
+#define AT91C_AIC_FFER            (0xFFFFF140) // (AIC) Fast Forcing Enable Register
+#define AT91C_AIC_IECR            (0xFFFFF120) // (AIC) Interrupt Enable Command Register
+#define AT91C_AIC_ISCR            (0xFFFFF12C) // (AIC) Interrupt Set Command Register
+#define AT91C_AIC_FFDR            (0xFFFFF144) // (AIC) Fast Forcing Disable Register
+#define AT91C_AIC_CISR            (0xFFFFF114) // (AIC) Core Interrupt Status Register
+#define AT91C_AIC_IDCR            (0xFFFFF124) // (AIC) Interrupt Disable Command Register
+#define AT91C_AIC_SPU             (0xFFFFF134) // (AIC) Spurious Vector Register
+// ========== Register definition for PDC_DBGU peripheral ==========
+#define AT91C_DBGU_TCR            (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register
+#define AT91C_DBGU_RNPR           (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register
+#define AT91C_DBGU_TNPR           (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register
+#define AT91C_DBGU_TPR            (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register
+#define AT91C_DBGU_RPR            (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register
+#define AT91C_DBGU_RCR            (0xFFFFF304) // (PDC_DBGU) Receive Counter Register
+#define AT91C_DBGU_RNCR           (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register
+#define AT91C_DBGU_PTCR           (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register
+#define AT91C_DBGU_PTSR           (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register
+#define AT91C_DBGU_TNCR           (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register
+// ========== Register definition for DBGU peripheral ==========
+#define AT91C_DBGU_EXID           (0xFFFFF244) // (DBGU) Chip ID Extension Register
+#define AT91C_DBGU_BRGR           (0xFFFFF220) // (DBGU) Baud Rate Generator Register
+#define AT91C_DBGU_IDR            (0xFFFFF20C) // (DBGU) Interrupt Disable Register
+#define AT91C_DBGU_CSR            (0xFFFFF214) // (DBGU) Channel Status Register
+#define AT91C_DBGU_CIDR           (0xFFFFF240) // (DBGU) Chip ID Register
+#define AT91C_DBGU_MR             (0xFFFFF204) // (DBGU) Mode Register
+#define AT91C_DBGU_IMR            (0xFFFFF210) // (DBGU) Interrupt Mask Register
+#define AT91C_DBGU_CR             (0xFFFFF200) // (DBGU) Control Register
+#define AT91C_DBGU_FNTR           (0xFFFFF248) // (DBGU) Force NTRST Register
+#define AT91C_DBGU_THR            (0xFFFFF21C) // (DBGU) Transmitter Holding Register
+#define AT91C_DBGU_RHR            (0xFFFFF218) // (DBGU) Receiver Holding Register
+#define AT91C_DBGU_IER            (0xFFFFF208) // (DBGU) Interrupt Enable Register
+// ========== Register definition for PIOA peripheral ==========
+#define AT91C_PIOA_ODR            (0xFFFFF414) // (PIOA) Output Disable Registerr
+#define AT91C_PIOA_SODR           (0xFFFFF430) // (PIOA) Set Output Data Register
+#define AT91C_PIOA_ISR            (0xFFFFF44C) // (PIOA) Interrupt Status Register
+#define AT91C_PIOA_ABSR           (0xFFFFF478) // (PIOA) AB Select Status Register
+#define AT91C_PIOA_IER            (0xFFFFF440) // (PIOA) Interrupt Enable Register
+#define AT91C_PIOA_PPUDR          (0xFFFFF460) // (PIOA) Pull-up Disable Register
+#define AT91C_PIOA_IMR            (0xFFFFF448) // (PIOA) Interrupt Mask Register
+#define AT91C_PIOA_PER            (0xFFFFF400) // (PIOA) PIO Enable Register
+#define AT91C_PIOA_IFDR           (0xFFFFF424) // (PIOA) Input Filter Disable Register
+#define AT91C_PIOA_OWDR           (0xFFFFF4A4) // (PIOA) Output Write Disable Register
+#define AT91C_PIOA_MDSR           (0xFFFFF458) // (PIOA) Multi-driver Status Register
+#define AT91C_PIOA_IDR            (0xFFFFF444) // (PIOA) Interrupt Disable Register
+#define AT91C_PIOA_ODSR           (0xFFFFF438) // (PIOA) Output Data Status Register
+#define AT91C_PIOA_PPUSR          (0xFFFFF468) // (PIOA) Pull-up Status Register
+#define AT91C_PIOA_OWSR           (0xFFFFF4A8) // (PIOA) Output Write Status Register
+#define AT91C_PIOA_BSR            (0xFFFFF474) // (PIOA) Select B Register
+#define AT91C_PIOA_OWER           (0xFFFFF4A0) // (PIOA) Output Write Enable Register
+#define AT91C_PIOA_IFER           (0xFFFFF420) // (PIOA) Input Filter Enable Register
+#define AT91C_PIOA_PDSR           (0xFFFFF43C) // (PIOA) Pin Data Status Register
+#define AT91C_PIOA_PPUER          (0xFFFFF464) // (PIOA) Pull-up Enable Register
+#define AT91C_PIOA_OSR            (0xFFFFF418) // (PIOA) Output Status Register
+#define AT91C_PIOA_ASR            (0xFFFFF470) // (PIOA) Select A Register
+#define AT91C_PIOA_MDDR           (0xFFFFF454) // (PIOA) Multi-driver Disable Register
+#define AT91C_PIOA_CODR           (0xFFFFF434) // (PIOA) Clear Output Data Register
+#define AT91C_PIOA_MDER           (0xFFFFF450) // (PIOA) Multi-driver Enable Register
+#define AT91C_PIOA_PDR            (0xFFFFF404) // (PIOA) PIO Disable Register
+#define AT91C_PIOA_IFSR           (0xFFFFF428) // (PIOA) Input Filter Status Register
+#define AT91C_PIOA_OER            (0xFFFFF410) // (PIOA) Output Enable Register
+#define AT91C_PIOA_PSR            (0xFFFFF408) // (PIOA) PIO Status Register
+// ========== Register definition for PIOB peripheral ==========
+#define AT91C_PIOB_OWDR           (0xFFFFF6A4) // (PIOB) Output Write Disable Register
+#define AT91C_PIOB_MDER           (0xFFFFF650) // (PIOB) Multi-driver Enable Register
+#define AT91C_PIOB_PPUSR          (0xFFFFF668) // (PIOB) Pull-up Status Register
+#define AT91C_PIOB_IMR            (0xFFFFF648) // (PIOB) Interrupt Mask Register
+#define AT91C_PIOB_ASR            (0xFFFFF670) // (PIOB) Select A Register
+#define AT91C_PIOB_PPUDR          (0xFFFFF660) // (PIOB) Pull-up Disable Register
+#define AT91C_PIOB_PSR            (0xFFFFF608) // (PIOB) PIO Status Register
+#define AT91C_PIOB_IER            (0xFFFFF640) // (PIOB) Interrupt Enable Register
+#define AT91C_PIOB_CODR           (0xFFFFF634) // (PIOB) Clear Output Data Register
+#define AT91C_PIOB_OWER           (0xFFFFF6A0) // (PIOB) Output Write Enable Register
+#define AT91C_PIOB_ABSR           (0xFFFFF678) // (PIOB) AB Select Status Register
+#define AT91C_PIOB_IFDR           (0xFFFFF624) // (PIOB) Input Filter Disable Register
+#define AT91C_PIOB_PDSR           (0xFFFFF63C) // (PIOB) Pin Data Status Register
+#define AT91C_PIOB_IDR            (0xFFFFF644) // (PIOB) Interrupt Disable Register
+#define AT91C_PIOB_OWSR           (0xFFFFF6A8) // (PIOB) Output Write Status Register
+#define AT91C_PIOB_PDR            (0xFFFFF604) // (PIOB) PIO Disable Register
+#define AT91C_PIOB_ODR            (0xFFFFF614) // (PIOB) Output Disable Registerr
+#define AT91C_PIOB_IFSR           (0xFFFFF628) // (PIOB) Input Filter Status Register
+#define AT91C_PIOB_PPUER          (0xFFFFF664) // (PIOB) Pull-up Enable Register
+#define AT91C_PIOB_SODR           (0xFFFFF630) // (PIOB) Set Output Data Register
+#define AT91C_PIOB_ISR            (0xFFFFF64C) // (PIOB) Interrupt Status Register
+#define AT91C_PIOB_ODSR           (0xFFFFF638) // (PIOB) Output Data Status Register
+#define AT91C_PIOB_OSR            (0xFFFFF618) // (PIOB) Output Status Register
+#define AT91C_PIOB_MDSR           (0xFFFFF658) // (PIOB) Multi-driver Status Register
+#define AT91C_PIOB_IFER           (0xFFFFF620) // (PIOB) Input Filter Enable Register
+#define AT91C_PIOB_BSR            (0xFFFFF674) // (PIOB) Select B Register
+#define AT91C_PIOB_MDDR           (0xFFFFF654) // (PIOB) Multi-driver Disable Register
+#define AT91C_PIOB_OER            (0xFFFFF610) // (PIOB) Output Enable Register
+#define AT91C_PIOB_PER            (0xFFFFF600) // (PIOB) PIO Enable Register
+// ========== Register definition for CKGR peripheral ==========
+#define AT91C_CKGR_MOR            (0xFFFFFC20) // (CKGR) Main Oscillator Register
+#define AT91C_CKGR_PLLR           (0xFFFFFC2C) // (CKGR) PLL Register
+#define AT91C_CKGR_MCFR           (0xFFFFFC24) // (CKGR) Main Clock  Frequency Register
+// ========== Register definition for PMC peripheral ==========
+#define AT91C_PMC_IDR             (0xFFFFFC64) // (PMC) Interrupt Disable Register
+#define AT91C_PMC_MOR             (0xFFFFFC20) // (PMC) Main Oscillator Register
+#define AT91C_PMC_PLLR            (0xFFFFFC2C) // (PMC) PLL Register
+#define AT91C_PMC_PCER            (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register
+#define AT91C_PMC_PCKR            (0xFFFFFC40) // (PMC) Programmable Clock Register
+#define AT91C_PMC_MCKR            (0xFFFFFC30) // (PMC) Master Clock Register
+#define AT91C_PMC_SCDR            (0xFFFFFC04) // (PMC) System Clock Disable Register
+#define AT91C_PMC_PCDR            (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register
+#define AT91C_PMC_SCSR            (0xFFFFFC08) // (PMC) System Clock Status Register
+#define AT91C_PMC_PCSR            (0xFFFFFC18) // (PMC) Peripheral Clock Status Register
+#define AT91C_PMC_MCFR            (0xFFFFFC24) // (PMC) Main Clock  Frequency Register
+#define AT91C_PMC_SCER            (0xFFFFFC00) // (PMC) System Clock Enable Register
+#define AT91C_PMC_IMR             (0xFFFFFC6C) // (PMC) Interrupt Mask Register
+#define AT91C_PMC_IER             (0xFFFFFC60) // (PMC) Interrupt Enable Register
+#define AT91C_PMC_SR              (0xFFFFFC68) // (PMC) Status Register
+// ========== Register definition for RSTC peripheral ==========
+#define AT91C_RSTC_RCR            (0xFFFFFD00) // (RSTC) Reset Control Register
+#define AT91C_RSTC_RMR            (0xFFFFFD08) // (RSTC) Reset Mode Register
+#define AT91C_RSTC_RSR            (0xFFFFFD04) // (RSTC) Reset Status Register
+// ========== Register definition for RTTC peripheral ==========
+#define AT91C_RTTC_RTSR           (0xFFFFFD2C) // (RTTC) Real-time Status Register
+#define AT91C_RTTC_RTMR           (0xFFFFFD20) // (RTTC) Real-time Mode Register
+#define AT91C_RTTC_RTVR           (0xFFFFFD28) // (RTTC) Real-time Value Register
+#define AT91C_RTTC_RTAR           (0xFFFFFD24) // (RTTC) Real-time Alarm Register
+// ========== Register definition for PITC peripheral ==========
+#define AT91C_PITC_PIVR           (0xFFFFFD38) // (PITC) Period Interval Value Register
+#define AT91C_PITC_PISR           (0xFFFFFD34) // (PITC) Period Interval Status Register
+#define AT91C_PITC_PIIR           (0xFFFFFD3C) // (PITC) Period Interval Image Register
+#define AT91C_PITC_PIMR           (0xFFFFFD30) // (PITC) Period Interval Mode Register
+// ========== Register definition for WDTC peripheral ==========
+#define AT91C_WDTC_WDCR           (0xFFFFFD40) // (WDTC) Watchdog Control Register
+#define AT91C_WDTC_WDSR           (0xFFFFFD48) // (WDTC) Watchdog Status Register
+#define AT91C_WDTC_WDMR           (0xFFFFFD44) // (WDTC) Watchdog Mode Register
+// ========== Register definition for VREG peripheral ==========
+#define AT91C_VREG_MR             (0xFFFFFD60) // (VREG) Voltage Regulator Mode Register
+// ========== Register definition for MC peripheral ==========
+#define AT91C_MC_ASR              (0xFFFFFF04) // (MC) MC Abort Status Register
+#define AT91C_MC_RCR              (0xFFFFFF00) // (MC) MC Remap Control Register
+#define AT91C_MC_FCR              (0xFFFFFF64) // (MC) MC Flash Command Register
+#define AT91C_MC_AASR             (0xFFFFFF08) // (MC) MC Abort Address Status Register
+#define AT91C_MC_FSR              (0xFFFFFF68) // (MC) MC Flash Status Register
+#define AT91C_MC_FMR              (0xFFFFFF60) // (MC) MC Flash Mode Register
+// ========== Register definition for PDC_SPI1 peripheral ==========
+#define AT91C_SPI1_PTCR           (0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register
+#define AT91C_SPI1_RPR            (0xFFFE4100) // (PDC_SPI1) Receive Pointer Register
+#define AT91C_SPI1_TNCR           (0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register
+#define AT91C_SPI1_TPR            (0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register
+#define AT91C_SPI1_TNPR           (0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register
+#define AT91C_SPI1_TCR            (0xFFFE410C) // (PDC_SPI1) Transmit Counter Register
+#define AT91C_SPI1_RCR            (0xFFFE4104) // (PDC_SPI1) Receive Counter Register
+#define AT91C_SPI1_RNPR           (0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register
+#define AT91C_SPI1_RNCR           (0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register
+#define AT91C_SPI1_PTSR           (0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register
+// ========== Register definition for SPI1 peripheral ==========
+#define AT91C_SPI1_IMR            (0xFFFE401C) // (SPI1) Interrupt Mask Register
+#define AT91C_SPI1_IER            (0xFFFE4014) // (SPI1) Interrupt Enable Register
+#define AT91C_SPI1_MR             (0xFFFE4004) // (SPI1) Mode Register
+#define AT91C_SPI1_RDR            (0xFFFE4008) // (SPI1) Receive Data Register
+#define AT91C_SPI1_IDR            (0xFFFE4018) // (SPI1) Interrupt Disable Register
+#define AT91C_SPI1_SR             (0xFFFE4010) // (SPI1) Status Register
+#define AT91C_SPI1_TDR            (0xFFFE400C) // (SPI1) Transmit Data Register
+#define AT91C_SPI1_CR             (0xFFFE4000) // (SPI1) Control Register
+#define AT91C_SPI1_CSR            (0xFFFE4030) // (SPI1) Chip Select Register
+// ========== Register definition for PDC_SPI0 peripheral ==========
+#define AT91C_SPI0_PTCR           (0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register
+#define AT91C_SPI0_TPR            (0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register
+#define AT91C_SPI0_TCR            (0xFFFE010C) // (PDC_SPI0) Transmit Counter Register
+#define AT91C_SPI0_RCR            (0xFFFE0104) // (PDC_SPI0) Receive Counter Register
+#define AT91C_SPI0_PTSR           (0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register
+#define AT91C_SPI0_RNPR           (0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register
+#define AT91C_SPI0_RPR            (0xFFFE0100) // (PDC_SPI0) Receive Pointer Register
+#define AT91C_SPI0_TNCR           (0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register
+#define AT91C_SPI0_RNCR           (0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register
+#define AT91C_SPI0_TNPR           (0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register
+// ========== Register definition for SPI0 peripheral ==========
+#define AT91C_SPI0_IER            (0xFFFE0014) // (SPI0) Interrupt Enable Register
+#define AT91C_SPI0_SR             (0xFFFE0010) // (SPI0) Status Register
+#define AT91C_SPI0_IDR            (0xFFFE0018) // (SPI0) Interrupt Disable Register
+#define AT91C_SPI0_CR             (0xFFFE0000) // (SPI0) Control Register
+#define AT91C_SPI0_MR             (0xFFFE0004) // (SPI0) Mode Register
+#define AT91C_SPI0_IMR            (0xFFFE001C) // (SPI0) Interrupt Mask Register
+#define AT91C_SPI0_TDR            (0xFFFE000C) // (SPI0) Transmit Data Register
+#define AT91C_SPI0_RDR            (0xFFFE0008) // (SPI0) Receive Data Register
+#define AT91C_SPI0_CSR            (0xFFFE0030) // (SPI0) Chip Select Register
+// ========== Register definition for PDC_US1 peripheral ==========
+#define AT91C_US1_RNCR            (0xFFFC4114) // (PDC_US1) Receive Next Counter Register
+#define AT91C_US1_PTCR            (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register
+#define AT91C_US1_TCR             (0xFFFC410C) // (PDC_US1) Transmit Counter Register
+#define AT91C_US1_PTSR            (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register
+#define AT91C_US1_TNPR            (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register
+#define AT91C_US1_RCR             (0xFFFC4104) // (PDC_US1) Receive Counter Register
+#define AT91C_US1_RNPR            (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register
+#define AT91C_US1_RPR             (0xFFFC4100) // (PDC_US1) Receive Pointer Register
+#define AT91C_US1_TNCR            (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register
+#define AT91C_US1_TPR             (0xFFFC4108) // (PDC_US1) Transmit Pointer Register
+// ========== Register definition for US1 peripheral ==========
+#define AT91C_US1_IF              (0xFFFC404C) // (US1) IRDA_FILTER Register
+#define AT91C_US1_NER             (0xFFFC4044) // (US1) Nb Errors Register
+#define AT91C_US1_RTOR            (0xFFFC4024) // (US1) Receiver Time-out Register
+#define AT91C_US1_CSR             (0xFFFC4014) // (US1) Channel Status Register
+#define AT91C_US1_IDR             (0xFFFC400C) // (US1) Interrupt Disable Register
+#define AT91C_US1_IER             (0xFFFC4008) // (US1) Interrupt Enable Register
+#define AT91C_US1_THR             (0xFFFC401C) // (US1) Transmitter Holding Register
+#define AT91C_US1_TTGR            (0xFFFC4028) // (US1) Transmitter Time-guard Register
+#define AT91C_US1_RHR             (0xFFFC4018) // (US1) Receiver Holding Register
+#define AT91C_US1_BRGR            (0xFFFC4020) // (US1) Baud Rate Generator Register
+#define AT91C_US1_IMR             (0xFFFC4010) // (US1) Interrupt Mask Register
+#define AT91C_US1_FIDI            (0xFFFC4040) // (US1) FI_DI_Ratio Register
+#define AT91C_US1_CR              (0xFFFC4000) // (US1) Control Register
+#define AT91C_US1_MR              (0xFFFC4004) // (US1) Mode Register
+// ========== Register definition for PDC_US0 peripheral ==========
+#define AT91C_US0_TNPR            (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register
+#define AT91C_US0_RNPR            (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register
+#define AT91C_US0_TCR             (0xFFFC010C) // (PDC_US0) Transmit Counter Register
+#define AT91C_US0_PTCR            (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register
+#define AT91C_US0_PTSR            (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register
+#define AT91C_US0_TNCR            (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register
+#define AT91C_US0_TPR             (0xFFFC0108) // (PDC_US0) Transmit Pointer Register
+#define AT91C_US0_RCR             (0xFFFC0104) // (PDC_US0) Receive Counter Register
+#define AT91C_US0_RPR             (0xFFFC0100) // (PDC_US0) Receive Pointer Register
+#define AT91C_US0_RNCR            (0xFFFC0114) // (PDC_US0) Receive Next Counter Register
+// ========== Register definition for US0 peripheral ==========
+#define AT91C_US0_BRGR            (0xFFFC0020) // (US0) Baud Rate Generator Register
+#define AT91C_US0_NER             (0xFFFC0044) // (US0) Nb Errors Register
+#define AT91C_US0_CR              (0xFFFC0000) // (US0) Control Register
+#define AT91C_US0_IMR             (0xFFFC0010) // (US0) Interrupt Mask Register
+#define AT91C_US0_FIDI            (0xFFFC0040) // (US0) FI_DI_Ratio Register
+#define AT91C_US0_TTGR            (0xFFFC0028) // (US0) Transmitter Time-guard Register
+#define AT91C_US0_MR              (0xFFFC0004) // (US0) Mode Register
+#define AT91C_US0_RTOR            (0xFFFC0024) // (US0) Receiver Time-out Register
+#define AT91C_US0_CSR             (0xFFFC0014) // (US0) Channel Status Register
+#define AT91C_US0_RHR             (0xFFFC0018) // (US0) Receiver Holding Register
+#define AT91C_US0_IDR             (0xFFFC000C) // (US0) Interrupt Disable Register
+#define AT91C_US0_THR             (0xFFFC001C) // (US0) Transmitter Holding Register
+#define AT91C_US0_IF              (0xFFFC004C) // (US0) IRDA_FILTER Register
+#define AT91C_US0_IER             (0xFFFC0008) // (US0) Interrupt Enable Register
+// ========== Register definition for PDC_SSC peripheral ==========
+#define AT91C_SSC_TNCR            (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register
+#define AT91C_SSC_RPR             (0xFFFD4100) // (PDC_SSC) Receive Pointer Register
+#define AT91C_SSC_RNCR            (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register
+#define AT91C_SSC_TPR             (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register
+#define AT91C_SSC_PTCR            (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register
+#define AT91C_SSC_TCR             (0xFFFD410C) // (PDC_SSC) Transmit Counter Register
+#define AT91C_SSC_RCR             (0xFFFD4104) // (PDC_SSC) Receive Counter Register
+#define AT91C_SSC_RNPR            (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register
+#define AT91C_SSC_TNPR            (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register
+#define AT91C_SSC_PTSR            (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register
+// ========== Register definition for SSC peripheral ==========
+#define AT91C_SSC_RHR             (0xFFFD4020) // (SSC) Receive Holding Register
+#define AT91C_SSC_RSHR            (0xFFFD4030) // (SSC) Receive Sync Holding Register
+#define AT91C_SSC_TFMR            (0xFFFD401C) // (SSC) Transmit Frame Mode Register
+#define AT91C_SSC_IDR             (0xFFFD4048) // (SSC) Interrupt Disable Register
+#define AT91C_SSC_THR             (0xFFFD4024) // (SSC) Transmit Holding Register
+#define AT91C_SSC_RCMR            (0xFFFD4010) // (SSC) Receive Clock ModeRegister
+#define AT91C_SSC_IER             (0xFFFD4044) // (SSC) Interrupt Enable Register
+#define AT91C_SSC_TSHR            (0xFFFD4034) // (SSC) Transmit Sync Holding Register
+#define AT91C_SSC_SR              (0xFFFD4040) // (SSC) Status Register
+#define AT91C_SSC_CMR             (0xFFFD4004) // (SSC) Clock Mode Register
+#define AT91C_SSC_TCMR            (0xFFFD4018) // (SSC) Transmit Clock Mode Register
+#define AT91C_SSC_CR              (0xFFFD4000) // (SSC) Control Register
+#define AT91C_SSC_IMR             (0xFFFD404C) // (SSC) Interrupt Mask Register
+#define AT91C_SSC_RFMR            (0xFFFD4014) // (SSC) Receive Frame Mode Register
+// ========== Register definition for TWI peripheral ==========
+#define AT91C_TWI_IER             (0xFFFB8024) // (TWI) Interrupt Enable Register
+#define AT91C_TWI_CR              (0xFFFB8000) // (TWI) Control Register
+#define AT91C_TWI_SR              (0xFFFB8020) // (TWI) Status Register
+#define AT91C_TWI_IMR             (0xFFFB802C) // (TWI) Interrupt Mask Register
+#define AT91C_TWI_THR             (0xFFFB8034) // (TWI) Transmit Holding Register
+#define AT91C_TWI_IDR             (0xFFFB8028) // (TWI) Interrupt Disable Register
+#define AT91C_TWI_IADR            (0xFFFB800C) // (TWI) Internal Address Register
+#define AT91C_TWI_MMR             (0xFFFB8004) // (TWI) Master Mode Register
+#define AT91C_TWI_CWGR            (0xFFFB8010) // (TWI) Clock Waveform Generator Register
+#define AT91C_TWI_RHR             (0xFFFB8030) // (TWI) Receive Holding Register
+// ========== Register definition for PWMC_CH3 peripheral ==========
+#define AT91C_PWMC_CH3_CUPDR      (0xFFFCC270) // (PWMC_CH3) Channel Update Register
+#define AT91C_PWMC_CH3_Reserved   (0xFFFCC274) // (PWMC_CH3) Reserved
+#define AT91C_PWMC_CH3_CPRDR      (0xFFFCC268) // (PWMC_CH3) Channel Period Register
+#define AT91C_PWMC_CH3_CDTYR      (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register
+#define AT91C_PWMC_CH3_CCNTR      (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register
+#define AT91C_PWMC_CH3_CMR        (0xFFFCC260) // (PWMC_CH3) Channel Mode Register
+// ========== Register definition for PWMC_CH2 peripheral ==========
+#define AT91C_PWMC_CH2_Reserved   (0xFFFCC254) // (PWMC_CH2) Reserved
+#define AT91C_PWMC_CH2_CMR        (0xFFFCC240) // (PWMC_CH2) Channel Mode Register
+#define AT91C_PWMC_CH2_CCNTR      (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register
+#define AT91C_PWMC_CH2_CPRDR      (0xFFFCC248) // (PWMC_CH2) Channel Period Register
+#define AT91C_PWMC_CH2_CUPDR      (0xFFFCC250) // (PWMC_CH2) Channel Update Register
+#define AT91C_PWMC_CH2_CDTYR      (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register
+// ========== Register definition for PWMC_CH1 peripheral ==========
+#define AT91C_PWMC_CH1_Reserved   (0xFFFCC234) // (PWMC_CH1) Reserved
+#define AT91C_PWMC_CH1_CUPDR      (0xFFFCC230) // (PWMC_CH1) Channel Update Register
+#define AT91C_PWMC_CH1_CPRDR      (0xFFFCC228) // (PWMC_CH1) Channel Period Register
+#define AT91C_PWMC_CH1_CCNTR      (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register
+#define AT91C_PWMC_CH1_CDTYR      (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register
+#define AT91C_PWMC_CH1_CMR        (0xFFFCC220) // (PWMC_CH1) Channel Mode Register
+// ========== Register definition for PWMC_CH0 peripheral ==========
+#define AT91C_PWMC_CH0_Reserved   (0xFFFCC214) // (PWMC_CH0) Reserved
+#define AT91C_PWMC_CH0_CPRDR      (0xFFFCC208) // (PWMC_CH0) Channel Period Register
+#define AT91C_PWMC_CH0_CDTYR      (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register
+#define AT91C_PWMC_CH0_CMR        (0xFFFCC200) // (PWMC_CH0) Channel Mode Register
+#define AT91C_PWMC_CH0_CUPDR      (0xFFFCC210) // (PWMC_CH0) Channel Update Register
+#define AT91C_PWMC_CH0_CCNTR      (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register
+// ========== Register definition for PWMC peripheral ==========
+#define AT91C_PWMC_IDR            (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register
+#define AT91C_PWMC_DIS            (0xFFFCC008) // (PWMC) PWMC Disable Register
+#define AT91C_PWMC_IER            (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register
+#define AT91C_PWMC_VR             (0xFFFCC0FC) // (PWMC) PWMC Version Register
+#define AT91C_PWMC_ISR            (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register
+#define AT91C_PWMC_SR             (0xFFFCC00C) // (PWMC) PWMC Status Register
+#define AT91C_PWMC_IMR            (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register
+#define AT91C_PWMC_MR             (0xFFFCC000) // (PWMC) PWMC Mode Register
+#define AT91C_PWMC_ENA            (0xFFFCC004) // (PWMC) PWMC Enable Register
+// ========== Register definition for UDP peripheral ==========
+#define AT91C_UDP_IMR             (0xFFFB0018) // (UDP) Interrupt Mask Register
+#define AT91C_UDP_FADDR           (0xFFFB0008) // (UDP) Function Address Register
+#define AT91C_UDP_NUM             (0xFFFB0000) // (UDP) Frame Number Register
+#define AT91C_UDP_FDR             (0xFFFB0050) // (UDP) Endpoint FIFO Data Register
+#define AT91C_UDP_ISR             (0xFFFB001C) // (UDP) Interrupt Status Register
+#define AT91C_UDP_CSR             (0xFFFB0030) // (UDP) Endpoint Control and Status Register
+#define AT91C_UDP_IDR             (0xFFFB0014) // (UDP) Interrupt Disable Register
+#define AT91C_UDP_ICR             (0xFFFB0020) // (UDP) Interrupt Clear Register
+#define AT91C_UDP_RSTEP           (0xFFFB0028) // (UDP) Reset Endpoint Register
+#define AT91C_UDP_TXVC            (0xFFFB0074) // (UDP) Transceiver Control Register
+#define AT91C_UDP_GLBSTATE        (0xFFFB0004) // (UDP) Global State Register
+#define AT91C_UDP_IER             (0xFFFB0010) // (UDP) Interrupt Enable Register
+// ========== Register definition for TC0 peripheral ==========
+#define AT91C_TC0_SR              (0xFFFA0020) // (TC0) Status Register
+#define AT91C_TC0_RC              (0xFFFA001C) // (TC0) Register C
+#define AT91C_TC0_RB              (0xFFFA0018) // (TC0) Register B
+#define AT91C_TC0_CCR             (0xFFFA0000) // (TC0) Channel Control Register
+#define AT91C_TC0_CMR             (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC0_IER             (0xFFFA0024) // (TC0) Interrupt Enable Register
+#define AT91C_TC0_RA              (0xFFFA0014) // (TC0) Register A
+#define AT91C_TC0_IDR             (0xFFFA0028) // (TC0) Interrupt Disable Register
+#define AT91C_TC0_CV              (0xFFFA0010) // (TC0) Counter Value
+#define AT91C_TC0_IMR             (0xFFFA002C) // (TC0) Interrupt Mask Register
+// ========== Register definition for TC1 peripheral ==========
+#define AT91C_TC1_RB              (0xFFFA0058) // (TC1) Register B
+#define AT91C_TC1_CCR             (0xFFFA0040) // (TC1) Channel Control Register
+#define AT91C_TC1_IER             (0xFFFA0064) // (TC1) Interrupt Enable Register
+#define AT91C_TC1_IDR             (0xFFFA0068) // (TC1) Interrupt Disable Register
+#define AT91C_TC1_SR              (0xFFFA0060) // (TC1) Status Register
+#define AT91C_TC1_CMR             (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC1_RA              (0xFFFA0054) // (TC1) Register A
+#define AT91C_TC1_RC              (0xFFFA005C) // (TC1) Register C
+#define AT91C_TC1_IMR             (0xFFFA006C) // (TC1) Interrupt Mask Register
+#define AT91C_TC1_CV              (0xFFFA0050) // (TC1) Counter Value
+// ========== Register definition for TC2 peripheral ==========
+#define AT91C_TC2_CMR             (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC2_CCR             (0xFFFA0080) // (TC2) Channel Control Register
+#define AT91C_TC2_CV              (0xFFFA0090) // (TC2) Counter Value
+#define AT91C_TC2_RA              (0xFFFA0094) // (TC2) Register A
+#define AT91C_TC2_RB              (0xFFFA0098) // (TC2) Register B
+#define AT91C_TC2_IDR             (0xFFFA00A8) // (TC2) Interrupt Disable Register
+#define AT91C_TC2_IMR             (0xFFFA00AC) // (TC2) Interrupt Mask Register
+#define AT91C_TC2_RC              (0xFFFA009C) // (TC2) Register C
+#define AT91C_TC2_IER             (0xFFFA00A4) // (TC2) Interrupt Enable Register
+#define AT91C_TC2_SR              (0xFFFA00A0) // (TC2) Status Register
+// ========== Register definition for TCB peripheral ==========
+#define AT91C_TCB_BMR             (0xFFFA00C4) // (TCB) TC Block Mode Register
+#define AT91C_TCB_BCR             (0xFFFA00C0) // (TCB) TC Block Control Register
+// ========== Register definition for CAN_MB0 peripheral ==========
+#define AT91C_CAN_MB0_MDL         (0xFFFD0214) // (CAN_MB0) MailBox Data Low Register
+#define AT91C_CAN_MB0_MAM         (0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB0_MCR         (0xFFFD021C) // (CAN_MB0) MailBox Control Register
+#define AT91C_CAN_MB0_MID         (0xFFFD0208) // (CAN_MB0) MailBox ID Register
+#define AT91C_CAN_MB0_MSR         (0xFFFD0210) // (CAN_MB0) MailBox Status Register
+#define AT91C_CAN_MB0_MFID        (0xFFFD020C) // (CAN_MB0) MailBox Family ID Register
+#define AT91C_CAN_MB0_MDH         (0xFFFD0218) // (CAN_MB0) MailBox Data High Register
+#define AT91C_CAN_MB0_MMR         (0xFFFD0200) // (CAN_MB0) MailBox Mode Register
+// ========== Register definition for CAN_MB1 peripheral ==========
+#define AT91C_CAN_MB1_MDL         (0xFFFD0234) // (CAN_MB1) MailBox Data Low Register
+#define AT91C_CAN_MB1_MID         (0xFFFD0228) // (CAN_MB1) MailBox ID Register
+#define AT91C_CAN_MB1_MMR         (0xFFFD0220) // (CAN_MB1) MailBox Mode Register
+#define AT91C_CAN_MB1_MSR         (0xFFFD0230) // (CAN_MB1) MailBox Status Register
+#define AT91C_CAN_MB1_MAM         (0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB1_MDH         (0xFFFD0238) // (CAN_MB1) MailBox Data High Register
+#define AT91C_CAN_MB1_MCR         (0xFFFD023C) // (CAN_MB1) MailBox Control Register
+#define AT91C_CAN_MB1_MFID        (0xFFFD022C) // (CAN_MB1) MailBox Family ID Register
+// ========== Register definition for CAN_MB2 peripheral ==========
+#define AT91C_CAN_MB2_MCR         (0xFFFD025C) // (CAN_MB2) MailBox Control Register
+#define AT91C_CAN_MB2_MDH         (0xFFFD0258) // (CAN_MB2) MailBox Data High Register
+#define AT91C_CAN_MB2_MID         (0xFFFD0248) // (CAN_MB2) MailBox ID Register
+#define AT91C_CAN_MB2_MDL         (0xFFFD0254) // (CAN_MB2) MailBox Data Low Register
+#define AT91C_CAN_MB2_MMR         (0xFFFD0240) // (CAN_MB2) MailBox Mode Register
+#define AT91C_CAN_MB2_MAM         (0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB2_MFID        (0xFFFD024C) // (CAN_MB2) MailBox Family ID Register
+#define AT91C_CAN_MB2_MSR         (0xFFFD0250) // (CAN_MB2) MailBox Status Register
+// ========== Register definition for CAN_MB3 peripheral ==========
+#define AT91C_CAN_MB3_MFID        (0xFFFD026C) // (CAN_MB3) MailBox Family ID Register
+#define AT91C_CAN_MB3_MAM         (0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB3_MID         (0xFFFD0268) // (CAN_MB3) MailBox ID Register
+#define AT91C_CAN_MB3_MCR         (0xFFFD027C) // (CAN_MB3) MailBox Control Register
+#define AT91C_CAN_MB3_MMR         (0xFFFD0260) // (CAN_MB3) MailBox Mode Register
+#define AT91C_CAN_MB3_MSR         (0xFFFD0270) // (CAN_MB3) MailBox Status Register
+#define AT91C_CAN_MB3_MDL         (0xFFFD0274) // (CAN_MB3) MailBox Data Low Register
+#define AT91C_CAN_MB3_MDH         (0xFFFD0278) // (CAN_MB3) MailBox Data High Register
+// ========== Register definition for CAN_MB4 peripheral ==========
+#define AT91C_CAN_MB4_MID         (0xFFFD0288) // (CAN_MB4) MailBox ID Register
+#define AT91C_CAN_MB4_MMR         (0xFFFD0280) // (CAN_MB4) MailBox Mode Register
+#define AT91C_CAN_MB4_MDH         (0xFFFD0298) // (CAN_MB4) MailBox Data High Register
+#define AT91C_CAN_MB4_MFID        (0xFFFD028C) // (CAN_MB4) MailBox Family ID Register
+#define AT91C_CAN_MB4_MSR         (0xFFFD0290) // (CAN_MB4) MailBox Status Register
+#define AT91C_CAN_MB4_MCR         (0xFFFD029C) // (CAN_MB4) MailBox Control Register
+#define AT91C_CAN_MB4_MDL         (0xFFFD0294) // (CAN_MB4) MailBox Data Low Register
+#define AT91C_CAN_MB4_MAM         (0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register
+// ========== Register definition for CAN_MB5 peripheral ==========
+#define AT91C_CAN_MB5_MSR         (0xFFFD02B0) // (CAN_MB5) MailBox Status Register
+#define AT91C_CAN_MB5_MCR         (0xFFFD02BC) // (CAN_MB5) MailBox Control Register
+#define AT91C_CAN_MB5_MFID        (0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register
+#define AT91C_CAN_MB5_MDH         (0xFFFD02B8) // (CAN_MB5) MailBox Data High Register
+#define AT91C_CAN_MB5_MID         (0xFFFD02A8) // (CAN_MB5) MailBox ID Register
+#define AT91C_CAN_MB5_MMR         (0xFFFD02A0) // (CAN_MB5) MailBox Mode Register
+#define AT91C_CAN_MB5_MDL         (0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register
+#define AT91C_CAN_MB5_MAM         (0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register
+// ========== Register definition for CAN_MB6 peripheral ==========
+#define AT91C_CAN_MB6_MFID        (0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register
+#define AT91C_CAN_MB6_MID         (0xFFFD02C8) // (CAN_MB6) MailBox ID Register
+#define AT91C_CAN_MB6_MAM         (0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB6_MSR         (0xFFFD02D0) // (CAN_MB6) MailBox Status Register
+#define AT91C_CAN_MB6_MDL         (0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register
+#define AT91C_CAN_MB6_MCR         (0xFFFD02DC) // (CAN_MB6) MailBox Control Register
+#define AT91C_CAN_MB6_MDH         (0xFFFD02D8) // (CAN_MB6) MailBox Data High Register
+#define AT91C_CAN_MB6_MMR         (0xFFFD02C0) // (CAN_MB6) MailBox Mode Register
+// ========== Register definition for CAN_MB7 peripheral ==========
+#define AT91C_CAN_MB7_MCR         (0xFFFD02FC) // (CAN_MB7) MailBox Control Register
+#define AT91C_CAN_MB7_MDH         (0xFFFD02F8) // (CAN_MB7) MailBox Data High Register
+#define AT91C_CAN_MB7_MFID        (0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register
+#define AT91C_CAN_MB7_MDL         (0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register
+#define AT91C_CAN_MB7_MID         (0xFFFD02E8) // (CAN_MB7) MailBox ID Register
+#define AT91C_CAN_MB7_MMR         (0xFFFD02E0) // (CAN_MB7) MailBox Mode Register
+#define AT91C_CAN_MB7_MAM         (0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB7_MSR         (0xFFFD02F0) // (CAN_MB7) MailBox Status Register
+// ========== Register definition for CAN peripheral ==========
+#define AT91C_CAN_TCR             (0xFFFD0024) // (CAN) Transfer Command Register
+#define AT91C_CAN_IMR             (0xFFFD000C) // (CAN) Interrupt Mask Register
+#define AT91C_CAN_IER             (0xFFFD0004) // (CAN) Interrupt Enable Register
+#define AT91C_CAN_ECR             (0xFFFD0020) // (CAN) Error Counter Register
+#define AT91C_CAN_TIMESTP         (0xFFFD001C) // (CAN) Time Stamp Register
+#define AT91C_CAN_MR              (0xFFFD0000) // (CAN) Mode Register
+#define AT91C_CAN_IDR             (0xFFFD0008) // (CAN) Interrupt Disable Register
+#define AT91C_CAN_ACR             (0xFFFD0028) // (CAN) Abort Command Register
+#define AT91C_CAN_TIM             (0xFFFD0018) // (CAN) Timer Register
+#define AT91C_CAN_SR              (0xFFFD0010) // (CAN) Status Register
+#define AT91C_CAN_BR              (0xFFFD0014) // (CAN) Baudrate Register
+#define AT91C_CAN_VR              (0xFFFD00FC) // (CAN) Version Register
+// ========== Register definition for EMAC peripheral ==========
+#define AT91C_EMAC_ISR            (0xFFFDC024) // (EMAC) Interrupt Status Register
+#define AT91C_EMAC_SA4H           (0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes
+#define AT91C_EMAC_SA1L           (0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes
+#define AT91C_EMAC_ELE            (0xFFFDC078) // (EMAC) Excessive Length Errors Register
+#define AT91C_EMAC_LCOL           (0xFFFDC05C) // (EMAC) Late Collision Register
+#define AT91C_EMAC_RLE            (0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register
+#define AT91C_EMAC_WOL            (0xFFFDC0C4) // (EMAC) Wake On LAN Register
+#define AT91C_EMAC_DTF            (0xFFFDC058) // (EMAC) Deferred Transmission Frame Register
+#define AT91C_EMAC_TUND           (0xFFFDC064) // (EMAC) Transmit Underrun Error Register
+#define AT91C_EMAC_NCR            (0xFFFDC000) // (EMAC) Network Control Register
+#define AT91C_EMAC_SA4L           (0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes
+#define AT91C_EMAC_RSR            (0xFFFDC020) // (EMAC) Receive Status Register
+#define AT91C_EMAC_SA3L           (0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes
+#define AT91C_EMAC_TSR            (0xFFFDC014) // (EMAC) Transmit Status Register
+#define AT91C_EMAC_IDR            (0xFFFDC02C) // (EMAC) Interrupt Disable Register
+#define AT91C_EMAC_RSE            (0xFFFDC074) // (EMAC) Receive Symbol Errors Register
+#define AT91C_EMAC_ECOL           (0xFFFDC060) // (EMAC) Excessive Collision Register
+#define AT91C_EMAC_TID            (0xFFFDC0B8) // (EMAC) Type ID Checking Register
+#define AT91C_EMAC_HRB            (0xFFFDC090) // (EMAC) Hash Address Bottom[31:0]
+#define AT91C_EMAC_TBQP           (0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer
+#define AT91C_EMAC_USRIO          (0xFFFDC0C0) // (EMAC) USER Input/Output Register
+#define AT91C_EMAC_PTR            (0xFFFDC038) // (EMAC) Pause Time Register
+#define AT91C_EMAC_SA2H           (0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes
+#define AT91C_EMAC_ROV            (0xFFFDC070) // (EMAC) Receive Overrun Errors Register
+#define AT91C_EMAC_ALE            (0xFFFDC054) // (EMAC) Alignment Error Register
+#define AT91C_EMAC_RJA            (0xFFFDC07C) // (EMAC) Receive Jabbers Register
+#define AT91C_EMAC_RBQP           (0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer
+#define AT91C_EMAC_TPF            (0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register
+#define AT91C_EMAC_NCFGR          (0xFFFDC004) // (EMAC) Network Configuration Register
+#define AT91C_EMAC_HRT            (0xFFFDC094) // (EMAC) Hash Address Top[63:32]
+#define AT91C_EMAC_USF            (0xFFFDC080) // (EMAC) Undersize Frames Register
+#define AT91C_EMAC_FCSE           (0xFFFDC050) // (EMAC) Frame Check Sequence Error Register
+#define AT91C_EMAC_TPQ            (0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register
+#define AT91C_EMAC_MAN            (0xFFFDC034) // (EMAC) PHY Maintenance Register
+#define AT91C_EMAC_FTO            (0xFFFDC040) // (EMAC) Frames Transmitted OK Register
+#define AT91C_EMAC_REV            (0xFFFDC0FC) // (EMAC) Revision Register
+#define AT91C_EMAC_IMR            (0xFFFDC030) // (EMAC) Interrupt Mask Register
+#define AT91C_EMAC_SCF            (0xFFFDC044) // (EMAC) Single Collision Frame Register
+#define AT91C_EMAC_PFR            (0xFFFDC03C) // (EMAC) Pause Frames received Register
+#define AT91C_EMAC_MCF            (0xFFFDC048) // (EMAC) Multiple Collision Frame Register
+#define AT91C_EMAC_NSR            (0xFFFDC008) // (EMAC) Network Status Register
+#define AT91C_EMAC_SA2L           (0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes
+#define AT91C_EMAC_FRO            (0xFFFDC04C) // (EMAC) Frames Received OK Register
+#define AT91C_EMAC_IER            (0xFFFDC028) // (EMAC) Interrupt Enable Register
+#define AT91C_EMAC_SA1H           (0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes
+#define AT91C_EMAC_CSE            (0xFFFDC068) // (EMAC) Carrier Sense Error Register
+#define AT91C_EMAC_SA3H           (0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes
+#define AT91C_EMAC_RRE            (0xFFFDC06C) // (EMAC) Receive Ressource Error Register
+#define AT91C_EMAC_STE            (0xFFFDC084) // (EMAC) SQE Test Error Register
+// ========== Register definition for PDC_ADC peripheral ==========
+#define AT91C_ADC_PTSR            (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register
+#define AT91C_ADC_PTCR            (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register
+#define AT91C_ADC_TNPR            (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register
+#define AT91C_ADC_TNCR            (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register
+#define AT91C_ADC_RNPR            (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register
+#define AT91C_ADC_RNCR            (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register
+#define AT91C_ADC_RPR             (0xFFFD8100) // (PDC_ADC) Receive Pointer Register
+#define AT91C_ADC_TCR             (0xFFFD810C) // (PDC_ADC) Transmit Counter Register
+#define AT91C_ADC_TPR             (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register
+#define AT91C_ADC_RCR             (0xFFFD8104) // (PDC_ADC) Receive Counter Register
+// ========== Register definition for ADC peripheral ==========
+#define AT91C_ADC_CDR2            (0xFFFD8038) // (ADC) ADC Channel Data Register 2
+#define AT91C_ADC_CDR3            (0xFFFD803C) // (ADC) ADC Channel Data Register 3
+#define AT91C_ADC_CDR0            (0xFFFD8030) // (ADC) ADC Channel Data Register 0
+#define AT91C_ADC_CDR5            (0xFFFD8044) // (ADC) ADC Channel Data Register 5
+#define AT91C_ADC_CHDR            (0xFFFD8014) // (ADC) ADC Channel Disable Register
+#define AT91C_ADC_SR              (0xFFFD801C) // (ADC) ADC Status Register
+#define AT91C_ADC_CDR4            (0xFFFD8040) // (ADC) ADC Channel Data Register 4
+#define AT91C_ADC_CDR1            (0xFFFD8034) // (ADC) ADC Channel Data Register 1
+#define AT91C_ADC_LCDR            (0xFFFD8020) // (ADC) ADC Last Converted Data Register
+#define AT91C_ADC_IDR             (0xFFFD8028) // (ADC) ADC Interrupt Disable Register
+#define AT91C_ADC_CR              (0xFFFD8000) // (ADC) ADC Control Register
+#define AT91C_ADC_CDR7            (0xFFFD804C) // (ADC) ADC Channel Data Register 7
+#define AT91C_ADC_CDR6            (0xFFFD8048) // (ADC) ADC Channel Data Register 6
+#define AT91C_ADC_IER             (0xFFFD8024) // (ADC) ADC Interrupt Enable Register
+#define AT91C_ADC_CHER            (0xFFFD8010) // (ADC) ADC Channel Enable Register
+#define AT91C_ADC_CHSR            (0xFFFD8018) // (ADC) ADC Channel Status Register
+#define AT91C_ADC_MR              (0xFFFD8004) // (ADC) ADC Mode Register
+#define AT91C_ADC_IMR             (0xFFFD802C) // (ADC) ADC Interrupt Mask Register
+// ========== Register definition for PDC_AES peripheral ==========
+#define AT91C_AES_TPR             (0xFFFA4108) // (PDC_AES) Transmit Pointer Register
+#define AT91C_AES_PTCR            (0xFFFA4120) // (PDC_AES) PDC Transfer Control Register
+#define AT91C_AES_RNPR            (0xFFFA4110) // (PDC_AES) Receive Next Pointer Register
+#define AT91C_AES_TNCR            (0xFFFA411C) // (PDC_AES) Transmit Next Counter Register
+#define AT91C_AES_TCR             (0xFFFA410C) // (PDC_AES) Transmit Counter Register
+#define AT91C_AES_RCR             (0xFFFA4104) // (PDC_AES) Receive Counter Register
+#define AT91C_AES_RNCR            (0xFFFA4114) // (PDC_AES) Receive Next Counter Register
+#define AT91C_AES_TNPR            (0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register
+#define AT91C_AES_RPR             (0xFFFA4100) // (PDC_AES) Receive Pointer Register
+#define AT91C_AES_PTSR            (0xFFFA4124) // (PDC_AES) PDC Transfer Status Register
+// ========== Register definition for AES peripheral ==========
+#define AT91C_AES_IVxR            (0xFFFA4060) // (AES) Initialization Vector x Register
+#define AT91C_AES_MR              (0xFFFA4004) // (AES) Mode Register
+#define AT91C_AES_VR              (0xFFFA40FC) // (AES) AES Version Register
+#define AT91C_AES_ODATAxR         (0xFFFA4050) // (AES) Output Data x Register
+#define AT91C_AES_IDATAxR         (0xFFFA4040) // (AES) Input Data x Register
+#define AT91C_AES_CR              (0xFFFA4000) // (AES) Control Register
+#define AT91C_AES_IDR             (0xFFFA4014) // (AES) Interrupt Disable Register
+#define AT91C_AES_IMR             (0xFFFA4018) // (AES) Interrupt Mask Register
+#define AT91C_AES_IER             (0xFFFA4010) // (AES) Interrupt Enable Register
+#define AT91C_AES_KEYWxR          (0xFFFA4020) // (AES) Key Word x Register
+#define AT91C_AES_ISR             (0xFFFA401C) // (AES) Interrupt Status Register
+// ========== Register definition for PDC_TDES peripheral ==========
+#define AT91C_TDES_RNCR           (0xFFFA8114) // (PDC_TDES) Receive Next Counter Register
+#define AT91C_TDES_TCR            (0xFFFA810C) // (PDC_TDES) Transmit Counter Register
+#define AT91C_TDES_RCR            (0xFFFA8104) // (PDC_TDES) Receive Counter Register
+#define AT91C_TDES_TNPR           (0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register
+#define AT91C_TDES_RNPR           (0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register
+#define AT91C_TDES_RPR            (0xFFFA8100) // (PDC_TDES) Receive Pointer Register
+#define AT91C_TDES_TNCR           (0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register
+#define AT91C_TDES_TPR            (0xFFFA8108) // (PDC_TDES) Transmit Pointer Register
+#define AT91C_TDES_PTSR           (0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register
+#define AT91C_TDES_PTCR           (0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register
+// ========== Register definition for TDES peripheral ==========
+#define AT91C_TDES_KEY2WxR        (0xFFFA8028) // (TDES) Key 2 Word x Register
+#define AT91C_TDES_KEY3WxR        (0xFFFA8030) // (TDES) Key 3 Word x Register
+#define AT91C_TDES_IDR            (0xFFFA8014) // (TDES) Interrupt Disable Register
+#define AT91C_TDES_VR             (0xFFFA80FC) // (TDES) TDES Version Register
+#define AT91C_TDES_IVxR           (0xFFFA8060) // (TDES) Initialization Vector x Register
+#define AT91C_TDES_ODATAxR        (0xFFFA8050) // (TDES) Output Data x Register
+#define AT91C_TDES_IMR            (0xFFFA8018) // (TDES) Interrupt Mask Register
+#define AT91C_TDES_MR             (0xFFFA8004) // (TDES) Mode Register
+#define AT91C_TDES_CR             (0xFFFA8000) // (TDES) Control Register
+#define AT91C_TDES_IER            (0xFFFA8010) // (TDES) Interrupt Enable Register
+#define AT91C_TDES_ISR            (0xFFFA801C) // (TDES) Interrupt Status Register
+#define AT91C_TDES_IDATAxR        (0xFFFA8040) // (TDES) Input Data x Register
+#define AT91C_TDES_KEY1WxR        (0xFFFA8020) // (TDES) Key 1 Word x Register
+
+// *****************************************************************************
+//               PIO DEFINITIONS FOR AT91SAM7X128
+// *****************************************************************************
+#define AT91C_PIO_PA0             (1 <<  0) // Pin Controlled by PA0
+#define AT91C_PA0_RXD0            (AT91C_PIO_PA0) //  USART 0 Receive Data
+#define AT91C_PIO_PA1             (1 <<  1) // Pin Controlled by PA1
+#define AT91C_PA1_TXD0            (AT91C_PIO_PA1) //  USART 0 Transmit Data
+#define AT91C_PIO_PA10            (1 << 10) // Pin Controlled by PA10
+#define AT91C_PA10_TWD            (AT91C_PIO_PA10) //  TWI Two-wire Serial Data
+#define AT91C_PIO_PA11            (1 << 11) // Pin Controlled by PA11
+#define AT91C_PA11_TWCK           (AT91C_PIO_PA11) //  TWI Two-wire Serial Clock
+#define AT91C_PIO_PA12            (1 << 12) // Pin Controlled by PA12
+#define AT91C_PA12_NPCS00         (AT91C_PIO_PA12) //  SPI 0 Peripheral Chip Select 0
+#define AT91C_PIO_PA13            (1 << 13) // Pin Controlled by PA13
+#define AT91C_PA13_NPCS01         (AT91C_PIO_PA13) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PA13_PCK1           (AT91C_PIO_PA13) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PA14            (1 << 14) // Pin Controlled by PA14
+#define AT91C_PA14_NPCS02         (AT91C_PIO_PA14) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PA14_IRQ1           (AT91C_PIO_PA14) //  External Interrupt 1
+#define AT91C_PIO_PA15            (1 << 15) // Pin Controlled by PA15
+#define AT91C_PA15_NPCS03         (AT91C_PIO_PA15) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PA15_TCLK2          (AT91C_PIO_PA15) //  Timer Counter 2 external clock input
+#define AT91C_PIO_PA16            (1 << 16) // Pin Controlled by PA16
+#define AT91C_PA16_MISO0          (AT91C_PIO_PA16) //  SPI 0 Master In Slave
+#define AT91C_PIO_PA17            (1 << 17) // Pin Controlled by PA17
+#define AT91C_PA17_MOSI0          (AT91C_PIO_PA17) //  SPI 0 Master Out Slave
+#define AT91C_PIO_PA18            (1 << 18) // Pin Controlled by PA18
+#define AT91C_PA18_SPCK0          (AT91C_PIO_PA18) //  SPI 0 Serial Clock
+#define AT91C_PIO_PA19            (1 << 19) // Pin Controlled by PA19
+#define AT91C_PA19_CANRX          (AT91C_PIO_PA19) //  CAN Receive
+#define AT91C_PIO_PA2             (1 <<  2) // Pin Controlled by PA2
+#define AT91C_PA2_SCK0            (AT91C_PIO_PA2) //  USART 0 Serial Clock
+#define AT91C_PA2_NPCS11          (AT91C_PIO_PA2) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PA20            (1 << 20) // Pin Controlled by PA20
+#define AT91C_PA20_CANTX          (AT91C_PIO_PA20) //  CAN Transmit
+#define AT91C_PIO_PA21            (1 << 21) // Pin Controlled by PA21
+#define AT91C_PA21_TF             (AT91C_PIO_PA21) //  SSC Transmit Frame Sync
+#define AT91C_PA21_NPCS10         (AT91C_PIO_PA21) //  SPI 1 Peripheral Chip Select 0
+#define AT91C_PIO_PA22            (1 << 22) // Pin Controlled by PA22
+#define AT91C_PA22_TK             (AT91C_PIO_PA22) //  SSC Transmit Clock
+#define AT91C_PA22_SPCK1          (AT91C_PIO_PA22) //  SPI 1 Serial Clock
+#define AT91C_PIO_PA23            (1 << 23) // Pin Controlled by PA23
+#define AT91C_PA23_TD             (AT91C_PIO_PA23) //  SSC Transmit data
+#define AT91C_PA23_MOSI1          (AT91C_PIO_PA23) //  SPI 1 Master Out Slave
+#define AT91C_PIO_PA24            (1 << 24) // Pin Controlled by PA24
+#define AT91C_PA24_RD             (AT91C_PIO_PA24) //  SSC Receive Data
+#define AT91C_PA24_MISO1          (AT91C_PIO_PA24) //  SPI 1 Master In Slave
+#define AT91C_PIO_PA25            (1 << 25) // Pin Controlled by PA25
+#define AT91C_PA25_RK             (AT91C_PIO_PA25) //  SSC Receive Clock
+#define AT91C_PA25_NPCS11         (AT91C_PIO_PA25) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PA26            (1 << 26) // Pin Controlled by PA26
+#define AT91C_PA26_RF             (AT91C_PIO_PA26) //  SSC Receive Frame Sync
+#define AT91C_PA26_NPCS12         (AT91C_PIO_PA26) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PA27            (1 << 27) // Pin Controlled by PA27
+#define AT91C_PA27_DRXD           (AT91C_PIO_PA27) //  DBGU Debug Receive Data
+#define AT91C_PA27_PCK3           (AT91C_PIO_PA27) //  PMC Programmable Clock Output 3
+#define AT91C_PIO_PA28            (1 << 28) // Pin Controlled by PA28
+#define AT91C_PA28_DTXD           (AT91C_PIO_PA28) //  DBGU Debug Transmit Data
+#define AT91C_PIO_PA29            (1 << 29) // Pin Controlled by PA29
+#define AT91C_PA29_FIQ            (AT91C_PIO_PA29) //  AIC Fast Interrupt Input
+#define AT91C_PA29_NPCS13         (AT91C_PIO_PA29) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PA3             (1 <<  3) // Pin Controlled by PA3
+#define AT91C_PA3_RTS0            (AT91C_PIO_PA3) //  USART 0 Ready To Send
+#define AT91C_PA3_NPCS12          (AT91C_PIO_PA3) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PA30            (1 << 30) // Pin Controlled by PA30
+#define AT91C_PA30_IRQ0           (AT91C_PIO_PA30) //  External Interrupt 0
+#define AT91C_PA30_PCK2           (AT91C_PIO_PA30) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PA4             (1 <<  4) // Pin Controlled by PA4
+#define AT91C_PA4_CTS0            (AT91C_PIO_PA4) //  USART 0 Clear To Send
+#define AT91C_PA4_NPCS13          (AT91C_PIO_PA4) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PA5             (1 <<  5) // Pin Controlled by PA5
+#define AT91C_PA5_RXD1            (AT91C_PIO_PA5) //  USART 1 Receive Data
+#define AT91C_PIO_PA6             (1 <<  6) // Pin Controlled by PA6
+#define AT91C_PA6_TXD1            (AT91C_PIO_PA6) //  USART 1 Transmit Data
+#define AT91C_PIO_PA7             (1 <<  7) // Pin Controlled by PA7
+#define AT91C_PA7_SCK1            (AT91C_PIO_PA7) //  USART 1 Serial Clock
+#define AT91C_PA7_NPCS01          (AT91C_PIO_PA7) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PIO_PA8             (1 <<  8) // Pin Controlled by PA8
+#define AT91C_PA8_RTS1            (AT91C_PIO_PA8) //  USART 1 Ready To Send
+#define AT91C_PA8_NPCS02          (AT91C_PIO_PA8) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PIO_PA9             (1 <<  9) // Pin Controlled by PA9
+#define AT91C_PA9_CTS1            (AT91C_PIO_PA9) //  USART 1 Clear To Send
+#define AT91C_PA9_NPCS03          (AT91C_PIO_PA9) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PIO_PB0             (1 <<  0) // Pin Controlled by PB0
+#define AT91C_PB0_ETXCK_EREFCK    (AT91C_PIO_PB0) //  Ethernet MAC Transmit Clock/Reference Clock
+#define AT91C_PB0_PCK0            (AT91C_PIO_PB0) //  PMC Programmable Clock Output 0
+#define AT91C_PIO_PB1             (1 <<  1) // Pin Controlled by PB1
+#define AT91C_PB1_ETXEN           (AT91C_PIO_PB1) //  Ethernet MAC Transmit Enable
+#define AT91C_PIO_PB10            (1 << 10) // Pin Controlled by PB10
+#define AT91C_PB10_ETX2           (AT91C_PIO_PB10) //  Ethernet MAC Transmit Data 2
+#define AT91C_PB10_NPCS11         (AT91C_PIO_PB10) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PB11            (1 << 11) // Pin Controlled by PB11
+#define AT91C_PB11_ETX3           (AT91C_PIO_PB11) //  Ethernet MAC Transmit Data 3
+#define AT91C_PB11_NPCS12         (AT91C_PIO_PB11) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PB12            (1 << 12) // Pin Controlled by PB12
+#define AT91C_PB12_ETXER          (AT91C_PIO_PB12) //  Ethernet MAC Transmikt Coding Error
+#define AT91C_PB12_TCLK0          (AT91C_PIO_PB12) //  Timer Counter 0 external clock input
+#define AT91C_PIO_PB13            (1 << 13) // Pin Controlled by PB13
+#define AT91C_PB13_ERX2           (AT91C_PIO_PB13) //  Ethernet MAC Receive Data 2
+#define AT91C_PB13_NPCS01         (AT91C_PIO_PB13) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PIO_PB14            (1 << 14) // Pin Controlled by PB14
+#define AT91C_PB14_ERX3           (AT91C_PIO_PB14) //  Ethernet MAC Receive Data 3
+#define AT91C_PB14_NPCS02         (AT91C_PIO_PB14) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PIO_PB15            (1 << 15) // Pin Controlled by PB15
+#define AT91C_PB15_ERXDV          (AT91C_PIO_PB15) //  Ethernet MAC Receive Data Valid
+#define AT91C_PIO_PB16            (1 << 16) // Pin Controlled by PB16
+#define AT91C_PB16_ECOL           (AT91C_PIO_PB16) //  Ethernet MAC Collision Detected
+#define AT91C_PB16_NPCS13         (AT91C_PIO_PB16) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PB17            (1 << 17) // Pin Controlled by PB17
+#define AT91C_PB17_ERXCK          (AT91C_PIO_PB17) //  Ethernet MAC Receive Clock
+#define AT91C_PB17_NPCS03         (AT91C_PIO_PB17) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PIO_PB18            (1 << 18) // Pin Controlled by PB18
+#define AT91C_PB18_EF100          (AT91C_PIO_PB18) //  Ethernet MAC Force 100 Mbits/sec
+#define AT91C_PB18_ADTRG          (AT91C_PIO_PB18) //  ADC External Trigger
+#define AT91C_PIO_PB19            (1 << 19) // Pin Controlled by PB19
+#define AT91C_PB19_PWM0           (AT91C_PIO_PB19) //  PWM Channel 0
+#define AT91C_PB19_TCLK1          (AT91C_PIO_PB19) //  Timer Counter 1 external clock input
+#define AT91C_PIO_PB2             (1 <<  2) // Pin Controlled by PB2
+#define AT91C_PB2_ETX0            (AT91C_PIO_PB2) //  Ethernet MAC Transmit Data 0
+#define AT91C_PIO_PB20            (1 << 20) // Pin Controlled by PB20
+#define AT91C_PB20_PWM1           (AT91C_PIO_PB20) //  PWM Channel 1
+#define AT91C_PB20_PCK0           (AT91C_PIO_PB20) //  PMC Programmable Clock Output 0
+#define AT91C_PIO_PB21            (1 << 21) // Pin Controlled by PB21
+#define AT91C_PB21_PWM2           (AT91C_PIO_PB21) //  PWM Channel 2
+#define AT91C_PB21_PCK1           (AT91C_PIO_PB21) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PB22            (1 << 22) // Pin Controlled by PB22
+#define AT91C_PB22_PWM3           (AT91C_PIO_PB22) //  PWM Channel 3
+#define AT91C_PB22_PCK2           (AT91C_PIO_PB22) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PB23            (1 << 23) // Pin Controlled by PB23
+#define AT91C_PB23_TIOA0          (AT91C_PIO_PB23) //  Timer Counter 0 Multipurpose Timer I/O Pin A
+#define AT91C_PB23_DCD1           (AT91C_PIO_PB23) //  USART 1 Data Carrier Detect
+#define AT91C_PIO_PB24            (1 << 24) // Pin Controlled by PB24
+#define AT91C_PB24_TIOB0          (AT91C_PIO_PB24) //  Timer Counter 0 Multipurpose Timer I/O Pin B
+#define AT91C_PB24_DSR1           (AT91C_PIO_PB24) //  USART 1 Data Set ready
+#define AT91C_PIO_PB25            (1 << 25) // Pin Controlled by PB25
+#define AT91C_PB25_TIOA1          (AT91C_PIO_PB25) //  Timer Counter 1 Multipurpose Timer I/O Pin A
+#define AT91C_PB25_DTR1           (AT91C_PIO_PB25) //  USART 1 Data Terminal ready
+#define AT91C_PIO_PB26            (1 << 26) // Pin Controlled by PB26
+#define AT91C_PB26_TIOB1          (AT91C_PIO_PB26) //  Timer Counter 1 Multipurpose Timer I/O Pin B
+#define AT91C_PB26_RI1            (AT91C_PIO_PB26) //  USART 1 Ring Indicator
+#define AT91C_PIO_PB27            (1 << 27) // Pin Controlled by PB27
+#define AT91C_PB27_TIOA2          (AT91C_PIO_PB27) //  Timer Counter 2 Multipurpose Timer I/O Pin A
+#define AT91C_PB27_PWM0           (AT91C_PIO_PB27) //  PWM Channel 0
+#define AT91C_PIO_PB28            (1 << 28) // Pin Controlled by PB28
+#define AT91C_PB28_TIOB2          (AT91C_PIO_PB28) //  Timer Counter 2 Multipurpose Timer I/O Pin B
+#define AT91C_PB28_PWM1           (AT91C_PIO_PB28) //  PWM Channel 1
+#define AT91C_PIO_PB29            (1 << 29) // Pin Controlled by PB29
+#define AT91C_PB29_PCK1           (AT91C_PIO_PB29) //  PMC Programmable Clock Output 1
+#define AT91C_PB29_PWM2           (AT91C_PIO_PB29) //  PWM Channel 2
+#define AT91C_PIO_PB3             (1 <<  3) // Pin Controlled by PB3
+#define AT91C_PB3_ETX1            (AT91C_PIO_PB3) //  Ethernet MAC Transmit Data 1
+#define AT91C_PIO_PB30            (1 << 30) // Pin Controlled by PB30
+#define AT91C_PB30_PCK2           (AT91C_PIO_PB30) //  PMC Programmable Clock Output 2
+#define AT91C_PB30_PWM3           (AT91C_PIO_PB30) //  PWM Channel 3
+#define AT91C_PIO_PB4             (1 <<  4) // Pin Controlled by PB4
+#define AT91C_PB4_ECRS_ECRSDV     (AT91C_PIO_PB4) //  Ethernet MAC Carrier Sense/Carrier Sense and Data Valid
+#define AT91C_PIO_PB5             (1 <<  5) // Pin Controlled by PB5
+#define AT91C_PB5_ERX0            (AT91C_PIO_PB5) //  Ethernet MAC Receive Data 0
+#define AT91C_PIO_PB6             (1 <<  6) // Pin Controlled by PB6
+#define AT91C_PB6_ERX1            (AT91C_PIO_PB6) //  Ethernet MAC Receive Data 1
+#define AT91C_PIO_PB7             (1 <<  7) // Pin Controlled by PB7
+#define AT91C_PB7_ERXER           (AT91C_PIO_PB7) //  Ethernet MAC Receive Error
+#define AT91C_PIO_PB8             (1 <<  8) // Pin Controlled by PB8
+#define AT91C_PB8_EMDC            (AT91C_PIO_PB8) //  Ethernet MAC Management Data Clock
+#define AT91C_PIO_PB9             (1 <<  9) // Pin Controlled by PB9
+#define AT91C_PB9_EMDIO           (AT91C_PIO_PB9) //  Ethernet MAC Management Data Input/Output
+
+// *****************************************************************************
+//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7X128
+// *****************************************************************************
+#define AT91C_ID_FIQ              ( 0) // Advanced Interrupt Controller (FIQ)
+#define AT91C_ID_SYS              ( 1) // System Peripheral
+#define AT91C_ID_PIOA             ( 2) // Parallel IO Controller A
+#define AT91C_ID_PIOB             ( 3) // Parallel IO Controller B
+#define AT91C_ID_SPI0             ( 4) // Serial Peripheral Interface 0
+#define AT91C_ID_SPI1             ( 5) // Serial Peripheral Interface 1
+#define AT91C_ID_US0              ( 6) // USART 0
+#define AT91C_ID_US1              ( 7) // USART 1
+#define AT91C_ID_SSC              ( 8) // Serial Synchronous Controller
+#define AT91C_ID_TWI              ( 9) // Two-Wire Interface
+#define AT91C_ID_PWMC             (10) // PWM Controller
+#define AT91C_ID_UDP              (11) // USB Device Port
+#define AT91C_ID_TC0              (12) // Timer Counter 0
+#define AT91C_ID_TC1              (13) // Timer Counter 1
+#define AT91C_ID_TC2              (14) // Timer Counter 2
+#define AT91C_ID_CAN              (15) // Control Area Network Controller
+#define AT91C_ID_EMAC             (16) // Ethernet MAC
+#define AT91C_ID_ADC              (17) // Analog-to-Digital Converter
+#define AT91C_ID_AES              (18) // Advanced Encryption Standard 128-bit
+#define AT91C_ID_TDES             (19) // Triple Data Encryption Standard
+#define AT91C_ID_20_Reserved      (20) // Reserved
+#define AT91C_ID_21_Reserved      (21) // Reserved
+#define AT91C_ID_22_Reserved      (22) // Reserved
+#define AT91C_ID_23_Reserved      (23) // Reserved
+#define AT91C_ID_24_Reserved      (24) // Reserved
+#define AT91C_ID_25_Reserved      (25) // Reserved
+#define AT91C_ID_26_Reserved      (26) // Reserved
+#define AT91C_ID_27_Reserved      (27) // Reserved
+#define AT91C_ID_28_Reserved      (28) // Reserved
+#define AT91C_ID_29_Reserved      (29) // Reserved
+#define AT91C_ID_IRQ0             (30) // Advanced Interrupt Controller (IRQ0)
+#define AT91C_ID_IRQ1             (31) // Advanced Interrupt Controller (IRQ1)
+
+// *****************************************************************************
+//               BASE ADDRESS DEFINITIONS FOR AT91SAM7X128
+// *****************************************************************************
+#define AT91C_BASE_SYS            (0xFFFFF000) // (SYS) Base Address
+#define AT91C_BASE_AIC            (0xFFFFF000) // (AIC) Base Address
+#define AT91C_BASE_PDC_DBGU       (0xFFFFF300) // (PDC_DBGU) Base Address
+#define AT91C_BASE_DBGU           (0xFFFFF200) // (DBGU) Base Address
+#define AT91C_BASE_PIOA           (0xFFFFF400) // (PIOA) Base Address
+#define AT91C_BASE_PIOB           (0xFFFFF600) // (PIOB) Base Address
+#define AT91C_BASE_CKGR           (0xFFFFFC20) // (CKGR) Base Address
+#define AT91C_BASE_PMC            (0xFFFFFC00) // (PMC) Base Address
+#define AT91C_BASE_RSTC           (0xFFFFFD00) // (RSTC) Base Address
+#define AT91C_BASE_RTTC           (0xFFFFFD20) // (RTTC) Base Address
+#define AT91C_BASE_PITC           (0xFFFFFD30) // (PITC) Base Address
+#define AT91C_BASE_WDTC           (0xFFFFFD40) // (WDTC) Base Address
+#define AT91C_BASE_VREG           (0xFFFFFD60) // (VREG) Base Address
+#define AT91C_BASE_MC             (0xFFFFFF00) // (MC) Base Address
+#define AT91C_BASE_PDC_SPI1       (0xFFFE4100) // (PDC_SPI1) Base Address
+#define AT91C_BASE_SPI1           (0xFFFE4000) // (SPI1) Base Address
+#define AT91C_BASE_PDC_SPI0       (0xFFFE0100) // (PDC_SPI0) Base Address
+#define AT91C_BASE_SPI0           (0xFFFE0000) // (SPI0) Base Address
+#define AT91C_BASE_PDC_US1        (0xFFFC4100) // (PDC_US1) Base Address
+#define AT91C_BASE_US1            (0xFFFC4000) // (US1) Base Address
+#define AT91C_BASE_PDC_US0        (0xFFFC0100) // (PDC_US0) Base Address
+#define AT91C_BASE_US0            (0xFFFC0000) // (US0) Base Address
+#define AT91C_BASE_PDC_SSC        (0xFFFD4100) // (PDC_SSC) Base Address
+#define AT91C_BASE_SSC            (0xFFFD4000) // (SSC) Base Address
+#define AT91C_BASE_TWI            (0xFFFB8000) // (TWI) Base Address
+#define AT91C_BASE_PWMC_CH3       (0xFFFCC260) // (PWMC_CH3) Base Address
+#define AT91C_BASE_PWMC_CH2       (0xFFFCC240) // (PWMC_CH2) Base Address
+#define AT91C_BASE_PWMC_CH1       (0xFFFCC220) // (PWMC_CH1) Base Address
+#define AT91C_BASE_PWMC_CH0       (0xFFFCC200) // (PWMC_CH0) Base Address
+#define AT91C_BASE_PWMC           (0xFFFCC000) // (PWMC) Base Address
+#define AT91C_BASE_UDP            (0xFFFB0000) // (UDP) Base Address
+#define AT91C_BASE_TC0            (0xFFFA0000) // (TC0) Base Address
+#define AT91C_BASE_TC1            (0xFFFA0040) // (TC1) Base Address
+#define AT91C_BASE_TC2            (0xFFFA0080) // (TC2) Base Address
+#define AT91C_BASE_TCB            (0xFFFA0000) // (TCB) Base Address
+#define AT91C_BASE_CAN_MB0        (0xFFFD0200) // (CAN_MB0) Base Address
+#define AT91C_BASE_CAN_MB1        (0xFFFD0220) // (CAN_MB1) Base Address
+#define AT91C_BASE_CAN_MB2        (0xFFFD0240) // (CAN_MB2) Base Address
+#define AT91C_BASE_CAN_MB3        (0xFFFD0260) // (CAN_MB3) Base Address
+#define AT91C_BASE_CAN_MB4        (0xFFFD0280) // (CAN_MB4) Base Address
+#define AT91C_BASE_CAN_MB5        (0xFFFD02A0) // (CAN_MB5) Base Address
+#define AT91C_BASE_CAN_MB6        (0xFFFD02C0) // (CAN_MB6) Base Address
+#define AT91C_BASE_CAN_MB7        (0xFFFD02E0) // (CAN_MB7) Base Address
+#define AT91C_BASE_CAN            (0xFFFD0000) // (CAN) Base Address
+#define AT91C_BASE_EMAC           (0xFFFDC000) // (EMAC) Base Address
+#define AT91C_BASE_PDC_ADC        (0xFFFD8100) // (PDC_ADC) Base Address
+#define AT91C_BASE_ADC            (0xFFFD8000) // (ADC) Base Address
+#define AT91C_BASE_PDC_AES        (0xFFFA4100) // (PDC_AES) Base Address
+#define AT91C_BASE_AES            (0xFFFA4000) // (AES) Base Address
+#define AT91C_BASE_PDC_TDES       (0xFFFA8100) // (PDC_TDES) Base Address
+#define AT91C_BASE_TDES           (0xFFFA8000) // (TDES) Base Address
+
+// *****************************************************************************
+//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7X128
+// *****************************************************************************
+#define AT91C_ISRAM               (0x00200000) // Internal SRAM base address
+#define AT91C_ISRAM_SIZE             (0x00008000) // Internal SRAM size in byte (32 Kbyte)
+#define AT91C_IFLASH                 (0x00100000) // Internal ROM base address
+#define AT91C_IFLASH_SIZE           (0x00020000) // Internal ROM size in byte (128 Kbyte)
diff --git a/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h b/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h
index 6b73f8a..cf952e3 100644
--- a/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h
+++ b/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h
@@ -1,2715 +1,2715 @@
-//  ----------------------------------------------------------------------------

-//          ATMEL Microcontroller Software Support  -  ROUSSET  -

-//  ----------------------------------------------------------------------------

-//  DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR

-//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

-//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE

-//  DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,

-//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

-//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,

-//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

-//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

-//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,

-//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-//  ----------------------------------------------------------------------------

-// File Name           : AT91SAM7X256.h

-// Object              : AT91SAM7X256 definitions

-// Generated           : AT91 SW Application Group  05/20/2005 (16:22:29)

-// 

-// CVS Reference       : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005//

-// CVS Reference       : /SYS_SAM7X.pl/1.3/Tue Feb  1 17:01:43 2005//

-// CVS Reference       : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005//

-// CVS Reference       : /PMC_SAM7X.pl/1.4/Tue Feb  8 13:58:10 2005//

-// CVS Reference       : /RSTC_SAM7X.pl/1.1/Tue Feb  1 16:16:26 2005//

-// CVS Reference       : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005//

-// CVS Reference       : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005//

-// CVS Reference       : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005//

-// CVS Reference       : /PIO_6057A.pl/1.2/Thu Feb  3 10:18:28 2005//

-// CVS Reference       : /RTTC_6081A.pl/1.2/Tue Nov  9 14:43:58 2004//

-// CVS Reference       : /PITC_6079A.pl/1.2/Tue Nov  9 14:43:56 2004//

-// CVS Reference       : /WDTC_6080A.pl/1.3/Tue Nov  9 14:44:00 2004//

-// CVS Reference       : /VREG_6085B.pl/1.1/Tue Feb  1 16:05:48 2005//

-// CVS Reference       : /PDC_6074C.pl/1.2/Thu Feb  3 08:48:54 2005//

-// CVS Reference       : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005//

-// CVS Reference       : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005//

-// CVS Reference       : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004//

-// CVS Reference       : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004//

-// CVS Reference       : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004//

-// CVS Reference       : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005//

-// CVS Reference       : /CAN_6019B.pl/1.1/Tue Mar  8 12:42:22 2005//

-// CVS Reference       : /EMACB_6119A.pl/1.5/Thu Feb  3 15:52:04 2005//

-// CVS Reference       : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003//

-// CVS Reference       : /AES_6149A.pl/1.10/Mon Feb  7 09:44:25 2005//

-// CVS Reference       : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005//

-//  ----------------------------------------------------------------------------

-

-#ifndef AT91SAM7X256_H

-#define AT91SAM7X256_H

-

-typedef volatile unsigned int AT91_REG;// Hardware register definition

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR System Peripherals

-// *****************************************************************************

-typedef struct _AT91S_SYS {

-	AT91_REG	 AIC_SMR[32]; 	// Source Mode Register

-	AT91_REG	 AIC_SVR[32]; 	// Source Vector Register

-	AT91_REG	 AIC_IVR; 	// IRQ Vector Register

-	AT91_REG	 AIC_FVR; 	// FIQ Vector Register

-	AT91_REG	 AIC_ISR; 	// Interrupt Status Register

-	AT91_REG	 AIC_IPR; 	// Interrupt Pending Register

-	AT91_REG	 AIC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 AIC_CISR; 	// Core Interrupt Status Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 AIC_IECR; 	// Interrupt Enable Command Register

-	AT91_REG	 AIC_IDCR; 	// Interrupt Disable Command Register

-	AT91_REG	 AIC_ICCR; 	// Interrupt Clear Command Register

-	AT91_REG	 AIC_ISCR; 	// Interrupt Set Command Register

-	AT91_REG	 AIC_EOICR; 	// End of Interrupt Command Register

-	AT91_REG	 AIC_SPU; 	// Spurious Vector Register

-	AT91_REG	 AIC_DCR; 	// Debug Control Register (Protect)

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 AIC_FFER; 	// Fast Forcing Enable Register

-	AT91_REG	 AIC_FFDR; 	// Fast Forcing Disable Register

-	AT91_REG	 AIC_FFSR; 	// Fast Forcing Status Register

-	AT91_REG	 Reserved2[45]; 	// 

-	AT91_REG	 DBGU_CR; 	// Control Register

-	AT91_REG	 DBGU_MR; 	// Mode Register

-	AT91_REG	 DBGU_IER; 	// Interrupt Enable Register

-	AT91_REG	 DBGU_IDR; 	// Interrupt Disable Register

-	AT91_REG	 DBGU_IMR; 	// Interrupt Mask Register

-	AT91_REG	 DBGU_CSR; 	// Channel Status Register

-	AT91_REG	 DBGU_RHR; 	// Receiver Holding Register

-	AT91_REG	 DBGU_THR; 	// Transmitter Holding Register

-	AT91_REG	 DBGU_BRGR; 	// Baud Rate Generator Register

-	AT91_REG	 Reserved3[7]; 	// 

-	AT91_REG	 DBGU_CIDR; 	// Chip ID Register

-	AT91_REG	 DBGU_EXID; 	// Chip ID Extension Register

-	AT91_REG	 DBGU_FNTR; 	// Force NTRST Register

-	AT91_REG	 Reserved4[45]; 	// 

-	AT91_REG	 DBGU_RPR; 	// Receive Pointer Register

-	AT91_REG	 DBGU_RCR; 	// Receive Counter Register

-	AT91_REG	 DBGU_TPR; 	// Transmit Pointer Register

-	AT91_REG	 DBGU_TCR; 	// Transmit Counter Register

-	AT91_REG	 DBGU_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 DBGU_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 DBGU_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 DBGU_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 DBGU_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 DBGU_PTSR; 	// PDC Transfer Status Register

-	AT91_REG	 Reserved5[54]; 	// 

-	AT91_REG	 PIOA_PER; 	// PIO Enable Register

-	AT91_REG	 PIOA_PDR; 	// PIO Disable Register

-	AT91_REG	 PIOA_PSR; 	// PIO Status Register

-	AT91_REG	 Reserved6[1]; 	// 

-	AT91_REG	 PIOA_OER; 	// Output Enable Register

-	AT91_REG	 PIOA_ODR; 	// Output Disable Registerr

-	AT91_REG	 PIOA_OSR; 	// Output Status Register

-	AT91_REG	 Reserved7[1]; 	// 

-	AT91_REG	 PIOA_IFER; 	// Input Filter Enable Register

-	AT91_REG	 PIOA_IFDR; 	// Input Filter Disable Register

-	AT91_REG	 PIOA_IFSR; 	// Input Filter Status Register

-	AT91_REG	 Reserved8[1]; 	// 

-	AT91_REG	 PIOA_SODR; 	// Set Output Data Register

-	AT91_REG	 PIOA_CODR; 	// Clear Output Data Register

-	AT91_REG	 PIOA_ODSR; 	// Output Data Status Register

-	AT91_REG	 PIOA_PDSR; 	// Pin Data Status Register

-	AT91_REG	 PIOA_IER; 	// Interrupt Enable Register

-	AT91_REG	 PIOA_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PIOA_IMR; 	// Interrupt Mask Register

-	AT91_REG	 PIOA_ISR; 	// Interrupt Status Register

-	AT91_REG	 PIOA_MDER; 	// Multi-driver Enable Register

-	AT91_REG	 PIOA_MDDR; 	// Multi-driver Disable Register

-	AT91_REG	 PIOA_MDSR; 	// Multi-driver Status Register

-	AT91_REG	 Reserved9[1]; 	// 

-	AT91_REG	 PIOA_PPUDR; 	// Pull-up Disable Register

-	AT91_REG	 PIOA_PPUER; 	// Pull-up Enable Register

-	AT91_REG	 PIOA_PPUSR; 	// Pull-up Status Register

-	AT91_REG	 Reserved10[1]; 	// 

-	AT91_REG	 PIOA_ASR; 	// Select A Register

-	AT91_REG	 PIOA_BSR; 	// Select B Register

-	AT91_REG	 PIOA_ABSR; 	// AB Select Status Register

-	AT91_REG	 Reserved11[9]; 	// 

-	AT91_REG	 PIOA_OWER; 	// Output Write Enable Register

-	AT91_REG	 PIOA_OWDR; 	// Output Write Disable Register

-	AT91_REG	 PIOA_OWSR; 	// Output Write Status Register

-	AT91_REG	 Reserved12[85]; 	// 

-	AT91_REG	 PIOB_PER; 	// PIO Enable Register

-	AT91_REG	 PIOB_PDR; 	// PIO Disable Register

-	AT91_REG	 PIOB_PSR; 	// PIO Status Register

-	AT91_REG	 Reserved13[1]; 	// 

-	AT91_REG	 PIOB_OER; 	// Output Enable Register

-	AT91_REG	 PIOB_ODR; 	// Output Disable Registerr

-	AT91_REG	 PIOB_OSR; 	// Output Status Register

-	AT91_REG	 Reserved14[1]; 	// 

-	AT91_REG	 PIOB_IFER; 	// Input Filter Enable Register

-	AT91_REG	 PIOB_IFDR; 	// Input Filter Disable Register

-	AT91_REG	 PIOB_IFSR; 	// Input Filter Status Register

-	AT91_REG	 Reserved15[1]; 	// 

-	AT91_REG	 PIOB_SODR; 	// Set Output Data Register

-	AT91_REG	 PIOB_CODR; 	// Clear Output Data Register

-	AT91_REG	 PIOB_ODSR; 	// Output Data Status Register

-	AT91_REG	 PIOB_PDSR; 	// Pin Data Status Register

-	AT91_REG	 PIOB_IER; 	// Interrupt Enable Register

-	AT91_REG	 PIOB_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PIOB_IMR; 	// Interrupt Mask Register

-	AT91_REG	 PIOB_ISR; 	// Interrupt Status Register

-	AT91_REG	 PIOB_MDER; 	// Multi-driver Enable Register

-	AT91_REG	 PIOB_MDDR; 	// Multi-driver Disable Register

-	AT91_REG	 PIOB_MDSR; 	// Multi-driver Status Register

-	AT91_REG	 Reserved16[1]; 	// 

-	AT91_REG	 PIOB_PPUDR; 	// Pull-up Disable Register

-	AT91_REG	 PIOB_PPUER; 	// Pull-up Enable Register

-	AT91_REG	 PIOB_PPUSR; 	// Pull-up Status Register

-	AT91_REG	 Reserved17[1]; 	// 

-	AT91_REG	 PIOB_ASR; 	// Select A Register

-	AT91_REG	 PIOB_BSR; 	// Select B Register

-	AT91_REG	 PIOB_ABSR; 	// AB Select Status Register

-	AT91_REG	 Reserved18[9]; 	// 

-	AT91_REG	 PIOB_OWER; 	// Output Write Enable Register

-	AT91_REG	 PIOB_OWDR; 	// Output Write Disable Register

-	AT91_REG	 PIOB_OWSR; 	// Output Write Status Register

-	AT91_REG	 Reserved19[341]; 	// 

-	AT91_REG	 PMC_SCER; 	// System Clock Enable Register

-	AT91_REG	 PMC_SCDR; 	// System Clock Disable Register

-	AT91_REG	 PMC_SCSR; 	// System Clock Status Register

-	AT91_REG	 Reserved20[1]; 	// 

-	AT91_REG	 PMC_PCER; 	// Peripheral Clock Enable Register

-	AT91_REG	 PMC_PCDR; 	// Peripheral Clock Disable Register

-	AT91_REG	 PMC_PCSR; 	// Peripheral Clock Status Register

-	AT91_REG	 Reserved21[1]; 	// 

-	AT91_REG	 PMC_MOR; 	// Main Oscillator Register

-	AT91_REG	 PMC_MCFR; 	// Main Clock  Frequency Register

-	AT91_REG	 Reserved22[1]; 	// 

-	AT91_REG	 PMC_PLLR; 	// PLL Register

-	AT91_REG	 PMC_MCKR; 	// Master Clock Register

-	AT91_REG	 Reserved23[3]; 	// 

-	AT91_REG	 PMC_PCKR[4]; 	// Programmable Clock Register

-	AT91_REG	 Reserved24[4]; 	// 

-	AT91_REG	 PMC_IER; 	// Interrupt Enable Register

-	AT91_REG	 PMC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PMC_SR; 	// Status Register

-	AT91_REG	 PMC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 Reserved25[36]; 	// 

-	AT91_REG	 RSTC_RCR; 	// Reset Control Register

-	AT91_REG	 RSTC_RSR; 	// Reset Status Register

-	AT91_REG	 RSTC_RMR; 	// Reset Mode Register

-	AT91_REG	 Reserved26[5]; 	// 

-	AT91_REG	 RTTC_RTMR; 	// Real-time Mode Register

-	AT91_REG	 RTTC_RTAR; 	// Real-time Alarm Register

-	AT91_REG	 RTTC_RTVR; 	// Real-time Value Register

-	AT91_REG	 RTTC_RTSR; 	// Real-time Status Register

-	AT91_REG	 PITC_PIMR; 	// Period Interval Mode Register

-	AT91_REG	 PITC_PISR; 	// Period Interval Status Register

-	AT91_REG	 PITC_PIVR; 	// Period Interval Value Register

-	AT91_REG	 PITC_PIIR; 	// Period Interval Image Register

-	AT91_REG	 WDTC_WDCR; 	// Watchdog Control Register

-	AT91_REG	 WDTC_WDMR; 	// Watchdog Mode Register

-	AT91_REG	 WDTC_WDSR; 	// Watchdog Status Register

-	AT91_REG	 Reserved27[5]; 	// 

-	AT91_REG	 VREG_MR; 	// Voltage Regulator Mode Register

-} AT91S_SYS, *AT91PS_SYS;

-

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller

-// *****************************************************************************

-typedef struct _AT91S_AIC {

-	AT91_REG	 AIC_SMR[32]; 	// Source Mode Register

-	AT91_REG	 AIC_SVR[32]; 	// Source Vector Register

-	AT91_REG	 AIC_IVR; 	// IRQ Vector Register

-	AT91_REG	 AIC_FVR; 	// FIQ Vector Register

-	AT91_REG	 AIC_ISR; 	// Interrupt Status Register

-	AT91_REG	 AIC_IPR; 	// Interrupt Pending Register

-	AT91_REG	 AIC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 AIC_CISR; 	// Core Interrupt Status Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 AIC_IECR; 	// Interrupt Enable Command Register

-	AT91_REG	 AIC_IDCR; 	// Interrupt Disable Command Register

-	AT91_REG	 AIC_ICCR; 	// Interrupt Clear Command Register

-	AT91_REG	 AIC_ISCR; 	// Interrupt Set Command Register

-	AT91_REG	 AIC_EOICR; 	// End of Interrupt Command Register

-	AT91_REG	 AIC_SPU; 	// Spurious Vector Register

-	AT91_REG	 AIC_DCR; 	// Debug Control Register (Protect)

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 AIC_FFER; 	// Fast Forcing Enable Register

-	AT91_REG	 AIC_FFDR; 	// Fast Forcing Disable Register

-	AT91_REG	 AIC_FFSR; 	// Fast Forcing Status Register

-} AT91S_AIC, *AT91PS_AIC;

-

-// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- 

-#define AT91C_AIC_PRIOR       ((unsigned int) 0x7 <<  0) // (AIC) Priority Level

-#define 	AT91C_AIC_PRIOR_LOWEST               ((unsigned int) 0x0) // (AIC) Lowest priority level

-#define 	AT91C_AIC_PRIOR_HIGHEST              ((unsigned int) 0x7) // (AIC) Highest priority level

-#define AT91C_AIC_SRCTYPE     ((unsigned int) 0x3 <<  5) // (AIC) Interrupt Source Type

-#define 	AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL       ((unsigned int) 0x0 <<  5) // (AIC) Internal Sources Code Label High-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL        ((unsigned int) 0x0 <<  5) // (AIC) External Sources Code Label Low-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE    ((unsigned int) 0x1 <<  5) // (AIC) Internal Sources Code Label Positive Edge triggered

-#define 	AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE    ((unsigned int) 0x1 <<  5) // (AIC) External Sources Code Label Negative Edge triggered

-#define 	AT91C_AIC_SRCTYPE_HIGH_LEVEL           ((unsigned int) 0x2 <<  5) // (AIC) Internal Or External Sources Code Label High-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_POSITIVE_EDGE        ((unsigned int) 0x3 <<  5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered

-// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- 

-#define AT91C_AIC_NFIQ        ((unsigned int) 0x1 <<  0) // (AIC) NFIQ Status

-#define AT91C_AIC_NIRQ        ((unsigned int) 0x1 <<  1) // (AIC) NIRQ Status

-// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- 

-#define AT91C_AIC_DCR_PROT    ((unsigned int) 0x1 <<  0) // (AIC) Protection Mode

-#define AT91C_AIC_DCR_GMSK    ((unsigned int) 0x1 <<  1) // (AIC) General Mask

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Peripheral DMA Controller

-// *****************************************************************************

-typedef struct _AT91S_PDC {

-	AT91_REG	 PDC_RPR; 	// Receive Pointer Register

-	AT91_REG	 PDC_RCR; 	// Receive Counter Register

-	AT91_REG	 PDC_TPR; 	// Transmit Pointer Register

-	AT91_REG	 PDC_TCR; 	// Transmit Counter Register

-	AT91_REG	 PDC_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 PDC_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 PDC_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 PDC_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 PDC_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 PDC_PTSR; 	// PDC Transfer Status Register

-} AT91S_PDC, *AT91PS_PDC;

-

-// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- 

-#define AT91C_PDC_RXTEN       ((unsigned int) 0x1 <<  0) // (PDC) Receiver Transfer Enable

-#define AT91C_PDC_RXTDIS      ((unsigned int) 0x1 <<  1) // (PDC) Receiver Transfer Disable

-#define AT91C_PDC_TXTEN       ((unsigned int) 0x1 <<  8) // (PDC) Transmitter Transfer Enable

-#define AT91C_PDC_TXTDIS      ((unsigned int) 0x1 <<  9) // (PDC) Transmitter Transfer Disable

-// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Debug Unit

-// *****************************************************************************

-typedef struct _AT91S_DBGU {

-	AT91_REG	 DBGU_CR; 	// Control Register

-	AT91_REG	 DBGU_MR; 	// Mode Register

-	AT91_REG	 DBGU_IER; 	// Interrupt Enable Register

-	AT91_REG	 DBGU_IDR; 	// Interrupt Disable Register

-	AT91_REG	 DBGU_IMR; 	// Interrupt Mask Register

-	AT91_REG	 DBGU_CSR; 	// Channel Status Register

-	AT91_REG	 DBGU_RHR; 	// Receiver Holding Register

-	AT91_REG	 DBGU_THR; 	// Transmitter Holding Register

-	AT91_REG	 DBGU_BRGR; 	// Baud Rate Generator Register

-	AT91_REG	 Reserved0[7]; 	// 

-	AT91_REG	 DBGU_CIDR; 	// Chip ID Register

-	AT91_REG	 DBGU_EXID; 	// Chip ID Extension Register

-	AT91_REG	 DBGU_FNTR; 	// Force NTRST Register

-	AT91_REG	 Reserved1[45]; 	// 

-	AT91_REG	 DBGU_RPR; 	// Receive Pointer Register

-	AT91_REG	 DBGU_RCR; 	// Receive Counter Register

-	AT91_REG	 DBGU_TPR; 	// Transmit Pointer Register

-	AT91_REG	 DBGU_TCR; 	// Transmit Counter Register

-	AT91_REG	 DBGU_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 DBGU_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 DBGU_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 DBGU_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 DBGU_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 DBGU_PTSR; 	// PDC Transfer Status Register

-} AT91S_DBGU, *AT91PS_DBGU;

-

-// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_RSTRX        ((unsigned int) 0x1 <<  2) // (DBGU) Reset Receiver

-#define AT91C_US_RSTTX        ((unsigned int) 0x1 <<  3) // (DBGU) Reset Transmitter

-#define AT91C_US_RXEN         ((unsigned int) 0x1 <<  4) // (DBGU) Receiver Enable

-#define AT91C_US_RXDIS        ((unsigned int) 0x1 <<  5) // (DBGU) Receiver Disable

-#define AT91C_US_TXEN         ((unsigned int) 0x1 <<  6) // (DBGU) Transmitter Enable

-#define AT91C_US_TXDIS        ((unsigned int) 0x1 <<  7) // (DBGU) Transmitter Disable

-#define AT91C_US_RSTSTA       ((unsigned int) 0x1 <<  8) // (DBGU) Reset Status Bits

-// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_PAR          ((unsigned int) 0x7 <<  9) // (DBGU) Parity type

-#define 	AT91C_US_PAR_EVEN                 ((unsigned int) 0x0 <<  9) // (DBGU) Even Parity

-#define 	AT91C_US_PAR_ODD                  ((unsigned int) 0x1 <<  9) // (DBGU) Odd Parity

-#define 	AT91C_US_PAR_SPACE                ((unsigned int) 0x2 <<  9) // (DBGU) Parity forced to 0 (Space)

-#define 	AT91C_US_PAR_MARK                 ((unsigned int) 0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)

-#define 	AT91C_US_PAR_NONE                 ((unsigned int) 0x4 <<  9) // (DBGU) No Parity

-#define 	AT91C_US_PAR_MULTI_DROP           ((unsigned int) 0x6 <<  9) // (DBGU) Multi-drop mode

-#define AT91C_US_CHMODE       ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode

-#define 	AT91C_US_CHMODE_NORMAL               ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.

-#define 	AT91C_US_CHMODE_AUTO                 ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.

-#define 	AT91C_US_CHMODE_LOCAL                ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.

-#define 	AT91C_US_CHMODE_REMOTE               ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.

-// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXRDY        ((unsigned int) 0x1 <<  0) // (DBGU) RXRDY Interrupt

-#define AT91C_US_TXRDY        ((unsigned int) 0x1 <<  1) // (DBGU) TXRDY Interrupt

-#define AT91C_US_ENDRX        ((unsigned int) 0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt

-#define AT91C_US_ENDTX        ((unsigned int) 0x1 <<  4) // (DBGU) End of Transmit Interrupt

-#define AT91C_US_OVRE         ((unsigned int) 0x1 <<  5) // (DBGU) Overrun Interrupt

-#define AT91C_US_FRAME        ((unsigned int) 0x1 <<  6) // (DBGU) Framing Error Interrupt

-#define AT91C_US_PARE         ((unsigned int) 0x1 <<  7) // (DBGU) Parity Error Interrupt

-#define AT91C_US_TXEMPTY      ((unsigned int) 0x1 <<  9) // (DBGU) TXEMPTY Interrupt

-#define AT91C_US_TXBUFE       ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt

-#define AT91C_US_RXBUFF       ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt

-#define AT91C_US_COMM_TX      ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt

-#define AT91C_US_COMM_RX      ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt

-// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- 

-// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- 

-#define AT91C_US_FORCE_NTRST  ((unsigned int) 0x1 <<  0) // (DBGU) Force NTRST in JTAG

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler

-// *****************************************************************************

-typedef struct _AT91S_PIO {

-	AT91_REG	 PIO_PER; 	// PIO Enable Register

-	AT91_REG	 PIO_PDR; 	// PIO Disable Register

-	AT91_REG	 PIO_PSR; 	// PIO Status Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 PIO_OER; 	// Output Enable Register

-	AT91_REG	 PIO_ODR; 	// Output Disable Registerr

-	AT91_REG	 PIO_OSR; 	// Output Status Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 PIO_IFER; 	// Input Filter Enable Register

-	AT91_REG	 PIO_IFDR; 	// Input Filter Disable Register

-	AT91_REG	 PIO_IFSR; 	// Input Filter Status Register

-	AT91_REG	 Reserved2[1]; 	// 

-	AT91_REG	 PIO_SODR; 	// Set Output Data Register

-	AT91_REG	 PIO_CODR; 	// Clear Output Data Register

-	AT91_REG	 PIO_ODSR; 	// Output Data Status Register

-	AT91_REG	 PIO_PDSR; 	// Pin Data Status Register

-	AT91_REG	 PIO_IER; 	// Interrupt Enable Register

-	AT91_REG	 PIO_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PIO_IMR; 	// Interrupt Mask Register

-	AT91_REG	 PIO_ISR; 	// Interrupt Status Register

-	AT91_REG	 PIO_MDER; 	// Multi-driver Enable Register

-	AT91_REG	 PIO_MDDR; 	// Multi-driver Disable Register

-	AT91_REG	 PIO_MDSR; 	// Multi-driver Status Register

-	AT91_REG	 Reserved3[1]; 	// 

-	AT91_REG	 PIO_PPUDR; 	// Pull-up Disable Register

-	AT91_REG	 PIO_PPUER; 	// Pull-up Enable Register

-	AT91_REG	 PIO_PPUSR; 	// Pull-up Status Register

-	AT91_REG	 Reserved4[1]; 	// 

-	AT91_REG	 PIO_ASR; 	// Select A Register

-	AT91_REG	 PIO_BSR; 	// Select B Register

-	AT91_REG	 PIO_ABSR; 	// AB Select Status Register

-	AT91_REG	 Reserved5[9]; 	// 

-	AT91_REG	 PIO_OWER; 	// Output Write Enable Register

-	AT91_REG	 PIO_OWDR; 	// Output Write Disable Register

-	AT91_REG	 PIO_OWSR; 	// Output Write Status Register

-} AT91S_PIO, *AT91PS_PIO;

-

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Clock Generator Controler

-// *****************************************************************************

-typedef struct _AT91S_CKGR {

-	AT91_REG	 CKGR_MOR; 	// Main Oscillator Register

-	AT91_REG	 CKGR_MCFR; 	// Main Clock  Frequency Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 CKGR_PLLR; 	// PLL Register

-} AT91S_CKGR, *AT91PS_CKGR;

-

-// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- 

-#define AT91C_CKGR_MOSCEN     ((unsigned int) 0x1 <<  0) // (CKGR) Main Oscillator Enable

-#define AT91C_CKGR_OSCBYPASS  ((unsigned int) 0x1 <<  1) // (CKGR) Main Oscillator Bypass

-#define AT91C_CKGR_OSCOUNT    ((unsigned int) 0xFF <<  8) // (CKGR) Main Oscillator Start-up Time

-// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- 

-#define AT91C_CKGR_MAINF      ((unsigned int) 0xFFFF <<  0) // (CKGR) Main Clock Frequency

-#define AT91C_CKGR_MAINRDY    ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready

-// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- 

-#define AT91C_CKGR_DIV        ((unsigned int) 0xFF <<  0) // (CKGR) Divider Selected

-#define 	AT91C_CKGR_DIV_0                    ((unsigned int) 0x0) // (CKGR) Divider output is 0

-#define 	AT91C_CKGR_DIV_BYPASS               ((unsigned int) 0x1) // (CKGR) Divider is bypassed

-#define AT91C_CKGR_PLLCOUNT   ((unsigned int) 0x3F <<  8) // (CKGR) PLL Counter

-#define AT91C_CKGR_OUT        ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range

-#define 	AT91C_CKGR_OUT_0                    ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_1                    ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_2                    ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_3                    ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet

-#define AT91C_CKGR_MUL        ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier

-#define AT91C_CKGR_USBDIV     ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks

-#define 	AT91C_CKGR_USBDIV_0                    ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output

-#define 	AT91C_CKGR_USBDIV_1                    ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2

-#define 	AT91C_CKGR_USBDIV_2                    ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Power Management Controler

-// *****************************************************************************

-typedef struct _AT91S_PMC {

-	AT91_REG	 PMC_SCER; 	// System Clock Enable Register

-	AT91_REG	 PMC_SCDR; 	// System Clock Disable Register

-	AT91_REG	 PMC_SCSR; 	// System Clock Status Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 PMC_PCER; 	// Peripheral Clock Enable Register

-	AT91_REG	 PMC_PCDR; 	// Peripheral Clock Disable Register

-	AT91_REG	 PMC_PCSR; 	// Peripheral Clock Status Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 PMC_MOR; 	// Main Oscillator Register

-	AT91_REG	 PMC_MCFR; 	// Main Clock  Frequency Register

-	AT91_REG	 Reserved2[1]; 	// 

-	AT91_REG	 PMC_PLLR; 	// PLL Register

-	AT91_REG	 PMC_MCKR; 	// Master Clock Register

-	AT91_REG	 Reserved3[3]; 	// 

-	AT91_REG	 PMC_PCKR[4]; 	// Programmable Clock Register

-	AT91_REG	 Reserved4[4]; 	// 

-	AT91_REG	 PMC_IER; 	// Interrupt Enable Register

-	AT91_REG	 PMC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 PMC_SR; 	// Status Register

-	AT91_REG	 PMC_IMR; 	// Interrupt Mask Register

-} AT91S_PMC, *AT91PS_PMC;

-

-// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- 

-#define AT91C_PMC_PCK         ((unsigned int) 0x1 <<  0) // (PMC) Processor Clock

-#define AT91C_PMC_UDP         ((unsigned int) 0x1 <<  7) // (PMC) USB Device Port Clock

-#define AT91C_PMC_PCK0        ((unsigned int) 0x1 <<  8) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK1        ((unsigned int) 0x1 <<  9) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK2        ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK3        ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output

-// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- 

-// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- 

-// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- 

-// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- 

-// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- 

-// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- 

-#define AT91C_PMC_CSS         ((unsigned int) 0x3 <<  0) // (PMC) Programmable Clock Selection

-#define 	AT91C_PMC_CSS_SLOW_CLK             ((unsigned int) 0x0) // (PMC) Slow Clock is selected

-#define 	AT91C_PMC_CSS_MAIN_CLK             ((unsigned int) 0x1) // (PMC) Main Clock is selected

-#define 	AT91C_PMC_CSS_PLL_CLK              ((unsigned int) 0x3) // (PMC) Clock from PLL is selected

-#define AT91C_PMC_PRES        ((unsigned int) 0x7 <<  2) // (PMC) Programmable Clock Prescaler

-#define 	AT91C_PMC_PRES_CLK                  ((unsigned int) 0x0 <<  2) // (PMC) Selected clock

-#define 	AT91C_PMC_PRES_CLK_2                ((unsigned int) 0x1 <<  2) // (PMC) Selected clock divided by 2

-#define 	AT91C_PMC_PRES_CLK_4                ((unsigned int) 0x2 <<  2) // (PMC) Selected clock divided by 4

-#define 	AT91C_PMC_PRES_CLK_8                ((unsigned int) 0x3 <<  2) // (PMC) Selected clock divided by 8

-#define 	AT91C_PMC_PRES_CLK_16               ((unsigned int) 0x4 <<  2) // (PMC) Selected clock divided by 16

-#define 	AT91C_PMC_PRES_CLK_32               ((unsigned int) 0x5 <<  2) // (PMC) Selected clock divided by 32

-#define 	AT91C_PMC_PRES_CLK_64               ((unsigned int) 0x6 <<  2) // (PMC) Selected clock divided by 64

-// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- 

-// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- 

-#define AT91C_PMC_MOSCS       ((unsigned int) 0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask

-#define AT91C_PMC_LOCK        ((unsigned int) 0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask

-#define AT91C_PMC_MCKRDY      ((unsigned int) 0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK0RDY     ((unsigned int) 0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK1RDY     ((unsigned int) 0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK2RDY     ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK3RDY     ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask

-// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- 

-// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- 

-// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Reset Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_RSTC {

-	AT91_REG	 RSTC_RCR; 	// Reset Control Register

-	AT91_REG	 RSTC_RSR; 	// Reset Status Register

-	AT91_REG	 RSTC_RMR; 	// Reset Mode Register

-} AT91S_RSTC, *AT91PS_RSTC;

-

-// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- 

-#define AT91C_RSTC_PROCRST    ((unsigned int) 0x1 <<  0) // (RSTC) Processor Reset

-#define AT91C_RSTC_PERRST     ((unsigned int) 0x1 <<  2) // (RSTC) Peripheral Reset

-#define AT91C_RSTC_EXTRST     ((unsigned int) 0x1 <<  3) // (RSTC) External Reset

-#define AT91C_RSTC_KEY        ((unsigned int) 0xFF << 24) // (RSTC) Password

-// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- 

-#define AT91C_RSTC_URSTS      ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Status

-#define AT91C_RSTC_BODSTS     ((unsigned int) 0x1 <<  1) // (RSTC) Brownout Detection Status

-#define AT91C_RSTC_RSTTYP     ((unsigned int) 0x7 <<  8) // (RSTC) Reset Type

-#define 	AT91C_RSTC_RSTTYP_POWERUP              ((unsigned int) 0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.

-#define 	AT91C_RSTC_RSTTYP_WAKEUP               ((unsigned int) 0x1 <<  8) // (RSTC) WakeUp Reset. VDDCORE rising.

-#define 	AT91C_RSTC_RSTTYP_WATCHDOG             ((unsigned int) 0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.

-#define 	AT91C_RSTC_RSTTYP_SOFTWARE             ((unsigned int) 0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.

-#define 	AT91C_RSTC_RSTTYP_USER                 ((unsigned int) 0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.

-#define 	AT91C_RSTC_RSTTYP_BROWNOUT             ((unsigned int) 0x5 <<  8) // (RSTC) Brownout Reset occured.

-#define AT91C_RSTC_NRSTL      ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level

-#define AT91C_RSTC_SRCMP      ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress.

-// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- 

-#define AT91C_RSTC_URSTEN     ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Enable

-#define AT91C_RSTC_URSTIEN    ((unsigned int) 0x1 <<  4) // (RSTC) User Reset Interrupt Enable

-#define AT91C_RSTC_ERSTL      ((unsigned int) 0xF <<  8) // (RSTC) User Reset Enable

-#define AT91C_RSTC_BODIEN     ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_RTTC {

-	AT91_REG	 RTTC_RTMR; 	// Real-time Mode Register

-	AT91_REG	 RTTC_RTAR; 	// Real-time Alarm Register

-	AT91_REG	 RTTC_RTVR; 	// Real-time Value Register

-	AT91_REG	 RTTC_RTSR; 	// Real-time Status Register

-} AT91S_RTTC, *AT91PS_RTTC;

-

-// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- 

-#define AT91C_RTTC_RTPRES     ((unsigned int) 0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value

-#define AT91C_RTTC_ALMIEN     ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable

-#define AT91C_RTTC_RTTINCIEN  ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable

-#define AT91C_RTTC_RTTRST     ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart

-// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- 

-#define AT91C_RTTC_ALMV       ((unsigned int) 0x0 <<  0) // (RTTC) Alarm Value

-// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- 

-#define AT91C_RTTC_CRTV       ((unsigned int) 0x0 <<  0) // (RTTC) Current Real-time Value

-// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- 

-#define AT91C_RTTC_ALMS       ((unsigned int) 0x1 <<  0) // (RTTC) Real-time Alarm Status

-#define AT91C_RTTC_RTTINC     ((unsigned int) 0x1 <<  1) // (RTTC) Real-time Timer Increment

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_PITC {

-	AT91_REG	 PITC_PIMR; 	// Period Interval Mode Register

-	AT91_REG	 PITC_PISR; 	// Period Interval Status Register

-	AT91_REG	 PITC_PIVR; 	// Period Interval Value Register

-	AT91_REG	 PITC_PIIR; 	// Period Interval Image Register

-} AT91S_PITC, *AT91PS_PITC;

-

-// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- 

-#define AT91C_PITC_PIV        ((unsigned int) 0xFFFFF <<  0) // (PITC) Periodic Interval Value

-#define AT91C_PITC_PITEN      ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled

-#define AT91C_PITC_PITIEN     ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable

-// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- 

-#define AT91C_PITC_PITS       ((unsigned int) 0x1 <<  0) // (PITC) Periodic Interval Timer Status

-// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- 

-#define AT91C_PITC_CPIV       ((unsigned int) 0xFFFFF <<  0) // (PITC) Current Periodic Interval Value

-#define AT91C_PITC_PICNT      ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter

-// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_WDTC {

-	AT91_REG	 WDTC_WDCR; 	// Watchdog Control Register

-	AT91_REG	 WDTC_WDMR; 	// Watchdog Mode Register

-	AT91_REG	 WDTC_WDSR; 	// Watchdog Status Register

-} AT91S_WDTC, *AT91PS_WDTC;

-

-// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- 

-#define AT91C_WDTC_WDRSTT     ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Restart

-#define AT91C_WDTC_KEY        ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password

-// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- 

-#define AT91C_WDTC_WDV        ((unsigned int) 0xFFF <<  0) // (WDTC) Watchdog Timer Restart

-#define AT91C_WDTC_WDFIEN     ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable

-#define AT91C_WDTC_WDRSTEN    ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable

-#define AT91C_WDTC_WDRPROC    ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart

-#define AT91C_WDTC_WDDIS      ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable

-#define AT91C_WDTC_WDD        ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value

-#define AT91C_WDTC_WDDBGHLT   ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt

-#define AT91C_WDTC_WDIDLEHLT  ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt

-// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- 

-#define AT91C_WDTC_WDUNF      ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Underflow

-#define AT91C_WDTC_WDERR      ((unsigned int) 0x1 <<  1) // (WDTC) Watchdog Error

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Voltage Regulator Mode Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_VREG {

-	AT91_REG	 VREG_MR; 	// Voltage Regulator Mode Register

-} AT91S_VREG, *AT91PS_VREG;

-

-// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- 

-#define AT91C_VREG_PSTDBY     ((unsigned int) 0x1 <<  0) // (VREG) Voltage Regulator Power Standby Mode

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Memory Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_MC {

-	AT91_REG	 MC_RCR; 	// MC Remap Control Register

-	AT91_REG	 MC_ASR; 	// MC Abort Status Register

-	AT91_REG	 MC_AASR; 	// MC Abort Address Status Register

-	AT91_REG	 Reserved0[21]; 	// 

-	AT91_REG	 MC_FMR; 	// MC Flash Mode Register

-	AT91_REG	 MC_FCR; 	// MC Flash Command Register

-	AT91_REG	 MC_FSR; 	// MC Flash Status Register

-} AT91S_MC, *AT91PS_MC;

-

-// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- 

-#define AT91C_MC_RCB          ((unsigned int) 0x1 <<  0) // (MC) Remap Command Bit

-// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- 

-#define AT91C_MC_UNDADD       ((unsigned int) 0x1 <<  0) // (MC) Undefined Addess Abort Status

-#define AT91C_MC_MISADD       ((unsigned int) 0x1 <<  1) // (MC) Misaligned Addess Abort Status

-#define AT91C_MC_ABTSZ        ((unsigned int) 0x3 <<  8) // (MC) Abort Size Status

-#define 	AT91C_MC_ABTSZ_BYTE                 ((unsigned int) 0x0 <<  8) // (MC) Byte

-#define 	AT91C_MC_ABTSZ_HWORD                ((unsigned int) 0x1 <<  8) // (MC) Half-word

-#define 	AT91C_MC_ABTSZ_WORD                 ((unsigned int) 0x2 <<  8) // (MC) Word

-#define AT91C_MC_ABTTYP       ((unsigned int) 0x3 << 10) // (MC) Abort Type Status

-#define 	AT91C_MC_ABTTYP_DATAR                ((unsigned int) 0x0 << 10) // (MC) Data Read

-#define 	AT91C_MC_ABTTYP_DATAW                ((unsigned int) 0x1 << 10) // (MC) Data Write

-#define 	AT91C_MC_ABTTYP_FETCH                ((unsigned int) 0x2 << 10) // (MC) Code Fetch

-#define AT91C_MC_MST0         ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source

-#define AT91C_MC_MST1         ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source

-#define AT91C_MC_SVMST0       ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source

-#define AT91C_MC_SVMST1       ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source

-// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- 

-#define AT91C_MC_FRDY         ((unsigned int) 0x1 <<  0) // (MC) Flash Ready

-#define AT91C_MC_LOCKE        ((unsigned int) 0x1 <<  2) // (MC) Lock Error

-#define AT91C_MC_PROGE        ((unsigned int) 0x1 <<  3) // (MC) Programming Error

-#define AT91C_MC_NEBP         ((unsigned int) 0x1 <<  7) // (MC) No Erase Before Programming

-#define AT91C_MC_FWS          ((unsigned int) 0x3 <<  8) // (MC) Flash Wait State

-#define 	AT91C_MC_FWS_0FWS                 ((unsigned int) 0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations

-#define 	AT91C_MC_FWS_1FWS                 ((unsigned int) 0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations

-#define 	AT91C_MC_FWS_2FWS                 ((unsigned int) 0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations

-#define 	AT91C_MC_FWS_3FWS                 ((unsigned int) 0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations

-#define AT91C_MC_FMCN         ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number

-// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- 

-#define AT91C_MC_FCMD         ((unsigned int) 0xF <<  0) // (MC) Flash Command

-#define 	AT91C_MC_FCMD_START_PROG           ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN.

-#define 	AT91C_MC_FCMD_LOCK                 ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_PROG_AND_LOCK        ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.

-#define 	AT91C_MC_FCMD_UNLOCK               ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_ERASE_ALL            ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.

-#define 	AT91C_MC_FCMD_SET_GP_NVM           ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_CLR_GP_NVM           ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_SET_SECURITY         ((unsigned int) 0xF) // (MC) Set Security Bit.

-#define AT91C_MC_PAGEN        ((unsigned int) 0x3FF <<  8) // (MC) Page Number

-#define AT91C_MC_KEY          ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key

-// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- 

-#define AT91C_MC_SECURITY     ((unsigned int) 0x1 <<  4) // (MC) Security Bit Status

-#define AT91C_MC_GPNVM0       ((unsigned int) 0x1 <<  8) // (MC) Sector 0 Lock Status

-#define AT91C_MC_GPNVM1       ((unsigned int) 0x1 <<  9) // (MC) Sector 1 Lock Status

-#define AT91C_MC_GPNVM2       ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status

-#define AT91C_MC_GPNVM3       ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status

-#define AT91C_MC_GPNVM4       ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status

-#define AT91C_MC_GPNVM5       ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status

-#define AT91C_MC_GPNVM6       ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status

-#define AT91C_MC_GPNVM7       ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS0       ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status

-#define AT91C_MC_LOCKS1       ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status

-#define AT91C_MC_LOCKS2       ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status

-#define AT91C_MC_LOCKS3       ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status

-#define AT91C_MC_LOCKS4       ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status

-#define AT91C_MC_LOCKS5       ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status

-#define AT91C_MC_LOCKS6       ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status

-#define AT91C_MC_LOCKS7       ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS8       ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status

-#define AT91C_MC_LOCKS9       ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status

-#define AT91C_MC_LOCKS10      ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status

-#define AT91C_MC_LOCKS11      ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status

-#define AT91C_MC_LOCKS12      ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status

-#define AT91C_MC_LOCKS13      ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status

-#define AT91C_MC_LOCKS14      ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status

-#define AT91C_MC_LOCKS15      ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface

-// *****************************************************************************

-typedef struct _AT91S_SPI {

-	AT91_REG	 SPI_CR; 	// Control Register

-	AT91_REG	 SPI_MR; 	// Mode Register

-	AT91_REG	 SPI_RDR; 	// Receive Data Register

-	AT91_REG	 SPI_TDR; 	// Transmit Data Register

-	AT91_REG	 SPI_SR; 	// Status Register

-	AT91_REG	 SPI_IER; 	// Interrupt Enable Register

-	AT91_REG	 SPI_IDR; 	// Interrupt Disable Register

-	AT91_REG	 SPI_IMR; 	// Interrupt Mask Register

-	AT91_REG	 Reserved0[4]; 	// 

-	AT91_REG	 SPI_CSR[4]; 	// Chip Select Register

-	AT91_REG	 Reserved1[48]; 	// 

-	AT91_REG	 SPI_RPR; 	// Receive Pointer Register

-	AT91_REG	 SPI_RCR; 	// Receive Counter Register

-	AT91_REG	 SPI_TPR; 	// Transmit Pointer Register

-	AT91_REG	 SPI_TCR; 	// Transmit Counter Register

-	AT91_REG	 SPI_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 SPI_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 SPI_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 SPI_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 SPI_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 SPI_PTSR; 	// PDC Transfer Status Register

-} AT91S_SPI, *AT91PS_SPI;

-

-// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- 

-#define AT91C_SPI_SPIEN       ((unsigned int) 0x1 <<  0) // (SPI) SPI Enable

-#define AT91C_SPI_SPIDIS      ((unsigned int) 0x1 <<  1) // (SPI) SPI Disable

-#define AT91C_SPI_SWRST       ((unsigned int) 0x1 <<  7) // (SPI) SPI Software reset

-#define AT91C_SPI_LASTXFER    ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer

-// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- 

-#define AT91C_SPI_MSTR        ((unsigned int) 0x1 <<  0) // (SPI) Master/Slave Mode

-#define AT91C_SPI_PS          ((unsigned int) 0x1 <<  1) // (SPI) Peripheral Select

-#define 	AT91C_SPI_PS_FIXED                ((unsigned int) 0x0 <<  1) // (SPI) Fixed Peripheral Select

-#define 	AT91C_SPI_PS_VARIABLE             ((unsigned int) 0x1 <<  1) // (SPI) Variable Peripheral Select

-#define AT91C_SPI_PCSDEC      ((unsigned int) 0x1 <<  2) // (SPI) Chip Select Decode

-#define AT91C_SPI_FDIV        ((unsigned int) 0x1 <<  3) // (SPI) Clock Selection

-#define AT91C_SPI_MODFDIS     ((unsigned int) 0x1 <<  4) // (SPI) Mode Fault Detection

-#define AT91C_SPI_LLB         ((unsigned int) 0x1 <<  7) // (SPI) Clock Selection

-#define AT91C_SPI_PCS         ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select

-#define AT91C_SPI_DLYBCS      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects

-// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- 

-#define AT91C_SPI_RD          ((unsigned int) 0xFFFF <<  0) // (SPI) Receive Data

-#define AT91C_SPI_RPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- 

-#define AT91C_SPI_TD          ((unsigned int) 0xFFFF <<  0) // (SPI) Transmit Data

-#define AT91C_SPI_TPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- 

-#define AT91C_SPI_RDRF        ((unsigned int) 0x1 <<  0) // (SPI) Receive Data Register Full

-#define AT91C_SPI_TDRE        ((unsigned int) 0x1 <<  1) // (SPI) Transmit Data Register Empty

-#define AT91C_SPI_MODF        ((unsigned int) 0x1 <<  2) // (SPI) Mode Fault Error

-#define AT91C_SPI_OVRES       ((unsigned int) 0x1 <<  3) // (SPI) Overrun Error Status

-#define AT91C_SPI_ENDRX       ((unsigned int) 0x1 <<  4) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_ENDTX       ((unsigned int) 0x1 <<  5) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_RXBUFF      ((unsigned int) 0x1 <<  6) // (SPI) RXBUFF Interrupt

-#define AT91C_SPI_TXBUFE      ((unsigned int) 0x1 <<  7) // (SPI) TXBUFE Interrupt

-#define AT91C_SPI_NSSR        ((unsigned int) 0x1 <<  8) // (SPI) NSSR Interrupt

-#define AT91C_SPI_TXEMPTY     ((unsigned int) 0x1 <<  9) // (SPI) TXEMPTY Interrupt

-#define AT91C_SPI_SPIENS      ((unsigned int) 0x1 << 16) // (SPI) Enable Status

-// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- 

-// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- 

-// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- 

-// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- 

-#define AT91C_SPI_CPOL        ((unsigned int) 0x1 <<  0) // (SPI) Clock Polarity

-#define AT91C_SPI_NCPHA       ((unsigned int) 0x1 <<  1) // (SPI) Clock Phase

-#define AT91C_SPI_CSAAT       ((unsigned int) 0x1 <<  3) // (SPI) Chip Select Active After Transfer

-#define AT91C_SPI_BITS        ((unsigned int) 0xF <<  4) // (SPI) Bits Per Transfer

-#define 	AT91C_SPI_BITS_8                    ((unsigned int) 0x0 <<  4) // (SPI) 8 Bits Per transfer

-#define 	AT91C_SPI_BITS_9                    ((unsigned int) 0x1 <<  4) // (SPI) 9 Bits Per transfer

-#define 	AT91C_SPI_BITS_10                   ((unsigned int) 0x2 <<  4) // (SPI) 10 Bits Per transfer

-#define 	AT91C_SPI_BITS_11                   ((unsigned int) 0x3 <<  4) // (SPI) 11 Bits Per transfer

-#define 	AT91C_SPI_BITS_12                   ((unsigned int) 0x4 <<  4) // (SPI) 12 Bits Per transfer

-#define 	AT91C_SPI_BITS_13                   ((unsigned int) 0x5 <<  4) // (SPI) 13 Bits Per transfer

-#define 	AT91C_SPI_BITS_14                   ((unsigned int) 0x6 <<  4) // (SPI) 14 Bits Per transfer

-#define 	AT91C_SPI_BITS_15                   ((unsigned int) 0x7 <<  4) // (SPI) 15 Bits Per transfer

-#define 	AT91C_SPI_BITS_16                   ((unsigned int) 0x8 <<  4) // (SPI) 16 Bits Per transfer

-#define AT91C_SPI_SCBR        ((unsigned int) 0xFF <<  8) // (SPI) Serial Clock Baud Rate

-#define AT91C_SPI_DLYBS       ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK

-#define AT91C_SPI_DLYBCT      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Usart

-// *****************************************************************************

-typedef struct _AT91S_USART {

-	AT91_REG	 US_CR; 	// Control Register

-	AT91_REG	 US_MR; 	// Mode Register

-	AT91_REG	 US_IER; 	// Interrupt Enable Register

-	AT91_REG	 US_IDR; 	// Interrupt Disable Register

-	AT91_REG	 US_IMR; 	// Interrupt Mask Register

-	AT91_REG	 US_CSR; 	// Channel Status Register

-	AT91_REG	 US_RHR; 	// Receiver Holding Register

-	AT91_REG	 US_THR; 	// Transmitter Holding Register

-	AT91_REG	 US_BRGR; 	// Baud Rate Generator Register

-	AT91_REG	 US_RTOR; 	// Receiver Time-out Register

-	AT91_REG	 US_TTGR; 	// Transmitter Time-guard Register

-	AT91_REG	 Reserved0[5]; 	// 

-	AT91_REG	 US_FIDI; 	// FI_DI_Ratio Register

-	AT91_REG	 US_NER; 	// Nb Errors Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 US_IF; 	// IRDA_FILTER Register

-	AT91_REG	 Reserved2[44]; 	// 

-	AT91_REG	 US_RPR; 	// Receive Pointer Register

-	AT91_REG	 US_RCR; 	// Receive Counter Register

-	AT91_REG	 US_TPR; 	// Transmit Pointer Register

-	AT91_REG	 US_TCR; 	// Transmit Counter Register

-	AT91_REG	 US_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 US_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 US_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 US_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 US_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 US_PTSR; 	// PDC Transfer Status Register

-} AT91S_USART, *AT91PS_USART;

-

-// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_STTBRK       ((unsigned int) 0x1 <<  9) // (USART) Start Break

-#define AT91C_US_STPBRK       ((unsigned int) 0x1 << 10) // (USART) Stop Break

-#define AT91C_US_STTTO        ((unsigned int) 0x1 << 11) // (USART) Start Time-out

-#define AT91C_US_SENDA        ((unsigned int) 0x1 << 12) // (USART) Send Address

-#define AT91C_US_RSTIT        ((unsigned int) 0x1 << 13) // (USART) Reset Iterations

-#define AT91C_US_RSTNACK      ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge

-#define AT91C_US_RETTO        ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out

-#define AT91C_US_DTREN        ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable

-#define AT91C_US_DTRDIS       ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable

-#define AT91C_US_RTSEN        ((unsigned int) 0x1 << 18) // (USART) Request to Send enable

-#define AT91C_US_RTSDIS       ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable

-// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_USMODE       ((unsigned int) 0xF <<  0) // (USART) Usart mode

-#define 	AT91C_US_USMODE_NORMAL               ((unsigned int) 0x0) // (USART) Normal

-#define 	AT91C_US_USMODE_RS485                ((unsigned int) 0x1) // (USART) RS485

-#define 	AT91C_US_USMODE_HWHSH                ((unsigned int) 0x2) // (USART) Hardware Handshaking

-#define 	AT91C_US_USMODE_MODEM                ((unsigned int) 0x3) // (USART) Modem

-#define 	AT91C_US_USMODE_ISO7816_0            ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0

-#define 	AT91C_US_USMODE_ISO7816_1            ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1

-#define 	AT91C_US_USMODE_IRDA                 ((unsigned int) 0x8) // (USART) IrDA

-#define 	AT91C_US_USMODE_SWHSH                ((unsigned int) 0xC) // (USART) Software Handshaking

-#define AT91C_US_CLKS         ((unsigned int) 0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CLKS_CLOCK                ((unsigned int) 0x0 <<  4) // (USART) Clock

-#define 	AT91C_US_CLKS_FDIV1                ((unsigned int) 0x1 <<  4) // (USART) fdiv1

-#define 	AT91C_US_CLKS_SLOW                 ((unsigned int) 0x2 <<  4) // (USART) slow_clock (ARM)

-#define 	AT91C_US_CLKS_EXT                  ((unsigned int) 0x3 <<  4) // (USART) External (SCK)

-#define AT91C_US_CHRL         ((unsigned int) 0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CHRL_5_BITS               ((unsigned int) 0x0 <<  6) // (USART) Character Length: 5 bits

-#define 	AT91C_US_CHRL_6_BITS               ((unsigned int) 0x1 <<  6) // (USART) Character Length: 6 bits

-#define 	AT91C_US_CHRL_7_BITS               ((unsigned int) 0x2 <<  6) // (USART) Character Length: 7 bits

-#define 	AT91C_US_CHRL_8_BITS               ((unsigned int) 0x3 <<  6) // (USART) Character Length: 8 bits

-#define AT91C_US_SYNC         ((unsigned int) 0x1 <<  8) // (USART) Synchronous Mode Select

-#define AT91C_US_NBSTOP       ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits

-#define 	AT91C_US_NBSTOP_1_BIT                ((unsigned int) 0x0 << 12) // (USART) 1 stop bit

-#define 	AT91C_US_NBSTOP_15_BIT               ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits

-#define 	AT91C_US_NBSTOP_2_BIT                ((unsigned int) 0x2 << 12) // (USART) 2 stop bits

-#define AT91C_US_MSBF         ((unsigned int) 0x1 << 16) // (USART) Bit Order

-#define AT91C_US_MODE9        ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length

-#define AT91C_US_CKLO         ((unsigned int) 0x1 << 18) // (USART) Clock Output Select

-#define AT91C_US_OVER         ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode

-#define AT91C_US_INACK        ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge

-#define AT91C_US_DSNACK       ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK

-#define AT91C_US_MAX_ITER     ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions

-#define AT91C_US_FILTER       ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter

-// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXBRK        ((unsigned int) 0x1 <<  2) // (USART) Break Received/End of Break

-#define AT91C_US_TIMEOUT      ((unsigned int) 0x1 <<  8) // (USART) Receiver Time-out

-#define AT91C_US_ITERATION    ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached

-#define AT91C_US_NACK         ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge

-#define AT91C_US_RIIC         ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag

-#define AT91C_US_DSRIC        ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag

-#define AT91C_US_DCDIC        ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag

-#define AT91C_US_CTSIC        ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag

-// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- 

-#define AT91C_US_RI           ((unsigned int) 0x1 << 20) // (USART) Image of RI Input

-#define AT91C_US_DSR          ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input

-#define AT91C_US_DCD          ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input

-#define AT91C_US_CTS          ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_SSC {

-	AT91_REG	 SSC_CR; 	// Control Register

-	AT91_REG	 SSC_CMR; 	// Clock Mode Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 SSC_RCMR; 	// Receive Clock ModeRegister

-	AT91_REG	 SSC_RFMR; 	// Receive Frame Mode Register

-	AT91_REG	 SSC_TCMR; 	// Transmit Clock Mode Register

-	AT91_REG	 SSC_TFMR; 	// Transmit Frame Mode Register

-	AT91_REG	 SSC_RHR; 	// Receive Holding Register

-	AT91_REG	 SSC_THR; 	// Transmit Holding Register

-	AT91_REG	 Reserved1[2]; 	// 

-	AT91_REG	 SSC_RSHR; 	// Receive Sync Holding Register

-	AT91_REG	 SSC_TSHR; 	// Transmit Sync Holding Register

-	AT91_REG	 Reserved2[2]; 	// 

-	AT91_REG	 SSC_SR; 	// Status Register

-	AT91_REG	 SSC_IER; 	// Interrupt Enable Register

-	AT91_REG	 SSC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 SSC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 Reserved3[44]; 	// 

-	AT91_REG	 SSC_RPR; 	// Receive Pointer Register

-	AT91_REG	 SSC_RCR; 	// Receive Counter Register

-	AT91_REG	 SSC_TPR; 	// Transmit Pointer Register

-	AT91_REG	 SSC_TCR; 	// Transmit Counter Register

-	AT91_REG	 SSC_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 SSC_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 SSC_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 SSC_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 SSC_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 SSC_PTSR; 	// PDC Transfer Status Register

-} AT91S_SSC, *AT91PS_SSC;

-

-// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- 

-#define AT91C_SSC_RXEN        ((unsigned int) 0x1 <<  0) // (SSC) Receive Enable

-#define AT91C_SSC_RXDIS       ((unsigned int) 0x1 <<  1) // (SSC) Receive Disable

-#define AT91C_SSC_TXEN        ((unsigned int) 0x1 <<  8) // (SSC) Transmit Enable

-#define AT91C_SSC_TXDIS       ((unsigned int) 0x1 <<  9) // (SSC) Transmit Disable

-#define AT91C_SSC_SWRST       ((unsigned int) 0x1 << 15) // (SSC) Software Reset

-// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- 

-#define AT91C_SSC_CKS         ((unsigned int) 0x3 <<  0) // (SSC) Receive/Transmit Clock Selection

-#define 	AT91C_SSC_CKS_DIV                  ((unsigned int) 0x0) // (SSC) Divided Clock

-#define 	AT91C_SSC_CKS_TK                   ((unsigned int) 0x1) // (SSC) TK Clock signal

-#define 	AT91C_SSC_CKS_RK                   ((unsigned int) 0x2) // (SSC) RK pin

-#define AT91C_SSC_CKO         ((unsigned int) 0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection

-#define 	AT91C_SSC_CKO_NONE                 ((unsigned int) 0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only

-#define 	AT91C_SSC_CKO_CONTINOUS            ((unsigned int) 0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output

-#define 	AT91C_SSC_CKO_DATA_TX              ((unsigned int) 0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output

-#define AT91C_SSC_CKI         ((unsigned int) 0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion

-#define AT91C_SSC_START       ((unsigned int) 0xF <<  8) // (SSC) Receive/Transmit Start Selection

-#define 	AT91C_SSC_START_CONTINOUS            ((unsigned int) 0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.

-#define 	AT91C_SSC_START_TX                   ((unsigned int) 0x1 <<  8) // (SSC) Transmit/Receive start

-#define 	AT91C_SSC_START_LOW_RF               ((unsigned int) 0x2 <<  8) // (SSC) Detection of a low level on RF input

-#define 	AT91C_SSC_START_HIGH_RF              ((unsigned int) 0x3 <<  8) // (SSC) Detection of a high level on RF input

-#define 	AT91C_SSC_START_FALL_RF              ((unsigned int) 0x4 <<  8) // (SSC) Detection of a falling edge on RF input

-#define 	AT91C_SSC_START_RISE_RF              ((unsigned int) 0x5 <<  8) // (SSC) Detection of a rising edge on RF input

-#define 	AT91C_SSC_START_LEVEL_RF             ((unsigned int) 0x6 <<  8) // (SSC) Detection of any level change on RF input

-#define 	AT91C_SSC_START_EDGE_RF              ((unsigned int) 0x7 <<  8) // (SSC) Detection of any edge on RF input

-#define 	AT91C_SSC_START_0                    ((unsigned int) 0x8 <<  8) // (SSC) Compare 0

-#define AT91C_SSC_STTDLY      ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay

-#define AT91C_SSC_PERIOD      ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection

-// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- 

-#define AT91C_SSC_DATLEN      ((unsigned int) 0x1F <<  0) // (SSC) Data Length

-#define AT91C_SSC_LOOP        ((unsigned int) 0x1 <<  5) // (SSC) Loop Mode

-#define AT91C_SSC_MSBF        ((unsigned int) 0x1 <<  7) // (SSC) Most Significant Bit First

-#define AT91C_SSC_DATNB       ((unsigned int) 0xF <<  8) // (SSC) Data Number per Frame

-#define AT91C_SSC_FSLEN       ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length

-#define AT91C_SSC_FSOS        ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection

-#define 	AT91C_SSC_FSOS_NONE                 ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only

-#define 	AT91C_SSC_FSOS_NEGATIVE             ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse

-#define 	AT91C_SSC_FSOS_POSITIVE             ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse

-#define 	AT91C_SSC_FSOS_LOW                  ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer

-#define 	AT91C_SSC_FSOS_HIGH                 ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer

-#define 	AT91C_SSC_FSOS_TOGGLE               ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer

-#define AT91C_SSC_FSEDGE      ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection

-// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- 

-// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- 

-#define AT91C_SSC_DATDEF      ((unsigned int) 0x1 <<  5) // (SSC) Data Default Value

-#define AT91C_SSC_FSDEN       ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable

-// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- 

-#define AT91C_SSC_TXRDY       ((unsigned int) 0x1 <<  0) // (SSC) Transmit Ready

-#define AT91C_SSC_TXEMPTY     ((unsigned int) 0x1 <<  1) // (SSC) Transmit Empty

-#define AT91C_SSC_ENDTX       ((unsigned int) 0x1 <<  2) // (SSC) End Of Transmission

-#define AT91C_SSC_TXBUFE      ((unsigned int) 0x1 <<  3) // (SSC) Transmit Buffer Empty

-#define AT91C_SSC_RXRDY       ((unsigned int) 0x1 <<  4) // (SSC) Receive Ready

-#define AT91C_SSC_OVRUN       ((unsigned int) 0x1 <<  5) // (SSC) Receive Overrun

-#define AT91C_SSC_ENDRX       ((unsigned int) 0x1 <<  6) // (SSC) End of Reception

-#define AT91C_SSC_RXBUFF      ((unsigned int) 0x1 <<  7) // (SSC) Receive Buffer Full

-#define AT91C_SSC_TXSYN       ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync

-#define AT91C_SSC_RXSYN       ((unsigned int) 0x1 << 11) // (SSC) Receive Sync

-#define AT91C_SSC_TXENA       ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable

-#define AT91C_SSC_RXENA       ((unsigned int) 0x1 << 17) // (SSC) Receive Enable

-// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- 

-// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- 

-// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Two-wire Interface

-// *****************************************************************************

-typedef struct _AT91S_TWI {

-	AT91_REG	 TWI_CR; 	// Control Register

-	AT91_REG	 TWI_MMR; 	// Master Mode Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 TWI_IADR; 	// Internal Address Register

-	AT91_REG	 TWI_CWGR; 	// Clock Waveform Generator Register

-	AT91_REG	 Reserved1[3]; 	// 

-	AT91_REG	 TWI_SR; 	// Status Register

-	AT91_REG	 TWI_IER; 	// Interrupt Enable Register

-	AT91_REG	 TWI_IDR; 	// Interrupt Disable Register

-	AT91_REG	 TWI_IMR; 	// Interrupt Mask Register

-	AT91_REG	 TWI_RHR; 	// Receive Holding Register

-	AT91_REG	 TWI_THR; 	// Transmit Holding Register

-} AT91S_TWI, *AT91PS_TWI;

-

-// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- 

-#define AT91C_TWI_START       ((unsigned int) 0x1 <<  0) // (TWI) Send a START Condition

-#define AT91C_TWI_STOP        ((unsigned int) 0x1 <<  1) // (TWI) Send a STOP Condition

-#define AT91C_TWI_MSEN        ((unsigned int) 0x1 <<  2) // (TWI) TWI Master Transfer Enabled

-#define AT91C_TWI_MSDIS       ((unsigned int) 0x1 <<  3) // (TWI) TWI Master Transfer Disabled

-#define AT91C_TWI_SWRST       ((unsigned int) 0x1 <<  7) // (TWI) Software Reset

-// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- 

-#define AT91C_TWI_IADRSZ      ((unsigned int) 0x3 <<  8) // (TWI) Internal Device Address Size

-#define 	AT91C_TWI_IADRSZ_NO                   ((unsigned int) 0x0 <<  8) // (TWI) No internal device address

-#define 	AT91C_TWI_IADRSZ_1_BYTE               ((unsigned int) 0x1 <<  8) // (TWI) One-byte internal device address

-#define 	AT91C_TWI_IADRSZ_2_BYTE               ((unsigned int) 0x2 <<  8) // (TWI) Two-byte internal device address

-#define 	AT91C_TWI_IADRSZ_3_BYTE               ((unsigned int) 0x3 <<  8) // (TWI) Three-byte internal device address

-#define AT91C_TWI_MREAD       ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction

-#define AT91C_TWI_DADR        ((unsigned int) 0x7F << 16) // (TWI) Device Address

-// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- 

-#define AT91C_TWI_CLDIV       ((unsigned int) 0xFF <<  0) // (TWI) Clock Low Divider

-#define AT91C_TWI_CHDIV       ((unsigned int) 0xFF <<  8) // (TWI) Clock High Divider

-#define AT91C_TWI_CKDIV       ((unsigned int) 0x7 << 16) // (TWI) Clock Divider

-// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- 

-#define AT91C_TWI_TXCOMP      ((unsigned int) 0x1 <<  0) // (TWI) Transmission Completed

-#define AT91C_TWI_RXRDY       ((unsigned int) 0x1 <<  1) // (TWI) Receive holding register ReaDY

-#define AT91C_TWI_TXRDY       ((unsigned int) 0x1 <<  2) // (TWI) Transmit holding register ReaDY

-#define AT91C_TWI_OVRE        ((unsigned int) 0x1 <<  6) // (TWI) Overrun Error

-#define AT91C_TWI_UNRE        ((unsigned int) 0x1 <<  7) // (TWI) Underrun Error

-#define AT91C_TWI_NACK        ((unsigned int) 0x1 <<  8) // (TWI) Not Acknowledged

-// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- 

-// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- 

-// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface

-// *****************************************************************************

-typedef struct _AT91S_PWMC_CH {

-	AT91_REG	 PWMC_CMR; 	// Channel Mode Register

-	AT91_REG	 PWMC_CDTYR; 	// Channel Duty Cycle Register

-	AT91_REG	 PWMC_CPRDR; 	// Channel Period Register

-	AT91_REG	 PWMC_CCNTR; 	// Channel Counter Register

-	AT91_REG	 PWMC_CUPDR; 	// Channel Update Register

-	AT91_REG	 PWMC_Reserved[3]; 	// Reserved

-} AT91S_PWMC_CH, *AT91PS_PWMC_CH;

-

-// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- 

-#define AT91C_PWMC_CPRE       ((unsigned int) 0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx

-#define 	AT91C_PWMC_CPRE_MCK                  ((unsigned int) 0x0) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKA                 ((unsigned int) 0xB) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKB                 ((unsigned int) 0xC) // (PWMC_CH) 

-#define AT91C_PWMC_CALG       ((unsigned int) 0x1 <<  8) // (PWMC_CH) Channel Alignment

-#define AT91C_PWMC_CPOL       ((unsigned int) 0x1 <<  9) // (PWMC_CH) Channel Polarity

-#define AT91C_PWMC_CPD        ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period

-// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- 

-#define AT91C_PWMC_CDTY       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Duty Cycle

-// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- 

-#define AT91C_PWMC_CPRD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Period

-// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- 

-#define AT91C_PWMC_CCNT       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Counter

-// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- 

-#define AT91C_PWMC_CUPD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Update

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface

-// *****************************************************************************

-typedef struct _AT91S_PWMC {

-	AT91_REG	 PWMC_MR; 	// PWMC Mode Register

-	AT91_REG	 PWMC_ENA; 	// PWMC Enable Register

-	AT91_REG	 PWMC_DIS; 	// PWMC Disable Register

-	AT91_REG	 PWMC_SR; 	// PWMC Status Register

-	AT91_REG	 PWMC_IER; 	// PWMC Interrupt Enable Register

-	AT91_REG	 PWMC_IDR; 	// PWMC Interrupt Disable Register

-	AT91_REG	 PWMC_IMR; 	// PWMC Interrupt Mask Register

-	AT91_REG	 PWMC_ISR; 	// PWMC Interrupt Status Register

-	AT91_REG	 Reserved0[55]; 	// 

-	AT91_REG	 PWMC_VR; 	// PWMC Version Register

-	AT91_REG	 Reserved1[64]; 	// 

-	AT91S_PWMC_CH	 PWMC_CH[4]; 	// PWMC Channel

-} AT91S_PWMC, *AT91PS_PWMC;

-

-// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- 

-#define AT91C_PWMC_DIVA       ((unsigned int) 0xFF <<  0) // (PWMC) CLKA divide factor.

-#define AT91C_PWMC_PREA       ((unsigned int) 0xF <<  8) // (PWMC) Divider Input Clock Prescaler A

-#define 	AT91C_PWMC_PREA_MCK                  ((unsigned int) 0x0 <<  8) // (PWMC) 

-#define AT91C_PWMC_DIVB       ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor.

-#define AT91C_PWMC_PREB       ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B

-#define 	AT91C_PWMC_PREB_MCK                  ((unsigned int) 0x0 << 24) // (PWMC) 

-// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- 

-#define AT91C_PWMC_CHID0      ((unsigned int) 0x1 <<  0) // (PWMC) Channel ID 0

-#define AT91C_PWMC_CHID1      ((unsigned int) 0x1 <<  1) // (PWMC) Channel ID 1

-#define AT91C_PWMC_CHID2      ((unsigned int) 0x1 <<  2) // (PWMC) Channel ID 2

-#define AT91C_PWMC_CHID3      ((unsigned int) 0x1 <<  3) // (PWMC) Channel ID 3

-// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- 

-// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- 

-// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- 

-// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- 

-// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- 

-// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR USB Device Interface

-// *****************************************************************************

-typedef struct _AT91S_UDP {

-	AT91_REG	 UDP_NUM; 	// Frame Number Register

-	AT91_REG	 UDP_GLBSTATE; 	// Global State Register

-	AT91_REG	 UDP_FADDR; 	// Function Address Register

-	AT91_REG	 Reserved0[1]; 	// 

-	AT91_REG	 UDP_IER; 	// Interrupt Enable Register

-	AT91_REG	 UDP_IDR; 	// Interrupt Disable Register

-	AT91_REG	 UDP_IMR; 	// Interrupt Mask Register

-	AT91_REG	 UDP_ISR; 	// Interrupt Status Register

-	AT91_REG	 UDP_ICR; 	// Interrupt Clear Register

-	AT91_REG	 Reserved1[1]; 	// 

-	AT91_REG	 UDP_RSTEP; 	// Reset Endpoint Register

-	AT91_REG	 Reserved2[1]; 	// 

-	AT91_REG	 UDP_CSR[6]; 	// Endpoint Control and Status Register

-	AT91_REG	 Reserved3[2]; 	// 

-	AT91_REG	 UDP_FDR[6]; 	// Endpoint FIFO Data Register

-	AT91_REG	 Reserved4[3]; 	// 

-	AT91_REG	 UDP_TXVC; 	// Transceiver Control Register

-} AT91S_UDP, *AT91PS_UDP;

-

-// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- 

-#define AT91C_UDP_FRM_NUM     ((unsigned int) 0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats

-#define AT91C_UDP_FRM_ERR     ((unsigned int) 0x1 << 16) // (UDP) Frame Error

-#define AT91C_UDP_FRM_OK      ((unsigned int) 0x1 << 17) // (UDP) Frame OK

-// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- 

-#define AT91C_UDP_FADDEN      ((unsigned int) 0x1 <<  0) // (UDP) Function Address Enable

-#define AT91C_UDP_CONFG       ((unsigned int) 0x1 <<  1) // (UDP) Configured

-#define AT91C_UDP_ESR         ((unsigned int) 0x1 <<  2) // (UDP) Enable Send Resume

-#define AT91C_UDP_RSMINPR     ((unsigned int) 0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host

-#define AT91C_UDP_RMWUPE      ((unsigned int) 0x1 <<  4) // (UDP) Remote Wake Up Enable

-// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- 

-#define AT91C_UDP_FADD        ((unsigned int) 0xFF <<  0) // (UDP) Function Address Value

-#define AT91C_UDP_FEN         ((unsigned int) 0x1 <<  8) // (UDP) Function Enable

-// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- 

-#define AT91C_UDP_EPINT0      ((unsigned int) 0x1 <<  0) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT1      ((unsigned int) 0x1 <<  1) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT2      ((unsigned int) 0x1 <<  2) // (UDP) Endpoint 2 Interrupt

-#define AT91C_UDP_EPINT3      ((unsigned int) 0x1 <<  3) // (UDP) Endpoint 3 Interrupt

-#define AT91C_UDP_EPINT4      ((unsigned int) 0x1 <<  4) // (UDP) Endpoint 4 Interrupt

-#define AT91C_UDP_EPINT5      ((unsigned int) 0x1 <<  5) // (UDP) Endpoint 5 Interrupt

-#define AT91C_UDP_RXSUSP      ((unsigned int) 0x1 <<  8) // (UDP) USB Suspend Interrupt

-#define AT91C_UDP_RXRSM       ((unsigned int) 0x1 <<  9) // (UDP) USB Resume Interrupt

-#define AT91C_UDP_EXTRSM      ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt

-#define AT91C_UDP_SOFINT      ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt

-#define AT91C_UDP_WAKEUP      ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt

-// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- 

-// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- 

-// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- 

-#define AT91C_UDP_ENDBUSRES   ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt

-// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- 

-// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- 

-#define AT91C_UDP_EP0         ((unsigned int) 0x1 <<  0) // (UDP) Reset Endpoint 0

-#define AT91C_UDP_EP1         ((unsigned int) 0x1 <<  1) // (UDP) Reset Endpoint 1

-#define AT91C_UDP_EP2         ((unsigned int) 0x1 <<  2) // (UDP) Reset Endpoint 2

-#define AT91C_UDP_EP3         ((unsigned int) 0x1 <<  3) // (UDP) Reset Endpoint 3

-#define AT91C_UDP_EP4         ((unsigned int) 0x1 <<  4) // (UDP) Reset Endpoint 4

-#define AT91C_UDP_EP5         ((unsigned int) 0x1 <<  5) // (UDP) Reset Endpoint 5

-// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- 

-#define AT91C_UDP_TXCOMP      ((unsigned int) 0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR

-#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 <<  1) // (UDP) Receive Data Bank 0

-#define AT91C_UDP_RXSETUP     ((unsigned int) 0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)

-#define AT91C_UDP_ISOERROR    ((unsigned int) 0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)

-#define AT91C_UDP_TXPKTRDY    ((unsigned int) 0x1 <<  4) // (UDP) Transmit Packet Ready

-#define AT91C_UDP_FORCESTALL  ((unsigned int) 0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).

-#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).

-#define AT91C_UDP_DIR         ((unsigned int) 0x1 <<  7) // (UDP) Transfer Direction

-#define AT91C_UDP_EPTYPE      ((unsigned int) 0x7 <<  8) // (UDP) Endpoint type

-#define 	AT91C_UDP_EPTYPE_CTRL                 ((unsigned int) 0x0 <<  8) // (UDP) Control

-#define 	AT91C_UDP_EPTYPE_ISO_OUT              ((unsigned int) 0x1 <<  8) // (UDP) Isochronous OUT

-#define 	AT91C_UDP_EPTYPE_BULK_OUT             ((unsigned int) 0x2 <<  8) // (UDP) Bulk OUT

-#define 	AT91C_UDP_EPTYPE_INT_OUT              ((unsigned int) 0x3 <<  8) // (UDP) Interrupt OUT

-#define 	AT91C_UDP_EPTYPE_ISO_IN               ((unsigned int) 0x5 <<  8) // (UDP) Isochronous IN

-#define 	AT91C_UDP_EPTYPE_BULK_IN              ((unsigned int) 0x6 <<  8) // (UDP) Bulk IN

-#define 	AT91C_UDP_EPTYPE_INT_IN               ((unsigned int) 0x7 <<  8) // (UDP) Interrupt IN

-#define AT91C_UDP_DTGLE       ((unsigned int) 0x1 << 11) // (UDP) Data Toggle

-#define AT91C_UDP_EPEDS       ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable

-#define AT91C_UDP_RXBYTECNT   ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO

-// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- 

-#define AT91C_UDP_TXVDIS      ((unsigned int) 0x1 <<  8) // (UDP) 

-#define AT91C_UDP_PUON        ((unsigned int) 0x1 <<  9) // (UDP) Pull-up ON

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface

-// *****************************************************************************

-typedef struct _AT91S_TC {

-	AT91_REG	 TC_CCR; 	// Channel Control Register

-	AT91_REG	 TC_CMR; 	// Channel Mode Register (Capture Mode / Waveform Mode)

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 TC_CV; 	// Counter Value

-	AT91_REG	 TC_RA; 	// Register A

-	AT91_REG	 TC_RB; 	// Register B

-	AT91_REG	 TC_RC; 	// Register C

-	AT91_REG	 TC_SR; 	// Status Register

-	AT91_REG	 TC_IER; 	// Interrupt Enable Register

-	AT91_REG	 TC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 TC_IMR; 	// Interrupt Mask Register

-} AT91S_TC, *AT91PS_TC;

-

-// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- 

-#define AT91C_TC_CLKEN        ((unsigned int) 0x1 <<  0) // (TC) Counter Clock Enable Command

-#define AT91C_TC_CLKDIS       ((unsigned int) 0x1 <<  1) // (TC) Counter Clock Disable Command

-#define AT91C_TC_SWTRG        ((unsigned int) 0x1 <<  2) // (TC) Software Trigger Command

-// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- 

-#define AT91C_TC_CLKS         ((unsigned int) 0x7 <<  0) // (TC) Clock Selection

-#define 	AT91C_TC_CLKS_TIMER_DIV1_CLOCK     ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV2_CLOCK     ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV3_CLOCK     ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV4_CLOCK     ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV5_CLOCK     ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK

-#define 	AT91C_TC_CLKS_XC0                  ((unsigned int) 0x5) // (TC) Clock selected: XC0

-#define 	AT91C_TC_CLKS_XC1                  ((unsigned int) 0x6) // (TC) Clock selected: XC1

-#define 	AT91C_TC_CLKS_XC2                  ((unsigned int) 0x7) // (TC) Clock selected: XC2

-#define AT91C_TC_CLKI         ((unsigned int) 0x1 <<  3) // (TC) Clock Invert

-#define AT91C_TC_BURST        ((unsigned int) 0x3 <<  4) // (TC) Burst Signal Selection

-#define 	AT91C_TC_BURST_NONE                 ((unsigned int) 0x0 <<  4) // (TC) The clock is not gated by an external signal

-#define 	AT91C_TC_BURST_XC0                  ((unsigned int) 0x1 <<  4) // (TC) XC0 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC1                  ((unsigned int) 0x2 <<  4) // (TC) XC1 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC2                  ((unsigned int) 0x3 <<  4) // (TC) XC2 is ANDed with the selected clock

-#define AT91C_TC_CPCSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare

-#define AT91C_TC_LDBSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading

-#define AT91C_TC_CPCDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disable with RC Compare

-#define AT91C_TC_LDBDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading

-#define AT91C_TC_ETRGEDG      ((unsigned int) 0x3 <<  8) // (TC) External Trigger Edge Selection

-#define 	AT91C_TC_ETRGEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_ETRGEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_ETRGEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_ETRGEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_EEVTEDG      ((unsigned int) 0x3 <<  8) // (TC) External Event Edge Selection

-#define 	AT91C_TC_EEVTEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_EEVTEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_EEVTEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_EEVTEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_EEVT         ((unsigned int) 0x3 << 10) // (TC) External Event  Selection

-#define 	AT91C_TC_EEVT_TIOB                 ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input

-#define 	AT91C_TC_EEVT_XC0                  ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output

-#define 	AT91C_TC_EEVT_XC1                  ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output

-#define 	AT91C_TC_EEVT_XC2                  ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output

-#define AT91C_TC_ABETRG       ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection

-#define AT91C_TC_ENETRG       ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable

-#define AT91C_TC_WAVESEL      ((unsigned int) 0x3 << 13) // (TC) Waveform  Selection

-#define 	AT91C_TC_WAVESEL_UP                   ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN               ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UP_AUTO              ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN_AUTO          ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare

-#define AT91C_TC_CPCTRG       ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable

-#define AT91C_TC_WAVE         ((unsigned int) 0x1 << 15) // (TC) 

-#define AT91C_TC_ACPA         ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA

-#define 	AT91C_TC_ACPA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Effect: none

-#define 	AT91C_TC_ACPA_SET                  ((unsigned int) 0x1 << 16) // (TC) Effect: set

-#define 	AT91C_TC_ACPA_CLEAR                ((unsigned int) 0x2 << 16) // (TC) Effect: clear

-#define 	AT91C_TC_ACPA_TOGGLE               ((unsigned int) 0x3 << 16) // (TC) Effect: toggle

-#define AT91C_TC_LDRA         ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection

-#define 	AT91C_TC_LDRA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Edge: None

-#define 	AT91C_TC_LDRA_RISING               ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRA_FALLING              ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRA_BOTH                 ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_ACPC         ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA

-#define 	AT91C_TC_ACPC_NONE                 ((unsigned int) 0x0 << 18) // (TC) Effect: none

-#define 	AT91C_TC_ACPC_SET                  ((unsigned int) 0x1 << 18) // (TC) Effect: set

-#define 	AT91C_TC_ACPC_CLEAR                ((unsigned int) 0x2 << 18) // (TC) Effect: clear

-#define 	AT91C_TC_ACPC_TOGGLE               ((unsigned int) 0x3 << 18) // (TC) Effect: toggle

-#define AT91C_TC_LDRB         ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection

-#define 	AT91C_TC_LDRB_NONE                 ((unsigned int) 0x0 << 18) // (TC) Edge: None

-#define 	AT91C_TC_LDRB_RISING               ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRB_FALLING              ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRB_BOTH                 ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_AEEVT        ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA

-#define 	AT91C_TC_AEEVT_NONE                 ((unsigned int) 0x0 << 20) // (TC) Effect: none

-#define 	AT91C_TC_AEEVT_SET                  ((unsigned int) 0x1 << 20) // (TC) Effect: set

-#define 	AT91C_TC_AEEVT_CLEAR                ((unsigned int) 0x2 << 20) // (TC) Effect: clear

-#define 	AT91C_TC_AEEVT_TOGGLE               ((unsigned int) 0x3 << 20) // (TC) Effect: toggle

-#define AT91C_TC_ASWTRG       ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA

-#define 	AT91C_TC_ASWTRG_NONE                 ((unsigned int) 0x0 << 22) // (TC) Effect: none

-#define 	AT91C_TC_ASWTRG_SET                  ((unsigned int) 0x1 << 22) // (TC) Effect: set

-#define 	AT91C_TC_ASWTRG_CLEAR                ((unsigned int) 0x2 << 22) // (TC) Effect: clear

-#define 	AT91C_TC_ASWTRG_TOGGLE               ((unsigned int) 0x3 << 22) // (TC) Effect: toggle

-#define AT91C_TC_BCPB         ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB

-#define 	AT91C_TC_BCPB_NONE                 ((unsigned int) 0x0 << 24) // (TC) Effect: none

-#define 	AT91C_TC_BCPB_SET                  ((unsigned int) 0x1 << 24) // (TC) Effect: set

-#define 	AT91C_TC_BCPB_CLEAR                ((unsigned int) 0x2 << 24) // (TC) Effect: clear

-#define 	AT91C_TC_BCPB_TOGGLE               ((unsigned int) 0x3 << 24) // (TC) Effect: toggle

-#define AT91C_TC_BCPC         ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB

-#define 	AT91C_TC_BCPC_NONE                 ((unsigned int) 0x0 << 26) // (TC) Effect: none

-#define 	AT91C_TC_BCPC_SET                  ((unsigned int) 0x1 << 26) // (TC) Effect: set

-#define 	AT91C_TC_BCPC_CLEAR                ((unsigned int) 0x2 << 26) // (TC) Effect: clear

-#define 	AT91C_TC_BCPC_TOGGLE               ((unsigned int) 0x3 << 26) // (TC) Effect: toggle

-#define AT91C_TC_BEEVT        ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB

-#define 	AT91C_TC_BEEVT_NONE                 ((unsigned int) 0x0 << 28) // (TC) Effect: none

-#define 	AT91C_TC_BEEVT_SET                  ((unsigned int) 0x1 << 28) // (TC) Effect: set

-#define 	AT91C_TC_BEEVT_CLEAR                ((unsigned int) 0x2 << 28) // (TC) Effect: clear

-#define 	AT91C_TC_BEEVT_TOGGLE               ((unsigned int) 0x3 << 28) // (TC) Effect: toggle

-#define AT91C_TC_BSWTRG       ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB

-#define 	AT91C_TC_BSWTRG_NONE                 ((unsigned int) 0x0 << 30) // (TC) Effect: none

-#define 	AT91C_TC_BSWTRG_SET                  ((unsigned int) 0x1 << 30) // (TC) Effect: set

-#define 	AT91C_TC_BSWTRG_CLEAR                ((unsigned int) 0x2 << 30) // (TC) Effect: clear

-#define 	AT91C_TC_BSWTRG_TOGGLE               ((unsigned int) 0x3 << 30) // (TC) Effect: toggle

-// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- 

-#define AT91C_TC_COVFS        ((unsigned int) 0x1 <<  0) // (TC) Counter Overflow

-#define AT91C_TC_LOVRS        ((unsigned int) 0x1 <<  1) // (TC) Load Overrun

-#define AT91C_TC_CPAS         ((unsigned int) 0x1 <<  2) // (TC) RA Compare

-#define AT91C_TC_CPBS         ((unsigned int) 0x1 <<  3) // (TC) RB Compare

-#define AT91C_TC_CPCS         ((unsigned int) 0x1 <<  4) // (TC) RC Compare

-#define AT91C_TC_LDRAS        ((unsigned int) 0x1 <<  5) // (TC) RA Loading

-#define AT91C_TC_LDRBS        ((unsigned int) 0x1 <<  6) // (TC) RB Loading

-#define AT91C_TC_ETRGS        ((unsigned int) 0x1 <<  7) // (TC) External Trigger

-#define AT91C_TC_CLKSTA       ((unsigned int) 0x1 << 16) // (TC) Clock Enabling

-#define AT91C_TC_MTIOA        ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror

-#define AT91C_TC_MTIOB        ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror

-// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- 

-// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- 

-// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Interface

-// *****************************************************************************

-typedef struct _AT91S_TCB {

-	AT91S_TC	 TCB_TC0; 	// TC Channel 0

-	AT91_REG	 Reserved0[4]; 	// 

-	AT91S_TC	 TCB_TC1; 	// TC Channel 1

-	AT91_REG	 Reserved1[4]; 	// 

-	AT91S_TC	 TCB_TC2; 	// TC Channel 2

-	AT91_REG	 Reserved2[4]; 	// 

-	AT91_REG	 TCB_BCR; 	// TC Block Control Register

-	AT91_REG	 TCB_BMR; 	// TC Block Mode Register

-} AT91S_TCB, *AT91PS_TCB;

-

-// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- 

-#define AT91C_TCB_SYNC        ((unsigned int) 0x1 <<  0) // (TCB) Synchro Command

-// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- 

-#define AT91C_TCB_TC0XC0S     ((unsigned int) 0x3 <<  0) // (TCB) External Clock Signal 0 Selection

-#define 	AT91C_TCB_TC0XC0S_TCLK0                ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_NONE                 ((unsigned int) 0x1) // (TCB) None signal connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA1                ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA2                ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0

-#define AT91C_TCB_TC1XC1S     ((unsigned int) 0x3 <<  2) // (TCB) External Clock Signal 1 Selection

-#define 	AT91C_TCB_TC1XC1S_TCLK1                ((unsigned int) 0x0 <<  2) // (TCB) TCLK1 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_NONE                 ((unsigned int) 0x1 <<  2) // (TCB) None signal connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA0                ((unsigned int) 0x2 <<  2) // (TCB) TIOA0 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA2                ((unsigned int) 0x3 <<  2) // (TCB) TIOA2 connected to XC1

-#define AT91C_TCB_TC2XC2S     ((unsigned int) 0x3 <<  4) // (TCB) External Clock Signal 2 Selection

-#define 	AT91C_TCB_TC2XC2S_TCLK2                ((unsigned int) 0x0 <<  4) // (TCB) TCLK2 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_NONE                 ((unsigned int) 0x1 <<  4) // (TCB) None signal connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA0                ((unsigned int) 0x2 <<  4) // (TCB) TIOA0 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA1                ((unsigned int) 0x3 <<  4) // (TCB) TIOA2 connected to XC2

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Control Area Network MailBox Interface

-// *****************************************************************************

-typedef struct _AT91S_CAN_MB {

-	AT91_REG	 CAN_MB_MMR; 	// MailBox Mode Register

-	AT91_REG	 CAN_MB_MAM; 	// MailBox Acceptance Mask Register

-	AT91_REG	 CAN_MB_MID; 	// MailBox ID Register

-	AT91_REG	 CAN_MB_MFID; 	// MailBox Family ID Register

-	AT91_REG	 CAN_MB_MSR; 	// MailBox Status Register

-	AT91_REG	 CAN_MB_MDL; 	// MailBox Data Low Register

-	AT91_REG	 CAN_MB_MDH; 	// MailBox Data High Register

-	AT91_REG	 CAN_MB_MCR; 	// MailBox Control Register

-} AT91S_CAN_MB, *AT91PS_CAN_MB;

-

-// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- 

-#define AT91C_CAN_MTIMEMARK   ((unsigned int) 0xFFFF <<  0) // (CAN_MB) Mailbox Timemark

-#define AT91C_CAN_PRIOR       ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority

-#define AT91C_CAN_MOT         ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type

-#define 	AT91C_CAN_MOT_DIS                  ((unsigned int) 0x0 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_RX                   ((unsigned int) 0x1 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_RXOVERWRITE          ((unsigned int) 0x2 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_TX                   ((unsigned int) 0x3 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_CONSUMER             ((unsigned int) 0x4 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_PRODUCER             ((unsigned int) 0x5 << 24) // (CAN_MB) 

-// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- 

-#define AT91C_CAN_MIDvB       ((unsigned int) 0x3FFFF <<  0) // (CAN_MB) Complementary bits for identifier in extended mode

-#define AT91C_CAN_MIDvA       ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode

-#define AT91C_CAN_MIDE        ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version

-// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- 

-// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- 

-// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- 

-#define AT91C_CAN_MTIMESTAMP  ((unsigned int) 0xFFFF <<  0) // (CAN_MB) Timer Value

-#define AT91C_CAN_MDLC        ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code

-#define AT91C_CAN_MRTR        ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request

-#define AT91C_CAN_MABT        ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort

-#define AT91C_CAN_MRDY        ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready

-#define AT91C_CAN_MMI         ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored

-// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- 

-// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- 

-// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- 

-#define AT91C_CAN_MACR        ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox

-#define AT91C_CAN_MTCR        ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Control Area Network Interface

-// *****************************************************************************

-typedef struct _AT91S_CAN {

-	AT91_REG	 CAN_MR; 	// Mode Register

-	AT91_REG	 CAN_IER; 	// Interrupt Enable Register

-	AT91_REG	 CAN_IDR; 	// Interrupt Disable Register

-	AT91_REG	 CAN_IMR; 	// Interrupt Mask Register

-	AT91_REG	 CAN_SR; 	// Status Register

-	AT91_REG	 CAN_BR; 	// Baudrate Register

-	AT91_REG	 CAN_TIM; 	// Timer Register

-	AT91_REG	 CAN_TIMESTP; 	// Time Stamp Register

-	AT91_REG	 CAN_ECR; 	// Error Counter Register

-	AT91_REG	 CAN_TCR; 	// Transfer Command Register

-	AT91_REG	 CAN_ACR; 	// Abort Command Register

-	AT91_REG	 Reserved0[52]; 	// 

-	AT91_REG	 CAN_VR; 	// Version Register

-	AT91_REG	 Reserved1[64]; 	// 

-	AT91S_CAN_MB	 CAN_MB0; 	// CAN Mailbox 0

-	AT91S_CAN_MB	 CAN_MB1; 	// CAN Mailbox 1

-	AT91S_CAN_MB	 CAN_MB2; 	// CAN Mailbox 2

-	AT91S_CAN_MB	 CAN_MB3; 	// CAN Mailbox 3

-	AT91S_CAN_MB	 CAN_MB4; 	// CAN Mailbox 4

-	AT91S_CAN_MB	 CAN_MB5; 	// CAN Mailbox 5

-	AT91S_CAN_MB	 CAN_MB6; 	// CAN Mailbox 6

-	AT91S_CAN_MB	 CAN_MB7; 	// CAN Mailbox 7

-	AT91S_CAN_MB	 CAN_MB8; 	// CAN Mailbox 8

-	AT91S_CAN_MB	 CAN_MB9; 	// CAN Mailbox 9

-	AT91S_CAN_MB	 CAN_MB10; 	// CAN Mailbox 10

-	AT91S_CAN_MB	 CAN_MB11; 	// CAN Mailbox 11

-	AT91S_CAN_MB	 CAN_MB12; 	// CAN Mailbox 12

-	AT91S_CAN_MB	 CAN_MB13; 	// CAN Mailbox 13

-	AT91S_CAN_MB	 CAN_MB14; 	// CAN Mailbox 14

-	AT91S_CAN_MB	 CAN_MB15; 	// CAN Mailbox 15

-} AT91S_CAN, *AT91PS_CAN;

-

-// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- 

-#define AT91C_CAN_CANEN       ((unsigned int) 0x1 <<  0) // (CAN) CAN Controller Enable

-#define AT91C_CAN_LPM         ((unsigned int) 0x1 <<  1) // (CAN) Disable/Enable Low Power Mode

-#define AT91C_CAN_ABM         ((unsigned int) 0x1 <<  2) // (CAN) Disable/Enable Autobaud/Listen Mode

-#define AT91C_CAN_OVL         ((unsigned int) 0x1 <<  3) // (CAN) Disable/Enable Overload Frame

-#define AT91C_CAN_TEOF        ((unsigned int) 0x1 <<  4) // (CAN) Time Stamp messages at each end of Frame

-#define AT91C_CAN_TTM         ((unsigned int) 0x1 <<  5) // (CAN) Disable/Enable Time Trigger Mode

-#define AT91C_CAN_TIMFRZ      ((unsigned int) 0x1 <<  6) // (CAN) Enable Timer Freeze

-#define AT91C_CAN_DRPT        ((unsigned int) 0x1 <<  7) // (CAN) Disable Repeat

-// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- 

-#define AT91C_CAN_MB0         ((unsigned int) 0x1 <<  0) // (CAN) Mailbox 0 Flag

-#define AT91C_CAN_MB1         ((unsigned int) 0x1 <<  1) // (CAN) Mailbox 1 Flag

-#define AT91C_CAN_MB2         ((unsigned int) 0x1 <<  2) // (CAN) Mailbox 2 Flag

-#define AT91C_CAN_MB3         ((unsigned int) 0x1 <<  3) // (CAN) Mailbox 3 Flag

-#define AT91C_CAN_MB4         ((unsigned int) 0x1 <<  4) // (CAN) Mailbox 4 Flag

-#define AT91C_CAN_MB5         ((unsigned int) 0x1 <<  5) // (CAN) Mailbox 5 Flag

-#define AT91C_CAN_MB6         ((unsigned int) 0x1 <<  6) // (CAN) Mailbox 6 Flag

-#define AT91C_CAN_MB7         ((unsigned int) 0x1 <<  7) // (CAN) Mailbox 7 Flag

-#define AT91C_CAN_MB8         ((unsigned int) 0x1 <<  8) // (CAN) Mailbox 8 Flag

-#define AT91C_CAN_MB9         ((unsigned int) 0x1 <<  9) // (CAN) Mailbox 9 Flag

-#define AT91C_CAN_MB10        ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag

-#define AT91C_CAN_MB11        ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag

-#define AT91C_CAN_MB12        ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag

-#define AT91C_CAN_MB13        ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag

-#define AT91C_CAN_MB14        ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag

-#define AT91C_CAN_MB15        ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag

-#define AT91C_CAN_ERRA        ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag

-#define AT91C_CAN_WARN        ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag

-#define AT91C_CAN_ERRP        ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag

-#define AT91C_CAN_BOFF        ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag

-#define AT91C_CAN_SLEEP       ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag

-#define AT91C_CAN_WAKEUP      ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag

-#define AT91C_CAN_TOVF        ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag

-#define AT91C_CAN_TSTP        ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag

-#define AT91C_CAN_CERR        ((unsigned int) 0x1 << 24) // (CAN) CRC Error

-#define AT91C_CAN_SERR        ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error

-#define AT91C_CAN_AERR        ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error

-#define AT91C_CAN_FERR        ((unsigned int) 0x1 << 27) // (CAN) Form Error

-#define AT91C_CAN_BERR        ((unsigned int) 0x1 << 28) // (CAN) Bit Error

-// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- 

-// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- 

-// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- 

-#define AT91C_CAN_RBSY        ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy

-#define AT91C_CAN_TBSY        ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy

-#define AT91C_CAN_OVLY        ((unsigned int) 0x1 << 31) // (CAN) Overload Busy

-// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- 

-#define AT91C_CAN_PHASE2      ((unsigned int) 0x7 <<  0) // (CAN) Phase 2 segment

-#define AT91C_CAN_PHASE1      ((unsigned int) 0x7 <<  4) // (CAN) Phase 1 segment

-#define AT91C_CAN_PROPAG      ((unsigned int) 0x7 <<  8) // (CAN) Programmation time segment

-#define AT91C_CAN_SYNC        ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment

-#define AT91C_CAN_BRP         ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler

-#define AT91C_CAN_SMP         ((unsigned int) 0x1 << 24) // (CAN) Sampling mode

-// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- 

-#define AT91C_CAN_TIMER       ((unsigned int) 0xFFFF <<  0) // (CAN) Timer field

-// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- 

-// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- 

-#define AT91C_CAN_REC         ((unsigned int) 0xFF <<  0) // (CAN) Receive Error Counter

-#define AT91C_CAN_TEC         ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter

-// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- 

-#define AT91C_CAN_TIMRST      ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field

-// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Ethernet MAC 10/100

-// *****************************************************************************

-typedef struct _AT91S_EMAC {

-	AT91_REG	 EMAC_NCR; 	// Network Control Register

-	AT91_REG	 EMAC_NCFGR; 	// Network Configuration Register

-	AT91_REG	 EMAC_NSR; 	// Network Status Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 EMAC_TSR; 	// Transmit Status Register

-	AT91_REG	 EMAC_RBQP; 	// Receive Buffer Queue Pointer

-	AT91_REG	 EMAC_TBQP; 	// Transmit Buffer Queue Pointer

-	AT91_REG	 EMAC_RSR; 	// Receive Status Register

-	AT91_REG	 EMAC_ISR; 	// Interrupt Status Register

-	AT91_REG	 EMAC_IER; 	// Interrupt Enable Register

-	AT91_REG	 EMAC_IDR; 	// Interrupt Disable Register

-	AT91_REG	 EMAC_IMR; 	// Interrupt Mask Register

-	AT91_REG	 EMAC_MAN; 	// PHY Maintenance Register

-	AT91_REG	 EMAC_PTR; 	// Pause Time Register

-	AT91_REG	 EMAC_PFR; 	// Pause Frames received Register

-	AT91_REG	 EMAC_FTO; 	// Frames Transmitted OK Register

-	AT91_REG	 EMAC_SCF; 	// Single Collision Frame Register

-	AT91_REG	 EMAC_MCF; 	// Multiple Collision Frame Register

-	AT91_REG	 EMAC_FRO; 	// Frames Received OK Register

-	AT91_REG	 EMAC_FCSE; 	// Frame Check Sequence Error Register

-	AT91_REG	 EMAC_ALE; 	// Alignment Error Register

-	AT91_REG	 EMAC_DTF; 	// Deferred Transmission Frame Register

-	AT91_REG	 EMAC_LCOL; 	// Late Collision Register

-	AT91_REG	 EMAC_ECOL; 	// Excessive Collision Register

-	AT91_REG	 EMAC_TUND; 	// Transmit Underrun Error Register

-	AT91_REG	 EMAC_CSE; 	// Carrier Sense Error Register

-	AT91_REG	 EMAC_RRE; 	// Receive Ressource Error Register

-	AT91_REG	 EMAC_ROV; 	// Receive Overrun Errors Register

-	AT91_REG	 EMAC_RSE; 	// Receive Symbol Errors Register

-	AT91_REG	 EMAC_ELE; 	// Excessive Length Errors Register

-	AT91_REG	 EMAC_RJA; 	// Receive Jabbers Register

-	AT91_REG	 EMAC_USF; 	// Undersize Frames Register

-	AT91_REG	 EMAC_STE; 	// SQE Test Error Register

-	AT91_REG	 EMAC_RLE; 	// Receive Length Field Mismatch Register

-	AT91_REG	 EMAC_TPF; 	// Transmitted Pause Frames Register

-	AT91_REG	 EMAC_HRB; 	// Hash Address Bottom[31:0]

-	AT91_REG	 EMAC_HRT; 	// Hash Address Top[63:32]

-	AT91_REG	 EMAC_SA1L; 	// Specific Address 1 Bottom, First 4 bytes

-	AT91_REG	 EMAC_SA1H; 	// Specific Address 1 Top, Last 2 bytes

-	AT91_REG	 EMAC_SA2L; 	// Specific Address 2 Bottom, First 4 bytes

-	AT91_REG	 EMAC_SA2H; 	// Specific Address 2 Top, Last 2 bytes

-	AT91_REG	 EMAC_SA3L; 	// Specific Address 3 Bottom, First 4 bytes

-	AT91_REG	 EMAC_SA3H; 	// Specific Address 3 Top, Last 2 bytes

-	AT91_REG	 EMAC_SA4L; 	// Specific Address 4 Bottom, First 4 bytes

-	AT91_REG	 EMAC_SA4H; 	// Specific Address 4 Top, Last 2 bytes

-	AT91_REG	 EMAC_TID; 	// Type ID Checking Register

-	AT91_REG	 EMAC_TPQ; 	// Transmit Pause Quantum Register

-	AT91_REG	 EMAC_USRIO; 	// USER Input/Output Register

-	AT91_REG	 EMAC_WOL; 	// Wake On LAN Register

-	AT91_REG	 Reserved1[13]; 	// 

-	AT91_REG	 EMAC_REV; 	// Revision Register

-} AT91S_EMAC, *AT91PS_EMAC;

-

-// -------- EMAC_NCR : (EMAC Offset: 0x0)  -------- 

-#define AT91C_EMAC_LB         ((unsigned int) 0x1 <<  0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level.

-#define AT91C_EMAC_LLB        ((unsigned int) 0x1 <<  1) // (EMAC) Loopback local. 

-#define AT91C_EMAC_RE         ((unsigned int) 0x1 <<  2) // (EMAC) Receive enable. 

-#define AT91C_EMAC_TE         ((unsigned int) 0x1 <<  3) // (EMAC) Transmit enable. 

-#define AT91C_EMAC_MPE        ((unsigned int) 0x1 <<  4) // (EMAC) Management port enable. 

-#define AT91C_EMAC_CLRSTAT    ((unsigned int) 0x1 <<  5) // (EMAC) Clear statistics registers. 

-#define AT91C_EMAC_INCSTAT    ((unsigned int) 0x1 <<  6) // (EMAC) Increment statistics registers. 

-#define AT91C_EMAC_WESTAT     ((unsigned int) 0x1 <<  7) // (EMAC) Write enable for statistics registers. 

-#define AT91C_EMAC_BP         ((unsigned int) 0x1 <<  8) // (EMAC) Back pressure. 

-#define AT91C_EMAC_TSTART     ((unsigned int) 0x1 <<  9) // (EMAC) Start Transmission. 

-#define AT91C_EMAC_THALT      ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt. 

-#define AT91C_EMAC_TPFR       ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame 

-#define AT91C_EMAC_TZQ        ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame

-// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- 

-#define AT91C_EMAC_SPD        ((unsigned int) 0x1 <<  0) // (EMAC) Speed. 

-#define AT91C_EMAC_FD         ((unsigned int) 0x1 <<  1) // (EMAC) Full duplex. 

-#define AT91C_EMAC_JFRAME     ((unsigned int) 0x1 <<  3) // (EMAC) Jumbo Frames. 

-#define AT91C_EMAC_CAF        ((unsigned int) 0x1 <<  4) // (EMAC) Copy all frames. 

-#define AT91C_EMAC_NBC        ((unsigned int) 0x1 <<  5) // (EMAC) No broadcast. 

-#define AT91C_EMAC_MTI        ((unsigned int) 0x1 <<  6) // (EMAC) Multicast hash event enable

-#define AT91C_EMAC_UNI        ((unsigned int) 0x1 <<  7) // (EMAC) Unicast hash enable. 

-#define AT91C_EMAC_BIG        ((unsigned int) 0x1 <<  8) // (EMAC) Receive 1522 bytes. 

-#define AT91C_EMAC_EAE        ((unsigned int) 0x1 <<  9) // (EMAC) External address match enable. 

-#define AT91C_EMAC_CLK        ((unsigned int) 0x3 << 10) // (EMAC) 

-#define 	AT91C_EMAC_CLK_HCLK_8               ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8

-#define 	AT91C_EMAC_CLK_HCLK_16              ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16

-#define 	AT91C_EMAC_CLK_HCLK_32              ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32

-#define 	AT91C_EMAC_CLK_HCLK_64              ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64

-#define AT91C_EMAC_RTY        ((unsigned int) 0x1 << 12) // (EMAC) 

-#define AT91C_EMAC_PAE        ((unsigned int) 0x1 << 13) // (EMAC) 

-#define AT91C_EMAC_RBOF       ((unsigned int) 0x3 << 14) // (EMAC) 

-#define 	AT91C_EMAC_RBOF_OFFSET_0             ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_1             ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_2             ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_3             ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer

-#define AT91C_EMAC_RLCE       ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable

-#define AT91C_EMAC_DRFCS      ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS

-#define AT91C_EMAC_EFRHD      ((unsigned int) 0x1 << 18) // (EMAC) 

-#define AT91C_EMAC_IRXFCS     ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS

-// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- 

-#define AT91C_EMAC_LINKR      ((unsigned int) 0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_MDIO       ((unsigned int) 0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_IDLE       ((unsigned int) 0x1 <<  2) // (EMAC) 

-// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- 

-#define AT91C_EMAC_UBR        ((unsigned int) 0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_COL        ((unsigned int) 0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_RLES       ((unsigned int) 0x1 <<  2) // (EMAC) 

-#define AT91C_EMAC_TGO        ((unsigned int) 0x1 <<  3) // (EMAC) Transmit Go

-#define AT91C_EMAC_BEX        ((unsigned int) 0x1 <<  4) // (EMAC) Buffers exhausted mid frame

-#define AT91C_EMAC_COMP       ((unsigned int) 0x1 <<  5) // (EMAC) 

-#define AT91C_EMAC_UND        ((unsigned int) 0x1 <<  6) // (EMAC) 

-// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- 

-#define AT91C_EMAC_BNA        ((unsigned int) 0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_REC        ((unsigned int) 0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_OVR        ((unsigned int) 0x1 <<  2) // (EMAC) 

-// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- 

-#define AT91C_EMAC_MFD        ((unsigned int) 0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_RCOMP      ((unsigned int) 0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_RXUBR      ((unsigned int) 0x1 <<  2) // (EMAC) 

-#define AT91C_EMAC_TXUBR      ((unsigned int) 0x1 <<  3) // (EMAC) 

-#define AT91C_EMAC_TUNDR      ((unsigned int) 0x1 <<  4) // (EMAC) 

-#define AT91C_EMAC_RLEX       ((unsigned int) 0x1 <<  5) // (EMAC) 

-#define AT91C_EMAC_TXERR      ((unsigned int) 0x1 <<  6) // (EMAC) 

-#define AT91C_EMAC_TCOMP      ((unsigned int) 0x1 <<  7) // (EMAC) 

-#define AT91C_EMAC_LINK       ((unsigned int) 0x1 <<  9) // (EMAC) 

-#define AT91C_EMAC_ROVR       ((unsigned int) 0x1 << 10) // (EMAC) 

-#define AT91C_EMAC_HRESP      ((unsigned int) 0x1 << 11) // (EMAC) 

-#define AT91C_EMAC_PFRE       ((unsigned int) 0x1 << 12) // (EMAC) 

-#define AT91C_EMAC_PTZ        ((unsigned int) 0x1 << 13) // (EMAC) 

-// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- 

-// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- 

-// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- 

-// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- 

-#define AT91C_EMAC_DATA       ((unsigned int) 0xFFFF <<  0) // (EMAC) 

-#define AT91C_EMAC_CODE       ((unsigned int) 0x3 << 16) // (EMAC) 

-#define AT91C_EMAC_REGA       ((unsigned int) 0x1F << 18) // (EMAC) 

-#define AT91C_EMAC_PHYA       ((unsigned int) 0x1F << 23) // (EMAC) 

-#define AT91C_EMAC_RW         ((unsigned int) 0x3 << 28) // (EMAC) 

-#define AT91C_EMAC_SOF        ((unsigned int) 0x3 << 30) // (EMAC) 

-// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- 

-#define AT91C_EMAC_RMII       ((unsigned int) 0x1 <<  0) // (EMAC) Reduce MII

-// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- 

-#define AT91C_EMAC_IP         ((unsigned int) 0xFFFF <<  0) // (EMAC) ARP request IP address

-#define AT91C_EMAC_MAG        ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable

-#define AT91C_EMAC_ARP        ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable

-#define AT91C_EMAC_SA1        ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable

-// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- 

-#define AT91C_EMAC_REVREF     ((unsigned int) 0xFFFF <<  0) // (EMAC) 

-#define AT91C_EMAC_PARTREF    ((unsigned int) 0xFFFF << 16) // (EMAC) 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor

-// *****************************************************************************

-typedef struct _AT91S_ADC {

-	AT91_REG	 ADC_CR; 	// ADC Control Register

-	AT91_REG	 ADC_MR; 	// ADC Mode Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 ADC_CHER; 	// ADC Channel Enable Register

-	AT91_REG	 ADC_CHDR; 	// ADC Channel Disable Register

-	AT91_REG	 ADC_CHSR; 	// ADC Channel Status Register

-	AT91_REG	 ADC_SR; 	// ADC Status Register

-	AT91_REG	 ADC_LCDR; 	// ADC Last Converted Data Register

-	AT91_REG	 ADC_IER; 	// ADC Interrupt Enable Register

-	AT91_REG	 ADC_IDR; 	// ADC Interrupt Disable Register

-	AT91_REG	 ADC_IMR; 	// ADC Interrupt Mask Register

-	AT91_REG	 ADC_CDR0; 	// ADC Channel Data Register 0

-	AT91_REG	 ADC_CDR1; 	// ADC Channel Data Register 1

-	AT91_REG	 ADC_CDR2; 	// ADC Channel Data Register 2

-	AT91_REG	 ADC_CDR3; 	// ADC Channel Data Register 3

-	AT91_REG	 ADC_CDR4; 	// ADC Channel Data Register 4

-	AT91_REG	 ADC_CDR5; 	// ADC Channel Data Register 5

-	AT91_REG	 ADC_CDR6; 	// ADC Channel Data Register 6

-	AT91_REG	 ADC_CDR7; 	// ADC Channel Data Register 7

-	AT91_REG	 Reserved1[44]; 	// 

-	AT91_REG	 ADC_RPR; 	// Receive Pointer Register

-	AT91_REG	 ADC_RCR; 	// Receive Counter Register

-	AT91_REG	 ADC_TPR; 	// Transmit Pointer Register

-	AT91_REG	 ADC_TCR; 	// Transmit Counter Register

-	AT91_REG	 ADC_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 ADC_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 ADC_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 ADC_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 ADC_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 ADC_PTSR; 	// PDC Transfer Status Register

-} AT91S_ADC, *AT91PS_ADC;

-

-// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- 

-#define AT91C_ADC_SWRST       ((unsigned int) 0x1 <<  0) // (ADC) Software Reset

-#define AT91C_ADC_START       ((unsigned int) 0x1 <<  1) // (ADC) Start Conversion

-// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- 

-#define AT91C_ADC_TRGEN       ((unsigned int) 0x1 <<  0) // (ADC) Trigger Enable

-#define 	AT91C_ADC_TRGEN_DIS                  ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software

-#define 	AT91C_ADC_TRGEN_EN                   ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.

-#define AT91C_ADC_TRGSEL      ((unsigned int) 0x7 <<  1) // (ADC) Trigger Selection

-#define 	AT91C_ADC_TRGSEL_TIOA0                ((unsigned int) 0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0

-#define 	AT91C_ADC_TRGSEL_TIOA1                ((unsigned int) 0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1

-#define 	AT91C_ADC_TRGSEL_TIOA2                ((unsigned int) 0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2

-#define 	AT91C_ADC_TRGSEL_TIOA3                ((unsigned int) 0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3

-#define 	AT91C_ADC_TRGSEL_TIOA4                ((unsigned int) 0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4

-#define 	AT91C_ADC_TRGSEL_TIOA5                ((unsigned int) 0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5

-#define 	AT91C_ADC_TRGSEL_EXT                  ((unsigned int) 0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger

-#define AT91C_ADC_LOWRES      ((unsigned int) 0x1 <<  4) // (ADC) Resolution.

-#define 	AT91C_ADC_LOWRES_10_BIT               ((unsigned int) 0x0 <<  4) // (ADC) 10-bit resolution

-#define 	AT91C_ADC_LOWRES_8_BIT                ((unsigned int) 0x1 <<  4) // (ADC) 8-bit resolution

-#define AT91C_ADC_SLEEP       ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode

-#define 	AT91C_ADC_SLEEP_NORMAL_MODE          ((unsigned int) 0x0 <<  5) // (ADC) Normal Mode

-#define 	AT91C_ADC_SLEEP_MODE                 ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode

-#define AT91C_ADC_PRESCAL     ((unsigned int) 0x3F <<  8) // (ADC) Prescaler rate selection

-#define AT91C_ADC_STARTUP     ((unsigned int) 0x1F << 16) // (ADC) Startup Time

-#define AT91C_ADC_SHTIM       ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time

-// -------- 	ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- 

-#define AT91C_ADC_CH0         ((unsigned int) 0x1 <<  0) // (ADC) Channel 0

-#define AT91C_ADC_CH1         ((unsigned int) 0x1 <<  1) // (ADC) Channel 1

-#define AT91C_ADC_CH2         ((unsigned int) 0x1 <<  2) // (ADC) Channel 2

-#define AT91C_ADC_CH3         ((unsigned int) 0x1 <<  3) // (ADC) Channel 3

-#define AT91C_ADC_CH4         ((unsigned int) 0x1 <<  4) // (ADC) Channel 4

-#define AT91C_ADC_CH5         ((unsigned int) 0x1 <<  5) // (ADC) Channel 5

-#define AT91C_ADC_CH6         ((unsigned int) 0x1 <<  6) // (ADC) Channel 6

-#define AT91C_ADC_CH7         ((unsigned int) 0x1 <<  7) // (ADC) Channel 7

-// -------- 	ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- 

-// -------- 	ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- 

-// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- 

-#define AT91C_ADC_EOC0        ((unsigned int) 0x1 <<  0) // (ADC) End of Conversion

-#define AT91C_ADC_EOC1        ((unsigned int) 0x1 <<  1) // (ADC) End of Conversion

-#define AT91C_ADC_EOC2        ((unsigned int) 0x1 <<  2) // (ADC) End of Conversion

-#define AT91C_ADC_EOC3        ((unsigned int) 0x1 <<  3) // (ADC) End of Conversion

-#define AT91C_ADC_EOC4        ((unsigned int) 0x1 <<  4) // (ADC) End of Conversion

-#define AT91C_ADC_EOC5        ((unsigned int) 0x1 <<  5) // (ADC) End of Conversion

-#define AT91C_ADC_EOC6        ((unsigned int) 0x1 <<  6) // (ADC) End of Conversion

-#define AT91C_ADC_EOC7        ((unsigned int) 0x1 <<  7) // (ADC) End of Conversion

-#define AT91C_ADC_OVRE0       ((unsigned int) 0x1 <<  8) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE1       ((unsigned int) 0x1 <<  9) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE2       ((unsigned int) 0x1 << 10) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE3       ((unsigned int) 0x1 << 11) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE4       ((unsigned int) 0x1 << 12) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE5       ((unsigned int) 0x1 << 13) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE6       ((unsigned int) 0x1 << 14) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE7       ((unsigned int) 0x1 << 15) // (ADC) Overrun Error

-#define AT91C_ADC_DRDY        ((unsigned int) 0x1 << 16) // (ADC) Data Ready

-#define AT91C_ADC_GOVRE       ((unsigned int) 0x1 << 17) // (ADC) General Overrun

-#define AT91C_ADC_ENDRX       ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer

-#define AT91C_ADC_RXBUFF      ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt

-// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- 

-#define AT91C_ADC_LDATA       ((unsigned int) 0x3FF <<  0) // (ADC) Last Data Converted

-// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- 

-// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- 

-// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- 

-// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- 

-#define AT91C_ADC_DATA        ((unsigned int) 0x3FF <<  0) // (ADC) Converted Data

-// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- 

-// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- 

-// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- 

-// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- 

-// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- 

-// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- 

-// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Advanced  Encryption Standard

-// *****************************************************************************

-typedef struct _AT91S_AES {

-	AT91_REG	 AES_CR; 	// Control Register

-	AT91_REG	 AES_MR; 	// Mode Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 AES_IER; 	// Interrupt Enable Register

-	AT91_REG	 AES_IDR; 	// Interrupt Disable Register

-	AT91_REG	 AES_IMR; 	// Interrupt Mask Register

-	AT91_REG	 AES_ISR; 	// Interrupt Status Register

-	AT91_REG	 AES_KEYWxR[4]; 	// Key Word x Register

-	AT91_REG	 Reserved1[4]; 	// 

-	AT91_REG	 AES_IDATAxR[4]; 	// Input Data x Register

-	AT91_REG	 AES_ODATAxR[4]; 	// Output Data x Register

-	AT91_REG	 AES_IVxR[4]; 	// Initialization Vector x Register

-	AT91_REG	 Reserved2[35]; 	// 

-	AT91_REG	 AES_VR; 	// AES Version Register

-	AT91_REG	 AES_RPR; 	// Receive Pointer Register

-	AT91_REG	 AES_RCR; 	// Receive Counter Register

-	AT91_REG	 AES_TPR; 	// Transmit Pointer Register

-	AT91_REG	 AES_TCR; 	// Transmit Counter Register

-	AT91_REG	 AES_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 AES_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 AES_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 AES_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 AES_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 AES_PTSR; 	// PDC Transfer Status Register

-} AT91S_AES, *AT91PS_AES;

-

-// -------- AES_CR : (AES Offset: 0x0) Control Register -------- 

-#define AT91C_AES_START       ((unsigned int) 0x1 <<  0) // (AES) Starts Processing

-#define AT91C_AES_SWRST       ((unsigned int) 0x1 <<  8) // (AES) Software Reset

-#define AT91C_AES_LOADSEED    ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading

-// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- 

-#define AT91C_AES_CIPHER      ((unsigned int) 0x1 <<  0) // (AES) Processing Mode

-#define AT91C_AES_PROCDLY     ((unsigned int) 0xF <<  4) // (AES) Processing Delay

-#define AT91C_AES_SMOD        ((unsigned int) 0x3 <<  8) // (AES) Start Mode

-#define 	AT91C_AES_SMOD_MANUAL               ((unsigned int) 0x0 <<  8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption.

-#define 	AT91C_AES_SMOD_AUTO                 ((unsigned int) 0x1 <<  8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet).

-#define 	AT91C_AES_SMOD_PDC                  ((unsigned int) 0x2 <<  8) // (AES) PDC Mode (cf datasheet).

-#define AT91C_AES_OPMOD       ((unsigned int) 0x7 << 12) // (AES) Operation Mode

-#define 	AT91C_AES_OPMOD_ECB                  ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode.

-#define 	AT91C_AES_OPMOD_CBC                  ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode.

-#define 	AT91C_AES_OPMOD_OFB                  ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode.

-#define 	AT91C_AES_OPMOD_CFB                  ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode.

-#define 	AT91C_AES_OPMOD_CTR                  ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode.

-#define AT91C_AES_LOD         ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode

-#define AT91C_AES_CFBS        ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size

-#define 	AT91C_AES_CFBS_128_BIT              ((unsigned int) 0x0 << 16) // (AES) 128-bit.

-#define 	AT91C_AES_CFBS_64_BIT               ((unsigned int) 0x1 << 16) // (AES) 64-bit.

-#define 	AT91C_AES_CFBS_32_BIT               ((unsigned int) 0x2 << 16) // (AES) 32-bit.

-#define 	AT91C_AES_CFBS_16_BIT               ((unsigned int) 0x3 << 16) // (AES) 16-bit.

-#define 	AT91C_AES_CFBS_8_BIT                ((unsigned int) 0x4 << 16) // (AES) 8-bit.

-#define AT91C_AES_CKEY        ((unsigned int) 0xF << 20) // (AES) Countermeasure Key

-#define AT91C_AES_CTYPE       ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type

-#define 	AT91C_AES_CTYPE_TYPE1_EN             ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE2_EN             ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE3_EN             ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE4_EN             ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE5_EN             ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled.

-// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- 

-#define AT91C_AES_DATRDY      ((unsigned int) 0x1 <<  0) // (AES) DATRDY

-#define AT91C_AES_ENDRX       ((unsigned int) 0x1 <<  1) // (AES) PDC Read Buffer End

-#define AT91C_AES_ENDTX       ((unsigned int) 0x1 <<  2) // (AES) PDC Write Buffer End

-#define AT91C_AES_RXBUFF      ((unsigned int) 0x1 <<  3) // (AES) PDC Read Buffer Full

-#define AT91C_AES_TXBUFE      ((unsigned int) 0x1 <<  4) // (AES) PDC Write Buffer Empty

-#define AT91C_AES_URAD        ((unsigned int) 0x1 <<  8) // (AES) Unspecified Register Access Detection

-// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- 

-// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- 

-// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- 

-#define AT91C_AES_URAT        ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status

-#define 	AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode.

-#define 	AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing.

-#define 	AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing.

-#define 	AT91C_AES_URAT_OUT_DAT_READ_SUBKEY  ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation.

-#define 	AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation.

-#define 	AT91C_AES_URAT_WO_REG_READ          ((unsigned int) 0x5 << 12) // (AES) Write-only register read access.

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Triple Data Encryption Standard

-// *****************************************************************************

-typedef struct _AT91S_TDES {

-	AT91_REG	 TDES_CR; 	// Control Register

-	AT91_REG	 TDES_MR; 	// Mode Register

-	AT91_REG	 Reserved0[2]; 	// 

-	AT91_REG	 TDES_IER; 	// Interrupt Enable Register

-	AT91_REG	 TDES_IDR; 	// Interrupt Disable Register

-	AT91_REG	 TDES_IMR; 	// Interrupt Mask Register

-	AT91_REG	 TDES_ISR; 	// Interrupt Status Register

-	AT91_REG	 TDES_KEY1WxR[2]; 	// Key 1 Word x Register

-	AT91_REG	 TDES_KEY2WxR[2]; 	// Key 2 Word x Register

-	AT91_REG	 TDES_KEY3WxR[2]; 	// Key 3 Word x Register

-	AT91_REG	 Reserved1[2]; 	// 

-	AT91_REG	 TDES_IDATAxR[2]; 	// Input Data x Register

-	AT91_REG	 Reserved2[2]; 	// 

-	AT91_REG	 TDES_ODATAxR[2]; 	// Output Data x Register

-	AT91_REG	 Reserved3[2]; 	// 

-	AT91_REG	 TDES_IVxR[2]; 	// Initialization Vector x Register

-	AT91_REG	 Reserved4[37]; 	// 

-	AT91_REG	 TDES_VR; 	// TDES Version Register

-	AT91_REG	 TDES_RPR; 	// Receive Pointer Register

-	AT91_REG	 TDES_RCR; 	// Receive Counter Register

-	AT91_REG	 TDES_TPR; 	// Transmit Pointer Register

-	AT91_REG	 TDES_TCR; 	// Transmit Counter Register

-	AT91_REG	 TDES_RNPR; 	// Receive Next Pointer Register

-	AT91_REG	 TDES_RNCR; 	// Receive Next Counter Register

-	AT91_REG	 TDES_TNPR; 	// Transmit Next Pointer Register

-	AT91_REG	 TDES_TNCR; 	// Transmit Next Counter Register

-	AT91_REG	 TDES_PTCR; 	// PDC Transfer Control Register

-	AT91_REG	 TDES_PTSR; 	// PDC Transfer Status Register

-} AT91S_TDES, *AT91PS_TDES;

-

-// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- 

-#define AT91C_TDES_START      ((unsigned int) 0x1 <<  0) // (TDES) Starts Processing

-#define AT91C_TDES_SWRST      ((unsigned int) 0x1 <<  8) // (TDES) Software Reset

-// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- 

-#define AT91C_TDES_CIPHER     ((unsigned int) 0x1 <<  0) // (TDES) Processing Mode

-#define AT91C_TDES_TDESMOD    ((unsigned int) 0x1 <<  1) // (TDES) Single or Triple DES Mode

-#define AT91C_TDES_KEYMOD     ((unsigned int) 0x1 <<  4) // (TDES) Key Mode

-#define AT91C_TDES_SMOD       ((unsigned int) 0x3 <<  8) // (TDES) Start Mode

-#define 	AT91C_TDES_SMOD_MANUAL               ((unsigned int) 0x0 <<  8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption.

-#define 	AT91C_TDES_SMOD_AUTO                 ((unsigned int) 0x1 <<  8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet).

-#define 	AT91C_TDES_SMOD_PDC                  ((unsigned int) 0x2 <<  8) // (TDES) PDC Mode (cf datasheet).

-#define AT91C_TDES_OPMOD      ((unsigned int) 0x3 << 12) // (TDES) Operation Mode

-#define 	AT91C_TDES_OPMOD_ECB                  ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode.

-#define 	AT91C_TDES_OPMOD_CBC                  ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode.

-#define 	AT91C_TDES_OPMOD_OFB                  ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode.

-#define 	AT91C_TDES_OPMOD_CFB                  ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode.

-#define AT91C_TDES_LOD        ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode

-#define AT91C_TDES_CFBS       ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size

-#define 	AT91C_TDES_CFBS_64_BIT               ((unsigned int) 0x0 << 16) // (TDES) 64-bit.

-#define 	AT91C_TDES_CFBS_32_BIT               ((unsigned int) 0x1 << 16) // (TDES) 32-bit.

-#define 	AT91C_TDES_CFBS_16_BIT               ((unsigned int) 0x2 << 16) // (TDES) 16-bit.

-#define 	AT91C_TDES_CFBS_8_BIT                ((unsigned int) 0x3 << 16) // (TDES) 8-bit.

-// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- 

-#define AT91C_TDES_DATRDY     ((unsigned int) 0x1 <<  0) // (TDES) DATRDY

-#define AT91C_TDES_ENDRX      ((unsigned int) 0x1 <<  1) // (TDES) PDC Read Buffer End

-#define AT91C_TDES_ENDTX      ((unsigned int) 0x1 <<  2) // (TDES) PDC Write Buffer End

-#define AT91C_TDES_RXBUFF     ((unsigned int) 0x1 <<  3) // (TDES) PDC Read Buffer Full

-#define AT91C_TDES_TXBUFE     ((unsigned int) 0x1 <<  4) // (TDES) PDC Write Buffer Empty

-#define AT91C_TDES_URAD       ((unsigned int) 0x1 <<  8) // (TDES) Unspecified Register Access Detection

-// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- 

-// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- 

-// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- 

-#define AT91C_TDES_URAT       ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status

-#define 	AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode.

-#define 	AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing.

-#define 	AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing.

-#define 	AT91C_TDES_URAT_WO_REG_READ          ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access.

-

-// *****************************************************************************

-//               REGISTER ADDRESS DEFINITION FOR AT91SAM7X256

-// *****************************************************************************

-// ========== Register definition for SYS peripheral ========== 

-// ========== Register definition for AIC peripheral ========== 

-#define AT91C_AIC_IVR   ((AT91_REG *) 	0xFFFFF100) // (AIC) IRQ Vector Register

-#define AT91C_AIC_SMR   ((AT91_REG *) 	0xFFFFF000) // (AIC) Source Mode Register

-#define AT91C_AIC_FVR   ((AT91_REG *) 	0xFFFFF104) // (AIC) FIQ Vector Register

-#define AT91C_AIC_DCR   ((AT91_REG *) 	0xFFFFF138) // (AIC) Debug Control Register (Protect)

-#define AT91C_AIC_EOICR ((AT91_REG *) 	0xFFFFF130) // (AIC) End of Interrupt Command Register

-#define AT91C_AIC_SVR   ((AT91_REG *) 	0xFFFFF080) // (AIC) Source Vector Register

-#define AT91C_AIC_FFSR  ((AT91_REG *) 	0xFFFFF148) // (AIC) Fast Forcing Status Register

-#define AT91C_AIC_ICCR  ((AT91_REG *) 	0xFFFFF128) // (AIC) Interrupt Clear Command Register

-#define AT91C_AIC_ISR   ((AT91_REG *) 	0xFFFFF108) // (AIC) Interrupt Status Register

-#define AT91C_AIC_IMR   ((AT91_REG *) 	0xFFFFF110) // (AIC) Interrupt Mask Register

-#define AT91C_AIC_IPR   ((AT91_REG *) 	0xFFFFF10C) // (AIC) Interrupt Pending Register

-#define AT91C_AIC_FFER  ((AT91_REG *) 	0xFFFFF140) // (AIC) Fast Forcing Enable Register

-#define AT91C_AIC_IECR  ((AT91_REG *) 	0xFFFFF120) // (AIC) Interrupt Enable Command Register

-#define AT91C_AIC_ISCR  ((AT91_REG *) 	0xFFFFF12C) // (AIC) Interrupt Set Command Register

-#define AT91C_AIC_FFDR  ((AT91_REG *) 	0xFFFFF144) // (AIC) Fast Forcing Disable Register

-#define AT91C_AIC_CISR  ((AT91_REG *) 	0xFFFFF114) // (AIC) Core Interrupt Status Register

-#define AT91C_AIC_IDCR  ((AT91_REG *) 	0xFFFFF124) // (AIC) Interrupt Disable Command Register

-#define AT91C_AIC_SPU   ((AT91_REG *) 	0xFFFFF134) // (AIC) Spurious Vector Register

-// ========== Register definition for PDC_DBGU peripheral ========== 

-#define AT91C_DBGU_TCR  ((AT91_REG *) 	0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register

-#define AT91C_DBGU_RNPR ((AT91_REG *) 	0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register

-#define AT91C_DBGU_TNPR ((AT91_REG *) 	0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register

-#define AT91C_DBGU_TPR  ((AT91_REG *) 	0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register

-#define AT91C_DBGU_RPR  ((AT91_REG *) 	0xFFFFF300) // (PDC_DBGU) Receive Pointer Register

-#define AT91C_DBGU_RCR  ((AT91_REG *) 	0xFFFFF304) // (PDC_DBGU) Receive Counter Register

-#define AT91C_DBGU_RNCR ((AT91_REG *) 	0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register

-#define AT91C_DBGU_PTCR ((AT91_REG *) 	0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register

-#define AT91C_DBGU_PTSR ((AT91_REG *) 	0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register

-#define AT91C_DBGU_TNCR ((AT91_REG *) 	0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register

-// ========== Register definition for DBGU peripheral ========== 

-#define AT91C_DBGU_EXID ((AT91_REG *) 	0xFFFFF244) // (DBGU) Chip ID Extension Register

-#define AT91C_DBGU_BRGR ((AT91_REG *) 	0xFFFFF220) // (DBGU) Baud Rate Generator Register

-#define AT91C_DBGU_IDR  ((AT91_REG *) 	0xFFFFF20C) // (DBGU) Interrupt Disable Register

-#define AT91C_DBGU_CSR  ((AT91_REG *) 	0xFFFFF214) // (DBGU) Channel Status Register

-#define AT91C_DBGU_CIDR ((AT91_REG *) 	0xFFFFF240) // (DBGU) Chip ID Register

-#define AT91C_DBGU_MR   ((AT91_REG *) 	0xFFFFF204) // (DBGU) Mode Register

-#define AT91C_DBGU_IMR  ((AT91_REG *) 	0xFFFFF210) // (DBGU) Interrupt Mask Register

-#define AT91C_DBGU_CR   ((AT91_REG *) 	0xFFFFF200) // (DBGU) Control Register

-#define AT91C_DBGU_FNTR ((AT91_REG *) 	0xFFFFF248) // (DBGU) Force NTRST Register

-#define AT91C_DBGU_THR  ((AT91_REG *) 	0xFFFFF21C) // (DBGU) Transmitter Holding Register

-#define AT91C_DBGU_RHR  ((AT91_REG *) 	0xFFFFF218) // (DBGU) Receiver Holding Register

-#define AT91C_DBGU_IER  ((AT91_REG *) 	0xFFFFF208) // (DBGU) Interrupt Enable Register

-// ========== Register definition for PIOA peripheral ========== 

-#define AT91C_PIOA_ODR  ((AT91_REG *) 	0xFFFFF414) // (PIOA) Output Disable Registerr

-#define AT91C_PIOA_SODR ((AT91_REG *) 	0xFFFFF430) // (PIOA) Set Output Data Register

-#define AT91C_PIOA_ISR  ((AT91_REG *) 	0xFFFFF44C) // (PIOA) Interrupt Status Register

-#define AT91C_PIOA_ABSR ((AT91_REG *) 	0xFFFFF478) // (PIOA) AB Select Status Register

-#define AT91C_PIOA_IER  ((AT91_REG *) 	0xFFFFF440) // (PIOA) Interrupt Enable Register

-#define AT91C_PIOA_PPUDR ((AT91_REG *) 	0xFFFFF460) // (PIOA) Pull-up Disable Register

-#define AT91C_PIOA_IMR  ((AT91_REG *) 	0xFFFFF448) // (PIOA) Interrupt Mask Register

-#define AT91C_PIOA_PER  ((AT91_REG *) 	0xFFFFF400) // (PIOA) PIO Enable Register

-#define AT91C_PIOA_IFDR ((AT91_REG *) 	0xFFFFF424) // (PIOA) Input Filter Disable Register

-#define AT91C_PIOA_OWDR ((AT91_REG *) 	0xFFFFF4A4) // (PIOA) Output Write Disable Register

-#define AT91C_PIOA_MDSR ((AT91_REG *) 	0xFFFFF458) // (PIOA) Multi-driver Status Register

-#define AT91C_PIOA_IDR  ((AT91_REG *) 	0xFFFFF444) // (PIOA) Interrupt Disable Register

-#define AT91C_PIOA_ODSR ((AT91_REG *) 	0xFFFFF438) // (PIOA) Output Data Status Register

-#define AT91C_PIOA_PPUSR ((AT91_REG *) 	0xFFFFF468) // (PIOA) Pull-up Status Register

-#define AT91C_PIOA_OWSR ((AT91_REG *) 	0xFFFFF4A8) // (PIOA) Output Write Status Register

-#define AT91C_PIOA_BSR  ((AT91_REG *) 	0xFFFFF474) // (PIOA) Select B Register

-#define AT91C_PIOA_OWER ((AT91_REG *) 	0xFFFFF4A0) // (PIOA) Output Write Enable Register

-#define AT91C_PIOA_IFER ((AT91_REG *) 	0xFFFFF420) // (PIOA) Input Filter Enable Register

-#define AT91C_PIOA_PDSR ((AT91_REG *) 	0xFFFFF43C) // (PIOA) Pin Data Status Register

-#define AT91C_PIOA_PPUER ((AT91_REG *) 	0xFFFFF464) // (PIOA) Pull-up Enable Register

-#define AT91C_PIOA_OSR  ((AT91_REG *) 	0xFFFFF418) // (PIOA) Output Status Register

-#define AT91C_PIOA_ASR  ((AT91_REG *) 	0xFFFFF470) // (PIOA) Select A Register

-#define AT91C_PIOA_MDDR ((AT91_REG *) 	0xFFFFF454) // (PIOA) Multi-driver Disable Register

-#define AT91C_PIOA_CODR ((AT91_REG *) 	0xFFFFF434) // (PIOA) Clear Output Data Register

-#define AT91C_PIOA_MDER ((AT91_REG *) 	0xFFFFF450) // (PIOA) Multi-driver Enable Register

-#define AT91C_PIOA_PDR  ((AT91_REG *) 	0xFFFFF404) // (PIOA) PIO Disable Register

-#define AT91C_PIOA_IFSR ((AT91_REG *) 	0xFFFFF428) // (PIOA) Input Filter Status Register

-#define AT91C_PIOA_OER  ((AT91_REG *) 	0xFFFFF410) // (PIOA) Output Enable Register

-#define AT91C_PIOA_PSR  ((AT91_REG *) 	0xFFFFF408) // (PIOA) PIO Status Register

-// ========== Register definition for PIOB peripheral ========== 

-#define AT91C_PIOB_OWDR ((AT91_REG *) 	0xFFFFF6A4) // (PIOB) Output Write Disable Register

-#define AT91C_PIOB_MDER ((AT91_REG *) 	0xFFFFF650) // (PIOB) Multi-driver Enable Register

-#define AT91C_PIOB_PPUSR ((AT91_REG *) 	0xFFFFF668) // (PIOB) Pull-up Status Register

-#define AT91C_PIOB_IMR  ((AT91_REG *) 	0xFFFFF648) // (PIOB) Interrupt Mask Register

-#define AT91C_PIOB_ASR  ((AT91_REG *) 	0xFFFFF670) // (PIOB) Select A Register

-#define AT91C_PIOB_PPUDR ((AT91_REG *) 	0xFFFFF660) // (PIOB) Pull-up Disable Register

-#define AT91C_PIOB_PSR  ((AT91_REG *) 	0xFFFFF608) // (PIOB) PIO Status Register

-#define AT91C_PIOB_IER  ((AT91_REG *) 	0xFFFFF640) // (PIOB) Interrupt Enable Register

-#define AT91C_PIOB_CODR ((AT91_REG *) 	0xFFFFF634) // (PIOB) Clear Output Data Register

-#define AT91C_PIOB_OWER ((AT91_REG *) 	0xFFFFF6A0) // (PIOB) Output Write Enable Register

-#define AT91C_PIOB_ABSR ((AT91_REG *) 	0xFFFFF678) // (PIOB) AB Select Status Register

-#define AT91C_PIOB_IFDR ((AT91_REG *) 	0xFFFFF624) // (PIOB) Input Filter Disable Register

-#define AT91C_PIOB_PDSR ((AT91_REG *) 	0xFFFFF63C) // (PIOB) Pin Data Status Register

-#define AT91C_PIOB_IDR  ((AT91_REG *) 	0xFFFFF644) // (PIOB) Interrupt Disable Register

-#define AT91C_PIOB_OWSR ((AT91_REG *) 	0xFFFFF6A8) // (PIOB) Output Write Status Register

-#define AT91C_PIOB_PDR  ((AT91_REG *) 	0xFFFFF604) // (PIOB) PIO Disable Register

-#define AT91C_PIOB_ODR  ((AT91_REG *) 	0xFFFFF614) // (PIOB) Output Disable Registerr

-#define AT91C_PIOB_IFSR ((AT91_REG *) 	0xFFFFF628) // (PIOB) Input Filter Status Register

-#define AT91C_PIOB_PPUER ((AT91_REG *) 	0xFFFFF664) // (PIOB) Pull-up Enable Register

-#define AT91C_PIOB_SODR ((AT91_REG *) 	0xFFFFF630) // (PIOB) Set Output Data Register

-#define AT91C_PIOB_ISR  ((AT91_REG *) 	0xFFFFF64C) // (PIOB) Interrupt Status Register

-#define AT91C_PIOB_ODSR ((AT91_REG *) 	0xFFFFF638) // (PIOB) Output Data Status Register

-#define AT91C_PIOB_OSR  ((AT91_REG *) 	0xFFFFF618) // (PIOB) Output Status Register

-#define AT91C_PIOB_MDSR ((AT91_REG *) 	0xFFFFF658) // (PIOB) Multi-driver Status Register

-#define AT91C_PIOB_IFER ((AT91_REG *) 	0xFFFFF620) // (PIOB) Input Filter Enable Register

-#define AT91C_PIOB_BSR  ((AT91_REG *) 	0xFFFFF674) // (PIOB) Select B Register

-#define AT91C_PIOB_MDDR ((AT91_REG *) 	0xFFFFF654) // (PIOB) Multi-driver Disable Register

-#define AT91C_PIOB_OER  ((AT91_REG *) 	0xFFFFF610) // (PIOB) Output Enable Register

-#define AT91C_PIOB_PER  ((AT91_REG *) 	0xFFFFF600) // (PIOB) PIO Enable Register

-// ========== Register definition for CKGR peripheral ========== 

-#define AT91C_CKGR_MOR  ((AT91_REG *) 	0xFFFFFC20) // (CKGR) Main Oscillator Register

-#define AT91C_CKGR_PLLR ((AT91_REG *) 	0xFFFFFC2C) // (CKGR) PLL Register

-#define AT91C_CKGR_MCFR ((AT91_REG *) 	0xFFFFFC24) // (CKGR) Main Clock  Frequency Register

-// ========== Register definition for PMC peripheral ========== 

-#define AT91C_PMC_IDR   ((AT91_REG *) 	0xFFFFFC64) // (PMC) Interrupt Disable Register

-#define AT91C_PMC_MOR   ((AT91_REG *) 	0xFFFFFC20) // (PMC) Main Oscillator Register

-#define AT91C_PMC_PLLR  ((AT91_REG *) 	0xFFFFFC2C) // (PMC) PLL Register

-#define AT91C_PMC_PCER  ((AT91_REG *) 	0xFFFFFC10) // (PMC) Peripheral Clock Enable Register

-#define AT91C_PMC_PCKR  ((AT91_REG *) 	0xFFFFFC40) // (PMC) Programmable Clock Register

-#define AT91C_PMC_MCKR  ((AT91_REG *) 	0xFFFFFC30) // (PMC) Master Clock Register

-#define AT91C_PMC_SCDR  ((AT91_REG *) 	0xFFFFFC04) // (PMC) System Clock Disable Register

-#define AT91C_PMC_PCDR  ((AT91_REG *) 	0xFFFFFC14) // (PMC) Peripheral Clock Disable Register

-#define AT91C_PMC_SCSR  ((AT91_REG *) 	0xFFFFFC08) // (PMC) System Clock Status Register

-#define AT91C_PMC_PCSR  ((AT91_REG *) 	0xFFFFFC18) // (PMC) Peripheral Clock Status Register

-#define AT91C_PMC_MCFR  ((AT91_REG *) 	0xFFFFFC24) // (PMC) Main Clock  Frequency Register

-#define AT91C_PMC_SCER  ((AT91_REG *) 	0xFFFFFC00) // (PMC) System Clock Enable Register

-#define AT91C_PMC_IMR   ((AT91_REG *) 	0xFFFFFC6C) // (PMC) Interrupt Mask Register

-#define AT91C_PMC_IER   ((AT91_REG *) 	0xFFFFFC60) // (PMC) Interrupt Enable Register

-#define AT91C_PMC_SR    ((AT91_REG *) 	0xFFFFFC68) // (PMC) Status Register

-// ========== Register definition for RSTC peripheral ========== 

-#define AT91C_RSTC_RCR  ((AT91_REG *) 	0xFFFFFD00) // (RSTC) Reset Control Register

-#define AT91C_RSTC_RMR  ((AT91_REG *) 	0xFFFFFD08) // (RSTC) Reset Mode Register

-#define AT91C_RSTC_RSR  ((AT91_REG *) 	0xFFFFFD04) // (RSTC) Reset Status Register

-// ========== Register definition for RTTC peripheral ========== 

-#define AT91C_RTTC_RTSR ((AT91_REG *) 	0xFFFFFD2C) // (RTTC) Real-time Status Register

-#define AT91C_RTTC_RTMR ((AT91_REG *) 	0xFFFFFD20) // (RTTC) Real-time Mode Register

-#define AT91C_RTTC_RTVR ((AT91_REG *) 	0xFFFFFD28) // (RTTC) Real-time Value Register

-#define AT91C_RTTC_RTAR ((AT91_REG *) 	0xFFFFFD24) // (RTTC) Real-time Alarm Register

-// ========== Register definition for PITC peripheral ========== 

-#define AT91C_PITC_PIVR ((AT91_REG *) 	0xFFFFFD38) // (PITC) Period Interval Value Register

-#define AT91C_PITC_PISR ((AT91_REG *) 	0xFFFFFD34) // (PITC) Period Interval Status Register

-#define AT91C_PITC_PIIR ((AT91_REG *) 	0xFFFFFD3C) // (PITC) Period Interval Image Register

-#define AT91C_PITC_PIMR ((AT91_REG *) 	0xFFFFFD30) // (PITC) Period Interval Mode Register

-// ========== Register definition for WDTC peripheral ========== 

-#define AT91C_WDTC_WDCR ((AT91_REG *) 	0xFFFFFD40) // (WDTC) Watchdog Control Register

-#define AT91C_WDTC_WDSR ((AT91_REG *) 	0xFFFFFD48) // (WDTC) Watchdog Status Register

-#define AT91C_WDTC_WDMR ((AT91_REG *) 	0xFFFFFD44) // (WDTC) Watchdog Mode Register

-// ========== Register definition for VREG peripheral ========== 

-#define AT91C_VREG_MR   ((AT91_REG *) 	0xFFFFFD60) // (VREG) Voltage Regulator Mode Register

-// ========== Register definition for MC peripheral ========== 

-#define AT91C_MC_ASR    ((AT91_REG *) 	0xFFFFFF04) // (MC) MC Abort Status Register

-#define AT91C_MC_RCR    ((AT91_REG *) 	0xFFFFFF00) // (MC) MC Remap Control Register

-#define AT91C_MC_FCR    ((AT91_REG *) 	0xFFFFFF64) // (MC) MC Flash Command Register

-#define AT91C_MC_AASR   ((AT91_REG *) 	0xFFFFFF08) // (MC) MC Abort Address Status Register

-#define AT91C_MC_FSR    ((AT91_REG *) 	0xFFFFFF68) // (MC) MC Flash Status Register

-#define AT91C_MC_FMR    ((AT91_REG *) 	0xFFFFFF60) // (MC) MC Flash Mode Register

-// ========== Register definition for PDC_SPI1 peripheral ========== 

-#define AT91C_SPI1_PTCR ((AT91_REG *) 	0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register

-#define AT91C_SPI1_RPR  ((AT91_REG *) 	0xFFFE4100) // (PDC_SPI1) Receive Pointer Register

-#define AT91C_SPI1_TNCR ((AT91_REG *) 	0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register

-#define AT91C_SPI1_TPR  ((AT91_REG *) 	0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register

-#define AT91C_SPI1_TNPR ((AT91_REG *) 	0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register

-#define AT91C_SPI1_TCR  ((AT91_REG *) 	0xFFFE410C) // (PDC_SPI1) Transmit Counter Register

-#define AT91C_SPI1_RCR  ((AT91_REG *) 	0xFFFE4104) // (PDC_SPI1) Receive Counter Register

-#define AT91C_SPI1_RNPR ((AT91_REG *) 	0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register

-#define AT91C_SPI1_RNCR ((AT91_REG *) 	0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register

-#define AT91C_SPI1_PTSR ((AT91_REG *) 	0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register

-// ========== Register definition for SPI1 peripheral ========== 

-#define AT91C_SPI1_IMR  ((AT91_REG *) 	0xFFFE401C) // (SPI1) Interrupt Mask Register

-#define AT91C_SPI1_IER  ((AT91_REG *) 	0xFFFE4014) // (SPI1) Interrupt Enable Register

-#define AT91C_SPI1_MR   ((AT91_REG *) 	0xFFFE4004) // (SPI1) Mode Register

-#define AT91C_SPI1_RDR  ((AT91_REG *) 	0xFFFE4008) // (SPI1) Receive Data Register

-#define AT91C_SPI1_IDR  ((AT91_REG *) 	0xFFFE4018) // (SPI1) Interrupt Disable Register

-#define AT91C_SPI1_SR   ((AT91_REG *) 	0xFFFE4010) // (SPI1) Status Register

-#define AT91C_SPI1_TDR  ((AT91_REG *) 	0xFFFE400C) // (SPI1) Transmit Data Register

-#define AT91C_SPI1_CR   ((AT91_REG *) 	0xFFFE4000) // (SPI1) Control Register

-#define AT91C_SPI1_CSR  ((AT91_REG *) 	0xFFFE4030) // (SPI1) Chip Select Register

-// ========== Register definition for PDC_SPI0 peripheral ========== 

-#define AT91C_SPI0_PTCR ((AT91_REG *) 	0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register

-#define AT91C_SPI0_TPR  ((AT91_REG *) 	0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register

-#define AT91C_SPI0_TCR  ((AT91_REG *) 	0xFFFE010C) // (PDC_SPI0) Transmit Counter Register

-#define AT91C_SPI0_RCR  ((AT91_REG *) 	0xFFFE0104) // (PDC_SPI0) Receive Counter Register

-#define AT91C_SPI0_PTSR ((AT91_REG *) 	0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register

-#define AT91C_SPI0_RNPR ((AT91_REG *) 	0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register

-#define AT91C_SPI0_RPR  ((AT91_REG *) 	0xFFFE0100) // (PDC_SPI0) Receive Pointer Register

-#define AT91C_SPI0_TNCR ((AT91_REG *) 	0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register

-#define AT91C_SPI0_RNCR ((AT91_REG *) 	0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register

-#define AT91C_SPI0_TNPR ((AT91_REG *) 	0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register

-// ========== Register definition for SPI0 peripheral ========== 

-#define AT91C_SPI0_IER  ((AT91_REG *) 	0xFFFE0014) // (SPI0) Interrupt Enable Register

-#define AT91C_SPI0_SR   ((AT91_REG *) 	0xFFFE0010) // (SPI0) Status Register

-#define AT91C_SPI0_IDR  ((AT91_REG *) 	0xFFFE0018) // (SPI0) Interrupt Disable Register

-#define AT91C_SPI0_CR   ((AT91_REG *) 	0xFFFE0000) // (SPI0) Control Register

-#define AT91C_SPI0_MR   ((AT91_REG *) 	0xFFFE0004) // (SPI0) Mode Register

-#define AT91C_SPI0_IMR  ((AT91_REG *) 	0xFFFE001C) // (SPI0) Interrupt Mask Register

-#define AT91C_SPI0_TDR  ((AT91_REG *) 	0xFFFE000C) // (SPI0) Transmit Data Register

-#define AT91C_SPI0_RDR  ((AT91_REG *) 	0xFFFE0008) // (SPI0) Receive Data Register

-#define AT91C_SPI0_CSR  ((AT91_REG *) 	0xFFFE0030) // (SPI0) Chip Select Register

-// ========== Register definition for PDC_US1 peripheral ========== 

-#define AT91C_US1_RNCR  ((AT91_REG *) 	0xFFFC4114) // (PDC_US1) Receive Next Counter Register

-#define AT91C_US1_PTCR  ((AT91_REG *) 	0xFFFC4120) // (PDC_US1) PDC Transfer Control Register

-#define AT91C_US1_TCR   ((AT91_REG *) 	0xFFFC410C) // (PDC_US1) Transmit Counter Register

-#define AT91C_US1_PTSR  ((AT91_REG *) 	0xFFFC4124) // (PDC_US1) PDC Transfer Status Register

-#define AT91C_US1_TNPR  ((AT91_REG *) 	0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register

-#define AT91C_US1_RCR   ((AT91_REG *) 	0xFFFC4104) // (PDC_US1) Receive Counter Register

-#define AT91C_US1_RNPR  ((AT91_REG *) 	0xFFFC4110) // (PDC_US1) Receive Next Pointer Register

-#define AT91C_US1_RPR   ((AT91_REG *) 	0xFFFC4100) // (PDC_US1) Receive Pointer Register

-#define AT91C_US1_TNCR  ((AT91_REG *) 	0xFFFC411C) // (PDC_US1) Transmit Next Counter Register

-#define AT91C_US1_TPR   ((AT91_REG *) 	0xFFFC4108) // (PDC_US1) Transmit Pointer Register

-// ========== Register definition for US1 peripheral ========== 

-#define AT91C_US1_IF    ((AT91_REG *) 	0xFFFC404C) // (US1) IRDA_FILTER Register

-#define AT91C_US1_NER   ((AT91_REG *) 	0xFFFC4044) // (US1) Nb Errors Register

-#define AT91C_US1_RTOR  ((AT91_REG *) 	0xFFFC4024) // (US1) Receiver Time-out Register

-#define AT91C_US1_CSR   ((AT91_REG *) 	0xFFFC4014) // (US1) Channel Status Register

-#define AT91C_US1_IDR   ((AT91_REG *) 	0xFFFC400C) // (US1) Interrupt Disable Register

-#define AT91C_US1_IER   ((AT91_REG *) 	0xFFFC4008) // (US1) Interrupt Enable Register

-#define AT91C_US1_THR   ((AT91_REG *) 	0xFFFC401C) // (US1) Transmitter Holding Register

-#define AT91C_US1_TTGR  ((AT91_REG *) 	0xFFFC4028) // (US1) Transmitter Time-guard Register

-#define AT91C_US1_RHR   ((AT91_REG *) 	0xFFFC4018) // (US1) Receiver Holding Register

-#define AT91C_US1_BRGR  ((AT91_REG *) 	0xFFFC4020) // (US1) Baud Rate Generator Register

-#define AT91C_US1_IMR   ((AT91_REG *) 	0xFFFC4010) // (US1) Interrupt Mask Register

-#define AT91C_US1_FIDI  ((AT91_REG *) 	0xFFFC4040) // (US1) FI_DI_Ratio Register

-#define AT91C_US1_CR    ((AT91_REG *) 	0xFFFC4000) // (US1) Control Register

-#define AT91C_US1_MR    ((AT91_REG *) 	0xFFFC4004) // (US1) Mode Register

-// ========== Register definition for PDC_US0 peripheral ========== 

-#define AT91C_US0_TNPR  ((AT91_REG *) 	0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register

-#define AT91C_US0_RNPR  ((AT91_REG *) 	0xFFFC0110) // (PDC_US0) Receive Next Pointer Register

-#define AT91C_US0_TCR   ((AT91_REG *) 	0xFFFC010C) // (PDC_US0) Transmit Counter Register

-#define AT91C_US0_PTCR  ((AT91_REG *) 	0xFFFC0120) // (PDC_US0) PDC Transfer Control Register

-#define AT91C_US0_PTSR  ((AT91_REG *) 	0xFFFC0124) // (PDC_US0) PDC Transfer Status Register

-#define AT91C_US0_TNCR  ((AT91_REG *) 	0xFFFC011C) // (PDC_US0) Transmit Next Counter Register

-#define AT91C_US0_TPR   ((AT91_REG *) 	0xFFFC0108) // (PDC_US0) Transmit Pointer Register

-#define AT91C_US0_RCR   ((AT91_REG *) 	0xFFFC0104) // (PDC_US0) Receive Counter Register

-#define AT91C_US0_RPR   ((AT91_REG *) 	0xFFFC0100) // (PDC_US0) Receive Pointer Register

-#define AT91C_US0_RNCR  ((AT91_REG *) 	0xFFFC0114) // (PDC_US0) Receive Next Counter Register

-// ========== Register definition for US0 peripheral ========== 

-#define AT91C_US0_BRGR  ((AT91_REG *) 	0xFFFC0020) // (US0) Baud Rate Generator Register

-#define AT91C_US0_NER   ((AT91_REG *) 	0xFFFC0044) // (US0) Nb Errors Register

-#define AT91C_US0_CR    ((AT91_REG *) 	0xFFFC0000) // (US0) Control Register

-#define AT91C_US0_IMR   ((AT91_REG *) 	0xFFFC0010) // (US0) Interrupt Mask Register

-#define AT91C_US0_FIDI  ((AT91_REG *) 	0xFFFC0040) // (US0) FI_DI_Ratio Register

-#define AT91C_US0_TTGR  ((AT91_REG *) 	0xFFFC0028) // (US0) Transmitter Time-guard Register

-#define AT91C_US0_MR    ((AT91_REG *) 	0xFFFC0004) // (US0) Mode Register

-#define AT91C_US0_RTOR  ((AT91_REG *) 	0xFFFC0024) // (US0) Receiver Time-out Register

-#define AT91C_US0_CSR   ((AT91_REG *) 	0xFFFC0014) // (US0) Channel Status Register

-#define AT91C_US0_RHR   ((AT91_REG *) 	0xFFFC0018) // (US0) Receiver Holding Register

-#define AT91C_US0_IDR   ((AT91_REG *) 	0xFFFC000C) // (US0) Interrupt Disable Register

-#define AT91C_US0_THR   ((AT91_REG *) 	0xFFFC001C) // (US0) Transmitter Holding Register

-#define AT91C_US0_IF    ((AT91_REG *) 	0xFFFC004C) // (US0) IRDA_FILTER Register

-#define AT91C_US0_IER   ((AT91_REG *) 	0xFFFC0008) // (US0) Interrupt Enable Register

-// ========== Register definition for PDC_SSC peripheral ========== 

-#define AT91C_SSC_TNCR  ((AT91_REG *) 	0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register

-#define AT91C_SSC_RPR   ((AT91_REG *) 	0xFFFD4100) // (PDC_SSC) Receive Pointer Register

-#define AT91C_SSC_RNCR  ((AT91_REG *) 	0xFFFD4114) // (PDC_SSC) Receive Next Counter Register

-#define AT91C_SSC_TPR   ((AT91_REG *) 	0xFFFD4108) // (PDC_SSC) Transmit Pointer Register

-#define AT91C_SSC_PTCR  ((AT91_REG *) 	0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register

-#define AT91C_SSC_TCR   ((AT91_REG *) 	0xFFFD410C) // (PDC_SSC) Transmit Counter Register

-#define AT91C_SSC_RCR   ((AT91_REG *) 	0xFFFD4104) // (PDC_SSC) Receive Counter Register

-#define AT91C_SSC_RNPR  ((AT91_REG *) 	0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register

-#define AT91C_SSC_TNPR  ((AT91_REG *) 	0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register

-#define AT91C_SSC_PTSR  ((AT91_REG *) 	0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register

-// ========== Register definition for SSC peripheral ========== 

-#define AT91C_SSC_RHR   ((AT91_REG *) 	0xFFFD4020) // (SSC) Receive Holding Register

-#define AT91C_SSC_RSHR  ((AT91_REG *) 	0xFFFD4030) // (SSC) Receive Sync Holding Register

-#define AT91C_SSC_TFMR  ((AT91_REG *) 	0xFFFD401C) // (SSC) Transmit Frame Mode Register

-#define AT91C_SSC_IDR   ((AT91_REG *) 	0xFFFD4048) // (SSC) Interrupt Disable Register

-#define AT91C_SSC_THR   ((AT91_REG *) 	0xFFFD4024) // (SSC) Transmit Holding Register

-#define AT91C_SSC_RCMR  ((AT91_REG *) 	0xFFFD4010) // (SSC) Receive Clock ModeRegister

-#define AT91C_SSC_IER   ((AT91_REG *) 	0xFFFD4044) // (SSC) Interrupt Enable Register

-#define AT91C_SSC_TSHR  ((AT91_REG *) 	0xFFFD4034) // (SSC) Transmit Sync Holding Register

-#define AT91C_SSC_SR    ((AT91_REG *) 	0xFFFD4040) // (SSC) Status Register

-#define AT91C_SSC_CMR   ((AT91_REG *) 	0xFFFD4004) // (SSC) Clock Mode Register

-#define AT91C_SSC_TCMR  ((AT91_REG *) 	0xFFFD4018) // (SSC) Transmit Clock Mode Register

-#define AT91C_SSC_CR    ((AT91_REG *) 	0xFFFD4000) // (SSC) Control Register

-#define AT91C_SSC_IMR   ((AT91_REG *) 	0xFFFD404C) // (SSC) Interrupt Mask Register

-#define AT91C_SSC_RFMR  ((AT91_REG *) 	0xFFFD4014) // (SSC) Receive Frame Mode Register

-// ========== Register definition for TWI peripheral ========== 

-#define AT91C_TWI_IER   ((AT91_REG *) 	0xFFFB8024) // (TWI) Interrupt Enable Register

-#define AT91C_TWI_CR    ((AT91_REG *) 	0xFFFB8000) // (TWI) Control Register

-#define AT91C_TWI_SR    ((AT91_REG *) 	0xFFFB8020) // (TWI) Status Register

-#define AT91C_TWI_IMR   ((AT91_REG *) 	0xFFFB802C) // (TWI) Interrupt Mask Register

-#define AT91C_TWI_THR   ((AT91_REG *) 	0xFFFB8034) // (TWI) Transmit Holding Register

-#define AT91C_TWI_IDR   ((AT91_REG *) 	0xFFFB8028) // (TWI) Interrupt Disable Register

-#define AT91C_TWI_IADR  ((AT91_REG *) 	0xFFFB800C) // (TWI) Internal Address Register

-#define AT91C_TWI_MMR   ((AT91_REG *) 	0xFFFB8004) // (TWI) Master Mode Register

-#define AT91C_TWI_CWGR  ((AT91_REG *) 	0xFFFB8010) // (TWI) Clock Waveform Generator Register

-#define AT91C_TWI_RHR   ((AT91_REG *) 	0xFFFB8030) // (TWI) Receive Holding Register

-// ========== Register definition for PWMC_CH3 peripheral ========== 

-#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 	0xFFFCC270) // (PWMC_CH3) Channel Update Register

-#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 	0xFFFCC274) // (PWMC_CH3) Reserved

-#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 	0xFFFCC268) // (PWMC_CH3) Channel Period Register

-#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 	0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register

-#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 	0xFFFCC26C) // (PWMC_CH3) Channel Counter Register

-#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 	0xFFFCC260) // (PWMC_CH3) Channel Mode Register

-// ========== Register definition for PWMC_CH2 peripheral ========== 

-#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 	0xFFFCC254) // (PWMC_CH2) Reserved

-#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 	0xFFFCC240) // (PWMC_CH2) Channel Mode Register

-#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 	0xFFFCC24C) // (PWMC_CH2) Channel Counter Register

-#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 	0xFFFCC248) // (PWMC_CH2) Channel Period Register

-#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 	0xFFFCC250) // (PWMC_CH2) Channel Update Register

-#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 	0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register

-// ========== Register definition for PWMC_CH1 peripheral ========== 

-#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 	0xFFFCC234) // (PWMC_CH1) Reserved

-#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 	0xFFFCC230) // (PWMC_CH1) Channel Update Register

-#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 	0xFFFCC228) // (PWMC_CH1) Channel Period Register

-#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 	0xFFFCC22C) // (PWMC_CH1) Channel Counter Register

-#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 	0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register

-#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 	0xFFFCC220) // (PWMC_CH1) Channel Mode Register

-// ========== Register definition for PWMC_CH0 peripheral ========== 

-#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 	0xFFFCC214) // (PWMC_CH0) Reserved

-#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 	0xFFFCC208) // (PWMC_CH0) Channel Period Register

-#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 	0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register

-#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 	0xFFFCC200) // (PWMC_CH0) Channel Mode Register

-#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 	0xFFFCC210) // (PWMC_CH0) Channel Update Register

-#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 	0xFFFCC20C) // (PWMC_CH0) Channel Counter Register

-// ========== Register definition for PWMC peripheral ========== 

-#define AT91C_PWMC_IDR  ((AT91_REG *) 	0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register

-#define AT91C_PWMC_DIS  ((AT91_REG *) 	0xFFFCC008) // (PWMC) PWMC Disable Register

-#define AT91C_PWMC_IER  ((AT91_REG *) 	0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register

-#define AT91C_PWMC_VR   ((AT91_REG *) 	0xFFFCC0FC) // (PWMC) PWMC Version Register

-#define AT91C_PWMC_ISR  ((AT91_REG *) 	0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register

-#define AT91C_PWMC_SR   ((AT91_REG *) 	0xFFFCC00C) // (PWMC) PWMC Status Register

-#define AT91C_PWMC_IMR  ((AT91_REG *) 	0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register

-#define AT91C_PWMC_MR   ((AT91_REG *) 	0xFFFCC000) // (PWMC) PWMC Mode Register

-#define AT91C_PWMC_ENA  ((AT91_REG *) 	0xFFFCC004) // (PWMC) PWMC Enable Register

-// ========== Register definition for UDP peripheral ========== 

-#define AT91C_UDP_IMR   ((AT91_REG *) 	0xFFFB0018) // (UDP) Interrupt Mask Register

-#define AT91C_UDP_FADDR ((AT91_REG *) 	0xFFFB0008) // (UDP) Function Address Register

-#define AT91C_UDP_NUM   ((AT91_REG *) 	0xFFFB0000) // (UDP) Frame Number Register

-#define AT91C_UDP_FDR   ((AT91_REG *) 	0xFFFB0050) // (UDP) Endpoint FIFO Data Register

-#define AT91C_UDP_ISR   ((AT91_REG *) 	0xFFFB001C) // (UDP) Interrupt Status Register

-#define AT91C_UDP_CSR   ((AT91_REG *) 	0xFFFB0030) // (UDP) Endpoint Control and Status Register

-#define AT91C_UDP_IDR   ((AT91_REG *) 	0xFFFB0014) // (UDP) Interrupt Disable Register

-#define AT91C_UDP_ICR   ((AT91_REG *) 	0xFFFB0020) // (UDP) Interrupt Clear Register

-#define AT91C_UDP_RSTEP ((AT91_REG *) 	0xFFFB0028) // (UDP) Reset Endpoint Register

-#define AT91C_UDP_TXVC  ((AT91_REG *) 	0xFFFB0074) // (UDP) Transceiver Control Register

-#define AT91C_UDP_GLBSTATE ((AT91_REG *) 	0xFFFB0004) // (UDP) Global State Register

-#define AT91C_UDP_IER   ((AT91_REG *) 	0xFFFB0010) // (UDP) Interrupt Enable Register

-// ========== Register definition for TC0 peripheral ========== 

-#define AT91C_TC0_SR    ((AT91_REG *) 	0xFFFA0020) // (TC0) Status Register

-#define AT91C_TC0_RC    ((AT91_REG *) 	0xFFFA001C) // (TC0) Register C

-#define AT91C_TC0_RB    ((AT91_REG *) 	0xFFFA0018) // (TC0) Register B

-#define AT91C_TC0_CCR   ((AT91_REG *) 	0xFFFA0000) // (TC0) Channel Control Register

-#define AT91C_TC0_CMR   ((AT91_REG *) 	0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC0_IER   ((AT91_REG *) 	0xFFFA0024) // (TC0) Interrupt Enable Register

-#define AT91C_TC0_RA    ((AT91_REG *) 	0xFFFA0014) // (TC0) Register A

-#define AT91C_TC0_IDR   ((AT91_REG *) 	0xFFFA0028) // (TC0) Interrupt Disable Register

-#define AT91C_TC0_CV    ((AT91_REG *) 	0xFFFA0010) // (TC0) Counter Value

-#define AT91C_TC0_IMR   ((AT91_REG *) 	0xFFFA002C) // (TC0) Interrupt Mask Register

-// ========== Register definition for TC1 peripheral ========== 

-#define AT91C_TC1_RB    ((AT91_REG *) 	0xFFFA0058) // (TC1) Register B

-#define AT91C_TC1_CCR   ((AT91_REG *) 	0xFFFA0040) // (TC1) Channel Control Register

-#define AT91C_TC1_IER   ((AT91_REG *) 	0xFFFA0064) // (TC1) Interrupt Enable Register

-#define AT91C_TC1_IDR   ((AT91_REG *) 	0xFFFA0068) // (TC1) Interrupt Disable Register

-#define AT91C_TC1_SR    ((AT91_REG *) 	0xFFFA0060) // (TC1) Status Register

-#define AT91C_TC1_CMR   ((AT91_REG *) 	0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC1_RA    ((AT91_REG *) 	0xFFFA0054) // (TC1) Register A

-#define AT91C_TC1_RC    ((AT91_REG *) 	0xFFFA005C) // (TC1) Register C

-#define AT91C_TC1_IMR   ((AT91_REG *) 	0xFFFA006C) // (TC1) Interrupt Mask Register

-#define AT91C_TC1_CV    ((AT91_REG *) 	0xFFFA0050) // (TC1) Counter Value

-// ========== Register definition for TC2 peripheral ========== 

-#define AT91C_TC2_CMR   ((AT91_REG *) 	0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC2_CCR   ((AT91_REG *) 	0xFFFA0080) // (TC2) Channel Control Register

-#define AT91C_TC2_CV    ((AT91_REG *) 	0xFFFA0090) // (TC2) Counter Value

-#define AT91C_TC2_RA    ((AT91_REG *) 	0xFFFA0094) // (TC2) Register A

-#define AT91C_TC2_RB    ((AT91_REG *) 	0xFFFA0098) // (TC2) Register B

-#define AT91C_TC2_IDR   ((AT91_REG *) 	0xFFFA00A8) // (TC2) Interrupt Disable Register

-#define AT91C_TC2_IMR   ((AT91_REG *) 	0xFFFA00AC) // (TC2) Interrupt Mask Register

-#define AT91C_TC2_RC    ((AT91_REG *) 	0xFFFA009C) // (TC2) Register C

-#define AT91C_TC2_IER   ((AT91_REG *) 	0xFFFA00A4) // (TC2) Interrupt Enable Register

-#define AT91C_TC2_SR    ((AT91_REG *) 	0xFFFA00A0) // (TC2) Status Register

-// ========== Register definition for TCB peripheral ========== 

-#define AT91C_TCB_BMR   ((AT91_REG *) 	0xFFFA00C4) // (TCB) TC Block Mode Register

-#define AT91C_TCB_BCR   ((AT91_REG *) 	0xFFFA00C0) // (TCB) TC Block Control Register

-// ========== Register definition for CAN_MB0 peripheral ========== 

-#define AT91C_CAN_MB0_MDL ((AT91_REG *) 	0xFFFD0214) // (CAN_MB0) MailBox Data Low Register

-#define AT91C_CAN_MB0_MAM ((AT91_REG *) 	0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB0_MCR ((AT91_REG *) 	0xFFFD021C) // (CAN_MB0) MailBox Control Register

-#define AT91C_CAN_MB0_MID ((AT91_REG *) 	0xFFFD0208) // (CAN_MB0) MailBox ID Register

-#define AT91C_CAN_MB0_MSR ((AT91_REG *) 	0xFFFD0210) // (CAN_MB0) MailBox Status Register

-#define AT91C_CAN_MB0_MFID ((AT91_REG *) 	0xFFFD020C) // (CAN_MB0) MailBox Family ID Register

-#define AT91C_CAN_MB0_MDH ((AT91_REG *) 	0xFFFD0218) // (CAN_MB0) MailBox Data High Register

-#define AT91C_CAN_MB0_MMR ((AT91_REG *) 	0xFFFD0200) // (CAN_MB0) MailBox Mode Register

-// ========== Register definition for CAN_MB1 peripheral ========== 

-#define AT91C_CAN_MB1_MDL ((AT91_REG *) 	0xFFFD0234) // (CAN_MB1) MailBox Data Low Register

-#define AT91C_CAN_MB1_MID ((AT91_REG *) 	0xFFFD0228) // (CAN_MB1) MailBox ID Register

-#define AT91C_CAN_MB1_MMR ((AT91_REG *) 	0xFFFD0220) // (CAN_MB1) MailBox Mode Register

-#define AT91C_CAN_MB1_MSR ((AT91_REG *) 	0xFFFD0230) // (CAN_MB1) MailBox Status Register

-#define AT91C_CAN_MB1_MAM ((AT91_REG *) 	0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB1_MDH ((AT91_REG *) 	0xFFFD0238) // (CAN_MB1) MailBox Data High Register

-#define AT91C_CAN_MB1_MCR ((AT91_REG *) 	0xFFFD023C) // (CAN_MB1) MailBox Control Register

-#define AT91C_CAN_MB1_MFID ((AT91_REG *) 	0xFFFD022C) // (CAN_MB1) MailBox Family ID Register

-// ========== Register definition for CAN_MB2 peripheral ========== 

-#define AT91C_CAN_MB2_MCR ((AT91_REG *) 	0xFFFD025C) // (CAN_MB2) MailBox Control Register

-#define AT91C_CAN_MB2_MDH ((AT91_REG *) 	0xFFFD0258) // (CAN_MB2) MailBox Data High Register

-#define AT91C_CAN_MB2_MID ((AT91_REG *) 	0xFFFD0248) // (CAN_MB2) MailBox ID Register

-#define AT91C_CAN_MB2_MDL ((AT91_REG *) 	0xFFFD0254) // (CAN_MB2) MailBox Data Low Register

-#define AT91C_CAN_MB2_MMR ((AT91_REG *) 	0xFFFD0240) // (CAN_MB2) MailBox Mode Register

-#define AT91C_CAN_MB2_MAM ((AT91_REG *) 	0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB2_MFID ((AT91_REG *) 	0xFFFD024C) // (CAN_MB2) MailBox Family ID Register

-#define AT91C_CAN_MB2_MSR ((AT91_REG *) 	0xFFFD0250) // (CAN_MB2) MailBox Status Register

-// ========== Register definition for CAN_MB3 peripheral ========== 

-#define AT91C_CAN_MB3_MFID ((AT91_REG *) 	0xFFFD026C) // (CAN_MB3) MailBox Family ID Register

-#define AT91C_CAN_MB3_MAM ((AT91_REG *) 	0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB3_MID ((AT91_REG *) 	0xFFFD0268) // (CAN_MB3) MailBox ID Register

-#define AT91C_CAN_MB3_MCR ((AT91_REG *) 	0xFFFD027C) // (CAN_MB3) MailBox Control Register

-#define AT91C_CAN_MB3_MMR ((AT91_REG *) 	0xFFFD0260) // (CAN_MB3) MailBox Mode Register

-#define AT91C_CAN_MB3_MSR ((AT91_REG *) 	0xFFFD0270) // (CAN_MB3) MailBox Status Register

-#define AT91C_CAN_MB3_MDL ((AT91_REG *) 	0xFFFD0274) // (CAN_MB3) MailBox Data Low Register

-#define AT91C_CAN_MB3_MDH ((AT91_REG *) 	0xFFFD0278) // (CAN_MB3) MailBox Data High Register

-// ========== Register definition for CAN_MB4 peripheral ========== 

-#define AT91C_CAN_MB4_MID ((AT91_REG *) 	0xFFFD0288) // (CAN_MB4) MailBox ID Register

-#define AT91C_CAN_MB4_MMR ((AT91_REG *) 	0xFFFD0280) // (CAN_MB4) MailBox Mode Register

-#define AT91C_CAN_MB4_MDH ((AT91_REG *) 	0xFFFD0298) // (CAN_MB4) MailBox Data High Register

-#define AT91C_CAN_MB4_MFID ((AT91_REG *) 	0xFFFD028C) // (CAN_MB4) MailBox Family ID Register

-#define AT91C_CAN_MB4_MSR ((AT91_REG *) 	0xFFFD0290) // (CAN_MB4) MailBox Status Register

-#define AT91C_CAN_MB4_MCR ((AT91_REG *) 	0xFFFD029C) // (CAN_MB4) MailBox Control Register

-#define AT91C_CAN_MB4_MDL ((AT91_REG *) 	0xFFFD0294) // (CAN_MB4) MailBox Data Low Register

-#define AT91C_CAN_MB4_MAM ((AT91_REG *) 	0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register

-// ========== Register definition for CAN_MB5 peripheral ========== 

-#define AT91C_CAN_MB5_MSR ((AT91_REG *) 	0xFFFD02B0) // (CAN_MB5) MailBox Status Register

-#define AT91C_CAN_MB5_MCR ((AT91_REG *) 	0xFFFD02BC) // (CAN_MB5) MailBox Control Register

-#define AT91C_CAN_MB5_MFID ((AT91_REG *) 	0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register

-#define AT91C_CAN_MB5_MDH ((AT91_REG *) 	0xFFFD02B8) // (CAN_MB5) MailBox Data High Register

-#define AT91C_CAN_MB5_MID ((AT91_REG *) 	0xFFFD02A8) // (CAN_MB5) MailBox ID Register

-#define AT91C_CAN_MB5_MMR ((AT91_REG *) 	0xFFFD02A0) // (CAN_MB5) MailBox Mode Register

-#define AT91C_CAN_MB5_MDL ((AT91_REG *) 	0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register

-#define AT91C_CAN_MB5_MAM ((AT91_REG *) 	0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register

-// ========== Register definition for CAN_MB6 peripheral ========== 

-#define AT91C_CAN_MB6_MFID ((AT91_REG *) 	0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register

-#define AT91C_CAN_MB6_MID ((AT91_REG *) 	0xFFFD02C8) // (CAN_MB6) MailBox ID Register

-#define AT91C_CAN_MB6_MAM ((AT91_REG *) 	0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB6_MSR ((AT91_REG *) 	0xFFFD02D0) // (CAN_MB6) MailBox Status Register

-#define AT91C_CAN_MB6_MDL ((AT91_REG *) 	0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register

-#define AT91C_CAN_MB6_MCR ((AT91_REG *) 	0xFFFD02DC) // (CAN_MB6) MailBox Control Register

-#define AT91C_CAN_MB6_MDH ((AT91_REG *) 	0xFFFD02D8) // (CAN_MB6) MailBox Data High Register

-#define AT91C_CAN_MB6_MMR ((AT91_REG *) 	0xFFFD02C0) // (CAN_MB6) MailBox Mode Register

-// ========== Register definition for CAN_MB7 peripheral ========== 

-#define AT91C_CAN_MB7_MCR ((AT91_REG *) 	0xFFFD02FC) // (CAN_MB7) MailBox Control Register

-#define AT91C_CAN_MB7_MDH ((AT91_REG *) 	0xFFFD02F8) // (CAN_MB7) MailBox Data High Register

-#define AT91C_CAN_MB7_MFID ((AT91_REG *) 	0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register

-#define AT91C_CAN_MB7_MDL ((AT91_REG *) 	0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register

-#define AT91C_CAN_MB7_MID ((AT91_REG *) 	0xFFFD02E8) // (CAN_MB7) MailBox ID Register

-#define AT91C_CAN_MB7_MMR ((AT91_REG *) 	0xFFFD02E0) // (CAN_MB7) MailBox Mode Register

-#define AT91C_CAN_MB7_MAM ((AT91_REG *) 	0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB7_MSR ((AT91_REG *) 	0xFFFD02F0) // (CAN_MB7) MailBox Status Register

-// ========== Register definition for CAN peripheral ========== 

-#define AT91C_CAN_TCR   ((AT91_REG *) 	0xFFFD0024) // (CAN) Transfer Command Register

-#define AT91C_CAN_IMR   ((AT91_REG *) 	0xFFFD000C) // (CAN) Interrupt Mask Register

-#define AT91C_CAN_IER   ((AT91_REG *) 	0xFFFD0004) // (CAN) Interrupt Enable Register

-#define AT91C_CAN_ECR   ((AT91_REG *) 	0xFFFD0020) // (CAN) Error Counter Register

-#define AT91C_CAN_TIMESTP ((AT91_REG *) 	0xFFFD001C) // (CAN) Time Stamp Register

-#define AT91C_CAN_MR    ((AT91_REG *) 	0xFFFD0000) // (CAN) Mode Register

-#define AT91C_CAN_IDR   ((AT91_REG *) 	0xFFFD0008) // (CAN) Interrupt Disable Register

-#define AT91C_CAN_ACR   ((AT91_REG *) 	0xFFFD0028) // (CAN) Abort Command Register

-#define AT91C_CAN_TIM   ((AT91_REG *) 	0xFFFD0018) // (CAN) Timer Register

-#define AT91C_CAN_SR    ((AT91_REG *) 	0xFFFD0010) // (CAN) Status Register

-#define AT91C_CAN_BR    ((AT91_REG *) 	0xFFFD0014) // (CAN) Baudrate Register

-#define AT91C_CAN_VR    ((AT91_REG *) 	0xFFFD00FC) // (CAN) Version Register

-// ========== Register definition for EMAC peripheral ========== 

-#define AT91C_EMAC_ISR  ((AT91_REG *) 	0xFFFDC024) // (EMAC) Interrupt Status Register

-#define AT91C_EMAC_SA4H ((AT91_REG *) 	0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes

-#define AT91C_EMAC_SA1L ((AT91_REG *) 	0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes

-#define AT91C_EMAC_ELE  ((AT91_REG *) 	0xFFFDC078) // (EMAC) Excessive Length Errors Register

-#define AT91C_EMAC_LCOL ((AT91_REG *) 	0xFFFDC05C) // (EMAC) Late Collision Register

-#define AT91C_EMAC_RLE  ((AT91_REG *) 	0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register

-#define AT91C_EMAC_WOL  ((AT91_REG *) 	0xFFFDC0C4) // (EMAC) Wake On LAN Register

-#define AT91C_EMAC_DTF  ((AT91_REG *) 	0xFFFDC058) // (EMAC) Deferred Transmission Frame Register

-#define AT91C_EMAC_TUND ((AT91_REG *) 	0xFFFDC064) // (EMAC) Transmit Underrun Error Register

-#define AT91C_EMAC_NCR  ((AT91_REG *) 	0xFFFDC000) // (EMAC) Network Control Register

-#define AT91C_EMAC_SA4L ((AT91_REG *) 	0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes

-#define AT91C_EMAC_RSR  ((AT91_REG *) 	0xFFFDC020) // (EMAC) Receive Status Register

-#define AT91C_EMAC_SA3L ((AT91_REG *) 	0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes

-#define AT91C_EMAC_TSR  ((AT91_REG *) 	0xFFFDC014) // (EMAC) Transmit Status Register

-#define AT91C_EMAC_IDR  ((AT91_REG *) 	0xFFFDC02C) // (EMAC) Interrupt Disable Register

-#define AT91C_EMAC_RSE  ((AT91_REG *) 	0xFFFDC074) // (EMAC) Receive Symbol Errors Register

-#define AT91C_EMAC_ECOL ((AT91_REG *) 	0xFFFDC060) // (EMAC) Excessive Collision Register

-#define AT91C_EMAC_TID  ((AT91_REG *) 	0xFFFDC0B8) // (EMAC) Type ID Checking Register

-#define AT91C_EMAC_HRB  ((AT91_REG *) 	0xFFFDC090) // (EMAC) Hash Address Bottom[31:0]

-#define AT91C_EMAC_TBQP ((AT91_REG *) 	0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer

-#define AT91C_EMAC_USRIO ((AT91_REG *) 	0xFFFDC0C0) // (EMAC) USER Input/Output Register

-#define AT91C_EMAC_PTR  ((AT91_REG *) 	0xFFFDC038) // (EMAC) Pause Time Register

-#define AT91C_EMAC_SA2H ((AT91_REG *) 	0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes

-#define AT91C_EMAC_ROV  ((AT91_REG *) 	0xFFFDC070) // (EMAC) Receive Overrun Errors Register

-#define AT91C_EMAC_ALE  ((AT91_REG *) 	0xFFFDC054) // (EMAC) Alignment Error Register

-#define AT91C_EMAC_RJA  ((AT91_REG *) 	0xFFFDC07C) // (EMAC) Receive Jabbers Register

-#define AT91C_EMAC_RBQP ((AT91_REG *) 	0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer

-#define AT91C_EMAC_TPF  ((AT91_REG *) 	0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register

-#define AT91C_EMAC_NCFGR ((AT91_REG *) 	0xFFFDC004) // (EMAC) Network Configuration Register

-#define AT91C_EMAC_HRT  ((AT91_REG *) 	0xFFFDC094) // (EMAC) Hash Address Top[63:32]

-#define AT91C_EMAC_USF  ((AT91_REG *) 	0xFFFDC080) // (EMAC) Undersize Frames Register

-#define AT91C_EMAC_FCSE ((AT91_REG *) 	0xFFFDC050) // (EMAC) Frame Check Sequence Error Register

-#define AT91C_EMAC_TPQ  ((AT91_REG *) 	0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register

-#define AT91C_EMAC_MAN  ((AT91_REG *) 	0xFFFDC034) // (EMAC) PHY Maintenance Register

-#define AT91C_EMAC_FTO  ((AT91_REG *) 	0xFFFDC040) // (EMAC) Frames Transmitted OK Register

-#define AT91C_EMAC_REV  ((AT91_REG *) 	0xFFFDC0FC) // (EMAC) Revision Register

-#define AT91C_EMAC_IMR  ((AT91_REG *) 	0xFFFDC030) // (EMAC) Interrupt Mask Register

-#define AT91C_EMAC_SCF  ((AT91_REG *) 	0xFFFDC044) // (EMAC) Single Collision Frame Register

-#define AT91C_EMAC_PFR  ((AT91_REG *) 	0xFFFDC03C) // (EMAC) Pause Frames received Register

-#define AT91C_EMAC_MCF  ((AT91_REG *) 	0xFFFDC048) // (EMAC) Multiple Collision Frame Register

-#define AT91C_EMAC_NSR  ((AT91_REG *) 	0xFFFDC008) // (EMAC) Network Status Register

-#define AT91C_EMAC_SA2L ((AT91_REG *) 	0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes

-#define AT91C_EMAC_FRO  ((AT91_REG *) 	0xFFFDC04C) // (EMAC) Frames Received OK Register

-#define AT91C_EMAC_IER  ((AT91_REG *) 	0xFFFDC028) // (EMAC) Interrupt Enable Register

-#define AT91C_EMAC_SA1H ((AT91_REG *) 	0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes

-#define AT91C_EMAC_CSE  ((AT91_REG *) 	0xFFFDC068) // (EMAC) Carrier Sense Error Register

-#define AT91C_EMAC_SA3H ((AT91_REG *) 	0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes

-#define AT91C_EMAC_RRE  ((AT91_REG *) 	0xFFFDC06C) // (EMAC) Receive Ressource Error Register

-#define AT91C_EMAC_STE  ((AT91_REG *) 	0xFFFDC084) // (EMAC) SQE Test Error Register

-// ========== Register definition for PDC_ADC peripheral ========== 

-#define AT91C_ADC_PTSR  ((AT91_REG *) 	0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register

-#define AT91C_ADC_PTCR  ((AT91_REG *) 	0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register

-#define AT91C_ADC_TNPR  ((AT91_REG *) 	0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register

-#define AT91C_ADC_TNCR  ((AT91_REG *) 	0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register

-#define AT91C_ADC_RNPR  ((AT91_REG *) 	0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register

-#define AT91C_ADC_RNCR  ((AT91_REG *) 	0xFFFD8114) // (PDC_ADC) Receive Next Counter Register

-#define AT91C_ADC_RPR   ((AT91_REG *) 	0xFFFD8100) // (PDC_ADC) Receive Pointer Register

-#define AT91C_ADC_TCR   ((AT91_REG *) 	0xFFFD810C) // (PDC_ADC) Transmit Counter Register

-#define AT91C_ADC_TPR   ((AT91_REG *) 	0xFFFD8108) // (PDC_ADC) Transmit Pointer Register

-#define AT91C_ADC_RCR   ((AT91_REG *) 	0xFFFD8104) // (PDC_ADC) Receive Counter Register

-// ========== Register definition for ADC peripheral ========== 

-#define AT91C_ADC_CDR2  ((AT91_REG *) 	0xFFFD8038) // (ADC) ADC Channel Data Register 2

-#define AT91C_ADC_CDR3  ((AT91_REG *) 	0xFFFD803C) // (ADC) ADC Channel Data Register 3

-#define AT91C_ADC_CDR0  ((AT91_REG *) 	0xFFFD8030) // (ADC) ADC Channel Data Register 0

-#define AT91C_ADC_CDR5  ((AT91_REG *) 	0xFFFD8044) // (ADC) ADC Channel Data Register 5

-#define AT91C_ADC_CHDR  ((AT91_REG *) 	0xFFFD8014) // (ADC) ADC Channel Disable Register

-#define AT91C_ADC_SR    ((AT91_REG *) 	0xFFFD801C) // (ADC) ADC Status Register

-#define AT91C_ADC_CDR4  ((AT91_REG *) 	0xFFFD8040) // (ADC) ADC Channel Data Register 4

-#define AT91C_ADC_CDR1  ((AT91_REG *) 	0xFFFD8034) // (ADC) ADC Channel Data Register 1

-#define AT91C_ADC_LCDR  ((AT91_REG *) 	0xFFFD8020) // (ADC) ADC Last Converted Data Register

-#define AT91C_ADC_IDR   ((AT91_REG *) 	0xFFFD8028) // (ADC) ADC Interrupt Disable Register

-#define AT91C_ADC_CR    ((AT91_REG *) 	0xFFFD8000) // (ADC) ADC Control Register

-#define AT91C_ADC_CDR7  ((AT91_REG *) 	0xFFFD804C) // (ADC) ADC Channel Data Register 7

-#define AT91C_ADC_CDR6  ((AT91_REG *) 	0xFFFD8048) // (ADC) ADC Channel Data Register 6

-#define AT91C_ADC_IER   ((AT91_REG *) 	0xFFFD8024) // (ADC) ADC Interrupt Enable Register

-#define AT91C_ADC_CHER  ((AT91_REG *) 	0xFFFD8010) // (ADC) ADC Channel Enable Register

-#define AT91C_ADC_CHSR  ((AT91_REG *) 	0xFFFD8018) // (ADC) ADC Channel Status Register

-#define AT91C_ADC_MR    ((AT91_REG *) 	0xFFFD8004) // (ADC) ADC Mode Register

-#define AT91C_ADC_IMR   ((AT91_REG *) 	0xFFFD802C) // (ADC) ADC Interrupt Mask Register

-// ========== Register definition for PDC_AES peripheral ========== 

-#define AT91C_AES_TPR   ((AT91_REG *) 	0xFFFA4108) // (PDC_AES) Transmit Pointer Register

-#define AT91C_AES_PTCR  ((AT91_REG *) 	0xFFFA4120) // (PDC_AES) PDC Transfer Control Register

-#define AT91C_AES_RNPR  ((AT91_REG *) 	0xFFFA4110) // (PDC_AES) Receive Next Pointer Register

-#define AT91C_AES_TNCR  ((AT91_REG *) 	0xFFFA411C) // (PDC_AES) Transmit Next Counter Register

-#define AT91C_AES_TCR   ((AT91_REG *) 	0xFFFA410C) // (PDC_AES) Transmit Counter Register

-#define AT91C_AES_RCR   ((AT91_REG *) 	0xFFFA4104) // (PDC_AES) Receive Counter Register

-#define AT91C_AES_RNCR  ((AT91_REG *) 	0xFFFA4114) // (PDC_AES) Receive Next Counter Register

-#define AT91C_AES_TNPR  ((AT91_REG *) 	0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register

-#define AT91C_AES_RPR   ((AT91_REG *) 	0xFFFA4100) // (PDC_AES) Receive Pointer Register

-#define AT91C_AES_PTSR  ((AT91_REG *) 	0xFFFA4124) // (PDC_AES) PDC Transfer Status Register

-// ========== Register definition for AES peripheral ========== 

-#define AT91C_AES_IVxR  ((AT91_REG *) 	0xFFFA4060) // (AES) Initialization Vector x Register

-#define AT91C_AES_MR    ((AT91_REG *) 	0xFFFA4004) // (AES) Mode Register

-#define AT91C_AES_VR    ((AT91_REG *) 	0xFFFA40FC) // (AES) AES Version Register

-#define AT91C_AES_ODATAxR ((AT91_REG *) 	0xFFFA4050) // (AES) Output Data x Register

-#define AT91C_AES_IDATAxR ((AT91_REG *) 	0xFFFA4040) // (AES) Input Data x Register

-#define AT91C_AES_CR    ((AT91_REG *) 	0xFFFA4000) // (AES) Control Register

-#define AT91C_AES_IDR   ((AT91_REG *) 	0xFFFA4014) // (AES) Interrupt Disable Register

-#define AT91C_AES_IMR   ((AT91_REG *) 	0xFFFA4018) // (AES) Interrupt Mask Register

-#define AT91C_AES_IER   ((AT91_REG *) 	0xFFFA4010) // (AES) Interrupt Enable Register

-#define AT91C_AES_KEYWxR ((AT91_REG *) 	0xFFFA4020) // (AES) Key Word x Register

-#define AT91C_AES_ISR   ((AT91_REG *) 	0xFFFA401C) // (AES) Interrupt Status Register

-// ========== Register definition for PDC_TDES peripheral ========== 

-#define AT91C_TDES_RNCR ((AT91_REG *) 	0xFFFA8114) // (PDC_TDES) Receive Next Counter Register

-#define AT91C_TDES_TCR  ((AT91_REG *) 	0xFFFA810C) // (PDC_TDES) Transmit Counter Register

-#define AT91C_TDES_RCR  ((AT91_REG *) 	0xFFFA8104) // (PDC_TDES) Receive Counter Register

-#define AT91C_TDES_TNPR ((AT91_REG *) 	0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register

-#define AT91C_TDES_RNPR ((AT91_REG *) 	0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register

-#define AT91C_TDES_RPR  ((AT91_REG *) 	0xFFFA8100) // (PDC_TDES) Receive Pointer Register

-#define AT91C_TDES_TNCR ((AT91_REG *) 	0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register

-#define AT91C_TDES_TPR  ((AT91_REG *) 	0xFFFA8108) // (PDC_TDES) Transmit Pointer Register

-#define AT91C_TDES_PTSR ((AT91_REG *) 	0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register

-#define AT91C_TDES_PTCR ((AT91_REG *) 	0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register

-// ========== Register definition for TDES peripheral ========== 

-#define AT91C_TDES_KEY2WxR ((AT91_REG *) 	0xFFFA8028) // (TDES) Key 2 Word x Register

-#define AT91C_TDES_KEY3WxR ((AT91_REG *) 	0xFFFA8030) // (TDES) Key 3 Word x Register

-#define AT91C_TDES_IDR  ((AT91_REG *) 	0xFFFA8014) // (TDES) Interrupt Disable Register

-#define AT91C_TDES_VR   ((AT91_REG *) 	0xFFFA80FC) // (TDES) TDES Version Register

-#define AT91C_TDES_IVxR ((AT91_REG *) 	0xFFFA8060) // (TDES) Initialization Vector x Register

-#define AT91C_TDES_ODATAxR ((AT91_REG *) 	0xFFFA8050) // (TDES) Output Data x Register

-#define AT91C_TDES_IMR  ((AT91_REG *) 	0xFFFA8018) // (TDES) Interrupt Mask Register

-#define AT91C_TDES_MR   ((AT91_REG *) 	0xFFFA8004) // (TDES) Mode Register

-#define AT91C_TDES_CR   ((AT91_REG *) 	0xFFFA8000) // (TDES) Control Register

-#define AT91C_TDES_IER  ((AT91_REG *) 	0xFFFA8010) // (TDES) Interrupt Enable Register

-#define AT91C_TDES_ISR  ((AT91_REG *) 	0xFFFA801C) // (TDES) Interrupt Status Register

-#define AT91C_TDES_IDATAxR ((AT91_REG *) 	0xFFFA8040) // (TDES) Input Data x Register

-#define AT91C_TDES_KEY1WxR ((AT91_REG *) 	0xFFFA8020) // (TDES) Key 1 Word x Register

-

-// *****************************************************************************

-//               PIO DEFINITIONS FOR AT91SAM7X256

-// *****************************************************************************

-#define AT91C_PIO_PA0        ((unsigned int) 1 <<  0) // Pin Controlled by PA0

-#define AT91C_PA0_RXD0     ((unsigned int) AT91C_PIO_PA0) //  USART 0 Receive Data

-#define AT91C_PIO_PA1        ((unsigned int) 1 <<  1) // Pin Controlled by PA1

-#define AT91C_PA1_TXD0     ((unsigned int) AT91C_PIO_PA1) //  USART 0 Transmit Data

-#define AT91C_PIO_PA10       ((unsigned int) 1 << 10) // Pin Controlled by PA10

-#define AT91C_PA10_TWD      ((unsigned int) AT91C_PIO_PA10) //  TWI Two-wire Serial Data

-#define AT91C_PIO_PA11       ((unsigned int) 1 << 11) // Pin Controlled by PA11

-#define AT91C_PA11_TWCK     ((unsigned int) AT91C_PIO_PA11) //  TWI Two-wire Serial Clock

-#define AT91C_PIO_PA12       ((unsigned int) 1 << 12) // Pin Controlled by PA12

-#define AT91C_PA12_NPCS00   ((unsigned int) AT91C_PIO_PA12) //  SPI 0 Peripheral Chip Select 0

-#define AT91C_PIO_PA13       ((unsigned int) 1 << 13) // Pin Controlled by PA13

-#define AT91C_PA13_NPCS01   ((unsigned int) AT91C_PIO_PA13) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PA13_PCK1     ((unsigned int) AT91C_PIO_PA13) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PA14       ((unsigned int) 1 << 14) // Pin Controlled by PA14

-#define AT91C_PA14_NPCS02   ((unsigned int) AT91C_PIO_PA14) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PA14_IRQ1     ((unsigned int) AT91C_PIO_PA14) //  External Interrupt 1

-#define AT91C_PIO_PA15       ((unsigned int) 1 << 15) // Pin Controlled by PA15

-#define AT91C_PA15_NPCS03   ((unsigned int) AT91C_PIO_PA15) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PA15_TCLK2    ((unsigned int) AT91C_PIO_PA15) //  Timer Counter 2 external clock input

-#define AT91C_PIO_PA16       ((unsigned int) 1 << 16) // Pin Controlled by PA16

-#define AT91C_PA16_MISO0    ((unsigned int) AT91C_PIO_PA16) //  SPI 0 Master In Slave

-#define AT91C_PIO_PA17       ((unsigned int) 1 << 17) // Pin Controlled by PA17

-#define AT91C_PA17_MOSI0    ((unsigned int) AT91C_PIO_PA17) //  SPI 0 Master Out Slave

-#define AT91C_PIO_PA18       ((unsigned int) 1 << 18) // Pin Controlled by PA18

-#define AT91C_PA18_SPCK0    ((unsigned int) AT91C_PIO_PA18) //  SPI 0 Serial Clock

-#define AT91C_PIO_PA19       ((unsigned int) 1 << 19) // Pin Controlled by PA19

-#define AT91C_PA19_CANRX    ((unsigned int) AT91C_PIO_PA19) //  CAN Receive

-#define AT91C_PIO_PA2        ((unsigned int) 1 <<  2) // Pin Controlled by PA2

-#define AT91C_PA2_SCK0     ((unsigned int) AT91C_PIO_PA2) //  USART 0 Serial Clock

-#define AT91C_PA2_NPCS11   ((unsigned int) AT91C_PIO_PA2) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PA20       ((unsigned int) 1 << 20) // Pin Controlled by PA20

-#define AT91C_PA20_CANTX    ((unsigned int) AT91C_PIO_PA20) //  CAN Transmit

-#define AT91C_PIO_PA21       ((unsigned int) 1 << 21) // Pin Controlled by PA21

-#define AT91C_PA21_TF       ((unsigned int) AT91C_PIO_PA21) //  SSC Transmit Frame Sync

-#define AT91C_PA21_NPCS10   ((unsigned int) AT91C_PIO_PA21) //  SPI 1 Peripheral Chip Select 0

-#define AT91C_PIO_PA22       ((unsigned int) 1 << 22) // Pin Controlled by PA22

-#define AT91C_PA22_TK       ((unsigned int) AT91C_PIO_PA22) //  SSC Transmit Clock

-#define AT91C_PA22_SPCK1    ((unsigned int) AT91C_PIO_PA22) //  SPI 1 Serial Clock

-#define AT91C_PIO_PA23       ((unsigned int) 1 << 23) // Pin Controlled by PA23

-#define AT91C_PA23_TD       ((unsigned int) AT91C_PIO_PA23) //  SSC Transmit data

-#define AT91C_PA23_MOSI1    ((unsigned int) AT91C_PIO_PA23) //  SPI 1 Master Out Slave

-#define AT91C_PIO_PA24       ((unsigned int) 1 << 24) // Pin Controlled by PA24

-#define AT91C_PA24_RD       ((unsigned int) AT91C_PIO_PA24) //  SSC Receive Data

-#define AT91C_PA24_MISO1    ((unsigned int) AT91C_PIO_PA24) //  SPI 1 Master In Slave

-#define AT91C_PIO_PA25       ((unsigned int) 1 << 25) // Pin Controlled by PA25

-#define AT91C_PA25_RK       ((unsigned int) AT91C_PIO_PA25) //  SSC Receive Clock

-#define AT91C_PA25_NPCS11   ((unsigned int) AT91C_PIO_PA25) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PA26       ((unsigned int) 1 << 26) // Pin Controlled by PA26

-#define AT91C_PA26_RF       ((unsigned int) AT91C_PIO_PA26) //  SSC Receive Frame Sync

-#define AT91C_PA26_NPCS12   ((unsigned int) AT91C_PIO_PA26) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PA27       ((unsigned int) 1 << 27) // Pin Controlled by PA27

-#define AT91C_PA27_DRXD     ((unsigned int) AT91C_PIO_PA27) //  DBGU Debug Receive Data

-#define AT91C_PA27_PCK3     ((unsigned int) AT91C_PIO_PA27) //  PMC Programmable Clock Output 3

-#define AT91C_PIO_PA28       ((unsigned int) 1 << 28) // Pin Controlled by PA28

-#define AT91C_PA28_DTXD     ((unsigned int) AT91C_PIO_PA28) //  DBGU Debug Transmit Data

-#define AT91C_PIO_PA29       ((unsigned int) 1 << 29) // Pin Controlled by PA29

-#define AT91C_PA29_FIQ      ((unsigned int) AT91C_PIO_PA29) //  AIC Fast Interrupt Input

-#define AT91C_PA29_NPCS13   ((unsigned int) AT91C_PIO_PA29) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PA3        ((unsigned int) 1 <<  3) // Pin Controlled by PA3

-#define AT91C_PA3_RTS0     ((unsigned int) AT91C_PIO_PA3) //  USART 0 Ready To Send

-#define AT91C_PA3_NPCS12   ((unsigned int) AT91C_PIO_PA3) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PA30       ((unsigned int) 1 << 30) // Pin Controlled by PA30

-#define AT91C_PA30_IRQ0     ((unsigned int) AT91C_PIO_PA30) //  External Interrupt 0

-#define AT91C_PA30_PCK2     ((unsigned int) AT91C_PIO_PA30) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PA4        ((unsigned int) 1 <<  4) // Pin Controlled by PA4

-#define AT91C_PA4_CTS0     ((unsigned int) AT91C_PIO_PA4) //  USART 0 Clear To Send

-#define AT91C_PA4_NPCS13   ((unsigned int) AT91C_PIO_PA4) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PA5        ((unsigned int) 1 <<  5) // Pin Controlled by PA5

-#define AT91C_PA5_RXD1     ((unsigned int) AT91C_PIO_PA5) //  USART 1 Receive Data

-#define AT91C_PIO_PA6        ((unsigned int) 1 <<  6) // Pin Controlled by PA6

-#define AT91C_PA6_TXD1     ((unsigned int) AT91C_PIO_PA6) //  USART 1 Transmit Data

-#define AT91C_PIO_PA7        ((unsigned int) 1 <<  7) // Pin Controlled by PA7

-#define AT91C_PA7_SCK1     ((unsigned int) AT91C_PIO_PA7) //  USART 1 Serial Clock

-#define AT91C_PA7_NPCS01   ((unsigned int) AT91C_PIO_PA7) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PIO_PA8        ((unsigned int) 1 <<  8) // Pin Controlled by PA8

-#define AT91C_PA8_RTS1     ((unsigned int) AT91C_PIO_PA8) //  USART 1 Ready To Send

-#define AT91C_PA8_NPCS02   ((unsigned int) AT91C_PIO_PA8) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PIO_PA9        ((unsigned int) 1 <<  9) // Pin Controlled by PA9

-#define AT91C_PA9_CTS1     ((unsigned int) AT91C_PIO_PA9) //  USART 1 Clear To Send

-#define AT91C_PA9_NPCS03   ((unsigned int) AT91C_PIO_PA9) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PIO_PB0        ((unsigned int) 1 <<  0) // Pin Controlled by PB0

-#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) //  Ethernet MAC Transmit Clock/Reference Clock

-#define AT91C_PB0_PCK0     ((unsigned int) AT91C_PIO_PB0) //  PMC Programmable Clock Output 0

-#define AT91C_PIO_PB1        ((unsigned int) 1 <<  1) // Pin Controlled by PB1

-#define AT91C_PB1_ETXEN    ((unsigned int) AT91C_PIO_PB1) //  Ethernet MAC Transmit Enable

-#define AT91C_PIO_PB10       ((unsigned int) 1 << 10) // Pin Controlled by PB10

-#define AT91C_PB10_ETX2     ((unsigned int) AT91C_PIO_PB10) //  Ethernet MAC Transmit Data 2

-#define AT91C_PB10_NPCS11   ((unsigned int) AT91C_PIO_PB10) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PB11       ((unsigned int) 1 << 11) // Pin Controlled by PB11

-#define AT91C_PB11_ETX3     ((unsigned int) AT91C_PIO_PB11) //  Ethernet MAC Transmit Data 3

-#define AT91C_PB11_NPCS12   ((unsigned int) AT91C_PIO_PB11) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PB12       ((unsigned int) 1 << 12) // Pin Controlled by PB12

-#define AT91C_PB12_ETXER    ((unsigned int) AT91C_PIO_PB12) //  Ethernet MAC Transmikt Coding Error

-#define AT91C_PB12_TCLK0    ((unsigned int) AT91C_PIO_PB12) //  Timer Counter 0 external clock input

-#define AT91C_PIO_PB13       ((unsigned int) 1 << 13) // Pin Controlled by PB13

-#define AT91C_PB13_ERX2     ((unsigned int) AT91C_PIO_PB13) //  Ethernet MAC Receive Data 2

-#define AT91C_PB13_NPCS01   ((unsigned int) AT91C_PIO_PB13) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PIO_PB14       ((unsigned int) 1 << 14) // Pin Controlled by PB14

-#define AT91C_PB14_ERX3     ((unsigned int) AT91C_PIO_PB14) //  Ethernet MAC Receive Data 3

-#define AT91C_PB14_NPCS02   ((unsigned int) AT91C_PIO_PB14) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PIO_PB15       ((unsigned int) 1 << 15) // Pin Controlled by PB15

-#define AT91C_PB15_ERXDV    ((unsigned int) AT91C_PIO_PB15) //  Ethernet MAC Receive Data Valid

-#define AT91C_PIO_PB16       ((unsigned int) 1 << 16) // Pin Controlled by PB16

-#define AT91C_PB16_ECOL     ((unsigned int) AT91C_PIO_PB16) //  Ethernet MAC Collision Detected

-#define AT91C_PB16_NPCS13   ((unsigned int) AT91C_PIO_PB16) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PB17       ((unsigned int) 1 << 17) // Pin Controlled by PB17

-#define AT91C_PB17_ERXCK    ((unsigned int) AT91C_PIO_PB17) //  Ethernet MAC Receive Clock

-#define AT91C_PB17_NPCS03   ((unsigned int) AT91C_PIO_PB17) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PIO_PB18       ((unsigned int) 1 << 18) // Pin Controlled by PB18

-#define AT91C_PB18_EF100    ((unsigned int) AT91C_PIO_PB18) //  Ethernet MAC Force 100 Mbits/sec

-#define AT91C_PB18_ADTRG    ((unsigned int) AT91C_PIO_PB18) //  ADC External Trigger

-#define AT91C_PIO_PB19       ((unsigned int) 1 << 19) // Pin Controlled by PB19

-#define AT91C_PB19_PWM0     ((unsigned int) AT91C_PIO_PB19) //  PWM Channel 0

-#define AT91C_PB19_TCLK1    ((unsigned int) AT91C_PIO_PB19) //  Timer Counter 1 external clock input

-#define AT91C_PIO_PB2        ((unsigned int) 1 <<  2) // Pin Controlled by PB2

-#define AT91C_PB2_ETX0     ((unsigned int) AT91C_PIO_PB2) //  Ethernet MAC Transmit Data 0

-#define AT91C_PIO_PB20       ((unsigned int) 1 << 20) // Pin Controlled by PB20

-#define AT91C_PB20_PWM1     ((unsigned int) AT91C_PIO_PB20) //  PWM Channel 1

-#define AT91C_PB20_PCK0     ((unsigned int) AT91C_PIO_PB20) //  PMC Programmable Clock Output 0

-#define AT91C_PIO_PB21       ((unsigned int) 1 << 21) // Pin Controlled by PB21

-#define AT91C_PB21_PWM2     ((unsigned int) AT91C_PIO_PB21) //  PWM Channel 2

-#define AT91C_PB21_PCK1     ((unsigned int) AT91C_PIO_PB21) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PB22       ((unsigned int) 1 << 22) // Pin Controlled by PB22

-#define AT91C_PB22_PWM3     ((unsigned int) AT91C_PIO_PB22) //  PWM Channel 3

-#define AT91C_PB22_PCK2     ((unsigned int) AT91C_PIO_PB22) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PB23       ((unsigned int) 1 << 23) // Pin Controlled by PB23

-#define AT91C_PB23_TIOA0    ((unsigned int) AT91C_PIO_PB23) //  Timer Counter 0 Multipurpose Timer I/O Pin A

-#define AT91C_PB23_DCD1     ((unsigned int) AT91C_PIO_PB23) //  USART 1 Data Carrier Detect

-#define AT91C_PIO_PB24       ((unsigned int) 1 << 24) // Pin Controlled by PB24

-#define AT91C_PB24_TIOB0    ((unsigned int) AT91C_PIO_PB24) //  Timer Counter 0 Multipurpose Timer I/O Pin B

-#define AT91C_PB24_DSR1     ((unsigned int) AT91C_PIO_PB24) //  USART 1 Data Set ready

-#define AT91C_PIO_PB25       ((unsigned int) 1 << 25) // Pin Controlled by PB25

-#define AT91C_PB25_TIOA1    ((unsigned int) AT91C_PIO_PB25) //  Timer Counter 1 Multipurpose Timer I/O Pin A

-#define AT91C_PB25_DTR1     ((unsigned int) AT91C_PIO_PB25) //  USART 1 Data Terminal ready

-#define AT91C_PIO_PB26       ((unsigned int) 1 << 26) // Pin Controlled by PB26

-#define AT91C_PB26_TIOB1    ((unsigned int) AT91C_PIO_PB26) //  Timer Counter 1 Multipurpose Timer I/O Pin B

-#define AT91C_PB26_RI1      ((unsigned int) AT91C_PIO_PB26) //  USART 1 Ring Indicator

-#define AT91C_PIO_PB27       ((unsigned int) 1 << 27) // Pin Controlled by PB27

-#define AT91C_PB27_TIOA2    ((unsigned int) AT91C_PIO_PB27) //  Timer Counter 2 Multipurpose Timer I/O Pin A

-#define AT91C_PB27_PWM0     ((unsigned int) AT91C_PIO_PB27) //  PWM Channel 0

-#define AT91C_PIO_PB28       ((unsigned int) 1 << 28) // Pin Controlled by PB28

-#define AT91C_PB28_TIOB2    ((unsigned int) AT91C_PIO_PB28) //  Timer Counter 2 Multipurpose Timer I/O Pin B

-#define AT91C_PB28_PWM1     ((unsigned int) AT91C_PIO_PB28) //  PWM Channel 1

-#define AT91C_PIO_PB29       ((unsigned int) 1 << 29) // Pin Controlled by PB29

-#define AT91C_PB29_PCK1     ((unsigned int) AT91C_PIO_PB29) //  PMC Programmable Clock Output 1

-#define AT91C_PB29_PWM2     ((unsigned int) AT91C_PIO_PB29) //  PWM Channel 2

-#define AT91C_PIO_PB3        ((unsigned int) 1 <<  3) // Pin Controlled by PB3

-#define AT91C_PB3_ETX1     ((unsigned int) AT91C_PIO_PB3) //  Ethernet MAC Transmit Data 1

-#define AT91C_PIO_PB30       ((unsigned int) 1 << 30) // Pin Controlled by PB30

-#define AT91C_PB30_PCK2     ((unsigned int) AT91C_PIO_PB30) //  PMC Programmable Clock Output 2

-#define AT91C_PB30_PWM3     ((unsigned int) AT91C_PIO_PB30) //  PWM Channel 3

-#define AT91C_PIO_PB4        ((unsigned int) 1 <<  4) // Pin Controlled by PB4

-#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) //  Ethernet MAC Carrier Sense/Carrier Sense and Data Valid

-#define AT91C_PIO_PB5        ((unsigned int) 1 <<  5) // Pin Controlled by PB5

-#define AT91C_PB5_ERX0     ((unsigned int) AT91C_PIO_PB5) //  Ethernet MAC Receive Data 0

-#define AT91C_PIO_PB6        ((unsigned int) 1 <<  6) // Pin Controlled by PB6

-#define AT91C_PB6_ERX1     ((unsigned int) AT91C_PIO_PB6) //  Ethernet MAC Receive Data 1

-#define AT91C_PIO_PB7        ((unsigned int) 1 <<  7) // Pin Controlled by PB7

-#define AT91C_PB7_ERXER    ((unsigned int) AT91C_PIO_PB7) //  Ethernet MAC Receive Error

-#define AT91C_PIO_PB8        ((unsigned int) 1 <<  8) // Pin Controlled by PB8

-#define AT91C_PB8_EMDC     ((unsigned int) AT91C_PIO_PB8) //  Ethernet MAC Management Data Clock

-#define AT91C_PIO_PB9        ((unsigned int) 1 <<  9) // Pin Controlled by PB9

-#define AT91C_PB9_EMDIO    ((unsigned int) AT91C_PIO_PB9) //  Ethernet MAC Management Data Input/Output

-

-// *****************************************************************************

-//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256

-// *****************************************************************************

-#define AT91C_ID_FIQ    ((unsigned int)  0) // Advanced Interrupt Controller (FIQ)

-#define AT91C_ID_SYS    ((unsigned int)  1) // System Peripheral

-#define AT91C_ID_PIOA   ((unsigned int)  2) // Parallel IO Controller A

-#define AT91C_ID_PIOB   ((unsigned int)  3) // Parallel IO Controller B

-#define AT91C_ID_SPI0   ((unsigned int)  4) // Serial Peripheral Interface 0

-#define AT91C_ID_SPI1   ((unsigned int)  5) // Serial Peripheral Interface 1

-#define AT91C_ID_US0    ((unsigned int)  6) // USART 0

-#define AT91C_ID_US1    ((unsigned int)  7) // USART 1

-#define AT91C_ID_SSC    ((unsigned int)  8) // Serial Synchronous Controller

-#define AT91C_ID_TWI    ((unsigned int)  9) // Two-Wire Interface

-#define AT91C_ID_PWMC   ((unsigned int) 10) // PWM Controller

-#define AT91C_ID_UDP    ((unsigned int) 11) // USB Device Port

-#define AT91C_ID_TC0    ((unsigned int) 12) // Timer Counter 0

-#define AT91C_ID_TC1    ((unsigned int) 13) // Timer Counter 1

-#define AT91C_ID_TC2    ((unsigned int) 14) // Timer Counter 2

-#define AT91C_ID_CAN    ((unsigned int) 15) // Control Area Network Controller

-#define AT91C_ID_EMAC   ((unsigned int) 16) // Ethernet MAC

-#define AT91C_ID_ADC    ((unsigned int) 17) // Analog-to-Digital Converter

-#define AT91C_ID_AES    ((unsigned int) 18) // Advanced Encryption Standard 128-bit

-#define AT91C_ID_TDES   ((unsigned int) 19) // Triple Data Encryption Standard

-#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved

-#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved

-#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved

-#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved

-#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved

-#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved

-#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved

-#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved

-#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved

-#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved

-#define AT91C_ID_IRQ0   ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0)

-#define AT91C_ID_IRQ1   ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1)

-

-// *****************************************************************************

-//               BASE ADDRESS DEFINITIONS FOR AT91SAM7X256

-// *****************************************************************************

-#define AT91C_BASE_SYS       ((AT91PS_SYS) 	0xFFFFF000) // (SYS) Base Address

-#define AT91C_BASE_AIC       ((AT91PS_AIC) 	0xFFFFF000) // (AIC) Base Address

-#define AT91C_BASE_PDC_DBGU  ((AT91PS_PDC) 	0xFFFFF300) // (PDC_DBGU) Base Address

-#define AT91C_BASE_DBGU      ((AT91PS_DBGU) 	0xFFFFF200) // (DBGU) Base Address

-#define AT91C_BASE_PIOA      ((AT91PS_PIO) 	0xFFFFF400) // (PIOA) Base Address

-#define AT91C_BASE_PIOB      ((AT91PS_PIO) 	0xFFFFF600) // (PIOB) Base Address

-#define AT91C_BASE_CKGR      ((AT91PS_CKGR) 	0xFFFFFC20) // (CKGR) Base Address

-#define AT91C_BASE_PMC       ((AT91PS_PMC) 	0xFFFFFC00) // (PMC) Base Address

-#define AT91C_BASE_RSTC      ((AT91PS_RSTC) 	0xFFFFFD00) // (RSTC) Base Address

-#define AT91C_BASE_RTTC      ((AT91PS_RTTC) 	0xFFFFFD20) // (RTTC) Base Address

-#define AT91C_BASE_PITC      ((AT91PS_PITC) 	0xFFFFFD30) // (PITC) Base Address

-#define AT91C_BASE_WDTC      ((AT91PS_WDTC) 	0xFFFFFD40) // (WDTC) Base Address

-#define AT91C_BASE_VREG      ((AT91PS_VREG) 	0xFFFFFD60) // (VREG) Base Address

-#define AT91C_BASE_MC        ((AT91PS_MC) 	0xFFFFFF00) // (MC) Base Address

-#define AT91C_BASE_PDC_SPI1  ((AT91PS_PDC) 	0xFFFE4100) // (PDC_SPI1) Base Address

-#define AT91C_BASE_SPI1      ((AT91PS_SPI) 	0xFFFE4000) // (SPI1) Base Address

-#define AT91C_BASE_PDC_SPI0  ((AT91PS_PDC) 	0xFFFE0100) // (PDC_SPI0) Base Address

-#define AT91C_BASE_SPI0      ((AT91PS_SPI) 	0xFFFE0000) // (SPI0) Base Address

-#define AT91C_BASE_PDC_US1   ((AT91PS_PDC) 	0xFFFC4100) // (PDC_US1) Base Address

-#define AT91C_BASE_US1       ((AT91PS_USART) 	0xFFFC4000) // (US1) Base Address

-#define AT91C_BASE_PDC_US0   ((AT91PS_PDC) 	0xFFFC0100) // (PDC_US0) Base Address

-#define AT91C_BASE_US0       ((AT91PS_USART) 	0xFFFC0000) // (US0) Base Address

-#define AT91C_BASE_PDC_SSC   ((AT91PS_PDC) 	0xFFFD4100) // (PDC_SSC) Base Address

-#define AT91C_BASE_SSC       ((AT91PS_SSC) 	0xFFFD4000) // (SSC) Base Address

-#define AT91C_BASE_TWI       ((AT91PS_TWI) 	0xFFFB8000) // (TWI) Base Address

-#define AT91C_BASE_PWMC_CH3  ((AT91PS_PWMC_CH) 	0xFFFCC260) // (PWMC_CH3) Base Address

-#define AT91C_BASE_PWMC_CH2  ((AT91PS_PWMC_CH) 	0xFFFCC240) // (PWMC_CH2) Base Address

-#define AT91C_BASE_PWMC_CH1  ((AT91PS_PWMC_CH) 	0xFFFCC220) // (PWMC_CH1) Base Address

-#define AT91C_BASE_PWMC_CH0  ((AT91PS_PWMC_CH) 	0xFFFCC200) // (PWMC_CH0) Base Address

-#define AT91C_BASE_PWMC      ((AT91PS_PWMC) 	0xFFFCC000) // (PWMC) Base Address

-#define AT91C_BASE_UDP       ((AT91PS_UDP) 	0xFFFB0000) // (UDP) Base Address

-#define AT91C_BASE_TC0       ((AT91PS_TC) 	0xFFFA0000) // (TC0) Base Address

-#define AT91C_BASE_TC1       ((AT91PS_TC) 	0xFFFA0040) // (TC1) Base Address

-#define AT91C_BASE_TC2       ((AT91PS_TC) 	0xFFFA0080) // (TC2) Base Address

-#define AT91C_BASE_TCB       ((AT91PS_TCB) 	0xFFFA0000) // (TCB) Base Address

-#define AT91C_BASE_CAN_MB0   ((AT91PS_CAN_MB) 	0xFFFD0200) // (CAN_MB0) Base Address

-#define AT91C_BASE_CAN_MB1   ((AT91PS_CAN_MB) 	0xFFFD0220) // (CAN_MB1) Base Address

-#define AT91C_BASE_CAN_MB2   ((AT91PS_CAN_MB) 	0xFFFD0240) // (CAN_MB2) Base Address

-#define AT91C_BASE_CAN_MB3   ((AT91PS_CAN_MB) 	0xFFFD0260) // (CAN_MB3) Base Address

-#define AT91C_BASE_CAN_MB4   ((AT91PS_CAN_MB) 	0xFFFD0280) // (CAN_MB4) Base Address

-#define AT91C_BASE_CAN_MB5   ((AT91PS_CAN_MB) 	0xFFFD02A0) // (CAN_MB5) Base Address

-#define AT91C_BASE_CAN_MB6   ((AT91PS_CAN_MB) 	0xFFFD02C0) // (CAN_MB6) Base Address

-#define AT91C_BASE_CAN_MB7   ((AT91PS_CAN_MB) 	0xFFFD02E0) // (CAN_MB7) Base Address

-#define AT91C_BASE_CAN       ((AT91PS_CAN) 	0xFFFD0000) // (CAN) Base Address

-#define AT91C_BASE_EMAC      ((AT91PS_EMAC) 	0xFFFDC000) // (EMAC) Base Address

-#define AT91C_BASE_PDC_ADC   ((AT91PS_PDC) 	0xFFFD8100) // (PDC_ADC) Base Address

-#define AT91C_BASE_ADC       ((AT91PS_ADC) 	0xFFFD8000) // (ADC) Base Address

-#define AT91C_BASE_PDC_AES   ((AT91PS_PDC) 	0xFFFA4100) // (PDC_AES) Base Address

-#define AT91C_BASE_AES       ((AT91PS_AES) 	0xFFFA4000) // (AES) Base Address

-#define AT91C_BASE_PDC_TDES  ((AT91PS_PDC) 	0xFFFA8100) // (PDC_TDES) Base Address

-#define AT91C_BASE_TDES      ((AT91PS_TDES) 	0xFFFA8000) // (TDES) Base Address

-

-// *****************************************************************************

-//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256

-// *****************************************************************************

-#define AT91C_ISRAM	 ((char *) 	0x00200000) // Internal SRAM base address

-#define AT91C_ISRAM_SIZE	 ((unsigned int) 0x00010000) // Internal SRAM size in byte (64 Kbyte)

-#define AT91C_IFLASH	 ((char *) 	0x00100000) // Internal ROM base address

-#define AT91C_IFLASH_SIZE	 ((unsigned int) 0x00040000) // Internal ROM size in byte (256 Kbyte)

-

-#endif

+//  ----------------------------------------------------------------------------
+//          ATMEL Microcontroller Software Support  -  ROUSSET  -
+//  ----------------------------------------------------------------------------
+//  DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+//  DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//  ----------------------------------------------------------------------------
+// File Name           : AT91SAM7X256.h
+// Object              : AT91SAM7X256 definitions
+// Generated           : AT91 SW Application Group  05/20/2005 (16:22:29)
+//
+// CVS Reference       : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005//
+// CVS Reference       : /SYS_SAM7X.pl/1.3/Tue Feb  1 17:01:43 2005//
+// CVS Reference       : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005//
+// CVS Reference       : /PMC_SAM7X.pl/1.4/Tue Feb  8 13:58:10 2005//
+// CVS Reference       : /RSTC_SAM7X.pl/1.1/Tue Feb  1 16:16:26 2005//
+// CVS Reference       : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005//
+// CVS Reference       : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005//
+// CVS Reference       : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005//
+// CVS Reference       : /PIO_6057A.pl/1.2/Thu Feb  3 10:18:28 2005//
+// CVS Reference       : /RTTC_6081A.pl/1.2/Tue Nov  9 14:43:58 2004//
+// CVS Reference       : /PITC_6079A.pl/1.2/Tue Nov  9 14:43:56 2004//
+// CVS Reference       : /WDTC_6080A.pl/1.3/Tue Nov  9 14:44:00 2004//
+// CVS Reference       : /VREG_6085B.pl/1.1/Tue Feb  1 16:05:48 2005//
+// CVS Reference       : /PDC_6074C.pl/1.2/Thu Feb  3 08:48:54 2005//
+// CVS Reference       : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005//
+// CVS Reference       : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005//
+// CVS Reference       : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004//
+// CVS Reference       : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004//
+// CVS Reference       : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004//
+// CVS Reference       : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005//
+// CVS Reference       : /CAN_6019B.pl/1.1/Tue Mar  8 12:42:22 2005//
+// CVS Reference       : /EMACB_6119A.pl/1.5/Thu Feb  3 15:52:04 2005//
+// CVS Reference       : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003//
+// CVS Reference       : /AES_6149A.pl/1.10/Mon Feb  7 09:44:25 2005//
+// CVS Reference       : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005//
+//  ----------------------------------------------------------------------------
+
+#ifndef AT91SAM7X256_H
+#define AT91SAM7X256_H
+
+typedef volatile unsigned int AT91_REG;// Hardware register definition
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR System Peripherals
+// *****************************************************************************
+typedef struct _AT91S_SYS {
+    AT91_REG     AIC_SMR[32];   // Source Mode Register
+    AT91_REG     AIC_SVR[32];   // Source Vector Register
+    AT91_REG     AIC_IVR;   // IRQ Vector Register
+    AT91_REG     AIC_FVR;   // FIQ Vector Register
+    AT91_REG     AIC_ISR;   // Interrupt Status Register
+    AT91_REG     AIC_IPR;   // Interrupt Pending Register
+    AT91_REG     AIC_IMR;   // Interrupt Mask Register
+    AT91_REG     AIC_CISR;  // Core Interrupt Status Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     AIC_IECR;  // Interrupt Enable Command Register
+    AT91_REG     AIC_IDCR;  // Interrupt Disable Command Register
+    AT91_REG     AIC_ICCR;  // Interrupt Clear Command Register
+    AT91_REG     AIC_ISCR;  // Interrupt Set Command Register
+    AT91_REG     AIC_EOICR;     // End of Interrupt Command Register
+    AT91_REG     AIC_SPU;   // Spurious Vector Register
+    AT91_REG     AIC_DCR;   // Debug Control Register (Protect)
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     AIC_FFER;  // Fast Forcing Enable Register
+    AT91_REG     AIC_FFDR;  // Fast Forcing Disable Register
+    AT91_REG     AIC_FFSR;  // Fast Forcing Status Register
+    AT91_REG     Reserved2[45];     //
+    AT91_REG     DBGU_CR;   // Control Register
+    AT91_REG     DBGU_MR;   // Mode Register
+    AT91_REG     DBGU_IER;  // Interrupt Enable Register
+    AT91_REG     DBGU_IDR;  // Interrupt Disable Register
+    AT91_REG     DBGU_IMR;  // Interrupt Mask Register
+    AT91_REG     DBGU_CSR;  // Channel Status Register
+    AT91_REG     DBGU_RHR;  // Receiver Holding Register
+    AT91_REG     DBGU_THR;  // Transmitter Holding Register
+    AT91_REG     DBGU_BRGR;     // Baud Rate Generator Register
+    AT91_REG     Reserved3[7];  //
+    AT91_REG     DBGU_CIDR;     // Chip ID Register
+    AT91_REG     DBGU_EXID;     // Chip ID Extension Register
+    AT91_REG     DBGU_FNTR;     // Force NTRST Register
+    AT91_REG     Reserved4[45];     //
+    AT91_REG     DBGU_RPR;  // Receive Pointer Register
+    AT91_REG     DBGU_RCR;  // Receive Counter Register
+    AT91_REG     DBGU_TPR;  // Transmit Pointer Register
+    AT91_REG     DBGU_TCR;  // Transmit Counter Register
+    AT91_REG     DBGU_RNPR;     // Receive Next Pointer Register
+    AT91_REG     DBGU_RNCR;     // Receive Next Counter Register
+    AT91_REG     DBGU_TNPR;     // Transmit Next Pointer Register
+    AT91_REG     DBGU_TNCR;     // Transmit Next Counter Register
+    AT91_REG     DBGU_PTCR;     // PDC Transfer Control Register
+    AT91_REG     DBGU_PTSR;     // PDC Transfer Status Register
+    AT91_REG     Reserved5[54];     //
+    AT91_REG     PIOA_PER;  // PIO Enable Register
+    AT91_REG     PIOA_PDR;  // PIO Disable Register
+    AT91_REG     PIOA_PSR;  // PIO Status Register
+    AT91_REG     Reserved6[1];  //
+    AT91_REG     PIOA_OER;  // Output Enable Register
+    AT91_REG     PIOA_ODR;  // Output Disable Registerr
+    AT91_REG     PIOA_OSR;  // Output Status Register
+    AT91_REG     Reserved7[1];  //
+    AT91_REG     PIOA_IFER;     // Input Filter Enable Register
+    AT91_REG     PIOA_IFDR;     // Input Filter Disable Register
+    AT91_REG     PIOA_IFSR;     // Input Filter Status Register
+    AT91_REG     Reserved8[1];  //
+    AT91_REG     PIOA_SODR;     // Set Output Data Register
+    AT91_REG     PIOA_CODR;     // Clear Output Data Register
+    AT91_REG     PIOA_ODSR;     // Output Data Status Register
+    AT91_REG     PIOA_PDSR;     // Pin Data Status Register
+    AT91_REG     PIOA_IER;  // Interrupt Enable Register
+    AT91_REG     PIOA_IDR;  // Interrupt Disable Register
+    AT91_REG     PIOA_IMR;  // Interrupt Mask Register
+    AT91_REG     PIOA_ISR;  // Interrupt Status Register
+    AT91_REG     PIOA_MDER;     // Multi-driver Enable Register
+    AT91_REG     PIOA_MDDR;     // Multi-driver Disable Register
+    AT91_REG     PIOA_MDSR;     // Multi-driver Status Register
+    AT91_REG     Reserved9[1];  //
+    AT91_REG     PIOA_PPUDR;    // Pull-up Disable Register
+    AT91_REG     PIOA_PPUER;    // Pull-up Enable Register
+    AT91_REG     PIOA_PPUSR;    // Pull-up Status Register
+    AT91_REG     Reserved10[1];     //
+    AT91_REG     PIOA_ASR;  // Select A Register
+    AT91_REG     PIOA_BSR;  // Select B Register
+    AT91_REG     PIOA_ABSR;     // AB Select Status Register
+    AT91_REG     Reserved11[9];     //
+    AT91_REG     PIOA_OWER;     // Output Write Enable Register
+    AT91_REG     PIOA_OWDR;     // Output Write Disable Register
+    AT91_REG     PIOA_OWSR;     // Output Write Status Register
+    AT91_REG     Reserved12[85];    //
+    AT91_REG     PIOB_PER;  // PIO Enable Register
+    AT91_REG     PIOB_PDR;  // PIO Disable Register
+    AT91_REG     PIOB_PSR;  // PIO Status Register
+    AT91_REG     Reserved13[1];     //
+    AT91_REG     PIOB_OER;  // Output Enable Register
+    AT91_REG     PIOB_ODR;  // Output Disable Registerr
+    AT91_REG     PIOB_OSR;  // Output Status Register
+    AT91_REG     Reserved14[1];     //
+    AT91_REG     PIOB_IFER;     // Input Filter Enable Register
+    AT91_REG     PIOB_IFDR;     // Input Filter Disable Register
+    AT91_REG     PIOB_IFSR;     // Input Filter Status Register
+    AT91_REG     Reserved15[1];     //
+    AT91_REG     PIOB_SODR;     // Set Output Data Register
+    AT91_REG     PIOB_CODR;     // Clear Output Data Register
+    AT91_REG     PIOB_ODSR;     // Output Data Status Register
+    AT91_REG     PIOB_PDSR;     // Pin Data Status Register
+    AT91_REG     PIOB_IER;  // Interrupt Enable Register
+    AT91_REG     PIOB_IDR;  // Interrupt Disable Register
+    AT91_REG     PIOB_IMR;  // Interrupt Mask Register
+    AT91_REG     PIOB_ISR;  // Interrupt Status Register
+    AT91_REG     PIOB_MDER;     // Multi-driver Enable Register
+    AT91_REG     PIOB_MDDR;     // Multi-driver Disable Register
+    AT91_REG     PIOB_MDSR;     // Multi-driver Status Register
+    AT91_REG     Reserved16[1];     //
+    AT91_REG     PIOB_PPUDR;    // Pull-up Disable Register
+    AT91_REG     PIOB_PPUER;    // Pull-up Enable Register
+    AT91_REG     PIOB_PPUSR;    // Pull-up Status Register
+    AT91_REG     Reserved17[1];     //
+    AT91_REG     PIOB_ASR;  // Select A Register
+    AT91_REG     PIOB_BSR;  // Select B Register
+    AT91_REG     PIOB_ABSR;     // AB Select Status Register
+    AT91_REG     Reserved18[9];     //
+    AT91_REG     PIOB_OWER;     // Output Write Enable Register
+    AT91_REG     PIOB_OWDR;     // Output Write Disable Register
+    AT91_REG     PIOB_OWSR;     // Output Write Status Register
+    AT91_REG     Reserved19[341];   //
+    AT91_REG     PMC_SCER;  // System Clock Enable Register
+    AT91_REG     PMC_SCDR;  // System Clock Disable Register
+    AT91_REG     PMC_SCSR;  // System Clock Status Register
+    AT91_REG     Reserved20[1];     //
+    AT91_REG     PMC_PCER;  // Peripheral Clock Enable Register
+    AT91_REG     PMC_PCDR;  // Peripheral Clock Disable Register
+    AT91_REG     PMC_PCSR;  // Peripheral Clock Status Register
+    AT91_REG     Reserved21[1];     //
+    AT91_REG     PMC_MOR;   // Main Oscillator Register
+    AT91_REG     PMC_MCFR;  // Main Clock  Frequency Register
+    AT91_REG     Reserved22[1];     //
+    AT91_REG     PMC_PLLR;  // PLL Register
+    AT91_REG     PMC_MCKR;  // Master Clock Register
+    AT91_REG     Reserved23[3];     //
+    AT91_REG     PMC_PCKR[4];   // Programmable Clock Register
+    AT91_REG     Reserved24[4];     //
+    AT91_REG     PMC_IER;   // Interrupt Enable Register
+    AT91_REG     PMC_IDR;   // Interrupt Disable Register
+    AT91_REG     PMC_SR;    // Status Register
+    AT91_REG     PMC_IMR;   // Interrupt Mask Register
+    AT91_REG     Reserved25[36];    //
+    AT91_REG     RSTC_RCR;  // Reset Control Register
+    AT91_REG     RSTC_RSR;  // Reset Status Register
+    AT91_REG     RSTC_RMR;  // Reset Mode Register
+    AT91_REG     Reserved26[5];     //
+    AT91_REG     RTTC_RTMR;     // Real-time Mode Register
+    AT91_REG     RTTC_RTAR;     // Real-time Alarm Register
+    AT91_REG     RTTC_RTVR;     // Real-time Value Register
+    AT91_REG     RTTC_RTSR;     // Real-time Status Register
+    AT91_REG     PITC_PIMR;     // Period Interval Mode Register
+    AT91_REG     PITC_PISR;     // Period Interval Status Register
+    AT91_REG     PITC_PIVR;     // Period Interval Value Register
+    AT91_REG     PITC_PIIR;     // Period Interval Image Register
+    AT91_REG     WDTC_WDCR;     // Watchdog Control Register
+    AT91_REG     WDTC_WDMR;     // Watchdog Mode Register
+    AT91_REG     WDTC_WDSR;     // Watchdog Status Register
+    AT91_REG     Reserved27[5];     //
+    AT91_REG     VREG_MR;   // Voltage Regulator Mode Register
+} AT91S_SYS, *AT91PS_SYS;
+
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller
+// *****************************************************************************
+typedef struct _AT91S_AIC {
+    AT91_REG     AIC_SMR[32];   // Source Mode Register
+    AT91_REG     AIC_SVR[32];   // Source Vector Register
+    AT91_REG     AIC_IVR;   // IRQ Vector Register
+    AT91_REG     AIC_FVR;   // FIQ Vector Register
+    AT91_REG     AIC_ISR;   // Interrupt Status Register
+    AT91_REG     AIC_IPR;   // Interrupt Pending Register
+    AT91_REG     AIC_IMR;   // Interrupt Mask Register
+    AT91_REG     AIC_CISR;  // Core Interrupt Status Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     AIC_IECR;  // Interrupt Enable Command Register
+    AT91_REG     AIC_IDCR;  // Interrupt Disable Command Register
+    AT91_REG     AIC_ICCR;  // Interrupt Clear Command Register
+    AT91_REG     AIC_ISCR;  // Interrupt Set Command Register
+    AT91_REG     AIC_EOICR;     // End of Interrupt Command Register
+    AT91_REG     AIC_SPU;   // Spurious Vector Register
+    AT91_REG     AIC_DCR;   // Debug Control Register (Protect)
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     AIC_FFER;  // Fast Forcing Enable Register
+    AT91_REG     AIC_FFDR;  // Fast Forcing Disable Register
+    AT91_REG     AIC_FFSR;  // Fast Forcing Status Register
+} AT91S_AIC, *AT91PS_AIC;
+
+// -------- AIC_SMR : (AIC Offset: 0x0) Control Register --------
+#define AT91C_AIC_PRIOR       ((unsigned int) 0x7 <<  0) // (AIC) Priority Level
+#define     AT91C_AIC_PRIOR_LOWEST               ((unsigned int) 0x0) // (AIC) Lowest priority level
+#define     AT91C_AIC_PRIOR_HIGHEST              ((unsigned int) 0x7) // (AIC) Highest priority level
+#define AT91C_AIC_SRCTYPE     ((unsigned int) 0x3 <<  5) // (AIC) Interrupt Source Type
+#define     AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL       ((unsigned int) 0x0 <<  5) // (AIC) Internal Sources Code Label High-level Sensitive
+#define     AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL        ((unsigned int) 0x0 <<  5) // (AIC) External Sources Code Label Low-level Sensitive
+#define     AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE    ((unsigned int) 0x1 <<  5) // (AIC) Internal Sources Code Label Positive Edge triggered
+#define     AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE    ((unsigned int) 0x1 <<  5) // (AIC) External Sources Code Label Negative Edge triggered
+#define     AT91C_AIC_SRCTYPE_HIGH_LEVEL           ((unsigned int) 0x2 <<  5) // (AIC) Internal Or External Sources Code Label High-level Sensitive
+#define     AT91C_AIC_SRCTYPE_POSITIVE_EDGE        ((unsigned int) 0x3 <<  5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered
+// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register --------
+#define AT91C_AIC_NFIQ        ((unsigned int) 0x1 <<  0) // (AIC) NFIQ Status
+#define AT91C_AIC_NIRQ        ((unsigned int) 0x1 <<  1) // (AIC) NIRQ Status
+// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) --------
+#define AT91C_AIC_DCR_PROT    ((unsigned int) 0x1 <<  0) // (AIC) Protection Mode
+#define AT91C_AIC_DCR_GMSK    ((unsigned int) 0x1 <<  1) // (AIC) General Mask
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Peripheral DMA Controller
+// *****************************************************************************
+typedef struct _AT91S_PDC {
+    AT91_REG     PDC_RPR;   // Receive Pointer Register
+    AT91_REG     PDC_RCR;   // Receive Counter Register
+    AT91_REG     PDC_TPR;   // Transmit Pointer Register
+    AT91_REG     PDC_TCR;   // Transmit Counter Register
+    AT91_REG     PDC_RNPR;  // Receive Next Pointer Register
+    AT91_REG     PDC_RNCR;  // Receive Next Counter Register
+    AT91_REG     PDC_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     PDC_TNCR;  // Transmit Next Counter Register
+    AT91_REG     PDC_PTCR;  // PDC Transfer Control Register
+    AT91_REG     PDC_PTSR;  // PDC Transfer Status Register
+} AT91S_PDC, *AT91PS_PDC;
+
+// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register --------
+#define AT91C_PDC_RXTEN       ((unsigned int) 0x1 <<  0) // (PDC) Receiver Transfer Enable
+#define AT91C_PDC_RXTDIS      ((unsigned int) 0x1 <<  1) // (PDC) Receiver Transfer Disable
+#define AT91C_PDC_TXTEN       ((unsigned int) 0x1 <<  8) // (PDC) Transmitter Transfer Enable
+#define AT91C_PDC_TXTDIS      ((unsigned int) 0x1 <<  9) // (PDC) Transmitter Transfer Disable
+// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Debug Unit
+// *****************************************************************************
+typedef struct _AT91S_DBGU {
+    AT91_REG     DBGU_CR;   // Control Register
+    AT91_REG     DBGU_MR;   // Mode Register
+    AT91_REG     DBGU_IER;  // Interrupt Enable Register
+    AT91_REG     DBGU_IDR;  // Interrupt Disable Register
+    AT91_REG     DBGU_IMR;  // Interrupt Mask Register
+    AT91_REG     DBGU_CSR;  // Channel Status Register
+    AT91_REG     DBGU_RHR;  // Receiver Holding Register
+    AT91_REG     DBGU_THR;  // Transmitter Holding Register
+    AT91_REG     DBGU_BRGR;     // Baud Rate Generator Register
+    AT91_REG     Reserved0[7];  //
+    AT91_REG     DBGU_CIDR;     // Chip ID Register
+    AT91_REG     DBGU_EXID;     // Chip ID Extension Register
+    AT91_REG     DBGU_FNTR;     // Force NTRST Register
+    AT91_REG     Reserved1[45];     //
+    AT91_REG     DBGU_RPR;  // Receive Pointer Register
+    AT91_REG     DBGU_RCR;  // Receive Counter Register
+    AT91_REG     DBGU_TPR;  // Transmit Pointer Register
+    AT91_REG     DBGU_TCR;  // Transmit Counter Register
+    AT91_REG     DBGU_RNPR;     // Receive Next Pointer Register
+    AT91_REG     DBGU_RNCR;     // Receive Next Counter Register
+    AT91_REG     DBGU_TNPR;     // Transmit Next Pointer Register
+    AT91_REG     DBGU_TNCR;     // Transmit Next Counter Register
+    AT91_REG     DBGU_PTCR;     // PDC Transfer Control Register
+    AT91_REG     DBGU_PTSR;     // PDC Transfer Status Register
+} AT91S_DBGU, *AT91PS_DBGU;
+
+// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_RSTRX        ((unsigned int) 0x1 <<  2) // (DBGU) Reset Receiver
+#define AT91C_US_RSTTX        ((unsigned int) 0x1 <<  3) // (DBGU) Reset Transmitter
+#define AT91C_US_RXEN         ((unsigned int) 0x1 <<  4) // (DBGU) Receiver Enable
+#define AT91C_US_RXDIS        ((unsigned int) 0x1 <<  5) // (DBGU) Receiver Disable
+#define AT91C_US_TXEN         ((unsigned int) 0x1 <<  6) // (DBGU) Transmitter Enable
+#define AT91C_US_TXDIS        ((unsigned int) 0x1 <<  7) // (DBGU) Transmitter Disable
+#define AT91C_US_RSTSTA       ((unsigned int) 0x1 <<  8) // (DBGU) Reset Status Bits
+// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_PAR          ((unsigned int) 0x7 <<  9) // (DBGU) Parity type
+#define     AT91C_US_PAR_EVEN                 ((unsigned int) 0x0 <<  9) // (DBGU) Even Parity
+#define     AT91C_US_PAR_ODD                  ((unsigned int) 0x1 <<  9) // (DBGU) Odd Parity
+#define     AT91C_US_PAR_SPACE                ((unsigned int) 0x2 <<  9) // (DBGU) Parity forced to 0 (Space)
+#define     AT91C_US_PAR_MARK                 ((unsigned int) 0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)
+#define     AT91C_US_PAR_NONE                 ((unsigned int) 0x4 <<  9) // (DBGU) No Parity
+#define     AT91C_US_PAR_MULTI_DROP           ((unsigned int) 0x6 <<  9) // (DBGU) Multi-drop mode
+#define AT91C_US_CHMODE       ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode
+#define     AT91C_US_CHMODE_NORMAL               ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.
+#define     AT91C_US_CHMODE_AUTO                 ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.
+#define     AT91C_US_CHMODE_LOCAL                ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.
+#define     AT91C_US_CHMODE_REMOTE               ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.
+// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXRDY        ((unsigned int) 0x1 <<  0) // (DBGU) RXRDY Interrupt
+#define AT91C_US_TXRDY        ((unsigned int) 0x1 <<  1) // (DBGU) TXRDY Interrupt
+#define AT91C_US_ENDRX        ((unsigned int) 0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt
+#define AT91C_US_ENDTX        ((unsigned int) 0x1 <<  4) // (DBGU) End of Transmit Interrupt
+#define AT91C_US_OVRE         ((unsigned int) 0x1 <<  5) // (DBGU) Overrun Interrupt
+#define AT91C_US_FRAME        ((unsigned int) 0x1 <<  6) // (DBGU) Framing Error Interrupt
+#define AT91C_US_PARE         ((unsigned int) 0x1 <<  7) // (DBGU) Parity Error Interrupt
+#define AT91C_US_TXEMPTY      ((unsigned int) 0x1 <<  9) // (DBGU) TXEMPTY Interrupt
+#define AT91C_US_TXBUFE       ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt
+#define AT91C_US_RXBUFF       ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt
+#define AT91C_US_COMM_TX      ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt
+#define AT91C_US_COMM_RX      ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt
+// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register --------
+// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register --------
+#define AT91C_US_FORCE_NTRST  ((unsigned int) 0x1 <<  0) // (DBGU) Force NTRST in JTAG
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler
+// *****************************************************************************
+typedef struct _AT91S_PIO {
+    AT91_REG     PIO_PER;   // PIO Enable Register
+    AT91_REG     PIO_PDR;   // PIO Disable Register
+    AT91_REG     PIO_PSR;   // PIO Status Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     PIO_OER;   // Output Enable Register
+    AT91_REG     PIO_ODR;   // Output Disable Registerr
+    AT91_REG     PIO_OSR;   // Output Status Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     PIO_IFER;  // Input Filter Enable Register
+    AT91_REG     PIO_IFDR;  // Input Filter Disable Register
+    AT91_REG     PIO_IFSR;  // Input Filter Status Register
+    AT91_REG     Reserved2[1];  //
+    AT91_REG     PIO_SODR;  // Set Output Data Register
+    AT91_REG     PIO_CODR;  // Clear Output Data Register
+    AT91_REG     PIO_ODSR;  // Output Data Status Register
+    AT91_REG     PIO_PDSR;  // Pin Data Status Register
+    AT91_REG     PIO_IER;   // Interrupt Enable Register
+    AT91_REG     PIO_IDR;   // Interrupt Disable Register
+    AT91_REG     PIO_IMR;   // Interrupt Mask Register
+    AT91_REG     PIO_ISR;   // Interrupt Status Register
+    AT91_REG     PIO_MDER;  // Multi-driver Enable Register
+    AT91_REG     PIO_MDDR;  // Multi-driver Disable Register
+    AT91_REG     PIO_MDSR;  // Multi-driver Status Register
+    AT91_REG     Reserved3[1];  //
+    AT91_REG     PIO_PPUDR;     // Pull-up Disable Register
+    AT91_REG     PIO_PPUER;     // Pull-up Enable Register
+    AT91_REG     PIO_PPUSR;     // Pull-up Status Register
+    AT91_REG     Reserved4[1];  //
+    AT91_REG     PIO_ASR;   // Select A Register
+    AT91_REG     PIO_BSR;   // Select B Register
+    AT91_REG     PIO_ABSR;  // AB Select Status Register
+    AT91_REG     Reserved5[9];  //
+    AT91_REG     PIO_OWER;  // Output Write Enable Register
+    AT91_REG     PIO_OWDR;  // Output Write Disable Register
+    AT91_REG     PIO_OWSR;  // Output Write Status Register
+} AT91S_PIO, *AT91PS_PIO;
+
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Clock Generator Controler
+// *****************************************************************************
+typedef struct _AT91S_CKGR {
+    AT91_REG     CKGR_MOR;  // Main Oscillator Register
+    AT91_REG     CKGR_MCFR;     // Main Clock  Frequency Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     CKGR_PLLR;     // PLL Register
+} AT91S_CKGR, *AT91PS_CKGR;
+
+// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register --------
+#define AT91C_CKGR_MOSCEN     ((unsigned int) 0x1 <<  0) // (CKGR) Main Oscillator Enable
+#define AT91C_CKGR_OSCBYPASS  ((unsigned int) 0x1 <<  1) // (CKGR) Main Oscillator Bypass
+#define AT91C_CKGR_OSCOUNT    ((unsigned int) 0xFF <<  8) // (CKGR) Main Oscillator Start-up Time
+// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register --------
+#define AT91C_CKGR_MAINF      ((unsigned int) 0xFFFF <<  0) // (CKGR) Main Clock Frequency
+#define AT91C_CKGR_MAINRDY    ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready
+// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register --------
+#define AT91C_CKGR_DIV        ((unsigned int) 0xFF <<  0) // (CKGR) Divider Selected
+#define     AT91C_CKGR_DIV_0                    ((unsigned int) 0x0) // (CKGR) Divider output is 0
+#define     AT91C_CKGR_DIV_BYPASS               ((unsigned int) 0x1) // (CKGR) Divider is bypassed
+#define AT91C_CKGR_PLLCOUNT   ((unsigned int) 0x3F <<  8) // (CKGR) PLL Counter
+#define AT91C_CKGR_OUT        ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range
+#define     AT91C_CKGR_OUT_0                    ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_1                    ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_2                    ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_3                    ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet
+#define AT91C_CKGR_MUL        ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier
+#define AT91C_CKGR_USBDIV     ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks
+#define     AT91C_CKGR_USBDIV_0                    ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output
+#define     AT91C_CKGR_USBDIV_1                    ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2
+#define     AT91C_CKGR_USBDIV_2                    ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Power Management Controler
+// *****************************************************************************
+typedef struct _AT91S_PMC {
+    AT91_REG     PMC_SCER;  // System Clock Enable Register
+    AT91_REG     PMC_SCDR;  // System Clock Disable Register
+    AT91_REG     PMC_SCSR;  // System Clock Status Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     PMC_PCER;  // Peripheral Clock Enable Register
+    AT91_REG     PMC_PCDR;  // Peripheral Clock Disable Register
+    AT91_REG     PMC_PCSR;  // Peripheral Clock Status Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     PMC_MOR;   // Main Oscillator Register
+    AT91_REG     PMC_MCFR;  // Main Clock  Frequency Register
+    AT91_REG     Reserved2[1];  //
+    AT91_REG     PMC_PLLR;  // PLL Register
+    AT91_REG     PMC_MCKR;  // Master Clock Register
+    AT91_REG     Reserved3[3];  //
+    AT91_REG     PMC_PCKR[4];   // Programmable Clock Register
+    AT91_REG     Reserved4[4];  //
+    AT91_REG     PMC_IER;   // Interrupt Enable Register
+    AT91_REG     PMC_IDR;   // Interrupt Disable Register
+    AT91_REG     PMC_SR;    // Status Register
+    AT91_REG     PMC_IMR;   // Interrupt Mask Register
+} AT91S_PMC, *AT91PS_PMC;
+
+// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register --------
+#define AT91C_PMC_PCK         ((unsigned int) 0x1 <<  0) // (PMC) Processor Clock
+#define AT91C_PMC_UDP         ((unsigned int) 0x1 <<  7) // (PMC) USB Device Port Clock
+#define AT91C_PMC_PCK0        ((unsigned int) 0x1 <<  8) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK1        ((unsigned int) 0x1 <<  9) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK2        ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK3        ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output
+// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register --------
+// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register --------
+// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register --------
+// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register --------
+// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register --------
+// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register --------
+#define AT91C_PMC_CSS         ((unsigned int) 0x3 <<  0) // (PMC) Programmable Clock Selection
+#define     AT91C_PMC_CSS_SLOW_CLK             ((unsigned int) 0x0) // (PMC) Slow Clock is selected
+#define     AT91C_PMC_CSS_MAIN_CLK             ((unsigned int) 0x1) // (PMC) Main Clock is selected
+#define     AT91C_PMC_CSS_PLL_CLK              ((unsigned int) 0x3) // (PMC) Clock from PLL is selected
+#define AT91C_PMC_PRES        ((unsigned int) 0x7 <<  2) // (PMC) Programmable Clock Prescaler
+#define     AT91C_PMC_PRES_CLK                  ((unsigned int) 0x0 <<  2) // (PMC) Selected clock
+#define     AT91C_PMC_PRES_CLK_2                ((unsigned int) 0x1 <<  2) // (PMC) Selected clock divided by 2
+#define     AT91C_PMC_PRES_CLK_4                ((unsigned int) 0x2 <<  2) // (PMC) Selected clock divided by 4
+#define     AT91C_PMC_PRES_CLK_8                ((unsigned int) 0x3 <<  2) // (PMC) Selected clock divided by 8
+#define     AT91C_PMC_PRES_CLK_16               ((unsigned int) 0x4 <<  2) // (PMC) Selected clock divided by 16
+#define     AT91C_PMC_PRES_CLK_32               ((unsigned int) 0x5 <<  2) // (PMC) Selected clock divided by 32
+#define     AT91C_PMC_PRES_CLK_64               ((unsigned int) 0x6 <<  2) // (PMC) Selected clock divided by 64
+// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register --------
+// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register --------
+#define AT91C_PMC_MOSCS       ((unsigned int) 0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask
+#define AT91C_PMC_LOCK        ((unsigned int) 0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask
+#define AT91C_PMC_MCKRDY      ((unsigned int) 0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK0RDY     ((unsigned int) 0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK1RDY     ((unsigned int) 0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK2RDY     ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK3RDY     ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask
+// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register --------
+// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register --------
+// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Reset Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_RSTC {
+    AT91_REG     RSTC_RCR;  // Reset Control Register
+    AT91_REG     RSTC_RSR;  // Reset Status Register
+    AT91_REG     RSTC_RMR;  // Reset Mode Register
+} AT91S_RSTC, *AT91PS_RSTC;
+
+// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register --------
+#define AT91C_RSTC_PROCRST    ((unsigned int) 0x1 <<  0) // (RSTC) Processor Reset
+#define AT91C_RSTC_PERRST     ((unsigned int) 0x1 <<  2) // (RSTC) Peripheral Reset
+#define AT91C_RSTC_EXTRST     ((unsigned int) 0x1 <<  3) // (RSTC) External Reset
+#define AT91C_RSTC_KEY        ((unsigned int) 0xFF << 24) // (RSTC) Password
+// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register --------
+#define AT91C_RSTC_URSTS      ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Status
+#define AT91C_RSTC_BODSTS     ((unsigned int) 0x1 <<  1) // (RSTC) Brownout Detection Status
+#define AT91C_RSTC_RSTTYP     ((unsigned int) 0x7 <<  8) // (RSTC) Reset Type
+#define     AT91C_RSTC_RSTTYP_POWERUP              ((unsigned int) 0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.
+#define     AT91C_RSTC_RSTTYP_WAKEUP               ((unsigned int) 0x1 <<  8) // (RSTC) WakeUp Reset. VDDCORE rising.
+#define     AT91C_RSTC_RSTTYP_WATCHDOG             ((unsigned int) 0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.
+#define     AT91C_RSTC_RSTTYP_SOFTWARE             ((unsigned int) 0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.
+#define     AT91C_RSTC_RSTTYP_USER                 ((unsigned int) 0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.
+#define     AT91C_RSTC_RSTTYP_BROWNOUT             ((unsigned int) 0x5 <<  8) // (RSTC) Brownout Reset occured.
+#define AT91C_RSTC_NRSTL      ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level
+#define AT91C_RSTC_SRCMP      ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress.
+// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register --------
+#define AT91C_RSTC_URSTEN     ((unsigned int) 0x1 <<  0) // (RSTC) User Reset Enable
+#define AT91C_RSTC_URSTIEN    ((unsigned int) 0x1 <<  4) // (RSTC) User Reset Interrupt Enable
+#define AT91C_RSTC_ERSTL      ((unsigned int) 0xF <<  8) // (RSTC) User Reset Enable
+#define AT91C_RSTC_BODIEN     ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_RTTC {
+    AT91_REG     RTTC_RTMR;     // Real-time Mode Register
+    AT91_REG     RTTC_RTAR;     // Real-time Alarm Register
+    AT91_REG     RTTC_RTVR;     // Real-time Value Register
+    AT91_REG     RTTC_RTSR;     // Real-time Status Register
+} AT91S_RTTC, *AT91PS_RTTC;
+
+// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register --------
+#define AT91C_RTTC_RTPRES     ((unsigned int) 0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value
+#define AT91C_RTTC_ALMIEN     ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable
+#define AT91C_RTTC_RTTINCIEN  ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable
+#define AT91C_RTTC_RTTRST     ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart
+// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register --------
+#define AT91C_RTTC_ALMV       ((unsigned int) 0x0 <<  0) // (RTTC) Alarm Value
+// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register --------
+#define AT91C_RTTC_CRTV       ((unsigned int) 0x0 <<  0) // (RTTC) Current Real-time Value
+// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register --------
+#define AT91C_RTTC_ALMS       ((unsigned int) 0x1 <<  0) // (RTTC) Real-time Alarm Status
+#define AT91C_RTTC_RTTINC     ((unsigned int) 0x1 <<  1) // (RTTC) Real-time Timer Increment
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_PITC {
+    AT91_REG     PITC_PIMR;     // Period Interval Mode Register
+    AT91_REG     PITC_PISR;     // Period Interval Status Register
+    AT91_REG     PITC_PIVR;     // Period Interval Value Register
+    AT91_REG     PITC_PIIR;     // Period Interval Image Register
+} AT91S_PITC, *AT91PS_PITC;
+
+// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register --------
+#define AT91C_PITC_PIV        ((unsigned int) 0xFFFFF <<  0) // (PITC) Periodic Interval Value
+#define AT91C_PITC_PITEN      ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled
+#define AT91C_PITC_PITIEN     ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable
+// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register --------
+#define AT91C_PITC_PITS       ((unsigned int) 0x1 <<  0) // (PITC) Periodic Interval Timer Status
+// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register --------
+#define AT91C_PITC_CPIV       ((unsigned int) 0xFFFFF <<  0) // (PITC) Current Periodic Interval Value
+#define AT91C_PITC_PICNT      ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter
+// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_WDTC {
+    AT91_REG     WDTC_WDCR;     // Watchdog Control Register
+    AT91_REG     WDTC_WDMR;     // Watchdog Mode Register
+    AT91_REG     WDTC_WDSR;     // Watchdog Status Register
+} AT91S_WDTC, *AT91PS_WDTC;
+
+// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register --------
+#define AT91C_WDTC_WDRSTT     ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Restart
+#define AT91C_WDTC_KEY        ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password
+// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register --------
+#define AT91C_WDTC_WDV        ((unsigned int) 0xFFF <<  0) // (WDTC) Watchdog Timer Restart
+#define AT91C_WDTC_WDFIEN     ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable
+#define AT91C_WDTC_WDRSTEN    ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable
+#define AT91C_WDTC_WDRPROC    ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart
+#define AT91C_WDTC_WDDIS      ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable
+#define AT91C_WDTC_WDD        ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value
+#define AT91C_WDTC_WDDBGHLT   ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt
+#define AT91C_WDTC_WDIDLEHLT  ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt
+// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register --------
+#define AT91C_WDTC_WDUNF      ((unsigned int) 0x1 <<  0) // (WDTC) Watchdog Underflow
+#define AT91C_WDTC_WDERR      ((unsigned int) 0x1 <<  1) // (WDTC) Watchdog Error
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Voltage Regulator Mode Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_VREG {
+    AT91_REG     VREG_MR;   // Voltage Regulator Mode Register
+} AT91S_VREG, *AT91PS_VREG;
+
+// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register --------
+#define AT91C_VREG_PSTDBY     ((unsigned int) 0x1 <<  0) // (VREG) Voltage Regulator Power Standby Mode
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Memory Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_MC {
+    AT91_REG     MC_RCR;    // MC Remap Control Register
+    AT91_REG     MC_ASR;    // MC Abort Status Register
+    AT91_REG     MC_AASR;   // MC Abort Address Status Register
+    AT91_REG     Reserved0[21];     //
+    AT91_REG     MC_FMR;    // MC Flash Mode Register
+    AT91_REG     MC_FCR;    // MC Flash Command Register
+    AT91_REG     MC_FSR;    // MC Flash Status Register
+} AT91S_MC, *AT91PS_MC;
+
+// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register --------
+#define AT91C_MC_RCB          ((unsigned int) 0x1 <<  0) // (MC) Remap Command Bit
+// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register --------
+#define AT91C_MC_UNDADD       ((unsigned int) 0x1 <<  0) // (MC) Undefined Addess Abort Status
+#define AT91C_MC_MISADD       ((unsigned int) 0x1 <<  1) // (MC) Misaligned Addess Abort Status
+#define AT91C_MC_ABTSZ        ((unsigned int) 0x3 <<  8) // (MC) Abort Size Status
+#define     AT91C_MC_ABTSZ_BYTE                 ((unsigned int) 0x0 <<  8) // (MC) Byte
+#define     AT91C_MC_ABTSZ_HWORD                ((unsigned int) 0x1 <<  8) // (MC) Half-word
+#define     AT91C_MC_ABTSZ_WORD                 ((unsigned int) 0x2 <<  8) // (MC) Word
+#define AT91C_MC_ABTTYP       ((unsigned int) 0x3 << 10) // (MC) Abort Type Status
+#define     AT91C_MC_ABTTYP_DATAR                ((unsigned int) 0x0 << 10) // (MC) Data Read
+#define     AT91C_MC_ABTTYP_DATAW                ((unsigned int) 0x1 << 10) // (MC) Data Write
+#define     AT91C_MC_ABTTYP_FETCH                ((unsigned int) 0x2 << 10) // (MC) Code Fetch
+#define AT91C_MC_MST0         ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source
+#define AT91C_MC_MST1         ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source
+#define AT91C_MC_SVMST0       ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source
+#define AT91C_MC_SVMST1       ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source
+// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register --------
+#define AT91C_MC_FRDY         ((unsigned int) 0x1 <<  0) // (MC) Flash Ready
+#define AT91C_MC_LOCKE        ((unsigned int) 0x1 <<  2) // (MC) Lock Error
+#define AT91C_MC_PROGE        ((unsigned int) 0x1 <<  3) // (MC) Programming Error
+#define AT91C_MC_NEBP         ((unsigned int) 0x1 <<  7) // (MC) No Erase Before Programming
+#define AT91C_MC_FWS          ((unsigned int) 0x3 <<  8) // (MC) Flash Wait State
+#define     AT91C_MC_FWS_0FWS                 ((unsigned int) 0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations
+#define     AT91C_MC_FWS_1FWS                 ((unsigned int) 0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations
+#define     AT91C_MC_FWS_2FWS                 ((unsigned int) 0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations
+#define     AT91C_MC_FWS_3FWS                 ((unsigned int) 0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations
+#define AT91C_MC_FMCN         ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number
+// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register --------
+#define AT91C_MC_FCMD         ((unsigned int) 0xF <<  0) // (MC) Flash Command
+#define     AT91C_MC_FCMD_START_PROG           ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN.
+#define     AT91C_MC_FCMD_LOCK                 ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_PROG_AND_LOCK        ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.
+#define     AT91C_MC_FCMD_UNLOCK               ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_ERASE_ALL            ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.
+#define     AT91C_MC_FCMD_SET_GP_NVM           ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits.
+#define     AT91C_MC_FCMD_CLR_GP_NVM           ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits.
+#define     AT91C_MC_FCMD_SET_SECURITY         ((unsigned int) 0xF) // (MC) Set Security Bit.
+#define AT91C_MC_PAGEN        ((unsigned int) 0x3FF <<  8) // (MC) Page Number
+#define AT91C_MC_KEY          ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key
+// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register --------
+#define AT91C_MC_SECURITY     ((unsigned int) 0x1 <<  4) // (MC) Security Bit Status
+#define AT91C_MC_GPNVM0       ((unsigned int) 0x1 <<  8) // (MC) Sector 0 Lock Status
+#define AT91C_MC_GPNVM1       ((unsigned int) 0x1 <<  9) // (MC) Sector 1 Lock Status
+#define AT91C_MC_GPNVM2       ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status
+#define AT91C_MC_GPNVM3       ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status
+#define AT91C_MC_GPNVM4       ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status
+#define AT91C_MC_GPNVM5       ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status
+#define AT91C_MC_GPNVM6       ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status
+#define AT91C_MC_GPNVM7       ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS0       ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status
+#define AT91C_MC_LOCKS1       ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status
+#define AT91C_MC_LOCKS2       ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status
+#define AT91C_MC_LOCKS3       ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status
+#define AT91C_MC_LOCKS4       ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status
+#define AT91C_MC_LOCKS5       ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status
+#define AT91C_MC_LOCKS6       ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status
+#define AT91C_MC_LOCKS7       ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS8       ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status
+#define AT91C_MC_LOCKS9       ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status
+#define AT91C_MC_LOCKS10      ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status
+#define AT91C_MC_LOCKS11      ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status
+#define AT91C_MC_LOCKS12      ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status
+#define AT91C_MC_LOCKS13      ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status
+#define AT91C_MC_LOCKS14      ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status
+#define AT91C_MC_LOCKS15      ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface
+// *****************************************************************************
+typedef struct _AT91S_SPI {
+    AT91_REG     SPI_CR;    // Control Register
+    AT91_REG     SPI_MR;    // Mode Register
+    AT91_REG     SPI_RDR;   // Receive Data Register
+    AT91_REG     SPI_TDR;   // Transmit Data Register
+    AT91_REG     SPI_SR;    // Status Register
+    AT91_REG     SPI_IER;   // Interrupt Enable Register
+    AT91_REG     SPI_IDR;   // Interrupt Disable Register
+    AT91_REG     SPI_IMR;   // Interrupt Mask Register
+    AT91_REG     Reserved0[4];  //
+    AT91_REG     SPI_CSR[4];    // Chip Select Register
+    AT91_REG     Reserved1[48];     //
+    AT91_REG     SPI_RPR;   // Receive Pointer Register
+    AT91_REG     SPI_RCR;   // Receive Counter Register
+    AT91_REG     SPI_TPR;   // Transmit Pointer Register
+    AT91_REG     SPI_TCR;   // Transmit Counter Register
+    AT91_REG     SPI_RNPR;  // Receive Next Pointer Register
+    AT91_REG     SPI_RNCR;  // Receive Next Counter Register
+    AT91_REG     SPI_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     SPI_TNCR;  // Transmit Next Counter Register
+    AT91_REG     SPI_PTCR;  // PDC Transfer Control Register
+    AT91_REG     SPI_PTSR;  // PDC Transfer Status Register
+} AT91S_SPI, *AT91PS_SPI;
+
+// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register --------
+#define AT91C_SPI_SPIEN       ((unsigned int) 0x1 <<  0) // (SPI) SPI Enable
+#define AT91C_SPI_SPIDIS      ((unsigned int) 0x1 <<  1) // (SPI) SPI Disable
+#define AT91C_SPI_SWRST       ((unsigned int) 0x1 <<  7) // (SPI) SPI Software reset
+#define AT91C_SPI_LASTXFER    ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer
+// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register --------
+#define AT91C_SPI_MSTR        ((unsigned int) 0x1 <<  0) // (SPI) Master/Slave Mode
+#define AT91C_SPI_PS          ((unsigned int) 0x1 <<  1) // (SPI) Peripheral Select
+#define     AT91C_SPI_PS_FIXED                ((unsigned int) 0x0 <<  1) // (SPI) Fixed Peripheral Select
+#define     AT91C_SPI_PS_VARIABLE             ((unsigned int) 0x1 <<  1) // (SPI) Variable Peripheral Select
+#define AT91C_SPI_PCSDEC      ((unsigned int) 0x1 <<  2) // (SPI) Chip Select Decode
+#define AT91C_SPI_FDIV        ((unsigned int) 0x1 <<  3) // (SPI) Clock Selection
+#define AT91C_SPI_MODFDIS     ((unsigned int) 0x1 <<  4) // (SPI) Mode Fault Detection
+#define AT91C_SPI_LLB         ((unsigned int) 0x1 <<  7) // (SPI) Clock Selection
+#define AT91C_SPI_PCS         ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select
+#define AT91C_SPI_DLYBCS      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects
+// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register --------
+#define AT91C_SPI_RD          ((unsigned int) 0xFFFF <<  0) // (SPI) Receive Data
+#define AT91C_SPI_RPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register --------
+#define AT91C_SPI_TD          ((unsigned int) 0xFFFF <<  0) // (SPI) Transmit Data
+#define AT91C_SPI_TPCS        ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_SR : (SPI Offset: 0x10) Status Register --------
+#define AT91C_SPI_RDRF        ((unsigned int) 0x1 <<  0) // (SPI) Receive Data Register Full
+#define AT91C_SPI_TDRE        ((unsigned int) 0x1 <<  1) // (SPI) Transmit Data Register Empty
+#define AT91C_SPI_MODF        ((unsigned int) 0x1 <<  2) // (SPI) Mode Fault Error
+#define AT91C_SPI_OVRES       ((unsigned int) 0x1 <<  3) // (SPI) Overrun Error Status
+#define AT91C_SPI_ENDRX       ((unsigned int) 0x1 <<  4) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_ENDTX       ((unsigned int) 0x1 <<  5) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_RXBUFF      ((unsigned int) 0x1 <<  6) // (SPI) RXBUFF Interrupt
+#define AT91C_SPI_TXBUFE      ((unsigned int) 0x1 <<  7) // (SPI) TXBUFE Interrupt
+#define AT91C_SPI_NSSR        ((unsigned int) 0x1 <<  8) // (SPI) NSSR Interrupt
+#define AT91C_SPI_TXEMPTY     ((unsigned int) 0x1 <<  9) // (SPI) TXEMPTY Interrupt
+#define AT91C_SPI_SPIENS      ((unsigned int) 0x1 << 16) // (SPI) Enable Status
+// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register --------
+// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register --------
+// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register --------
+// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register --------
+#define AT91C_SPI_CPOL        ((unsigned int) 0x1 <<  0) // (SPI) Clock Polarity
+#define AT91C_SPI_NCPHA       ((unsigned int) 0x1 <<  1) // (SPI) Clock Phase
+#define AT91C_SPI_CSAAT       ((unsigned int) 0x1 <<  3) // (SPI) Chip Select Active After Transfer
+#define AT91C_SPI_BITS        ((unsigned int) 0xF <<  4) // (SPI) Bits Per Transfer
+#define     AT91C_SPI_BITS_8                    ((unsigned int) 0x0 <<  4) // (SPI) 8 Bits Per transfer
+#define     AT91C_SPI_BITS_9                    ((unsigned int) 0x1 <<  4) // (SPI) 9 Bits Per transfer
+#define     AT91C_SPI_BITS_10                   ((unsigned int) 0x2 <<  4) // (SPI) 10 Bits Per transfer
+#define     AT91C_SPI_BITS_11                   ((unsigned int) 0x3 <<  4) // (SPI) 11 Bits Per transfer
+#define     AT91C_SPI_BITS_12                   ((unsigned int) 0x4 <<  4) // (SPI) 12 Bits Per transfer
+#define     AT91C_SPI_BITS_13                   ((unsigned int) 0x5 <<  4) // (SPI) 13 Bits Per transfer
+#define     AT91C_SPI_BITS_14                   ((unsigned int) 0x6 <<  4) // (SPI) 14 Bits Per transfer
+#define     AT91C_SPI_BITS_15                   ((unsigned int) 0x7 <<  4) // (SPI) 15 Bits Per transfer
+#define     AT91C_SPI_BITS_16                   ((unsigned int) 0x8 <<  4) // (SPI) 16 Bits Per transfer
+#define AT91C_SPI_SCBR        ((unsigned int) 0xFF <<  8) // (SPI) Serial Clock Baud Rate
+#define AT91C_SPI_DLYBS       ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK
+#define AT91C_SPI_DLYBCT      ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Usart
+// *****************************************************************************
+typedef struct _AT91S_USART {
+    AT91_REG     US_CR;     // Control Register
+    AT91_REG     US_MR;     // Mode Register
+    AT91_REG     US_IER;    // Interrupt Enable Register
+    AT91_REG     US_IDR;    // Interrupt Disable Register
+    AT91_REG     US_IMR;    // Interrupt Mask Register
+    AT91_REG     US_CSR;    // Channel Status Register
+    AT91_REG     US_RHR;    // Receiver Holding Register
+    AT91_REG     US_THR;    // Transmitter Holding Register
+    AT91_REG     US_BRGR;   // Baud Rate Generator Register
+    AT91_REG     US_RTOR;   // Receiver Time-out Register
+    AT91_REG     US_TTGR;   // Transmitter Time-guard Register
+    AT91_REG     Reserved0[5];  //
+    AT91_REG     US_FIDI;   // FI_DI_Ratio Register
+    AT91_REG     US_NER;    // Nb Errors Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     US_IF;     // IRDA_FILTER Register
+    AT91_REG     Reserved2[44];     //
+    AT91_REG     US_RPR;    // Receive Pointer Register
+    AT91_REG     US_RCR;    // Receive Counter Register
+    AT91_REG     US_TPR;    // Transmit Pointer Register
+    AT91_REG     US_TCR;    // Transmit Counter Register
+    AT91_REG     US_RNPR;   // Receive Next Pointer Register
+    AT91_REG     US_RNCR;   // Receive Next Counter Register
+    AT91_REG     US_TNPR;   // Transmit Next Pointer Register
+    AT91_REG     US_TNCR;   // Transmit Next Counter Register
+    AT91_REG     US_PTCR;   // PDC Transfer Control Register
+    AT91_REG     US_PTSR;   // PDC Transfer Status Register
+} AT91S_USART, *AT91PS_USART;
+
+// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_STTBRK       ((unsigned int) 0x1 <<  9) // (USART) Start Break
+#define AT91C_US_STPBRK       ((unsigned int) 0x1 << 10) // (USART) Stop Break
+#define AT91C_US_STTTO        ((unsigned int) 0x1 << 11) // (USART) Start Time-out
+#define AT91C_US_SENDA        ((unsigned int) 0x1 << 12) // (USART) Send Address
+#define AT91C_US_RSTIT        ((unsigned int) 0x1 << 13) // (USART) Reset Iterations
+#define AT91C_US_RSTNACK      ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge
+#define AT91C_US_RETTO        ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out
+#define AT91C_US_DTREN        ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable
+#define AT91C_US_DTRDIS       ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable
+#define AT91C_US_RTSEN        ((unsigned int) 0x1 << 18) // (USART) Request to Send enable
+#define AT91C_US_RTSDIS       ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable
+// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_USMODE       ((unsigned int) 0xF <<  0) // (USART) Usart mode
+#define     AT91C_US_USMODE_NORMAL               ((unsigned int) 0x0) // (USART) Normal
+#define     AT91C_US_USMODE_RS485                ((unsigned int) 0x1) // (USART) RS485
+#define     AT91C_US_USMODE_HWHSH                ((unsigned int) 0x2) // (USART) Hardware Handshaking
+#define     AT91C_US_USMODE_MODEM                ((unsigned int) 0x3) // (USART) Modem
+#define     AT91C_US_USMODE_ISO7816_0            ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0
+#define     AT91C_US_USMODE_ISO7816_1            ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1
+#define     AT91C_US_USMODE_IRDA                 ((unsigned int) 0x8) // (USART) IrDA
+#define     AT91C_US_USMODE_SWHSH                ((unsigned int) 0xC) // (USART) Software Handshaking
+#define AT91C_US_CLKS         ((unsigned int) 0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CLKS_CLOCK                ((unsigned int) 0x0 <<  4) // (USART) Clock
+#define     AT91C_US_CLKS_FDIV1                ((unsigned int) 0x1 <<  4) // (USART) fdiv1
+#define     AT91C_US_CLKS_SLOW                 ((unsigned int) 0x2 <<  4) // (USART) slow_clock (ARM)
+#define     AT91C_US_CLKS_EXT                  ((unsigned int) 0x3 <<  4) // (USART) External (SCK)
+#define AT91C_US_CHRL         ((unsigned int) 0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CHRL_5_BITS               ((unsigned int) 0x0 <<  6) // (USART) Character Length: 5 bits
+#define     AT91C_US_CHRL_6_BITS               ((unsigned int) 0x1 <<  6) // (USART) Character Length: 6 bits
+#define     AT91C_US_CHRL_7_BITS               ((unsigned int) 0x2 <<  6) // (USART) Character Length: 7 bits
+#define     AT91C_US_CHRL_8_BITS               ((unsigned int) 0x3 <<  6) // (USART) Character Length: 8 bits
+#define AT91C_US_SYNC         ((unsigned int) 0x1 <<  8) // (USART) Synchronous Mode Select
+#define AT91C_US_NBSTOP       ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits
+#define     AT91C_US_NBSTOP_1_BIT                ((unsigned int) 0x0 << 12) // (USART) 1 stop bit
+#define     AT91C_US_NBSTOP_15_BIT               ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits
+#define     AT91C_US_NBSTOP_2_BIT                ((unsigned int) 0x2 << 12) // (USART) 2 stop bits
+#define AT91C_US_MSBF         ((unsigned int) 0x1 << 16) // (USART) Bit Order
+#define AT91C_US_MODE9        ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length
+#define AT91C_US_CKLO         ((unsigned int) 0x1 << 18) // (USART) Clock Output Select
+#define AT91C_US_OVER         ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode
+#define AT91C_US_INACK        ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge
+#define AT91C_US_DSNACK       ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK
+#define AT91C_US_MAX_ITER     ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions
+#define AT91C_US_FILTER       ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter
+// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXBRK        ((unsigned int) 0x1 <<  2) // (USART) Break Received/End of Break
+#define AT91C_US_TIMEOUT      ((unsigned int) 0x1 <<  8) // (USART) Receiver Time-out
+#define AT91C_US_ITERATION    ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached
+#define AT91C_US_NACK         ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge
+#define AT91C_US_RIIC         ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag
+#define AT91C_US_DSRIC        ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag
+#define AT91C_US_DCDIC        ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag
+#define AT91C_US_CTSIC        ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag
+// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register --------
+#define AT91C_US_RI           ((unsigned int) 0x1 << 20) // (USART) Image of RI Input
+#define AT91C_US_DSR          ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input
+#define AT91C_US_DCD          ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input
+#define AT91C_US_CTS          ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_SSC {
+    AT91_REG     SSC_CR;    // Control Register
+    AT91_REG     SSC_CMR;   // Clock Mode Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     SSC_RCMR;  // Receive Clock ModeRegister
+    AT91_REG     SSC_RFMR;  // Receive Frame Mode Register
+    AT91_REG     SSC_TCMR;  // Transmit Clock Mode Register
+    AT91_REG     SSC_TFMR;  // Transmit Frame Mode Register
+    AT91_REG     SSC_RHR;   // Receive Holding Register
+    AT91_REG     SSC_THR;   // Transmit Holding Register
+    AT91_REG     Reserved1[2];  //
+    AT91_REG     SSC_RSHR;  // Receive Sync Holding Register
+    AT91_REG     SSC_TSHR;  // Transmit Sync Holding Register
+    AT91_REG     Reserved2[2];  //
+    AT91_REG     SSC_SR;    // Status Register
+    AT91_REG     SSC_IER;   // Interrupt Enable Register
+    AT91_REG     SSC_IDR;   // Interrupt Disable Register
+    AT91_REG     SSC_IMR;   // Interrupt Mask Register
+    AT91_REG     Reserved3[44];     //
+    AT91_REG     SSC_RPR;   // Receive Pointer Register
+    AT91_REG     SSC_RCR;   // Receive Counter Register
+    AT91_REG     SSC_TPR;   // Transmit Pointer Register
+    AT91_REG     SSC_TCR;   // Transmit Counter Register
+    AT91_REG     SSC_RNPR;  // Receive Next Pointer Register
+    AT91_REG     SSC_RNCR;  // Receive Next Counter Register
+    AT91_REG     SSC_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     SSC_TNCR;  // Transmit Next Counter Register
+    AT91_REG     SSC_PTCR;  // PDC Transfer Control Register
+    AT91_REG     SSC_PTSR;  // PDC Transfer Status Register
+} AT91S_SSC, *AT91PS_SSC;
+
+// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register --------
+#define AT91C_SSC_RXEN        ((unsigned int) 0x1 <<  0) // (SSC) Receive Enable
+#define AT91C_SSC_RXDIS       ((unsigned int) 0x1 <<  1) // (SSC) Receive Disable
+#define AT91C_SSC_TXEN        ((unsigned int) 0x1 <<  8) // (SSC) Transmit Enable
+#define AT91C_SSC_TXDIS       ((unsigned int) 0x1 <<  9) // (SSC) Transmit Disable
+#define AT91C_SSC_SWRST       ((unsigned int) 0x1 << 15) // (SSC) Software Reset
+// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register --------
+#define AT91C_SSC_CKS         ((unsigned int) 0x3 <<  0) // (SSC) Receive/Transmit Clock Selection
+#define     AT91C_SSC_CKS_DIV                  ((unsigned int) 0x0) // (SSC) Divided Clock
+#define     AT91C_SSC_CKS_TK                   ((unsigned int) 0x1) // (SSC) TK Clock signal
+#define     AT91C_SSC_CKS_RK                   ((unsigned int) 0x2) // (SSC) RK pin
+#define AT91C_SSC_CKO         ((unsigned int) 0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection
+#define     AT91C_SSC_CKO_NONE                 ((unsigned int) 0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only
+#define     AT91C_SSC_CKO_CONTINOUS            ((unsigned int) 0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output
+#define     AT91C_SSC_CKO_DATA_TX              ((unsigned int) 0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output
+#define AT91C_SSC_CKI         ((unsigned int) 0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion
+#define AT91C_SSC_START       ((unsigned int) 0xF <<  8) // (SSC) Receive/Transmit Start Selection
+#define     AT91C_SSC_START_CONTINOUS            ((unsigned int) 0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.
+#define     AT91C_SSC_START_TX                   ((unsigned int) 0x1 <<  8) // (SSC) Transmit/Receive start
+#define     AT91C_SSC_START_LOW_RF               ((unsigned int) 0x2 <<  8) // (SSC) Detection of a low level on RF input
+#define     AT91C_SSC_START_HIGH_RF              ((unsigned int) 0x3 <<  8) // (SSC) Detection of a high level on RF input
+#define     AT91C_SSC_START_FALL_RF              ((unsigned int) 0x4 <<  8) // (SSC) Detection of a falling edge on RF input
+#define     AT91C_SSC_START_RISE_RF              ((unsigned int) 0x5 <<  8) // (SSC) Detection of a rising edge on RF input
+#define     AT91C_SSC_START_LEVEL_RF             ((unsigned int) 0x6 <<  8) // (SSC) Detection of any level change on RF input
+#define     AT91C_SSC_START_EDGE_RF              ((unsigned int) 0x7 <<  8) // (SSC) Detection of any edge on RF input
+#define     AT91C_SSC_START_0                    ((unsigned int) 0x8 <<  8) // (SSC) Compare 0
+#define AT91C_SSC_STTDLY      ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay
+#define AT91C_SSC_PERIOD      ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection
+// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register --------
+#define AT91C_SSC_DATLEN      ((unsigned int) 0x1F <<  0) // (SSC) Data Length
+#define AT91C_SSC_LOOP        ((unsigned int) 0x1 <<  5) // (SSC) Loop Mode
+#define AT91C_SSC_MSBF        ((unsigned int) 0x1 <<  7) // (SSC) Most Significant Bit First
+#define AT91C_SSC_DATNB       ((unsigned int) 0xF <<  8) // (SSC) Data Number per Frame
+#define AT91C_SSC_FSLEN       ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length
+#define AT91C_SSC_FSOS        ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection
+#define     AT91C_SSC_FSOS_NONE                 ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only
+#define     AT91C_SSC_FSOS_NEGATIVE             ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse
+#define     AT91C_SSC_FSOS_POSITIVE             ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse
+#define     AT91C_SSC_FSOS_LOW                  ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer
+#define     AT91C_SSC_FSOS_HIGH                 ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer
+#define     AT91C_SSC_FSOS_TOGGLE               ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer
+#define AT91C_SSC_FSEDGE      ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection
+// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register --------
+// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register --------
+#define AT91C_SSC_DATDEF      ((unsigned int) 0x1 <<  5) // (SSC) Data Default Value
+#define AT91C_SSC_FSDEN       ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable
+// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register --------
+#define AT91C_SSC_TXRDY       ((unsigned int) 0x1 <<  0) // (SSC) Transmit Ready
+#define AT91C_SSC_TXEMPTY     ((unsigned int) 0x1 <<  1) // (SSC) Transmit Empty
+#define AT91C_SSC_ENDTX       ((unsigned int) 0x1 <<  2) // (SSC) End Of Transmission
+#define AT91C_SSC_TXBUFE      ((unsigned int) 0x1 <<  3) // (SSC) Transmit Buffer Empty
+#define AT91C_SSC_RXRDY       ((unsigned int) 0x1 <<  4) // (SSC) Receive Ready
+#define AT91C_SSC_OVRUN       ((unsigned int) 0x1 <<  5) // (SSC) Receive Overrun
+#define AT91C_SSC_ENDRX       ((unsigned int) 0x1 <<  6) // (SSC) End of Reception
+#define AT91C_SSC_RXBUFF      ((unsigned int) 0x1 <<  7) // (SSC) Receive Buffer Full
+#define AT91C_SSC_TXSYN       ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync
+#define AT91C_SSC_RXSYN       ((unsigned int) 0x1 << 11) // (SSC) Receive Sync
+#define AT91C_SSC_TXENA       ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable
+#define AT91C_SSC_RXENA       ((unsigned int) 0x1 << 17) // (SSC) Receive Enable
+// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register --------
+// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register --------
+// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Two-wire Interface
+// *****************************************************************************
+typedef struct _AT91S_TWI {
+    AT91_REG     TWI_CR;    // Control Register
+    AT91_REG     TWI_MMR;   // Master Mode Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     TWI_IADR;  // Internal Address Register
+    AT91_REG     TWI_CWGR;  // Clock Waveform Generator Register
+    AT91_REG     Reserved1[3];  //
+    AT91_REG     TWI_SR;    // Status Register
+    AT91_REG     TWI_IER;   // Interrupt Enable Register
+    AT91_REG     TWI_IDR;   // Interrupt Disable Register
+    AT91_REG     TWI_IMR;   // Interrupt Mask Register
+    AT91_REG     TWI_RHR;   // Receive Holding Register
+    AT91_REG     TWI_THR;   // Transmit Holding Register
+} AT91S_TWI, *AT91PS_TWI;
+
+// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register --------
+#define AT91C_TWI_START       ((unsigned int) 0x1 <<  0) // (TWI) Send a START Condition
+#define AT91C_TWI_STOP        ((unsigned int) 0x1 <<  1) // (TWI) Send a STOP Condition
+#define AT91C_TWI_MSEN        ((unsigned int) 0x1 <<  2) // (TWI) TWI Master Transfer Enabled
+#define AT91C_TWI_MSDIS       ((unsigned int) 0x1 <<  3) // (TWI) TWI Master Transfer Disabled
+#define AT91C_TWI_SWRST       ((unsigned int) 0x1 <<  7) // (TWI) Software Reset
+// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register --------
+#define AT91C_TWI_IADRSZ      ((unsigned int) 0x3 <<  8) // (TWI) Internal Device Address Size
+#define     AT91C_TWI_IADRSZ_NO                   ((unsigned int) 0x0 <<  8) // (TWI) No internal device address
+#define     AT91C_TWI_IADRSZ_1_BYTE               ((unsigned int) 0x1 <<  8) // (TWI) One-byte internal device address
+#define     AT91C_TWI_IADRSZ_2_BYTE               ((unsigned int) 0x2 <<  8) // (TWI) Two-byte internal device address
+#define     AT91C_TWI_IADRSZ_3_BYTE               ((unsigned int) 0x3 <<  8) // (TWI) Three-byte internal device address
+#define AT91C_TWI_MREAD       ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction
+#define AT91C_TWI_DADR        ((unsigned int) 0x7F << 16) // (TWI) Device Address
+// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register --------
+#define AT91C_TWI_CLDIV       ((unsigned int) 0xFF <<  0) // (TWI) Clock Low Divider
+#define AT91C_TWI_CHDIV       ((unsigned int) 0xFF <<  8) // (TWI) Clock High Divider
+#define AT91C_TWI_CKDIV       ((unsigned int) 0x7 << 16) // (TWI) Clock Divider
+// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register --------
+#define AT91C_TWI_TXCOMP      ((unsigned int) 0x1 <<  0) // (TWI) Transmission Completed
+#define AT91C_TWI_RXRDY       ((unsigned int) 0x1 <<  1) // (TWI) Receive holding register ReaDY
+#define AT91C_TWI_TXRDY       ((unsigned int) 0x1 <<  2) // (TWI) Transmit holding register ReaDY
+#define AT91C_TWI_OVRE        ((unsigned int) 0x1 <<  6) // (TWI) Overrun Error
+#define AT91C_TWI_UNRE        ((unsigned int) 0x1 <<  7) // (TWI) Underrun Error
+#define AT91C_TWI_NACK        ((unsigned int) 0x1 <<  8) // (TWI) Not Acknowledged
+// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register --------
+// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register --------
+// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface
+// *****************************************************************************
+typedef struct _AT91S_PWMC_CH {
+    AT91_REG     PWMC_CMR;  // Channel Mode Register
+    AT91_REG     PWMC_CDTYR;    // Channel Duty Cycle Register
+    AT91_REG     PWMC_CPRDR;    // Channel Period Register
+    AT91_REG     PWMC_CCNTR;    // Channel Counter Register
+    AT91_REG     PWMC_CUPDR;    // Channel Update Register
+    AT91_REG     PWMC_Reserved[3];  // Reserved
+} AT91S_PWMC_CH, *AT91PS_PWMC_CH;
+
+// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register --------
+#define AT91C_PWMC_CPRE       ((unsigned int) 0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx
+#define     AT91C_PWMC_CPRE_MCK                  ((unsigned int) 0x0) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKA                 ((unsigned int) 0xB) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKB                 ((unsigned int) 0xC) // (PWMC_CH)
+#define AT91C_PWMC_CALG       ((unsigned int) 0x1 <<  8) // (PWMC_CH) Channel Alignment
+#define AT91C_PWMC_CPOL       ((unsigned int) 0x1 <<  9) // (PWMC_CH) Channel Polarity
+#define AT91C_PWMC_CPD        ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period
+// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register --------
+#define AT91C_PWMC_CDTY       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Duty Cycle
+// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register --------
+#define AT91C_PWMC_CPRD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Period
+// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register --------
+#define AT91C_PWMC_CCNT       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Counter
+// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register --------
+#define AT91C_PWMC_CUPD       ((unsigned int) 0x0 <<  0) // (PWMC_CH) Channel Update
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface
+// *****************************************************************************
+typedef struct _AT91S_PWMC {
+    AT91_REG     PWMC_MR;   // PWMC Mode Register
+    AT91_REG     PWMC_ENA;  // PWMC Enable Register
+    AT91_REG     PWMC_DIS;  // PWMC Disable Register
+    AT91_REG     PWMC_SR;   // PWMC Status Register
+    AT91_REG     PWMC_IER;  // PWMC Interrupt Enable Register
+    AT91_REG     PWMC_IDR;  // PWMC Interrupt Disable Register
+    AT91_REG     PWMC_IMR;  // PWMC Interrupt Mask Register
+    AT91_REG     PWMC_ISR;  // PWMC Interrupt Status Register
+    AT91_REG     Reserved0[55];     //
+    AT91_REG     PWMC_VR;   // PWMC Version Register
+    AT91_REG     Reserved1[64];     //
+    AT91S_PWMC_CH    PWMC_CH[4];    // PWMC Channel
+} AT91S_PWMC, *AT91PS_PWMC;
+
+// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register --------
+#define AT91C_PWMC_DIVA       ((unsigned int) 0xFF <<  0) // (PWMC) CLKA divide factor.
+#define AT91C_PWMC_PREA       ((unsigned int) 0xF <<  8) // (PWMC) Divider Input Clock Prescaler A
+#define     AT91C_PWMC_PREA_MCK                  ((unsigned int) 0x0 <<  8) // (PWMC)
+#define AT91C_PWMC_DIVB       ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor.
+#define AT91C_PWMC_PREB       ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B
+#define     AT91C_PWMC_PREB_MCK                  ((unsigned int) 0x0 << 24) // (PWMC)
+// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register --------
+#define AT91C_PWMC_CHID0      ((unsigned int) 0x1 <<  0) // (PWMC) Channel ID 0
+#define AT91C_PWMC_CHID1      ((unsigned int) 0x1 <<  1) // (PWMC) Channel ID 1
+#define AT91C_PWMC_CHID2      ((unsigned int) 0x1 <<  2) // (PWMC) Channel ID 2
+#define AT91C_PWMC_CHID3      ((unsigned int) 0x1 <<  3) // (PWMC) Channel ID 3
+// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register --------
+// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register --------
+// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register --------
+// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register --------
+// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register --------
+// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR USB Device Interface
+// *****************************************************************************
+typedef struct _AT91S_UDP {
+    AT91_REG     UDP_NUM;   // Frame Number Register
+    AT91_REG     UDP_GLBSTATE;  // Global State Register
+    AT91_REG     UDP_FADDR;     // Function Address Register
+    AT91_REG     Reserved0[1];  //
+    AT91_REG     UDP_IER;   // Interrupt Enable Register
+    AT91_REG     UDP_IDR;   // Interrupt Disable Register
+    AT91_REG     UDP_IMR;   // Interrupt Mask Register
+    AT91_REG     UDP_ISR;   // Interrupt Status Register
+    AT91_REG     UDP_ICR;   // Interrupt Clear Register
+    AT91_REG     Reserved1[1];  //
+    AT91_REG     UDP_RSTEP;     // Reset Endpoint Register
+    AT91_REG     Reserved2[1];  //
+    AT91_REG     UDP_CSR[6];    // Endpoint Control and Status Register
+    AT91_REG     Reserved3[2];  //
+    AT91_REG     UDP_FDR[6];    // Endpoint FIFO Data Register
+    AT91_REG     Reserved4[3];  //
+    AT91_REG     UDP_TXVC;  // Transceiver Control Register
+} AT91S_UDP, *AT91PS_UDP;
+
+// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register --------
+#define AT91C_UDP_FRM_NUM     ((unsigned int) 0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats
+#define AT91C_UDP_FRM_ERR     ((unsigned int) 0x1 << 16) // (UDP) Frame Error
+#define AT91C_UDP_FRM_OK      ((unsigned int) 0x1 << 17) // (UDP) Frame OK
+// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register --------
+#define AT91C_UDP_FADDEN      ((unsigned int) 0x1 <<  0) // (UDP) Function Address Enable
+#define AT91C_UDP_CONFG       ((unsigned int) 0x1 <<  1) // (UDP) Configured
+#define AT91C_UDP_ESR         ((unsigned int) 0x1 <<  2) // (UDP) Enable Send Resume
+#define AT91C_UDP_RSMINPR     ((unsigned int) 0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host
+#define AT91C_UDP_RMWUPE      ((unsigned int) 0x1 <<  4) // (UDP) Remote Wake Up Enable
+// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register --------
+#define AT91C_UDP_FADD        ((unsigned int) 0xFF <<  0) // (UDP) Function Address Value
+#define AT91C_UDP_FEN         ((unsigned int) 0x1 <<  8) // (UDP) Function Enable
+// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register --------
+#define AT91C_UDP_EPINT0      ((unsigned int) 0x1 <<  0) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT1      ((unsigned int) 0x1 <<  1) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT2      ((unsigned int) 0x1 <<  2) // (UDP) Endpoint 2 Interrupt
+#define AT91C_UDP_EPINT3      ((unsigned int) 0x1 <<  3) // (UDP) Endpoint 3 Interrupt
+#define AT91C_UDP_EPINT4      ((unsigned int) 0x1 <<  4) // (UDP) Endpoint 4 Interrupt
+#define AT91C_UDP_EPINT5      ((unsigned int) 0x1 <<  5) // (UDP) Endpoint 5 Interrupt
+#define AT91C_UDP_RXSUSP      ((unsigned int) 0x1 <<  8) // (UDP) USB Suspend Interrupt
+#define AT91C_UDP_RXRSM       ((unsigned int) 0x1 <<  9) // (UDP) USB Resume Interrupt
+#define AT91C_UDP_EXTRSM      ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt
+#define AT91C_UDP_SOFINT      ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt
+#define AT91C_UDP_WAKEUP      ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt
+// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register --------
+// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register --------
+// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register --------
+#define AT91C_UDP_ENDBUSRES   ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt
+// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register --------
+// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register --------
+#define AT91C_UDP_EP0         ((unsigned int) 0x1 <<  0) // (UDP) Reset Endpoint 0
+#define AT91C_UDP_EP1         ((unsigned int) 0x1 <<  1) // (UDP) Reset Endpoint 1
+#define AT91C_UDP_EP2         ((unsigned int) 0x1 <<  2) // (UDP) Reset Endpoint 2
+#define AT91C_UDP_EP3         ((unsigned int) 0x1 <<  3) // (UDP) Reset Endpoint 3
+#define AT91C_UDP_EP4         ((unsigned int) 0x1 <<  4) // (UDP) Reset Endpoint 4
+#define AT91C_UDP_EP5         ((unsigned int) 0x1 <<  5) // (UDP) Reset Endpoint 5
+// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register --------
+#define AT91C_UDP_TXCOMP      ((unsigned int) 0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR
+#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 <<  1) // (UDP) Receive Data Bank 0
+#define AT91C_UDP_RXSETUP     ((unsigned int) 0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)
+#define AT91C_UDP_ISOERROR    ((unsigned int) 0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)
+#define AT91C_UDP_TXPKTRDY    ((unsigned int) 0x1 <<  4) // (UDP) Transmit Packet Ready
+#define AT91C_UDP_FORCESTALL  ((unsigned int) 0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).
+#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).
+#define AT91C_UDP_DIR         ((unsigned int) 0x1 <<  7) // (UDP) Transfer Direction
+#define AT91C_UDP_EPTYPE      ((unsigned int) 0x7 <<  8) // (UDP) Endpoint type
+#define     AT91C_UDP_EPTYPE_CTRL                 ((unsigned int) 0x0 <<  8) // (UDP) Control
+#define     AT91C_UDP_EPTYPE_ISO_OUT              ((unsigned int) 0x1 <<  8) // (UDP) Isochronous OUT
+#define     AT91C_UDP_EPTYPE_BULK_OUT             ((unsigned int) 0x2 <<  8) // (UDP) Bulk OUT
+#define     AT91C_UDP_EPTYPE_INT_OUT              ((unsigned int) 0x3 <<  8) // (UDP) Interrupt OUT
+#define     AT91C_UDP_EPTYPE_ISO_IN               ((unsigned int) 0x5 <<  8) // (UDP) Isochronous IN
+#define     AT91C_UDP_EPTYPE_BULK_IN              ((unsigned int) 0x6 <<  8) // (UDP) Bulk IN
+#define     AT91C_UDP_EPTYPE_INT_IN               ((unsigned int) 0x7 <<  8) // (UDP) Interrupt IN
+#define AT91C_UDP_DTGLE       ((unsigned int) 0x1 << 11) // (UDP) Data Toggle
+#define AT91C_UDP_EPEDS       ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable
+#define AT91C_UDP_RXBYTECNT   ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO
+// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register --------
+#define AT91C_UDP_TXVDIS      ((unsigned int) 0x1 <<  8) // (UDP)
+#define AT91C_UDP_PUON        ((unsigned int) 0x1 <<  9) // (UDP) Pull-up ON
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface
+// *****************************************************************************
+typedef struct _AT91S_TC {
+    AT91_REG     TC_CCR;    // Channel Control Register
+    AT91_REG     TC_CMR;    // Channel Mode Register (Capture Mode / Waveform Mode)
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     TC_CV;     // Counter Value
+    AT91_REG     TC_RA;     // Register A
+    AT91_REG     TC_RB;     // Register B
+    AT91_REG     TC_RC;     // Register C
+    AT91_REG     TC_SR;     // Status Register
+    AT91_REG     TC_IER;    // Interrupt Enable Register
+    AT91_REG     TC_IDR;    // Interrupt Disable Register
+    AT91_REG     TC_IMR;    // Interrupt Mask Register
+} AT91S_TC, *AT91PS_TC;
+
+// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register --------
+#define AT91C_TC_CLKEN        ((unsigned int) 0x1 <<  0) // (TC) Counter Clock Enable Command
+#define AT91C_TC_CLKDIS       ((unsigned int) 0x1 <<  1) // (TC) Counter Clock Disable Command
+#define AT91C_TC_SWTRG        ((unsigned int) 0x1 <<  2) // (TC) Software Trigger Command
+// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode --------
+#define AT91C_TC_CLKS         ((unsigned int) 0x7 <<  0) // (TC) Clock Selection
+#define     AT91C_TC_CLKS_TIMER_DIV1_CLOCK     ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV2_CLOCK     ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV3_CLOCK     ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV4_CLOCK     ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV5_CLOCK     ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK
+#define     AT91C_TC_CLKS_XC0                  ((unsigned int) 0x5) // (TC) Clock selected: XC0
+#define     AT91C_TC_CLKS_XC1                  ((unsigned int) 0x6) // (TC) Clock selected: XC1
+#define     AT91C_TC_CLKS_XC2                  ((unsigned int) 0x7) // (TC) Clock selected: XC2
+#define AT91C_TC_CLKI         ((unsigned int) 0x1 <<  3) // (TC) Clock Invert
+#define AT91C_TC_BURST        ((unsigned int) 0x3 <<  4) // (TC) Burst Signal Selection
+#define     AT91C_TC_BURST_NONE                 ((unsigned int) 0x0 <<  4) // (TC) The clock is not gated by an external signal
+#define     AT91C_TC_BURST_XC0                  ((unsigned int) 0x1 <<  4) // (TC) XC0 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC1                  ((unsigned int) 0x2 <<  4) // (TC) XC1 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC2                  ((unsigned int) 0x3 <<  4) // (TC) XC2 is ANDed with the selected clock
+#define AT91C_TC_CPCSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare
+#define AT91C_TC_LDBSTOP      ((unsigned int) 0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading
+#define AT91C_TC_CPCDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disable with RC Compare
+#define AT91C_TC_LDBDIS       ((unsigned int) 0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading
+#define AT91C_TC_ETRGEDG      ((unsigned int) 0x3 <<  8) // (TC) External Trigger Edge Selection
+#define     AT91C_TC_ETRGEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_ETRGEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_ETRGEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_ETRGEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_EEVTEDG      ((unsigned int) 0x3 <<  8) // (TC) External Event Edge Selection
+#define     AT91C_TC_EEVTEDG_NONE                 ((unsigned int) 0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_EEVTEDG_RISING               ((unsigned int) 0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_EEVTEDG_FALLING              ((unsigned int) 0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_EEVTEDG_BOTH                 ((unsigned int) 0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_EEVT         ((unsigned int) 0x3 << 10) // (TC) External Event  Selection
+#define     AT91C_TC_EEVT_TIOB                 ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input
+#define     AT91C_TC_EEVT_XC0                  ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output
+#define     AT91C_TC_EEVT_XC1                  ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output
+#define     AT91C_TC_EEVT_XC2                  ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output
+#define AT91C_TC_ABETRG       ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection
+#define AT91C_TC_ENETRG       ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable
+#define AT91C_TC_WAVESEL      ((unsigned int) 0x3 << 13) // (TC) Waveform  Selection
+#define     AT91C_TC_WAVESEL_UP                   ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN               ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UP_AUTO              ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN_AUTO          ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare
+#define AT91C_TC_CPCTRG       ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable
+#define AT91C_TC_WAVE         ((unsigned int) 0x1 << 15) // (TC)
+#define AT91C_TC_ACPA         ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA
+#define     AT91C_TC_ACPA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Effect: none
+#define     AT91C_TC_ACPA_SET                  ((unsigned int) 0x1 << 16) // (TC) Effect: set
+#define     AT91C_TC_ACPA_CLEAR                ((unsigned int) 0x2 << 16) // (TC) Effect: clear
+#define     AT91C_TC_ACPA_TOGGLE               ((unsigned int) 0x3 << 16) // (TC) Effect: toggle
+#define AT91C_TC_LDRA         ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection
+#define     AT91C_TC_LDRA_NONE                 ((unsigned int) 0x0 << 16) // (TC) Edge: None
+#define     AT91C_TC_LDRA_RISING               ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRA_FALLING              ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRA_BOTH                 ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_ACPC         ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA
+#define     AT91C_TC_ACPC_NONE                 ((unsigned int) 0x0 << 18) // (TC) Effect: none
+#define     AT91C_TC_ACPC_SET                  ((unsigned int) 0x1 << 18) // (TC) Effect: set
+#define     AT91C_TC_ACPC_CLEAR                ((unsigned int) 0x2 << 18) // (TC) Effect: clear
+#define     AT91C_TC_ACPC_TOGGLE               ((unsigned int) 0x3 << 18) // (TC) Effect: toggle
+#define AT91C_TC_LDRB         ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection
+#define     AT91C_TC_LDRB_NONE                 ((unsigned int) 0x0 << 18) // (TC) Edge: None
+#define     AT91C_TC_LDRB_RISING               ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRB_FALLING              ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRB_BOTH                 ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_AEEVT        ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA
+#define     AT91C_TC_AEEVT_NONE                 ((unsigned int) 0x0 << 20) // (TC) Effect: none
+#define     AT91C_TC_AEEVT_SET                  ((unsigned int) 0x1 << 20) // (TC) Effect: set
+#define     AT91C_TC_AEEVT_CLEAR                ((unsigned int) 0x2 << 20) // (TC) Effect: clear
+#define     AT91C_TC_AEEVT_TOGGLE               ((unsigned int) 0x3 << 20) // (TC) Effect: toggle
+#define AT91C_TC_ASWTRG       ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA
+#define     AT91C_TC_ASWTRG_NONE                 ((unsigned int) 0x0 << 22) // (TC) Effect: none
+#define     AT91C_TC_ASWTRG_SET                  ((unsigned int) 0x1 << 22) // (TC) Effect: set
+#define     AT91C_TC_ASWTRG_CLEAR                ((unsigned int) 0x2 << 22) // (TC) Effect: clear
+#define     AT91C_TC_ASWTRG_TOGGLE               ((unsigned int) 0x3 << 22) // (TC) Effect: toggle
+#define AT91C_TC_BCPB         ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB
+#define     AT91C_TC_BCPB_NONE                 ((unsigned int) 0x0 << 24) // (TC) Effect: none
+#define     AT91C_TC_BCPB_SET                  ((unsigned int) 0x1 << 24) // (TC) Effect: set
+#define     AT91C_TC_BCPB_CLEAR                ((unsigned int) 0x2 << 24) // (TC) Effect: clear
+#define     AT91C_TC_BCPB_TOGGLE               ((unsigned int) 0x3 << 24) // (TC) Effect: toggle
+#define AT91C_TC_BCPC         ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB
+#define     AT91C_TC_BCPC_NONE                 ((unsigned int) 0x0 << 26) // (TC) Effect: none
+#define     AT91C_TC_BCPC_SET                  ((unsigned int) 0x1 << 26) // (TC) Effect: set
+#define     AT91C_TC_BCPC_CLEAR                ((unsigned int) 0x2 << 26) // (TC) Effect: clear
+#define     AT91C_TC_BCPC_TOGGLE               ((unsigned int) 0x3 << 26) // (TC) Effect: toggle
+#define AT91C_TC_BEEVT        ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB
+#define     AT91C_TC_BEEVT_NONE                 ((unsigned int) 0x0 << 28) // (TC) Effect: none
+#define     AT91C_TC_BEEVT_SET                  ((unsigned int) 0x1 << 28) // (TC) Effect: set
+#define     AT91C_TC_BEEVT_CLEAR                ((unsigned int) 0x2 << 28) // (TC) Effect: clear
+#define     AT91C_TC_BEEVT_TOGGLE               ((unsigned int) 0x3 << 28) // (TC) Effect: toggle
+#define AT91C_TC_BSWTRG       ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB
+#define     AT91C_TC_BSWTRG_NONE                 ((unsigned int) 0x0 << 30) // (TC) Effect: none
+#define     AT91C_TC_BSWTRG_SET                  ((unsigned int) 0x1 << 30) // (TC) Effect: set
+#define     AT91C_TC_BSWTRG_CLEAR                ((unsigned int) 0x2 << 30) // (TC) Effect: clear
+#define     AT91C_TC_BSWTRG_TOGGLE               ((unsigned int) 0x3 << 30) // (TC) Effect: toggle
+// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register --------
+#define AT91C_TC_COVFS        ((unsigned int) 0x1 <<  0) // (TC) Counter Overflow
+#define AT91C_TC_LOVRS        ((unsigned int) 0x1 <<  1) // (TC) Load Overrun
+#define AT91C_TC_CPAS         ((unsigned int) 0x1 <<  2) // (TC) RA Compare
+#define AT91C_TC_CPBS         ((unsigned int) 0x1 <<  3) // (TC) RB Compare
+#define AT91C_TC_CPCS         ((unsigned int) 0x1 <<  4) // (TC) RC Compare
+#define AT91C_TC_LDRAS        ((unsigned int) 0x1 <<  5) // (TC) RA Loading
+#define AT91C_TC_LDRBS        ((unsigned int) 0x1 <<  6) // (TC) RB Loading
+#define AT91C_TC_ETRGS        ((unsigned int) 0x1 <<  7) // (TC) External Trigger
+#define AT91C_TC_CLKSTA       ((unsigned int) 0x1 << 16) // (TC) Clock Enabling
+#define AT91C_TC_MTIOA        ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror
+#define AT91C_TC_MTIOB        ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror
+// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register --------
+// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register --------
+// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Interface
+// *****************************************************************************
+typedef struct _AT91S_TCB {
+    AT91S_TC     TCB_TC0;   // TC Channel 0
+    AT91_REG     Reserved0[4];  //
+    AT91S_TC     TCB_TC1;   // TC Channel 1
+    AT91_REG     Reserved1[4];  //
+    AT91S_TC     TCB_TC2;   // TC Channel 2
+    AT91_REG     Reserved2[4];  //
+    AT91_REG     TCB_BCR;   // TC Block Control Register
+    AT91_REG     TCB_BMR;   // TC Block Mode Register
+} AT91S_TCB, *AT91PS_TCB;
+
+// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register --------
+#define AT91C_TCB_SYNC        ((unsigned int) 0x1 <<  0) // (TCB) Synchro Command
+// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register --------
+#define AT91C_TCB_TC0XC0S     ((unsigned int) 0x3 <<  0) // (TCB) External Clock Signal 0 Selection
+#define     AT91C_TCB_TC0XC0S_TCLK0                ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0
+#define     AT91C_TCB_TC0XC0S_NONE                 ((unsigned int) 0x1) // (TCB) None signal connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA1                ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA2                ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0
+#define AT91C_TCB_TC1XC1S     ((unsigned int) 0x3 <<  2) // (TCB) External Clock Signal 1 Selection
+#define     AT91C_TCB_TC1XC1S_TCLK1                ((unsigned int) 0x0 <<  2) // (TCB) TCLK1 connected to XC1
+#define     AT91C_TCB_TC1XC1S_NONE                 ((unsigned int) 0x1 <<  2) // (TCB) None signal connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA0                ((unsigned int) 0x2 <<  2) // (TCB) TIOA0 connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA2                ((unsigned int) 0x3 <<  2) // (TCB) TIOA2 connected to XC1
+#define AT91C_TCB_TC2XC2S     ((unsigned int) 0x3 <<  4) // (TCB) External Clock Signal 2 Selection
+#define     AT91C_TCB_TC2XC2S_TCLK2                ((unsigned int) 0x0 <<  4) // (TCB) TCLK2 connected to XC2
+#define     AT91C_TCB_TC2XC2S_NONE                 ((unsigned int) 0x1 <<  4) // (TCB) None signal connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA0                ((unsigned int) 0x2 <<  4) // (TCB) TIOA0 connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA1                ((unsigned int) 0x3 <<  4) // (TCB) TIOA2 connected to XC2
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Control Area Network MailBox Interface
+// *****************************************************************************
+typedef struct _AT91S_CAN_MB {
+    AT91_REG     CAN_MB_MMR;    // MailBox Mode Register
+    AT91_REG     CAN_MB_MAM;    // MailBox Acceptance Mask Register
+    AT91_REG     CAN_MB_MID;    // MailBox ID Register
+    AT91_REG     CAN_MB_MFID;   // MailBox Family ID Register
+    AT91_REG     CAN_MB_MSR;    // MailBox Status Register
+    AT91_REG     CAN_MB_MDL;    // MailBox Data Low Register
+    AT91_REG     CAN_MB_MDH;    // MailBox Data High Register
+    AT91_REG     CAN_MB_MCR;    // MailBox Control Register
+} AT91S_CAN_MB, *AT91PS_CAN_MB;
+
+// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register --------
+#define AT91C_CAN_MTIMEMARK   ((unsigned int) 0xFFFF <<  0) // (CAN_MB) Mailbox Timemark
+#define AT91C_CAN_PRIOR       ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority
+#define AT91C_CAN_MOT         ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type
+#define     AT91C_CAN_MOT_DIS                  ((unsigned int) 0x0 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_RX                   ((unsigned int) 0x1 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_RXOVERWRITE          ((unsigned int) 0x2 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_TX                   ((unsigned int) 0x3 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_CONSUMER             ((unsigned int) 0x4 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_PRODUCER             ((unsigned int) 0x5 << 24) // (CAN_MB)
+// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register --------
+#define AT91C_CAN_MIDvB       ((unsigned int) 0x3FFFF <<  0) // (CAN_MB) Complementary bits for identifier in extended mode
+#define AT91C_CAN_MIDvA       ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode
+#define AT91C_CAN_MIDE        ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version
+// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register --------
+// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register --------
+// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register --------
+#define AT91C_CAN_MTIMESTAMP  ((unsigned int) 0xFFFF <<  0) // (CAN_MB) Timer Value
+#define AT91C_CAN_MDLC        ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code
+#define AT91C_CAN_MRTR        ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request
+#define AT91C_CAN_MABT        ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort
+#define AT91C_CAN_MRDY        ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready
+#define AT91C_CAN_MMI         ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored
+// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register --------
+// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register --------
+// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register --------
+#define AT91C_CAN_MACR        ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox
+#define AT91C_CAN_MTCR        ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Control Area Network Interface
+// *****************************************************************************
+typedef struct _AT91S_CAN {
+    AT91_REG     CAN_MR;    // Mode Register
+    AT91_REG     CAN_IER;   // Interrupt Enable Register
+    AT91_REG     CAN_IDR;   // Interrupt Disable Register
+    AT91_REG     CAN_IMR;   // Interrupt Mask Register
+    AT91_REG     CAN_SR;    // Status Register
+    AT91_REG     CAN_BR;    // Baudrate Register
+    AT91_REG     CAN_TIM;   // Timer Register
+    AT91_REG     CAN_TIMESTP;   // Time Stamp Register
+    AT91_REG     CAN_ECR;   // Error Counter Register
+    AT91_REG     CAN_TCR;   // Transfer Command Register
+    AT91_REG     CAN_ACR;   // Abort Command Register
+    AT91_REG     Reserved0[52];     //
+    AT91_REG     CAN_VR;    // Version Register
+    AT91_REG     Reserved1[64];     //
+    AT91S_CAN_MB     CAN_MB0;   // CAN Mailbox 0
+    AT91S_CAN_MB     CAN_MB1;   // CAN Mailbox 1
+    AT91S_CAN_MB     CAN_MB2;   // CAN Mailbox 2
+    AT91S_CAN_MB     CAN_MB3;   // CAN Mailbox 3
+    AT91S_CAN_MB     CAN_MB4;   // CAN Mailbox 4
+    AT91S_CAN_MB     CAN_MB5;   // CAN Mailbox 5
+    AT91S_CAN_MB     CAN_MB6;   // CAN Mailbox 6
+    AT91S_CAN_MB     CAN_MB7;   // CAN Mailbox 7
+    AT91S_CAN_MB     CAN_MB8;   // CAN Mailbox 8
+    AT91S_CAN_MB     CAN_MB9;   // CAN Mailbox 9
+    AT91S_CAN_MB     CAN_MB10;  // CAN Mailbox 10
+    AT91S_CAN_MB     CAN_MB11;  // CAN Mailbox 11
+    AT91S_CAN_MB     CAN_MB12;  // CAN Mailbox 12
+    AT91S_CAN_MB     CAN_MB13;  // CAN Mailbox 13
+    AT91S_CAN_MB     CAN_MB14;  // CAN Mailbox 14
+    AT91S_CAN_MB     CAN_MB15;  // CAN Mailbox 15
+} AT91S_CAN, *AT91PS_CAN;
+
+// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register --------
+#define AT91C_CAN_CANEN       ((unsigned int) 0x1 <<  0) // (CAN) CAN Controller Enable
+#define AT91C_CAN_LPM         ((unsigned int) 0x1 <<  1) // (CAN) Disable/Enable Low Power Mode
+#define AT91C_CAN_ABM         ((unsigned int) 0x1 <<  2) // (CAN) Disable/Enable Autobaud/Listen Mode
+#define AT91C_CAN_OVL         ((unsigned int) 0x1 <<  3) // (CAN) Disable/Enable Overload Frame
+#define AT91C_CAN_TEOF        ((unsigned int) 0x1 <<  4) // (CAN) Time Stamp messages at each end of Frame
+#define AT91C_CAN_TTM         ((unsigned int) 0x1 <<  5) // (CAN) Disable/Enable Time Trigger Mode
+#define AT91C_CAN_TIMFRZ      ((unsigned int) 0x1 <<  6) // (CAN) Enable Timer Freeze
+#define AT91C_CAN_DRPT        ((unsigned int) 0x1 <<  7) // (CAN) Disable Repeat
+// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register --------
+#define AT91C_CAN_MB0         ((unsigned int) 0x1 <<  0) // (CAN) Mailbox 0 Flag
+#define AT91C_CAN_MB1         ((unsigned int) 0x1 <<  1) // (CAN) Mailbox 1 Flag
+#define AT91C_CAN_MB2         ((unsigned int) 0x1 <<  2) // (CAN) Mailbox 2 Flag
+#define AT91C_CAN_MB3         ((unsigned int) 0x1 <<  3) // (CAN) Mailbox 3 Flag
+#define AT91C_CAN_MB4         ((unsigned int) 0x1 <<  4) // (CAN) Mailbox 4 Flag
+#define AT91C_CAN_MB5         ((unsigned int) 0x1 <<  5) // (CAN) Mailbox 5 Flag
+#define AT91C_CAN_MB6         ((unsigned int) 0x1 <<  6) // (CAN) Mailbox 6 Flag
+#define AT91C_CAN_MB7         ((unsigned int) 0x1 <<  7) // (CAN) Mailbox 7 Flag
+#define AT91C_CAN_MB8         ((unsigned int) 0x1 <<  8) // (CAN) Mailbox 8 Flag
+#define AT91C_CAN_MB9         ((unsigned int) 0x1 <<  9) // (CAN) Mailbox 9 Flag
+#define AT91C_CAN_MB10        ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag
+#define AT91C_CAN_MB11        ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag
+#define AT91C_CAN_MB12        ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag
+#define AT91C_CAN_MB13        ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag
+#define AT91C_CAN_MB14        ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag
+#define AT91C_CAN_MB15        ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag
+#define AT91C_CAN_ERRA        ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag
+#define AT91C_CAN_WARN        ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag
+#define AT91C_CAN_ERRP        ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag
+#define AT91C_CAN_BOFF        ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag
+#define AT91C_CAN_SLEEP       ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag
+#define AT91C_CAN_WAKEUP      ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag
+#define AT91C_CAN_TOVF        ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag
+#define AT91C_CAN_TSTP        ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag
+#define AT91C_CAN_CERR        ((unsigned int) 0x1 << 24) // (CAN) CRC Error
+#define AT91C_CAN_SERR        ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error
+#define AT91C_CAN_AERR        ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error
+#define AT91C_CAN_FERR        ((unsigned int) 0x1 << 27) // (CAN) Form Error
+#define AT91C_CAN_BERR        ((unsigned int) 0x1 << 28) // (CAN) Bit Error
+// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register --------
+// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register --------
+// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register --------
+#define AT91C_CAN_RBSY        ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy
+#define AT91C_CAN_TBSY        ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy
+#define AT91C_CAN_OVLY        ((unsigned int) 0x1 << 31) // (CAN) Overload Busy
+// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register --------
+#define AT91C_CAN_PHASE2      ((unsigned int) 0x7 <<  0) // (CAN) Phase 2 segment
+#define AT91C_CAN_PHASE1      ((unsigned int) 0x7 <<  4) // (CAN) Phase 1 segment
+#define AT91C_CAN_PROPAG      ((unsigned int) 0x7 <<  8) // (CAN) Programmation time segment
+#define AT91C_CAN_SYNC        ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment
+#define AT91C_CAN_BRP         ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler
+#define AT91C_CAN_SMP         ((unsigned int) 0x1 << 24) // (CAN) Sampling mode
+// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register --------
+#define AT91C_CAN_TIMER       ((unsigned int) 0xFFFF <<  0) // (CAN) Timer field
+// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register --------
+// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register --------
+#define AT91C_CAN_REC         ((unsigned int) 0xFF <<  0) // (CAN) Receive Error Counter
+#define AT91C_CAN_TEC         ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter
+// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register --------
+#define AT91C_CAN_TIMRST      ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field
+// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Ethernet MAC 10/100
+// *****************************************************************************
+typedef struct _AT91S_EMAC {
+    AT91_REG     EMAC_NCR;  // Network Control Register
+    AT91_REG     EMAC_NCFGR;    // Network Configuration Register
+    AT91_REG     EMAC_NSR;  // Network Status Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     EMAC_TSR;  // Transmit Status Register
+    AT91_REG     EMAC_RBQP;     // Receive Buffer Queue Pointer
+    AT91_REG     EMAC_TBQP;     // Transmit Buffer Queue Pointer
+    AT91_REG     EMAC_RSR;  // Receive Status Register
+    AT91_REG     EMAC_ISR;  // Interrupt Status Register
+    AT91_REG     EMAC_IER;  // Interrupt Enable Register
+    AT91_REG     EMAC_IDR;  // Interrupt Disable Register
+    AT91_REG     EMAC_IMR;  // Interrupt Mask Register
+    AT91_REG     EMAC_MAN;  // PHY Maintenance Register
+    AT91_REG     EMAC_PTR;  // Pause Time Register
+    AT91_REG     EMAC_PFR;  // Pause Frames received Register
+    AT91_REG     EMAC_FTO;  // Frames Transmitted OK Register
+    AT91_REG     EMAC_SCF;  // Single Collision Frame Register
+    AT91_REG     EMAC_MCF;  // Multiple Collision Frame Register
+    AT91_REG     EMAC_FRO;  // Frames Received OK Register
+    AT91_REG     EMAC_FCSE;     // Frame Check Sequence Error Register
+    AT91_REG     EMAC_ALE;  // Alignment Error Register
+    AT91_REG     EMAC_DTF;  // Deferred Transmission Frame Register
+    AT91_REG     EMAC_LCOL;     // Late Collision Register
+    AT91_REG     EMAC_ECOL;     // Excessive Collision Register
+    AT91_REG     EMAC_TUND;     // Transmit Underrun Error Register
+    AT91_REG     EMAC_CSE;  // Carrier Sense Error Register
+    AT91_REG     EMAC_RRE;  // Receive Ressource Error Register
+    AT91_REG     EMAC_ROV;  // Receive Overrun Errors Register
+    AT91_REG     EMAC_RSE;  // Receive Symbol Errors Register
+    AT91_REG     EMAC_ELE;  // Excessive Length Errors Register
+    AT91_REG     EMAC_RJA;  // Receive Jabbers Register
+    AT91_REG     EMAC_USF;  // Undersize Frames Register
+    AT91_REG     EMAC_STE;  // SQE Test Error Register
+    AT91_REG     EMAC_RLE;  // Receive Length Field Mismatch Register
+    AT91_REG     EMAC_TPF;  // Transmitted Pause Frames Register
+    AT91_REG     EMAC_HRB;  // Hash Address Bottom[31:0]
+    AT91_REG     EMAC_HRT;  // Hash Address Top[63:32]
+    AT91_REG     EMAC_SA1L;     // Specific Address 1 Bottom, First 4 bytes
+    AT91_REG     EMAC_SA1H;     // Specific Address 1 Top, Last 2 bytes
+    AT91_REG     EMAC_SA2L;     // Specific Address 2 Bottom, First 4 bytes
+    AT91_REG     EMAC_SA2H;     // Specific Address 2 Top, Last 2 bytes
+    AT91_REG     EMAC_SA3L;     // Specific Address 3 Bottom, First 4 bytes
+    AT91_REG     EMAC_SA3H;     // Specific Address 3 Top, Last 2 bytes
+    AT91_REG     EMAC_SA4L;     // Specific Address 4 Bottom, First 4 bytes
+    AT91_REG     EMAC_SA4H;     // Specific Address 4 Top, Last 2 bytes
+    AT91_REG     EMAC_TID;  // Type ID Checking Register
+    AT91_REG     EMAC_TPQ;  // Transmit Pause Quantum Register
+    AT91_REG     EMAC_USRIO;    // USER Input/Output Register
+    AT91_REG     EMAC_WOL;  // Wake On LAN Register
+    AT91_REG     Reserved1[13];     //
+    AT91_REG     EMAC_REV;  // Revision Register
+} AT91S_EMAC, *AT91PS_EMAC;
+
+// -------- EMAC_NCR : (EMAC Offset: 0x0)  --------
+#define AT91C_EMAC_LB         ((unsigned int) 0x1 <<  0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level.
+#define AT91C_EMAC_LLB        ((unsigned int) 0x1 <<  1) // (EMAC) Loopback local.
+#define AT91C_EMAC_RE         ((unsigned int) 0x1 <<  2) // (EMAC) Receive enable.
+#define AT91C_EMAC_TE         ((unsigned int) 0x1 <<  3) // (EMAC) Transmit enable.
+#define AT91C_EMAC_MPE        ((unsigned int) 0x1 <<  4) // (EMAC) Management port enable.
+#define AT91C_EMAC_CLRSTAT    ((unsigned int) 0x1 <<  5) // (EMAC) Clear statistics registers.
+#define AT91C_EMAC_INCSTAT    ((unsigned int) 0x1 <<  6) // (EMAC) Increment statistics registers.
+#define AT91C_EMAC_WESTAT     ((unsigned int) 0x1 <<  7) // (EMAC) Write enable for statistics registers.
+#define AT91C_EMAC_BP         ((unsigned int) 0x1 <<  8) // (EMAC) Back pressure.
+#define AT91C_EMAC_TSTART     ((unsigned int) 0x1 <<  9) // (EMAC) Start Transmission.
+#define AT91C_EMAC_THALT      ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt.
+#define AT91C_EMAC_TPFR       ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame
+#define AT91C_EMAC_TZQ        ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame
+// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register --------
+#define AT91C_EMAC_SPD        ((unsigned int) 0x1 <<  0) // (EMAC) Speed.
+#define AT91C_EMAC_FD         ((unsigned int) 0x1 <<  1) // (EMAC) Full duplex.
+#define AT91C_EMAC_JFRAME     ((unsigned int) 0x1 <<  3) // (EMAC) Jumbo Frames.
+#define AT91C_EMAC_CAF        ((unsigned int) 0x1 <<  4) // (EMAC) Copy all frames.
+#define AT91C_EMAC_NBC        ((unsigned int) 0x1 <<  5) // (EMAC) No broadcast.
+#define AT91C_EMAC_MTI        ((unsigned int) 0x1 <<  6) // (EMAC) Multicast hash event enable
+#define AT91C_EMAC_UNI        ((unsigned int) 0x1 <<  7) // (EMAC) Unicast hash enable.
+#define AT91C_EMAC_BIG        ((unsigned int) 0x1 <<  8) // (EMAC) Receive 1522 bytes.
+#define AT91C_EMAC_EAE        ((unsigned int) 0x1 <<  9) // (EMAC) External address match enable.
+#define AT91C_EMAC_CLK        ((unsigned int) 0x3 << 10) // (EMAC)
+#define     AT91C_EMAC_CLK_HCLK_8               ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8
+#define     AT91C_EMAC_CLK_HCLK_16              ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16
+#define     AT91C_EMAC_CLK_HCLK_32              ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32
+#define     AT91C_EMAC_CLK_HCLK_64              ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64
+#define AT91C_EMAC_RTY        ((unsigned int) 0x1 << 12) // (EMAC)
+#define AT91C_EMAC_PAE        ((unsigned int) 0x1 << 13) // (EMAC)
+#define AT91C_EMAC_RBOF       ((unsigned int) 0x3 << 14) // (EMAC)
+#define     AT91C_EMAC_RBOF_OFFSET_0             ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_1             ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_2             ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_3             ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer
+#define AT91C_EMAC_RLCE       ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable
+#define AT91C_EMAC_DRFCS      ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS
+#define AT91C_EMAC_EFRHD      ((unsigned int) 0x1 << 18) // (EMAC)
+#define AT91C_EMAC_IRXFCS     ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS
+// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register --------
+#define AT91C_EMAC_LINKR      ((unsigned int) 0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_MDIO       ((unsigned int) 0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_IDLE       ((unsigned int) 0x1 <<  2) // (EMAC)
+// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register --------
+#define AT91C_EMAC_UBR        ((unsigned int) 0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_COL        ((unsigned int) 0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_RLES       ((unsigned int) 0x1 <<  2) // (EMAC)
+#define AT91C_EMAC_TGO        ((unsigned int) 0x1 <<  3) // (EMAC) Transmit Go
+#define AT91C_EMAC_BEX        ((unsigned int) 0x1 <<  4) // (EMAC) Buffers exhausted mid frame
+#define AT91C_EMAC_COMP       ((unsigned int) 0x1 <<  5) // (EMAC)
+#define AT91C_EMAC_UND        ((unsigned int) 0x1 <<  6) // (EMAC)
+// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register --------
+#define AT91C_EMAC_BNA        ((unsigned int) 0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_REC        ((unsigned int) 0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_OVR        ((unsigned int) 0x1 <<  2) // (EMAC)
+// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register --------
+#define AT91C_EMAC_MFD        ((unsigned int) 0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_RCOMP      ((unsigned int) 0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_RXUBR      ((unsigned int) 0x1 <<  2) // (EMAC)
+#define AT91C_EMAC_TXUBR      ((unsigned int) 0x1 <<  3) // (EMAC)
+#define AT91C_EMAC_TUNDR      ((unsigned int) 0x1 <<  4) // (EMAC)
+#define AT91C_EMAC_RLEX       ((unsigned int) 0x1 <<  5) // (EMAC)
+#define AT91C_EMAC_TXERR      ((unsigned int) 0x1 <<  6) // (EMAC)
+#define AT91C_EMAC_TCOMP      ((unsigned int) 0x1 <<  7) // (EMAC)
+#define AT91C_EMAC_LINK       ((unsigned int) 0x1 <<  9) // (EMAC)
+#define AT91C_EMAC_ROVR       ((unsigned int) 0x1 << 10) // (EMAC)
+#define AT91C_EMAC_HRESP      ((unsigned int) 0x1 << 11) // (EMAC)
+#define AT91C_EMAC_PFRE       ((unsigned int) 0x1 << 12) // (EMAC)
+#define AT91C_EMAC_PTZ        ((unsigned int) 0x1 << 13) // (EMAC)
+// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register --------
+// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register --------
+// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register --------
+// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register --------
+#define AT91C_EMAC_DATA       ((unsigned int) 0xFFFF <<  0) // (EMAC)
+#define AT91C_EMAC_CODE       ((unsigned int) 0x3 << 16) // (EMAC)
+#define AT91C_EMAC_REGA       ((unsigned int) 0x1F << 18) // (EMAC)
+#define AT91C_EMAC_PHYA       ((unsigned int) 0x1F << 23) // (EMAC)
+#define AT91C_EMAC_RW         ((unsigned int) 0x3 << 28) // (EMAC)
+#define AT91C_EMAC_SOF        ((unsigned int) 0x3 << 30) // (EMAC)
+// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register --------
+#define AT91C_EMAC_RMII       ((unsigned int) 0x1 <<  0) // (EMAC) Reduce MII
+// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register --------
+#define AT91C_EMAC_IP         ((unsigned int) 0xFFFF <<  0) // (EMAC) ARP request IP address
+#define AT91C_EMAC_MAG        ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable
+#define AT91C_EMAC_ARP        ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable
+#define AT91C_EMAC_SA1        ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable
+// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register --------
+#define AT91C_EMAC_REVREF     ((unsigned int) 0xFFFF <<  0) // (EMAC)
+#define AT91C_EMAC_PARTREF    ((unsigned int) 0xFFFF << 16) // (EMAC)
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor
+// *****************************************************************************
+typedef struct _AT91S_ADC {
+    AT91_REG     ADC_CR;    // ADC Control Register
+    AT91_REG     ADC_MR;    // ADC Mode Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     ADC_CHER;  // ADC Channel Enable Register
+    AT91_REG     ADC_CHDR;  // ADC Channel Disable Register
+    AT91_REG     ADC_CHSR;  // ADC Channel Status Register
+    AT91_REG     ADC_SR;    // ADC Status Register
+    AT91_REG     ADC_LCDR;  // ADC Last Converted Data Register
+    AT91_REG     ADC_IER;   // ADC Interrupt Enable Register
+    AT91_REG     ADC_IDR;   // ADC Interrupt Disable Register
+    AT91_REG     ADC_IMR;   // ADC Interrupt Mask Register
+    AT91_REG     ADC_CDR0;  // ADC Channel Data Register 0
+    AT91_REG     ADC_CDR1;  // ADC Channel Data Register 1
+    AT91_REG     ADC_CDR2;  // ADC Channel Data Register 2
+    AT91_REG     ADC_CDR3;  // ADC Channel Data Register 3
+    AT91_REG     ADC_CDR4;  // ADC Channel Data Register 4
+    AT91_REG     ADC_CDR5;  // ADC Channel Data Register 5
+    AT91_REG     ADC_CDR6;  // ADC Channel Data Register 6
+    AT91_REG     ADC_CDR7;  // ADC Channel Data Register 7
+    AT91_REG     Reserved1[44];     //
+    AT91_REG     ADC_RPR;   // Receive Pointer Register
+    AT91_REG     ADC_RCR;   // Receive Counter Register
+    AT91_REG     ADC_TPR;   // Transmit Pointer Register
+    AT91_REG     ADC_TCR;   // Transmit Counter Register
+    AT91_REG     ADC_RNPR;  // Receive Next Pointer Register
+    AT91_REG     ADC_RNCR;  // Receive Next Counter Register
+    AT91_REG     ADC_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     ADC_TNCR;  // Transmit Next Counter Register
+    AT91_REG     ADC_PTCR;  // PDC Transfer Control Register
+    AT91_REG     ADC_PTSR;  // PDC Transfer Status Register
+} AT91S_ADC, *AT91PS_ADC;
+
+// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register --------
+#define AT91C_ADC_SWRST       ((unsigned int) 0x1 <<  0) // (ADC) Software Reset
+#define AT91C_ADC_START       ((unsigned int) 0x1 <<  1) // (ADC) Start Conversion
+// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register --------
+#define AT91C_ADC_TRGEN       ((unsigned int) 0x1 <<  0) // (ADC) Trigger Enable
+#define     AT91C_ADC_TRGEN_DIS                  ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software
+#define     AT91C_ADC_TRGEN_EN                   ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.
+#define AT91C_ADC_TRGSEL      ((unsigned int) 0x7 <<  1) // (ADC) Trigger Selection
+#define     AT91C_ADC_TRGSEL_TIOA0                ((unsigned int) 0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0
+#define     AT91C_ADC_TRGSEL_TIOA1                ((unsigned int) 0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1
+#define     AT91C_ADC_TRGSEL_TIOA2                ((unsigned int) 0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2
+#define     AT91C_ADC_TRGSEL_TIOA3                ((unsigned int) 0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3
+#define     AT91C_ADC_TRGSEL_TIOA4                ((unsigned int) 0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4
+#define     AT91C_ADC_TRGSEL_TIOA5                ((unsigned int) 0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5
+#define     AT91C_ADC_TRGSEL_EXT                  ((unsigned int) 0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger
+#define AT91C_ADC_LOWRES      ((unsigned int) 0x1 <<  4) // (ADC) Resolution.
+#define     AT91C_ADC_LOWRES_10_BIT               ((unsigned int) 0x0 <<  4) // (ADC) 10-bit resolution
+#define     AT91C_ADC_LOWRES_8_BIT                ((unsigned int) 0x1 <<  4) // (ADC) 8-bit resolution
+#define AT91C_ADC_SLEEP       ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode
+#define     AT91C_ADC_SLEEP_NORMAL_MODE          ((unsigned int) 0x0 <<  5) // (ADC) Normal Mode
+#define     AT91C_ADC_SLEEP_MODE                 ((unsigned int) 0x1 <<  5) // (ADC) Sleep Mode
+#define AT91C_ADC_PRESCAL     ((unsigned int) 0x3F <<  8) // (ADC) Prescaler rate selection
+#define AT91C_ADC_STARTUP     ((unsigned int) 0x1F << 16) // (ADC) Startup Time
+#define AT91C_ADC_SHTIM       ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time
+// --------     ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register --------
+#define AT91C_ADC_CH0         ((unsigned int) 0x1 <<  0) // (ADC) Channel 0
+#define AT91C_ADC_CH1         ((unsigned int) 0x1 <<  1) // (ADC) Channel 1
+#define AT91C_ADC_CH2         ((unsigned int) 0x1 <<  2) // (ADC) Channel 2
+#define AT91C_ADC_CH3         ((unsigned int) 0x1 <<  3) // (ADC) Channel 3
+#define AT91C_ADC_CH4         ((unsigned int) 0x1 <<  4) // (ADC) Channel 4
+#define AT91C_ADC_CH5         ((unsigned int) 0x1 <<  5) // (ADC) Channel 5
+#define AT91C_ADC_CH6         ((unsigned int) 0x1 <<  6) // (ADC) Channel 6
+#define AT91C_ADC_CH7         ((unsigned int) 0x1 <<  7) // (ADC) Channel 7
+// --------     ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register --------
+// --------     ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register --------
+// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register --------
+#define AT91C_ADC_EOC0        ((unsigned int) 0x1 <<  0) // (ADC) End of Conversion
+#define AT91C_ADC_EOC1        ((unsigned int) 0x1 <<  1) // (ADC) End of Conversion
+#define AT91C_ADC_EOC2        ((unsigned int) 0x1 <<  2) // (ADC) End of Conversion
+#define AT91C_ADC_EOC3        ((unsigned int) 0x1 <<  3) // (ADC) End of Conversion
+#define AT91C_ADC_EOC4        ((unsigned int) 0x1 <<  4) // (ADC) End of Conversion
+#define AT91C_ADC_EOC5        ((unsigned int) 0x1 <<  5) // (ADC) End of Conversion
+#define AT91C_ADC_EOC6        ((unsigned int) 0x1 <<  6) // (ADC) End of Conversion
+#define AT91C_ADC_EOC7        ((unsigned int) 0x1 <<  7) // (ADC) End of Conversion
+#define AT91C_ADC_OVRE0       ((unsigned int) 0x1 <<  8) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE1       ((unsigned int) 0x1 <<  9) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE2       ((unsigned int) 0x1 << 10) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE3       ((unsigned int) 0x1 << 11) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE4       ((unsigned int) 0x1 << 12) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE5       ((unsigned int) 0x1 << 13) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE6       ((unsigned int) 0x1 << 14) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE7       ((unsigned int) 0x1 << 15) // (ADC) Overrun Error
+#define AT91C_ADC_DRDY        ((unsigned int) 0x1 << 16) // (ADC) Data Ready
+#define AT91C_ADC_GOVRE       ((unsigned int) 0x1 << 17) // (ADC) General Overrun
+#define AT91C_ADC_ENDRX       ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer
+#define AT91C_ADC_RXBUFF      ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt
+// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register --------
+#define AT91C_ADC_LDATA       ((unsigned int) 0x3FF <<  0) // (ADC) Last Data Converted
+// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register --------
+// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register --------
+// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register --------
+// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 --------
+#define AT91C_ADC_DATA        ((unsigned int) 0x3FF <<  0) // (ADC) Converted Data
+// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 --------
+// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 --------
+// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 --------
+// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 --------
+// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 --------
+// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 --------
+// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Advanced  Encryption Standard
+// *****************************************************************************
+typedef struct _AT91S_AES {
+    AT91_REG     AES_CR;    // Control Register
+    AT91_REG     AES_MR;    // Mode Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     AES_IER;   // Interrupt Enable Register
+    AT91_REG     AES_IDR;   // Interrupt Disable Register
+    AT91_REG     AES_IMR;   // Interrupt Mask Register
+    AT91_REG     AES_ISR;   // Interrupt Status Register
+    AT91_REG     AES_KEYWxR[4];     // Key Word x Register
+    AT91_REG     Reserved1[4];  //
+    AT91_REG     AES_IDATAxR[4];    // Input Data x Register
+    AT91_REG     AES_ODATAxR[4];    // Output Data x Register
+    AT91_REG     AES_IVxR[4];   // Initialization Vector x Register
+    AT91_REG     Reserved2[35];     //
+    AT91_REG     AES_VR;    // AES Version Register
+    AT91_REG     AES_RPR;   // Receive Pointer Register
+    AT91_REG     AES_RCR;   // Receive Counter Register
+    AT91_REG     AES_TPR;   // Transmit Pointer Register
+    AT91_REG     AES_TCR;   // Transmit Counter Register
+    AT91_REG     AES_RNPR;  // Receive Next Pointer Register
+    AT91_REG     AES_RNCR;  // Receive Next Counter Register
+    AT91_REG     AES_TNPR;  // Transmit Next Pointer Register
+    AT91_REG     AES_TNCR;  // Transmit Next Counter Register
+    AT91_REG     AES_PTCR;  // PDC Transfer Control Register
+    AT91_REG     AES_PTSR;  // PDC Transfer Status Register
+} AT91S_AES, *AT91PS_AES;
+
+// -------- AES_CR : (AES Offset: 0x0) Control Register --------
+#define AT91C_AES_START       ((unsigned int) 0x1 <<  0) // (AES) Starts Processing
+#define AT91C_AES_SWRST       ((unsigned int) 0x1 <<  8) // (AES) Software Reset
+#define AT91C_AES_LOADSEED    ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading
+// -------- AES_MR : (AES Offset: 0x4) Mode Register --------
+#define AT91C_AES_CIPHER      ((unsigned int) 0x1 <<  0) // (AES) Processing Mode
+#define AT91C_AES_PROCDLY     ((unsigned int) 0xF <<  4) // (AES) Processing Delay
+#define AT91C_AES_SMOD        ((unsigned int) 0x3 <<  8) // (AES) Start Mode
+#define     AT91C_AES_SMOD_MANUAL               ((unsigned int) 0x0 <<  8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption.
+#define     AT91C_AES_SMOD_AUTO                 ((unsigned int) 0x1 <<  8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet).
+#define     AT91C_AES_SMOD_PDC                  ((unsigned int) 0x2 <<  8) // (AES) PDC Mode (cf datasheet).
+#define AT91C_AES_OPMOD       ((unsigned int) 0x7 << 12) // (AES) Operation Mode
+#define     AT91C_AES_OPMOD_ECB                  ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode.
+#define     AT91C_AES_OPMOD_CBC                  ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode.
+#define     AT91C_AES_OPMOD_OFB                  ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode.
+#define     AT91C_AES_OPMOD_CFB                  ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode.
+#define     AT91C_AES_OPMOD_CTR                  ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode.
+#define AT91C_AES_LOD         ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode
+#define AT91C_AES_CFBS        ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size
+#define     AT91C_AES_CFBS_128_BIT              ((unsigned int) 0x0 << 16) // (AES) 128-bit.
+#define     AT91C_AES_CFBS_64_BIT               ((unsigned int) 0x1 << 16) // (AES) 64-bit.
+#define     AT91C_AES_CFBS_32_BIT               ((unsigned int) 0x2 << 16) // (AES) 32-bit.
+#define     AT91C_AES_CFBS_16_BIT               ((unsigned int) 0x3 << 16) // (AES) 16-bit.
+#define     AT91C_AES_CFBS_8_BIT                ((unsigned int) 0x4 << 16) // (AES) 8-bit.
+#define AT91C_AES_CKEY        ((unsigned int) 0xF << 20) // (AES) Countermeasure Key
+#define AT91C_AES_CTYPE       ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type
+#define     AT91C_AES_CTYPE_TYPE1_EN             ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled.
+#define     AT91C_AES_CTYPE_TYPE2_EN             ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled.
+#define     AT91C_AES_CTYPE_TYPE3_EN             ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled.
+#define     AT91C_AES_CTYPE_TYPE4_EN             ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled.
+#define     AT91C_AES_CTYPE_TYPE5_EN             ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled.
+// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register --------
+#define AT91C_AES_DATRDY      ((unsigned int) 0x1 <<  0) // (AES) DATRDY
+#define AT91C_AES_ENDRX       ((unsigned int) 0x1 <<  1) // (AES) PDC Read Buffer End
+#define AT91C_AES_ENDTX       ((unsigned int) 0x1 <<  2) // (AES) PDC Write Buffer End
+#define AT91C_AES_RXBUFF      ((unsigned int) 0x1 <<  3) // (AES) PDC Read Buffer Full
+#define AT91C_AES_TXBUFE      ((unsigned int) 0x1 <<  4) // (AES) PDC Write Buffer Empty
+#define AT91C_AES_URAD        ((unsigned int) 0x1 <<  8) // (AES) Unspecified Register Access Detection
+// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register --------
+// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register --------
+// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register --------
+#define AT91C_AES_URAT        ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status
+#define     AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode.
+#define     AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing.
+#define     AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing.
+#define     AT91C_AES_URAT_OUT_DAT_READ_SUBKEY  ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation.
+#define     AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation.
+#define     AT91C_AES_URAT_WO_REG_READ          ((unsigned int) 0x5 << 12) // (AES) Write-only register read access.
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Triple Data Encryption Standard
+// *****************************************************************************
+typedef struct _AT91S_TDES {
+    AT91_REG     TDES_CR;   // Control Register
+    AT91_REG     TDES_MR;   // Mode Register
+    AT91_REG     Reserved0[2];  //
+    AT91_REG     TDES_IER;  // Interrupt Enable Register
+    AT91_REG     TDES_IDR;  // Interrupt Disable Register
+    AT91_REG     TDES_IMR;  // Interrupt Mask Register
+    AT91_REG     TDES_ISR;  // Interrupt Status Register
+    AT91_REG     TDES_KEY1WxR[2];   // Key 1 Word x Register
+    AT91_REG     TDES_KEY2WxR[2];   // Key 2 Word x Register
+    AT91_REG     TDES_KEY3WxR[2];   // Key 3 Word x Register
+    AT91_REG     Reserved1[2];  //
+    AT91_REG     TDES_IDATAxR[2];   // Input Data x Register
+    AT91_REG     Reserved2[2];  //
+    AT91_REG     TDES_ODATAxR[2];   // Output Data x Register
+    AT91_REG     Reserved3[2];  //
+    AT91_REG     TDES_IVxR[2];  // Initialization Vector x Register
+    AT91_REG     Reserved4[37];     //
+    AT91_REG     TDES_VR;   // TDES Version Register
+    AT91_REG     TDES_RPR;  // Receive Pointer Register
+    AT91_REG     TDES_RCR;  // Receive Counter Register
+    AT91_REG     TDES_TPR;  // Transmit Pointer Register
+    AT91_REG     TDES_TCR;  // Transmit Counter Register
+    AT91_REG     TDES_RNPR;     // Receive Next Pointer Register
+    AT91_REG     TDES_RNCR;     // Receive Next Counter Register
+    AT91_REG     TDES_TNPR;     // Transmit Next Pointer Register
+    AT91_REG     TDES_TNCR;     // Transmit Next Counter Register
+    AT91_REG     TDES_PTCR;     // PDC Transfer Control Register
+    AT91_REG     TDES_PTSR;     // PDC Transfer Status Register
+} AT91S_TDES, *AT91PS_TDES;
+
+// -------- TDES_CR : (TDES Offset: 0x0) Control Register --------
+#define AT91C_TDES_START      ((unsigned int) 0x1 <<  0) // (TDES) Starts Processing
+#define AT91C_TDES_SWRST      ((unsigned int) 0x1 <<  8) // (TDES) Software Reset
+// -------- TDES_MR : (TDES Offset: 0x4) Mode Register --------
+#define AT91C_TDES_CIPHER     ((unsigned int) 0x1 <<  0) // (TDES) Processing Mode
+#define AT91C_TDES_TDESMOD    ((unsigned int) 0x1 <<  1) // (TDES) Single or Triple DES Mode
+#define AT91C_TDES_KEYMOD     ((unsigned int) 0x1 <<  4) // (TDES) Key Mode
+#define AT91C_TDES_SMOD       ((unsigned int) 0x3 <<  8) // (TDES) Start Mode
+#define     AT91C_TDES_SMOD_MANUAL               ((unsigned int) 0x0 <<  8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption.
+#define     AT91C_TDES_SMOD_AUTO                 ((unsigned int) 0x1 <<  8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet).
+#define     AT91C_TDES_SMOD_PDC                  ((unsigned int) 0x2 <<  8) // (TDES) PDC Mode (cf datasheet).
+#define AT91C_TDES_OPMOD      ((unsigned int) 0x3 << 12) // (TDES) Operation Mode
+#define     AT91C_TDES_OPMOD_ECB                  ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode.
+#define     AT91C_TDES_OPMOD_CBC                  ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode.
+#define     AT91C_TDES_OPMOD_OFB                  ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode.
+#define     AT91C_TDES_OPMOD_CFB                  ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode.
+#define AT91C_TDES_LOD        ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode
+#define AT91C_TDES_CFBS       ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size
+#define     AT91C_TDES_CFBS_64_BIT               ((unsigned int) 0x0 << 16) // (TDES) 64-bit.
+#define     AT91C_TDES_CFBS_32_BIT               ((unsigned int) 0x1 << 16) // (TDES) 32-bit.
+#define     AT91C_TDES_CFBS_16_BIT               ((unsigned int) 0x2 << 16) // (TDES) 16-bit.
+#define     AT91C_TDES_CFBS_8_BIT                ((unsigned int) 0x3 << 16) // (TDES) 8-bit.
+// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register --------
+#define AT91C_TDES_DATRDY     ((unsigned int) 0x1 <<  0) // (TDES) DATRDY
+#define AT91C_TDES_ENDRX      ((unsigned int) 0x1 <<  1) // (TDES) PDC Read Buffer End
+#define AT91C_TDES_ENDTX      ((unsigned int) 0x1 <<  2) // (TDES) PDC Write Buffer End
+#define AT91C_TDES_RXBUFF     ((unsigned int) 0x1 <<  3) // (TDES) PDC Read Buffer Full
+#define AT91C_TDES_TXBUFE     ((unsigned int) 0x1 <<  4) // (TDES) PDC Write Buffer Empty
+#define AT91C_TDES_URAD       ((unsigned int) 0x1 <<  8) // (TDES) Unspecified Register Access Detection
+// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register --------
+// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register --------
+// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register --------
+#define AT91C_TDES_URAT       ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status
+#define     AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode.
+#define     AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing.
+#define     AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing.
+#define     AT91C_TDES_URAT_WO_REG_READ          ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access.
+
+// *****************************************************************************
+//               REGISTER ADDRESS DEFINITION FOR AT91SAM7X256
+// *****************************************************************************
+// ========== Register definition for SYS peripheral ==========
+// ========== Register definition for AIC peripheral ==========
+#define AT91C_AIC_IVR   ((AT91_REG *)   0xFFFFF100) // (AIC) IRQ Vector Register
+#define AT91C_AIC_SMR   ((AT91_REG *)   0xFFFFF000) // (AIC) Source Mode Register
+#define AT91C_AIC_FVR   ((AT91_REG *)   0xFFFFF104) // (AIC) FIQ Vector Register
+#define AT91C_AIC_DCR   ((AT91_REG *)   0xFFFFF138) // (AIC) Debug Control Register (Protect)
+#define AT91C_AIC_EOICR ((AT91_REG *)   0xFFFFF130) // (AIC) End of Interrupt Command Register
+#define AT91C_AIC_SVR   ((AT91_REG *)   0xFFFFF080) // (AIC) Source Vector Register
+#define AT91C_AIC_FFSR  ((AT91_REG *)   0xFFFFF148) // (AIC) Fast Forcing Status Register
+#define AT91C_AIC_ICCR  ((AT91_REG *)   0xFFFFF128) // (AIC) Interrupt Clear Command Register
+#define AT91C_AIC_ISR   ((AT91_REG *)   0xFFFFF108) // (AIC) Interrupt Status Register
+#define AT91C_AIC_IMR   ((AT91_REG *)   0xFFFFF110) // (AIC) Interrupt Mask Register
+#define AT91C_AIC_IPR   ((AT91_REG *)   0xFFFFF10C) // (AIC) Interrupt Pending Register
+#define AT91C_AIC_FFER  ((AT91_REG *)   0xFFFFF140) // (AIC) Fast Forcing Enable Register
+#define AT91C_AIC_IECR  ((AT91_REG *)   0xFFFFF120) // (AIC) Interrupt Enable Command Register
+#define AT91C_AIC_ISCR  ((AT91_REG *)   0xFFFFF12C) // (AIC) Interrupt Set Command Register
+#define AT91C_AIC_FFDR  ((AT91_REG *)   0xFFFFF144) // (AIC) Fast Forcing Disable Register
+#define AT91C_AIC_CISR  ((AT91_REG *)   0xFFFFF114) // (AIC) Core Interrupt Status Register
+#define AT91C_AIC_IDCR  ((AT91_REG *)   0xFFFFF124) // (AIC) Interrupt Disable Command Register
+#define AT91C_AIC_SPU   ((AT91_REG *)   0xFFFFF134) // (AIC) Spurious Vector Register
+// ========== Register definition for PDC_DBGU peripheral ==========
+#define AT91C_DBGU_TCR  ((AT91_REG *)   0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register
+#define AT91C_DBGU_RNPR ((AT91_REG *)   0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register
+#define AT91C_DBGU_TNPR ((AT91_REG *)   0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register
+#define AT91C_DBGU_TPR  ((AT91_REG *)   0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register
+#define AT91C_DBGU_RPR  ((AT91_REG *)   0xFFFFF300) // (PDC_DBGU) Receive Pointer Register
+#define AT91C_DBGU_RCR  ((AT91_REG *)   0xFFFFF304) // (PDC_DBGU) Receive Counter Register
+#define AT91C_DBGU_RNCR ((AT91_REG *)   0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register
+#define AT91C_DBGU_PTCR ((AT91_REG *)   0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register
+#define AT91C_DBGU_PTSR ((AT91_REG *)   0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register
+#define AT91C_DBGU_TNCR ((AT91_REG *)   0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register
+// ========== Register definition for DBGU peripheral ==========
+#define AT91C_DBGU_EXID ((AT91_REG *)   0xFFFFF244) // (DBGU) Chip ID Extension Register
+#define AT91C_DBGU_BRGR ((AT91_REG *)   0xFFFFF220) // (DBGU) Baud Rate Generator Register
+#define AT91C_DBGU_IDR  ((AT91_REG *)   0xFFFFF20C) // (DBGU) Interrupt Disable Register
+#define AT91C_DBGU_CSR  ((AT91_REG *)   0xFFFFF214) // (DBGU) Channel Status Register
+#define AT91C_DBGU_CIDR ((AT91_REG *)   0xFFFFF240) // (DBGU) Chip ID Register
+#define AT91C_DBGU_MR   ((AT91_REG *)   0xFFFFF204) // (DBGU) Mode Register
+#define AT91C_DBGU_IMR  ((AT91_REG *)   0xFFFFF210) // (DBGU) Interrupt Mask Register
+#define AT91C_DBGU_CR   ((AT91_REG *)   0xFFFFF200) // (DBGU) Control Register
+#define AT91C_DBGU_FNTR ((AT91_REG *)   0xFFFFF248) // (DBGU) Force NTRST Register
+#define AT91C_DBGU_THR  ((AT91_REG *)   0xFFFFF21C) // (DBGU) Transmitter Holding Register
+#define AT91C_DBGU_RHR  ((AT91_REG *)   0xFFFFF218) // (DBGU) Receiver Holding Register
+#define AT91C_DBGU_IER  ((AT91_REG *)   0xFFFFF208) // (DBGU) Interrupt Enable Register
+// ========== Register definition for PIOA peripheral ==========
+#define AT91C_PIOA_ODR  ((AT91_REG *)   0xFFFFF414) // (PIOA) Output Disable Registerr
+#define AT91C_PIOA_SODR ((AT91_REG *)   0xFFFFF430) // (PIOA) Set Output Data Register
+#define AT91C_PIOA_ISR  ((AT91_REG *)   0xFFFFF44C) // (PIOA) Interrupt Status Register
+#define AT91C_PIOA_ABSR ((AT91_REG *)   0xFFFFF478) // (PIOA) AB Select Status Register
+#define AT91C_PIOA_IER  ((AT91_REG *)   0xFFFFF440) // (PIOA) Interrupt Enable Register
+#define AT91C_PIOA_PPUDR ((AT91_REG *)  0xFFFFF460) // (PIOA) Pull-up Disable Register
+#define AT91C_PIOA_IMR  ((AT91_REG *)   0xFFFFF448) // (PIOA) Interrupt Mask Register
+#define AT91C_PIOA_PER  ((AT91_REG *)   0xFFFFF400) // (PIOA) PIO Enable Register
+#define AT91C_PIOA_IFDR ((AT91_REG *)   0xFFFFF424) // (PIOA) Input Filter Disable Register
+#define AT91C_PIOA_OWDR ((AT91_REG *)   0xFFFFF4A4) // (PIOA) Output Write Disable Register
+#define AT91C_PIOA_MDSR ((AT91_REG *)   0xFFFFF458) // (PIOA) Multi-driver Status Register
+#define AT91C_PIOA_IDR  ((AT91_REG *)   0xFFFFF444) // (PIOA) Interrupt Disable Register
+#define AT91C_PIOA_ODSR ((AT91_REG *)   0xFFFFF438) // (PIOA) Output Data Status Register
+#define AT91C_PIOA_PPUSR ((AT91_REG *)  0xFFFFF468) // (PIOA) Pull-up Status Register
+#define AT91C_PIOA_OWSR ((AT91_REG *)   0xFFFFF4A8) // (PIOA) Output Write Status Register
+#define AT91C_PIOA_BSR  ((AT91_REG *)   0xFFFFF474) // (PIOA) Select B Register
+#define AT91C_PIOA_OWER ((AT91_REG *)   0xFFFFF4A0) // (PIOA) Output Write Enable Register
+#define AT91C_PIOA_IFER ((AT91_REG *)   0xFFFFF420) // (PIOA) Input Filter Enable Register
+#define AT91C_PIOA_PDSR ((AT91_REG *)   0xFFFFF43C) // (PIOA) Pin Data Status Register
+#define AT91C_PIOA_PPUER ((AT91_REG *)  0xFFFFF464) // (PIOA) Pull-up Enable Register
+#define AT91C_PIOA_OSR  ((AT91_REG *)   0xFFFFF418) // (PIOA) Output Status Register
+#define AT91C_PIOA_ASR  ((AT91_REG *)   0xFFFFF470) // (PIOA) Select A Register
+#define AT91C_PIOA_MDDR ((AT91_REG *)   0xFFFFF454) // (PIOA) Multi-driver Disable Register
+#define AT91C_PIOA_CODR ((AT91_REG *)   0xFFFFF434) // (PIOA) Clear Output Data Register
+#define AT91C_PIOA_MDER ((AT91_REG *)   0xFFFFF450) // (PIOA) Multi-driver Enable Register
+#define AT91C_PIOA_PDR  ((AT91_REG *)   0xFFFFF404) // (PIOA) PIO Disable Register
+#define AT91C_PIOA_IFSR ((AT91_REG *)   0xFFFFF428) // (PIOA) Input Filter Status Register
+#define AT91C_PIOA_OER  ((AT91_REG *)   0xFFFFF410) // (PIOA) Output Enable Register
+#define AT91C_PIOA_PSR  ((AT91_REG *)   0xFFFFF408) // (PIOA) PIO Status Register
+// ========== Register definition for PIOB peripheral ==========
+#define AT91C_PIOB_OWDR ((AT91_REG *)   0xFFFFF6A4) // (PIOB) Output Write Disable Register
+#define AT91C_PIOB_MDER ((AT91_REG *)   0xFFFFF650) // (PIOB) Multi-driver Enable Register
+#define AT91C_PIOB_PPUSR ((AT91_REG *)  0xFFFFF668) // (PIOB) Pull-up Status Register
+#define AT91C_PIOB_IMR  ((AT91_REG *)   0xFFFFF648) // (PIOB) Interrupt Mask Register
+#define AT91C_PIOB_ASR  ((AT91_REG *)   0xFFFFF670) // (PIOB) Select A Register
+#define AT91C_PIOB_PPUDR ((AT91_REG *)  0xFFFFF660) // (PIOB) Pull-up Disable Register
+#define AT91C_PIOB_PSR  ((AT91_REG *)   0xFFFFF608) // (PIOB) PIO Status Register
+#define AT91C_PIOB_IER  ((AT91_REG *)   0xFFFFF640) // (PIOB) Interrupt Enable Register
+#define AT91C_PIOB_CODR ((AT91_REG *)   0xFFFFF634) // (PIOB) Clear Output Data Register
+#define AT91C_PIOB_OWER ((AT91_REG *)   0xFFFFF6A0) // (PIOB) Output Write Enable Register
+#define AT91C_PIOB_ABSR ((AT91_REG *)   0xFFFFF678) // (PIOB) AB Select Status Register
+#define AT91C_PIOB_IFDR ((AT91_REG *)   0xFFFFF624) // (PIOB) Input Filter Disable Register
+#define AT91C_PIOB_PDSR ((AT91_REG *)   0xFFFFF63C) // (PIOB) Pin Data Status Register
+#define AT91C_PIOB_IDR  ((AT91_REG *)   0xFFFFF644) // (PIOB) Interrupt Disable Register
+#define AT91C_PIOB_OWSR ((AT91_REG *)   0xFFFFF6A8) // (PIOB) Output Write Status Register
+#define AT91C_PIOB_PDR  ((AT91_REG *)   0xFFFFF604) // (PIOB) PIO Disable Register
+#define AT91C_PIOB_ODR  ((AT91_REG *)   0xFFFFF614) // (PIOB) Output Disable Registerr
+#define AT91C_PIOB_IFSR ((AT91_REG *)   0xFFFFF628) // (PIOB) Input Filter Status Register
+#define AT91C_PIOB_PPUER ((AT91_REG *)  0xFFFFF664) // (PIOB) Pull-up Enable Register
+#define AT91C_PIOB_SODR ((AT91_REG *)   0xFFFFF630) // (PIOB) Set Output Data Register
+#define AT91C_PIOB_ISR  ((AT91_REG *)   0xFFFFF64C) // (PIOB) Interrupt Status Register
+#define AT91C_PIOB_ODSR ((AT91_REG *)   0xFFFFF638) // (PIOB) Output Data Status Register
+#define AT91C_PIOB_OSR  ((AT91_REG *)   0xFFFFF618) // (PIOB) Output Status Register
+#define AT91C_PIOB_MDSR ((AT91_REG *)   0xFFFFF658) // (PIOB) Multi-driver Status Register
+#define AT91C_PIOB_IFER ((AT91_REG *)   0xFFFFF620) // (PIOB) Input Filter Enable Register
+#define AT91C_PIOB_BSR  ((AT91_REG *)   0xFFFFF674) // (PIOB) Select B Register
+#define AT91C_PIOB_MDDR ((AT91_REG *)   0xFFFFF654) // (PIOB) Multi-driver Disable Register
+#define AT91C_PIOB_OER  ((AT91_REG *)   0xFFFFF610) // (PIOB) Output Enable Register
+#define AT91C_PIOB_PER  ((AT91_REG *)   0xFFFFF600) // (PIOB) PIO Enable Register
+// ========== Register definition for CKGR peripheral ==========
+#define AT91C_CKGR_MOR  ((AT91_REG *)   0xFFFFFC20) // (CKGR) Main Oscillator Register
+#define AT91C_CKGR_PLLR ((AT91_REG *)   0xFFFFFC2C) // (CKGR) PLL Register
+#define AT91C_CKGR_MCFR ((AT91_REG *)   0xFFFFFC24) // (CKGR) Main Clock  Frequency Register
+// ========== Register definition for PMC peripheral ==========
+#define AT91C_PMC_IDR   ((AT91_REG *)   0xFFFFFC64) // (PMC) Interrupt Disable Register
+#define AT91C_PMC_MOR   ((AT91_REG *)   0xFFFFFC20) // (PMC) Main Oscillator Register
+#define AT91C_PMC_PLLR  ((AT91_REG *)   0xFFFFFC2C) // (PMC) PLL Register
+#define AT91C_PMC_PCER  ((AT91_REG *)   0xFFFFFC10) // (PMC) Peripheral Clock Enable Register
+#define AT91C_PMC_PCKR  ((AT91_REG *)   0xFFFFFC40) // (PMC) Programmable Clock Register
+#define AT91C_PMC_MCKR  ((AT91_REG *)   0xFFFFFC30) // (PMC) Master Clock Register
+#define AT91C_PMC_SCDR  ((AT91_REG *)   0xFFFFFC04) // (PMC) System Clock Disable Register
+#define AT91C_PMC_PCDR  ((AT91_REG *)   0xFFFFFC14) // (PMC) Peripheral Clock Disable Register
+#define AT91C_PMC_SCSR  ((AT91_REG *)   0xFFFFFC08) // (PMC) System Clock Status Register
+#define AT91C_PMC_PCSR  ((AT91_REG *)   0xFFFFFC18) // (PMC) Peripheral Clock Status Register
+#define AT91C_PMC_MCFR  ((AT91_REG *)   0xFFFFFC24) // (PMC) Main Clock  Frequency Register
+#define AT91C_PMC_SCER  ((AT91_REG *)   0xFFFFFC00) // (PMC) System Clock Enable Register
+#define AT91C_PMC_IMR   ((AT91_REG *)   0xFFFFFC6C) // (PMC) Interrupt Mask Register
+#define AT91C_PMC_IER   ((AT91_REG *)   0xFFFFFC60) // (PMC) Interrupt Enable Register
+#define AT91C_PMC_SR    ((AT91_REG *)   0xFFFFFC68) // (PMC) Status Register
+// ========== Register definition for RSTC peripheral ==========
+#define AT91C_RSTC_RCR  ((AT91_REG *)   0xFFFFFD00) // (RSTC) Reset Control Register
+#define AT91C_RSTC_RMR  ((AT91_REG *)   0xFFFFFD08) // (RSTC) Reset Mode Register
+#define AT91C_RSTC_RSR  ((AT91_REG *)   0xFFFFFD04) // (RSTC) Reset Status Register
+// ========== Register definition for RTTC peripheral ==========
+#define AT91C_RTTC_RTSR ((AT91_REG *)   0xFFFFFD2C) // (RTTC) Real-time Status Register
+#define AT91C_RTTC_RTMR ((AT91_REG *)   0xFFFFFD20) // (RTTC) Real-time Mode Register
+#define AT91C_RTTC_RTVR ((AT91_REG *)   0xFFFFFD28) // (RTTC) Real-time Value Register
+#define AT91C_RTTC_RTAR ((AT91_REG *)   0xFFFFFD24) // (RTTC) Real-time Alarm Register
+// ========== Register definition for PITC peripheral ==========
+#define AT91C_PITC_PIVR ((AT91_REG *)   0xFFFFFD38) // (PITC) Period Interval Value Register
+#define AT91C_PITC_PISR ((AT91_REG *)   0xFFFFFD34) // (PITC) Period Interval Status Register
+#define AT91C_PITC_PIIR ((AT91_REG *)   0xFFFFFD3C) // (PITC) Period Interval Image Register
+#define AT91C_PITC_PIMR ((AT91_REG *)   0xFFFFFD30) // (PITC) Period Interval Mode Register
+// ========== Register definition for WDTC peripheral ==========
+#define AT91C_WDTC_WDCR ((AT91_REG *)   0xFFFFFD40) // (WDTC) Watchdog Control Register
+#define AT91C_WDTC_WDSR ((AT91_REG *)   0xFFFFFD48) // (WDTC) Watchdog Status Register
+#define AT91C_WDTC_WDMR ((AT91_REG *)   0xFFFFFD44) // (WDTC) Watchdog Mode Register
+// ========== Register definition for VREG peripheral ==========
+#define AT91C_VREG_MR   ((AT91_REG *)   0xFFFFFD60) // (VREG) Voltage Regulator Mode Register
+// ========== Register definition for MC peripheral ==========
+#define AT91C_MC_ASR    ((AT91_REG *)   0xFFFFFF04) // (MC) MC Abort Status Register
+#define AT91C_MC_RCR    ((AT91_REG *)   0xFFFFFF00) // (MC) MC Remap Control Register
+#define AT91C_MC_FCR    ((AT91_REG *)   0xFFFFFF64) // (MC) MC Flash Command Register
+#define AT91C_MC_AASR   ((AT91_REG *)   0xFFFFFF08) // (MC) MC Abort Address Status Register
+#define AT91C_MC_FSR    ((AT91_REG *)   0xFFFFFF68) // (MC) MC Flash Status Register
+#define AT91C_MC_FMR    ((AT91_REG *)   0xFFFFFF60) // (MC) MC Flash Mode Register
+// ========== Register definition for PDC_SPI1 peripheral ==========
+#define AT91C_SPI1_PTCR ((AT91_REG *)   0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register
+#define AT91C_SPI1_RPR  ((AT91_REG *)   0xFFFE4100) // (PDC_SPI1) Receive Pointer Register
+#define AT91C_SPI1_TNCR ((AT91_REG *)   0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register
+#define AT91C_SPI1_TPR  ((AT91_REG *)   0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register
+#define AT91C_SPI1_TNPR ((AT91_REG *)   0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register
+#define AT91C_SPI1_TCR  ((AT91_REG *)   0xFFFE410C) // (PDC_SPI1) Transmit Counter Register
+#define AT91C_SPI1_RCR  ((AT91_REG *)   0xFFFE4104) // (PDC_SPI1) Receive Counter Register
+#define AT91C_SPI1_RNPR ((AT91_REG *)   0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register
+#define AT91C_SPI1_RNCR ((AT91_REG *)   0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register
+#define AT91C_SPI1_PTSR ((AT91_REG *)   0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register
+// ========== Register definition for SPI1 peripheral ==========
+#define AT91C_SPI1_IMR  ((AT91_REG *)   0xFFFE401C) // (SPI1) Interrupt Mask Register
+#define AT91C_SPI1_IER  ((AT91_REG *)   0xFFFE4014) // (SPI1) Interrupt Enable Register
+#define AT91C_SPI1_MR   ((AT91_REG *)   0xFFFE4004) // (SPI1) Mode Register
+#define AT91C_SPI1_RDR  ((AT91_REG *)   0xFFFE4008) // (SPI1) Receive Data Register
+#define AT91C_SPI1_IDR  ((AT91_REG *)   0xFFFE4018) // (SPI1) Interrupt Disable Register
+#define AT91C_SPI1_SR   ((AT91_REG *)   0xFFFE4010) // (SPI1) Status Register
+#define AT91C_SPI1_TDR  ((AT91_REG *)   0xFFFE400C) // (SPI1) Transmit Data Register
+#define AT91C_SPI1_CR   ((AT91_REG *)   0xFFFE4000) // (SPI1) Control Register
+#define AT91C_SPI1_CSR  ((AT91_REG *)   0xFFFE4030) // (SPI1) Chip Select Register
+// ========== Register definition for PDC_SPI0 peripheral ==========
+#define AT91C_SPI0_PTCR ((AT91_REG *)   0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register
+#define AT91C_SPI0_TPR  ((AT91_REG *)   0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register
+#define AT91C_SPI0_TCR  ((AT91_REG *)   0xFFFE010C) // (PDC_SPI0) Transmit Counter Register
+#define AT91C_SPI0_RCR  ((AT91_REG *)   0xFFFE0104) // (PDC_SPI0) Receive Counter Register
+#define AT91C_SPI0_PTSR ((AT91_REG *)   0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register
+#define AT91C_SPI0_RNPR ((AT91_REG *)   0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register
+#define AT91C_SPI0_RPR  ((AT91_REG *)   0xFFFE0100) // (PDC_SPI0) Receive Pointer Register
+#define AT91C_SPI0_TNCR ((AT91_REG *)   0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register
+#define AT91C_SPI0_RNCR ((AT91_REG *)   0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register
+#define AT91C_SPI0_TNPR ((AT91_REG *)   0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register
+// ========== Register definition for SPI0 peripheral ==========
+#define AT91C_SPI0_IER  ((AT91_REG *)   0xFFFE0014) // (SPI0) Interrupt Enable Register
+#define AT91C_SPI0_SR   ((AT91_REG *)   0xFFFE0010) // (SPI0) Status Register
+#define AT91C_SPI0_IDR  ((AT91_REG *)   0xFFFE0018) // (SPI0) Interrupt Disable Register
+#define AT91C_SPI0_CR   ((AT91_REG *)   0xFFFE0000) // (SPI0) Control Register
+#define AT91C_SPI0_MR   ((AT91_REG *)   0xFFFE0004) // (SPI0) Mode Register
+#define AT91C_SPI0_IMR  ((AT91_REG *)   0xFFFE001C) // (SPI0) Interrupt Mask Register
+#define AT91C_SPI0_TDR  ((AT91_REG *)   0xFFFE000C) // (SPI0) Transmit Data Register
+#define AT91C_SPI0_RDR  ((AT91_REG *)   0xFFFE0008) // (SPI0) Receive Data Register
+#define AT91C_SPI0_CSR  ((AT91_REG *)   0xFFFE0030) // (SPI0) Chip Select Register
+// ========== Register definition for PDC_US1 peripheral ==========
+#define AT91C_US1_RNCR  ((AT91_REG *)   0xFFFC4114) // (PDC_US1) Receive Next Counter Register
+#define AT91C_US1_PTCR  ((AT91_REG *)   0xFFFC4120) // (PDC_US1) PDC Transfer Control Register
+#define AT91C_US1_TCR   ((AT91_REG *)   0xFFFC410C) // (PDC_US1) Transmit Counter Register
+#define AT91C_US1_PTSR  ((AT91_REG *)   0xFFFC4124) // (PDC_US1) PDC Transfer Status Register
+#define AT91C_US1_TNPR  ((AT91_REG *)   0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register
+#define AT91C_US1_RCR   ((AT91_REG *)   0xFFFC4104) // (PDC_US1) Receive Counter Register
+#define AT91C_US1_RNPR  ((AT91_REG *)   0xFFFC4110) // (PDC_US1) Receive Next Pointer Register
+#define AT91C_US1_RPR   ((AT91_REG *)   0xFFFC4100) // (PDC_US1) Receive Pointer Register
+#define AT91C_US1_TNCR  ((AT91_REG *)   0xFFFC411C) // (PDC_US1) Transmit Next Counter Register
+#define AT91C_US1_TPR   ((AT91_REG *)   0xFFFC4108) // (PDC_US1) Transmit Pointer Register
+// ========== Register definition for US1 peripheral ==========
+#define AT91C_US1_IF    ((AT91_REG *)   0xFFFC404C) // (US1) IRDA_FILTER Register
+#define AT91C_US1_NER   ((AT91_REG *)   0xFFFC4044) // (US1) Nb Errors Register
+#define AT91C_US1_RTOR  ((AT91_REG *)   0xFFFC4024) // (US1) Receiver Time-out Register
+#define AT91C_US1_CSR   ((AT91_REG *)   0xFFFC4014) // (US1) Channel Status Register
+#define AT91C_US1_IDR   ((AT91_REG *)   0xFFFC400C) // (US1) Interrupt Disable Register
+#define AT91C_US1_IER   ((AT91_REG *)   0xFFFC4008) // (US1) Interrupt Enable Register
+#define AT91C_US1_THR   ((AT91_REG *)   0xFFFC401C) // (US1) Transmitter Holding Register
+#define AT91C_US1_TTGR  ((AT91_REG *)   0xFFFC4028) // (US1) Transmitter Time-guard Register
+#define AT91C_US1_RHR   ((AT91_REG *)   0xFFFC4018) // (US1) Receiver Holding Register
+#define AT91C_US1_BRGR  ((AT91_REG *)   0xFFFC4020) // (US1) Baud Rate Generator Register
+#define AT91C_US1_IMR   ((AT91_REG *)   0xFFFC4010) // (US1) Interrupt Mask Register
+#define AT91C_US1_FIDI  ((AT91_REG *)   0xFFFC4040) // (US1) FI_DI_Ratio Register
+#define AT91C_US1_CR    ((AT91_REG *)   0xFFFC4000) // (US1) Control Register
+#define AT91C_US1_MR    ((AT91_REG *)   0xFFFC4004) // (US1) Mode Register
+// ========== Register definition for PDC_US0 peripheral ==========
+#define AT91C_US0_TNPR  ((AT91_REG *)   0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register
+#define AT91C_US0_RNPR  ((AT91_REG *)   0xFFFC0110) // (PDC_US0) Receive Next Pointer Register
+#define AT91C_US0_TCR   ((AT91_REG *)   0xFFFC010C) // (PDC_US0) Transmit Counter Register
+#define AT91C_US0_PTCR  ((AT91_REG *)   0xFFFC0120) // (PDC_US0) PDC Transfer Control Register
+#define AT91C_US0_PTSR  ((AT91_REG *)   0xFFFC0124) // (PDC_US0) PDC Transfer Status Register
+#define AT91C_US0_TNCR  ((AT91_REG *)   0xFFFC011C) // (PDC_US0) Transmit Next Counter Register
+#define AT91C_US0_TPR   ((AT91_REG *)   0xFFFC0108) // (PDC_US0) Transmit Pointer Register
+#define AT91C_US0_RCR   ((AT91_REG *)   0xFFFC0104) // (PDC_US0) Receive Counter Register
+#define AT91C_US0_RPR   ((AT91_REG *)   0xFFFC0100) // (PDC_US0) Receive Pointer Register
+#define AT91C_US0_RNCR  ((AT91_REG *)   0xFFFC0114) // (PDC_US0) Receive Next Counter Register
+// ========== Register definition for US0 peripheral ==========
+#define AT91C_US0_BRGR  ((AT91_REG *)   0xFFFC0020) // (US0) Baud Rate Generator Register
+#define AT91C_US0_NER   ((AT91_REG *)   0xFFFC0044) // (US0) Nb Errors Register
+#define AT91C_US0_CR    ((AT91_REG *)   0xFFFC0000) // (US0) Control Register
+#define AT91C_US0_IMR   ((AT91_REG *)   0xFFFC0010) // (US0) Interrupt Mask Register
+#define AT91C_US0_FIDI  ((AT91_REG *)   0xFFFC0040) // (US0) FI_DI_Ratio Register
+#define AT91C_US0_TTGR  ((AT91_REG *)   0xFFFC0028) // (US0) Transmitter Time-guard Register
+#define AT91C_US0_MR    ((AT91_REG *)   0xFFFC0004) // (US0) Mode Register
+#define AT91C_US0_RTOR  ((AT91_REG *)   0xFFFC0024) // (US0) Receiver Time-out Register
+#define AT91C_US0_CSR   ((AT91_REG *)   0xFFFC0014) // (US0) Channel Status Register
+#define AT91C_US0_RHR   ((AT91_REG *)   0xFFFC0018) // (US0) Receiver Holding Register
+#define AT91C_US0_IDR   ((AT91_REG *)   0xFFFC000C) // (US0) Interrupt Disable Register
+#define AT91C_US0_THR   ((AT91_REG *)   0xFFFC001C) // (US0) Transmitter Holding Register
+#define AT91C_US0_IF    ((AT91_REG *)   0xFFFC004C) // (US0) IRDA_FILTER Register
+#define AT91C_US0_IER   ((AT91_REG *)   0xFFFC0008) // (US0) Interrupt Enable Register
+// ========== Register definition for PDC_SSC peripheral ==========
+#define AT91C_SSC_TNCR  ((AT91_REG *)   0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register
+#define AT91C_SSC_RPR   ((AT91_REG *)   0xFFFD4100) // (PDC_SSC) Receive Pointer Register
+#define AT91C_SSC_RNCR  ((AT91_REG *)   0xFFFD4114) // (PDC_SSC) Receive Next Counter Register
+#define AT91C_SSC_TPR   ((AT91_REG *)   0xFFFD4108) // (PDC_SSC) Transmit Pointer Register
+#define AT91C_SSC_PTCR  ((AT91_REG *)   0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register
+#define AT91C_SSC_TCR   ((AT91_REG *)   0xFFFD410C) // (PDC_SSC) Transmit Counter Register
+#define AT91C_SSC_RCR   ((AT91_REG *)   0xFFFD4104) // (PDC_SSC) Receive Counter Register
+#define AT91C_SSC_RNPR  ((AT91_REG *)   0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register
+#define AT91C_SSC_TNPR  ((AT91_REG *)   0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register
+#define AT91C_SSC_PTSR  ((AT91_REG *)   0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register
+// ========== Register definition for SSC peripheral ==========
+#define AT91C_SSC_RHR   ((AT91_REG *)   0xFFFD4020) // (SSC) Receive Holding Register
+#define AT91C_SSC_RSHR  ((AT91_REG *)   0xFFFD4030) // (SSC) Receive Sync Holding Register
+#define AT91C_SSC_TFMR  ((AT91_REG *)   0xFFFD401C) // (SSC) Transmit Frame Mode Register
+#define AT91C_SSC_IDR   ((AT91_REG *)   0xFFFD4048) // (SSC) Interrupt Disable Register
+#define AT91C_SSC_THR   ((AT91_REG *)   0xFFFD4024) // (SSC) Transmit Holding Register
+#define AT91C_SSC_RCMR  ((AT91_REG *)   0xFFFD4010) // (SSC) Receive Clock ModeRegister
+#define AT91C_SSC_IER   ((AT91_REG *)   0xFFFD4044) // (SSC) Interrupt Enable Register
+#define AT91C_SSC_TSHR  ((AT91_REG *)   0xFFFD4034) // (SSC) Transmit Sync Holding Register
+#define AT91C_SSC_SR    ((AT91_REG *)   0xFFFD4040) // (SSC) Status Register
+#define AT91C_SSC_CMR   ((AT91_REG *)   0xFFFD4004) // (SSC) Clock Mode Register
+#define AT91C_SSC_TCMR  ((AT91_REG *)   0xFFFD4018) // (SSC) Transmit Clock Mode Register
+#define AT91C_SSC_CR    ((AT91_REG *)   0xFFFD4000) // (SSC) Control Register
+#define AT91C_SSC_IMR   ((AT91_REG *)   0xFFFD404C) // (SSC) Interrupt Mask Register
+#define AT91C_SSC_RFMR  ((AT91_REG *)   0xFFFD4014) // (SSC) Receive Frame Mode Register
+// ========== Register definition for TWI peripheral ==========
+#define AT91C_TWI_IER   ((AT91_REG *)   0xFFFB8024) // (TWI) Interrupt Enable Register
+#define AT91C_TWI_CR    ((AT91_REG *)   0xFFFB8000) // (TWI) Control Register
+#define AT91C_TWI_SR    ((AT91_REG *)   0xFFFB8020) // (TWI) Status Register
+#define AT91C_TWI_IMR   ((AT91_REG *)   0xFFFB802C) // (TWI) Interrupt Mask Register
+#define AT91C_TWI_THR   ((AT91_REG *)   0xFFFB8034) // (TWI) Transmit Holding Register
+#define AT91C_TWI_IDR   ((AT91_REG *)   0xFFFB8028) // (TWI) Interrupt Disable Register
+#define AT91C_TWI_IADR  ((AT91_REG *)   0xFFFB800C) // (TWI) Internal Address Register
+#define AT91C_TWI_MMR   ((AT91_REG *)   0xFFFB8004) // (TWI) Master Mode Register
+#define AT91C_TWI_CWGR  ((AT91_REG *)   0xFFFB8010) // (TWI) Clock Waveform Generator Register
+#define AT91C_TWI_RHR   ((AT91_REG *)   0xFFFB8030) // (TWI) Receive Holding Register
+// ========== Register definition for PWMC_CH3 peripheral ==========
+#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *)  0xFFFCC270) // (PWMC_CH3) Channel Update Register
+#define AT91C_PWMC_CH3_Reserved ((AT91_REG *)   0xFFFCC274) // (PWMC_CH3) Reserved
+#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *)  0xFFFCC268) // (PWMC_CH3) Channel Period Register
+#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *)  0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register
+#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *)  0xFFFCC26C) // (PWMC_CH3) Channel Counter Register
+#define AT91C_PWMC_CH3_CMR ((AT91_REG *)    0xFFFCC260) // (PWMC_CH3) Channel Mode Register
+// ========== Register definition for PWMC_CH2 peripheral ==========
+#define AT91C_PWMC_CH2_Reserved ((AT91_REG *)   0xFFFCC254) // (PWMC_CH2) Reserved
+#define AT91C_PWMC_CH2_CMR ((AT91_REG *)    0xFFFCC240) // (PWMC_CH2) Channel Mode Register
+#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *)  0xFFFCC24C) // (PWMC_CH2) Channel Counter Register
+#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *)  0xFFFCC248) // (PWMC_CH2) Channel Period Register
+#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *)  0xFFFCC250) // (PWMC_CH2) Channel Update Register
+#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *)  0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register
+// ========== Register definition for PWMC_CH1 peripheral ==========
+#define AT91C_PWMC_CH1_Reserved ((AT91_REG *)   0xFFFCC234) // (PWMC_CH1) Reserved
+#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *)  0xFFFCC230) // (PWMC_CH1) Channel Update Register
+#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *)  0xFFFCC228) // (PWMC_CH1) Channel Period Register
+#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *)  0xFFFCC22C) // (PWMC_CH1) Channel Counter Register
+#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *)  0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register
+#define AT91C_PWMC_CH1_CMR ((AT91_REG *)    0xFFFCC220) // (PWMC_CH1) Channel Mode Register
+// ========== Register definition for PWMC_CH0 peripheral ==========
+#define AT91C_PWMC_CH0_Reserved ((AT91_REG *)   0xFFFCC214) // (PWMC_CH0) Reserved
+#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *)  0xFFFCC208) // (PWMC_CH0) Channel Period Register
+#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *)  0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register
+#define AT91C_PWMC_CH0_CMR ((AT91_REG *)    0xFFFCC200) // (PWMC_CH0) Channel Mode Register
+#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *)  0xFFFCC210) // (PWMC_CH0) Channel Update Register
+#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *)  0xFFFCC20C) // (PWMC_CH0) Channel Counter Register
+// ========== Register definition for PWMC peripheral ==========
+#define AT91C_PWMC_IDR  ((AT91_REG *)   0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register
+#define AT91C_PWMC_DIS  ((AT91_REG *)   0xFFFCC008) // (PWMC) PWMC Disable Register
+#define AT91C_PWMC_IER  ((AT91_REG *)   0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register
+#define AT91C_PWMC_VR   ((AT91_REG *)   0xFFFCC0FC) // (PWMC) PWMC Version Register
+#define AT91C_PWMC_ISR  ((AT91_REG *)   0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register
+#define AT91C_PWMC_SR   ((AT91_REG *)   0xFFFCC00C) // (PWMC) PWMC Status Register
+#define AT91C_PWMC_IMR  ((AT91_REG *)   0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register
+#define AT91C_PWMC_MR   ((AT91_REG *)   0xFFFCC000) // (PWMC) PWMC Mode Register
+#define AT91C_PWMC_ENA  ((AT91_REG *)   0xFFFCC004) // (PWMC) PWMC Enable Register
+// ========== Register definition for UDP peripheral ==========
+#define AT91C_UDP_IMR   ((AT91_REG *)   0xFFFB0018) // (UDP) Interrupt Mask Register
+#define AT91C_UDP_FADDR ((AT91_REG *)   0xFFFB0008) // (UDP) Function Address Register
+#define AT91C_UDP_NUM   ((AT91_REG *)   0xFFFB0000) // (UDP) Frame Number Register
+#define AT91C_UDP_FDR   ((AT91_REG *)   0xFFFB0050) // (UDP) Endpoint FIFO Data Register
+#define AT91C_UDP_ISR   ((AT91_REG *)   0xFFFB001C) // (UDP) Interrupt Status Register
+#define AT91C_UDP_CSR   ((AT91_REG *)   0xFFFB0030) // (UDP) Endpoint Control and Status Register
+#define AT91C_UDP_IDR   ((AT91_REG *)   0xFFFB0014) // (UDP) Interrupt Disable Register
+#define AT91C_UDP_ICR   ((AT91_REG *)   0xFFFB0020) // (UDP) Interrupt Clear Register
+#define AT91C_UDP_RSTEP ((AT91_REG *)   0xFFFB0028) // (UDP) Reset Endpoint Register
+#define AT91C_UDP_TXVC  ((AT91_REG *)   0xFFFB0074) // (UDP) Transceiver Control Register
+#define AT91C_UDP_GLBSTATE ((AT91_REG *)    0xFFFB0004) // (UDP) Global State Register
+#define AT91C_UDP_IER   ((AT91_REG *)   0xFFFB0010) // (UDP) Interrupt Enable Register
+// ========== Register definition for TC0 peripheral ==========
+#define AT91C_TC0_SR    ((AT91_REG *)   0xFFFA0020) // (TC0) Status Register
+#define AT91C_TC0_RC    ((AT91_REG *)   0xFFFA001C) // (TC0) Register C
+#define AT91C_TC0_RB    ((AT91_REG *)   0xFFFA0018) // (TC0) Register B
+#define AT91C_TC0_CCR   ((AT91_REG *)   0xFFFA0000) // (TC0) Channel Control Register
+#define AT91C_TC0_CMR   ((AT91_REG *)   0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC0_IER   ((AT91_REG *)   0xFFFA0024) // (TC0) Interrupt Enable Register
+#define AT91C_TC0_RA    ((AT91_REG *)   0xFFFA0014) // (TC0) Register A
+#define AT91C_TC0_IDR   ((AT91_REG *)   0xFFFA0028) // (TC0) Interrupt Disable Register
+#define AT91C_TC0_CV    ((AT91_REG *)   0xFFFA0010) // (TC0) Counter Value
+#define AT91C_TC0_IMR   ((AT91_REG *)   0xFFFA002C) // (TC0) Interrupt Mask Register
+// ========== Register definition for TC1 peripheral ==========
+#define AT91C_TC1_RB    ((AT91_REG *)   0xFFFA0058) // (TC1) Register B
+#define AT91C_TC1_CCR   ((AT91_REG *)   0xFFFA0040) // (TC1) Channel Control Register
+#define AT91C_TC1_IER   ((AT91_REG *)   0xFFFA0064) // (TC1) Interrupt Enable Register
+#define AT91C_TC1_IDR   ((AT91_REG *)   0xFFFA0068) // (TC1) Interrupt Disable Register
+#define AT91C_TC1_SR    ((AT91_REG *)   0xFFFA0060) // (TC1) Status Register
+#define AT91C_TC1_CMR   ((AT91_REG *)   0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC1_RA    ((AT91_REG *)   0xFFFA0054) // (TC1) Register A
+#define AT91C_TC1_RC    ((AT91_REG *)   0xFFFA005C) // (TC1) Register C
+#define AT91C_TC1_IMR   ((AT91_REG *)   0xFFFA006C) // (TC1) Interrupt Mask Register
+#define AT91C_TC1_CV    ((AT91_REG *)   0xFFFA0050) // (TC1) Counter Value
+// ========== Register definition for TC2 peripheral ==========
+#define AT91C_TC2_CMR   ((AT91_REG *)   0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC2_CCR   ((AT91_REG *)   0xFFFA0080) // (TC2) Channel Control Register
+#define AT91C_TC2_CV    ((AT91_REG *)   0xFFFA0090) // (TC2) Counter Value
+#define AT91C_TC2_RA    ((AT91_REG *)   0xFFFA0094) // (TC2) Register A
+#define AT91C_TC2_RB    ((AT91_REG *)   0xFFFA0098) // (TC2) Register B
+#define AT91C_TC2_IDR   ((AT91_REG *)   0xFFFA00A8) // (TC2) Interrupt Disable Register
+#define AT91C_TC2_IMR   ((AT91_REG *)   0xFFFA00AC) // (TC2) Interrupt Mask Register
+#define AT91C_TC2_RC    ((AT91_REG *)   0xFFFA009C) // (TC2) Register C
+#define AT91C_TC2_IER   ((AT91_REG *)   0xFFFA00A4) // (TC2) Interrupt Enable Register
+#define AT91C_TC2_SR    ((AT91_REG *)   0xFFFA00A0) // (TC2) Status Register
+// ========== Register definition for TCB peripheral ==========
+#define AT91C_TCB_BMR   ((AT91_REG *)   0xFFFA00C4) // (TCB) TC Block Mode Register
+#define AT91C_TCB_BCR   ((AT91_REG *)   0xFFFA00C0) // (TCB) TC Block Control Register
+// ========== Register definition for CAN_MB0 peripheral ==========
+#define AT91C_CAN_MB0_MDL ((AT91_REG *)     0xFFFD0214) // (CAN_MB0) MailBox Data Low Register
+#define AT91C_CAN_MB0_MAM ((AT91_REG *)     0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB0_MCR ((AT91_REG *)     0xFFFD021C) // (CAN_MB0) MailBox Control Register
+#define AT91C_CAN_MB0_MID ((AT91_REG *)     0xFFFD0208) // (CAN_MB0) MailBox ID Register
+#define AT91C_CAN_MB0_MSR ((AT91_REG *)     0xFFFD0210) // (CAN_MB0) MailBox Status Register
+#define AT91C_CAN_MB0_MFID ((AT91_REG *)    0xFFFD020C) // (CAN_MB0) MailBox Family ID Register
+#define AT91C_CAN_MB0_MDH ((AT91_REG *)     0xFFFD0218) // (CAN_MB0) MailBox Data High Register
+#define AT91C_CAN_MB0_MMR ((AT91_REG *)     0xFFFD0200) // (CAN_MB0) MailBox Mode Register
+// ========== Register definition for CAN_MB1 peripheral ==========
+#define AT91C_CAN_MB1_MDL ((AT91_REG *)     0xFFFD0234) // (CAN_MB1) MailBox Data Low Register
+#define AT91C_CAN_MB1_MID ((AT91_REG *)     0xFFFD0228) // (CAN_MB1) MailBox ID Register
+#define AT91C_CAN_MB1_MMR ((AT91_REG *)     0xFFFD0220) // (CAN_MB1) MailBox Mode Register
+#define AT91C_CAN_MB1_MSR ((AT91_REG *)     0xFFFD0230) // (CAN_MB1) MailBox Status Register
+#define AT91C_CAN_MB1_MAM ((AT91_REG *)     0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB1_MDH ((AT91_REG *)     0xFFFD0238) // (CAN_MB1) MailBox Data High Register
+#define AT91C_CAN_MB1_MCR ((AT91_REG *)     0xFFFD023C) // (CAN_MB1) MailBox Control Register
+#define AT91C_CAN_MB1_MFID ((AT91_REG *)    0xFFFD022C) // (CAN_MB1) MailBox Family ID Register
+// ========== Register definition for CAN_MB2 peripheral ==========
+#define AT91C_CAN_MB2_MCR ((AT91_REG *)     0xFFFD025C) // (CAN_MB2) MailBox Control Register
+#define AT91C_CAN_MB2_MDH ((AT91_REG *)     0xFFFD0258) // (CAN_MB2) MailBox Data High Register
+#define AT91C_CAN_MB2_MID ((AT91_REG *)     0xFFFD0248) // (CAN_MB2) MailBox ID Register
+#define AT91C_CAN_MB2_MDL ((AT91_REG *)     0xFFFD0254) // (CAN_MB2) MailBox Data Low Register
+#define AT91C_CAN_MB2_MMR ((AT91_REG *)     0xFFFD0240) // (CAN_MB2) MailBox Mode Register
+#define AT91C_CAN_MB2_MAM ((AT91_REG *)     0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB2_MFID ((AT91_REG *)    0xFFFD024C) // (CAN_MB2) MailBox Family ID Register
+#define AT91C_CAN_MB2_MSR ((AT91_REG *)     0xFFFD0250) // (CAN_MB2) MailBox Status Register
+// ========== Register definition for CAN_MB3 peripheral ==========
+#define AT91C_CAN_MB3_MFID ((AT91_REG *)    0xFFFD026C) // (CAN_MB3) MailBox Family ID Register
+#define AT91C_CAN_MB3_MAM ((AT91_REG *)     0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB3_MID ((AT91_REG *)     0xFFFD0268) // (CAN_MB3) MailBox ID Register
+#define AT91C_CAN_MB3_MCR ((AT91_REG *)     0xFFFD027C) // (CAN_MB3) MailBox Control Register
+#define AT91C_CAN_MB3_MMR ((AT91_REG *)     0xFFFD0260) // (CAN_MB3) MailBox Mode Register
+#define AT91C_CAN_MB3_MSR ((AT91_REG *)     0xFFFD0270) // (CAN_MB3) MailBox Status Register
+#define AT91C_CAN_MB3_MDL ((AT91_REG *)     0xFFFD0274) // (CAN_MB3) MailBox Data Low Register
+#define AT91C_CAN_MB3_MDH ((AT91_REG *)     0xFFFD0278) // (CAN_MB3) MailBox Data High Register
+// ========== Register definition for CAN_MB4 peripheral ==========
+#define AT91C_CAN_MB4_MID ((AT91_REG *)     0xFFFD0288) // (CAN_MB4) MailBox ID Register
+#define AT91C_CAN_MB4_MMR ((AT91_REG *)     0xFFFD0280) // (CAN_MB4) MailBox Mode Register
+#define AT91C_CAN_MB4_MDH ((AT91_REG *)     0xFFFD0298) // (CAN_MB4) MailBox Data High Register
+#define AT91C_CAN_MB4_MFID ((AT91_REG *)    0xFFFD028C) // (CAN_MB4) MailBox Family ID Register
+#define AT91C_CAN_MB4_MSR ((AT91_REG *)     0xFFFD0290) // (CAN_MB4) MailBox Status Register
+#define AT91C_CAN_MB4_MCR ((AT91_REG *)     0xFFFD029C) // (CAN_MB4) MailBox Control Register
+#define AT91C_CAN_MB4_MDL ((AT91_REG *)     0xFFFD0294) // (CAN_MB4) MailBox Data Low Register
+#define AT91C_CAN_MB4_MAM ((AT91_REG *)     0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register
+// ========== Register definition for CAN_MB5 peripheral ==========
+#define AT91C_CAN_MB5_MSR ((AT91_REG *)     0xFFFD02B0) // (CAN_MB5) MailBox Status Register
+#define AT91C_CAN_MB5_MCR ((AT91_REG *)     0xFFFD02BC) // (CAN_MB5) MailBox Control Register
+#define AT91C_CAN_MB5_MFID ((AT91_REG *)    0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register
+#define AT91C_CAN_MB5_MDH ((AT91_REG *)     0xFFFD02B8) // (CAN_MB5) MailBox Data High Register
+#define AT91C_CAN_MB5_MID ((AT91_REG *)     0xFFFD02A8) // (CAN_MB5) MailBox ID Register
+#define AT91C_CAN_MB5_MMR ((AT91_REG *)     0xFFFD02A0) // (CAN_MB5) MailBox Mode Register
+#define AT91C_CAN_MB5_MDL ((AT91_REG *)     0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register
+#define AT91C_CAN_MB5_MAM ((AT91_REG *)     0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register
+// ========== Register definition for CAN_MB6 peripheral ==========
+#define AT91C_CAN_MB6_MFID ((AT91_REG *)    0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register
+#define AT91C_CAN_MB6_MID ((AT91_REG *)     0xFFFD02C8) // (CAN_MB6) MailBox ID Register
+#define AT91C_CAN_MB6_MAM ((AT91_REG *)     0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB6_MSR ((AT91_REG *)     0xFFFD02D0) // (CAN_MB6) MailBox Status Register
+#define AT91C_CAN_MB6_MDL ((AT91_REG *)     0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register
+#define AT91C_CAN_MB6_MCR ((AT91_REG *)     0xFFFD02DC) // (CAN_MB6) MailBox Control Register
+#define AT91C_CAN_MB6_MDH ((AT91_REG *)     0xFFFD02D8) // (CAN_MB6) MailBox Data High Register
+#define AT91C_CAN_MB6_MMR ((AT91_REG *)     0xFFFD02C0) // (CAN_MB6) MailBox Mode Register
+// ========== Register definition for CAN_MB7 peripheral ==========
+#define AT91C_CAN_MB7_MCR ((AT91_REG *)     0xFFFD02FC) // (CAN_MB7) MailBox Control Register
+#define AT91C_CAN_MB7_MDH ((AT91_REG *)     0xFFFD02F8) // (CAN_MB7) MailBox Data High Register
+#define AT91C_CAN_MB7_MFID ((AT91_REG *)    0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register
+#define AT91C_CAN_MB7_MDL ((AT91_REG *)     0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register
+#define AT91C_CAN_MB7_MID ((AT91_REG *)     0xFFFD02E8) // (CAN_MB7) MailBox ID Register
+#define AT91C_CAN_MB7_MMR ((AT91_REG *)     0xFFFD02E0) // (CAN_MB7) MailBox Mode Register
+#define AT91C_CAN_MB7_MAM ((AT91_REG *)     0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB7_MSR ((AT91_REG *)     0xFFFD02F0) // (CAN_MB7) MailBox Status Register
+// ========== Register definition for CAN peripheral ==========
+#define AT91C_CAN_TCR   ((AT91_REG *)   0xFFFD0024) // (CAN) Transfer Command Register
+#define AT91C_CAN_IMR   ((AT91_REG *)   0xFFFD000C) // (CAN) Interrupt Mask Register
+#define AT91C_CAN_IER   ((AT91_REG *)   0xFFFD0004) // (CAN) Interrupt Enable Register
+#define AT91C_CAN_ECR   ((AT91_REG *)   0xFFFD0020) // (CAN) Error Counter Register
+#define AT91C_CAN_TIMESTP ((AT91_REG *)     0xFFFD001C) // (CAN) Time Stamp Register
+#define AT91C_CAN_MR    ((AT91_REG *)   0xFFFD0000) // (CAN) Mode Register
+#define AT91C_CAN_IDR   ((AT91_REG *)   0xFFFD0008) // (CAN) Interrupt Disable Register
+#define AT91C_CAN_ACR   ((AT91_REG *)   0xFFFD0028) // (CAN) Abort Command Register
+#define AT91C_CAN_TIM   ((AT91_REG *)   0xFFFD0018) // (CAN) Timer Register
+#define AT91C_CAN_SR    ((AT91_REG *)   0xFFFD0010) // (CAN) Status Register
+#define AT91C_CAN_BR    ((AT91_REG *)   0xFFFD0014) // (CAN) Baudrate Register
+#define AT91C_CAN_VR    ((AT91_REG *)   0xFFFD00FC) // (CAN) Version Register
+// ========== Register definition for EMAC peripheral ==========
+#define AT91C_EMAC_ISR  ((AT91_REG *)   0xFFFDC024) // (EMAC) Interrupt Status Register
+#define AT91C_EMAC_SA4H ((AT91_REG *)   0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes
+#define AT91C_EMAC_SA1L ((AT91_REG *)   0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes
+#define AT91C_EMAC_ELE  ((AT91_REG *)   0xFFFDC078) // (EMAC) Excessive Length Errors Register
+#define AT91C_EMAC_LCOL ((AT91_REG *)   0xFFFDC05C) // (EMAC) Late Collision Register
+#define AT91C_EMAC_RLE  ((AT91_REG *)   0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register
+#define AT91C_EMAC_WOL  ((AT91_REG *)   0xFFFDC0C4) // (EMAC) Wake On LAN Register
+#define AT91C_EMAC_DTF  ((AT91_REG *)   0xFFFDC058) // (EMAC) Deferred Transmission Frame Register
+#define AT91C_EMAC_TUND ((AT91_REG *)   0xFFFDC064) // (EMAC) Transmit Underrun Error Register
+#define AT91C_EMAC_NCR  ((AT91_REG *)   0xFFFDC000) // (EMAC) Network Control Register
+#define AT91C_EMAC_SA4L ((AT91_REG *)   0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes
+#define AT91C_EMAC_RSR  ((AT91_REG *)   0xFFFDC020) // (EMAC) Receive Status Register
+#define AT91C_EMAC_SA3L ((AT91_REG *)   0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes
+#define AT91C_EMAC_TSR  ((AT91_REG *)   0xFFFDC014) // (EMAC) Transmit Status Register
+#define AT91C_EMAC_IDR  ((AT91_REG *)   0xFFFDC02C) // (EMAC) Interrupt Disable Register
+#define AT91C_EMAC_RSE  ((AT91_REG *)   0xFFFDC074) // (EMAC) Receive Symbol Errors Register
+#define AT91C_EMAC_ECOL ((AT91_REG *)   0xFFFDC060) // (EMAC) Excessive Collision Register
+#define AT91C_EMAC_TID  ((AT91_REG *)   0xFFFDC0B8) // (EMAC) Type ID Checking Register
+#define AT91C_EMAC_HRB  ((AT91_REG *)   0xFFFDC090) // (EMAC) Hash Address Bottom[31:0]
+#define AT91C_EMAC_TBQP ((AT91_REG *)   0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer
+#define AT91C_EMAC_USRIO ((AT91_REG *)  0xFFFDC0C0) // (EMAC) USER Input/Output Register
+#define AT91C_EMAC_PTR  ((AT91_REG *)   0xFFFDC038) // (EMAC) Pause Time Register
+#define AT91C_EMAC_SA2H ((AT91_REG *)   0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes
+#define AT91C_EMAC_ROV  ((AT91_REG *)   0xFFFDC070) // (EMAC) Receive Overrun Errors Register
+#define AT91C_EMAC_ALE  ((AT91_REG *)   0xFFFDC054) // (EMAC) Alignment Error Register
+#define AT91C_EMAC_RJA  ((AT91_REG *)   0xFFFDC07C) // (EMAC) Receive Jabbers Register
+#define AT91C_EMAC_RBQP ((AT91_REG *)   0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer
+#define AT91C_EMAC_TPF  ((AT91_REG *)   0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register
+#define AT91C_EMAC_NCFGR ((AT91_REG *)  0xFFFDC004) // (EMAC) Network Configuration Register
+#define AT91C_EMAC_HRT  ((AT91_REG *)   0xFFFDC094) // (EMAC) Hash Address Top[63:32]
+#define AT91C_EMAC_USF  ((AT91_REG *)   0xFFFDC080) // (EMAC) Undersize Frames Register
+#define AT91C_EMAC_FCSE ((AT91_REG *)   0xFFFDC050) // (EMAC) Frame Check Sequence Error Register
+#define AT91C_EMAC_TPQ  ((AT91_REG *)   0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register
+#define AT91C_EMAC_MAN  ((AT91_REG *)   0xFFFDC034) // (EMAC) PHY Maintenance Register
+#define AT91C_EMAC_FTO  ((AT91_REG *)   0xFFFDC040) // (EMAC) Frames Transmitted OK Register
+#define AT91C_EMAC_REV  ((AT91_REG *)   0xFFFDC0FC) // (EMAC) Revision Register
+#define AT91C_EMAC_IMR  ((AT91_REG *)   0xFFFDC030) // (EMAC) Interrupt Mask Register
+#define AT91C_EMAC_SCF  ((AT91_REG *)   0xFFFDC044) // (EMAC) Single Collision Frame Register
+#define AT91C_EMAC_PFR  ((AT91_REG *)   0xFFFDC03C) // (EMAC) Pause Frames received Register
+#define AT91C_EMAC_MCF  ((AT91_REG *)   0xFFFDC048) // (EMAC) Multiple Collision Frame Register
+#define AT91C_EMAC_NSR  ((AT91_REG *)   0xFFFDC008) // (EMAC) Network Status Register
+#define AT91C_EMAC_SA2L ((AT91_REG *)   0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes
+#define AT91C_EMAC_FRO  ((AT91_REG *)   0xFFFDC04C) // (EMAC) Frames Received OK Register
+#define AT91C_EMAC_IER  ((AT91_REG *)   0xFFFDC028) // (EMAC) Interrupt Enable Register
+#define AT91C_EMAC_SA1H ((AT91_REG *)   0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes
+#define AT91C_EMAC_CSE  ((AT91_REG *)   0xFFFDC068) // (EMAC) Carrier Sense Error Register
+#define AT91C_EMAC_SA3H ((AT91_REG *)   0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes
+#define AT91C_EMAC_RRE  ((AT91_REG *)   0xFFFDC06C) // (EMAC) Receive Ressource Error Register
+#define AT91C_EMAC_STE  ((AT91_REG *)   0xFFFDC084) // (EMAC) SQE Test Error Register
+// ========== Register definition for PDC_ADC peripheral ==========
+#define AT91C_ADC_PTSR  ((AT91_REG *)   0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register
+#define AT91C_ADC_PTCR  ((AT91_REG *)   0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register
+#define AT91C_ADC_TNPR  ((AT91_REG *)   0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register
+#define AT91C_ADC_TNCR  ((AT91_REG *)   0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register
+#define AT91C_ADC_RNPR  ((AT91_REG *)   0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register
+#define AT91C_ADC_RNCR  ((AT91_REG *)   0xFFFD8114) // (PDC_ADC) Receive Next Counter Register
+#define AT91C_ADC_RPR   ((AT91_REG *)   0xFFFD8100) // (PDC_ADC) Receive Pointer Register
+#define AT91C_ADC_TCR   ((AT91_REG *)   0xFFFD810C) // (PDC_ADC) Transmit Counter Register
+#define AT91C_ADC_TPR   ((AT91_REG *)   0xFFFD8108) // (PDC_ADC) Transmit Pointer Register
+#define AT91C_ADC_RCR   ((AT91_REG *)   0xFFFD8104) // (PDC_ADC) Receive Counter Register
+// ========== Register definition for ADC peripheral ==========
+#define AT91C_ADC_CDR2  ((AT91_REG *)   0xFFFD8038) // (ADC) ADC Channel Data Register 2
+#define AT91C_ADC_CDR3  ((AT91_REG *)   0xFFFD803C) // (ADC) ADC Channel Data Register 3
+#define AT91C_ADC_CDR0  ((AT91_REG *)   0xFFFD8030) // (ADC) ADC Channel Data Register 0
+#define AT91C_ADC_CDR5  ((AT91_REG *)   0xFFFD8044) // (ADC) ADC Channel Data Register 5
+#define AT91C_ADC_CHDR  ((AT91_REG *)   0xFFFD8014) // (ADC) ADC Channel Disable Register
+#define AT91C_ADC_SR    ((AT91_REG *)   0xFFFD801C) // (ADC) ADC Status Register
+#define AT91C_ADC_CDR4  ((AT91_REG *)   0xFFFD8040) // (ADC) ADC Channel Data Register 4
+#define AT91C_ADC_CDR1  ((AT91_REG *)   0xFFFD8034) // (ADC) ADC Channel Data Register 1
+#define AT91C_ADC_LCDR  ((AT91_REG *)   0xFFFD8020) // (ADC) ADC Last Converted Data Register
+#define AT91C_ADC_IDR   ((AT91_REG *)   0xFFFD8028) // (ADC) ADC Interrupt Disable Register
+#define AT91C_ADC_CR    ((AT91_REG *)   0xFFFD8000) // (ADC) ADC Control Register
+#define AT91C_ADC_CDR7  ((AT91_REG *)   0xFFFD804C) // (ADC) ADC Channel Data Register 7
+#define AT91C_ADC_CDR6  ((AT91_REG *)   0xFFFD8048) // (ADC) ADC Channel Data Register 6
+#define AT91C_ADC_IER   ((AT91_REG *)   0xFFFD8024) // (ADC) ADC Interrupt Enable Register
+#define AT91C_ADC_CHER  ((AT91_REG *)   0xFFFD8010) // (ADC) ADC Channel Enable Register
+#define AT91C_ADC_CHSR  ((AT91_REG *)   0xFFFD8018) // (ADC) ADC Channel Status Register
+#define AT91C_ADC_MR    ((AT91_REG *)   0xFFFD8004) // (ADC) ADC Mode Register
+#define AT91C_ADC_IMR   ((AT91_REG *)   0xFFFD802C) // (ADC) ADC Interrupt Mask Register
+// ========== Register definition for PDC_AES peripheral ==========
+#define AT91C_AES_TPR   ((AT91_REG *)   0xFFFA4108) // (PDC_AES) Transmit Pointer Register
+#define AT91C_AES_PTCR  ((AT91_REG *)   0xFFFA4120) // (PDC_AES) PDC Transfer Control Register
+#define AT91C_AES_RNPR  ((AT91_REG *)   0xFFFA4110) // (PDC_AES) Receive Next Pointer Register
+#define AT91C_AES_TNCR  ((AT91_REG *)   0xFFFA411C) // (PDC_AES) Transmit Next Counter Register
+#define AT91C_AES_TCR   ((AT91_REG *)   0xFFFA410C) // (PDC_AES) Transmit Counter Register
+#define AT91C_AES_RCR   ((AT91_REG *)   0xFFFA4104) // (PDC_AES) Receive Counter Register
+#define AT91C_AES_RNCR  ((AT91_REG *)   0xFFFA4114) // (PDC_AES) Receive Next Counter Register
+#define AT91C_AES_TNPR  ((AT91_REG *)   0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register
+#define AT91C_AES_RPR   ((AT91_REG *)   0xFFFA4100) // (PDC_AES) Receive Pointer Register
+#define AT91C_AES_PTSR  ((AT91_REG *)   0xFFFA4124) // (PDC_AES) PDC Transfer Status Register
+// ========== Register definition for AES peripheral ==========
+#define AT91C_AES_IVxR  ((AT91_REG *)   0xFFFA4060) // (AES) Initialization Vector x Register
+#define AT91C_AES_MR    ((AT91_REG *)   0xFFFA4004) // (AES) Mode Register
+#define AT91C_AES_VR    ((AT91_REG *)   0xFFFA40FC) // (AES) AES Version Register
+#define AT91C_AES_ODATAxR ((AT91_REG *)     0xFFFA4050) // (AES) Output Data x Register
+#define AT91C_AES_IDATAxR ((AT91_REG *)     0xFFFA4040) // (AES) Input Data x Register
+#define AT91C_AES_CR    ((AT91_REG *)   0xFFFA4000) // (AES) Control Register
+#define AT91C_AES_IDR   ((AT91_REG *)   0xFFFA4014) // (AES) Interrupt Disable Register
+#define AT91C_AES_IMR   ((AT91_REG *)   0xFFFA4018) // (AES) Interrupt Mask Register
+#define AT91C_AES_IER   ((AT91_REG *)   0xFFFA4010) // (AES) Interrupt Enable Register
+#define AT91C_AES_KEYWxR ((AT91_REG *)  0xFFFA4020) // (AES) Key Word x Register
+#define AT91C_AES_ISR   ((AT91_REG *)   0xFFFA401C) // (AES) Interrupt Status Register
+// ========== Register definition for PDC_TDES peripheral ==========
+#define AT91C_TDES_RNCR ((AT91_REG *)   0xFFFA8114) // (PDC_TDES) Receive Next Counter Register
+#define AT91C_TDES_TCR  ((AT91_REG *)   0xFFFA810C) // (PDC_TDES) Transmit Counter Register
+#define AT91C_TDES_RCR  ((AT91_REG *)   0xFFFA8104) // (PDC_TDES) Receive Counter Register
+#define AT91C_TDES_TNPR ((AT91_REG *)   0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register
+#define AT91C_TDES_RNPR ((AT91_REG *)   0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register
+#define AT91C_TDES_RPR  ((AT91_REG *)   0xFFFA8100) // (PDC_TDES) Receive Pointer Register
+#define AT91C_TDES_TNCR ((AT91_REG *)   0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register
+#define AT91C_TDES_TPR  ((AT91_REG *)   0xFFFA8108) // (PDC_TDES) Transmit Pointer Register
+#define AT91C_TDES_PTSR ((AT91_REG *)   0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register
+#define AT91C_TDES_PTCR ((AT91_REG *)   0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register
+// ========== Register definition for TDES peripheral ==========
+#define AT91C_TDES_KEY2WxR ((AT91_REG *)    0xFFFA8028) // (TDES) Key 2 Word x Register
+#define AT91C_TDES_KEY3WxR ((AT91_REG *)    0xFFFA8030) // (TDES) Key 3 Word x Register
+#define AT91C_TDES_IDR  ((AT91_REG *)   0xFFFA8014) // (TDES) Interrupt Disable Register
+#define AT91C_TDES_VR   ((AT91_REG *)   0xFFFA80FC) // (TDES) TDES Version Register
+#define AT91C_TDES_IVxR ((AT91_REG *)   0xFFFA8060) // (TDES) Initialization Vector x Register
+#define AT91C_TDES_ODATAxR ((AT91_REG *)    0xFFFA8050) // (TDES) Output Data x Register
+#define AT91C_TDES_IMR  ((AT91_REG *)   0xFFFA8018) // (TDES) Interrupt Mask Register
+#define AT91C_TDES_MR   ((AT91_REG *)   0xFFFA8004) // (TDES) Mode Register
+#define AT91C_TDES_CR   ((AT91_REG *)   0xFFFA8000) // (TDES) Control Register
+#define AT91C_TDES_IER  ((AT91_REG *)   0xFFFA8010) // (TDES) Interrupt Enable Register
+#define AT91C_TDES_ISR  ((AT91_REG *)   0xFFFA801C) // (TDES) Interrupt Status Register
+#define AT91C_TDES_IDATAxR ((AT91_REG *)    0xFFFA8040) // (TDES) Input Data x Register
+#define AT91C_TDES_KEY1WxR ((AT91_REG *)    0xFFFA8020) // (TDES) Key 1 Word x Register
+
+// *****************************************************************************
+//               PIO DEFINITIONS FOR AT91SAM7X256
+// *****************************************************************************
+#define AT91C_PIO_PA0        ((unsigned int) 1 <<  0) // Pin Controlled by PA0
+#define AT91C_PA0_RXD0     ((unsigned int) AT91C_PIO_PA0) //  USART 0 Receive Data
+#define AT91C_PIO_PA1        ((unsigned int) 1 <<  1) // Pin Controlled by PA1
+#define AT91C_PA1_TXD0     ((unsigned int) AT91C_PIO_PA1) //  USART 0 Transmit Data
+#define AT91C_PIO_PA10       ((unsigned int) 1 << 10) // Pin Controlled by PA10
+#define AT91C_PA10_TWD      ((unsigned int) AT91C_PIO_PA10) //  TWI Two-wire Serial Data
+#define AT91C_PIO_PA11       ((unsigned int) 1 << 11) // Pin Controlled by PA11
+#define AT91C_PA11_TWCK     ((unsigned int) AT91C_PIO_PA11) //  TWI Two-wire Serial Clock
+#define AT91C_PIO_PA12       ((unsigned int) 1 << 12) // Pin Controlled by PA12
+#define AT91C_PA12_NPCS00   ((unsigned int) AT91C_PIO_PA12) //  SPI 0 Peripheral Chip Select 0
+#define AT91C_PIO_PA13       ((unsigned int) 1 << 13) // Pin Controlled by PA13
+#define AT91C_PA13_NPCS01   ((unsigned int) AT91C_PIO_PA13) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PA13_PCK1     ((unsigned int) AT91C_PIO_PA13) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PA14       ((unsigned int) 1 << 14) // Pin Controlled by PA14
+#define AT91C_PA14_NPCS02   ((unsigned int) AT91C_PIO_PA14) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PA14_IRQ1     ((unsigned int) AT91C_PIO_PA14) //  External Interrupt 1
+#define AT91C_PIO_PA15       ((unsigned int) 1 << 15) // Pin Controlled by PA15
+#define AT91C_PA15_NPCS03   ((unsigned int) AT91C_PIO_PA15) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PA15_TCLK2    ((unsigned int) AT91C_PIO_PA15) //  Timer Counter 2 external clock input
+#define AT91C_PIO_PA16       ((unsigned int) 1 << 16) // Pin Controlled by PA16
+#define AT91C_PA16_MISO0    ((unsigned int) AT91C_PIO_PA16) //  SPI 0 Master In Slave
+#define AT91C_PIO_PA17       ((unsigned int) 1 << 17) // Pin Controlled by PA17
+#define AT91C_PA17_MOSI0    ((unsigned int) AT91C_PIO_PA17) //  SPI 0 Master Out Slave
+#define AT91C_PIO_PA18       ((unsigned int) 1 << 18) // Pin Controlled by PA18
+#define AT91C_PA18_SPCK0    ((unsigned int) AT91C_PIO_PA18) //  SPI 0 Serial Clock
+#define AT91C_PIO_PA19       ((unsigned int) 1 << 19) // Pin Controlled by PA19
+#define AT91C_PA19_CANRX    ((unsigned int) AT91C_PIO_PA19) //  CAN Receive
+#define AT91C_PIO_PA2        ((unsigned int) 1 <<  2) // Pin Controlled by PA2
+#define AT91C_PA2_SCK0     ((unsigned int) AT91C_PIO_PA2) //  USART 0 Serial Clock
+#define AT91C_PA2_NPCS11   ((unsigned int) AT91C_PIO_PA2) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PA20       ((unsigned int) 1 << 20) // Pin Controlled by PA20
+#define AT91C_PA20_CANTX    ((unsigned int) AT91C_PIO_PA20) //  CAN Transmit
+#define AT91C_PIO_PA21       ((unsigned int) 1 << 21) // Pin Controlled by PA21
+#define AT91C_PA21_TF       ((unsigned int) AT91C_PIO_PA21) //  SSC Transmit Frame Sync
+#define AT91C_PA21_NPCS10   ((unsigned int) AT91C_PIO_PA21) //  SPI 1 Peripheral Chip Select 0
+#define AT91C_PIO_PA22       ((unsigned int) 1 << 22) // Pin Controlled by PA22
+#define AT91C_PA22_TK       ((unsigned int) AT91C_PIO_PA22) //  SSC Transmit Clock
+#define AT91C_PA22_SPCK1    ((unsigned int) AT91C_PIO_PA22) //  SPI 1 Serial Clock
+#define AT91C_PIO_PA23       ((unsigned int) 1 << 23) // Pin Controlled by PA23
+#define AT91C_PA23_TD       ((unsigned int) AT91C_PIO_PA23) //  SSC Transmit data
+#define AT91C_PA23_MOSI1    ((unsigned int) AT91C_PIO_PA23) //  SPI 1 Master Out Slave
+#define AT91C_PIO_PA24       ((unsigned int) 1 << 24) // Pin Controlled by PA24
+#define AT91C_PA24_RD       ((unsigned int) AT91C_PIO_PA24) //  SSC Receive Data
+#define AT91C_PA24_MISO1    ((unsigned int) AT91C_PIO_PA24) //  SPI 1 Master In Slave
+#define AT91C_PIO_PA25       ((unsigned int) 1 << 25) // Pin Controlled by PA25
+#define AT91C_PA25_RK       ((unsigned int) AT91C_PIO_PA25) //  SSC Receive Clock
+#define AT91C_PA25_NPCS11   ((unsigned int) AT91C_PIO_PA25) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PA26       ((unsigned int) 1 << 26) // Pin Controlled by PA26
+#define AT91C_PA26_RF       ((unsigned int) AT91C_PIO_PA26) //  SSC Receive Frame Sync
+#define AT91C_PA26_NPCS12   ((unsigned int) AT91C_PIO_PA26) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PA27       ((unsigned int) 1 << 27) // Pin Controlled by PA27
+#define AT91C_PA27_DRXD     ((unsigned int) AT91C_PIO_PA27) //  DBGU Debug Receive Data
+#define AT91C_PA27_PCK3     ((unsigned int) AT91C_PIO_PA27) //  PMC Programmable Clock Output 3
+#define AT91C_PIO_PA28       ((unsigned int) 1 << 28) // Pin Controlled by PA28
+#define AT91C_PA28_DTXD     ((unsigned int) AT91C_PIO_PA28) //  DBGU Debug Transmit Data
+#define AT91C_PIO_PA29       ((unsigned int) 1 << 29) // Pin Controlled by PA29
+#define AT91C_PA29_FIQ      ((unsigned int) AT91C_PIO_PA29) //  AIC Fast Interrupt Input
+#define AT91C_PA29_NPCS13   ((unsigned int) AT91C_PIO_PA29) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PA3        ((unsigned int) 1 <<  3) // Pin Controlled by PA3
+#define AT91C_PA3_RTS0     ((unsigned int) AT91C_PIO_PA3) //  USART 0 Ready To Send
+#define AT91C_PA3_NPCS12   ((unsigned int) AT91C_PIO_PA3) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PA30       ((unsigned int) 1 << 30) // Pin Controlled by PA30
+#define AT91C_PA30_IRQ0     ((unsigned int) AT91C_PIO_PA30) //  External Interrupt 0
+#define AT91C_PA30_PCK2     ((unsigned int) AT91C_PIO_PA30) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PA4        ((unsigned int) 1 <<  4) // Pin Controlled by PA4
+#define AT91C_PA4_CTS0     ((unsigned int) AT91C_PIO_PA4) //  USART 0 Clear To Send
+#define AT91C_PA4_NPCS13   ((unsigned int) AT91C_PIO_PA4) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PA5        ((unsigned int) 1 <<  5) // Pin Controlled by PA5
+#define AT91C_PA5_RXD1     ((unsigned int) AT91C_PIO_PA5) //  USART 1 Receive Data
+#define AT91C_PIO_PA6        ((unsigned int) 1 <<  6) // Pin Controlled by PA6
+#define AT91C_PA6_TXD1     ((unsigned int) AT91C_PIO_PA6) //  USART 1 Transmit Data
+#define AT91C_PIO_PA7        ((unsigned int) 1 <<  7) // Pin Controlled by PA7
+#define AT91C_PA7_SCK1     ((unsigned int) AT91C_PIO_PA7) //  USART 1 Serial Clock
+#define AT91C_PA7_NPCS01   ((unsigned int) AT91C_PIO_PA7) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PIO_PA8        ((unsigned int) 1 <<  8) // Pin Controlled by PA8
+#define AT91C_PA8_RTS1     ((unsigned int) AT91C_PIO_PA8) //  USART 1 Ready To Send
+#define AT91C_PA8_NPCS02   ((unsigned int) AT91C_PIO_PA8) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PIO_PA9        ((unsigned int) 1 <<  9) // Pin Controlled by PA9
+#define AT91C_PA9_CTS1     ((unsigned int) AT91C_PIO_PA9) //  USART 1 Clear To Send
+#define AT91C_PA9_NPCS03   ((unsigned int) AT91C_PIO_PA9) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PIO_PB0        ((unsigned int) 1 <<  0) // Pin Controlled by PB0
+#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) //  Ethernet MAC Transmit Clock/Reference Clock
+#define AT91C_PB0_PCK0     ((unsigned int) AT91C_PIO_PB0) //  PMC Programmable Clock Output 0
+#define AT91C_PIO_PB1        ((unsigned int) 1 <<  1) // Pin Controlled by PB1
+#define AT91C_PB1_ETXEN    ((unsigned int) AT91C_PIO_PB1) //  Ethernet MAC Transmit Enable
+#define AT91C_PIO_PB10       ((unsigned int) 1 << 10) // Pin Controlled by PB10
+#define AT91C_PB10_ETX2     ((unsigned int) AT91C_PIO_PB10) //  Ethernet MAC Transmit Data 2
+#define AT91C_PB10_NPCS11   ((unsigned int) AT91C_PIO_PB10) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PB11       ((unsigned int) 1 << 11) // Pin Controlled by PB11
+#define AT91C_PB11_ETX3     ((unsigned int) AT91C_PIO_PB11) //  Ethernet MAC Transmit Data 3
+#define AT91C_PB11_NPCS12   ((unsigned int) AT91C_PIO_PB11) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PB12       ((unsigned int) 1 << 12) // Pin Controlled by PB12
+#define AT91C_PB12_ETXER    ((unsigned int) AT91C_PIO_PB12) //  Ethernet MAC Transmikt Coding Error
+#define AT91C_PB12_TCLK0    ((unsigned int) AT91C_PIO_PB12) //  Timer Counter 0 external clock input
+#define AT91C_PIO_PB13       ((unsigned int) 1 << 13) // Pin Controlled by PB13
+#define AT91C_PB13_ERX2     ((unsigned int) AT91C_PIO_PB13) //  Ethernet MAC Receive Data 2
+#define AT91C_PB13_NPCS01   ((unsigned int) AT91C_PIO_PB13) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PIO_PB14       ((unsigned int) 1 << 14) // Pin Controlled by PB14
+#define AT91C_PB14_ERX3     ((unsigned int) AT91C_PIO_PB14) //  Ethernet MAC Receive Data 3
+#define AT91C_PB14_NPCS02   ((unsigned int) AT91C_PIO_PB14) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PIO_PB15       ((unsigned int) 1 << 15) // Pin Controlled by PB15
+#define AT91C_PB15_ERXDV    ((unsigned int) AT91C_PIO_PB15) //  Ethernet MAC Receive Data Valid
+#define AT91C_PIO_PB16       ((unsigned int) 1 << 16) // Pin Controlled by PB16
+#define AT91C_PB16_ECOL     ((unsigned int) AT91C_PIO_PB16) //  Ethernet MAC Collision Detected
+#define AT91C_PB16_NPCS13   ((unsigned int) AT91C_PIO_PB16) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PB17       ((unsigned int) 1 << 17) // Pin Controlled by PB17
+#define AT91C_PB17_ERXCK    ((unsigned int) AT91C_PIO_PB17) //  Ethernet MAC Receive Clock
+#define AT91C_PB17_NPCS03   ((unsigned int) AT91C_PIO_PB17) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PIO_PB18       ((unsigned int) 1 << 18) // Pin Controlled by PB18
+#define AT91C_PB18_EF100    ((unsigned int) AT91C_PIO_PB18) //  Ethernet MAC Force 100 Mbits/sec
+#define AT91C_PB18_ADTRG    ((unsigned int) AT91C_PIO_PB18) //  ADC External Trigger
+#define AT91C_PIO_PB19       ((unsigned int) 1 << 19) // Pin Controlled by PB19
+#define AT91C_PB19_PWM0     ((unsigned int) AT91C_PIO_PB19) //  PWM Channel 0
+#define AT91C_PB19_TCLK1    ((unsigned int) AT91C_PIO_PB19) //  Timer Counter 1 external clock input
+#define AT91C_PIO_PB2        ((unsigned int) 1 <<  2) // Pin Controlled by PB2
+#define AT91C_PB2_ETX0     ((unsigned int) AT91C_PIO_PB2) //  Ethernet MAC Transmit Data 0
+#define AT91C_PIO_PB20       ((unsigned int) 1 << 20) // Pin Controlled by PB20
+#define AT91C_PB20_PWM1     ((unsigned int) AT91C_PIO_PB20) //  PWM Channel 1
+#define AT91C_PB20_PCK0     ((unsigned int) AT91C_PIO_PB20) //  PMC Programmable Clock Output 0
+#define AT91C_PIO_PB21       ((unsigned int) 1 << 21) // Pin Controlled by PB21
+#define AT91C_PB21_PWM2     ((unsigned int) AT91C_PIO_PB21) //  PWM Channel 2
+#define AT91C_PB21_PCK1     ((unsigned int) AT91C_PIO_PB21) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PB22       ((unsigned int) 1 << 22) // Pin Controlled by PB22
+#define AT91C_PB22_PWM3     ((unsigned int) AT91C_PIO_PB22) //  PWM Channel 3
+#define AT91C_PB22_PCK2     ((unsigned int) AT91C_PIO_PB22) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PB23       ((unsigned int) 1 << 23) // Pin Controlled by PB23
+#define AT91C_PB23_TIOA0    ((unsigned int) AT91C_PIO_PB23) //  Timer Counter 0 Multipurpose Timer I/O Pin A
+#define AT91C_PB23_DCD1     ((unsigned int) AT91C_PIO_PB23) //  USART 1 Data Carrier Detect
+#define AT91C_PIO_PB24       ((unsigned int) 1 << 24) // Pin Controlled by PB24
+#define AT91C_PB24_TIOB0    ((unsigned int) AT91C_PIO_PB24) //  Timer Counter 0 Multipurpose Timer I/O Pin B
+#define AT91C_PB24_DSR1     ((unsigned int) AT91C_PIO_PB24) //  USART 1 Data Set ready
+#define AT91C_PIO_PB25       ((unsigned int) 1 << 25) // Pin Controlled by PB25
+#define AT91C_PB25_TIOA1    ((unsigned int) AT91C_PIO_PB25) //  Timer Counter 1 Multipurpose Timer I/O Pin A
+#define AT91C_PB25_DTR1     ((unsigned int) AT91C_PIO_PB25) //  USART 1 Data Terminal ready
+#define AT91C_PIO_PB26       ((unsigned int) 1 << 26) // Pin Controlled by PB26
+#define AT91C_PB26_TIOB1    ((unsigned int) AT91C_PIO_PB26) //  Timer Counter 1 Multipurpose Timer I/O Pin B
+#define AT91C_PB26_RI1      ((unsigned int) AT91C_PIO_PB26) //  USART 1 Ring Indicator
+#define AT91C_PIO_PB27       ((unsigned int) 1 << 27) // Pin Controlled by PB27
+#define AT91C_PB27_TIOA2    ((unsigned int) AT91C_PIO_PB27) //  Timer Counter 2 Multipurpose Timer I/O Pin A
+#define AT91C_PB27_PWM0     ((unsigned int) AT91C_PIO_PB27) //  PWM Channel 0
+#define AT91C_PIO_PB28       ((unsigned int) 1 << 28) // Pin Controlled by PB28
+#define AT91C_PB28_TIOB2    ((unsigned int) AT91C_PIO_PB28) //  Timer Counter 2 Multipurpose Timer I/O Pin B
+#define AT91C_PB28_PWM1     ((unsigned int) AT91C_PIO_PB28) //  PWM Channel 1
+#define AT91C_PIO_PB29       ((unsigned int) 1 << 29) // Pin Controlled by PB29
+#define AT91C_PB29_PCK1     ((unsigned int) AT91C_PIO_PB29) //  PMC Programmable Clock Output 1
+#define AT91C_PB29_PWM2     ((unsigned int) AT91C_PIO_PB29) //  PWM Channel 2
+#define AT91C_PIO_PB3        ((unsigned int) 1 <<  3) // Pin Controlled by PB3
+#define AT91C_PB3_ETX1     ((unsigned int) AT91C_PIO_PB3) //  Ethernet MAC Transmit Data 1
+#define AT91C_PIO_PB30       ((unsigned int) 1 << 30) // Pin Controlled by PB30
+#define AT91C_PB30_PCK2     ((unsigned int) AT91C_PIO_PB30) //  PMC Programmable Clock Output 2
+#define AT91C_PB30_PWM3     ((unsigned int) AT91C_PIO_PB30) //  PWM Channel 3
+#define AT91C_PIO_PB4        ((unsigned int) 1 <<  4) // Pin Controlled by PB4
+#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) //  Ethernet MAC Carrier Sense/Carrier Sense and Data Valid
+#define AT91C_PIO_PB5        ((unsigned int) 1 <<  5) // Pin Controlled by PB5
+#define AT91C_PB5_ERX0     ((unsigned int) AT91C_PIO_PB5) //  Ethernet MAC Receive Data 0
+#define AT91C_PIO_PB6        ((unsigned int) 1 <<  6) // Pin Controlled by PB6
+#define AT91C_PB6_ERX1     ((unsigned int) AT91C_PIO_PB6) //  Ethernet MAC Receive Data 1
+#define AT91C_PIO_PB7        ((unsigned int) 1 <<  7) // Pin Controlled by PB7
+#define AT91C_PB7_ERXER    ((unsigned int) AT91C_PIO_PB7) //  Ethernet MAC Receive Error
+#define AT91C_PIO_PB8        ((unsigned int) 1 <<  8) // Pin Controlled by PB8
+#define AT91C_PB8_EMDC     ((unsigned int) AT91C_PIO_PB8) //  Ethernet MAC Management Data Clock
+#define AT91C_PIO_PB9        ((unsigned int) 1 <<  9) // Pin Controlled by PB9
+#define AT91C_PB9_EMDIO    ((unsigned int) AT91C_PIO_PB9) //  Ethernet MAC Management Data Input/Output
+
+// *****************************************************************************
+//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256
+// *****************************************************************************
+#define AT91C_ID_FIQ    ((unsigned int)  0) // Advanced Interrupt Controller (FIQ)
+#define AT91C_ID_SYS    ((unsigned int)  1) // System Peripheral
+#define AT91C_ID_PIOA   ((unsigned int)  2) // Parallel IO Controller A
+#define AT91C_ID_PIOB   ((unsigned int)  3) // Parallel IO Controller B
+#define AT91C_ID_SPI0   ((unsigned int)  4) // Serial Peripheral Interface 0
+#define AT91C_ID_SPI1   ((unsigned int)  5) // Serial Peripheral Interface 1
+#define AT91C_ID_US0    ((unsigned int)  6) // USART 0
+#define AT91C_ID_US1    ((unsigned int)  7) // USART 1
+#define AT91C_ID_SSC    ((unsigned int)  8) // Serial Synchronous Controller
+#define AT91C_ID_TWI    ((unsigned int)  9) // Two-Wire Interface
+#define AT91C_ID_PWMC   ((unsigned int) 10) // PWM Controller
+#define AT91C_ID_UDP    ((unsigned int) 11) // USB Device Port
+#define AT91C_ID_TC0    ((unsigned int) 12) // Timer Counter 0
+#define AT91C_ID_TC1    ((unsigned int) 13) // Timer Counter 1
+#define AT91C_ID_TC2    ((unsigned int) 14) // Timer Counter 2
+#define AT91C_ID_CAN    ((unsigned int) 15) // Control Area Network Controller
+#define AT91C_ID_EMAC   ((unsigned int) 16) // Ethernet MAC
+#define AT91C_ID_ADC    ((unsigned int) 17) // Analog-to-Digital Converter
+#define AT91C_ID_AES    ((unsigned int) 18) // Advanced Encryption Standard 128-bit
+#define AT91C_ID_TDES   ((unsigned int) 19) // Triple Data Encryption Standard
+#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved
+#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved
+#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved
+#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved
+#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved
+#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved
+#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved
+#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved
+#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved
+#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved
+#define AT91C_ID_IRQ0   ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0)
+#define AT91C_ID_IRQ1   ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1)
+
+// *****************************************************************************
+//               BASE ADDRESS DEFINITIONS FOR AT91SAM7X256
+// *****************************************************************************
+#define AT91C_BASE_SYS       ((AT91PS_SYS)  0xFFFFF000) // (SYS) Base Address
+#define AT91C_BASE_AIC       ((AT91PS_AIC)  0xFFFFF000) // (AIC) Base Address
+#define AT91C_BASE_PDC_DBGU  ((AT91PS_PDC)  0xFFFFF300) // (PDC_DBGU) Base Address
+#define AT91C_BASE_DBGU      ((AT91PS_DBGU)     0xFFFFF200) // (DBGU) Base Address
+#define AT91C_BASE_PIOA      ((AT91PS_PIO)  0xFFFFF400) // (PIOA) Base Address
+#define AT91C_BASE_PIOB      ((AT91PS_PIO)  0xFFFFF600) // (PIOB) Base Address
+#define AT91C_BASE_CKGR      ((AT91PS_CKGR)     0xFFFFFC20) // (CKGR) Base Address
+#define AT91C_BASE_PMC       ((AT91PS_PMC)  0xFFFFFC00) // (PMC) Base Address
+#define AT91C_BASE_RSTC      ((AT91PS_RSTC)     0xFFFFFD00) // (RSTC) Base Address
+#define AT91C_BASE_RTTC      ((AT91PS_RTTC)     0xFFFFFD20) // (RTTC) Base Address
+#define AT91C_BASE_PITC      ((AT91PS_PITC)     0xFFFFFD30) // (PITC) Base Address
+#define AT91C_BASE_WDTC      ((AT91PS_WDTC)     0xFFFFFD40) // (WDTC) Base Address
+#define AT91C_BASE_VREG      ((AT91PS_VREG)     0xFFFFFD60) // (VREG) Base Address
+#define AT91C_BASE_MC        ((AT91PS_MC)   0xFFFFFF00) // (MC) Base Address
+#define AT91C_BASE_PDC_SPI1  ((AT91PS_PDC)  0xFFFE4100) // (PDC_SPI1) Base Address
+#define AT91C_BASE_SPI1      ((AT91PS_SPI)  0xFFFE4000) // (SPI1) Base Address
+#define AT91C_BASE_PDC_SPI0  ((AT91PS_PDC)  0xFFFE0100) // (PDC_SPI0) Base Address
+#define AT91C_BASE_SPI0      ((AT91PS_SPI)  0xFFFE0000) // (SPI0) Base Address
+#define AT91C_BASE_PDC_US1   ((AT91PS_PDC)  0xFFFC4100) // (PDC_US1) Base Address
+#define AT91C_BASE_US1       ((AT91PS_USART)    0xFFFC4000) // (US1) Base Address
+#define AT91C_BASE_PDC_US0   ((AT91PS_PDC)  0xFFFC0100) // (PDC_US0) Base Address
+#define AT91C_BASE_US0       ((AT91PS_USART)    0xFFFC0000) // (US0) Base Address
+#define AT91C_BASE_PDC_SSC   ((AT91PS_PDC)  0xFFFD4100) // (PDC_SSC) Base Address
+#define AT91C_BASE_SSC       ((AT91PS_SSC)  0xFFFD4000) // (SSC) Base Address
+#define AT91C_BASE_TWI       ((AT91PS_TWI)  0xFFFB8000) // (TWI) Base Address
+#define AT91C_BASE_PWMC_CH3  ((AT91PS_PWMC_CH)  0xFFFCC260) // (PWMC_CH3) Base Address
+#define AT91C_BASE_PWMC_CH2  ((AT91PS_PWMC_CH)  0xFFFCC240) // (PWMC_CH2) Base Address
+#define AT91C_BASE_PWMC_CH1  ((AT91PS_PWMC_CH)  0xFFFCC220) // (PWMC_CH1) Base Address
+#define AT91C_BASE_PWMC_CH0  ((AT91PS_PWMC_CH)  0xFFFCC200) // (PWMC_CH0) Base Address
+#define AT91C_BASE_PWMC      ((AT91PS_PWMC)     0xFFFCC000) // (PWMC) Base Address
+#define AT91C_BASE_UDP       ((AT91PS_UDP)  0xFFFB0000) // (UDP) Base Address
+#define AT91C_BASE_TC0       ((AT91PS_TC)   0xFFFA0000) // (TC0) Base Address
+#define AT91C_BASE_TC1       ((AT91PS_TC)   0xFFFA0040) // (TC1) Base Address
+#define AT91C_BASE_TC2       ((AT91PS_TC)   0xFFFA0080) // (TC2) Base Address
+#define AT91C_BASE_TCB       ((AT91PS_TCB)  0xFFFA0000) // (TCB) Base Address
+#define AT91C_BASE_CAN_MB0   ((AT91PS_CAN_MB)   0xFFFD0200) // (CAN_MB0) Base Address
+#define AT91C_BASE_CAN_MB1   ((AT91PS_CAN_MB)   0xFFFD0220) // (CAN_MB1) Base Address
+#define AT91C_BASE_CAN_MB2   ((AT91PS_CAN_MB)   0xFFFD0240) // (CAN_MB2) Base Address
+#define AT91C_BASE_CAN_MB3   ((AT91PS_CAN_MB)   0xFFFD0260) // (CAN_MB3) Base Address
+#define AT91C_BASE_CAN_MB4   ((AT91PS_CAN_MB)   0xFFFD0280) // (CAN_MB4) Base Address
+#define AT91C_BASE_CAN_MB5   ((AT91PS_CAN_MB)   0xFFFD02A0) // (CAN_MB5) Base Address
+#define AT91C_BASE_CAN_MB6   ((AT91PS_CAN_MB)   0xFFFD02C0) // (CAN_MB6) Base Address
+#define AT91C_BASE_CAN_MB7   ((AT91PS_CAN_MB)   0xFFFD02E0) // (CAN_MB7) Base Address
+#define AT91C_BASE_CAN       ((AT91PS_CAN)  0xFFFD0000) // (CAN) Base Address
+#define AT91C_BASE_EMAC      ((AT91PS_EMAC)     0xFFFDC000) // (EMAC) Base Address
+#define AT91C_BASE_PDC_ADC   ((AT91PS_PDC)  0xFFFD8100) // (PDC_ADC) Base Address
+#define AT91C_BASE_ADC       ((AT91PS_ADC)  0xFFFD8000) // (ADC) Base Address
+#define AT91C_BASE_PDC_AES   ((AT91PS_PDC)  0xFFFA4100) // (PDC_AES) Base Address
+#define AT91C_BASE_AES       ((AT91PS_AES)  0xFFFA4000) // (AES) Base Address
+#define AT91C_BASE_PDC_TDES  ((AT91PS_PDC)  0xFFFA8100) // (PDC_TDES) Base Address
+#define AT91C_BASE_TDES      ((AT91PS_TDES)     0xFFFA8000) // (TDES) Base Address
+
+// *****************************************************************************
+//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256
+// *****************************************************************************
+#define AT91C_ISRAM  ((char *)  0x00200000) // Internal SRAM base address
+#define AT91C_ISRAM_SIZE     ((unsigned int) 0x00010000) // Internal SRAM size in byte (64 Kbyte)
+#define AT91C_IFLASH     ((char *)  0x00100000) // Internal ROM base address
+#define AT91C_IFLASH_SIZE    ((unsigned int) 0x00040000) // Internal ROM size in byte (256 Kbyte)
+
+#endif
diff --git a/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h b/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h
index 5b8dfe8..c85684d 100644
--- a/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h
+++ b/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h
@@ -1,2446 +1,2444 @@
-//  ----------------------------------------------------------------------------

-//          ATMEL Microcontroller Software Support  -  ROUSSET  -

-//  ----------------------------------------------------------------------------

-//  DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR

-//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

-//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE

-//  DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,

-//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

-//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,

-//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

-//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

-//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,

-//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-//  ----------------------------------------------------------------------------

-// File Name           : AT91SAM7X256.h

-// Object              : AT91SAM7X256 definitions

-// Generated           : AT91 SW Application Group  05/20/2005 (16:22:29)

-// 

-// CVS Reference       : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005//

-// CVS Reference       : /SYS_SAM7X.pl/1.3/Tue Feb  1 17:01:43 2005//

-// CVS Reference       : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005//

-// CVS Reference       : /PMC_SAM7X.pl/1.4/Tue Feb  8 13:58:10 2005//

-// CVS Reference       : /RSTC_SAM7X.pl/1.1/Tue Feb  1 16:16:26 2005//

-// CVS Reference       : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005//

-// CVS Reference       : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005//

-// CVS Reference       : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005//

-// CVS Reference       : /PIO_6057A.pl/1.2/Thu Feb  3 10:18:28 2005//

-// CVS Reference       : /RTTC_6081A.pl/1.2/Tue Nov  9 14:43:58 2004//

-// CVS Reference       : /PITC_6079A.pl/1.2/Tue Nov  9 14:43:56 2004//

-// CVS Reference       : /WDTC_6080A.pl/1.3/Tue Nov  9 14:44:00 2004//

-// CVS Reference       : /VREG_6085B.pl/1.1/Tue Feb  1 16:05:48 2005//

-// CVS Reference       : /PDC_6074C.pl/1.2/Thu Feb  3 08:48:54 2005//

-// CVS Reference       : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005//

-// CVS Reference       : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005//

-// CVS Reference       : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004//

-// CVS Reference       : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004//

-// CVS Reference       : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004//

-// CVS Reference       : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005//

-// CVS Reference       : /CAN_6019B.pl/1.1/Tue Mar  8 12:42:22 2005//

-// CVS Reference       : /EMACB_6119A.pl/1.5/Thu Feb  3 15:52:04 2005//

-// CVS Reference       : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003//

-// CVS Reference       : /AES_6149A.pl/1.10/Mon Feb  7 09:44:25 2005//

-// CVS Reference       : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005//

-//  ----------------------------------------------------------------------------

-

-// Hardware register definition

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR System Peripherals

-// *****************************************************************************

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller

-// *****************************************************************************

-// *** Register offset in AT91S_AIC structure ***

-#define AIC_SMR         ( 0) // Source Mode Register

-#define AIC_SVR         (128) // Source Vector Register

-#define AIC_IVR         (256) // IRQ Vector Register

-#define AIC_FVR         (260) // FIQ Vector Register

-#define AIC_ISR         (264) // Interrupt Status Register

-#define AIC_IPR         (268) // Interrupt Pending Register

-#define AIC_IMR         (272) // Interrupt Mask Register

-#define AIC_CISR        (276) // Core Interrupt Status Register

-#define AIC_IECR        (288) // Interrupt Enable Command Register

-#define AIC_IDCR        (292) // Interrupt Disable Command Register

-#define AIC_ICCR        (296) // Interrupt Clear Command Register

-#define AIC_ISCR        (300) // Interrupt Set Command Register

-#define AIC_EOICR       (304) // End of Interrupt Command Register

-#define AIC_SPU         (308) // Spurious Vector Register

-#define AIC_DCR         (312) // Debug Control Register (Protect)

-#define AIC_FFER        (320) // Fast Forcing Enable Register

-#define AIC_FFDR        (324) // Fast Forcing Disable Register

-#define AIC_FFSR        (328) // Fast Forcing Status Register

-// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- 

-#define AT91C_AIC_PRIOR           (0x7 <<  0) // (AIC) Priority Level

-#define 	AT91C_AIC_PRIOR_LOWEST               (0x0) // (AIC) Lowest priority level

-#define 	AT91C_AIC_PRIOR_HIGHEST              (0x7) // (AIC) Highest priority level

-#define AT91C_AIC_SRCTYPE         (0x3 <<  5) // (AIC) Interrupt Source Type

-#define 	AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL       (0x0 <<  5) // (AIC) Internal Sources Code Label High-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL        (0x0 <<  5) // (AIC) External Sources Code Label Low-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE    (0x1 <<  5) // (AIC) Internal Sources Code Label Positive Edge triggered

-#define 	AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE    (0x1 <<  5) // (AIC) External Sources Code Label Negative Edge triggered

-#define 	AT91C_AIC_SRCTYPE_HIGH_LEVEL           (0x2 <<  5) // (AIC) Internal Or External Sources Code Label High-level Sensitive

-#define 	AT91C_AIC_SRCTYPE_POSITIVE_EDGE        (0x3 <<  5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered

-// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- 

-#define AT91C_AIC_NFIQ            (0x1 <<  0) // (AIC) NFIQ Status

-#define AT91C_AIC_NIRQ            (0x1 <<  1) // (AIC) NIRQ Status

-// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- 

-#define AT91C_AIC_DCR_PROT        (0x1 <<  0) // (AIC) Protection Mode

-#define AT91C_AIC_DCR_GMSK        (0x1 <<  1) // (AIC) General Mask

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Peripheral DMA Controller

-// *****************************************************************************

-// *** Register offset in AT91S_PDC structure ***

-#define PDC_RPR         ( 0) // Receive Pointer Register

-#define PDC_RCR         ( 4) // Receive Counter Register

-#define PDC_TPR         ( 8) // Transmit Pointer Register

-#define PDC_TCR         (12) // Transmit Counter Register

-#define PDC_RNPR        (16) // Receive Next Pointer Register

-#define PDC_RNCR        (20) // Receive Next Counter Register

-#define PDC_TNPR        (24) // Transmit Next Pointer Register

-#define PDC_TNCR        (28) // Transmit Next Counter Register

-#define PDC_PTCR        (32) // PDC Transfer Control Register

-#define PDC_PTSR        (36) // PDC Transfer Status Register

-// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- 

-#define AT91C_PDC_RXTEN           (0x1 <<  0) // (PDC) Receiver Transfer Enable

-#define AT91C_PDC_RXTDIS          (0x1 <<  1) // (PDC) Receiver Transfer Disable

-#define AT91C_PDC_TXTEN           (0x1 <<  8) // (PDC) Transmitter Transfer Enable

-#define AT91C_PDC_TXTDIS          (0x1 <<  9) // (PDC) Transmitter Transfer Disable

-// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Debug Unit

-// *****************************************************************************

-// *** Register offset in AT91S_DBGU structure ***

-#define DBGU_CR         ( 0) // Control Register

-#define DBGU_MR         ( 4) // Mode Register

-#define DBGU_IER        ( 8) // Interrupt Enable Register

-#define DBGU_IDR        (12) // Interrupt Disable Register

-#define DBGU_IMR        (16) // Interrupt Mask Register

-#define DBGU_CSR        (20) // Channel Status Register

-#define DBGU_RHR        (24) // Receiver Holding Register

-#define DBGU_THR        (28) // Transmitter Holding Register

-#define DBGU_BRGR       (32) // Baud Rate Generator Register

-#define DBGU_CIDR       (64) // Chip ID Register

-#define DBGU_EXID       (68) // Chip ID Extension Register

-#define DBGU_FNTR       (72) // Force NTRST Register

-#define DBGU_RPR        (256) // Receive Pointer Register

-#define DBGU_RCR        (260) // Receive Counter Register

-#define DBGU_TPR        (264) // Transmit Pointer Register

-#define DBGU_TCR        (268) // Transmit Counter Register

-#define DBGU_RNPR       (272) // Receive Next Pointer Register

-#define DBGU_RNCR       (276) // Receive Next Counter Register

-#define DBGU_TNPR       (280) // Transmit Next Pointer Register

-#define DBGU_TNCR       (284) // Transmit Next Counter Register

-#define DBGU_PTCR       (288) // PDC Transfer Control Register

-#define DBGU_PTSR       (292) // PDC Transfer Status Register

-// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_RSTRX            (0x1 <<  2) // (DBGU) Reset Receiver

-#define AT91C_US_RSTTX            (0x1 <<  3) // (DBGU) Reset Transmitter

-#define AT91C_US_RXEN             (0x1 <<  4) // (DBGU) Receiver Enable

-#define AT91C_US_RXDIS            (0x1 <<  5) // (DBGU) Receiver Disable

-#define AT91C_US_TXEN             (0x1 <<  6) // (DBGU) Transmitter Enable

-#define AT91C_US_TXDIS            (0x1 <<  7) // (DBGU) Transmitter Disable

-#define AT91C_US_RSTSTA           (0x1 <<  8) // (DBGU) Reset Status Bits

-// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_PAR              (0x7 <<  9) // (DBGU) Parity type

-#define 	AT91C_US_PAR_EVEN                 (0x0 <<  9) // (DBGU) Even Parity

-#define 	AT91C_US_PAR_ODD                  (0x1 <<  9) // (DBGU) Odd Parity

-#define 	AT91C_US_PAR_SPACE                (0x2 <<  9) // (DBGU) Parity forced to 0 (Space)

-#define 	AT91C_US_PAR_MARK                 (0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)

-#define 	AT91C_US_PAR_NONE                 (0x4 <<  9) // (DBGU) No Parity

-#define 	AT91C_US_PAR_MULTI_DROP           (0x6 <<  9) // (DBGU) Multi-drop mode

-#define AT91C_US_CHMODE           (0x3 << 14) // (DBGU) Channel Mode

-#define 	AT91C_US_CHMODE_NORMAL               (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.

-#define 	AT91C_US_CHMODE_AUTO                 (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.

-#define 	AT91C_US_CHMODE_LOCAL                (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.

-#define 	AT91C_US_CHMODE_REMOTE               (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.

-// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXRDY            (0x1 <<  0) // (DBGU) RXRDY Interrupt

-#define AT91C_US_TXRDY            (0x1 <<  1) // (DBGU) TXRDY Interrupt

-#define AT91C_US_ENDRX            (0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt

-#define AT91C_US_ENDTX            (0x1 <<  4) // (DBGU) End of Transmit Interrupt

-#define AT91C_US_OVRE             (0x1 <<  5) // (DBGU) Overrun Interrupt

-#define AT91C_US_FRAME            (0x1 <<  6) // (DBGU) Framing Error Interrupt

-#define AT91C_US_PARE             (0x1 <<  7) // (DBGU) Parity Error Interrupt

-#define AT91C_US_TXEMPTY          (0x1 <<  9) // (DBGU) TXEMPTY Interrupt

-#define AT91C_US_TXBUFE           (0x1 << 11) // (DBGU) TXBUFE Interrupt

-#define AT91C_US_RXBUFF           (0x1 << 12) // (DBGU) RXBUFF Interrupt

-#define AT91C_US_COMM_TX          (0x1 << 30) // (DBGU) COMM_TX Interrupt

-#define AT91C_US_COMM_RX          (0x1 << 31) // (DBGU) COMM_RX Interrupt

-// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- 

-// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- 

-#define AT91C_US_FORCE_NTRST      (0x1 <<  0) // (DBGU) Force NTRST in JTAG

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler

-// *****************************************************************************

-// *** Register offset in AT91S_PIO structure ***

-#define PIO_PER         ( 0) // PIO Enable Register

-#define PIO_PDR         ( 4) // PIO Disable Register

-#define PIO_PSR         ( 8) // PIO Status Register

-#define PIO_OER         (16) // Output Enable Register

-#define PIO_ODR         (20) // Output Disable Registerr

-#define PIO_OSR         (24) // Output Status Register

-#define PIO_IFER        (32) // Input Filter Enable Register

-#define PIO_IFDR        (36) // Input Filter Disable Register

-#define PIO_IFSR        (40) // Input Filter Status Register

-#define PIO_SODR        (48) // Set Output Data Register

-#define PIO_CODR        (52) // Clear Output Data Register

-#define PIO_ODSR        (56) // Output Data Status Register

-#define PIO_PDSR        (60) // Pin Data Status Register

-#define PIO_IER         (64) // Interrupt Enable Register

-#define PIO_IDR         (68) // Interrupt Disable Register

-#define PIO_IMR         (72) // Interrupt Mask Register

-#define PIO_ISR         (76) // Interrupt Status Register

-#define PIO_MDER        (80) // Multi-driver Enable Register

-#define PIO_MDDR        (84) // Multi-driver Disable Register

-#define PIO_MDSR        (88) // Multi-driver Status Register

-#define PIO_PPUDR       (96) // Pull-up Disable Register

-#define PIO_PPUER       (100) // Pull-up Enable Register

-#define PIO_PPUSR       (104) // Pull-up Status Register

-#define PIO_ASR         (112) // Select A Register

-#define PIO_BSR         (116) // Select B Register

-#define PIO_ABSR        (120) // AB Select Status Register

-#define PIO_OWER        (160) // Output Write Enable Register

-#define PIO_OWDR        (164) // Output Write Disable Register

-#define PIO_OWSR        (168) // Output Write Status Register

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Clock Generator Controler

-// *****************************************************************************

-// *** Register offset in AT91S_CKGR structure ***

-#define CKGR_MOR        ( 0) // Main Oscillator Register

-#define CKGR_MCFR       ( 4) // Main Clock  Frequency Register

-#define CKGR_PLLR       (12) // PLL Register

-// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- 

-#define AT91C_CKGR_MOSCEN         (0x1 <<  0) // (CKGR) Main Oscillator Enable

-#define AT91C_CKGR_OSCBYPASS      (0x1 <<  1) // (CKGR) Main Oscillator Bypass

-#define AT91C_CKGR_OSCOUNT        (0xFF <<  8) // (CKGR) Main Oscillator Start-up Time

-// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- 

-#define AT91C_CKGR_MAINF          (0xFFFF <<  0) // (CKGR) Main Clock Frequency

-#define AT91C_CKGR_MAINRDY        (0x1 << 16) // (CKGR) Main Clock Ready

-// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- 

-#define AT91C_CKGR_DIV            (0xFF <<  0) // (CKGR) Divider Selected

-#define 	AT91C_CKGR_DIV_0                    (0x0) // (CKGR) Divider output is 0

-#define 	AT91C_CKGR_DIV_BYPASS               (0x1) // (CKGR) Divider is bypassed

-#define AT91C_CKGR_PLLCOUNT       (0x3F <<  8) // (CKGR) PLL Counter

-#define AT91C_CKGR_OUT            (0x3 << 14) // (CKGR) PLL Output Frequency Range

-#define 	AT91C_CKGR_OUT_0                    (0x0 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_1                    (0x1 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_2                    (0x2 << 14) // (CKGR) Please refer to the PLL datasheet

-#define 	AT91C_CKGR_OUT_3                    (0x3 << 14) // (CKGR) Please refer to the PLL datasheet

-#define AT91C_CKGR_MUL            (0x7FF << 16) // (CKGR) PLL Multiplier

-#define AT91C_CKGR_USBDIV         (0x3 << 28) // (CKGR) Divider for USB Clocks

-#define 	AT91C_CKGR_USBDIV_0                    (0x0 << 28) // (CKGR) Divider output is PLL clock output

-#define 	AT91C_CKGR_USBDIV_1                    (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2

-#define 	AT91C_CKGR_USBDIV_2                    (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Power Management Controler

-// *****************************************************************************

-// *** Register offset in AT91S_PMC structure ***

-#define PMC_SCER        ( 0) // System Clock Enable Register

-#define PMC_SCDR        ( 4) // System Clock Disable Register

-#define PMC_SCSR        ( 8) // System Clock Status Register

-#define PMC_PCER        (16) // Peripheral Clock Enable Register

-#define PMC_PCDR        (20) // Peripheral Clock Disable Register

-#define PMC_PCSR        (24) // Peripheral Clock Status Register

-#define PMC_MOR         (32) // Main Oscillator Register

-#define PMC_MCFR        (36) // Main Clock  Frequency Register

-#define PMC_PLLR        (44) // PLL Register

-#define PMC_MCKR        (48) // Master Clock Register

-#define PMC_PCKR        (64) // Programmable Clock Register

-#define PMC_IER         (96) // Interrupt Enable Register

-#define PMC_IDR         (100) // Interrupt Disable Register

-#define PMC_SR          (104) // Status Register

-#define PMC_IMR         (108) // Interrupt Mask Register

-// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- 

-#define AT91C_PMC_PCK             (0x1 <<  0) // (PMC) Processor Clock

-#define AT91C_PMC_UDP             (0x1 <<  7) // (PMC) USB Device Port Clock

-#define AT91C_PMC_PCK0            (0x1 <<  8) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK1            (0x1 <<  9) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK2            (0x1 << 10) // (PMC) Programmable Clock Output

-#define AT91C_PMC_PCK3            (0x1 << 11) // (PMC) Programmable Clock Output

-// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- 

-// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- 

-// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- 

-// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- 

-// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- 

-// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- 

-#define AT91C_PMC_CSS             (0x3 <<  0) // (PMC) Programmable Clock Selection

-#define 	AT91C_PMC_CSS_SLOW_CLK             (0x0) // (PMC) Slow Clock is selected

-#define 	AT91C_PMC_CSS_MAIN_CLK             (0x1) // (PMC) Main Clock is selected

-#define 	AT91C_PMC_CSS_PLL_CLK              (0x3) // (PMC) Clock from PLL is selected

-#define AT91C_PMC_PRES            (0x7 <<  2) // (PMC) Programmable Clock Prescaler

-#define 	AT91C_PMC_PRES_CLK                  (0x0 <<  2) // (PMC) Selected clock

-#define 	AT91C_PMC_PRES_CLK_2                (0x1 <<  2) // (PMC) Selected clock divided by 2

-#define 	AT91C_PMC_PRES_CLK_4                (0x2 <<  2) // (PMC) Selected clock divided by 4

-#define 	AT91C_PMC_PRES_CLK_8                (0x3 <<  2) // (PMC) Selected clock divided by 8

-#define 	AT91C_PMC_PRES_CLK_16               (0x4 <<  2) // (PMC) Selected clock divided by 16

-#define 	AT91C_PMC_PRES_CLK_32               (0x5 <<  2) // (PMC) Selected clock divided by 32

-#define 	AT91C_PMC_PRES_CLK_64               (0x6 <<  2) // (PMC) Selected clock divided by 64

-// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- 

-// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- 

-#define AT91C_PMC_MOSCS           (0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask

-#define AT91C_PMC_LOCK            (0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask

-#define AT91C_PMC_MCKRDY          (0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK0RDY         (0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK1RDY         (0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK2RDY         (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask

-#define AT91C_PMC_PCK3RDY         (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask

-// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- 

-// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- 

-// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Reset Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_RSTC structure ***

-#define RSTC_RCR        ( 0) // Reset Control Register

-#define RSTC_RSR        ( 4) // Reset Status Register

-#define RSTC_RMR        ( 8) // Reset Mode Register

-// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- 

-#define AT91C_RSTC_PROCRST        (0x1 <<  0) // (RSTC) Processor Reset

-#define AT91C_RSTC_PERRST         (0x1 <<  2) // (RSTC) Peripheral Reset

-#define AT91C_RSTC_EXTRST         (0x1 <<  3) // (RSTC) External Reset

-#define AT91C_RSTC_KEY            (0xFF << 24) // (RSTC) Password

-// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- 

-#define AT91C_RSTC_URSTS          (0x1 <<  0) // (RSTC) User Reset Status

-#define AT91C_RSTC_BODSTS         (0x1 <<  1) // (RSTC) Brownout Detection Status

-#define AT91C_RSTC_RSTTYP         (0x7 <<  8) // (RSTC) Reset Type

-#define 	AT91C_RSTC_RSTTYP_POWERUP              (0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.

-#define 	AT91C_RSTC_RSTTYP_WAKEUP               (0x1 <<  8) // (RSTC) WakeUp Reset. VDDCORE rising.

-#define 	AT91C_RSTC_RSTTYP_WATCHDOG             (0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.

-#define 	AT91C_RSTC_RSTTYP_SOFTWARE             (0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.

-#define 	AT91C_RSTC_RSTTYP_USER                 (0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.

-#define 	AT91C_RSTC_RSTTYP_BROWNOUT             (0x5 <<  8) // (RSTC) Brownout Reset occured.

-#define AT91C_RSTC_NRSTL          (0x1 << 16) // (RSTC) NRST pin level

-#define AT91C_RSTC_SRCMP          (0x1 << 17) // (RSTC) Software Reset Command in Progress.

-// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- 

-#define AT91C_RSTC_URSTEN         (0x1 <<  0) // (RSTC) User Reset Enable

-#define AT91C_RSTC_URSTIEN        (0x1 <<  4) // (RSTC) User Reset Interrupt Enable

-#define AT91C_RSTC_ERSTL          (0xF <<  8) // (RSTC) User Reset Enable

-#define AT91C_RSTC_BODIEN         (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_RTTC structure ***

-#define RTTC_RTMR       ( 0) // Real-time Mode Register

-#define RTTC_RTAR       ( 4) // Real-time Alarm Register

-#define RTTC_RTVR       ( 8) // Real-time Value Register

-#define RTTC_RTSR       (12) // Real-time Status Register

-// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- 

-#define AT91C_RTTC_RTPRES         (0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value

-#define AT91C_RTTC_ALMIEN         (0x1 << 16) // (RTTC) Alarm Interrupt Enable

-#define AT91C_RTTC_RTTINCIEN      (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable

-#define AT91C_RTTC_RTTRST         (0x1 << 18) // (RTTC) Real Time Timer Restart

-// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- 

-#define AT91C_RTTC_ALMV           (0x0 <<  0) // (RTTC) Alarm Value

-// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- 

-#define AT91C_RTTC_CRTV           (0x0 <<  0) // (RTTC) Current Real-time Value

-// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- 

-#define AT91C_RTTC_ALMS           (0x1 <<  0) // (RTTC) Real-time Alarm Status

-#define AT91C_RTTC_RTTINC         (0x1 <<  1) // (RTTC) Real-time Timer Increment

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_PITC structure ***

-#define PITC_PIMR       ( 0) // Period Interval Mode Register

-#define PITC_PISR       ( 4) // Period Interval Status Register

-#define PITC_PIVR       ( 8) // Period Interval Value Register

-#define PITC_PIIR       (12) // Period Interval Image Register

-// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- 

-#define AT91C_PITC_PIV            (0xFFFFF <<  0) // (PITC) Periodic Interval Value

-#define AT91C_PITC_PITEN          (0x1 << 24) // (PITC) Periodic Interval Timer Enabled

-#define AT91C_PITC_PITIEN         (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable

-// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- 

-#define AT91C_PITC_PITS           (0x1 <<  0) // (PITC) Periodic Interval Timer Status

-// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- 

-#define AT91C_PITC_CPIV           (0xFFFFF <<  0) // (PITC) Current Periodic Interval Value

-#define AT91C_PITC_PICNT          (0xFFF << 20) // (PITC) Periodic Interval Counter

-// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_WDTC structure ***

-#define WDTC_WDCR       ( 0) // Watchdog Control Register

-#define WDTC_WDMR       ( 4) // Watchdog Mode Register

-#define WDTC_WDSR       ( 8) // Watchdog Status Register

-// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- 

-#define AT91C_WDTC_WDRSTT         (0x1 <<  0) // (WDTC) Watchdog Restart

-#define AT91C_WDTC_KEY            (0xFF << 24) // (WDTC) Watchdog KEY Password

-// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- 

-#define AT91C_WDTC_WDV            (0xFFF <<  0) // (WDTC) Watchdog Timer Restart

-#define AT91C_WDTC_WDFIEN         (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable

-#define AT91C_WDTC_WDRSTEN        (0x1 << 13) // (WDTC) Watchdog Reset Enable

-#define AT91C_WDTC_WDRPROC        (0x1 << 14) // (WDTC) Watchdog Timer Restart

-#define AT91C_WDTC_WDDIS          (0x1 << 15) // (WDTC) Watchdog Disable

-#define AT91C_WDTC_WDD            (0xFFF << 16) // (WDTC) Watchdog Delta Value

-#define AT91C_WDTC_WDDBGHLT       (0x1 << 28) // (WDTC) Watchdog Debug Halt

-#define AT91C_WDTC_WDIDLEHLT      (0x1 << 29) // (WDTC) Watchdog Idle Halt

-// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- 

-#define AT91C_WDTC_WDUNF          (0x1 <<  0) // (WDTC) Watchdog Underflow

-#define AT91C_WDTC_WDERR          (0x1 <<  1) // (WDTC) Watchdog Error

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Voltage Regulator Mode Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_VREG structure ***

-#define VREG_MR         ( 0) // Voltage Regulator Mode Register

-// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- 

-#define AT91C_VREG_PSTDBY         (0x1 <<  0) // (VREG) Voltage Regulator Power Standby Mode

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Memory Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_MC structure ***

-#define MC_RCR          ( 0) // MC Remap Control Register

-#define MC_ASR          ( 4) // MC Abort Status Register

-#define MC_AASR         ( 8) // MC Abort Address Status Register

-#define MC_FMR          (96) // MC Flash Mode Register

-#define MC_FCR          (100) // MC Flash Command Register

-#define MC_FSR          (104) // MC Flash Status Register

-// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- 

-#define AT91C_MC_RCB              (0x1 <<  0) // (MC) Remap Command Bit

-// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- 

-#define AT91C_MC_UNDADD           (0x1 <<  0) // (MC) Undefined Addess Abort Status

-#define AT91C_MC_MISADD           (0x1 <<  1) // (MC) Misaligned Addess Abort Status

-#define AT91C_MC_ABTSZ            (0x3 <<  8) // (MC) Abort Size Status

-#define 	AT91C_MC_ABTSZ_BYTE                 (0x0 <<  8) // (MC) Byte

-#define 	AT91C_MC_ABTSZ_HWORD                (0x1 <<  8) // (MC) Half-word

-#define 	AT91C_MC_ABTSZ_WORD                 (0x2 <<  8) // (MC) Word

-#define AT91C_MC_ABTTYP           (0x3 << 10) // (MC) Abort Type Status

-#define 	AT91C_MC_ABTTYP_DATAR                (0x0 << 10) // (MC) Data Read

-#define 	AT91C_MC_ABTTYP_DATAW                (0x1 << 10) // (MC) Data Write

-#define 	AT91C_MC_ABTTYP_FETCH                (0x2 << 10) // (MC) Code Fetch

-#define AT91C_MC_MST0             (0x1 << 16) // (MC) Master 0 Abort Source

-#define AT91C_MC_MST1             (0x1 << 17) // (MC) Master 1 Abort Source

-#define AT91C_MC_SVMST0           (0x1 << 24) // (MC) Saved Master 0 Abort Source

-#define AT91C_MC_SVMST1           (0x1 << 25) // (MC) Saved Master 1 Abort Source

-// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- 

-#define AT91C_MC_FRDY             (0x1 <<  0) // (MC) Flash Ready

-#define AT91C_MC_LOCKE            (0x1 <<  2) // (MC) Lock Error

-#define AT91C_MC_PROGE            (0x1 <<  3) // (MC) Programming Error

-#define AT91C_MC_NEBP             (0x1 <<  7) // (MC) No Erase Before Programming

-#define AT91C_MC_FWS              (0x3 <<  8) // (MC) Flash Wait State

-#define 	AT91C_MC_FWS_0FWS                 (0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations

-#define 	AT91C_MC_FWS_1FWS                 (0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations

-#define 	AT91C_MC_FWS_2FWS                 (0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations

-#define 	AT91C_MC_FWS_3FWS                 (0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations

-#define AT91C_MC_FMCN             (0xFF << 16) // (MC) Flash Microsecond Cycle Number

-// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- 

-#define AT91C_MC_FCMD             (0xF <<  0) // (MC) Flash Command

-#define 	AT91C_MC_FCMD_START_PROG           (0x1) // (MC) Starts the programming of th epage specified by PAGEN.

-#define 	AT91C_MC_FCMD_LOCK                 (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_PROG_AND_LOCK        (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.

-#define 	AT91C_MC_FCMD_UNLOCK               (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.

-#define 	AT91C_MC_FCMD_ERASE_ALL            (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.

-#define 	AT91C_MC_FCMD_SET_GP_NVM           (0xB) // (MC) Set General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_CLR_GP_NVM           (0xD) // (MC) Clear General Purpose NVM bits.

-#define 	AT91C_MC_FCMD_SET_SECURITY         (0xF) // (MC) Set Security Bit.

-#define AT91C_MC_PAGEN            (0x3FF <<  8) // (MC) Page Number

-#define AT91C_MC_KEY              (0xFF << 24) // (MC) Writing Protect Key

-// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- 

-#define AT91C_MC_SECURITY         (0x1 <<  4) // (MC) Security Bit Status

-#define AT91C_MC_GPNVM0           (0x1 <<  8) // (MC) Sector 0 Lock Status

-#define AT91C_MC_GPNVM1           (0x1 <<  9) // (MC) Sector 1 Lock Status

-#define AT91C_MC_GPNVM2           (0x1 << 10) // (MC) Sector 2 Lock Status

-#define AT91C_MC_GPNVM3           (0x1 << 11) // (MC) Sector 3 Lock Status

-#define AT91C_MC_GPNVM4           (0x1 << 12) // (MC) Sector 4 Lock Status

-#define AT91C_MC_GPNVM5           (0x1 << 13) // (MC) Sector 5 Lock Status

-#define AT91C_MC_GPNVM6           (0x1 << 14) // (MC) Sector 6 Lock Status

-#define AT91C_MC_GPNVM7           (0x1 << 15) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS0           (0x1 << 16) // (MC) Sector 0 Lock Status

-#define AT91C_MC_LOCKS1           (0x1 << 17) // (MC) Sector 1 Lock Status

-#define AT91C_MC_LOCKS2           (0x1 << 18) // (MC) Sector 2 Lock Status

-#define AT91C_MC_LOCKS3           (0x1 << 19) // (MC) Sector 3 Lock Status

-#define AT91C_MC_LOCKS4           (0x1 << 20) // (MC) Sector 4 Lock Status

-#define AT91C_MC_LOCKS5           (0x1 << 21) // (MC) Sector 5 Lock Status

-#define AT91C_MC_LOCKS6           (0x1 << 22) // (MC) Sector 6 Lock Status

-#define AT91C_MC_LOCKS7           (0x1 << 23) // (MC) Sector 7 Lock Status

-#define AT91C_MC_LOCKS8           (0x1 << 24) // (MC) Sector 8 Lock Status

-#define AT91C_MC_LOCKS9           (0x1 << 25) // (MC) Sector 9 Lock Status

-#define AT91C_MC_LOCKS10          (0x1 << 26) // (MC) Sector 10 Lock Status

-#define AT91C_MC_LOCKS11          (0x1 << 27) // (MC) Sector 11 Lock Status

-#define AT91C_MC_LOCKS12          (0x1 << 28) // (MC) Sector 12 Lock Status

-#define AT91C_MC_LOCKS13          (0x1 << 29) // (MC) Sector 13 Lock Status

-#define AT91C_MC_LOCKS14          (0x1 << 30) // (MC) Sector 14 Lock Status

-#define AT91C_MC_LOCKS15          (0x1 << 31) // (MC) Sector 15 Lock Status

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface

-// *****************************************************************************

-// *** Register offset in AT91S_SPI structure ***

-#define SPI_CR          ( 0) // Control Register

-#define SPI_MR          ( 4) // Mode Register

-#define SPI_RDR         ( 8) // Receive Data Register

-#define SPI_TDR         (12) // Transmit Data Register

-#define SPI_SR          (16) // Status Register

-#define SPI_IER         (20) // Interrupt Enable Register

-#define SPI_IDR         (24) // Interrupt Disable Register

-#define SPI_IMR         (28) // Interrupt Mask Register

-#define SPI_CSR         (48) // Chip Select Register

-#define SPI_RPR         (256) // Receive Pointer Register

-#define SPI_RCR         (260) // Receive Counter Register

-#define SPI_TPR         (264) // Transmit Pointer Register

-#define SPI_TCR         (268) // Transmit Counter Register

-#define SPI_RNPR        (272) // Receive Next Pointer Register

-#define SPI_RNCR        (276) // Receive Next Counter Register

-#define SPI_TNPR        (280) // Transmit Next Pointer Register

-#define SPI_TNCR        (284) // Transmit Next Counter Register

-#define SPI_PTCR        (288) // PDC Transfer Control Register

-#define SPI_PTSR        (292) // PDC Transfer Status Register

-// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- 

-#define AT91C_SPI_SPIEN           (0x1 <<  0) // (SPI) SPI Enable

-#define AT91C_SPI_SPIDIS          (0x1 <<  1) // (SPI) SPI Disable

-#define AT91C_SPI_SWRST           (0x1 <<  7) // (SPI) SPI Software reset

-#define AT91C_SPI_LASTXFER        (0x1 << 24) // (SPI) SPI Last Transfer

-// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- 

-#define AT91C_SPI_MSTR            (0x1 <<  0) // (SPI) Master/Slave Mode

-#define AT91C_SPI_PS              (0x1 <<  1) // (SPI) Peripheral Select

-#define 	AT91C_SPI_PS_FIXED                (0x0 <<  1) // (SPI) Fixed Peripheral Select

-#define 	AT91C_SPI_PS_VARIABLE             (0x1 <<  1) // (SPI) Variable Peripheral Select

-#define AT91C_SPI_PCSDEC          (0x1 <<  2) // (SPI) Chip Select Decode

-#define AT91C_SPI_FDIV            (0x1 <<  3) // (SPI) Clock Selection

-#define AT91C_SPI_MODFDIS         (0x1 <<  4) // (SPI) Mode Fault Detection

-#define AT91C_SPI_LLB             (0x1 <<  7) // (SPI) Clock Selection

-#define AT91C_SPI_PCS             (0xF << 16) // (SPI) Peripheral Chip Select

-#define AT91C_SPI_DLYBCS          (0xFF << 24) // (SPI) Delay Between Chip Selects

-// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- 

-#define AT91C_SPI_RD              (0xFFFF <<  0) // (SPI) Receive Data

-#define AT91C_SPI_RPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- 

-#define AT91C_SPI_TD              (0xFFFF <<  0) // (SPI) Transmit Data

-#define AT91C_SPI_TPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status

-// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- 

-#define AT91C_SPI_RDRF            (0x1 <<  0) // (SPI) Receive Data Register Full

-#define AT91C_SPI_TDRE            (0x1 <<  1) // (SPI) Transmit Data Register Empty

-#define AT91C_SPI_MODF            (0x1 <<  2) // (SPI) Mode Fault Error

-#define AT91C_SPI_OVRES           (0x1 <<  3) // (SPI) Overrun Error Status

-#define AT91C_SPI_ENDRX           (0x1 <<  4) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_ENDTX           (0x1 <<  5) // (SPI) End of Receiver Transfer

-#define AT91C_SPI_RXBUFF          (0x1 <<  6) // (SPI) RXBUFF Interrupt

-#define AT91C_SPI_TXBUFE          (0x1 <<  7) // (SPI) TXBUFE Interrupt

-#define AT91C_SPI_NSSR            (0x1 <<  8) // (SPI) NSSR Interrupt

-#define AT91C_SPI_TXEMPTY         (0x1 <<  9) // (SPI) TXEMPTY Interrupt

-#define AT91C_SPI_SPIENS          (0x1 << 16) // (SPI) Enable Status

-// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- 

-// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- 

-// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- 

-// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- 

-#define AT91C_SPI_CPOL            (0x1 <<  0) // (SPI) Clock Polarity

-#define AT91C_SPI_NCPHA           (0x1 <<  1) // (SPI) Clock Phase

-#define AT91C_SPI_CSAAT           (0x1 <<  3) // (SPI) Chip Select Active After Transfer

-#define AT91C_SPI_BITS            (0xF <<  4) // (SPI) Bits Per Transfer

-#define 	AT91C_SPI_BITS_8                    (0x0 <<  4) // (SPI) 8 Bits Per transfer

-#define 	AT91C_SPI_BITS_9                    (0x1 <<  4) // (SPI) 9 Bits Per transfer

-#define 	AT91C_SPI_BITS_10                   (0x2 <<  4) // (SPI) 10 Bits Per transfer

-#define 	AT91C_SPI_BITS_11                   (0x3 <<  4) // (SPI) 11 Bits Per transfer

-#define 	AT91C_SPI_BITS_12                   (0x4 <<  4) // (SPI) 12 Bits Per transfer

-#define 	AT91C_SPI_BITS_13                   (0x5 <<  4) // (SPI) 13 Bits Per transfer

-#define 	AT91C_SPI_BITS_14                   (0x6 <<  4) // (SPI) 14 Bits Per transfer

-#define 	AT91C_SPI_BITS_15                   (0x7 <<  4) // (SPI) 15 Bits Per transfer

-#define 	AT91C_SPI_BITS_16                   (0x8 <<  4) // (SPI) 16 Bits Per transfer

-#define AT91C_SPI_SCBR            (0xFF <<  8) // (SPI) Serial Clock Baud Rate

-#define AT91C_SPI_DLYBS           (0xFF << 16) // (SPI) Delay Before SPCK

-#define AT91C_SPI_DLYBCT          (0xFF << 24) // (SPI) Delay Between Consecutive Transfers

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Usart

-// *****************************************************************************

-// *** Register offset in AT91S_USART structure ***

-#define US_CR           ( 0) // Control Register

-#define US_MR           ( 4) // Mode Register

-#define US_IER          ( 8) // Interrupt Enable Register

-#define US_IDR          (12) // Interrupt Disable Register

-#define US_IMR          (16) // Interrupt Mask Register

-#define US_CSR          (20) // Channel Status Register

-#define US_RHR          (24) // Receiver Holding Register

-#define US_THR          (28) // Transmitter Holding Register

-#define US_BRGR         (32) // Baud Rate Generator Register

-#define US_RTOR         (36) // Receiver Time-out Register

-#define US_TTGR         (40) // Transmitter Time-guard Register

-#define US_FIDI         (64) // FI_DI_Ratio Register

-#define US_NER          (68) // Nb Errors Register

-#define US_IF           (76) // IRDA_FILTER Register

-#define US_RPR          (256) // Receive Pointer Register

-#define US_RCR          (260) // Receive Counter Register

-#define US_TPR          (264) // Transmit Pointer Register

-#define US_TCR          (268) // Transmit Counter Register

-#define US_RNPR         (272) // Receive Next Pointer Register

-#define US_RNCR         (276) // Receive Next Counter Register

-#define US_TNPR         (280) // Transmit Next Pointer Register

-#define US_TNCR         (284) // Transmit Next Counter Register

-#define US_PTCR         (288) // PDC Transfer Control Register

-#define US_PTSR         (292) // PDC Transfer Status Register

-// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- 

-#define AT91C_US_STTBRK           (0x1 <<  9) // (USART) Start Break

-#define AT91C_US_STPBRK           (0x1 << 10) // (USART) Stop Break

-#define AT91C_US_STTTO            (0x1 << 11) // (USART) Start Time-out

-#define AT91C_US_SENDA            (0x1 << 12) // (USART) Send Address

-#define AT91C_US_RSTIT            (0x1 << 13) // (USART) Reset Iterations

-#define AT91C_US_RSTNACK          (0x1 << 14) // (USART) Reset Non Acknowledge

-#define AT91C_US_RETTO            (0x1 << 15) // (USART) Rearm Time-out

-#define AT91C_US_DTREN            (0x1 << 16) // (USART) Data Terminal ready Enable

-#define AT91C_US_DTRDIS           (0x1 << 17) // (USART) Data Terminal ready Disable

-#define AT91C_US_RTSEN            (0x1 << 18) // (USART) Request to Send enable

-#define AT91C_US_RTSDIS           (0x1 << 19) // (USART) Request to Send Disable

-// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- 

-#define AT91C_US_USMODE           (0xF <<  0) // (USART) Usart mode

-#define 	AT91C_US_USMODE_NORMAL               (0x0) // (USART) Normal

-#define 	AT91C_US_USMODE_RS485                (0x1) // (USART) RS485

-#define 	AT91C_US_USMODE_HWHSH                (0x2) // (USART) Hardware Handshaking

-#define 	AT91C_US_USMODE_MODEM                (0x3) // (USART) Modem

-#define 	AT91C_US_USMODE_ISO7816_0            (0x4) // (USART) ISO7816 protocol: T = 0

-#define 	AT91C_US_USMODE_ISO7816_1            (0x6) // (USART) ISO7816 protocol: T = 1

-#define 	AT91C_US_USMODE_IRDA                 (0x8) // (USART) IrDA

-#define 	AT91C_US_USMODE_SWHSH                (0xC) // (USART) Software Handshaking

-#define AT91C_US_CLKS             (0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CLKS_CLOCK                (0x0 <<  4) // (USART) Clock

-#define 	AT91C_US_CLKS_FDIV1                (0x1 <<  4) // (USART) fdiv1

-#define 	AT91C_US_CLKS_SLOW                 (0x2 <<  4) // (USART) slow_clock (ARM)

-#define 	AT91C_US_CLKS_EXT                  (0x3 <<  4) // (USART) External (SCK)

-#define AT91C_US_CHRL             (0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock

-#define 	AT91C_US_CHRL_5_BITS               (0x0 <<  6) // (USART) Character Length: 5 bits

-#define 	AT91C_US_CHRL_6_BITS               (0x1 <<  6) // (USART) Character Length: 6 bits

-#define 	AT91C_US_CHRL_7_BITS               (0x2 <<  6) // (USART) Character Length: 7 bits

-#define 	AT91C_US_CHRL_8_BITS               (0x3 <<  6) // (USART) Character Length: 8 bits

-#define AT91C_US_SYNC             (0x1 <<  8) // (USART) Synchronous Mode Select

-#define AT91C_US_NBSTOP           (0x3 << 12) // (USART) Number of Stop bits

-#define 	AT91C_US_NBSTOP_1_BIT                (0x0 << 12) // (USART) 1 stop bit

-#define 	AT91C_US_NBSTOP_15_BIT               (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits

-#define 	AT91C_US_NBSTOP_2_BIT                (0x2 << 12) // (USART) 2 stop bits

-#define AT91C_US_MSBF             (0x1 << 16) // (USART) Bit Order

-#define AT91C_US_MODE9            (0x1 << 17) // (USART) 9-bit Character length

-#define AT91C_US_CKLO             (0x1 << 18) // (USART) Clock Output Select

-#define AT91C_US_OVER             (0x1 << 19) // (USART) Over Sampling Mode

-#define AT91C_US_INACK            (0x1 << 20) // (USART) Inhibit Non Acknowledge

-#define AT91C_US_DSNACK           (0x1 << 21) // (USART) Disable Successive NACK

-#define AT91C_US_MAX_ITER         (0x1 << 24) // (USART) Number of Repetitions

-#define AT91C_US_FILTER           (0x1 << 28) // (USART) Receive Line Filter

-// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- 

-#define AT91C_US_RXBRK            (0x1 <<  2) // (USART) Break Received/End of Break

-#define AT91C_US_TIMEOUT          (0x1 <<  8) // (USART) Receiver Time-out

-#define AT91C_US_ITERATION        (0x1 << 10) // (USART) Max number of Repetitions Reached

-#define AT91C_US_NACK             (0x1 << 13) // (USART) Non Acknowledge

-#define AT91C_US_RIIC             (0x1 << 16) // (USART) Ring INdicator Input Change Flag

-#define AT91C_US_DSRIC            (0x1 << 17) // (USART) Data Set Ready Input Change Flag

-#define AT91C_US_DCDIC            (0x1 << 18) // (USART) Data Carrier Flag

-#define AT91C_US_CTSIC            (0x1 << 19) // (USART) Clear To Send Input Change Flag

-// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- 

-// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- 

-// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- 

-#define AT91C_US_RI               (0x1 << 20) // (USART) Image of RI Input

-#define AT91C_US_DSR              (0x1 << 21) // (USART) Image of DSR Input

-#define AT91C_US_DCD              (0x1 << 22) // (USART) Image of DCD Input

-#define AT91C_US_CTS              (0x1 << 23) // (USART) Image of CTS Input

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_SSC structure ***

-#define SSC_CR          ( 0) // Control Register

-#define SSC_CMR         ( 4) // Clock Mode Register

-#define SSC_RCMR        (16) // Receive Clock ModeRegister

-#define SSC_RFMR        (20) // Receive Frame Mode Register

-#define SSC_TCMR        (24) // Transmit Clock Mode Register

-#define SSC_TFMR        (28) // Transmit Frame Mode Register

-#define SSC_RHR         (32) // Receive Holding Register

-#define SSC_THR         (36) // Transmit Holding Register

-#define SSC_RSHR        (48) // Receive Sync Holding Register

-#define SSC_TSHR        (52) // Transmit Sync Holding Register

-#define SSC_SR          (64) // Status Register

-#define SSC_IER         (68) // Interrupt Enable Register

-#define SSC_IDR         (72) // Interrupt Disable Register

-#define SSC_IMR         (76) // Interrupt Mask Register

-#define SSC_RPR         (256) // Receive Pointer Register

-#define SSC_RCR         (260) // Receive Counter Register

-#define SSC_TPR         (264) // Transmit Pointer Register

-#define SSC_TCR         (268) // Transmit Counter Register

-#define SSC_RNPR        (272) // Receive Next Pointer Register

-#define SSC_RNCR        (276) // Receive Next Counter Register

-#define SSC_TNPR        (280) // Transmit Next Pointer Register

-#define SSC_TNCR        (284) // Transmit Next Counter Register

-#define SSC_PTCR        (288) // PDC Transfer Control Register

-#define SSC_PTSR        (292) // PDC Transfer Status Register

-// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- 

-#define AT91C_SSC_RXEN            (0x1 <<  0) // (SSC) Receive Enable

-#define AT91C_SSC_RXDIS           (0x1 <<  1) // (SSC) Receive Disable

-#define AT91C_SSC_TXEN            (0x1 <<  8) // (SSC) Transmit Enable

-#define AT91C_SSC_TXDIS           (0x1 <<  9) // (SSC) Transmit Disable

-#define AT91C_SSC_SWRST           (0x1 << 15) // (SSC) Software Reset

-// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- 

-#define AT91C_SSC_CKS             (0x3 <<  0) // (SSC) Receive/Transmit Clock Selection

-#define 	AT91C_SSC_CKS_DIV                  (0x0) // (SSC) Divided Clock

-#define 	AT91C_SSC_CKS_TK                   (0x1) // (SSC) TK Clock signal

-#define 	AT91C_SSC_CKS_RK                   (0x2) // (SSC) RK pin

-#define AT91C_SSC_CKO             (0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection

-#define 	AT91C_SSC_CKO_NONE                 (0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only

-#define 	AT91C_SSC_CKO_CONTINOUS            (0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output

-#define 	AT91C_SSC_CKO_DATA_TX              (0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output

-#define AT91C_SSC_CKI             (0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion

-#define AT91C_SSC_START           (0xF <<  8) // (SSC) Receive/Transmit Start Selection

-#define 	AT91C_SSC_START_CONTINOUS            (0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.

-#define 	AT91C_SSC_START_TX                   (0x1 <<  8) // (SSC) Transmit/Receive start

-#define 	AT91C_SSC_START_LOW_RF               (0x2 <<  8) // (SSC) Detection of a low level on RF input

-#define 	AT91C_SSC_START_HIGH_RF              (0x3 <<  8) // (SSC) Detection of a high level on RF input

-#define 	AT91C_SSC_START_FALL_RF              (0x4 <<  8) // (SSC) Detection of a falling edge on RF input

-#define 	AT91C_SSC_START_RISE_RF              (0x5 <<  8) // (SSC) Detection of a rising edge on RF input

-#define 	AT91C_SSC_START_LEVEL_RF             (0x6 <<  8) // (SSC) Detection of any level change on RF input

-#define 	AT91C_SSC_START_EDGE_RF              (0x7 <<  8) // (SSC) Detection of any edge on RF input

-#define 	AT91C_SSC_START_0                    (0x8 <<  8) // (SSC) Compare 0

-#define AT91C_SSC_STTDLY          (0xFF << 16) // (SSC) Receive/Transmit Start Delay

-#define AT91C_SSC_PERIOD          (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection

-// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- 

-#define AT91C_SSC_DATLEN          (0x1F <<  0) // (SSC) Data Length

-#define AT91C_SSC_LOOP            (0x1 <<  5) // (SSC) Loop Mode

-#define AT91C_SSC_MSBF            (0x1 <<  7) // (SSC) Most Significant Bit First

-#define AT91C_SSC_DATNB           (0xF <<  8) // (SSC) Data Number per Frame

-#define AT91C_SSC_FSLEN           (0xF << 16) // (SSC) Receive/Transmit Frame Sync length

-#define AT91C_SSC_FSOS            (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection

-#define 	AT91C_SSC_FSOS_NONE                 (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only

-#define 	AT91C_SSC_FSOS_NEGATIVE             (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse

-#define 	AT91C_SSC_FSOS_POSITIVE             (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse

-#define 	AT91C_SSC_FSOS_LOW                  (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer

-#define 	AT91C_SSC_FSOS_HIGH                 (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer

-#define 	AT91C_SSC_FSOS_TOGGLE               (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer

-#define AT91C_SSC_FSEDGE          (0x1 << 24) // (SSC) Frame Sync Edge Detection

-// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- 

-// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- 

-#define AT91C_SSC_DATDEF          (0x1 <<  5) // (SSC) Data Default Value

-#define AT91C_SSC_FSDEN           (0x1 << 23) // (SSC) Frame Sync Data Enable

-// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- 

-#define AT91C_SSC_TXRDY           (0x1 <<  0) // (SSC) Transmit Ready

-#define AT91C_SSC_TXEMPTY         (0x1 <<  1) // (SSC) Transmit Empty

-#define AT91C_SSC_ENDTX           (0x1 <<  2) // (SSC) End Of Transmission

-#define AT91C_SSC_TXBUFE          (0x1 <<  3) // (SSC) Transmit Buffer Empty

-#define AT91C_SSC_RXRDY           (0x1 <<  4) // (SSC) Receive Ready

-#define AT91C_SSC_OVRUN           (0x1 <<  5) // (SSC) Receive Overrun

-#define AT91C_SSC_ENDRX           (0x1 <<  6) // (SSC) End of Reception

-#define AT91C_SSC_RXBUFF          (0x1 <<  7) // (SSC) Receive Buffer Full

-#define AT91C_SSC_TXSYN           (0x1 << 10) // (SSC) Transmit Sync

-#define AT91C_SSC_RXSYN           (0x1 << 11) // (SSC) Receive Sync

-#define AT91C_SSC_TXENA           (0x1 << 16) // (SSC) Transmit Enable

-#define AT91C_SSC_RXENA           (0x1 << 17) // (SSC) Receive Enable

-// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- 

-// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- 

-// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Two-wire Interface

-// *****************************************************************************

-// *** Register offset in AT91S_TWI structure ***

-#define TWI_CR          ( 0) // Control Register

-#define TWI_MMR         ( 4) // Master Mode Register

-#define TWI_IADR        (12) // Internal Address Register

-#define TWI_CWGR        (16) // Clock Waveform Generator Register

-#define TWI_SR          (32) // Status Register

-#define TWI_IER         (36) // Interrupt Enable Register

-#define TWI_IDR         (40) // Interrupt Disable Register

-#define TWI_IMR         (44) // Interrupt Mask Register

-#define TWI_RHR         (48) // Receive Holding Register

-#define TWI_THR         (52) // Transmit Holding Register

-// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- 

-#define AT91C_TWI_START           (0x1 <<  0) // (TWI) Send a START Condition

-#define AT91C_TWI_STOP            (0x1 <<  1) // (TWI) Send a STOP Condition

-#define AT91C_TWI_MSEN            (0x1 <<  2) // (TWI) TWI Master Transfer Enabled

-#define AT91C_TWI_MSDIS           (0x1 <<  3) // (TWI) TWI Master Transfer Disabled

-#define AT91C_TWI_SWRST           (0x1 <<  7) // (TWI) Software Reset

-// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- 

-#define AT91C_TWI_IADRSZ          (0x3 <<  8) // (TWI) Internal Device Address Size

-#define 	AT91C_TWI_IADRSZ_NO                   (0x0 <<  8) // (TWI) No internal device address

-#define 	AT91C_TWI_IADRSZ_1_BYTE               (0x1 <<  8) // (TWI) One-byte internal device address

-#define 	AT91C_TWI_IADRSZ_2_BYTE               (0x2 <<  8) // (TWI) Two-byte internal device address

-#define 	AT91C_TWI_IADRSZ_3_BYTE               (0x3 <<  8) // (TWI) Three-byte internal device address

-#define AT91C_TWI_MREAD           (0x1 << 12) // (TWI) Master Read Direction

-#define AT91C_TWI_DADR            (0x7F << 16) // (TWI) Device Address

-// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- 

-#define AT91C_TWI_CLDIV           (0xFF <<  0) // (TWI) Clock Low Divider

-#define AT91C_TWI_CHDIV           (0xFF <<  8) // (TWI) Clock High Divider

-#define AT91C_TWI_CKDIV           (0x7 << 16) // (TWI) Clock Divider

-// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- 

-#define AT91C_TWI_TXCOMP          (0x1 <<  0) // (TWI) Transmission Completed

-#define AT91C_TWI_RXRDY           (0x1 <<  1) // (TWI) Receive holding register ReaDY

-#define AT91C_TWI_TXRDY           (0x1 <<  2) // (TWI) Transmit holding register ReaDY

-#define AT91C_TWI_OVRE            (0x1 <<  6) // (TWI) Overrun Error

-#define AT91C_TWI_UNRE            (0x1 <<  7) // (TWI) Underrun Error

-#define AT91C_TWI_NACK            (0x1 <<  8) // (TWI) Not Acknowledged

-// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- 

-// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- 

-// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface

-// *****************************************************************************

-// *** Register offset in AT91S_PWMC_CH structure ***

-#define PWMC_CMR        ( 0) // Channel Mode Register

-#define PWMC_CDTYR      ( 4) // Channel Duty Cycle Register

-#define PWMC_CPRDR      ( 8) // Channel Period Register

-#define PWMC_CCNTR      (12) // Channel Counter Register

-#define PWMC_CUPDR      (16) // Channel Update Register

-#define PWMC_Reserved   (20) // Reserved

-// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- 

-#define AT91C_PWMC_CPRE           (0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx

-#define 	AT91C_PWMC_CPRE_MCK                  (0x0) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKA                 (0xB) // (PWMC_CH) 

-#define 	AT91C_PWMC_CPRE_MCKB                 (0xC) // (PWMC_CH) 

-#define AT91C_PWMC_CALG           (0x1 <<  8) // (PWMC_CH) Channel Alignment

-#define AT91C_PWMC_CPOL           (0x1 <<  9) // (PWMC_CH) Channel Polarity

-#define AT91C_PWMC_CPD            (0x1 << 10) // (PWMC_CH) Channel Update Period

-// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- 

-#define AT91C_PWMC_CDTY           (0x0 <<  0) // (PWMC_CH) Channel Duty Cycle

-// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- 

-#define AT91C_PWMC_CPRD           (0x0 <<  0) // (PWMC_CH) Channel Period

-// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- 

-#define AT91C_PWMC_CCNT           (0x0 <<  0) // (PWMC_CH) Channel Counter

-// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- 

-#define AT91C_PWMC_CUPD           (0x0 <<  0) // (PWMC_CH) Channel Update

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface

-// *****************************************************************************

-// *** Register offset in AT91S_PWMC structure ***

-#define PWMC_MR         ( 0) // PWMC Mode Register

-#define PWMC_ENA        ( 4) // PWMC Enable Register

-#define PWMC_DIS        ( 8) // PWMC Disable Register

-#define PWMC_SR         (12) // PWMC Status Register

-#define PWMC_IER        (16) // PWMC Interrupt Enable Register

-#define PWMC_IDR        (20) // PWMC Interrupt Disable Register

-#define PWMC_IMR        (24) // PWMC Interrupt Mask Register

-#define PWMC_ISR        (28) // PWMC Interrupt Status Register

-#define PWMC_VR         (252) // PWMC Version Register

-#define PWMC_CH         (512) // PWMC Channel

-// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- 

-#define AT91C_PWMC_DIVA           (0xFF <<  0) // (PWMC) CLKA divide factor.

-#define AT91C_PWMC_PREA           (0xF <<  8) // (PWMC) Divider Input Clock Prescaler A

-#define 	AT91C_PWMC_PREA_MCK                  (0x0 <<  8) // (PWMC) 

-#define AT91C_PWMC_DIVB           (0xFF << 16) // (PWMC) CLKB divide factor.

-#define AT91C_PWMC_PREB           (0xF << 24) // (PWMC) Divider Input Clock Prescaler B

-#define 	AT91C_PWMC_PREB_MCK                  (0x0 << 24) // (PWMC) 

-// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- 

-#define AT91C_PWMC_CHID0          (0x1 <<  0) // (PWMC) Channel ID 0

-#define AT91C_PWMC_CHID1          (0x1 <<  1) // (PWMC) Channel ID 1

-#define AT91C_PWMC_CHID2          (0x1 <<  2) // (PWMC) Channel ID 2

-#define AT91C_PWMC_CHID3          (0x1 <<  3) // (PWMC) Channel ID 3

-// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- 

-// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- 

-// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- 

-// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- 

-// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- 

-// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR USB Device Interface

-// *****************************************************************************

-// *** Register offset in AT91S_UDP structure ***

-#define UDP_NUM         ( 0) // Frame Number Register

-#define UDP_GLBSTATE    ( 4) // Global State Register

-#define UDP_FADDR       ( 8) // Function Address Register

-#define UDP_IER         (16) // Interrupt Enable Register

-#define UDP_IDR         (20) // Interrupt Disable Register

-#define UDP_IMR         (24) // Interrupt Mask Register

-#define UDP_ISR         (28) // Interrupt Status Register

-#define UDP_ICR         (32) // Interrupt Clear Register

-#define UDP_RSTEP       (40) // Reset Endpoint Register

-#define UDP_CSR         (48) // Endpoint Control and Status Register

-#define UDP_FDR         (80) // Endpoint FIFO Data Register

-#define UDP_TXVC        (116) // Transceiver Control Register

-// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- 

-#define AT91C_UDP_FRM_NUM         (0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats

-#define AT91C_UDP_FRM_ERR         (0x1 << 16) // (UDP) Frame Error

-#define AT91C_UDP_FRM_OK          (0x1 << 17) // (UDP) Frame OK

-// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- 

-#define AT91C_UDP_FADDEN          (0x1 <<  0) // (UDP) Function Address Enable

-#define AT91C_UDP_CONFG           (0x1 <<  1) // (UDP) Configured

-#define AT91C_UDP_ESR             (0x1 <<  2) // (UDP) Enable Send Resume

-#define AT91C_UDP_RSMINPR         (0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host

-#define AT91C_UDP_RMWUPE          (0x1 <<  4) // (UDP) Remote Wake Up Enable

-// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- 

-#define AT91C_UDP_FADD            (0xFF <<  0) // (UDP) Function Address Value

-#define AT91C_UDP_FEN             (0x1 <<  8) // (UDP) Function Enable

-// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- 

-#define AT91C_UDP_EPINT0          (0x1 <<  0) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT1          (0x1 <<  1) // (UDP) Endpoint 0 Interrupt

-#define AT91C_UDP_EPINT2          (0x1 <<  2) // (UDP) Endpoint 2 Interrupt

-#define AT91C_UDP_EPINT3          (0x1 <<  3) // (UDP) Endpoint 3 Interrupt

-#define AT91C_UDP_EPINT4          (0x1 <<  4) // (UDP) Endpoint 4 Interrupt

-#define AT91C_UDP_EPINT5          (0x1 <<  5) // (UDP) Endpoint 5 Interrupt

-#define AT91C_UDP_RXSUSP          (0x1 <<  8) // (UDP) USB Suspend Interrupt

-#define AT91C_UDP_RXRSM           (0x1 <<  9) // (UDP) USB Resume Interrupt

-#define AT91C_UDP_EXTRSM          (0x1 << 10) // (UDP) USB External Resume Interrupt

-#define AT91C_UDP_SOFINT          (0x1 << 11) // (UDP) USB Start Of frame Interrupt

-#define AT91C_UDP_WAKEUP          (0x1 << 13) // (UDP) USB Resume Interrupt

-// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- 

-// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- 

-// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- 

-#define AT91C_UDP_ENDBUSRES       (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt

-// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- 

-// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- 

-#define AT91C_UDP_EP0             (0x1 <<  0) // (UDP) Reset Endpoint 0

-#define AT91C_UDP_EP1             (0x1 <<  1) // (UDP) Reset Endpoint 1

-#define AT91C_UDP_EP2             (0x1 <<  2) // (UDP) Reset Endpoint 2

-#define AT91C_UDP_EP3             (0x1 <<  3) // (UDP) Reset Endpoint 3

-#define AT91C_UDP_EP4             (0x1 <<  4) // (UDP) Reset Endpoint 4

-#define AT91C_UDP_EP5             (0x1 <<  5) // (UDP) Reset Endpoint 5

-// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- 

-#define AT91C_UDP_TXCOMP          (0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR

-#define AT91C_UDP_RX_DATA_BK0     (0x1 <<  1) // (UDP) Receive Data Bank 0

-#define AT91C_UDP_RXSETUP         (0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)

-#define AT91C_UDP_ISOERROR        (0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)

-#define AT91C_UDP_TXPKTRDY        (0x1 <<  4) // (UDP) Transmit Packet Ready

-#define AT91C_UDP_FORCESTALL      (0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).

-#define AT91C_UDP_RX_DATA_BK1     (0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).

-#define AT91C_UDP_DIR             (0x1 <<  7) // (UDP) Transfer Direction

-#define AT91C_UDP_EPTYPE          (0x7 <<  8) // (UDP) Endpoint type

-#define 	AT91C_UDP_EPTYPE_CTRL                 (0x0 <<  8) // (UDP) Control

-#define 	AT91C_UDP_EPTYPE_ISO_OUT              (0x1 <<  8) // (UDP) Isochronous OUT

-#define 	AT91C_UDP_EPTYPE_BULK_OUT             (0x2 <<  8) // (UDP) Bulk OUT

-#define 	AT91C_UDP_EPTYPE_INT_OUT              (0x3 <<  8) // (UDP) Interrupt OUT

-#define 	AT91C_UDP_EPTYPE_ISO_IN               (0x5 <<  8) // (UDP) Isochronous IN

-#define 	AT91C_UDP_EPTYPE_BULK_IN              (0x6 <<  8) // (UDP) Bulk IN

-#define 	AT91C_UDP_EPTYPE_INT_IN               (0x7 <<  8) // (UDP) Interrupt IN

-#define AT91C_UDP_DTGLE           (0x1 << 11) // (UDP) Data Toggle

-#define AT91C_UDP_EPEDS           (0x1 << 15) // (UDP) Endpoint Enable Disable

-#define AT91C_UDP_RXBYTECNT       (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO

-// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- 

-#define AT91C_UDP_TXVDIS          (0x1 <<  8) // (UDP) 

-#define AT91C_UDP_PUON            (0x1 <<  9) // (UDP) Pull-up ON

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface

-// *****************************************************************************

-// *** Register offset in AT91S_TC structure ***

-#define TC_CCR          ( 0) // Channel Control Register

-#define TC_CMR          ( 4) // Channel Mode Register (Capture Mode / Waveform Mode)

-#define TC_CV           (16) // Counter Value

-#define TC_RA           (20) // Register A

-#define TC_RB           (24) // Register B

-#define TC_RC           (28) // Register C

-#define TC_SR           (32) // Status Register

-#define TC_IER          (36) // Interrupt Enable Register

-#define TC_IDR          (40) // Interrupt Disable Register

-#define TC_IMR          (44) // Interrupt Mask Register

-// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- 

-#define AT91C_TC_CLKEN            (0x1 <<  0) // (TC) Counter Clock Enable Command

-#define AT91C_TC_CLKDIS           (0x1 <<  1) // (TC) Counter Clock Disable Command

-#define AT91C_TC_SWTRG            (0x1 <<  2) // (TC) Software Trigger Command

-// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- 

-#define AT91C_TC_CLKS             (0x7 <<  0) // (TC) Clock Selection

-#define 	AT91C_TC_CLKS_TIMER_DIV1_CLOCK     (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV2_CLOCK     (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV3_CLOCK     (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV4_CLOCK     (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK

-#define 	AT91C_TC_CLKS_TIMER_DIV5_CLOCK     (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK

-#define 	AT91C_TC_CLKS_XC0                  (0x5) // (TC) Clock selected: XC0

-#define 	AT91C_TC_CLKS_XC1                  (0x6) // (TC) Clock selected: XC1

-#define 	AT91C_TC_CLKS_XC2                  (0x7) // (TC) Clock selected: XC2

-#define AT91C_TC_CLKI             (0x1 <<  3) // (TC) Clock Invert

-#define AT91C_TC_BURST            (0x3 <<  4) // (TC) Burst Signal Selection

-#define 	AT91C_TC_BURST_NONE                 (0x0 <<  4) // (TC) The clock is not gated by an external signal

-#define 	AT91C_TC_BURST_XC0                  (0x1 <<  4) // (TC) XC0 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC1                  (0x2 <<  4) // (TC) XC1 is ANDed with the selected clock

-#define 	AT91C_TC_BURST_XC2                  (0x3 <<  4) // (TC) XC2 is ANDed with the selected clock

-#define AT91C_TC_CPCSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare

-#define AT91C_TC_LDBSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading

-#define AT91C_TC_CPCDIS           (0x1 <<  7) // (TC) Counter Clock Disable with RC Compare

-#define AT91C_TC_LDBDIS           (0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading

-#define AT91C_TC_ETRGEDG          (0x3 <<  8) // (TC) External Trigger Edge Selection

-#define 	AT91C_TC_ETRGEDG_NONE                 (0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_ETRGEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_ETRGEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_ETRGEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_EEVTEDG          (0x3 <<  8) // (TC) External Event Edge Selection

-#define 	AT91C_TC_EEVTEDG_NONE                 (0x0 <<  8) // (TC) Edge: None

-#define 	AT91C_TC_EEVTEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge

-#define 	AT91C_TC_EEVTEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge

-#define 	AT91C_TC_EEVTEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge

-#define AT91C_TC_EEVT             (0x3 << 10) // (TC) External Event  Selection

-#define 	AT91C_TC_EEVT_TIOB                 (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input

-#define 	AT91C_TC_EEVT_XC0                  (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output

-#define 	AT91C_TC_EEVT_XC1                  (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output

-#define 	AT91C_TC_EEVT_XC2                  (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output

-#define AT91C_TC_ABETRG           (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection

-#define AT91C_TC_ENETRG           (0x1 << 12) // (TC) External Event Trigger enable

-#define AT91C_TC_WAVESEL          (0x3 << 13) // (TC) Waveform  Selection

-#define 	AT91C_TC_WAVESEL_UP                   (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN               (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UP_AUTO              (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare

-#define 	AT91C_TC_WAVESEL_UPDOWN_AUTO          (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare

-#define AT91C_TC_CPCTRG           (0x1 << 14) // (TC) RC Compare Trigger Enable

-#define AT91C_TC_WAVE             (0x1 << 15) // (TC) 

-#define AT91C_TC_ACPA             (0x3 << 16) // (TC) RA Compare Effect on TIOA

-#define 	AT91C_TC_ACPA_NONE                 (0x0 << 16) // (TC) Effect: none

-#define 	AT91C_TC_ACPA_SET                  (0x1 << 16) // (TC) Effect: set

-#define 	AT91C_TC_ACPA_CLEAR                (0x2 << 16) // (TC) Effect: clear

-#define 	AT91C_TC_ACPA_TOGGLE               (0x3 << 16) // (TC) Effect: toggle

-#define AT91C_TC_LDRA             (0x3 << 16) // (TC) RA Loading Selection

-#define 	AT91C_TC_LDRA_NONE                 (0x0 << 16) // (TC) Edge: None

-#define 	AT91C_TC_LDRA_RISING               (0x1 << 16) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRA_FALLING              (0x2 << 16) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRA_BOTH                 (0x3 << 16) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_ACPC             (0x3 << 18) // (TC) RC Compare Effect on TIOA

-#define 	AT91C_TC_ACPC_NONE                 (0x0 << 18) // (TC) Effect: none

-#define 	AT91C_TC_ACPC_SET                  (0x1 << 18) // (TC) Effect: set

-#define 	AT91C_TC_ACPC_CLEAR                (0x2 << 18) // (TC) Effect: clear

-#define 	AT91C_TC_ACPC_TOGGLE               (0x3 << 18) // (TC) Effect: toggle

-#define AT91C_TC_LDRB             (0x3 << 18) // (TC) RB Loading Selection

-#define 	AT91C_TC_LDRB_NONE                 (0x0 << 18) // (TC) Edge: None

-#define 	AT91C_TC_LDRB_RISING               (0x1 << 18) // (TC) Edge: rising edge of TIOA

-#define 	AT91C_TC_LDRB_FALLING              (0x2 << 18) // (TC) Edge: falling edge of TIOA

-#define 	AT91C_TC_LDRB_BOTH                 (0x3 << 18) // (TC) Edge: each edge of TIOA

-#define AT91C_TC_AEEVT            (0x3 << 20) // (TC) External Event Effect on TIOA

-#define 	AT91C_TC_AEEVT_NONE                 (0x0 << 20) // (TC) Effect: none

-#define 	AT91C_TC_AEEVT_SET                  (0x1 << 20) // (TC) Effect: set

-#define 	AT91C_TC_AEEVT_CLEAR                (0x2 << 20) // (TC) Effect: clear

-#define 	AT91C_TC_AEEVT_TOGGLE               (0x3 << 20) // (TC) Effect: toggle

-#define AT91C_TC_ASWTRG           (0x3 << 22) // (TC) Software Trigger Effect on TIOA

-#define 	AT91C_TC_ASWTRG_NONE                 (0x0 << 22) // (TC) Effect: none

-#define 	AT91C_TC_ASWTRG_SET                  (0x1 << 22) // (TC) Effect: set

-#define 	AT91C_TC_ASWTRG_CLEAR                (0x2 << 22) // (TC) Effect: clear

-#define 	AT91C_TC_ASWTRG_TOGGLE               (0x3 << 22) // (TC) Effect: toggle

-#define AT91C_TC_BCPB             (0x3 << 24) // (TC) RB Compare Effect on TIOB

-#define 	AT91C_TC_BCPB_NONE                 (0x0 << 24) // (TC) Effect: none

-#define 	AT91C_TC_BCPB_SET                  (0x1 << 24) // (TC) Effect: set

-#define 	AT91C_TC_BCPB_CLEAR                (0x2 << 24) // (TC) Effect: clear

-#define 	AT91C_TC_BCPB_TOGGLE               (0x3 << 24) // (TC) Effect: toggle

-#define AT91C_TC_BCPC             (0x3 << 26) // (TC) RC Compare Effect on TIOB

-#define 	AT91C_TC_BCPC_NONE                 (0x0 << 26) // (TC) Effect: none

-#define 	AT91C_TC_BCPC_SET                  (0x1 << 26) // (TC) Effect: set

-#define 	AT91C_TC_BCPC_CLEAR                (0x2 << 26) // (TC) Effect: clear

-#define 	AT91C_TC_BCPC_TOGGLE               (0x3 << 26) // (TC) Effect: toggle

-#define AT91C_TC_BEEVT            (0x3 << 28) // (TC) External Event Effect on TIOB

-#define 	AT91C_TC_BEEVT_NONE                 (0x0 << 28) // (TC) Effect: none

-#define 	AT91C_TC_BEEVT_SET                  (0x1 << 28) // (TC) Effect: set

-#define 	AT91C_TC_BEEVT_CLEAR                (0x2 << 28) // (TC) Effect: clear

-#define 	AT91C_TC_BEEVT_TOGGLE               (0x3 << 28) // (TC) Effect: toggle

-#define AT91C_TC_BSWTRG           (0x3 << 30) // (TC) Software Trigger Effect on TIOB

-#define 	AT91C_TC_BSWTRG_NONE                 (0x0 << 30) // (TC) Effect: none

-#define 	AT91C_TC_BSWTRG_SET                  (0x1 << 30) // (TC) Effect: set

-#define 	AT91C_TC_BSWTRG_CLEAR                (0x2 << 30) // (TC) Effect: clear

-#define 	AT91C_TC_BSWTRG_TOGGLE               (0x3 << 30) // (TC) Effect: toggle

-// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- 

-#define AT91C_TC_COVFS            (0x1 <<  0) // (TC) Counter Overflow

-#define AT91C_TC_LOVRS            (0x1 <<  1) // (TC) Load Overrun

-#define AT91C_TC_CPAS             (0x1 <<  2) // (TC) RA Compare

-#define AT91C_TC_CPBS             (0x1 <<  3) // (TC) RB Compare

-#define AT91C_TC_CPCS             (0x1 <<  4) // (TC) RC Compare

-#define AT91C_TC_LDRAS            (0x1 <<  5) // (TC) RA Loading

-#define AT91C_TC_LDRBS            (0x1 <<  6) // (TC) RB Loading

-#define AT91C_TC_ETRGS            (0x1 <<  7) // (TC) External Trigger

-#define AT91C_TC_CLKSTA           (0x1 << 16) // (TC) Clock Enabling

-#define AT91C_TC_MTIOA            (0x1 << 17) // (TC) TIOA Mirror

-#define AT91C_TC_MTIOB            (0x1 << 18) // (TC) TIOA Mirror

-// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- 

-// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- 

-// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Timer Counter Interface

-// *****************************************************************************

-// *** Register offset in AT91S_TCB structure ***

-#define TCB_TC0         ( 0) // TC Channel 0

-#define TCB_TC1         (64) // TC Channel 1

-#define TCB_TC2         (128) // TC Channel 2

-#define TCB_BCR         (192) // TC Block Control Register

-#define TCB_BMR         (196) // TC Block Mode Register

-// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- 

-#define AT91C_TCB_SYNC            (0x1 <<  0) // (TCB) Synchro Command

-// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- 

-#define AT91C_TCB_TC0XC0S         (0x3 <<  0) // (TCB) External Clock Signal 0 Selection

-#define 	AT91C_TCB_TC0XC0S_TCLK0                (0x0) // (TCB) TCLK0 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_NONE                 (0x1) // (TCB) None signal connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA1                (0x2) // (TCB) TIOA1 connected to XC0

-#define 	AT91C_TCB_TC0XC0S_TIOA2                (0x3) // (TCB) TIOA2 connected to XC0

-#define AT91C_TCB_TC1XC1S         (0x3 <<  2) // (TCB) External Clock Signal 1 Selection

-#define 	AT91C_TCB_TC1XC1S_TCLK1                (0x0 <<  2) // (TCB) TCLK1 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_NONE                 (0x1 <<  2) // (TCB) None signal connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA0                (0x2 <<  2) // (TCB) TIOA0 connected to XC1

-#define 	AT91C_TCB_TC1XC1S_TIOA2                (0x3 <<  2) // (TCB) TIOA2 connected to XC1

-#define AT91C_TCB_TC2XC2S         (0x3 <<  4) // (TCB) External Clock Signal 2 Selection

-#define 	AT91C_TCB_TC2XC2S_TCLK2                (0x0 <<  4) // (TCB) TCLK2 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_NONE                 (0x1 <<  4) // (TCB) None signal connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA0                (0x2 <<  4) // (TCB) TIOA0 connected to XC2

-#define 	AT91C_TCB_TC2XC2S_TIOA1                (0x3 <<  4) // (TCB) TIOA2 connected to XC2

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Control Area Network MailBox Interface

-// *****************************************************************************

-// *** Register offset in AT91S_CAN_MB structure ***

-#define CAN_MB_MMR      ( 0) // MailBox Mode Register

-#define CAN_MB_MAM      ( 4) // MailBox Acceptance Mask Register

-#define CAN_MB_MID      ( 8) // MailBox ID Register

-#define CAN_MB_MFID     (12) // MailBox Family ID Register

-#define CAN_MB_MSR      (16) // MailBox Status Register

-#define CAN_MB_MDL      (20) // MailBox Data Low Register

-#define CAN_MB_MDH      (24) // MailBox Data High Register

-#define CAN_MB_MCR      (28) // MailBox Control Register

-// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- 

-#define AT91C_CAN_MTIMEMARK       (0xFFFF <<  0) // (CAN_MB) Mailbox Timemark

-#define AT91C_CAN_PRIOR           (0xF << 16) // (CAN_MB) Mailbox Priority

-#define AT91C_CAN_MOT             (0x7 << 24) // (CAN_MB) Mailbox Object Type

-#define 	AT91C_CAN_MOT_DIS                  (0x0 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_RX                   (0x1 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_RXOVERWRITE          (0x2 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_TX                   (0x3 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_CONSUMER             (0x4 << 24) // (CAN_MB) 

-#define 	AT91C_CAN_MOT_PRODUCER             (0x5 << 24) // (CAN_MB) 

-// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- 

-#define AT91C_CAN_MIDvB           (0x3FFFF <<  0) // (CAN_MB) Complementary bits for identifier in extended mode

-#define AT91C_CAN_MIDvA           (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode

-#define AT91C_CAN_MIDE            (0x1 << 29) // (CAN_MB) Identifier Version

-// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- 

-// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- 

-// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- 

-#define AT91C_CAN_MTIMESTAMP      (0xFFFF <<  0) // (CAN_MB) Timer Value

-#define AT91C_CAN_MDLC            (0xF << 16) // (CAN_MB) Mailbox Data Length Code

-#define AT91C_CAN_MRTR            (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request

-#define AT91C_CAN_MABT            (0x1 << 22) // (CAN_MB) Mailbox Message Abort

-#define AT91C_CAN_MRDY            (0x1 << 23) // (CAN_MB) Mailbox Ready

-#define AT91C_CAN_MMI             (0x1 << 24) // (CAN_MB) Mailbox Message Ignored

-// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- 

-// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- 

-// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- 

-#define AT91C_CAN_MACR            (0x1 << 22) // (CAN_MB) Abort Request for Mailbox

-#define AT91C_CAN_MTCR            (0x1 << 23) // (CAN_MB) Mailbox Transfer Command

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Control Area Network Interface

-// *****************************************************************************

-// *** Register offset in AT91S_CAN structure ***

-#define CAN_MR          ( 0) // Mode Register

-#define CAN_IER         ( 4) // Interrupt Enable Register

-#define CAN_IDR         ( 8) // Interrupt Disable Register

-#define CAN_IMR         (12) // Interrupt Mask Register

-#define CAN_SR          (16) // Status Register

-#define CAN_BR          (20) // Baudrate Register

-#define CAN_TIM         (24) // Timer Register

-#define CAN_TIMESTP     (28) // Time Stamp Register

-#define CAN_ECR         (32) // Error Counter Register

-#define CAN_TCR         (36) // Transfer Command Register

-#define CAN_ACR         (40) // Abort Command Register

-#define CAN_VR          (252) // Version Register

-#define CAN_MB0         (512) // CAN Mailbox 0

-#define CAN_MB1         (544) // CAN Mailbox 1

-#define CAN_MB2         (576) // CAN Mailbox 2

-#define CAN_MB3         (608) // CAN Mailbox 3

-#define CAN_MB4         (640) // CAN Mailbox 4

-#define CAN_MB5         (672) // CAN Mailbox 5

-#define CAN_MB6         (704) // CAN Mailbox 6

-#define CAN_MB7         (736) // CAN Mailbox 7

-#define CAN_MB8         (768) // CAN Mailbox 8

-#define CAN_MB9         (800) // CAN Mailbox 9

-#define CAN_MB10        (832) // CAN Mailbox 10

-#define CAN_MB11        (864) // CAN Mailbox 11

-#define CAN_MB12        (896) // CAN Mailbox 12

-#define CAN_MB13        (928) // CAN Mailbox 13

-#define CAN_MB14        (960) // CAN Mailbox 14

-#define CAN_MB15        (992) // CAN Mailbox 15

-// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- 

-#define AT91C_CAN_CANEN           (0x1 <<  0) // (CAN) CAN Controller Enable

-#define AT91C_CAN_LPM             (0x1 <<  1) // (CAN) Disable/Enable Low Power Mode

-#define AT91C_CAN_ABM             (0x1 <<  2) // (CAN) Disable/Enable Autobaud/Listen Mode

-#define AT91C_CAN_OVL             (0x1 <<  3) // (CAN) Disable/Enable Overload Frame

-#define AT91C_CAN_TEOF            (0x1 <<  4) // (CAN) Time Stamp messages at each end of Frame

-#define AT91C_CAN_TTM             (0x1 <<  5) // (CAN) Disable/Enable Time Trigger Mode

-#define AT91C_CAN_TIMFRZ          (0x1 <<  6) // (CAN) Enable Timer Freeze

-#define AT91C_CAN_DRPT            (0x1 <<  7) // (CAN) Disable Repeat

-// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- 

-#define AT91C_CAN_MB0             (0x1 <<  0) // (CAN) Mailbox 0 Flag

-#define AT91C_CAN_MB1             (0x1 <<  1) // (CAN) Mailbox 1 Flag

-#define AT91C_CAN_MB2             (0x1 <<  2) // (CAN) Mailbox 2 Flag

-#define AT91C_CAN_MB3             (0x1 <<  3) // (CAN) Mailbox 3 Flag

-#define AT91C_CAN_MB4             (0x1 <<  4) // (CAN) Mailbox 4 Flag

-#define AT91C_CAN_MB5             (0x1 <<  5) // (CAN) Mailbox 5 Flag

-#define AT91C_CAN_MB6             (0x1 <<  6) // (CAN) Mailbox 6 Flag

-#define AT91C_CAN_MB7             (0x1 <<  7) // (CAN) Mailbox 7 Flag

-#define AT91C_CAN_MB8             (0x1 <<  8) // (CAN) Mailbox 8 Flag

-#define AT91C_CAN_MB9             (0x1 <<  9) // (CAN) Mailbox 9 Flag

-#define AT91C_CAN_MB10            (0x1 << 10) // (CAN) Mailbox 10 Flag

-#define AT91C_CAN_MB11            (0x1 << 11) // (CAN) Mailbox 11 Flag

-#define AT91C_CAN_MB12            (0x1 << 12) // (CAN) Mailbox 12 Flag

-#define AT91C_CAN_MB13            (0x1 << 13) // (CAN) Mailbox 13 Flag

-#define AT91C_CAN_MB14            (0x1 << 14) // (CAN) Mailbox 14 Flag

-#define AT91C_CAN_MB15            (0x1 << 15) // (CAN) Mailbox 15 Flag

-#define AT91C_CAN_ERRA            (0x1 << 16) // (CAN) Error Active Mode Flag

-#define AT91C_CAN_WARN            (0x1 << 17) // (CAN) Warning Limit Flag

-#define AT91C_CAN_ERRP            (0x1 << 18) // (CAN) Error Passive Mode Flag

-#define AT91C_CAN_BOFF            (0x1 << 19) // (CAN) Bus Off Mode Flag

-#define AT91C_CAN_SLEEP           (0x1 << 20) // (CAN) Sleep Flag

-#define AT91C_CAN_WAKEUP          (0x1 << 21) // (CAN) Wakeup Flag

-#define AT91C_CAN_TOVF            (0x1 << 22) // (CAN) Timer Overflow Flag

-#define AT91C_CAN_TSTP            (0x1 << 23) // (CAN) Timestamp Flag

-#define AT91C_CAN_CERR            (0x1 << 24) // (CAN) CRC Error

-#define AT91C_CAN_SERR            (0x1 << 25) // (CAN) Stuffing Error

-#define AT91C_CAN_AERR            (0x1 << 26) // (CAN) Acknowledgment Error

-#define AT91C_CAN_FERR            (0x1 << 27) // (CAN) Form Error

-#define AT91C_CAN_BERR            (0x1 << 28) // (CAN) Bit Error

-// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- 

-// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- 

-// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- 

-#define AT91C_CAN_RBSY            (0x1 << 29) // (CAN) Receiver Busy

-#define AT91C_CAN_TBSY            (0x1 << 30) // (CAN) Transmitter Busy

-#define AT91C_CAN_OVLY            (0x1 << 31) // (CAN) Overload Busy

-// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- 

-#define AT91C_CAN_PHASE2          (0x7 <<  0) // (CAN) Phase 2 segment

-#define AT91C_CAN_PHASE1          (0x7 <<  4) // (CAN) Phase 1 segment

-#define AT91C_CAN_PROPAG          (0x7 <<  8) // (CAN) Programmation time segment

-#define AT91C_CAN_SYNC            (0x3 << 12) // (CAN) Re-synchronization jump width segment

-#define AT91C_CAN_BRP             (0x7F << 16) // (CAN) Baudrate Prescaler

-#define AT91C_CAN_SMP             (0x1 << 24) // (CAN) Sampling mode

-// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- 

-#define AT91C_CAN_TIMER           (0xFFFF <<  0) // (CAN) Timer field

-// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- 

-// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- 

-#define AT91C_CAN_REC             (0xFF <<  0) // (CAN) Receive Error Counter

-#define AT91C_CAN_TEC             (0xFF << 16) // (CAN) Transmit Error Counter

-// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- 

-#define AT91C_CAN_TIMRST          (0x1 << 31) // (CAN) Timer Reset Field

-// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Ethernet MAC 10/100

-// *****************************************************************************

-// *** Register offset in AT91S_EMAC structure ***

-#define EMAC_NCR        ( 0) // Network Control Register

-#define EMAC_NCFGR      ( 4) // Network Configuration Register

-#define EMAC_NSR        ( 8) // Network Status Register

-#define EMAC_TSR        (20) // Transmit Status Register

-#define EMAC_RBQP       (24) // Receive Buffer Queue Pointer

-#define EMAC_TBQP       (28) // Transmit Buffer Queue Pointer

-#define EMAC_RSR        (32) // Receive Status Register

-#define EMAC_ISR        (36) // Interrupt Status Register

-#define EMAC_IER        (40) // Interrupt Enable Register

-#define EMAC_IDR        (44) // Interrupt Disable Register

-#define EMAC_IMR        (48) // Interrupt Mask Register

-#define EMAC_MAN        (52) // PHY Maintenance Register

-#define EMAC_PTR        (56) // Pause Time Register

-#define EMAC_PFR        (60) // Pause Frames received Register

-#define EMAC_FTO        (64) // Frames Transmitted OK Register

-#define EMAC_SCF        (68) // Single Collision Frame Register

-#define EMAC_MCF        (72) // Multiple Collision Frame Register

-#define EMAC_FRO        (76) // Frames Received OK Register

-#define EMAC_FCSE       (80) // Frame Check Sequence Error Register

-#define EMAC_ALE        (84) // Alignment Error Register

-#define EMAC_DTF        (88) // Deferred Transmission Frame Register

-#define EMAC_LCOL       (92) // Late Collision Register

-#define EMAC_ECOL       (96) // Excessive Collision Register

-#define EMAC_TUND       (100) // Transmit Underrun Error Register

-#define EMAC_CSE        (104) // Carrier Sense Error Register

-#define EMAC_RRE        (108) // Receive Ressource Error Register

-#define EMAC_ROV        (112) // Receive Overrun Errors Register

-#define EMAC_RSE        (116) // Receive Symbol Errors Register

-#define EMAC_ELE        (120) // Excessive Length Errors Register

-#define EMAC_RJA        (124) // Receive Jabbers Register

-#define EMAC_USF        (128) // Undersize Frames Register

-#define EMAC_STE        (132) // SQE Test Error Register

-#define EMAC_RLE        (136) // Receive Length Field Mismatch Register

-#define EMAC_TPF        (140) // Transmitted Pause Frames Register

-#define EMAC_HRB        (144) // Hash Address Bottom[31:0]

-#define EMAC_HRT        (148) // Hash Address Top[63:32]

-#define EMAC_SA1L       (152) // Specific Address 1 Bottom, First 4 bytes

-#define EMAC_SA1H       (156) // Specific Address 1 Top, Last 2 bytes

-#define EMAC_SA2L       (160) // Specific Address 2 Bottom, First 4 bytes

-#define EMAC_SA2H       (164) // Specific Address 2 Top, Last 2 bytes

-#define EMAC_SA3L       (168) // Specific Address 3 Bottom, First 4 bytes

-#define EMAC_SA3H       (172) // Specific Address 3 Top, Last 2 bytes

-#define EMAC_SA4L       (176) // Specific Address 4 Bottom, First 4 bytes

-#define EMAC_SA4H       (180) // Specific Address 4 Top, Last 2 bytes

-#define EMAC_TID        (184) // Type ID Checking Register

-#define EMAC_TPQ        (188) // Transmit Pause Quantum Register

-#define EMAC_USRIO      (192) // USER Input/Output Register

-#define EMAC_WOL        (196) // Wake On LAN Register

-#define EMAC_REV        (252) // Revision Register

-// -------- EMAC_NCR : (EMAC Offset: 0x0)  -------- 

-#define AT91C_EMAC_LB             (0x1 <<  0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level.

-#define AT91C_EMAC_LLB            (0x1 <<  1) // (EMAC) Loopback local. 

-#define AT91C_EMAC_RE             (0x1 <<  2) // (EMAC) Receive enable. 

-#define AT91C_EMAC_TE             (0x1 <<  3) // (EMAC) Transmit enable. 

-#define AT91C_EMAC_MPE            (0x1 <<  4) // (EMAC) Management port enable. 

-#define AT91C_EMAC_CLRSTAT        (0x1 <<  5) // (EMAC) Clear statistics registers. 

-#define AT91C_EMAC_INCSTAT        (0x1 <<  6) // (EMAC) Increment statistics registers. 

-#define AT91C_EMAC_WESTAT         (0x1 <<  7) // (EMAC) Write enable for statistics registers. 

-#define AT91C_EMAC_BP             (0x1 <<  8) // (EMAC) Back pressure. 

-#define AT91C_EMAC_TSTART         (0x1 <<  9) // (EMAC) Start Transmission. 

-#define AT91C_EMAC_THALT          (0x1 << 10) // (EMAC) Transmission Halt. 

-#define AT91C_EMAC_TPFR           (0x1 << 11) // (EMAC) Transmit pause frame 

-#define AT91C_EMAC_TZQ            (0x1 << 12) // (EMAC) Transmit zero quantum pause frame

-// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- 

-#define AT91C_EMAC_SPD            (0x1 <<  0) // (EMAC) Speed. 

-#define AT91C_EMAC_FD             (0x1 <<  1) // (EMAC) Full duplex. 

-#define AT91C_EMAC_JFRAME         (0x1 <<  3) // (EMAC) Jumbo Frames. 

-#define AT91C_EMAC_CAF            (0x1 <<  4) // (EMAC) Copy all frames. 

-#define AT91C_EMAC_NBC            (0x1 <<  5) // (EMAC) No broadcast. 

-#define AT91C_EMAC_MTI            (0x1 <<  6) // (EMAC) Multicast hash event enable

-#define AT91C_EMAC_UNI            (0x1 <<  7) // (EMAC) Unicast hash enable. 

-#define AT91C_EMAC_BIG            (0x1 <<  8) // (EMAC) Receive 1522 bytes. 

-#define AT91C_EMAC_EAE            (0x1 <<  9) // (EMAC) External address match enable. 

-#define AT91C_EMAC_CLK            (0x3 << 10) // (EMAC) 

-#define 	AT91C_EMAC_CLK_HCLK_8               (0x0 << 10) // (EMAC) HCLK divided by 8

-#define 	AT91C_EMAC_CLK_HCLK_16              (0x1 << 10) // (EMAC) HCLK divided by 16

-#define 	AT91C_EMAC_CLK_HCLK_32              (0x2 << 10) // (EMAC) HCLK divided by 32

-#define 	AT91C_EMAC_CLK_HCLK_64              (0x3 << 10) // (EMAC) HCLK divided by 64

-#define AT91C_EMAC_RTY            (0x1 << 12) // (EMAC) 

-#define AT91C_EMAC_PAE            (0x1 << 13) // (EMAC) 

-#define AT91C_EMAC_RBOF           (0x3 << 14) // (EMAC) 

-#define 	AT91C_EMAC_RBOF_OFFSET_0             (0x0 << 14) // (EMAC) no offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_1             (0x1 << 14) // (EMAC) one byte offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_2             (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer

-#define 	AT91C_EMAC_RBOF_OFFSET_3             (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer

-#define AT91C_EMAC_RLCE           (0x1 << 16) // (EMAC) Receive Length field Checking Enable

-#define AT91C_EMAC_DRFCS          (0x1 << 17) // (EMAC) Discard Receive FCS

-#define AT91C_EMAC_EFRHD          (0x1 << 18) // (EMAC) 

-#define AT91C_EMAC_IRXFCS         (0x1 << 19) // (EMAC) Ignore RX FCS

-// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- 

-#define AT91C_EMAC_LINKR          (0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_MDIO           (0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_IDLE           (0x1 <<  2) // (EMAC) 

-// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- 

-#define AT91C_EMAC_UBR            (0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_COL            (0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_RLES           (0x1 <<  2) // (EMAC) 

-#define AT91C_EMAC_TGO            (0x1 <<  3) // (EMAC) Transmit Go

-#define AT91C_EMAC_BEX            (0x1 <<  4) // (EMAC) Buffers exhausted mid frame

-#define AT91C_EMAC_COMP           (0x1 <<  5) // (EMAC) 

-#define AT91C_EMAC_UND            (0x1 <<  6) // (EMAC) 

-// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- 

-#define AT91C_EMAC_BNA            (0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_REC            (0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_OVR            (0x1 <<  2) // (EMAC) 

-// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- 

-#define AT91C_EMAC_MFD            (0x1 <<  0) // (EMAC) 

-#define AT91C_EMAC_RCOMP          (0x1 <<  1) // (EMAC) 

-#define AT91C_EMAC_RXUBR          (0x1 <<  2) // (EMAC) 

-#define AT91C_EMAC_TXUBR          (0x1 <<  3) // (EMAC) 

-#define AT91C_EMAC_TUNDR          (0x1 <<  4) // (EMAC) 

-#define AT91C_EMAC_RLEX           (0x1 <<  5) // (EMAC) 

-#define AT91C_EMAC_TXERR          (0x1 <<  6) // (EMAC) 

-#define AT91C_EMAC_TCOMP          (0x1 <<  7) // (EMAC) 

-#define AT91C_EMAC_LINK           (0x1 <<  9) // (EMAC) 

-#define AT91C_EMAC_ROVR           (0x1 << 10) // (EMAC) 

-#define AT91C_EMAC_HRESP          (0x1 << 11) // (EMAC) 

-#define AT91C_EMAC_PFRE           (0x1 << 12) // (EMAC) 

-#define AT91C_EMAC_PTZ            (0x1 << 13) // (EMAC) 

-// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- 

-// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- 

-// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- 

-// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- 

-#define AT91C_EMAC_DATA           (0xFFFF <<  0) // (EMAC) 

-#define AT91C_EMAC_CODE           (0x3 << 16) // (EMAC) 

-#define AT91C_EMAC_REGA           (0x1F << 18) // (EMAC) 

-#define AT91C_EMAC_PHYA           (0x1F << 23) // (EMAC) 

-#define AT91C_EMAC_RW             (0x3 << 28) // (EMAC) 

-#define AT91C_EMAC_SOF            (0x3 << 30) // (EMAC) 

-// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- 

-#define AT91C_EMAC_RMII           (0x1 <<  0) // (EMAC) Reduce MII

-// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- 

-#define AT91C_EMAC_IP             (0xFFFF <<  0) // (EMAC) ARP request IP address

-#define AT91C_EMAC_MAG            (0x1 << 16) // (EMAC) Magic packet event enable

-#define AT91C_EMAC_ARP            (0x1 << 17) // (EMAC) ARP request event enable

-#define AT91C_EMAC_SA1            (0x1 << 18) // (EMAC) Specific address register 1 event enable

-// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- 

-#define AT91C_EMAC_REVREF         (0xFFFF <<  0) // (EMAC) 

-#define AT91C_EMAC_PARTREF        (0xFFFF << 16) // (EMAC) 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor

-// *****************************************************************************

-// *** Register offset in AT91S_ADC structure ***

-#define ADC_CR          ( 0) // ADC Control Register

-#define ADC_MR          ( 4) // ADC Mode Register

-#define ADC_CHER        (16) // ADC Channel Enable Register

-#define ADC_CHDR        (20) // ADC Channel Disable Register

-#define ADC_CHSR        (24) // ADC Channel Status Register

-#define ADC_SR          (28) // ADC Status Register

-#define ADC_LCDR        (32) // ADC Last Converted Data Register

-#define ADC_IER         (36) // ADC Interrupt Enable Register

-#define ADC_IDR         (40) // ADC Interrupt Disable Register

-#define ADC_IMR         (44) // ADC Interrupt Mask Register

-#define ADC_CDR0        (48) // ADC Channel Data Register 0

-#define ADC_CDR1        (52) // ADC Channel Data Register 1

-#define ADC_CDR2        (56) // ADC Channel Data Register 2

-#define ADC_CDR3        (60) // ADC Channel Data Register 3

-#define ADC_CDR4        (64) // ADC Channel Data Register 4

-#define ADC_CDR5        (68) // ADC Channel Data Register 5

-#define ADC_CDR6        (72) // ADC Channel Data Register 6

-#define ADC_CDR7        (76) // ADC Channel Data Register 7

-#define ADC_RPR         (256) // Receive Pointer Register

-#define ADC_RCR         (260) // Receive Counter Register

-#define ADC_TPR         (264) // Transmit Pointer Register

-#define ADC_TCR         (268) // Transmit Counter Register

-#define ADC_RNPR        (272) // Receive Next Pointer Register

-#define ADC_RNCR        (276) // Receive Next Counter Register

-#define ADC_TNPR        (280) // Transmit Next Pointer Register

-#define ADC_TNCR        (284) // Transmit Next Counter Register

-#define ADC_PTCR        (288) // PDC Transfer Control Register

-#define ADC_PTSR        (292) // PDC Transfer Status Register

-// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- 

-#define AT91C_ADC_SWRST           (0x1 <<  0) // (ADC) Software Reset

-#define AT91C_ADC_START           (0x1 <<  1) // (ADC) Start Conversion

-// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- 

-#define AT91C_ADC_TRGEN           (0x1 <<  0) // (ADC) Trigger Enable

-#define 	AT91C_ADC_TRGEN_DIS                  (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software

-#define 	AT91C_ADC_TRGEN_EN                   (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.

-#define AT91C_ADC_TRGSEL          (0x7 <<  1) // (ADC) Trigger Selection

-#define 	AT91C_ADC_TRGSEL_TIOA0                (0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0

-#define 	AT91C_ADC_TRGSEL_TIOA1                (0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1

-#define 	AT91C_ADC_TRGSEL_TIOA2                (0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2

-#define 	AT91C_ADC_TRGSEL_TIOA3                (0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3

-#define 	AT91C_ADC_TRGSEL_TIOA4                (0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4

-#define 	AT91C_ADC_TRGSEL_TIOA5                (0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5

-#define 	AT91C_ADC_TRGSEL_EXT                  (0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger

-#define AT91C_ADC_LOWRES          (0x1 <<  4) // (ADC) Resolution.

-#define 	AT91C_ADC_LOWRES_10_BIT               (0x0 <<  4) // (ADC) 10-bit resolution

-#define 	AT91C_ADC_LOWRES_8_BIT                (0x1 <<  4) // (ADC) 8-bit resolution

-#define AT91C_ADC_SLEEP           (0x1 <<  5) // (ADC) Sleep Mode

-#define 	AT91C_ADC_SLEEP_NORMAL_MODE          (0x0 <<  5) // (ADC) Normal Mode

-#define 	AT91C_ADC_SLEEP_MODE                 (0x1 <<  5) // (ADC) Sleep Mode

-#define AT91C_ADC_PRESCAL         (0x3F <<  8) // (ADC) Prescaler rate selection

-#define AT91C_ADC_STARTUP         (0x1F << 16) // (ADC) Startup Time

-#define AT91C_ADC_SHTIM           (0xF << 24) // (ADC) Sample & Hold Time

-// -------- 	ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- 

-#define AT91C_ADC_CH0             (0x1 <<  0) // (ADC) Channel 0

-#define AT91C_ADC_CH1             (0x1 <<  1) // (ADC) Channel 1

-#define AT91C_ADC_CH2             (0x1 <<  2) // (ADC) Channel 2

-#define AT91C_ADC_CH3             (0x1 <<  3) // (ADC) Channel 3

-#define AT91C_ADC_CH4             (0x1 <<  4) // (ADC) Channel 4

-#define AT91C_ADC_CH5             (0x1 <<  5) // (ADC) Channel 5

-#define AT91C_ADC_CH6             (0x1 <<  6) // (ADC) Channel 6

-#define AT91C_ADC_CH7             (0x1 <<  7) // (ADC) Channel 7

-// -------- 	ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- 

-// -------- 	ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- 

-// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- 

-#define AT91C_ADC_EOC0            (0x1 <<  0) // (ADC) End of Conversion

-#define AT91C_ADC_EOC1            (0x1 <<  1) // (ADC) End of Conversion

-#define AT91C_ADC_EOC2            (0x1 <<  2) // (ADC) End of Conversion

-#define AT91C_ADC_EOC3            (0x1 <<  3) // (ADC) End of Conversion

-#define AT91C_ADC_EOC4            (0x1 <<  4) // (ADC) End of Conversion

-#define AT91C_ADC_EOC5            (0x1 <<  5) // (ADC) End of Conversion

-#define AT91C_ADC_EOC6            (0x1 <<  6) // (ADC) End of Conversion

-#define AT91C_ADC_EOC7            (0x1 <<  7) // (ADC) End of Conversion

-#define AT91C_ADC_OVRE0           (0x1 <<  8) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE1           (0x1 <<  9) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE2           (0x1 << 10) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE3           (0x1 << 11) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE4           (0x1 << 12) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE5           (0x1 << 13) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE6           (0x1 << 14) // (ADC) Overrun Error

-#define AT91C_ADC_OVRE7           (0x1 << 15) // (ADC) Overrun Error

-#define AT91C_ADC_DRDY            (0x1 << 16) // (ADC) Data Ready

-#define AT91C_ADC_GOVRE           (0x1 << 17) // (ADC) General Overrun

-#define AT91C_ADC_ENDRX           (0x1 << 18) // (ADC) End of Receiver Transfer

-#define AT91C_ADC_RXBUFF          (0x1 << 19) // (ADC) RXBUFF Interrupt

-// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- 

-#define AT91C_ADC_LDATA           (0x3FF <<  0) // (ADC) Last Data Converted

-// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- 

-// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- 

-// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- 

-// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- 

-#define AT91C_ADC_DATA            (0x3FF <<  0) // (ADC) Converted Data

-// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- 

-// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- 

-// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- 

-// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- 

-// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- 

-// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- 

-// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- 

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Advanced  Encryption Standard

-// *****************************************************************************

-// *** Register offset in AT91S_AES structure ***

-#define AES_CR          ( 0) // Control Register

-#define AES_MR          ( 4) // Mode Register

-#define AES_IER         (16) // Interrupt Enable Register

-#define AES_IDR         (20) // Interrupt Disable Register

-#define AES_IMR         (24) // Interrupt Mask Register

-#define AES_ISR         (28) // Interrupt Status Register

-#define AES_KEYWxR      (32) // Key Word x Register

-#define AES_IDATAxR     (64) // Input Data x Register

-#define AES_ODATAxR     (80) // Output Data x Register

-#define AES_IVxR        (96) // Initialization Vector x Register

-#define AES_VR          (252) // AES Version Register

-#define AES_RPR         (256) // Receive Pointer Register

-#define AES_RCR         (260) // Receive Counter Register

-#define AES_TPR         (264) // Transmit Pointer Register

-#define AES_TCR         (268) // Transmit Counter Register

-#define AES_RNPR        (272) // Receive Next Pointer Register

-#define AES_RNCR        (276) // Receive Next Counter Register

-#define AES_TNPR        (280) // Transmit Next Pointer Register

-#define AES_TNCR        (284) // Transmit Next Counter Register

-#define AES_PTCR        (288) // PDC Transfer Control Register

-#define AES_PTSR        (292) // PDC Transfer Status Register

-// -------- AES_CR : (AES Offset: 0x0) Control Register -------- 

-#define AT91C_AES_START           (0x1 <<  0) // (AES) Starts Processing

-#define AT91C_AES_SWRST           (0x1 <<  8) // (AES) Software Reset

-#define AT91C_AES_LOADSEED        (0x1 << 16) // (AES) Random Number Generator Seed Loading

-// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- 

-#define AT91C_AES_CIPHER          (0x1 <<  0) // (AES) Processing Mode

-#define AT91C_AES_PROCDLY         (0xF <<  4) // (AES) Processing Delay

-#define AT91C_AES_SMOD            (0x3 <<  8) // (AES) Start Mode

-#define 	AT91C_AES_SMOD_MANUAL               (0x0 <<  8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption.

-#define 	AT91C_AES_SMOD_AUTO                 (0x1 <<  8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet).

-#define 	AT91C_AES_SMOD_PDC                  (0x2 <<  8) // (AES) PDC Mode (cf datasheet).

-#define AT91C_AES_OPMOD           (0x7 << 12) // (AES) Operation Mode

-#define 	AT91C_AES_OPMOD_ECB                  (0x0 << 12) // (AES) ECB Electronic CodeBook mode.

-#define 	AT91C_AES_OPMOD_CBC                  (0x1 << 12) // (AES) CBC Cipher Block Chaining mode.

-#define 	AT91C_AES_OPMOD_OFB                  (0x2 << 12) // (AES) OFB Output Feedback mode.

-#define 	AT91C_AES_OPMOD_CFB                  (0x3 << 12) // (AES) CFB Cipher Feedback mode.

-#define 	AT91C_AES_OPMOD_CTR                  (0x4 << 12) // (AES) CTR Counter mode.

-#define AT91C_AES_LOD             (0x1 << 15) // (AES) Last Output Data Mode

-#define AT91C_AES_CFBS            (0x7 << 16) // (AES) Cipher Feedback Data Size

-#define 	AT91C_AES_CFBS_128_BIT              (0x0 << 16) // (AES) 128-bit.

-#define 	AT91C_AES_CFBS_64_BIT               (0x1 << 16) // (AES) 64-bit.

-#define 	AT91C_AES_CFBS_32_BIT               (0x2 << 16) // (AES) 32-bit.

-#define 	AT91C_AES_CFBS_16_BIT               (0x3 << 16) // (AES) 16-bit.

-#define 	AT91C_AES_CFBS_8_BIT                (0x4 << 16) // (AES) 8-bit.

-#define AT91C_AES_CKEY            (0xF << 20) // (AES) Countermeasure Key

-#define AT91C_AES_CTYPE           (0x1F << 24) // (AES) Countermeasure Type

-#define 	AT91C_AES_CTYPE_TYPE1_EN             (0x1 << 24) // (AES) Countermeasure type 1 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE2_EN             (0x2 << 24) // (AES) Countermeasure type 2 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE3_EN             (0x4 << 24) // (AES) Countermeasure type 3 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE4_EN             (0x8 << 24) // (AES) Countermeasure type 4 is enabled.

-#define 	AT91C_AES_CTYPE_TYPE5_EN             (0x10 << 24) // (AES) Countermeasure type 5 is enabled.

-// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- 

-#define AT91C_AES_DATRDY          (0x1 <<  0) // (AES) DATRDY

-#define AT91C_AES_ENDRX           (0x1 <<  1) // (AES) PDC Read Buffer End

-#define AT91C_AES_ENDTX           (0x1 <<  2) // (AES) PDC Write Buffer End

-#define AT91C_AES_RXBUFF          (0x1 <<  3) // (AES) PDC Read Buffer Full

-#define AT91C_AES_TXBUFE          (0x1 <<  4) // (AES) PDC Write Buffer Empty

-#define AT91C_AES_URAD            (0x1 <<  8) // (AES) Unspecified Register Access Detection

-// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- 

-// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- 

-// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- 

-#define AT91C_AES_URAT            (0x7 << 12) // (AES) Unspecified Register Access Type Status

-#define 	AT91C_AES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (AES) Input data register written during the data processing in PDC mode.

-#define 	AT91C_AES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (AES) Output data register read during the data processing.

-#define 	AT91C_AES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (AES) Mode register written during the data processing.

-#define 	AT91C_AES_URAT_OUT_DAT_READ_SUBKEY  (0x3 << 12) // (AES) Output data register read during the sub-keys generation.

-#define 	AT91C_AES_URAT_MODEREG_WRITE_SUBKEY (0x4 << 12) // (AES) Mode register written during the sub-keys generation.

-#define 	AT91C_AES_URAT_WO_REG_READ          (0x5 << 12) // (AES) Write-only register read access.

-

-// *****************************************************************************

-//              SOFTWARE API DEFINITION  FOR Triple Data Encryption Standard

-// *****************************************************************************

-// *** Register offset in AT91S_TDES structure ***

-#define TDES_CR         ( 0) // Control Register

-#define TDES_MR         ( 4) // Mode Register

-#define TDES_IER        (16) // Interrupt Enable Register

-#define TDES_IDR        (20) // Interrupt Disable Register

-#define TDES_IMR        (24) // Interrupt Mask Register

-#define TDES_ISR        (28) // Interrupt Status Register

-#define TDES_KEY1WxR    (32) // Key 1 Word x Register

-#define TDES_KEY2WxR    (40) // Key 2 Word x Register

-#define TDES_KEY3WxR    (48) // Key 3 Word x Register

-#define TDES_IDATAxR    (64) // Input Data x Register

-#define TDES_ODATAxR    (80) // Output Data x Register

-#define TDES_IVxR       (96) // Initialization Vector x Register

-#define TDES_VR         (252) // TDES Version Register

-#define TDES_RPR        (256) // Receive Pointer Register

-#define TDES_RCR        (260) // Receive Counter Register

-#define TDES_TPR        (264) // Transmit Pointer Register

-#define TDES_TCR        (268) // Transmit Counter Register

-#define TDES_RNPR       (272) // Receive Next Pointer Register

-#define TDES_RNCR       (276) // Receive Next Counter Register

-#define TDES_TNPR       (280) // Transmit Next Pointer Register

-#define TDES_TNCR       (284) // Transmit Next Counter Register

-#define TDES_PTCR       (288) // PDC Transfer Control Register

-#define TDES_PTSR       (292) // PDC Transfer Status Register

-// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- 

-#define AT91C_TDES_START          (0x1 <<  0) // (TDES) Starts Processing

-#define AT91C_TDES_SWRST          (0x1 <<  8) // (TDES) Software Reset

-// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- 

-#define AT91C_TDES_CIPHER         (0x1 <<  0) // (TDES) Processing Mode

-#define AT91C_TDES_TDESMOD        (0x1 <<  1) // (TDES) Single or Triple DES Mode

-#define AT91C_TDES_KEYMOD         (0x1 <<  4) // (TDES) Key Mode

-#define AT91C_TDES_SMOD           (0x3 <<  8) // (TDES) Start Mode

-#define 	AT91C_TDES_SMOD_MANUAL               (0x0 <<  8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption.

-#define 	AT91C_TDES_SMOD_AUTO                 (0x1 <<  8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet).

-#define 	AT91C_TDES_SMOD_PDC                  (0x2 <<  8) // (TDES) PDC Mode (cf datasheet).

-#define AT91C_TDES_OPMOD          (0x3 << 12) // (TDES) Operation Mode

-#define 	AT91C_TDES_OPMOD_ECB                  (0x0 << 12) // (TDES) ECB Electronic CodeBook mode.

-#define 	AT91C_TDES_OPMOD_CBC                  (0x1 << 12) // (TDES) CBC Cipher Block Chaining mode.

-#define 	AT91C_TDES_OPMOD_OFB                  (0x2 << 12) // (TDES) OFB Output Feedback mode.

-#define 	AT91C_TDES_OPMOD_CFB                  (0x3 << 12) // (TDES) CFB Cipher Feedback mode.

-#define AT91C_TDES_LOD            (0x1 << 15) // (TDES) Last Output Data Mode

-#define AT91C_TDES_CFBS           (0x3 << 16) // (TDES) Cipher Feedback Data Size

-#define 	AT91C_TDES_CFBS_64_BIT               (0x0 << 16) // (TDES) 64-bit.

-#define 	AT91C_TDES_CFBS_32_BIT               (0x1 << 16) // (TDES) 32-bit.

-#define 	AT91C_TDES_CFBS_16_BIT               (0x2 << 16) // (TDES) 16-bit.

-#define 	AT91C_TDES_CFBS_8_BIT                (0x3 << 16) // (TDES) 8-bit.

-// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- 

-#define AT91C_TDES_DATRDY         (0x1 <<  0) // (TDES) DATRDY

-#define AT91C_TDES_ENDRX          (0x1 <<  1) // (TDES) PDC Read Buffer End

-#define AT91C_TDES_ENDTX          (0x1 <<  2) // (TDES) PDC Write Buffer End

-#define AT91C_TDES_RXBUFF         (0x1 <<  3) // (TDES) PDC Read Buffer Full

-#define AT91C_TDES_TXBUFE         (0x1 <<  4) // (TDES) PDC Write Buffer Empty

-#define AT91C_TDES_URAD           (0x1 <<  8) // (TDES) Unspecified Register Access Detection

-// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- 

-// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- 

-// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- 

-#define AT91C_TDES_URAT           (0x3 << 12) // (TDES) Unspecified Register Access Type Status

-#define 	AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode.

-#define 	AT91C_TDES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (TDES) Output data register read during the data processing.

-#define 	AT91C_TDES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (TDES) Mode register written during the data processing.

-#define 	AT91C_TDES_URAT_WO_REG_READ          (0x3 << 12) // (TDES) Write-only register read access.

-

-// *****************************************************************************

-//               REGISTER ADDRESS DEFINITION FOR AT91SAM7X256

-// *****************************************************************************

-// ========== Register definition for SYS peripheral ========== 

-// ========== Register definition for AIC peripheral ========== 

-#define AT91C_AIC_IVR             (0xFFFFF100) // (AIC) IRQ Vector Register

-#define AT91C_AIC_SMR             (0xFFFFF000) // (AIC) Source Mode Register

-#define AT91C_AIC_FVR             (0xFFFFF104) // (AIC) FIQ Vector Register

-#define AT91C_AIC_DCR             (0xFFFFF138) // (AIC) Debug Control Register (Protect)

-#define AT91C_AIC_EOICR           (0xFFFFF130) // (AIC) End of Interrupt Command Register

-#define AT91C_AIC_SVR             (0xFFFFF080) // (AIC) Source Vector Register

-#define AT91C_AIC_FFSR            (0xFFFFF148) // (AIC) Fast Forcing Status Register

-#define AT91C_AIC_ICCR            (0xFFFFF128) // (AIC) Interrupt Clear Command Register

-#define AT91C_AIC_ISR             (0xFFFFF108) // (AIC) Interrupt Status Register

-#define AT91C_AIC_IMR             (0xFFFFF110) // (AIC) Interrupt Mask Register

-#define AT91C_AIC_IPR             (0xFFFFF10C) // (AIC) Interrupt Pending Register

-#define AT91C_AIC_FFER            (0xFFFFF140) // (AIC) Fast Forcing Enable Register

-#define AT91C_AIC_IECR            (0xFFFFF120) // (AIC) Interrupt Enable Command Register

-#define AT91C_AIC_ISCR            (0xFFFFF12C) // (AIC) Interrupt Set Command Register

-#define AT91C_AIC_FFDR            (0xFFFFF144) // (AIC) Fast Forcing Disable Register

-#define AT91C_AIC_CISR            (0xFFFFF114) // (AIC) Core Interrupt Status Register

-#define AT91C_AIC_IDCR            (0xFFFFF124) // (AIC) Interrupt Disable Command Register

-#define AT91C_AIC_SPU             (0xFFFFF134) // (AIC) Spurious Vector Register

-// ========== Register definition for PDC_DBGU peripheral ========== 

-#define AT91C_DBGU_TCR            (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register

-#define AT91C_DBGU_RNPR           (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register

-#define AT91C_DBGU_TNPR           (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register

-#define AT91C_DBGU_TPR            (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register

-#define AT91C_DBGU_RPR            (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register

-#define AT91C_DBGU_RCR            (0xFFFFF304) // (PDC_DBGU) Receive Counter Register

-#define AT91C_DBGU_RNCR           (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register

-#define AT91C_DBGU_PTCR           (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register

-#define AT91C_DBGU_PTSR           (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register

-#define AT91C_DBGU_TNCR           (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register

-// ========== Register definition for DBGU peripheral ========== 

-#define AT91C_DBGU_EXID           (0xFFFFF244) // (DBGU) Chip ID Extension Register

-#define AT91C_DBGU_BRGR           (0xFFFFF220) // (DBGU) Baud Rate Generator Register

-#define AT91C_DBGU_IDR            (0xFFFFF20C) // (DBGU) Interrupt Disable Register

-#define AT91C_DBGU_CSR            (0xFFFFF214) // (DBGU) Channel Status Register

-#define AT91C_DBGU_CIDR           (0xFFFFF240) // (DBGU) Chip ID Register

-#define AT91C_DBGU_MR             (0xFFFFF204) // (DBGU) Mode Register

-#define AT91C_DBGU_IMR            (0xFFFFF210) // (DBGU) Interrupt Mask Register

-#define AT91C_DBGU_CR             (0xFFFFF200) // (DBGU) Control Register

-#define AT91C_DBGU_FNTR           (0xFFFFF248) // (DBGU) Force NTRST Register

-#define AT91C_DBGU_THR            (0xFFFFF21C) // (DBGU) Transmitter Holding Register

-#define AT91C_DBGU_RHR            (0xFFFFF218) // (DBGU) Receiver Holding Register

-#define AT91C_DBGU_IER            (0xFFFFF208) // (DBGU) Interrupt Enable Register

-// ========== Register definition for PIOA peripheral ========== 

-#define AT91C_PIOA_ODR            (0xFFFFF414) // (PIOA) Output Disable Registerr

-#define AT91C_PIOA_SODR           (0xFFFFF430) // (PIOA) Set Output Data Register

-#define AT91C_PIOA_ISR            (0xFFFFF44C) // (PIOA) Interrupt Status Register

-#define AT91C_PIOA_ABSR           (0xFFFFF478) // (PIOA) AB Select Status Register

-#define AT91C_PIOA_IER            (0xFFFFF440) // (PIOA) Interrupt Enable Register

-#define AT91C_PIOA_PPUDR          (0xFFFFF460) // (PIOA) Pull-up Disable Register

-#define AT91C_PIOA_IMR            (0xFFFFF448) // (PIOA) Interrupt Mask Register

-#define AT91C_PIOA_PER            (0xFFFFF400) // (PIOA) PIO Enable Register

-#define AT91C_PIOA_IFDR           (0xFFFFF424) // (PIOA) Input Filter Disable Register

-#define AT91C_PIOA_OWDR           (0xFFFFF4A4) // (PIOA) Output Write Disable Register

-#define AT91C_PIOA_MDSR           (0xFFFFF458) // (PIOA) Multi-driver Status Register

-#define AT91C_PIOA_IDR            (0xFFFFF444) // (PIOA) Interrupt Disable Register

-#define AT91C_PIOA_ODSR           (0xFFFFF438) // (PIOA) Output Data Status Register

-#define AT91C_PIOA_PPUSR          (0xFFFFF468) // (PIOA) Pull-up Status Register

-#define AT91C_PIOA_OWSR           (0xFFFFF4A8) // (PIOA) Output Write Status Register

-#define AT91C_PIOA_BSR            (0xFFFFF474) // (PIOA) Select B Register

-#define AT91C_PIOA_OWER           (0xFFFFF4A0) // (PIOA) Output Write Enable Register

-#define AT91C_PIOA_IFER           (0xFFFFF420) // (PIOA) Input Filter Enable Register

-#define AT91C_PIOA_PDSR           (0xFFFFF43C) // (PIOA) Pin Data Status Register

-#define AT91C_PIOA_PPUER          (0xFFFFF464) // (PIOA) Pull-up Enable Register

-#define AT91C_PIOA_OSR            (0xFFFFF418) // (PIOA) Output Status Register

-#define AT91C_PIOA_ASR            (0xFFFFF470) // (PIOA) Select A Register

-#define AT91C_PIOA_MDDR           (0xFFFFF454) // (PIOA) Multi-driver Disable Register

-#define AT91C_PIOA_CODR           (0xFFFFF434) // (PIOA) Clear Output Data Register

-#define AT91C_PIOA_MDER           (0xFFFFF450) // (PIOA) Multi-driver Enable Register

-#define AT91C_PIOA_PDR            (0xFFFFF404) // (PIOA) PIO Disable Register

-#define AT91C_PIOA_IFSR           (0xFFFFF428) // (PIOA) Input Filter Status Register

-#define AT91C_PIOA_OER            (0xFFFFF410) // (PIOA) Output Enable Register

-#define AT91C_PIOA_PSR            (0xFFFFF408) // (PIOA) PIO Status Register

-// ========== Register definition for PIOB peripheral ========== 

-#define AT91C_PIOB_OWDR           (0xFFFFF6A4) // (PIOB) Output Write Disable Register

-#define AT91C_PIOB_MDER           (0xFFFFF650) // (PIOB) Multi-driver Enable Register

-#define AT91C_PIOB_PPUSR          (0xFFFFF668) // (PIOB) Pull-up Status Register

-#define AT91C_PIOB_IMR            (0xFFFFF648) // (PIOB) Interrupt Mask Register

-#define AT91C_PIOB_ASR            (0xFFFFF670) // (PIOB) Select A Register

-#define AT91C_PIOB_PPUDR          (0xFFFFF660) // (PIOB) Pull-up Disable Register

-#define AT91C_PIOB_PSR            (0xFFFFF608) // (PIOB) PIO Status Register

-#define AT91C_PIOB_IER            (0xFFFFF640) // (PIOB) Interrupt Enable Register

-#define AT91C_PIOB_CODR           (0xFFFFF634) // (PIOB) Clear Output Data Register

-#define AT91C_PIOB_OWER           (0xFFFFF6A0) // (PIOB) Output Write Enable Register

-#define AT91C_PIOB_ABSR           (0xFFFFF678) // (PIOB) AB Select Status Register

-#define AT91C_PIOB_IFDR           (0xFFFFF624) // (PIOB) Input Filter Disable Register

-#define AT91C_PIOB_PDSR           (0xFFFFF63C) // (PIOB) Pin Data Status Register

-#define AT91C_PIOB_IDR            (0xFFFFF644) // (PIOB) Interrupt Disable Register

-#define AT91C_PIOB_OWSR           (0xFFFFF6A8) // (PIOB) Output Write Status Register

-#define AT91C_PIOB_PDR            (0xFFFFF604) // (PIOB) PIO Disable Register

-#define AT91C_PIOB_ODR            (0xFFFFF614) // (PIOB) Output Disable Registerr

-#define AT91C_PIOB_IFSR           (0xFFFFF628) // (PIOB) Input Filter Status Register

-#define AT91C_PIOB_PPUER          (0xFFFFF664) // (PIOB) Pull-up Enable Register

-#define AT91C_PIOB_SODR           (0xFFFFF630) // (PIOB) Set Output Data Register

-#define AT91C_PIOB_ISR            (0xFFFFF64C) // (PIOB) Interrupt Status Register

-#define AT91C_PIOB_ODSR           (0xFFFFF638) // (PIOB) Output Data Status Register

-#define AT91C_PIOB_OSR            (0xFFFFF618) // (PIOB) Output Status Register

-#define AT91C_PIOB_MDSR           (0xFFFFF658) // (PIOB) Multi-driver Status Register

-#define AT91C_PIOB_IFER           (0xFFFFF620) // (PIOB) Input Filter Enable Register

-#define AT91C_PIOB_BSR            (0xFFFFF674) // (PIOB) Select B Register

-#define AT91C_PIOB_MDDR           (0xFFFFF654) // (PIOB) Multi-driver Disable Register

-#define AT91C_PIOB_OER            (0xFFFFF610) // (PIOB) Output Enable Register

-#define AT91C_PIOB_PER            (0xFFFFF600) // (PIOB) PIO Enable Register

-// ========== Register definition for CKGR peripheral ========== 

-#define AT91C_CKGR_MOR            (0xFFFFFC20) // (CKGR) Main Oscillator Register

-#define AT91C_CKGR_PLLR           (0xFFFFFC2C) // (CKGR) PLL Register

-#define AT91C_CKGR_MCFR           (0xFFFFFC24) // (CKGR) Main Clock  Frequency Register

-// ========== Register definition for PMC peripheral ========== 

-#define AT91C_PMC_IDR             (0xFFFFFC64) // (PMC) Interrupt Disable Register

-#define AT91C_PMC_MOR             (0xFFFFFC20) // (PMC) Main Oscillator Register

-#define AT91C_PMC_PLLR            (0xFFFFFC2C) // (PMC) PLL Register

-#define AT91C_PMC_PCER            (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register

-#define AT91C_PMC_PCKR            (0xFFFFFC40) // (PMC) Programmable Clock Register

-#define AT91C_PMC_MCKR            (0xFFFFFC30) // (PMC) Master Clock Register

-#define AT91C_PMC_SCDR            (0xFFFFFC04) // (PMC) System Clock Disable Register

-#define AT91C_PMC_PCDR            (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register

-#define AT91C_PMC_SCSR            (0xFFFFFC08) // (PMC) System Clock Status Register

-#define AT91C_PMC_PCSR            (0xFFFFFC18) // (PMC) Peripheral Clock Status Register

-#define AT91C_PMC_MCFR            (0xFFFFFC24) // (PMC) Main Clock  Frequency Register

-#define AT91C_PMC_SCER            (0xFFFFFC00) // (PMC) System Clock Enable Register

-#define AT91C_PMC_IMR             (0xFFFFFC6C) // (PMC) Interrupt Mask Register

-#define AT91C_PMC_IER             (0xFFFFFC60) // (PMC) Interrupt Enable Register

-#define AT91C_PMC_SR              (0xFFFFFC68) // (PMC) Status Register

-// ========== Register definition for RSTC peripheral ========== 

-#define AT91C_RSTC_RCR            (0xFFFFFD00) // (RSTC) Reset Control Register

-#define AT91C_RSTC_RMR            (0xFFFFFD08) // (RSTC) Reset Mode Register

-#define AT91C_RSTC_RSR            (0xFFFFFD04) // (RSTC) Reset Status Register

-// ========== Register definition for RTTC peripheral ========== 

-#define AT91C_RTTC_RTSR           (0xFFFFFD2C) // (RTTC) Real-time Status Register

-#define AT91C_RTTC_RTMR           (0xFFFFFD20) // (RTTC) Real-time Mode Register

-#define AT91C_RTTC_RTVR           (0xFFFFFD28) // (RTTC) Real-time Value Register

-#define AT91C_RTTC_RTAR           (0xFFFFFD24) // (RTTC) Real-time Alarm Register

-// ========== Register definition for PITC peripheral ========== 

-#define AT91C_PITC_PIVR           (0xFFFFFD38) // (PITC) Period Interval Value Register

-#define AT91C_PITC_PISR           (0xFFFFFD34) // (PITC) Period Interval Status Register

-#define AT91C_PITC_PIIR           (0xFFFFFD3C) // (PITC) Period Interval Image Register

-#define AT91C_PITC_PIMR           (0xFFFFFD30) // (PITC) Period Interval Mode Register

-// ========== Register definition for WDTC peripheral ========== 

-#define AT91C_WDTC_WDCR           (0xFFFFFD40) // (WDTC) Watchdog Control Register

-#define AT91C_WDTC_WDSR           (0xFFFFFD48) // (WDTC) Watchdog Status Register

-#define AT91C_WDTC_WDMR           (0xFFFFFD44) // (WDTC) Watchdog Mode Register

-// ========== Register definition for VREG peripheral ========== 

-#define AT91C_VREG_MR             (0xFFFFFD60) // (VREG) Voltage Regulator Mode Register

-// ========== Register definition for MC peripheral ========== 

-#define AT91C_MC_ASR              (0xFFFFFF04) // (MC) MC Abort Status Register

-#define AT91C_MC_RCR              (0xFFFFFF00) // (MC) MC Remap Control Register

-#define AT91C_MC_FCR              (0xFFFFFF64) // (MC) MC Flash Command Register

-#define AT91C_MC_AASR             (0xFFFFFF08) // (MC) MC Abort Address Status Register

-#define AT91C_MC_FSR              (0xFFFFFF68) // (MC) MC Flash Status Register

-#define AT91C_MC_FMR              (0xFFFFFF60) // (MC) MC Flash Mode Register

-// ========== Register definition for PDC_SPI1 peripheral ========== 

-#define AT91C_SPI1_PTCR           (0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register

-#define AT91C_SPI1_RPR            (0xFFFE4100) // (PDC_SPI1) Receive Pointer Register

-#define AT91C_SPI1_TNCR           (0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register

-#define AT91C_SPI1_TPR            (0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register

-#define AT91C_SPI1_TNPR           (0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register

-#define AT91C_SPI1_TCR            (0xFFFE410C) // (PDC_SPI1) Transmit Counter Register

-#define AT91C_SPI1_RCR            (0xFFFE4104) // (PDC_SPI1) Receive Counter Register

-#define AT91C_SPI1_RNPR           (0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register

-#define AT91C_SPI1_RNCR           (0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register

-#define AT91C_SPI1_PTSR           (0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register

-// ========== Register definition for SPI1 peripheral ========== 

-#define AT91C_SPI1_IMR            (0xFFFE401C) // (SPI1) Interrupt Mask Register

-#define AT91C_SPI1_IER            (0xFFFE4014) // (SPI1) Interrupt Enable Register

-#define AT91C_SPI1_MR             (0xFFFE4004) // (SPI1) Mode Register

-#define AT91C_SPI1_RDR            (0xFFFE4008) // (SPI1) Receive Data Register

-#define AT91C_SPI1_IDR            (0xFFFE4018) // (SPI1) Interrupt Disable Register

-#define AT91C_SPI1_SR             (0xFFFE4010) // (SPI1) Status Register

-#define AT91C_SPI1_TDR            (0xFFFE400C) // (SPI1) Transmit Data Register

-#define AT91C_SPI1_CR             (0xFFFE4000) // (SPI1) Control Register

-#define AT91C_SPI1_CSR            (0xFFFE4030) // (SPI1) Chip Select Register

-// ========== Register definition for PDC_SPI0 peripheral ========== 

-#define AT91C_SPI0_PTCR           (0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register

-#define AT91C_SPI0_TPR            (0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register

-#define AT91C_SPI0_TCR            (0xFFFE010C) // (PDC_SPI0) Transmit Counter Register

-#define AT91C_SPI0_RCR            (0xFFFE0104) // (PDC_SPI0) Receive Counter Register

-#define AT91C_SPI0_PTSR           (0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register

-#define AT91C_SPI0_RNPR           (0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register

-#define AT91C_SPI0_RPR            (0xFFFE0100) // (PDC_SPI0) Receive Pointer Register

-#define AT91C_SPI0_TNCR           (0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register

-#define AT91C_SPI0_RNCR           (0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register

-#define AT91C_SPI0_TNPR           (0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register

-// ========== Register definition for SPI0 peripheral ========== 

-#define AT91C_SPI0_IER            (0xFFFE0014) // (SPI0) Interrupt Enable Register

-#define AT91C_SPI0_SR             (0xFFFE0010) // (SPI0) Status Register

-#define AT91C_SPI0_IDR            (0xFFFE0018) // (SPI0) Interrupt Disable Register

-#define AT91C_SPI0_CR             (0xFFFE0000) // (SPI0) Control Register

-#define AT91C_SPI0_MR             (0xFFFE0004) // (SPI0) Mode Register

-#define AT91C_SPI0_IMR            (0xFFFE001C) // (SPI0) Interrupt Mask Register

-#define AT91C_SPI0_TDR            (0xFFFE000C) // (SPI0) Transmit Data Register

-#define AT91C_SPI0_RDR            (0xFFFE0008) // (SPI0) Receive Data Register

-#define AT91C_SPI0_CSR            (0xFFFE0030) // (SPI0) Chip Select Register

-// ========== Register definition for PDC_US1 peripheral ========== 

-#define AT91C_US1_RNCR            (0xFFFC4114) // (PDC_US1) Receive Next Counter Register

-#define AT91C_US1_PTCR            (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register

-#define AT91C_US1_TCR             (0xFFFC410C) // (PDC_US1) Transmit Counter Register

-#define AT91C_US1_PTSR            (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register

-#define AT91C_US1_TNPR            (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register

-#define AT91C_US1_RCR             (0xFFFC4104) // (PDC_US1) Receive Counter Register

-#define AT91C_US1_RNPR            (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register

-#define AT91C_US1_RPR             (0xFFFC4100) // (PDC_US1) Receive Pointer Register

-#define AT91C_US1_TNCR            (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register

-#define AT91C_US1_TPR             (0xFFFC4108) // (PDC_US1) Transmit Pointer Register

-// ========== Register definition for US1 peripheral ========== 

-#define AT91C_US1_IF              (0xFFFC404C) // (US1) IRDA_FILTER Register

-#define AT91C_US1_NER             (0xFFFC4044) // (US1) Nb Errors Register

-#define AT91C_US1_RTOR            (0xFFFC4024) // (US1) Receiver Time-out Register

-#define AT91C_US1_CSR             (0xFFFC4014) // (US1) Channel Status Register

-#define AT91C_US1_IDR             (0xFFFC400C) // (US1) Interrupt Disable Register

-#define AT91C_US1_IER             (0xFFFC4008) // (US1) Interrupt Enable Register

-#define AT91C_US1_THR             (0xFFFC401C) // (US1) Transmitter Holding Register

-#define AT91C_US1_TTGR            (0xFFFC4028) // (US1) Transmitter Time-guard Register

-#define AT91C_US1_RHR             (0xFFFC4018) // (US1) Receiver Holding Register

-#define AT91C_US1_BRGR            (0xFFFC4020) // (US1) Baud Rate Generator Register

-#define AT91C_US1_IMR             (0xFFFC4010) // (US1) Interrupt Mask Register

-#define AT91C_US1_FIDI            (0xFFFC4040) // (US1) FI_DI_Ratio Register

-#define AT91C_US1_CR              (0xFFFC4000) // (US1) Control Register

-#define AT91C_US1_MR              (0xFFFC4004) // (US1) Mode Register

-// ========== Register definition for PDC_US0 peripheral ========== 

-#define AT91C_US0_TNPR            (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register

-#define AT91C_US0_RNPR            (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register

-#define AT91C_US0_TCR             (0xFFFC010C) // (PDC_US0) Transmit Counter Register

-#define AT91C_US0_PTCR            (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register

-#define AT91C_US0_PTSR            (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register

-#define AT91C_US0_TNCR            (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register

-#define AT91C_US0_TPR             (0xFFFC0108) // (PDC_US0) Transmit Pointer Register

-#define AT91C_US0_RCR             (0xFFFC0104) // (PDC_US0) Receive Counter Register

-#define AT91C_US0_RPR             (0xFFFC0100) // (PDC_US0) Receive Pointer Register

-#define AT91C_US0_RNCR            (0xFFFC0114) // (PDC_US0) Receive Next Counter Register

-// ========== Register definition for US0 peripheral ========== 

-#define AT91C_US0_BRGR            (0xFFFC0020) // (US0) Baud Rate Generator Register

-#define AT91C_US0_NER             (0xFFFC0044) // (US0) Nb Errors Register

-#define AT91C_US0_CR              (0xFFFC0000) // (US0) Control Register

-#define AT91C_US0_IMR             (0xFFFC0010) // (US0) Interrupt Mask Register

-#define AT91C_US0_FIDI            (0xFFFC0040) // (US0) FI_DI_Ratio Register

-#define AT91C_US0_TTGR            (0xFFFC0028) // (US0) Transmitter Time-guard Register

-#define AT91C_US0_MR              (0xFFFC0004) // (US0) Mode Register

-#define AT91C_US0_RTOR            (0xFFFC0024) // (US0) Receiver Time-out Register

-#define AT91C_US0_CSR             (0xFFFC0014) // (US0) Channel Status Register

-#define AT91C_US0_RHR             (0xFFFC0018) // (US0) Receiver Holding Register

-#define AT91C_US0_IDR             (0xFFFC000C) // (US0) Interrupt Disable Register

-#define AT91C_US0_THR             (0xFFFC001C) // (US0) Transmitter Holding Register

-#define AT91C_US0_IF              (0xFFFC004C) // (US0) IRDA_FILTER Register

-#define AT91C_US0_IER             (0xFFFC0008) // (US0) Interrupt Enable Register

-// ========== Register definition for PDC_SSC peripheral ========== 

-#define AT91C_SSC_TNCR            (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register

-#define AT91C_SSC_RPR             (0xFFFD4100) // (PDC_SSC) Receive Pointer Register

-#define AT91C_SSC_RNCR            (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register

-#define AT91C_SSC_TPR             (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register

-#define AT91C_SSC_PTCR            (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register

-#define AT91C_SSC_TCR             (0xFFFD410C) // (PDC_SSC) Transmit Counter Register

-#define AT91C_SSC_RCR             (0xFFFD4104) // (PDC_SSC) Receive Counter Register

-#define AT91C_SSC_RNPR            (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register

-#define AT91C_SSC_TNPR            (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register

-#define AT91C_SSC_PTSR            (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register

-// ========== Register definition for SSC peripheral ========== 

-#define AT91C_SSC_RHR             (0xFFFD4020) // (SSC) Receive Holding Register

-#define AT91C_SSC_RSHR            (0xFFFD4030) // (SSC) Receive Sync Holding Register

-#define AT91C_SSC_TFMR            (0xFFFD401C) // (SSC) Transmit Frame Mode Register

-#define AT91C_SSC_IDR             (0xFFFD4048) // (SSC) Interrupt Disable Register

-#define AT91C_SSC_THR             (0xFFFD4024) // (SSC) Transmit Holding Register

-#define AT91C_SSC_RCMR            (0xFFFD4010) // (SSC) Receive Clock ModeRegister

-#define AT91C_SSC_IER             (0xFFFD4044) // (SSC) Interrupt Enable Register

-#define AT91C_SSC_TSHR            (0xFFFD4034) // (SSC) Transmit Sync Holding Register

-#define AT91C_SSC_SR              (0xFFFD4040) // (SSC) Status Register

-#define AT91C_SSC_CMR             (0xFFFD4004) // (SSC) Clock Mode Register

-#define AT91C_SSC_TCMR            (0xFFFD4018) // (SSC) Transmit Clock Mode Register

-#define AT91C_SSC_CR              (0xFFFD4000) // (SSC) Control Register

-#define AT91C_SSC_IMR             (0xFFFD404C) // (SSC) Interrupt Mask Register

-#define AT91C_SSC_RFMR            (0xFFFD4014) // (SSC) Receive Frame Mode Register

-// ========== Register definition for TWI peripheral ========== 

-#define AT91C_TWI_IER             (0xFFFB8024) // (TWI) Interrupt Enable Register

-#define AT91C_TWI_CR              (0xFFFB8000) // (TWI) Control Register

-#define AT91C_TWI_SR              (0xFFFB8020) // (TWI) Status Register

-#define AT91C_TWI_IMR             (0xFFFB802C) // (TWI) Interrupt Mask Register

-#define AT91C_TWI_THR             (0xFFFB8034) // (TWI) Transmit Holding Register

-#define AT91C_TWI_IDR             (0xFFFB8028) // (TWI) Interrupt Disable Register

-#define AT91C_TWI_IADR            (0xFFFB800C) // (TWI) Internal Address Register

-#define AT91C_TWI_MMR             (0xFFFB8004) // (TWI) Master Mode Register

-#define AT91C_TWI_CWGR            (0xFFFB8010) // (TWI) Clock Waveform Generator Register

-#define AT91C_TWI_RHR             (0xFFFB8030) // (TWI) Receive Holding Register

-// ========== Register definition for PWMC_CH3 peripheral ========== 

-#define AT91C_PWMC_CH3_CUPDR      (0xFFFCC270) // (PWMC_CH3) Channel Update Register

-#define AT91C_PWMC_CH3_Reserved   (0xFFFCC274) // (PWMC_CH3) Reserved

-#define AT91C_PWMC_CH3_CPRDR      (0xFFFCC268) // (PWMC_CH3) Channel Period Register

-#define AT91C_PWMC_CH3_CDTYR      (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register

-#define AT91C_PWMC_CH3_CCNTR      (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register

-#define AT91C_PWMC_CH3_CMR        (0xFFFCC260) // (PWMC_CH3) Channel Mode Register

-// ========== Register definition for PWMC_CH2 peripheral ========== 

-#define AT91C_PWMC_CH2_Reserved   (0xFFFCC254) // (PWMC_CH2) Reserved

-#define AT91C_PWMC_CH2_CMR        (0xFFFCC240) // (PWMC_CH2) Channel Mode Register

-#define AT91C_PWMC_CH2_CCNTR      (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register

-#define AT91C_PWMC_CH2_CPRDR      (0xFFFCC248) // (PWMC_CH2) Channel Period Register

-#define AT91C_PWMC_CH2_CUPDR      (0xFFFCC250) // (PWMC_CH2) Channel Update Register

-#define AT91C_PWMC_CH2_CDTYR      (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register

-// ========== Register definition for PWMC_CH1 peripheral ========== 

-#define AT91C_PWMC_CH1_Reserved   (0xFFFCC234) // (PWMC_CH1) Reserved

-#define AT91C_PWMC_CH1_CUPDR      (0xFFFCC230) // (PWMC_CH1) Channel Update Register

-#define AT91C_PWMC_CH1_CPRDR      (0xFFFCC228) // (PWMC_CH1) Channel Period Register

-#define AT91C_PWMC_CH1_CCNTR      (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register

-#define AT91C_PWMC_CH1_CDTYR      (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register

-#define AT91C_PWMC_CH1_CMR        (0xFFFCC220) // (PWMC_CH1) Channel Mode Register

-// ========== Register definition for PWMC_CH0 peripheral ========== 

-#define AT91C_PWMC_CH0_Reserved   (0xFFFCC214) // (PWMC_CH0) Reserved

-#define AT91C_PWMC_CH0_CPRDR      (0xFFFCC208) // (PWMC_CH0) Channel Period Register

-#define AT91C_PWMC_CH0_CDTYR      (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register

-#define AT91C_PWMC_CH0_CMR        (0xFFFCC200) // (PWMC_CH0) Channel Mode Register

-#define AT91C_PWMC_CH0_CUPDR      (0xFFFCC210) // (PWMC_CH0) Channel Update Register

-#define AT91C_PWMC_CH0_CCNTR      (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register

-// ========== Register definition for PWMC peripheral ========== 

-#define AT91C_PWMC_IDR            (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register

-#define AT91C_PWMC_DIS            (0xFFFCC008) // (PWMC) PWMC Disable Register

-#define AT91C_PWMC_IER            (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register

-#define AT91C_PWMC_VR             (0xFFFCC0FC) // (PWMC) PWMC Version Register

-#define AT91C_PWMC_ISR            (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register

-#define AT91C_PWMC_SR             (0xFFFCC00C) // (PWMC) PWMC Status Register

-#define AT91C_PWMC_IMR            (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register

-#define AT91C_PWMC_MR             (0xFFFCC000) // (PWMC) PWMC Mode Register

-#define AT91C_PWMC_ENA            (0xFFFCC004) // (PWMC) PWMC Enable Register

-// ========== Register definition for UDP peripheral ========== 

-#define AT91C_UDP_IMR             (0xFFFB0018) // (UDP) Interrupt Mask Register

-#define AT91C_UDP_FADDR           (0xFFFB0008) // (UDP) Function Address Register

-#define AT91C_UDP_NUM             (0xFFFB0000) // (UDP) Frame Number Register

-#define AT91C_UDP_FDR             (0xFFFB0050) // (UDP) Endpoint FIFO Data Register

-#define AT91C_UDP_ISR             (0xFFFB001C) // (UDP) Interrupt Status Register

-#define AT91C_UDP_CSR             (0xFFFB0030) // (UDP) Endpoint Control and Status Register

-#define AT91C_UDP_IDR             (0xFFFB0014) // (UDP) Interrupt Disable Register

-#define AT91C_UDP_ICR             (0xFFFB0020) // (UDP) Interrupt Clear Register

-#define AT91C_UDP_RSTEP           (0xFFFB0028) // (UDP) Reset Endpoint Register

-#define AT91C_UDP_TXVC            (0xFFFB0074) // (UDP) Transceiver Control Register

-#define AT91C_UDP_GLBSTATE        (0xFFFB0004) // (UDP) Global State Register

-#define AT91C_UDP_IER             (0xFFFB0010) // (UDP) Interrupt Enable Register

-// ========== Register definition for TC0 peripheral ========== 

-#define AT91C_TC0_SR              (0xFFFA0020) // (TC0) Status Register

-#define AT91C_TC0_RC              (0xFFFA001C) // (TC0) Register C

-#define AT91C_TC0_RB              (0xFFFA0018) // (TC0) Register B

-#define AT91C_TC0_CCR             (0xFFFA0000) // (TC0) Channel Control Register

-#define AT91C_TC0_CMR             (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC0_IER             (0xFFFA0024) // (TC0) Interrupt Enable Register

-#define AT91C_TC0_RA              (0xFFFA0014) // (TC0) Register A

-#define AT91C_TC0_IDR             (0xFFFA0028) // (TC0) Interrupt Disable Register

-#define AT91C_TC0_CV              (0xFFFA0010) // (TC0) Counter Value

-#define AT91C_TC0_IMR             (0xFFFA002C) // (TC0) Interrupt Mask Register

-// ========== Register definition for TC1 peripheral ========== 

-#define AT91C_TC1_RB              (0xFFFA0058) // (TC1) Register B

-#define AT91C_TC1_CCR             (0xFFFA0040) // (TC1) Channel Control Register

-#define AT91C_TC1_IER             (0xFFFA0064) // (TC1) Interrupt Enable Register

-#define AT91C_TC1_IDR             (0xFFFA0068) // (TC1) Interrupt Disable Register

-#define AT91C_TC1_SR              (0xFFFA0060) // (TC1) Status Register

-#define AT91C_TC1_CMR             (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC1_RA              (0xFFFA0054) // (TC1) Register A

-#define AT91C_TC1_RC              (0xFFFA005C) // (TC1) Register C

-#define AT91C_TC1_IMR             (0xFFFA006C) // (TC1) Interrupt Mask Register

-#define AT91C_TC1_CV              (0xFFFA0050) // (TC1) Counter Value

-// ========== Register definition for TC2 peripheral ========== 

-#define AT91C_TC2_CMR             (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)

-#define AT91C_TC2_CCR             (0xFFFA0080) // (TC2) Channel Control Register

-#define AT91C_TC2_CV              (0xFFFA0090) // (TC2) Counter Value

-#define AT91C_TC2_RA              (0xFFFA0094) // (TC2) Register A

-#define AT91C_TC2_RB              (0xFFFA0098) // (TC2) Register B

-#define AT91C_TC2_IDR             (0xFFFA00A8) // (TC2) Interrupt Disable Register

-#define AT91C_TC2_IMR             (0xFFFA00AC) // (TC2) Interrupt Mask Register

-#define AT91C_TC2_RC              (0xFFFA009C) // (TC2) Register C

-#define AT91C_TC2_IER             (0xFFFA00A4) // (TC2) Interrupt Enable Register

-#define AT91C_TC2_SR              (0xFFFA00A0) // (TC2) Status Register

-// ========== Register definition for TCB peripheral ========== 

-#define AT91C_TCB_BMR             (0xFFFA00C4) // (TCB) TC Block Mode Register

-#define AT91C_TCB_BCR             (0xFFFA00C0) // (TCB) TC Block Control Register

-// ========== Register definition for CAN_MB0 peripheral ========== 

-#define AT91C_CAN_MB0_MDL         (0xFFFD0214) // (CAN_MB0) MailBox Data Low Register

-#define AT91C_CAN_MB0_MAM         (0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB0_MCR         (0xFFFD021C) // (CAN_MB0) MailBox Control Register

-#define AT91C_CAN_MB0_MID         (0xFFFD0208) // (CAN_MB0) MailBox ID Register

-#define AT91C_CAN_MB0_MSR         (0xFFFD0210) // (CAN_MB0) MailBox Status Register

-#define AT91C_CAN_MB0_MFID        (0xFFFD020C) // (CAN_MB0) MailBox Family ID Register

-#define AT91C_CAN_MB0_MDH         (0xFFFD0218) // (CAN_MB0) MailBox Data High Register

-#define AT91C_CAN_MB0_MMR         (0xFFFD0200) // (CAN_MB0) MailBox Mode Register

-// ========== Register definition for CAN_MB1 peripheral ========== 

-#define AT91C_CAN_MB1_MDL         (0xFFFD0234) // (CAN_MB1) MailBox Data Low Register

-#define AT91C_CAN_MB1_MID         (0xFFFD0228) // (CAN_MB1) MailBox ID Register

-#define AT91C_CAN_MB1_MMR         (0xFFFD0220) // (CAN_MB1) MailBox Mode Register

-#define AT91C_CAN_MB1_MSR         (0xFFFD0230) // (CAN_MB1) MailBox Status Register

-#define AT91C_CAN_MB1_MAM         (0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB1_MDH         (0xFFFD0238) // (CAN_MB1) MailBox Data High Register

-#define AT91C_CAN_MB1_MCR         (0xFFFD023C) // (CAN_MB1) MailBox Control Register

-#define AT91C_CAN_MB1_MFID        (0xFFFD022C) // (CAN_MB1) MailBox Family ID Register

-// ========== Register definition for CAN_MB2 peripheral ========== 

-#define AT91C_CAN_MB2_MCR         (0xFFFD025C) // (CAN_MB2) MailBox Control Register

-#define AT91C_CAN_MB2_MDH         (0xFFFD0258) // (CAN_MB2) MailBox Data High Register

-#define AT91C_CAN_MB2_MID         (0xFFFD0248) // (CAN_MB2) MailBox ID Register

-#define AT91C_CAN_MB2_MDL         (0xFFFD0254) // (CAN_MB2) MailBox Data Low Register

-#define AT91C_CAN_MB2_MMR         (0xFFFD0240) // (CAN_MB2) MailBox Mode Register

-#define AT91C_CAN_MB2_MAM         (0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB2_MFID        (0xFFFD024C) // (CAN_MB2) MailBox Family ID Register

-#define AT91C_CAN_MB2_MSR         (0xFFFD0250) // (CAN_MB2) MailBox Status Register

-// ========== Register definition for CAN_MB3 peripheral ========== 

-#define AT91C_CAN_MB3_MFID        (0xFFFD026C) // (CAN_MB3) MailBox Family ID Register

-#define AT91C_CAN_MB3_MAM         (0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB3_MID         (0xFFFD0268) // (CAN_MB3) MailBox ID Register

-#define AT91C_CAN_MB3_MCR         (0xFFFD027C) // (CAN_MB3) MailBox Control Register

-#define AT91C_CAN_MB3_MMR         (0xFFFD0260) // (CAN_MB3) MailBox Mode Register

-#define AT91C_CAN_MB3_MSR         (0xFFFD0270) // (CAN_MB3) MailBox Status Register

-#define AT91C_CAN_MB3_MDL         (0xFFFD0274) // (CAN_MB3) MailBox Data Low Register

-#define AT91C_CAN_MB3_MDH         (0xFFFD0278) // (CAN_MB3) MailBox Data High Register

-// ========== Register definition for CAN_MB4 peripheral ========== 

-#define AT91C_CAN_MB4_MID         (0xFFFD0288) // (CAN_MB4) MailBox ID Register

-#define AT91C_CAN_MB4_MMR         (0xFFFD0280) // (CAN_MB4) MailBox Mode Register

-#define AT91C_CAN_MB4_MDH         (0xFFFD0298) // (CAN_MB4) MailBox Data High Register

-#define AT91C_CAN_MB4_MFID        (0xFFFD028C) // (CAN_MB4) MailBox Family ID Register

-#define AT91C_CAN_MB4_MSR         (0xFFFD0290) // (CAN_MB4) MailBox Status Register

-#define AT91C_CAN_MB4_MCR         (0xFFFD029C) // (CAN_MB4) MailBox Control Register

-#define AT91C_CAN_MB4_MDL         (0xFFFD0294) // (CAN_MB4) MailBox Data Low Register

-#define AT91C_CAN_MB4_MAM         (0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register

-// ========== Register definition for CAN_MB5 peripheral ========== 

-#define AT91C_CAN_MB5_MSR         (0xFFFD02B0) // (CAN_MB5) MailBox Status Register

-#define AT91C_CAN_MB5_MCR         (0xFFFD02BC) // (CAN_MB5) MailBox Control Register

-#define AT91C_CAN_MB5_MFID        (0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register

-#define AT91C_CAN_MB5_MDH         (0xFFFD02B8) // (CAN_MB5) MailBox Data High Register

-#define AT91C_CAN_MB5_MID         (0xFFFD02A8) // (CAN_MB5) MailBox ID Register

-#define AT91C_CAN_MB5_MMR         (0xFFFD02A0) // (CAN_MB5) MailBox Mode Register

-#define AT91C_CAN_MB5_MDL         (0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register

-#define AT91C_CAN_MB5_MAM         (0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register

-// ========== Register definition for CAN_MB6 peripheral ========== 

-#define AT91C_CAN_MB6_MFID        (0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register

-#define AT91C_CAN_MB6_MID         (0xFFFD02C8) // (CAN_MB6) MailBox ID Register

-#define AT91C_CAN_MB6_MAM         (0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB6_MSR         (0xFFFD02D0) // (CAN_MB6) MailBox Status Register

-#define AT91C_CAN_MB6_MDL         (0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register

-#define AT91C_CAN_MB6_MCR         (0xFFFD02DC) // (CAN_MB6) MailBox Control Register

-#define AT91C_CAN_MB6_MDH         (0xFFFD02D8) // (CAN_MB6) MailBox Data High Register

-#define AT91C_CAN_MB6_MMR         (0xFFFD02C0) // (CAN_MB6) MailBox Mode Register

-// ========== Register definition for CAN_MB7 peripheral ========== 

-#define AT91C_CAN_MB7_MCR         (0xFFFD02FC) // (CAN_MB7) MailBox Control Register

-#define AT91C_CAN_MB7_MDH         (0xFFFD02F8) // (CAN_MB7) MailBox Data High Register

-#define AT91C_CAN_MB7_MFID        (0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register

-#define AT91C_CAN_MB7_MDL         (0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register

-#define AT91C_CAN_MB7_MID         (0xFFFD02E8) // (CAN_MB7) MailBox ID Register

-#define AT91C_CAN_MB7_MMR         (0xFFFD02E0) // (CAN_MB7) MailBox Mode Register

-#define AT91C_CAN_MB7_MAM         (0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register

-#define AT91C_CAN_MB7_MSR         (0xFFFD02F0) // (CAN_MB7) MailBox Status Register

-// ========== Register definition for CAN peripheral ========== 

-#define AT91C_CAN_TCR             (0xFFFD0024) // (CAN) Transfer Command Register

-#define AT91C_CAN_IMR             (0xFFFD000C) // (CAN) Interrupt Mask Register

-#define AT91C_CAN_IER             (0xFFFD0004) // (CAN) Interrupt Enable Register

-#define AT91C_CAN_ECR             (0xFFFD0020) // (CAN) Error Counter Register

-#define AT91C_CAN_TIMESTP         (0xFFFD001C) // (CAN) Time Stamp Register

-#define AT91C_CAN_MR              (0xFFFD0000) // (CAN) Mode Register

-#define AT91C_CAN_IDR             (0xFFFD0008) // (CAN) Interrupt Disable Register

-#define AT91C_CAN_ACR             (0xFFFD0028) // (CAN) Abort Command Register

-#define AT91C_CAN_TIM             (0xFFFD0018) // (CAN) Timer Register

-#define AT91C_CAN_SR              (0xFFFD0010) // (CAN) Status Register

-#define AT91C_CAN_BR              (0xFFFD0014) // (CAN) Baudrate Register

-#define AT91C_CAN_VR              (0xFFFD00FC) // (CAN) Version Register

-// ========== Register definition for EMAC peripheral ========== 

-#define AT91C_EMAC_ISR            (0xFFFDC024) // (EMAC) Interrupt Status Register

-#define AT91C_EMAC_SA4H           (0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes

-#define AT91C_EMAC_SA1L           (0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes

-#define AT91C_EMAC_ELE            (0xFFFDC078) // (EMAC) Excessive Length Errors Register

-#define AT91C_EMAC_LCOL           (0xFFFDC05C) // (EMAC) Late Collision Register

-#define AT91C_EMAC_RLE            (0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register

-#define AT91C_EMAC_WOL            (0xFFFDC0C4) // (EMAC) Wake On LAN Register

-#define AT91C_EMAC_DTF            (0xFFFDC058) // (EMAC) Deferred Transmission Frame Register

-#define AT91C_EMAC_TUND           (0xFFFDC064) // (EMAC) Transmit Underrun Error Register

-#define AT91C_EMAC_NCR            (0xFFFDC000) // (EMAC) Network Control Register

-#define AT91C_EMAC_SA4L           (0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes

-#define AT91C_EMAC_RSR            (0xFFFDC020) // (EMAC) Receive Status Register

-#define AT91C_EMAC_SA3L           (0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes

-#define AT91C_EMAC_TSR            (0xFFFDC014) // (EMAC) Transmit Status Register

-#define AT91C_EMAC_IDR            (0xFFFDC02C) // (EMAC) Interrupt Disable Register

-#define AT91C_EMAC_RSE            (0xFFFDC074) // (EMAC) Receive Symbol Errors Register

-#define AT91C_EMAC_ECOL           (0xFFFDC060) // (EMAC) Excessive Collision Register

-#define AT91C_EMAC_TID            (0xFFFDC0B8) // (EMAC) Type ID Checking Register

-#define AT91C_EMAC_HRB            (0xFFFDC090) // (EMAC) Hash Address Bottom[31:0]

-#define AT91C_EMAC_TBQP           (0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer

-#define AT91C_EMAC_USRIO          (0xFFFDC0C0) // (EMAC) USER Input/Output Register

-#define AT91C_EMAC_PTR            (0xFFFDC038) // (EMAC) Pause Time Register

-#define AT91C_EMAC_SA2H           (0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes

-#define AT91C_EMAC_ROV            (0xFFFDC070) // (EMAC) Receive Overrun Errors Register

-#define AT91C_EMAC_ALE            (0xFFFDC054) // (EMAC) Alignment Error Register

-#define AT91C_EMAC_RJA            (0xFFFDC07C) // (EMAC) Receive Jabbers Register

-#define AT91C_EMAC_RBQP           (0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer

-#define AT91C_EMAC_TPF            (0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register

-#define AT91C_EMAC_NCFGR          (0xFFFDC004) // (EMAC) Network Configuration Register

-#define AT91C_EMAC_HRT            (0xFFFDC094) // (EMAC) Hash Address Top[63:32]

-#define AT91C_EMAC_USF            (0xFFFDC080) // (EMAC) Undersize Frames Register

-#define AT91C_EMAC_FCSE           (0xFFFDC050) // (EMAC) Frame Check Sequence Error Register

-#define AT91C_EMAC_TPQ            (0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register

-#define AT91C_EMAC_MAN            (0xFFFDC034) // (EMAC) PHY Maintenance Register

-#define AT91C_EMAC_FTO            (0xFFFDC040) // (EMAC) Frames Transmitted OK Register

-#define AT91C_EMAC_REV            (0xFFFDC0FC) // (EMAC) Revision Register

-#define AT91C_EMAC_IMR            (0xFFFDC030) // (EMAC) Interrupt Mask Register

-#define AT91C_EMAC_SCF            (0xFFFDC044) // (EMAC) Single Collision Frame Register

-#define AT91C_EMAC_PFR            (0xFFFDC03C) // (EMAC) Pause Frames received Register

-#define AT91C_EMAC_MCF            (0xFFFDC048) // (EMAC) Multiple Collision Frame Register

-#define AT91C_EMAC_NSR            (0xFFFDC008) // (EMAC) Network Status Register

-#define AT91C_EMAC_SA2L           (0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes

-#define AT91C_EMAC_FRO            (0xFFFDC04C) // (EMAC) Frames Received OK Register

-#define AT91C_EMAC_IER            (0xFFFDC028) // (EMAC) Interrupt Enable Register

-#define AT91C_EMAC_SA1H           (0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes

-#define AT91C_EMAC_CSE            (0xFFFDC068) // (EMAC) Carrier Sense Error Register

-#define AT91C_EMAC_SA3H           (0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes

-#define AT91C_EMAC_RRE            (0xFFFDC06C) // (EMAC) Receive Ressource Error Register

-#define AT91C_EMAC_STE            (0xFFFDC084) // (EMAC) SQE Test Error Register

-// ========== Register definition for PDC_ADC peripheral ========== 

-#define AT91C_ADC_PTSR            (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register

-#define AT91C_ADC_PTCR            (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register

-#define AT91C_ADC_TNPR            (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register

-#define AT91C_ADC_TNCR            (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register

-#define AT91C_ADC_RNPR            (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register

-#define AT91C_ADC_RNCR            (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register

-#define AT91C_ADC_RPR             (0xFFFD8100) // (PDC_ADC) Receive Pointer Register

-#define AT91C_ADC_TCR             (0xFFFD810C) // (PDC_ADC) Transmit Counter Register

-#define AT91C_ADC_TPR             (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register

-#define AT91C_ADC_RCR             (0xFFFD8104) // (PDC_ADC) Receive Counter Register

-// ========== Register definition for ADC peripheral ========== 

-#define AT91C_ADC_CDR2            (0xFFFD8038) // (ADC) ADC Channel Data Register 2

-#define AT91C_ADC_CDR3            (0xFFFD803C) // (ADC) ADC Channel Data Register 3

-#define AT91C_ADC_CDR0            (0xFFFD8030) // (ADC) ADC Channel Data Register 0

-#define AT91C_ADC_CDR5            (0xFFFD8044) // (ADC) ADC Channel Data Register 5

-#define AT91C_ADC_CHDR            (0xFFFD8014) // (ADC) ADC Channel Disable Register

-#define AT91C_ADC_SR              (0xFFFD801C) // (ADC) ADC Status Register

-#define AT91C_ADC_CDR4            (0xFFFD8040) // (ADC) ADC Channel Data Register 4

-#define AT91C_ADC_CDR1            (0xFFFD8034) // (ADC) ADC Channel Data Register 1

-#define AT91C_ADC_LCDR            (0xFFFD8020) // (ADC) ADC Last Converted Data Register

-#define AT91C_ADC_IDR             (0xFFFD8028) // (ADC) ADC Interrupt Disable Register

-#define AT91C_ADC_CR              (0xFFFD8000) // (ADC) ADC Control Register

-#define AT91C_ADC_CDR7            (0xFFFD804C) // (ADC) ADC Channel Data Register 7

-#define AT91C_ADC_CDR6            (0xFFFD8048) // (ADC) ADC Channel Data Register 6

-#define AT91C_ADC_IER             (0xFFFD8024) // (ADC) ADC Interrupt Enable Register

-#define AT91C_ADC_CHER            (0xFFFD8010) // (ADC) ADC Channel Enable Register

-#define AT91C_ADC_CHSR            (0xFFFD8018) // (ADC) ADC Channel Status Register

-#define AT91C_ADC_MR              (0xFFFD8004) // (ADC) ADC Mode Register

-#define AT91C_ADC_IMR             (0xFFFD802C) // (ADC) ADC Interrupt Mask Register

-// ========== Register definition for PDC_AES peripheral ========== 

-#define AT91C_AES_TPR             (0xFFFA4108) // (PDC_AES) Transmit Pointer Register

-#define AT91C_AES_PTCR            (0xFFFA4120) // (PDC_AES) PDC Transfer Control Register

-#define AT91C_AES_RNPR            (0xFFFA4110) // (PDC_AES) Receive Next Pointer Register

-#define AT91C_AES_TNCR            (0xFFFA411C) // (PDC_AES) Transmit Next Counter Register

-#define AT91C_AES_TCR             (0xFFFA410C) // (PDC_AES) Transmit Counter Register

-#define AT91C_AES_RCR             (0xFFFA4104) // (PDC_AES) Receive Counter Register

-#define AT91C_AES_RNCR            (0xFFFA4114) // (PDC_AES) Receive Next Counter Register

-#define AT91C_AES_TNPR            (0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register

-#define AT91C_AES_RPR             (0xFFFA4100) // (PDC_AES) Receive Pointer Register

-#define AT91C_AES_PTSR            (0xFFFA4124) // (PDC_AES) PDC Transfer Status Register

-// ========== Register definition for AES peripheral ========== 

-#define AT91C_AES_IVxR            (0xFFFA4060) // (AES) Initialization Vector x Register

-#define AT91C_AES_MR              (0xFFFA4004) // (AES) Mode Register

-#define AT91C_AES_VR              (0xFFFA40FC) // (AES) AES Version Register

-#define AT91C_AES_ODATAxR         (0xFFFA4050) // (AES) Output Data x Register

-#define AT91C_AES_IDATAxR         (0xFFFA4040) // (AES) Input Data x Register

-#define AT91C_AES_CR              (0xFFFA4000) // (AES) Control Register

-#define AT91C_AES_IDR             (0xFFFA4014) // (AES) Interrupt Disable Register

-#define AT91C_AES_IMR             (0xFFFA4018) // (AES) Interrupt Mask Register

-#define AT91C_AES_IER             (0xFFFA4010) // (AES) Interrupt Enable Register

-#define AT91C_AES_KEYWxR          (0xFFFA4020) // (AES) Key Word x Register

-#define AT91C_AES_ISR             (0xFFFA401C) // (AES) Interrupt Status Register

-// ========== Register definition for PDC_TDES peripheral ========== 

-#define AT91C_TDES_RNCR           (0xFFFA8114) // (PDC_TDES) Receive Next Counter Register

-#define AT91C_TDES_TCR            (0xFFFA810C) // (PDC_TDES) Transmit Counter Register

-#define AT91C_TDES_RCR            (0xFFFA8104) // (PDC_TDES) Receive Counter Register

-#define AT91C_TDES_TNPR           (0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register

-#define AT91C_TDES_RNPR           (0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register

-#define AT91C_TDES_RPR            (0xFFFA8100) // (PDC_TDES) Receive Pointer Register

-#define AT91C_TDES_TNCR           (0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register

-#define AT91C_TDES_TPR            (0xFFFA8108) // (PDC_TDES) Transmit Pointer Register

-#define AT91C_TDES_PTSR           (0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register

-#define AT91C_TDES_PTCR           (0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register

-// ========== Register definition for TDES peripheral ========== 

-#define AT91C_TDES_KEY2WxR        (0xFFFA8028) // (TDES) Key 2 Word x Register

-#define AT91C_TDES_KEY3WxR        (0xFFFA8030) // (TDES) Key 3 Word x Register

-#define AT91C_TDES_IDR            (0xFFFA8014) // (TDES) Interrupt Disable Register

-#define AT91C_TDES_VR             (0xFFFA80FC) // (TDES) TDES Version Register

-#define AT91C_TDES_IVxR           (0xFFFA8060) // (TDES) Initialization Vector x Register

-#define AT91C_TDES_ODATAxR        (0xFFFA8050) // (TDES) Output Data x Register

-#define AT91C_TDES_IMR            (0xFFFA8018) // (TDES) Interrupt Mask Register

-#define AT91C_TDES_MR             (0xFFFA8004) // (TDES) Mode Register

-#define AT91C_TDES_CR             (0xFFFA8000) // (TDES) Control Register

-#define AT91C_TDES_IER            (0xFFFA8010) // (TDES) Interrupt Enable Register

-#define AT91C_TDES_ISR            (0xFFFA801C) // (TDES) Interrupt Status Register

-#define AT91C_TDES_IDATAxR        (0xFFFA8040) // (TDES) Input Data x Register

-#define AT91C_TDES_KEY1WxR        (0xFFFA8020) // (TDES) Key 1 Word x Register

-

-// *****************************************************************************

-//               PIO DEFINITIONS FOR AT91SAM7X256

-// *****************************************************************************

-#define AT91C_PIO_PA0             (1 <<  0) // Pin Controlled by PA0

-#define AT91C_PA0_RXD0            (AT91C_PIO_PA0) //  USART 0 Receive Data

-#define AT91C_PIO_PA1             (1 <<  1) // Pin Controlled by PA1

-#define AT91C_PA1_TXD0            (AT91C_PIO_PA1) //  USART 0 Transmit Data

-#define AT91C_PIO_PA10            (1 << 10) // Pin Controlled by PA10

-#define AT91C_PA10_TWD            (AT91C_PIO_PA10) //  TWI Two-wire Serial Data

-#define AT91C_PIO_PA11            (1 << 11) // Pin Controlled by PA11

-#define AT91C_PA11_TWCK           (AT91C_PIO_PA11) //  TWI Two-wire Serial Clock

-#define AT91C_PIO_PA12            (1 << 12) // Pin Controlled by PA12

-#define AT91C_PA12_NPCS00         (AT91C_PIO_PA12) //  SPI 0 Peripheral Chip Select 0

-#define AT91C_PIO_PA13            (1 << 13) // Pin Controlled by PA13

-#define AT91C_PA13_NPCS01         (AT91C_PIO_PA13) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PA13_PCK1           (AT91C_PIO_PA13) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PA14            (1 << 14) // Pin Controlled by PA14

-#define AT91C_PA14_NPCS02         (AT91C_PIO_PA14) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PA14_IRQ1           (AT91C_PIO_PA14) //  External Interrupt 1

-#define AT91C_PIO_PA15            (1 << 15) // Pin Controlled by PA15

-#define AT91C_PA15_NPCS03         (AT91C_PIO_PA15) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PA15_TCLK2          (AT91C_PIO_PA15) //  Timer Counter 2 external clock input

-#define AT91C_PIO_PA16            (1 << 16) // Pin Controlled by PA16

-#define AT91C_PA16_MISO0          (AT91C_PIO_PA16) //  SPI 0 Master In Slave

-#define AT91C_PIO_PA17            (1 << 17) // Pin Controlled by PA17

-#define AT91C_PA17_MOSI0          (AT91C_PIO_PA17) //  SPI 0 Master Out Slave

-#define AT91C_PIO_PA18            (1 << 18) // Pin Controlled by PA18

-#define AT91C_PA18_SPCK0          (AT91C_PIO_PA18) //  SPI 0 Serial Clock

-#define AT91C_PIO_PA19            (1 << 19) // Pin Controlled by PA19

-#define AT91C_PA19_CANRX          (AT91C_PIO_PA19) //  CAN Receive

-#define AT91C_PIO_PA2             (1 <<  2) // Pin Controlled by PA2

-#define AT91C_PA2_SCK0            (AT91C_PIO_PA2) //  USART 0 Serial Clock

-#define AT91C_PA2_NPCS11          (AT91C_PIO_PA2) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PA20            (1 << 20) // Pin Controlled by PA20

-#define AT91C_PA20_CANTX          (AT91C_PIO_PA20) //  CAN Transmit

-#define AT91C_PIO_PA21            (1 << 21) // Pin Controlled by PA21

-#define AT91C_PA21_TF             (AT91C_PIO_PA21) //  SSC Transmit Frame Sync

-#define AT91C_PA21_NPCS10         (AT91C_PIO_PA21) //  SPI 1 Peripheral Chip Select 0

-#define AT91C_PIO_PA22            (1 << 22) // Pin Controlled by PA22

-#define AT91C_PA22_TK             (AT91C_PIO_PA22) //  SSC Transmit Clock

-#define AT91C_PA22_SPCK1          (AT91C_PIO_PA22) //  SPI 1 Serial Clock

-#define AT91C_PIO_PA23            (1 << 23) // Pin Controlled by PA23

-#define AT91C_PA23_TD             (AT91C_PIO_PA23) //  SSC Transmit data

-#define AT91C_PA23_MOSI1          (AT91C_PIO_PA23) //  SPI 1 Master Out Slave

-#define AT91C_PIO_PA24            (1 << 24) // Pin Controlled by PA24

-#define AT91C_PA24_RD             (AT91C_PIO_PA24) //  SSC Receive Data

-#define AT91C_PA24_MISO1          (AT91C_PIO_PA24) //  SPI 1 Master In Slave

-#define AT91C_PIO_PA25            (1 << 25) // Pin Controlled by PA25

-#define AT91C_PA25_RK             (AT91C_PIO_PA25) //  SSC Receive Clock

-#define AT91C_PA25_NPCS11         (AT91C_PIO_PA25) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PA26            (1 << 26) // Pin Controlled by PA26

-#define AT91C_PA26_RF             (AT91C_PIO_PA26) //  SSC Receive Frame Sync

-#define AT91C_PA26_NPCS12         (AT91C_PIO_PA26) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PA27            (1 << 27) // Pin Controlled by PA27

-#define AT91C_PA27_DRXD           (AT91C_PIO_PA27) //  DBGU Debug Receive Data

-#define AT91C_PA27_PCK3           (AT91C_PIO_PA27) //  PMC Programmable Clock Output 3

-#define AT91C_PIO_PA28            (1 << 28) // Pin Controlled by PA28

-#define AT91C_PA28_DTXD           (AT91C_PIO_PA28) //  DBGU Debug Transmit Data

-#define AT91C_PIO_PA29            (1 << 29) // Pin Controlled by PA29

-#define AT91C_PA29_FIQ            (AT91C_PIO_PA29) //  AIC Fast Interrupt Input

-#define AT91C_PA29_NPCS13         (AT91C_PIO_PA29) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PA3             (1 <<  3) // Pin Controlled by PA3

-#define AT91C_PA3_RTS0            (AT91C_PIO_PA3) //  USART 0 Ready To Send

-#define AT91C_PA3_NPCS12          (AT91C_PIO_PA3) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PA30            (1 << 30) // Pin Controlled by PA30

-#define AT91C_PA30_IRQ0           (AT91C_PIO_PA30) //  External Interrupt 0

-#define AT91C_PA30_PCK2           (AT91C_PIO_PA30) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PA4             (1 <<  4) // Pin Controlled by PA4

-#define AT91C_PA4_CTS0            (AT91C_PIO_PA4) //  USART 0 Clear To Send

-#define AT91C_PA4_NPCS13          (AT91C_PIO_PA4) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PA5             (1 <<  5) // Pin Controlled by PA5

-#define AT91C_PA5_RXD1            (AT91C_PIO_PA5) //  USART 1 Receive Data

-#define AT91C_PIO_PA6             (1 <<  6) // Pin Controlled by PA6

-#define AT91C_PA6_TXD1            (AT91C_PIO_PA6) //  USART 1 Transmit Data

-#define AT91C_PIO_PA7             (1 <<  7) // Pin Controlled by PA7

-#define AT91C_PA7_SCK1            (AT91C_PIO_PA7) //  USART 1 Serial Clock

-#define AT91C_PA7_NPCS01          (AT91C_PIO_PA7) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PIO_PA8             (1 <<  8) // Pin Controlled by PA8

-#define AT91C_PA8_RTS1            (AT91C_PIO_PA8) //  USART 1 Ready To Send

-#define AT91C_PA8_NPCS02          (AT91C_PIO_PA8) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PIO_PA9             (1 <<  9) // Pin Controlled by PA9

-#define AT91C_PA9_CTS1            (AT91C_PIO_PA9) //  USART 1 Clear To Send

-#define AT91C_PA9_NPCS03          (AT91C_PIO_PA9) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PIO_PB0             (1 <<  0) // Pin Controlled by PB0

-#define AT91C_PB0_ETXCK_EREFCK    (AT91C_PIO_PB0) //  Ethernet MAC Transmit Clock/Reference Clock

-#define AT91C_PB0_PCK0            (AT91C_PIO_PB0) //  PMC Programmable Clock Output 0

-#define AT91C_PIO_PB1             (1 <<  1) // Pin Controlled by PB1

-#define AT91C_PB1_ETXEN           (AT91C_PIO_PB1) //  Ethernet MAC Transmit Enable

-#define AT91C_PIO_PB10            (1 << 10) // Pin Controlled by PB10

-#define AT91C_PB10_ETX2           (AT91C_PIO_PB10) //  Ethernet MAC Transmit Data 2

-#define AT91C_PB10_NPCS11         (AT91C_PIO_PB10) //  SPI 1 Peripheral Chip Select 1

-#define AT91C_PIO_PB11            (1 << 11) // Pin Controlled by PB11

-#define AT91C_PB11_ETX3           (AT91C_PIO_PB11) //  Ethernet MAC Transmit Data 3

-#define AT91C_PB11_NPCS12         (AT91C_PIO_PB11) //  SPI 1 Peripheral Chip Select 2

-#define AT91C_PIO_PB12            (1 << 12) // Pin Controlled by PB12

-#define AT91C_PB12_ETXER          (AT91C_PIO_PB12) //  Ethernet MAC Transmikt Coding Error

-#define AT91C_PB12_TCLK0          (AT91C_PIO_PB12) //  Timer Counter 0 external clock input

-#define AT91C_PIO_PB13            (1 << 13) // Pin Controlled by PB13

-#define AT91C_PB13_ERX2           (AT91C_PIO_PB13) //  Ethernet MAC Receive Data 2

-#define AT91C_PB13_NPCS01         (AT91C_PIO_PB13) //  SPI 0 Peripheral Chip Select 1

-#define AT91C_PIO_PB14            (1 << 14) // Pin Controlled by PB14

-#define AT91C_PB14_ERX3           (AT91C_PIO_PB14) //  Ethernet MAC Receive Data 3

-#define AT91C_PB14_NPCS02         (AT91C_PIO_PB14) //  SPI 0 Peripheral Chip Select 2

-#define AT91C_PIO_PB15            (1 << 15) // Pin Controlled by PB15

-#define AT91C_PB15_ERXDV          (AT91C_PIO_PB15) //  Ethernet MAC Receive Data Valid

-#define AT91C_PIO_PB16            (1 << 16) // Pin Controlled by PB16

-#define AT91C_PB16_ECOL           (AT91C_PIO_PB16) //  Ethernet MAC Collision Detected

-#define AT91C_PB16_NPCS13         (AT91C_PIO_PB16) //  SPI 1 Peripheral Chip Select 3

-#define AT91C_PIO_PB17            (1 << 17) // Pin Controlled by PB17

-#define AT91C_PB17_ERXCK          (AT91C_PIO_PB17) //  Ethernet MAC Receive Clock

-#define AT91C_PB17_NPCS03         (AT91C_PIO_PB17) //  SPI 0 Peripheral Chip Select 3

-#define AT91C_PIO_PB18            (1 << 18) // Pin Controlled by PB18

-#define AT91C_PB18_EF100          (AT91C_PIO_PB18) //  Ethernet MAC Force 100 Mbits/sec

-#define AT91C_PB18_ADTRG          (AT91C_PIO_PB18) //  ADC External Trigger

-#define AT91C_PIO_PB19            (1 << 19) // Pin Controlled by PB19

-#define AT91C_PB19_PWM0           (AT91C_PIO_PB19) //  PWM Channel 0

-#define AT91C_PB19_TCLK1          (AT91C_PIO_PB19) //  Timer Counter 1 external clock input

-#define AT91C_PIO_PB2             (1 <<  2) // Pin Controlled by PB2

-#define AT91C_PB2_ETX0            (AT91C_PIO_PB2) //  Ethernet MAC Transmit Data 0

-#define AT91C_PIO_PB20            (1 << 20) // Pin Controlled by PB20

-#define AT91C_PB20_PWM1           (AT91C_PIO_PB20) //  PWM Channel 1

-#define AT91C_PB20_PCK0           (AT91C_PIO_PB20) //  PMC Programmable Clock Output 0

-#define AT91C_PIO_PB21            (1 << 21) // Pin Controlled by PB21

-#define AT91C_PB21_PWM2           (AT91C_PIO_PB21) //  PWM Channel 2

-#define AT91C_PB21_PCK1           (AT91C_PIO_PB21) //  PMC Programmable Clock Output 1

-#define AT91C_PIO_PB22            (1 << 22) // Pin Controlled by PB22

-#define AT91C_PB22_PWM3           (AT91C_PIO_PB22) //  PWM Channel 3

-#define AT91C_PB22_PCK2           (AT91C_PIO_PB22) //  PMC Programmable Clock Output 2

-#define AT91C_PIO_PB23            (1 << 23) // Pin Controlled by PB23

-#define AT91C_PB23_TIOA0          (AT91C_PIO_PB23) //  Timer Counter 0 Multipurpose Timer I/O Pin A

-#define AT91C_PB23_DCD1           (AT91C_PIO_PB23) //  USART 1 Data Carrier Detect

-#define AT91C_PIO_PB24            (1 << 24) // Pin Controlled by PB24

-#define AT91C_PB24_TIOB0          (AT91C_PIO_PB24) //  Timer Counter 0 Multipurpose Timer I/O Pin B

-#define AT91C_PB24_DSR1           (AT91C_PIO_PB24) //  USART 1 Data Set ready

-#define AT91C_PIO_PB25            (1 << 25) // Pin Controlled by PB25

-#define AT91C_PB25_TIOA1          (AT91C_PIO_PB25) //  Timer Counter 1 Multipurpose Timer I/O Pin A

-#define AT91C_PB25_DTR1           (AT91C_PIO_PB25) //  USART 1 Data Terminal ready

-#define AT91C_PIO_PB26            (1 << 26) // Pin Controlled by PB26

-#define AT91C_PB26_TIOB1          (AT91C_PIO_PB26) //  Timer Counter 1 Multipurpose Timer I/O Pin B

-#define AT91C_PB26_RI1            (AT91C_PIO_PB26) //  USART 1 Ring Indicator

-#define AT91C_PIO_PB27            (1 << 27) // Pin Controlled by PB27

-#define AT91C_PB27_TIOA2          (AT91C_PIO_PB27) //  Timer Counter 2 Multipurpose Timer I/O Pin A

-#define AT91C_PB27_PWM0           (AT91C_PIO_PB27) //  PWM Channel 0

-#define AT91C_PIO_PB28            (1 << 28) // Pin Controlled by PB28

-#define AT91C_PB28_TIOB2          (AT91C_PIO_PB28) //  Timer Counter 2 Multipurpose Timer I/O Pin B

-#define AT91C_PB28_PWM1           (AT91C_PIO_PB28) //  PWM Channel 1

-#define AT91C_PIO_PB29            (1 << 29) // Pin Controlled by PB29

-#define AT91C_PB29_PCK1           (AT91C_PIO_PB29) //  PMC Programmable Clock Output 1

-#define AT91C_PB29_PWM2           (AT91C_PIO_PB29) //  PWM Channel 2

-#define AT91C_PIO_PB3             (1 <<  3) // Pin Controlled by PB3

-#define AT91C_PB3_ETX1            (AT91C_PIO_PB3) //  Ethernet MAC Transmit Data 1

-#define AT91C_PIO_PB30            (1 << 30) // Pin Controlled by PB30

-#define AT91C_PB30_PCK2           (AT91C_PIO_PB30) //  PMC Programmable Clock Output 2

-#define AT91C_PB30_PWM3           (AT91C_PIO_PB30) //  PWM Channel 3

-#define AT91C_PIO_PB4             (1 <<  4) // Pin Controlled by PB4

-#define AT91C_PB4_ECRS_ECRSDV     (AT91C_PIO_PB4) //  Ethernet MAC Carrier Sense/Carrier Sense and Data Valid

-#define AT91C_PIO_PB5             (1 <<  5) // Pin Controlled by PB5

-#define AT91C_PB5_ERX0            (AT91C_PIO_PB5) //  Ethernet MAC Receive Data 0

-#define AT91C_PIO_PB6             (1 <<  6) // Pin Controlled by PB6

-#define AT91C_PB6_ERX1            (AT91C_PIO_PB6) //  Ethernet MAC Receive Data 1

-#define AT91C_PIO_PB7             (1 <<  7) // Pin Controlled by PB7

-#define AT91C_PB7_ERXER           (AT91C_PIO_PB7) //  Ethernet MAC Receive Error

-#define AT91C_PIO_PB8             (1 <<  8) // Pin Controlled by PB8

-#define AT91C_PB8_EMDC            (AT91C_PIO_PB8) //  Ethernet MAC Management Data Clock

-#define AT91C_PIO_PB9             (1 <<  9) // Pin Controlled by PB9

-#define AT91C_PB9_EMDIO           (AT91C_PIO_PB9) //  Ethernet MAC Management Data Input/Output

-

-// *****************************************************************************

-//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256

-// *****************************************************************************

-#define AT91C_ID_FIQ              ( 0) // Advanced Interrupt Controller (FIQ)

-#define AT91C_ID_SYS              ( 1) // System Peripheral

-#define AT91C_ID_PIOA             ( 2) // Parallel IO Controller A

-#define AT91C_ID_PIOB             ( 3) // Parallel IO Controller B

-#define AT91C_ID_SPI0             ( 4) // Serial Peripheral Interface 0

-#define AT91C_ID_SPI1             ( 5) // Serial Peripheral Interface 1

-#define AT91C_ID_US0              ( 6) // USART 0

-#define AT91C_ID_US1              ( 7) // USART 1

-#define AT91C_ID_SSC              ( 8) // Serial Synchronous Controller

-#define AT91C_ID_TWI              ( 9) // Two-Wire Interface

-#define AT91C_ID_PWMC             (10) // PWM Controller

-#define AT91C_ID_UDP              (11) // USB Device Port

-#define AT91C_ID_TC0              (12) // Timer Counter 0

-#define AT91C_ID_TC1              (13) // Timer Counter 1

-#define AT91C_ID_TC2              (14) // Timer Counter 2

-#define AT91C_ID_CAN              (15) // Control Area Network Controller

-#define AT91C_ID_EMAC             (16) // Ethernet MAC

-#define AT91C_ID_ADC              (17) // Analog-to-Digital Converter

-#define AT91C_ID_AES              (18) // Advanced Encryption Standard 128-bit

-#define AT91C_ID_TDES             (19) // Triple Data Encryption Standard

-#define AT91C_ID_20_Reserved      (20) // Reserved

-#define AT91C_ID_21_Reserved      (21) // Reserved

-#define AT91C_ID_22_Reserved      (22) // Reserved

-#define AT91C_ID_23_Reserved      (23) // Reserved

-#define AT91C_ID_24_Reserved      (24) // Reserved

-#define AT91C_ID_25_Reserved      (25) // Reserved

-#define AT91C_ID_26_Reserved      (26) // Reserved

-#define AT91C_ID_27_Reserved      (27) // Reserved

-#define AT91C_ID_28_Reserved      (28) // Reserved

-#define AT91C_ID_29_Reserved      (29) // Reserved

-#define AT91C_ID_IRQ0             (30) // Advanced Interrupt Controller (IRQ0)

-#define AT91C_ID_IRQ1             (31) // Advanced Interrupt Controller (IRQ1)

-

-// *****************************************************************************

-//               BASE ADDRESS DEFINITIONS FOR AT91SAM7X256

-// *****************************************************************************

-#define AT91C_BASE_SYS            (0xFFFFF000) // (SYS) Base Address

-#define AT91C_BASE_AIC            (0xFFFFF000) // (AIC) Base Address

-#define AT91C_BASE_PDC_DBGU       (0xFFFFF300) // (PDC_DBGU) Base Address

-#define AT91C_BASE_DBGU           (0xFFFFF200) // (DBGU) Base Address

-#define AT91C_BASE_PIOA           (0xFFFFF400) // (PIOA) Base Address

-#define AT91C_BASE_PIOB           (0xFFFFF600) // (PIOB) Base Address

-#define AT91C_BASE_CKGR           (0xFFFFFC20) // (CKGR) Base Address

-#define AT91C_BASE_PMC            (0xFFFFFC00) // (PMC) Base Address

-#define AT91C_BASE_RSTC           (0xFFFFFD00) // (RSTC) Base Address

-#define AT91C_BASE_RTTC           (0xFFFFFD20) // (RTTC) Base Address

-#define AT91C_BASE_PITC           (0xFFFFFD30) // (PITC) Base Address

-#define AT91C_BASE_WDTC           (0xFFFFFD40) // (WDTC) Base Address

-#define AT91C_BASE_VREG           (0xFFFFFD60) // (VREG) Base Address

-#define AT91C_BASE_MC             (0xFFFFFF00) // (MC) Base Address

-#define AT91C_BASE_PDC_SPI1       (0xFFFE4100) // (PDC_SPI1) Base Address

-#define AT91C_BASE_SPI1           (0xFFFE4000) // (SPI1) Base Address

-#define AT91C_BASE_PDC_SPI0       (0xFFFE0100) // (PDC_SPI0) Base Address

-#define AT91C_BASE_SPI0           (0xFFFE0000) // (SPI0) Base Address

-#define AT91C_BASE_PDC_US1        (0xFFFC4100) // (PDC_US1) Base Address

-#define AT91C_BASE_US1            (0xFFFC4000) // (US1) Base Address

-#define AT91C_BASE_PDC_US0        (0xFFFC0100) // (PDC_US0) Base Address

-#define AT91C_BASE_US0            (0xFFFC0000) // (US0) Base Address

-#define AT91C_BASE_PDC_SSC        (0xFFFD4100) // (PDC_SSC) Base Address

-#define AT91C_BASE_SSC            (0xFFFD4000) // (SSC) Base Address

-#define AT91C_BASE_TWI            (0xFFFB8000) // (TWI) Base Address

-#define AT91C_BASE_PWMC_CH3       (0xFFFCC260) // (PWMC_CH3) Base Address

-#define AT91C_BASE_PWMC_CH2       (0xFFFCC240) // (PWMC_CH2) Base Address

-#define AT91C_BASE_PWMC_CH1       (0xFFFCC220) // (PWMC_CH1) Base Address

-#define AT91C_BASE_PWMC_CH0       (0xFFFCC200) // (PWMC_CH0) Base Address

-#define AT91C_BASE_PWMC           (0xFFFCC000) // (PWMC) Base Address

-#define AT91C_BASE_UDP            (0xFFFB0000) // (UDP) Base Address

-#define AT91C_BASE_TC0            (0xFFFA0000) // (TC0) Base Address

-#define AT91C_BASE_TC1            (0xFFFA0040) // (TC1) Base Address

-#define AT91C_BASE_TC2            (0xFFFA0080) // (TC2) Base Address

-#define AT91C_BASE_TCB            (0xFFFA0000) // (TCB) Base Address

-#define AT91C_BASE_CAN_MB0        (0xFFFD0200) // (CAN_MB0) Base Address

-#define AT91C_BASE_CAN_MB1        (0xFFFD0220) // (CAN_MB1) Base Address

-#define AT91C_BASE_CAN_MB2        (0xFFFD0240) // (CAN_MB2) Base Address

-#define AT91C_BASE_CAN_MB3        (0xFFFD0260) // (CAN_MB3) Base Address

-#define AT91C_BASE_CAN_MB4        (0xFFFD0280) // (CAN_MB4) Base Address

-#define AT91C_BASE_CAN_MB5        (0xFFFD02A0) // (CAN_MB5) Base Address

-#define AT91C_BASE_CAN_MB6        (0xFFFD02C0) // (CAN_MB6) Base Address

-#define AT91C_BASE_CAN_MB7        (0xFFFD02E0) // (CAN_MB7) Base Address

-#define AT91C_BASE_CAN            (0xFFFD0000) // (CAN) Base Address

-#define AT91C_BASE_EMAC           (0xFFFDC000) // (EMAC) Base Address

-#define AT91C_BASE_PDC_ADC        (0xFFFD8100) // (PDC_ADC) Base Address

-#define AT91C_BASE_ADC            (0xFFFD8000) // (ADC) Base Address

-#define AT91C_BASE_PDC_AES        (0xFFFA4100) // (PDC_AES) Base Address

-#define AT91C_BASE_AES            (0xFFFA4000) // (AES) Base Address

-#define AT91C_BASE_PDC_TDES       (0xFFFA8100) // (PDC_TDES) Base Address

-#define AT91C_BASE_TDES           (0xFFFA8000) // (TDES) Base Address

-

-// *****************************************************************************

-//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256

-// *****************************************************************************

-#define AT91C_ISRAM	              (0x00200000) // Internal SRAM base address

-#define AT91C_ISRAM_SIZE	         (0x00010000) // Internal SRAM size in byte (64 Kbyte)

-#define AT91C_IFLASH	             (0x00100000) // Internal ROM base address

-#define AT91C_IFLASH_SIZE	        (0x00040000) // Internal ROM size in byte (256 Kbyte)

-

-

+//  ----------------------------------------------------------------------------
+//          ATMEL Microcontroller Software Support  -  ROUSSET  -
+//  ----------------------------------------------------------------------------
+//  DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+//  DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//  ----------------------------------------------------------------------------
+// File Name           : AT91SAM7X256.h
+// Object              : AT91SAM7X256 definitions
+// Generated           : AT91 SW Application Group  05/20/2005 (16:22:29)
+//
+// CVS Reference       : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005//
+// CVS Reference       : /SYS_SAM7X.pl/1.3/Tue Feb  1 17:01:43 2005//
+// CVS Reference       : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005//
+// CVS Reference       : /PMC_SAM7X.pl/1.4/Tue Feb  8 13:58:10 2005//
+// CVS Reference       : /RSTC_SAM7X.pl/1.1/Tue Feb  1 16:16:26 2005//
+// CVS Reference       : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005//
+// CVS Reference       : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005//
+// CVS Reference       : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005//
+// CVS Reference       : /PIO_6057A.pl/1.2/Thu Feb  3 10:18:28 2005//
+// CVS Reference       : /RTTC_6081A.pl/1.2/Tue Nov  9 14:43:58 2004//
+// CVS Reference       : /PITC_6079A.pl/1.2/Tue Nov  9 14:43:56 2004//
+// CVS Reference       : /WDTC_6080A.pl/1.3/Tue Nov  9 14:44:00 2004//
+// CVS Reference       : /VREG_6085B.pl/1.1/Tue Feb  1 16:05:48 2005//
+// CVS Reference       : /PDC_6074C.pl/1.2/Thu Feb  3 08:48:54 2005//
+// CVS Reference       : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005//
+// CVS Reference       : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005//
+// CVS Reference       : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004//
+// CVS Reference       : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004//
+// CVS Reference       : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004//
+// CVS Reference       : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005//
+// CVS Reference       : /CAN_6019B.pl/1.1/Tue Mar  8 12:42:22 2005//
+// CVS Reference       : /EMACB_6119A.pl/1.5/Thu Feb  3 15:52:04 2005//
+// CVS Reference       : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003//
+// CVS Reference       : /AES_6149A.pl/1.10/Mon Feb  7 09:44:25 2005//
+// CVS Reference       : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005//
+//  ----------------------------------------------------------------------------
+
+// Hardware register definition
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR System Peripherals
+// *****************************************************************************
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Advanced Interrupt Controller
+// *****************************************************************************
+// *** Register offset in AT91S_AIC structure ***
+#define AIC_SMR         ( 0) // Source Mode Register
+#define AIC_SVR         (128) // Source Vector Register
+#define AIC_IVR         (256) // IRQ Vector Register
+#define AIC_FVR         (260) // FIQ Vector Register
+#define AIC_ISR         (264) // Interrupt Status Register
+#define AIC_IPR         (268) // Interrupt Pending Register
+#define AIC_IMR         (272) // Interrupt Mask Register
+#define AIC_CISR        (276) // Core Interrupt Status Register
+#define AIC_IECR        (288) // Interrupt Enable Command Register
+#define AIC_IDCR        (292) // Interrupt Disable Command Register
+#define AIC_ICCR        (296) // Interrupt Clear Command Register
+#define AIC_ISCR        (300) // Interrupt Set Command Register
+#define AIC_EOICR       (304) // End of Interrupt Command Register
+#define AIC_SPU         (308) // Spurious Vector Register
+#define AIC_DCR         (312) // Debug Control Register (Protect)
+#define AIC_FFER        (320) // Fast Forcing Enable Register
+#define AIC_FFDR        (324) // Fast Forcing Disable Register
+#define AIC_FFSR        (328) // Fast Forcing Status Register
+// -------- AIC_SMR : (AIC Offset: 0x0) Control Register --------
+#define AT91C_AIC_PRIOR           (0x7 <<  0) // (AIC) Priority Level
+#define     AT91C_AIC_PRIOR_LOWEST               (0x0) // (AIC) Lowest priority level
+#define     AT91C_AIC_PRIOR_HIGHEST              (0x7) // (AIC) Highest priority level
+#define AT91C_AIC_SRCTYPE         (0x3 <<  5) // (AIC) Interrupt Source Type
+#define     AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL       (0x0 <<  5) // (AIC) Internal Sources Code Label High-level Sensitive
+#define     AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL        (0x0 <<  5) // (AIC) External Sources Code Label Low-level Sensitive
+#define     AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE    (0x1 <<  5) // (AIC) Internal Sources Code Label Positive Edge triggered
+#define     AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE    (0x1 <<  5) // (AIC) External Sources Code Label Negative Edge triggered
+#define     AT91C_AIC_SRCTYPE_HIGH_LEVEL           (0x2 <<  5) // (AIC) Internal Or External Sources Code Label High-level Sensitive
+#define     AT91C_AIC_SRCTYPE_POSITIVE_EDGE        (0x3 <<  5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered
+// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register --------
+#define AT91C_AIC_NFIQ            (0x1 <<  0) // (AIC) NFIQ Status
+#define AT91C_AIC_NIRQ            (0x1 <<  1) // (AIC) NIRQ Status
+// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) --------
+#define AT91C_AIC_DCR_PROT        (0x1 <<  0) // (AIC) Protection Mode
+#define AT91C_AIC_DCR_GMSK        (0x1 <<  1) // (AIC) General Mask
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Peripheral DMA Controller
+// *****************************************************************************
+// *** Register offset in AT91S_PDC structure ***
+#define PDC_RPR         ( 0) // Receive Pointer Register
+#define PDC_RCR         ( 4) // Receive Counter Register
+#define PDC_TPR         ( 8) // Transmit Pointer Register
+#define PDC_TCR         (12) // Transmit Counter Register
+#define PDC_RNPR        (16) // Receive Next Pointer Register
+#define PDC_RNCR        (20) // Receive Next Counter Register
+#define PDC_TNPR        (24) // Transmit Next Pointer Register
+#define PDC_TNCR        (28) // Transmit Next Counter Register
+#define PDC_PTCR        (32) // PDC Transfer Control Register
+#define PDC_PTSR        (36) // PDC Transfer Status Register
+// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register --------
+#define AT91C_PDC_RXTEN           (0x1 <<  0) // (PDC) Receiver Transfer Enable
+#define AT91C_PDC_RXTDIS          (0x1 <<  1) // (PDC) Receiver Transfer Disable
+#define AT91C_PDC_TXTEN           (0x1 <<  8) // (PDC) Transmitter Transfer Enable
+#define AT91C_PDC_TXTDIS          (0x1 <<  9) // (PDC) Transmitter Transfer Disable
+// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Debug Unit
+// *****************************************************************************
+// *** Register offset in AT91S_DBGU structure ***
+#define DBGU_CR         ( 0) // Control Register
+#define DBGU_MR         ( 4) // Mode Register
+#define DBGU_IER        ( 8) // Interrupt Enable Register
+#define DBGU_IDR        (12) // Interrupt Disable Register
+#define DBGU_IMR        (16) // Interrupt Mask Register
+#define DBGU_CSR        (20) // Channel Status Register
+#define DBGU_RHR        (24) // Receiver Holding Register
+#define DBGU_THR        (28) // Transmitter Holding Register
+#define DBGU_BRGR       (32) // Baud Rate Generator Register
+#define DBGU_CIDR       (64) // Chip ID Register
+#define DBGU_EXID       (68) // Chip ID Extension Register
+#define DBGU_FNTR       (72) // Force NTRST Register
+#define DBGU_RPR        (256) // Receive Pointer Register
+#define DBGU_RCR        (260) // Receive Counter Register
+#define DBGU_TPR        (264) // Transmit Pointer Register
+#define DBGU_TCR        (268) // Transmit Counter Register
+#define DBGU_RNPR       (272) // Receive Next Pointer Register
+#define DBGU_RNCR       (276) // Receive Next Counter Register
+#define DBGU_TNPR       (280) // Transmit Next Pointer Register
+#define DBGU_TNCR       (284) // Transmit Next Counter Register
+#define DBGU_PTCR       (288) // PDC Transfer Control Register
+#define DBGU_PTSR       (292) // PDC Transfer Status Register
+// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_RSTRX            (0x1 <<  2) // (DBGU) Reset Receiver
+#define AT91C_US_RSTTX            (0x1 <<  3) // (DBGU) Reset Transmitter
+#define AT91C_US_RXEN             (0x1 <<  4) // (DBGU) Receiver Enable
+#define AT91C_US_RXDIS            (0x1 <<  5) // (DBGU) Receiver Disable
+#define AT91C_US_TXEN             (0x1 <<  6) // (DBGU) Transmitter Enable
+#define AT91C_US_TXDIS            (0x1 <<  7) // (DBGU) Transmitter Disable
+#define AT91C_US_RSTSTA           (0x1 <<  8) // (DBGU) Reset Status Bits
+// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_PAR              (0x7 <<  9) // (DBGU) Parity type
+#define     AT91C_US_PAR_EVEN                 (0x0 <<  9) // (DBGU) Even Parity
+#define     AT91C_US_PAR_ODD                  (0x1 <<  9) // (DBGU) Odd Parity
+#define     AT91C_US_PAR_SPACE                (0x2 <<  9) // (DBGU) Parity forced to 0 (Space)
+#define     AT91C_US_PAR_MARK                 (0x3 <<  9) // (DBGU) Parity forced to 1 (Mark)
+#define     AT91C_US_PAR_NONE                 (0x4 <<  9) // (DBGU) No Parity
+#define     AT91C_US_PAR_MULTI_DROP           (0x6 <<  9) // (DBGU) Multi-drop mode
+#define AT91C_US_CHMODE           (0x3 << 14) // (DBGU) Channel Mode
+#define     AT91C_US_CHMODE_NORMAL               (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART.
+#define     AT91C_US_CHMODE_AUTO                 (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin.
+#define     AT91C_US_CHMODE_LOCAL                (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.
+#define     AT91C_US_CHMODE_REMOTE               (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin.
+// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXRDY            (0x1 <<  0) // (DBGU) RXRDY Interrupt
+#define AT91C_US_TXRDY            (0x1 <<  1) // (DBGU) TXRDY Interrupt
+#define AT91C_US_ENDRX            (0x1 <<  3) // (DBGU) End of Receive Transfer Interrupt
+#define AT91C_US_ENDTX            (0x1 <<  4) // (DBGU) End of Transmit Interrupt
+#define AT91C_US_OVRE             (0x1 <<  5) // (DBGU) Overrun Interrupt
+#define AT91C_US_FRAME            (0x1 <<  6) // (DBGU) Framing Error Interrupt
+#define AT91C_US_PARE             (0x1 <<  7) // (DBGU) Parity Error Interrupt
+#define AT91C_US_TXEMPTY          (0x1 <<  9) // (DBGU) TXEMPTY Interrupt
+#define AT91C_US_TXBUFE           (0x1 << 11) // (DBGU) TXBUFE Interrupt
+#define AT91C_US_RXBUFF           (0x1 << 12) // (DBGU) RXBUFF Interrupt
+#define AT91C_US_COMM_TX          (0x1 << 30) // (DBGU) COMM_TX Interrupt
+#define AT91C_US_COMM_RX          (0x1 << 31) // (DBGU) COMM_RX Interrupt
+// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register --------
+// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register --------
+#define AT91C_US_FORCE_NTRST      (0x1 <<  0) // (DBGU) Force NTRST in JTAG
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Parallel Input Output Controler
+// *****************************************************************************
+// *** Register offset in AT91S_PIO structure ***
+#define PIO_PER         ( 0) // PIO Enable Register
+#define PIO_PDR         ( 4) // PIO Disable Register
+#define PIO_PSR         ( 8) // PIO Status Register
+#define PIO_OER         (16) // Output Enable Register
+#define PIO_ODR         (20) // Output Disable Registerr
+#define PIO_OSR         (24) // Output Status Register
+#define PIO_IFER        (32) // Input Filter Enable Register
+#define PIO_IFDR        (36) // Input Filter Disable Register
+#define PIO_IFSR        (40) // Input Filter Status Register
+#define PIO_SODR        (48) // Set Output Data Register
+#define PIO_CODR        (52) // Clear Output Data Register
+#define PIO_ODSR        (56) // Output Data Status Register
+#define PIO_PDSR        (60) // Pin Data Status Register
+#define PIO_IER         (64) // Interrupt Enable Register
+#define PIO_IDR         (68) // Interrupt Disable Register
+#define PIO_IMR         (72) // Interrupt Mask Register
+#define PIO_ISR         (76) // Interrupt Status Register
+#define PIO_MDER        (80) // Multi-driver Enable Register
+#define PIO_MDDR        (84) // Multi-driver Disable Register
+#define PIO_MDSR        (88) // Multi-driver Status Register
+#define PIO_PPUDR       (96) // Pull-up Disable Register
+#define PIO_PPUER       (100) // Pull-up Enable Register
+#define PIO_PPUSR       (104) // Pull-up Status Register
+#define PIO_ASR         (112) // Select A Register
+#define PIO_BSR         (116) // Select B Register
+#define PIO_ABSR        (120) // AB Select Status Register
+#define PIO_OWER        (160) // Output Write Enable Register
+#define PIO_OWDR        (164) // Output Write Disable Register
+#define PIO_OWSR        (168) // Output Write Status Register
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Clock Generator Controler
+// *****************************************************************************
+// *** Register offset in AT91S_CKGR structure ***
+#define CKGR_MOR        ( 0) // Main Oscillator Register
+#define CKGR_MCFR       ( 4) // Main Clock  Frequency Register
+#define CKGR_PLLR       (12) // PLL Register
+// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register --------
+#define AT91C_CKGR_MOSCEN         (0x1 <<  0) // (CKGR) Main Oscillator Enable
+#define AT91C_CKGR_OSCBYPASS      (0x1 <<  1) // (CKGR) Main Oscillator Bypass
+#define AT91C_CKGR_OSCOUNT        (0xFF <<  8) // (CKGR) Main Oscillator Start-up Time
+// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register --------
+#define AT91C_CKGR_MAINF          (0xFFFF <<  0) // (CKGR) Main Clock Frequency
+#define AT91C_CKGR_MAINRDY        (0x1 << 16) // (CKGR) Main Clock Ready
+// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register --------
+#define AT91C_CKGR_DIV            (0xFF <<  0) // (CKGR) Divider Selected
+#define     AT91C_CKGR_DIV_0                    (0x0) // (CKGR) Divider output is 0
+#define     AT91C_CKGR_DIV_BYPASS               (0x1) // (CKGR) Divider is bypassed
+#define AT91C_CKGR_PLLCOUNT       (0x3F <<  8) // (CKGR) PLL Counter
+#define AT91C_CKGR_OUT            (0x3 << 14) // (CKGR) PLL Output Frequency Range
+#define     AT91C_CKGR_OUT_0                    (0x0 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_1                    (0x1 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_2                    (0x2 << 14) // (CKGR) Please refer to the PLL datasheet
+#define     AT91C_CKGR_OUT_3                    (0x3 << 14) // (CKGR) Please refer to the PLL datasheet
+#define AT91C_CKGR_MUL            (0x7FF << 16) // (CKGR) PLL Multiplier
+#define AT91C_CKGR_USBDIV         (0x3 << 28) // (CKGR) Divider for USB Clocks
+#define     AT91C_CKGR_USBDIV_0                    (0x0 << 28) // (CKGR) Divider output is PLL clock output
+#define     AT91C_CKGR_USBDIV_1                    (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2
+#define     AT91C_CKGR_USBDIV_2                    (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Power Management Controler
+// *****************************************************************************
+// *** Register offset in AT91S_PMC structure ***
+#define PMC_SCER        ( 0) // System Clock Enable Register
+#define PMC_SCDR        ( 4) // System Clock Disable Register
+#define PMC_SCSR        ( 8) // System Clock Status Register
+#define PMC_PCER        (16) // Peripheral Clock Enable Register
+#define PMC_PCDR        (20) // Peripheral Clock Disable Register
+#define PMC_PCSR        (24) // Peripheral Clock Status Register
+#define PMC_MOR         (32) // Main Oscillator Register
+#define PMC_MCFR        (36) // Main Clock  Frequency Register
+#define PMC_PLLR        (44) // PLL Register
+#define PMC_MCKR        (48) // Master Clock Register
+#define PMC_PCKR        (64) // Programmable Clock Register
+#define PMC_IER         (96) // Interrupt Enable Register
+#define PMC_IDR         (100) // Interrupt Disable Register
+#define PMC_SR          (104) // Status Register
+#define PMC_IMR         (108) // Interrupt Mask Register
+// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register --------
+#define AT91C_PMC_PCK             (0x1 <<  0) // (PMC) Processor Clock
+#define AT91C_PMC_UDP             (0x1 <<  7) // (PMC) USB Device Port Clock
+#define AT91C_PMC_PCK0            (0x1 <<  8) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK1            (0x1 <<  9) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK2            (0x1 << 10) // (PMC) Programmable Clock Output
+#define AT91C_PMC_PCK3            (0x1 << 11) // (PMC) Programmable Clock Output
+// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register --------
+// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register --------
+// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register --------
+// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register --------
+// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register --------
+// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register --------
+#define AT91C_PMC_CSS             (0x3 <<  0) // (PMC) Programmable Clock Selection
+#define     AT91C_PMC_CSS_SLOW_CLK             (0x0) // (PMC) Slow Clock is selected
+#define     AT91C_PMC_CSS_MAIN_CLK             (0x1) // (PMC) Main Clock is selected
+#define     AT91C_PMC_CSS_PLL_CLK              (0x3) // (PMC) Clock from PLL is selected
+#define AT91C_PMC_PRES            (0x7 <<  2) // (PMC) Programmable Clock Prescaler
+#define     AT91C_PMC_PRES_CLK                  (0x0 <<  2) // (PMC) Selected clock
+#define     AT91C_PMC_PRES_CLK_2                (0x1 <<  2) // (PMC) Selected clock divided by 2
+#define     AT91C_PMC_PRES_CLK_4                (0x2 <<  2) // (PMC) Selected clock divided by 4
+#define     AT91C_PMC_PRES_CLK_8                (0x3 <<  2) // (PMC) Selected clock divided by 8
+#define     AT91C_PMC_PRES_CLK_16               (0x4 <<  2) // (PMC) Selected clock divided by 16
+#define     AT91C_PMC_PRES_CLK_32               (0x5 <<  2) // (PMC) Selected clock divided by 32
+#define     AT91C_PMC_PRES_CLK_64               (0x6 <<  2) // (PMC) Selected clock divided by 64
+// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register --------
+// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register --------
+#define AT91C_PMC_MOSCS           (0x1 <<  0) // (PMC) MOSC Status/Enable/Disable/Mask
+#define AT91C_PMC_LOCK            (0x1 <<  2) // (PMC) PLL Status/Enable/Disable/Mask
+#define AT91C_PMC_MCKRDY          (0x1 <<  3) // (PMC) MCK_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK0RDY         (0x1 <<  8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK1RDY         (0x1 <<  9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK2RDY         (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask
+#define AT91C_PMC_PCK3RDY         (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask
+// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register --------
+// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register --------
+// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Reset Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_RSTC structure ***
+#define RSTC_RCR        ( 0) // Reset Control Register
+#define RSTC_RSR        ( 4) // Reset Status Register
+#define RSTC_RMR        ( 8) // Reset Mode Register
+// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register --------
+#define AT91C_RSTC_PROCRST        (0x1 <<  0) // (RSTC) Processor Reset
+#define AT91C_RSTC_PERRST         (0x1 <<  2) // (RSTC) Peripheral Reset
+#define AT91C_RSTC_EXTRST         (0x1 <<  3) // (RSTC) External Reset
+#define AT91C_RSTC_KEY            (0xFF << 24) // (RSTC) Password
+// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register --------
+#define AT91C_RSTC_URSTS          (0x1 <<  0) // (RSTC) User Reset Status
+#define AT91C_RSTC_BODSTS         (0x1 <<  1) // (RSTC) Brownout Detection Status
+#define AT91C_RSTC_RSTTYP         (0x7 <<  8) // (RSTC) Reset Type
+#define     AT91C_RSTC_RSTTYP_POWERUP              (0x0 <<  8) // (RSTC) Power-up Reset. VDDCORE rising.
+#define     AT91C_RSTC_RSTTYP_WAKEUP               (0x1 <<  8) // (RSTC) WakeUp Reset. VDDCORE rising.
+#define     AT91C_RSTC_RSTTYP_WATCHDOG             (0x2 <<  8) // (RSTC) Watchdog Reset. Watchdog overflow occured.
+#define     AT91C_RSTC_RSTTYP_SOFTWARE             (0x3 <<  8) // (RSTC) Software Reset. Processor reset required by the software.
+#define     AT91C_RSTC_RSTTYP_USER                 (0x4 <<  8) // (RSTC) User Reset. NRST pin detected low.
+#define     AT91C_RSTC_RSTTYP_BROWNOUT             (0x5 <<  8) // (RSTC) Brownout Reset occured.
+#define AT91C_RSTC_NRSTL          (0x1 << 16) // (RSTC) NRST pin level
+#define AT91C_RSTC_SRCMP          (0x1 << 17) // (RSTC) Software Reset Command in Progress.
+// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register --------
+#define AT91C_RSTC_URSTEN         (0x1 <<  0) // (RSTC) User Reset Enable
+#define AT91C_RSTC_URSTIEN        (0x1 <<  4) // (RSTC) User Reset Interrupt Enable
+#define AT91C_RSTC_ERSTL          (0xF <<  8) // (RSTC) User Reset Enable
+#define AT91C_RSTC_BODIEN         (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Real Time Timer Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_RTTC structure ***
+#define RTTC_RTMR       ( 0) // Real-time Mode Register
+#define RTTC_RTAR       ( 4) // Real-time Alarm Register
+#define RTTC_RTVR       ( 8) // Real-time Value Register
+#define RTTC_RTSR       (12) // Real-time Status Register
+// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register --------
+#define AT91C_RTTC_RTPRES         (0xFFFF <<  0) // (RTTC) Real-time Timer Prescaler Value
+#define AT91C_RTTC_ALMIEN         (0x1 << 16) // (RTTC) Alarm Interrupt Enable
+#define AT91C_RTTC_RTTINCIEN      (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable
+#define AT91C_RTTC_RTTRST         (0x1 << 18) // (RTTC) Real Time Timer Restart
+// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register --------
+#define AT91C_RTTC_ALMV           (0x0 <<  0) // (RTTC) Alarm Value
+// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register --------
+#define AT91C_RTTC_CRTV           (0x0 <<  0) // (RTTC) Current Real-time Value
+// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register --------
+#define AT91C_RTTC_ALMS           (0x1 <<  0) // (RTTC) Real-time Alarm Status
+#define AT91C_RTTC_RTTINC         (0x1 <<  1) // (RTTC) Real-time Timer Increment
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Periodic Interval Timer Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_PITC structure ***
+#define PITC_PIMR       ( 0) // Period Interval Mode Register
+#define PITC_PISR       ( 4) // Period Interval Status Register
+#define PITC_PIVR       ( 8) // Period Interval Value Register
+#define PITC_PIIR       (12) // Period Interval Image Register
+// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register --------
+#define AT91C_PITC_PIV            (0xFFFFF <<  0) // (PITC) Periodic Interval Value
+#define AT91C_PITC_PITEN          (0x1 << 24) // (PITC) Periodic Interval Timer Enabled
+#define AT91C_PITC_PITIEN         (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable
+// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register --------
+#define AT91C_PITC_PITS           (0x1 <<  0) // (PITC) Periodic Interval Timer Status
+// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register --------
+#define AT91C_PITC_CPIV           (0xFFFFF <<  0) // (PITC) Current Periodic Interval Value
+#define AT91C_PITC_PICNT          (0xFFF << 20) // (PITC) Periodic Interval Counter
+// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Watchdog Timer Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_WDTC structure ***
+#define WDTC_WDCR       ( 0) // Watchdog Control Register
+#define WDTC_WDMR       ( 4) // Watchdog Mode Register
+#define WDTC_WDSR       ( 8) // Watchdog Status Register
+// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register --------
+#define AT91C_WDTC_WDRSTT         (0x1 <<  0) // (WDTC) Watchdog Restart
+#define AT91C_WDTC_KEY            (0xFF << 24) // (WDTC) Watchdog KEY Password
+// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register --------
+#define AT91C_WDTC_WDV            (0xFFF <<  0) // (WDTC) Watchdog Timer Restart
+#define AT91C_WDTC_WDFIEN         (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable
+#define AT91C_WDTC_WDRSTEN        (0x1 << 13) // (WDTC) Watchdog Reset Enable
+#define AT91C_WDTC_WDRPROC        (0x1 << 14) // (WDTC) Watchdog Timer Restart
+#define AT91C_WDTC_WDDIS          (0x1 << 15) // (WDTC) Watchdog Disable
+#define AT91C_WDTC_WDD            (0xFFF << 16) // (WDTC) Watchdog Delta Value
+#define AT91C_WDTC_WDDBGHLT       (0x1 << 28) // (WDTC) Watchdog Debug Halt
+#define AT91C_WDTC_WDIDLEHLT      (0x1 << 29) // (WDTC) Watchdog Idle Halt
+// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register --------
+#define AT91C_WDTC_WDUNF          (0x1 <<  0) // (WDTC) Watchdog Underflow
+#define AT91C_WDTC_WDERR          (0x1 <<  1) // (WDTC) Watchdog Error
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Voltage Regulator Mode Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_VREG structure ***
+#define VREG_MR         ( 0) // Voltage Regulator Mode Register
+// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register --------
+#define AT91C_VREG_PSTDBY         (0x1 <<  0) // (VREG) Voltage Regulator Power Standby Mode
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Memory Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_MC structure ***
+#define MC_RCR          ( 0) // MC Remap Control Register
+#define MC_ASR          ( 4) // MC Abort Status Register
+#define MC_AASR         ( 8) // MC Abort Address Status Register
+#define MC_FMR          (96) // MC Flash Mode Register
+#define MC_FCR          (100) // MC Flash Command Register
+#define MC_FSR          (104) // MC Flash Status Register
+// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register --------
+#define AT91C_MC_RCB              (0x1 <<  0) // (MC) Remap Command Bit
+// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register --------
+#define AT91C_MC_UNDADD           (0x1 <<  0) // (MC) Undefined Addess Abort Status
+#define AT91C_MC_MISADD           (0x1 <<  1) // (MC) Misaligned Addess Abort Status
+#define AT91C_MC_ABTSZ            (0x3 <<  8) // (MC) Abort Size Status
+#define     AT91C_MC_ABTSZ_BYTE                 (0x0 <<  8) // (MC) Byte
+#define     AT91C_MC_ABTSZ_HWORD                (0x1 <<  8) // (MC) Half-word
+#define     AT91C_MC_ABTSZ_WORD                 (0x2 <<  8) // (MC) Word
+#define AT91C_MC_ABTTYP           (0x3 << 10) // (MC) Abort Type Status
+#define     AT91C_MC_ABTTYP_DATAR                (0x0 << 10) // (MC) Data Read
+#define     AT91C_MC_ABTTYP_DATAW                (0x1 << 10) // (MC) Data Write
+#define     AT91C_MC_ABTTYP_FETCH                (0x2 << 10) // (MC) Code Fetch
+#define AT91C_MC_MST0             (0x1 << 16) // (MC) Master 0 Abort Source
+#define AT91C_MC_MST1             (0x1 << 17) // (MC) Master 1 Abort Source
+#define AT91C_MC_SVMST0           (0x1 << 24) // (MC) Saved Master 0 Abort Source
+#define AT91C_MC_SVMST1           (0x1 << 25) // (MC) Saved Master 1 Abort Source
+// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register --------
+#define AT91C_MC_FRDY             (0x1 <<  0) // (MC) Flash Ready
+#define AT91C_MC_LOCKE            (0x1 <<  2) // (MC) Lock Error
+#define AT91C_MC_PROGE            (0x1 <<  3) // (MC) Programming Error
+#define AT91C_MC_NEBP             (0x1 <<  7) // (MC) No Erase Before Programming
+#define AT91C_MC_FWS              (0x3 <<  8) // (MC) Flash Wait State
+#define     AT91C_MC_FWS_0FWS                 (0x0 <<  8) // (MC) 1 cycle for Read, 2 for Write operations
+#define     AT91C_MC_FWS_1FWS                 (0x1 <<  8) // (MC) 2 cycles for Read, 3 for Write operations
+#define     AT91C_MC_FWS_2FWS                 (0x2 <<  8) // (MC) 3 cycles for Read, 4 for Write operations
+#define     AT91C_MC_FWS_3FWS                 (0x3 <<  8) // (MC) 4 cycles for Read, 4 for Write operations
+#define AT91C_MC_FMCN             (0xFF << 16) // (MC) Flash Microsecond Cycle Number
+// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register --------
+#define AT91C_MC_FCMD             (0xF <<  0) // (MC) Flash Command
+#define     AT91C_MC_FCMD_START_PROG           (0x1) // (MC) Starts the programming of th epage specified by PAGEN.
+#define     AT91C_MC_FCMD_LOCK                 (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_PROG_AND_LOCK        (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed.
+#define     AT91C_MC_FCMD_UNLOCK               (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN.
+#define     AT91C_MC_FCMD_ERASE_ALL            (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled.
+#define     AT91C_MC_FCMD_SET_GP_NVM           (0xB) // (MC) Set General Purpose NVM bits.
+#define     AT91C_MC_FCMD_CLR_GP_NVM           (0xD) // (MC) Clear General Purpose NVM bits.
+#define     AT91C_MC_FCMD_SET_SECURITY         (0xF) // (MC) Set Security Bit.
+#define AT91C_MC_PAGEN            (0x3FF <<  8) // (MC) Page Number
+#define AT91C_MC_KEY              (0xFF << 24) // (MC) Writing Protect Key
+// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register --------
+#define AT91C_MC_SECURITY         (0x1 <<  4) // (MC) Security Bit Status
+#define AT91C_MC_GPNVM0           (0x1 <<  8) // (MC) Sector 0 Lock Status
+#define AT91C_MC_GPNVM1           (0x1 <<  9) // (MC) Sector 1 Lock Status
+#define AT91C_MC_GPNVM2           (0x1 << 10) // (MC) Sector 2 Lock Status
+#define AT91C_MC_GPNVM3           (0x1 << 11) // (MC) Sector 3 Lock Status
+#define AT91C_MC_GPNVM4           (0x1 << 12) // (MC) Sector 4 Lock Status
+#define AT91C_MC_GPNVM5           (0x1 << 13) // (MC) Sector 5 Lock Status
+#define AT91C_MC_GPNVM6           (0x1 << 14) // (MC) Sector 6 Lock Status
+#define AT91C_MC_GPNVM7           (0x1 << 15) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS0           (0x1 << 16) // (MC) Sector 0 Lock Status
+#define AT91C_MC_LOCKS1           (0x1 << 17) // (MC) Sector 1 Lock Status
+#define AT91C_MC_LOCKS2           (0x1 << 18) // (MC) Sector 2 Lock Status
+#define AT91C_MC_LOCKS3           (0x1 << 19) // (MC) Sector 3 Lock Status
+#define AT91C_MC_LOCKS4           (0x1 << 20) // (MC) Sector 4 Lock Status
+#define AT91C_MC_LOCKS5           (0x1 << 21) // (MC) Sector 5 Lock Status
+#define AT91C_MC_LOCKS6           (0x1 << 22) // (MC) Sector 6 Lock Status
+#define AT91C_MC_LOCKS7           (0x1 << 23) // (MC) Sector 7 Lock Status
+#define AT91C_MC_LOCKS8           (0x1 << 24) // (MC) Sector 8 Lock Status
+#define AT91C_MC_LOCKS9           (0x1 << 25) // (MC) Sector 9 Lock Status
+#define AT91C_MC_LOCKS10          (0x1 << 26) // (MC) Sector 10 Lock Status
+#define AT91C_MC_LOCKS11          (0x1 << 27) // (MC) Sector 11 Lock Status
+#define AT91C_MC_LOCKS12          (0x1 << 28) // (MC) Sector 12 Lock Status
+#define AT91C_MC_LOCKS13          (0x1 << 29) // (MC) Sector 13 Lock Status
+#define AT91C_MC_LOCKS14          (0x1 << 30) // (MC) Sector 14 Lock Status
+#define AT91C_MC_LOCKS15          (0x1 << 31) // (MC) Sector 15 Lock Status
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Serial Parallel Interface
+// *****************************************************************************
+// *** Register offset in AT91S_SPI structure ***
+#define SPI_CR          ( 0) // Control Register
+#define SPI_MR          ( 4) // Mode Register
+#define SPI_RDR         ( 8) // Receive Data Register
+#define SPI_TDR         (12) // Transmit Data Register
+#define SPI_SR          (16) // Status Register
+#define SPI_IER         (20) // Interrupt Enable Register
+#define SPI_IDR         (24) // Interrupt Disable Register
+#define SPI_IMR         (28) // Interrupt Mask Register
+#define SPI_CSR         (48) // Chip Select Register
+#define SPI_RPR         (256) // Receive Pointer Register
+#define SPI_RCR         (260) // Receive Counter Register
+#define SPI_TPR         (264) // Transmit Pointer Register
+#define SPI_TCR         (268) // Transmit Counter Register
+#define SPI_RNPR        (272) // Receive Next Pointer Register
+#define SPI_RNCR        (276) // Receive Next Counter Register
+#define SPI_TNPR        (280) // Transmit Next Pointer Register
+#define SPI_TNCR        (284) // Transmit Next Counter Register
+#define SPI_PTCR        (288) // PDC Transfer Control Register
+#define SPI_PTSR        (292) // PDC Transfer Status Register
+// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register --------
+#define AT91C_SPI_SPIEN           (0x1 <<  0) // (SPI) SPI Enable
+#define AT91C_SPI_SPIDIS          (0x1 <<  1) // (SPI) SPI Disable
+#define AT91C_SPI_SWRST           (0x1 <<  7) // (SPI) SPI Software reset
+#define AT91C_SPI_LASTXFER        (0x1 << 24) // (SPI) SPI Last Transfer
+// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register --------
+#define AT91C_SPI_MSTR            (0x1 <<  0) // (SPI) Master/Slave Mode
+#define AT91C_SPI_PS              (0x1 <<  1) // (SPI) Peripheral Select
+#define     AT91C_SPI_PS_FIXED                (0x0 <<  1) // (SPI) Fixed Peripheral Select
+#define     AT91C_SPI_PS_VARIABLE             (0x1 <<  1) // (SPI) Variable Peripheral Select
+#define AT91C_SPI_PCSDEC          (0x1 <<  2) // (SPI) Chip Select Decode
+#define AT91C_SPI_FDIV            (0x1 <<  3) // (SPI) Clock Selection
+#define AT91C_SPI_MODFDIS         (0x1 <<  4) // (SPI) Mode Fault Detection
+#define AT91C_SPI_LLB             (0x1 <<  7) // (SPI) Clock Selection
+#define AT91C_SPI_PCS             (0xF << 16) // (SPI) Peripheral Chip Select
+#define AT91C_SPI_DLYBCS          (0xFF << 24) // (SPI) Delay Between Chip Selects
+// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register --------
+#define AT91C_SPI_RD              (0xFFFF <<  0) // (SPI) Receive Data
+#define AT91C_SPI_RPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register --------
+#define AT91C_SPI_TD              (0xFFFF <<  0) // (SPI) Transmit Data
+#define AT91C_SPI_TPCS            (0xF << 16) // (SPI) Peripheral Chip Select Status
+// -------- SPI_SR : (SPI Offset: 0x10) Status Register --------
+#define AT91C_SPI_RDRF            (0x1 <<  0) // (SPI) Receive Data Register Full
+#define AT91C_SPI_TDRE            (0x1 <<  1) // (SPI) Transmit Data Register Empty
+#define AT91C_SPI_MODF            (0x1 <<  2) // (SPI) Mode Fault Error
+#define AT91C_SPI_OVRES           (0x1 <<  3) // (SPI) Overrun Error Status
+#define AT91C_SPI_ENDRX           (0x1 <<  4) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_ENDTX           (0x1 <<  5) // (SPI) End of Receiver Transfer
+#define AT91C_SPI_RXBUFF          (0x1 <<  6) // (SPI) RXBUFF Interrupt
+#define AT91C_SPI_TXBUFE          (0x1 <<  7) // (SPI) TXBUFE Interrupt
+#define AT91C_SPI_NSSR            (0x1 <<  8) // (SPI) NSSR Interrupt
+#define AT91C_SPI_TXEMPTY         (0x1 <<  9) // (SPI) TXEMPTY Interrupt
+#define AT91C_SPI_SPIENS          (0x1 << 16) // (SPI) Enable Status
+// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register --------
+// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register --------
+// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register --------
+// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register --------
+#define AT91C_SPI_CPOL            (0x1 <<  0) // (SPI) Clock Polarity
+#define AT91C_SPI_NCPHA           (0x1 <<  1) // (SPI) Clock Phase
+#define AT91C_SPI_CSAAT           (0x1 <<  3) // (SPI) Chip Select Active After Transfer
+#define AT91C_SPI_BITS            (0xF <<  4) // (SPI) Bits Per Transfer
+#define     AT91C_SPI_BITS_8                    (0x0 <<  4) // (SPI) 8 Bits Per transfer
+#define     AT91C_SPI_BITS_9                    (0x1 <<  4) // (SPI) 9 Bits Per transfer
+#define     AT91C_SPI_BITS_10                   (0x2 <<  4) // (SPI) 10 Bits Per transfer
+#define     AT91C_SPI_BITS_11                   (0x3 <<  4) // (SPI) 11 Bits Per transfer
+#define     AT91C_SPI_BITS_12                   (0x4 <<  4) // (SPI) 12 Bits Per transfer
+#define     AT91C_SPI_BITS_13                   (0x5 <<  4) // (SPI) 13 Bits Per transfer
+#define     AT91C_SPI_BITS_14                   (0x6 <<  4) // (SPI) 14 Bits Per transfer
+#define     AT91C_SPI_BITS_15                   (0x7 <<  4) // (SPI) 15 Bits Per transfer
+#define     AT91C_SPI_BITS_16                   (0x8 <<  4) // (SPI) 16 Bits Per transfer
+#define AT91C_SPI_SCBR            (0xFF <<  8) // (SPI) Serial Clock Baud Rate
+#define AT91C_SPI_DLYBS           (0xFF << 16) // (SPI) Delay Before SPCK
+#define AT91C_SPI_DLYBCT          (0xFF << 24) // (SPI) Delay Between Consecutive Transfers
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Usart
+// *****************************************************************************
+// *** Register offset in AT91S_USART structure ***
+#define US_CR           ( 0) // Control Register
+#define US_MR           ( 4) // Mode Register
+#define US_IER          ( 8) // Interrupt Enable Register
+#define US_IDR          (12) // Interrupt Disable Register
+#define US_IMR          (16) // Interrupt Mask Register
+#define US_CSR          (20) // Channel Status Register
+#define US_RHR          (24) // Receiver Holding Register
+#define US_THR          (28) // Transmitter Holding Register
+#define US_BRGR         (32) // Baud Rate Generator Register
+#define US_RTOR         (36) // Receiver Time-out Register
+#define US_TTGR         (40) // Transmitter Time-guard Register
+#define US_FIDI         (64) // FI_DI_Ratio Register
+#define US_NER          (68) // Nb Errors Register
+#define US_IF           (76) // IRDA_FILTER Register
+#define US_RPR          (256) // Receive Pointer Register
+#define US_RCR          (260) // Receive Counter Register
+#define US_TPR          (264) // Transmit Pointer Register
+#define US_TCR          (268) // Transmit Counter Register
+#define US_RNPR         (272) // Receive Next Pointer Register
+#define US_RNCR         (276) // Receive Next Counter Register
+#define US_TNPR         (280) // Transmit Next Pointer Register
+#define US_TNCR         (284) // Transmit Next Counter Register
+#define US_PTCR         (288) // PDC Transfer Control Register
+#define US_PTSR         (292) // PDC Transfer Status Register
+// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register --------
+#define AT91C_US_STTBRK           (0x1 <<  9) // (USART) Start Break
+#define AT91C_US_STPBRK           (0x1 << 10) // (USART) Stop Break
+#define AT91C_US_STTTO            (0x1 << 11) // (USART) Start Time-out
+#define AT91C_US_SENDA            (0x1 << 12) // (USART) Send Address
+#define AT91C_US_RSTIT            (0x1 << 13) // (USART) Reset Iterations
+#define AT91C_US_RSTNACK          (0x1 << 14) // (USART) Reset Non Acknowledge
+#define AT91C_US_RETTO            (0x1 << 15) // (USART) Rearm Time-out
+#define AT91C_US_DTREN            (0x1 << 16) // (USART) Data Terminal ready Enable
+#define AT91C_US_DTRDIS           (0x1 << 17) // (USART) Data Terminal ready Disable
+#define AT91C_US_RTSEN            (0x1 << 18) // (USART) Request to Send enable
+#define AT91C_US_RTSDIS           (0x1 << 19) // (USART) Request to Send Disable
+// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register --------
+#define AT91C_US_USMODE           (0xF <<  0) // (USART) Usart mode
+#define     AT91C_US_USMODE_NORMAL               (0x0) // (USART) Normal
+#define     AT91C_US_USMODE_RS485                (0x1) // (USART) RS485
+#define     AT91C_US_USMODE_HWHSH                (0x2) // (USART) Hardware Handshaking
+#define     AT91C_US_USMODE_MODEM                (0x3) // (USART) Modem
+#define     AT91C_US_USMODE_ISO7816_0            (0x4) // (USART) ISO7816 protocol: T = 0
+#define     AT91C_US_USMODE_ISO7816_1            (0x6) // (USART) ISO7816 protocol: T = 1
+#define     AT91C_US_USMODE_IRDA                 (0x8) // (USART) IrDA
+#define     AT91C_US_USMODE_SWHSH                (0xC) // (USART) Software Handshaking
+#define AT91C_US_CLKS             (0x3 <<  4) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CLKS_CLOCK                (0x0 <<  4) // (USART) Clock
+#define     AT91C_US_CLKS_FDIV1                (0x1 <<  4) // (USART) fdiv1
+#define     AT91C_US_CLKS_SLOW                 (0x2 <<  4) // (USART) slow_clock (ARM)
+#define     AT91C_US_CLKS_EXT                  (0x3 <<  4) // (USART) External (SCK)
+#define AT91C_US_CHRL             (0x3 <<  6) // (USART) Clock Selection (Baud Rate generator Input Clock
+#define     AT91C_US_CHRL_5_BITS               (0x0 <<  6) // (USART) Character Length: 5 bits
+#define     AT91C_US_CHRL_6_BITS               (0x1 <<  6) // (USART) Character Length: 6 bits
+#define     AT91C_US_CHRL_7_BITS               (0x2 <<  6) // (USART) Character Length: 7 bits
+#define     AT91C_US_CHRL_8_BITS               (0x3 <<  6) // (USART) Character Length: 8 bits
+#define AT91C_US_SYNC             (0x1 <<  8) // (USART) Synchronous Mode Select
+#define AT91C_US_NBSTOP           (0x3 << 12) // (USART) Number of Stop bits
+#define     AT91C_US_NBSTOP_1_BIT                (0x0 << 12) // (USART) 1 stop bit
+#define     AT91C_US_NBSTOP_15_BIT               (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits
+#define     AT91C_US_NBSTOP_2_BIT                (0x2 << 12) // (USART) 2 stop bits
+#define AT91C_US_MSBF             (0x1 << 16) // (USART) Bit Order
+#define AT91C_US_MODE9            (0x1 << 17) // (USART) 9-bit Character length
+#define AT91C_US_CKLO             (0x1 << 18) // (USART) Clock Output Select
+#define AT91C_US_OVER             (0x1 << 19) // (USART) Over Sampling Mode
+#define AT91C_US_INACK            (0x1 << 20) // (USART) Inhibit Non Acknowledge
+#define AT91C_US_DSNACK           (0x1 << 21) // (USART) Disable Successive NACK
+#define AT91C_US_MAX_ITER         (0x1 << 24) // (USART) Number of Repetitions
+#define AT91C_US_FILTER           (0x1 << 28) // (USART) Receive Line Filter
+// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register --------
+#define AT91C_US_RXBRK            (0x1 <<  2) // (USART) Break Received/End of Break
+#define AT91C_US_TIMEOUT          (0x1 <<  8) // (USART) Receiver Time-out
+#define AT91C_US_ITERATION        (0x1 << 10) // (USART) Max number of Repetitions Reached
+#define AT91C_US_NACK             (0x1 << 13) // (USART) Non Acknowledge
+#define AT91C_US_RIIC             (0x1 << 16) // (USART) Ring INdicator Input Change Flag
+#define AT91C_US_DSRIC            (0x1 << 17) // (USART) Data Set Ready Input Change Flag
+#define AT91C_US_DCDIC            (0x1 << 18) // (USART) Data Carrier Flag
+#define AT91C_US_CTSIC            (0x1 << 19) // (USART) Clear To Send Input Change Flag
+// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register --------
+// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register --------
+// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register --------
+#define AT91C_US_RI               (0x1 << 20) // (USART) Image of RI Input
+#define AT91C_US_DSR              (0x1 << 21) // (USART) Image of DSR Input
+#define AT91C_US_DCD              (0x1 << 22) // (USART) Image of DCD Input
+#define AT91C_US_CTS              (0x1 << 23) // (USART) Image of CTS Input
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Synchronous Serial Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_SSC structure ***
+#define SSC_CR          ( 0) // Control Register
+#define SSC_CMR         ( 4) // Clock Mode Register
+#define SSC_RCMR        (16) // Receive Clock ModeRegister
+#define SSC_RFMR        (20) // Receive Frame Mode Register
+#define SSC_TCMR        (24) // Transmit Clock Mode Register
+#define SSC_TFMR        (28) // Transmit Frame Mode Register
+#define SSC_RHR         (32) // Receive Holding Register
+#define SSC_THR         (36) // Transmit Holding Register
+#define SSC_RSHR        (48) // Receive Sync Holding Register
+#define SSC_TSHR        (52) // Transmit Sync Holding Register
+#define SSC_SR          (64) // Status Register
+#define SSC_IER         (68) // Interrupt Enable Register
+#define SSC_IDR         (72) // Interrupt Disable Register
+#define SSC_IMR         (76) // Interrupt Mask Register
+#define SSC_RPR         (256) // Receive Pointer Register
+#define SSC_RCR         (260) // Receive Counter Register
+#define SSC_TPR         (264) // Transmit Pointer Register
+#define SSC_TCR         (268) // Transmit Counter Register
+#define SSC_RNPR        (272) // Receive Next Pointer Register
+#define SSC_RNCR        (276) // Receive Next Counter Register
+#define SSC_TNPR        (280) // Transmit Next Pointer Register
+#define SSC_TNCR        (284) // Transmit Next Counter Register
+#define SSC_PTCR        (288) // PDC Transfer Control Register
+#define SSC_PTSR        (292) // PDC Transfer Status Register
+// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register --------
+#define AT91C_SSC_RXEN            (0x1 <<  0) // (SSC) Receive Enable
+#define AT91C_SSC_RXDIS           (0x1 <<  1) // (SSC) Receive Disable
+#define AT91C_SSC_TXEN            (0x1 <<  8) // (SSC) Transmit Enable
+#define AT91C_SSC_TXDIS           (0x1 <<  9) // (SSC) Transmit Disable
+#define AT91C_SSC_SWRST           (0x1 << 15) // (SSC) Software Reset
+// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register --------
+#define AT91C_SSC_CKS             (0x3 <<  0) // (SSC) Receive/Transmit Clock Selection
+#define     AT91C_SSC_CKS_DIV                  (0x0) // (SSC) Divided Clock
+#define     AT91C_SSC_CKS_TK                   (0x1) // (SSC) TK Clock signal
+#define     AT91C_SSC_CKS_RK                   (0x2) // (SSC) RK pin
+#define AT91C_SSC_CKO             (0x7 <<  2) // (SSC) Receive/Transmit Clock Output Mode Selection
+#define     AT91C_SSC_CKO_NONE                 (0x0 <<  2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only
+#define     AT91C_SSC_CKO_CONTINOUS            (0x1 <<  2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output
+#define     AT91C_SSC_CKO_DATA_TX              (0x2 <<  2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output
+#define AT91C_SSC_CKI             (0x1 <<  5) // (SSC) Receive/Transmit Clock Inversion
+#define AT91C_SSC_START           (0xF <<  8) // (SSC) Receive/Transmit Start Selection
+#define     AT91C_SSC_START_CONTINOUS            (0x0 <<  8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data.
+#define     AT91C_SSC_START_TX                   (0x1 <<  8) // (SSC) Transmit/Receive start
+#define     AT91C_SSC_START_LOW_RF               (0x2 <<  8) // (SSC) Detection of a low level on RF input
+#define     AT91C_SSC_START_HIGH_RF              (0x3 <<  8) // (SSC) Detection of a high level on RF input
+#define     AT91C_SSC_START_FALL_RF              (0x4 <<  8) // (SSC) Detection of a falling edge on RF input
+#define     AT91C_SSC_START_RISE_RF              (0x5 <<  8) // (SSC) Detection of a rising edge on RF input
+#define     AT91C_SSC_START_LEVEL_RF             (0x6 <<  8) // (SSC) Detection of any level change on RF input
+#define     AT91C_SSC_START_EDGE_RF              (0x7 <<  8) // (SSC) Detection of any edge on RF input
+#define     AT91C_SSC_START_0                    (0x8 <<  8) // (SSC) Compare 0
+#define AT91C_SSC_STTDLY          (0xFF << 16) // (SSC) Receive/Transmit Start Delay
+#define AT91C_SSC_PERIOD          (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection
+// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register --------
+#define AT91C_SSC_DATLEN          (0x1F <<  0) // (SSC) Data Length
+#define AT91C_SSC_LOOP            (0x1 <<  5) // (SSC) Loop Mode
+#define AT91C_SSC_MSBF            (0x1 <<  7) // (SSC) Most Significant Bit First
+#define AT91C_SSC_DATNB           (0xF <<  8) // (SSC) Data Number per Frame
+#define AT91C_SSC_FSLEN           (0xF << 16) // (SSC) Receive/Transmit Frame Sync length
+#define AT91C_SSC_FSOS            (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection
+#define     AT91C_SSC_FSOS_NONE                 (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only
+#define     AT91C_SSC_FSOS_NEGATIVE             (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse
+#define     AT91C_SSC_FSOS_POSITIVE             (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse
+#define     AT91C_SSC_FSOS_LOW                  (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer
+#define     AT91C_SSC_FSOS_HIGH                 (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer
+#define     AT91C_SSC_FSOS_TOGGLE               (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer
+#define AT91C_SSC_FSEDGE          (0x1 << 24) // (SSC) Frame Sync Edge Detection
+// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register --------
+// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register --------
+#define AT91C_SSC_DATDEF          (0x1 <<  5) // (SSC) Data Default Value
+#define AT91C_SSC_FSDEN           (0x1 << 23) // (SSC) Frame Sync Data Enable
+// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register --------
+#define AT91C_SSC_TXRDY           (0x1 <<  0) // (SSC) Transmit Ready
+#define AT91C_SSC_TXEMPTY         (0x1 <<  1) // (SSC) Transmit Empty
+#define AT91C_SSC_ENDTX           (0x1 <<  2) // (SSC) End Of Transmission
+#define AT91C_SSC_TXBUFE          (0x1 <<  3) // (SSC) Transmit Buffer Empty
+#define AT91C_SSC_RXRDY           (0x1 <<  4) // (SSC) Receive Ready
+#define AT91C_SSC_OVRUN           (0x1 <<  5) // (SSC) Receive Overrun
+#define AT91C_SSC_ENDRX           (0x1 <<  6) // (SSC) End of Reception
+#define AT91C_SSC_RXBUFF          (0x1 <<  7) // (SSC) Receive Buffer Full
+#define AT91C_SSC_TXSYN           (0x1 << 10) // (SSC) Transmit Sync
+#define AT91C_SSC_RXSYN           (0x1 << 11) // (SSC) Receive Sync
+#define AT91C_SSC_TXENA           (0x1 << 16) // (SSC) Transmit Enable
+#define AT91C_SSC_RXENA           (0x1 << 17) // (SSC) Receive Enable
+// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register --------
+// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register --------
+// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Two-wire Interface
+// *****************************************************************************
+// *** Register offset in AT91S_TWI structure ***
+#define TWI_CR          ( 0) // Control Register
+#define TWI_MMR         ( 4) // Master Mode Register
+#define TWI_IADR        (12) // Internal Address Register
+#define TWI_CWGR        (16) // Clock Waveform Generator Register
+#define TWI_SR          (32) // Status Register
+#define TWI_IER         (36) // Interrupt Enable Register
+#define TWI_IDR         (40) // Interrupt Disable Register
+#define TWI_IMR         (44) // Interrupt Mask Register
+#define TWI_RHR         (48) // Receive Holding Register
+#define TWI_THR         (52) // Transmit Holding Register
+// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register --------
+#define AT91C_TWI_START           (0x1 <<  0) // (TWI) Send a START Condition
+#define AT91C_TWI_STOP            (0x1 <<  1) // (TWI) Send a STOP Condition
+#define AT91C_TWI_MSEN            (0x1 <<  2) // (TWI) TWI Master Transfer Enabled
+#define AT91C_TWI_MSDIS           (0x1 <<  3) // (TWI) TWI Master Transfer Disabled
+#define AT91C_TWI_SWRST           (0x1 <<  7) // (TWI) Software Reset
+// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register --------
+#define AT91C_TWI_IADRSZ          (0x3 <<  8) // (TWI) Internal Device Address Size
+#define     AT91C_TWI_IADRSZ_NO                   (0x0 <<  8) // (TWI) No internal device address
+#define     AT91C_TWI_IADRSZ_1_BYTE               (0x1 <<  8) // (TWI) One-byte internal device address
+#define     AT91C_TWI_IADRSZ_2_BYTE               (0x2 <<  8) // (TWI) Two-byte internal device address
+#define     AT91C_TWI_IADRSZ_3_BYTE               (0x3 <<  8) // (TWI) Three-byte internal device address
+#define AT91C_TWI_MREAD           (0x1 << 12) // (TWI) Master Read Direction
+#define AT91C_TWI_DADR            (0x7F << 16) // (TWI) Device Address
+// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register --------
+#define AT91C_TWI_CLDIV           (0xFF <<  0) // (TWI) Clock Low Divider
+#define AT91C_TWI_CHDIV           (0xFF <<  8) // (TWI) Clock High Divider
+#define AT91C_TWI_CKDIV           (0x7 << 16) // (TWI) Clock Divider
+// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register --------
+#define AT91C_TWI_TXCOMP          (0x1 <<  0) // (TWI) Transmission Completed
+#define AT91C_TWI_RXRDY           (0x1 <<  1) // (TWI) Receive holding register ReaDY
+#define AT91C_TWI_TXRDY           (0x1 <<  2) // (TWI) Transmit holding register ReaDY
+#define AT91C_TWI_OVRE            (0x1 <<  6) // (TWI) Overrun Error
+#define AT91C_TWI_UNRE            (0x1 <<  7) // (TWI) Underrun Error
+#define AT91C_TWI_NACK            (0x1 <<  8) // (TWI) Not Acknowledged
+// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register --------
+// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register --------
+// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR PWMC Channel Interface
+// *****************************************************************************
+// *** Register offset in AT91S_PWMC_CH structure ***
+#define PWMC_CMR        ( 0) // Channel Mode Register
+#define PWMC_CDTYR      ( 4) // Channel Duty Cycle Register
+#define PWMC_CPRDR      ( 8) // Channel Period Register
+#define PWMC_CCNTR      (12) // Channel Counter Register
+#define PWMC_CUPDR      (16) // Channel Update Register
+#define PWMC_Reserved   (20) // Reserved
+// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register --------
+#define AT91C_PWMC_CPRE           (0xF <<  0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx
+#define     AT91C_PWMC_CPRE_MCK                  (0x0) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKA                 (0xB) // (PWMC_CH)
+#define     AT91C_PWMC_CPRE_MCKB                 (0xC) // (PWMC_CH)
+#define AT91C_PWMC_CALG           (0x1 <<  8) // (PWMC_CH) Channel Alignment
+#define AT91C_PWMC_CPOL           (0x1 <<  9) // (PWMC_CH) Channel Polarity
+#define AT91C_PWMC_CPD            (0x1 << 10) // (PWMC_CH) Channel Update Period
+// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register --------
+#define AT91C_PWMC_CDTY           (0x0 <<  0) // (PWMC_CH) Channel Duty Cycle
+// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register --------
+#define AT91C_PWMC_CPRD           (0x0 <<  0) // (PWMC_CH) Channel Period
+// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register --------
+#define AT91C_PWMC_CCNT           (0x0 <<  0) // (PWMC_CH) Channel Counter
+// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register --------
+#define AT91C_PWMC_CUPD           (0x0 <<  0) // (PWMC_CH) Channel Update
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Pulse Width Modulation Controller Interface
+// *****************************************************************************
+// *** Register offset in AT91S_PWMC structure ***
+#define PWMC_MR         ( 0) // PWMC Mode Register
+#define PWMC_ENA        ( 4) // PWMC Enable Register
+#define PWMC_DIS        ( 8) // PWMC Disable Register
+#define PWMC_SR         (12) // PWMC Status Register
+#define PWMC_IER        (16) // PWMC Interrupt Enable Register
+#define PWMC_IDR        (20) // PWMC Interrupt Disable Register
+#define PWMC_IMR        (24) // PWMC Interrupt Mask Register
+#define PWMC_ISR        (28) // PWMC Interrupt Status Register
+#define PWMC_VR         (252) // PWMC Version Register
+#define PWMC_CH         (512) // PWMC Channel
+// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register --------
+#define AT91C_PWMC_DIVA           (0xFF <<  0) // (PWMC) CLKA divide factor.
+#define AT91C_PWMC_PREA           (0xF <<  8) // (PWMC) Divider Input Clock Prescaler A
+#define     AT91C_PWMC_PREA_MCK                  (0x0 <<  8) // (PWMC)
+#define AT91C_PWMC_DIVB           (0xFF << 16) // (PWMC) CLKB divide factor.
+#define AT91C_PWMC_PREB           (0xF << 24) // (PWMC) Divider Input Clock Prescaler B
+#define     AT91C_PWMC_PREB_MCK                  (0x0 << 24) // (PWMC)
+// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register --------
+#define AT91C_PWMC_CHID0          (0x1 <<  0) // (PWMC) Channel ID 0
+#define AT91C_PWMC_CHID1          (0x1 <<  1) // (PWMC) Channel ID 1
+#define AT91C_PWMC_CHID2          (0x1 <<  2) // (PWMC) Channel ID 2
+#define AT91C_PWMC_CHID3          (0x1 <<  3) // (PWMC) Channel ID 3
+// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register --------
+// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register --------
+// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register --------
+// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register --------
+// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register --------
+// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR USB Device Interface
+// *****************************************************************************
+// *** Register offset in AT91S_UDP structure ***
+#define UDP_NUM         ( 0) // Frame Number Register
+#define UDP_GLBSTATE    ( 4) // Global State Register
+#define UDP_FADDR       ( 8) // Function Address Register
+#define UDP_IER         (16) // Interrupt Enable Register
+#define UDP_IDR         (20) // Interrupt Disable Register
+#define UDP_IMR         (24) // Interrupt Mask Register
+#define UDP_ISR         (28) // Interrupt Status Register
+#define UDP_ICR         (32) // Interrupt Clear Register
+#define UDP_RSTEP       (40) // Reset Endpoint Register
+#define UDP_CSR         (48) // Endpoint Control and Status Register
+#define UDP_FDR         (80) // Endpoint FIFO Data Register
+#define UDP_TXVC        (116) // Transceiver Control Register
+// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register --------
+#define AT91C_UDP_FRM_NUM         (0x7FF <<  0) // (UDP) Frame Number as Defined in the Packet Field Formats
+#define AT91C_UDP_FRM_ERR         (0x1 << 16) // (UDP) Frame Error
+#define AT91C_UDP_FRM_OK          (0x1 << 17) // (UDP) Frame OK
+// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register --------
+#define AT91C_UDP_FADDEN          (0x1 <<  0) // (UDP) Function Address Enable
+#define AT91C_UDP_CONFG           (0x1 <<  1) // (UDP) Configured
+#define AT91C_UDP_ESR             (0x1 <<  2) // (UDP) Enable Send Resume
+#define AT91C_UDP_RSMINPR         (0x1 <<  3) // (UDP) A Resume Has Been Sent to the Host
+#define AT91C_UDP_RMWUPE          (0x1 <<  4) // (UDP) Remote Wake Up Enable
+// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register --------
+#define AT91C_UDP_FADD            (0xFF <<  0) // (UDP) Function Address Value
+#define AT91C_UDP_FEN             (0x1 <<  8) // (UDP) Function Enable
+// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register --------
+#define AT91C_UDP_EPINT0          (0x1 <<  0) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT1          (0x1 <<  1) // (UDP) Endpoint 0 Interrupt
+#define AT91C_UDP_EPINT2          (0x1 <<  2) // (UDP) Endpoint 2 Interrupt
+#define AT91C_UDP_EPINT3          (0x1 <<  3) // (UDP) Endpoint 3 Interrupt
+#define AT91C_UDP_EPINT4          (0x1 <<  4) // (UDP) Endpoint 4 Interrupt
+#define AT91C_UDP_EPINT5          (0x1 <<  5) // (UDP) Endpoint 5 Interrupt
+#define AT91C_UDP_RXSUSP          (0x1 <<  8) // (UDP) USB Suspend Interrupt
+#define AT91C_UDP_RXRSM           (0x1 <<  9) // (UDP) USB Resume Interrupt
+#define AT91C_UDP_EXTRSM          (0x1 << 10) // (UDP) USB External Resume Interrupt
+#define AT91C_UDP_SOFINT          (0x1 << 11) // (UDP) USB Start Of frame Interrupt
+#define AT91C_UDP_WAKEUP          (0x1 << 13) // (UDP) USB Resume Interrupt
+// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register --------
+// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register --------
+// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register --------
+#define AT91C_UDP_ENDBUSRES       (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt
+// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register --------
+// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register --------
+#define AT91C_UDP_EP0             (0x1 <<  0) // (UDP) Reset Endpoint 0
+#define AT91C_UDP_EP1             (0x1 <<  1) // (UDP) Reset Endpoint 1
+#define AT91C_UDP_EP2             (0x1 <<  2) // (UDP) Reset Endpoint 2
+#define AT91C_UDP_EP3             (0x1 <<  3) // (UDP) Reset Endpoint 3
+#define AT91C_UDP_EP4             (0x1 <<  4) // (UDP) Reset Endpoint 4
+#define AT91C_UDP_EP5             (0x1 <<  5) // (UDP) Reset Endpoint 5
+// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register --------
+#define AT91C_UDP_TXCOMP          (0x1 <<  0) // (UDP) Generates an IN packet with data previously written in the DPR
+#define AT91C_UDP_RX_DATA_BK0     (0x1 <<  1) // (UDP) Receive Data Bank 0
+#define AT91C_UDP_RXSETUP         (0x1 <<  2) // (UDP) Sends STALL to the Host (Control endpoints)
+#define AT91C_UDP_ISOERROR        (0x1 <<  3) // (UDP) Isochronous error (Isochronous endpoints)
+#define AT91C_UDP_TXPKTRDY        (0x1 <<  4) // (UDP) Transmit Packet Ready
+#define AT91C_UDP_FORCESTALL      (0x1 <<  5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints).
+#define AT91C_UDP_RX_DATA_BK1     (0x1 <<  6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes).
+#define AT91C_UDP_DIR             (0x1 <<  7) // (UDP) Transfer Direction
+#define AT91C_UDP_EPTYPE          (0x7 <<  8) // (UDP) Endpoint type
+#define     AT91C_UDP_EPTYPE_CTRL                 (0x0 <<  8) // (UDP) Control
+#define     AT91C_UDP_EPTYPE_ISO_OUT              (0x1 <<  8) // (UDP) Isochronous OUT
+#define     AT91C_UDP_EPTYPE_BULK_OUT             (0x2 <<  8) // (UDP) Bulk OUT
+#define     AT91C_UDP_EPTYPE_INT_OUT              (0x3 <<  8) // (UDP) Interrupt OUT
+#define     AT91C_UDP_EPTYPE_ISO_IN               (0x5 <<  8) // (UDP) Isochronous IN
+#define     AT91C_UDP_EPTYPE_BULK_IN              (0x6 <<  8) // (UDP) Bulk IN
+#define     AT91C_UDP_EPTYPE_INT_IN               (0x7 <<  8) // (UDP) Interrupt IN
+#define AT91C_UDP_DTGLE           (0x1 << 11) // (UDP) Data Toggle
+#define AT91C_UDP_EPEDS           (0x1 << 15) // (UDP) Endpoint Enable Disable
+#define AT91C_UDP_RXBYTECNT       (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO
+// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register --------
+#define AT91C_UDP_TXVDIS          (0x1 <<  8) // (UDP)
+#define AT91C_UDP_PUON            (0x1 <<  9) // (UDP) Pull-up ON
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface
+// *****************************************************************************
+// *** Register offset in AT91S_TC structure ***
+#define TC_CCR          ( 0) // Channel Control Register
+#define TC_CMR          ( 4) // Channel Mode Register (Capture Mode / Waveform Mode)
+#define TC_CV           (16) // Counter Value
+#define TC_RA           (20) // Register A
+#define TC_RB           (24) // Register B
+#define TC_RC           (28) // Register C
+#define TC_SR           (32) // Status Register
+#define TC_IER          (36) // Interrupt Enable Register
+#define TC_IDR          (40) // Interrupt Disable Register
+#define TC_IMR          (44) // Interrupt Mask Register
+// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register --------
+#define AT91C_TC_CLKEN            (0x1 <<  0) // (TC) Counter Clock Enable Command
+#define AT91C_TC_CLKDIS           (0x1 <<  1) // (TC) Counter Clock Disable Command
+#define AT91C_TC_SWTRG            (0x1 <<  2) // (TC) Software Trigger Command
+// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode --------
+#define AT91C_TC_CLKS             (0x7 <<  0) // (TC) Clock Selection
+#define     AT91C_TC_CLKS_TIMER_DIV1_CLOCK     (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV2_CLOCK     (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV3_CLOCK     (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV4_CLOCK     (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK
+#define     AT91C_TC_CLKS_TIMER_DIV5_CLOCK     (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK
+#define     AT91C_TC_CLKS_XC0                  (0x5) // (TC) Clock selected: XC0
+#define     AT91C_TC_CLKS_XC1                  (0x6) // (TC) Clock selected: XC1
+#define     AT91C_TC_CLKS_XC2                  (0x7) // (TC) Clock selected: XC2
+#define AT91C_TC_CLKI             (0x1 <<  3) // (TC) Clock Invert
+#define AT91C_TC_BURST            (0x3 <<  4) // (TC) Burst Signal Selection
+#define     AT91C_TC_BURST_NONE                 (0x0 <<  4) // (TC) The clock is not gated by an external signal
+#define     AT91C_TC_BURST_XC0                  (0x1 <<  4) // (TC) XC0 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC1                  (0x2 <<  4) // (TC) XC1 is ANDed with the selected clock
+#define     AT91C_TC_BURST_XC2                  (0x3 <<  4) // (TC) XC2 is ANDed with the selected clock
+#define AT91C_TC_CPCSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RC Compare
+#define AT91C_TC_LDBSTOP          (0x1 <<  6) // (TC) Counter Clock Stopped with RB Loading
+#define AT91C_TC_CPCDIS           (0x1 <<  7) // (TC) Counter Clock Disable with RC Compare
+#define AT91C_TC_LDBDIS           (0x1 <<  7) // (TC) Counter Clock Disabled with RB Loading
+#define AT91C_TC_ETRGEDG          (0x3 <<  8) // (TC) External Trigger Edge Selection
+#define     AT91C_TC_ETRGEDG_NONE                 (0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_ETRGEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_ETRGEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_ETRGEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_EEVTEDG          (0x3 <<  8) // (TC) External Event Edge Selection
+#define     AT91C_TC_EEVTEDG_NONE                 (0x0 <<  8) // (TC) Edge: None
+#define     AT91C_TC_EEVTEDG_RISING               (0x1 <<  8) // (TC) Edge: rising edge
+#define     AT91C_TC_EEVTEDG_FALLING              (0x2 <<  8) // (TC) Edge: falling edge
+#define     AT91C_TC_EEVTEDG_BOTH                 (0x3 <<  8) // (TC) Edge: each edge
+#define AT91C_TC_EEVT             (0x3 << 10) // (TC) External Event  Selection
+#define     AT91C_TC_EEVT_TIOB                 (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input
+#define     AT91C_TC_EEVT_XC0                  (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output
+#define     AT91C_TC_EEVT_XC1                  (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output
+#define     AT91C_TC_EEVT_XC2                  (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output
+#define AT91C_TC_ABETRG           (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection
+#define AT91C_TC_ENETRG           (0x1 << 12) // (TC) External Event Trigger enable
+#define AT91C_TC_WAVESEL          (0x3 << 13) // (TC) Waveform  Selection
+#define     AT91C_TC_WAVESEL_UP                   (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN               (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UP_AUTO              (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare
+#define     AT91C_TC_WAVESEL_UPDOWN_AUTO          (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare
+#define AT91C_TC_CPCTRG           (0x1 << 14) // (TC) RC Compare Trigger Enable
+#define AT91C_TC_WAVE             (0x1 << 15) // (TC)
+#define AT91C_TC_ACPA             (0x3 << 16) // (TC) RA Compare Effect on TIOA
+#define     AT91C_TC_ACPA_NONE                 (0x0 << 16) // (TC) Effect: none
+#define     AT91C_TC_ACPA_SET                  (0x1 << 16) // (TC) Effect: set
+#define     AT91C_TC_ACPA_CLEAR                (0x2 << 16) // (TC) Effect: clear
+#define     AT91C_TC_ACPA_TOGGLE               (0x3 << 16) // (TC) Effect: toggle
+#define AT91C_TC_LDRA             (0x3 << 16) // (TC) RA Loading Selection
+#define     AT91C_TC_LDRA_NONE                 (0x0 << 16) // (TC) Edge: None
+#define     AT91C_TC_LDRA_RISING               (0x1 << 16) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRA_FALLING              (0x2 << 16) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRA_BOTH                 (0x3 << 16) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_ACPC             (0x3 << 18) // (TC) RC Compare Effect on TIOA
+#define     AT91C_TC_ACPC_NONE                 (0x0 << 18) // (TC) Effect: none
+#define     AT91C_TC_ACPC_SET                  (0x1 << 18) // (TC) Effect: set
+#define     AT91C_TC_ACPC_CLEAR                (0x2 << 18) // (TC) Effect: clear
+#define     AT91C_TC_ACPC_TOGGLE               (0x3 << 18) // (TC) Effect: toggle
+#define AT91C_TC_LDRB             (0x3 << 18) // (TC) RB Loading Selection
+#define     AT91C_TC_LDRB_NONE                 (0x0 << 18) // (TC) Edge: None
+#define     AT91C_TC_LDRB_RISING               (0x1 << 18) // (TC) Edge: rising edge of TIOA
+#define     AT91C_TC_LDRB_FALLING              (0x2 << 18) // (TC) Edge: falling edge of TIOA
+#define     AT91C_TC_LDRB_BOTH                 (0x3 << 18) // (TC) Edge: each edge of TIOA
+#define AT91C_TC_AEEVT            (0x3 << 20) // (TC) External Event Effect on TIOA
+#define     AT91C_TC_AEEVT_NONE                 (0x0 << 20) // (TC) Effect: none
+#define     AT91C_TC_AEEVT_SET                  (0x1 << 20) // (TC) Effect: set
+#define     AT91C_TC_AEEVT_CLEAR                (0x2 << 20) // (TC) Effect: clear
+#define     AT91C_TC_AEEVT_TOGGLE               (0x3 << 20) // (TC) Effect: toggle
+#define AT91C_TC_ASWTRG           (0x3 << 22) // (TC) Software Trigger Effect on TIOA
+#define     AT91C_TC_ASWTRG_NONE                 (0x0 << 22) // (TC) Effect: none
+#define     AT91C_TC_ASWTRG_SET                  (0x1 << 22) // (TC) Effect: set
+#define     AT91C_TC_ASWTRG_CLEAR                (0x2 << 22) // (TC) Effect: clear
+#define     AT91C_TC_ASWTRG_TOGGLE               (0x3 << 22) // (TC) Effect: toggle
+#define AT91C_TC_BCPB             (0x3 << 24) // (TC) RB Compare Effect on TIOB
+#define     AT91C_TC_BCPB_NONE                 (0x0 << 24) // (TC) Effect: none
+#define     AT91C_TC_BCPB_SET                  (0x1 << 24) // (TC) Effect: set
+#define     AT91C_TC_BCPB_CLEAR                (0x2 << 24) // (TC) Effect: clear
+#define     AT91C_TC_BCPB_TOGGLE               (0x3 << 24) // (TC) Effect: toggle
+#define AT91C_TC_BCPC             (0x3 << 26) // (TC) RC Compare Effect on TIOB
+#define     AT91C_TC_BCPC_NONE                 (0x0 << 26) // (TC) Effect: none
+#define     AT91C_TC_BCPC_SET                  (0x1 << 26) // (TC) Effect: set
+#define     AT91C_TC_BCPC_CLEAR                (0x2 << 26) // (TC) Effect: clear
+#define     AT91C_TC_BCPC_TOGGLE               (0x3 << 26) // (TC) Effect: toggle
+#define AT91C_TC_BEEVT            (0x3 << 28) // (TC) External Event Effect on TIOB
+#define     AT91C_TC_BEEVT_NONE                 (0x0 << 28) // (TC) Effect: none
+#define     AT91C_TC_BEEVT_SET                  (0x1 << 28) // (TC) Effect: set
+#define     AT91C_TC_BEEVT_CLEAR                (0x2 << 28) // (TC) Effect: clear
+#define     AT91C_TC_BEEVT_TOGGLE               (0x3 << 28) // (TC) Effect: toggle
+#define AT91C_TC_BSWTRG           (0x3 << 30) // (TC) Software Trigger Effect on TIOB
+#define     AT91C_TC_BSWTRG_NONE                 (0x0 << 30) // (TC) Effect: none
+#define     AT91C_TC_BSWTRG_SET                  (0x1 << 30) // (TC) Effect: set
+#define     AT91C_TC_BSWTRG_CLEAR                (0x2 << 30) // (TC) Effect: clear
+#define     AT91C_TC_BSWTRG_TOGGLE               (0x3 << 30) // (TC) Effect: toggle
+// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register --------
+#define AT91C_TC_COVFS            (0x1 <<  0) // (TC) Counter Overflow
+#define AT91C_TC_LOVRS            (0x1 <<  1) // (TC) Load Overrun
+#define AT91C_TC_CPAS             (0x1 <<  2) // (TC) RA Compare
+#define AT91C_TC_CPBS             (0x1 <<  3) // (TC) RB Compare
+#define AT91C_TC_CPCS             (0x1 <<  4) // (TC) RC Compare
+#define AT91C_TC_LDRAS            (0x1 <<  5) // (TC) RA Loading
+#define AT91C_TC_LDRBS            (0x1 <<  6) // (TC) RB Loading
+#define AT91C_TC_ETRGS            (0x1 <<  7) // (TC) External Trigger
+#define AT91C_TC_CLKSTA           (0x1 << 16) // (TC) Clock Enabling
+#define AT91C_TC_MTIOA            (0x1 << 17) // (TC) TIOA Mirror
+#define AT91C_TC_MTIOB            (0x1 << 18) // (TC) TIOA Mirror
+// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register --------
+// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register --------
+// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Timer Counter Interface
+// *****************************************************************************
+// *** Register offset in AT91S_TCB structure ***
+#define TCB_TC0         ( 0) // TC Channel 0
+#define TCB_TC1         (64) // TC Channel 1
+#define TCB_TC2         (128) // TC Channel 2
+#define TCB_BCR         (192) // TC Block Control Register
+#define TCB_BMR         (196) // TC Block Mode Register
+// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register --------
+#define AT91C_TCB_SYNC            (0x1 <<  0) // (TCB) Synchro Command
+// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register --------
+#define AT91C_TCB_TC0XC0S         (0x3 <<  0) // (TCB) External Clock Signal 0 Selection
+#define     AT91C_TCB_TC0XC0S_TCLK0                (0x0) // (TCB) TCLK0 connected to XC0
+#define     AT91C_TCB_TC0XC0S_NONE                 (0x1) // (TCB) None signal connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA1                (0x2) // (TCB) TIOA1 connected to XC0
+#define     AT91C_TCB_TC0XC0S_TIOA2                (0x3) // (TCB) TIOA2 connected to XC0
+#define AT91C_TCB_TC1XC1S         (0x3 <<  2) // (TCB) External Clock Signal 1 Selection
+#define     AT91C_TCB_TC1XC1S_TCLK1                (0x0 <<  2) // (TCB) TCLK1 connected to XC1
+#define     AT91C_TCB_TC1XC1S_NONE                 (0x1 <<  2) // (TCB) None signal connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA0                (0x2 <<  2) // (TCB) TIOA0 connected to XC1
+#define     AT91C_TCB_TC1XC1S_TIOA2                (0x3 <<  2) // (TCB) TIOA2 connected to XC1
+#define AT91C_TCB_TC2XC2S         (0x3 <<  4) // (TCB) External Clock Signal 2 Selection
+#define     AT91C_TCB_TC2XC2S_TCLK2                (0x0 <<  4) // (TCB) TCLK2 connected to XC2
+#define     AT91C_TCB_TC2XC2S_NONE                 (0x1 <<  4) // (TCB) None signal connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA0                (0x2 <<  4) // (TCB) TIOA0 connected to XC2
+#define     AT91C_TCB_TC2XC2S_TIOA1                (0x3 <<  4) // (TCB) TIOA2 connected to XC2
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Control Area Network MailBox Interface
+// *****************************************************************************
+// *** Register offset in AT91S_CAN_MB structure ***
+#define CAN_MB_MMR      ( 0) // MailBox Mode Register
+#define CAN_MB_MAM      ( 4) // MailBox Acceptance Mask Register
+#define CAN_MB_MID      ( 8) // MailBox ID Register
+#define CAN_MB_MFID     (12) // MailBox Family ID Register
+#define CAN_MB_MSR      (16) // MailBox Status Register
+#define CAN_MB_MDL      (20) // MailBox Data Low Register
+#define CAN_MB_MDH      (24) // MailBox Data High Register
+#define CAN_MB_MCR      (28) // MailBox Control Register
+// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register --------
+#define AT91C_CAN_MTIMEMARK       (0xFFFF <<  0) // (CAN_MB) Mailbox Timemark
+#define AT91C_CAN_PRIOR           (0xF << 16) // (CAN_MB) Mailbox Priority
+#define AT91C_CAN_MOT             (0x7 << 24) // (CAN_MB) Mailbox Object Type
+#define     AT91C_CAN_MOT_DIS                  (0x0 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_RX                   (0x1 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_RXOVERWRITE          (0x2 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_TX                   (0x3 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_CONSUMER             (0x4 << 24) // (CAN_MB)
+#define     AT91C_CAN_MOT_PRODUCER             (0x5 << 24) // (CAN_MB)
+// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register --------
+#define AT91C_CAN_MIDvB           (0x3FFFF <<  0) // (CAN_MB) Complementary bits for identifier in extended mode
+#define AT91C_CAN_MIDvA           (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode
+#define AT91C_CAN_MIDE            (0x1 << 29) // (CAN_MB) Identifier Version
+// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register --------
+// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register --------
+// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register --------
+#define AT91C_CAN_MTIMESTAMP      (0xFFFF <<  0) // (CAN_MB) Timer Value
+#define AT91C_CAN_MDLC            (0xF << 16) // (CAN_MB) Mailbox Data Length Code
+#define AT91C_CAN_MRTR            (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request
+#define AT91C_CAN_MABT            (0x1 << 22) // (CAN_MB) Mailbox Message Abort
+#define AT91C_CAN_MRDY            (0x1 << 23) // (CAN_MB) Mailbox Ready
+#define AT91C_CAN_MMI             (0x1 << 24) // (CAN_MB) Mailbox Message Ignored
+// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register --------
+// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register --------
+// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register --------
+#define AT91C_CAN_MACR            (0x1 << 22) // (CAN_MB) Abort Request for Mailbox
+#define AT91C_CAN_MTCR            (0x1 << 23) // (CAN_MB) Mailbox Transfer Command
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Control Area Network Interface
+// *****************************************************************************
+// *** Register offset in AT91S_CAN structure ***
+#define CAN_MR          ( 0) // Mode Register
+#define CAN_IER         ( 4) // Interrupt Enable Register
+#define CAN_IDR         ( 8) // Interrupt Disable Register
+#define CAN_IMR         (12) // Interrupt Mask Register
+#define CAN_SR          (16) // Status Register
+#define CAN_BR          (20) // Baudrate Register
+#define CAN_TIM         (24) // Timer Register
+#define CAN_TIMESTP     (28) // Time Stamp Register
+#define CAN_ECR         (32) // Error Counter Register
+#define CAN_TCR         (36) // Transfer Command Register
+#define CAN_ACR         (40) // Abort Command Register
+#define CAN_VR          (252) // Version Register
+#define CAN_MB0         (512) // CAN Mailbox 0
+#define CAN_MB1         (544) // CAN Mailbox 1
+#define CAN_MB2         (576) // CAN Mailbox 2
+#define CAN_MB3         (608) // CAN Mailbox 3
+#define CAN_MB4         (640) // CAN Mailbox 4
+#define CAN_MB5         (672) // CAN Mailbox 5
+#define CAN_MB6         (704) // CAN Mailbox 6
+#define CAN_MB7         (736) // CAN Mailbox 7
+#define CAN_MB8         (768) // CAN Mailbox 8
+#define CAN_MB9         (800) // CAN Mailbox 9
+#define CAN_MB10        (832) // CAN Mailbox 10
+#define CAN_MB11        (864) // CAN Mailbox 11
+#define CAN_MB12        (896) // CAN Mailbox 12
+#define CAN_MB13        (928) // CAN Mailbox 13
+#define CAN_MB14        (960) // CAN Mailbox 14
+#define CAN_MB15        (992) // CAN Mailbox 15
+// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register --------
+#define AT91C_CAN_CANEN           (0x1 <<  0) // (CAN) CAN Controller Enable
+#define AT91C_CAN_LPM             (0x1 <<  1) // (CAN) Disable/Enable Low Power Mode
+#define AT91C_CAN_ABM             (0x1 <<  2) // (CAN) Disable/Enable Autobaud/Listen Mode
+#define AT91C_CAN_OVL             (0x1 <<  3) // (CAN) Disable/Enable Overload Frame
+#define AT91C_CAN_TEOF            (0x1 <<  4) // (CAN) Time Stamp messages at each end of Frame
+#define AT91C_CAN_TTM             (0x1 <<  5) // (CAN) Disable/Enable Time Trigger Mode
+#define AT91C_CAN_TIMFRZ          (0x1 <<  6) // (CAN) Enable Timer Freeze
+#define AT91C_CAN_DRPT            (0x1 <<  7) // (CAN) Disable Repeat
+// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register --------
+#define AT91C_CAN_MB0             (0x1 <<  0) // (CAN) Mailbox 0 Flag
+#define AT91C_CAN_MB1             (0x1 <<  1) // (CAN) Mailbox 1 Flag
+#define AT91C_CAN_MB2             (0x1 <<  2) // (CAN) Mailbox 2 Flag
+#define AT91C_CAN_MB3             (0x1 <<  3) // (CAN) Mailbox 3 Flag
+#define AT91C_CAN_MB4             (0x1 <<  4) // (CAN) Mailbox 4 Flag
+#define AT91C_CAN_MB5             (0x1 <<  5) // (CAN) Mailbox 5 Flag
+#define AT91C_CAN_MB6             (0x1 <<  6) // (CAN) Mailbox 6 Flag
+#define AT91C_CAN_MB7             (0x1 <<  7) // (CAN) Mailbox 7 Flag
+#define AT91C_CAN_MB8             (0x1 <<  8) // (CAN) Mailbox 8 Flag
+#define AT91C_CAN_MB9             (0x1 <<  9) // (CAN) Mailbox 9 Flag
+#define AT91C_CAN_MB10            (0x1 << 10) // (CAN) Mailbox 10 Flag
+#define AT91C_CAN_MB11            (0x1 << 11) // (CAN) Mailbox 11 Flag
+#define AT91C_CAN_MB12            (0x1 << 12) // (CAN) Mailbox 12 Flag
+#define AT91C_CAN_MB13            (0x1 << 13) // (CAN) Mailbox 13 Flag
+#define AT91C_CAN_MB14            (0x1 << 14) // (CAN) Mailbox 14 Flag
+#define AT91C_CAN_MB15            (0x1 << 15) // (CAN) Mailbox 15 Flag
+#define AT91C_CAN_ERRA            (0x1 << 16) // (CAN) Error Active Mode Flag
+#define AT91C_CAN_WARN            (0x1 << 17) // (CAN) Warning Limit Flag
+#define AT91C_CAN_ERRP            (0x1 << 18) // (CAN) Error Passive Mode Flag
+#define AT91C_CAN_BOFF            (0x1 << 19) // (CAN) Bus Off Mode Flag
+#define AT91C_CAN_SLEEP           (0x1 << 20) // (CAN) Sleep Flag
+#define AT91C_CAN_WAKEUP          (0x1 << 21) // (CAN) Wakeup Flag
+#define AT91C_CAN_TOVF            (0x1 << 22) // (CAN) Timer Overflow Flag
+#define AT91C_CAN_TSTP            (0x1 << 23) // (CAN) Timestamp Flag
+#define AT91C_CAN_CERR            (0x1 << 24) // (CAN) CRC Error
+#define AT91C_CAN_SERR            (0x1 << 25) // (CAN) Stuffing Error
+#define AT91C_CAN_AERR            (0x1 << 26) // (CAN) Acknowledgment Error
+#define AT91C_CAN_FERR            (0x1 << 27) // (CAN) Form Error
+#define AT91C_CAN_BERR            (0x1 << 28) // (CAN) Bit Error
+// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register --------
+// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register --------
+// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register --------
+#define AT91C_CAN_RBSY            (0x1 << 29) // (CAN) Receiver Busy
+#define AT91C_CAN_TBSY            (0x1 << 30) // (CAN) Transmitter Busy
+#define AT91C_CAN_OVLY            (0x1 << 31) // (CAN) Overload Busy
+// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register --------
+#define AT91C_CAN_PHASE2          (0x7 <<  0) // (CAN) Phase 2 segment
+#define AT91C_CAN_PHASE1          (0x7 <<  4) // (CAN) Phase 1 segment
+#define AT91C_CAN_PROPAG          (0x7 <<  8) // (CAN) Programmation time segment
+#define AT91C_CAN_SYNC            (0x3 << 12) // (CAN) Re-synchronization jump width segment
+#define AT91C_CAN_BRP             (0x7F << 16) // (CAN) Baudrate Prescaler
+#define AT91C_CAN_SMP             (0x1 << 24) // (CAN) Sampling mode
+// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register --------
+#define AT91C_CAN_TIMER           (0xFFFF <<  0) // (CAN) Timer field
+// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register --------
+// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register --------
+#define AT91C_CAN_REC             (0xFF <<  0) // (CAN) Receive Error Counter
+#define AT91C_CAN_TEC             (0xFF << 16) // (CAN) Transmit Error Counter
+// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register --------
+#define AT91C_CAN_TIMRST          (0x1 << 31) // (CAN) Timer Reset Field
+// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Ethernet MAC 10/100
+// *****************************************************************************
+// *** Register offset in AT91S_EMAC structure ***
+#define EMAC_NCR        ( 0) // Network Control Register
+#define EMAC_NCFGR      ( 4) // Network Configuration Register
+#define EMAC_NSR        ( 8) // Network Status Register
+#define EMAC_TSR        (20) // Transmit Status Register
+#define EMAC_RBQP       (24) // Receive Buffer Queue Pointer
+#define EMAC_TBQP       (28) // Transmit Buffer Queue Pointer
+#define EMAC_RSR        (32) // Receive Status Register
+#define EMAC_ISR        (36) // Interrupt Status Register
+#define EMAC_IER        (40) // Interrupt Enable Register
+#define EMAC_IDR        (44) // Interrupt Disable Register
+#define EMAC_IMR        (48) // Interrupt Mask Register
+#define EMAC_MAN        (52) // PHY Maintenance Register
+#define EMAC_PTR        (56) // Pause Time Register
+#define EMAC_PFR        (60) // Pause Frames received Register
+#define EMAC_FTO        (64) // Frames Transmitted OK Register
+#define EMAC_SCF        (68) // Single Collision Frame Register
+#define EMAC_MCF        (72) // Multiple Collision Frame Register
+#define EMAC_FRO        (76) // Frames Received OK Register
+#define EMAC_FCSE       (80) // Frame Check Sequence Error Register
+#define EMAC_ALE        (84) // Alignment Error Register
+#define EMAC_DTF        (88) // Deferred Transmission Frame Register
+#define EMAC_LCOL       (92) // Late Collision Register
+#define EMAC_ECOL       (96) // Excessive Collision Register
+#define EMAC_TUND       (100) // Transmit Underrun Error Register
+#define EMAC_CSE        (104) // Carrier Sense Error Register
+#define EMAC_RRE        (108) // Receive Ressource Error Register
+#define EMAC_ROV        (112) // Receive Overrun Errors Register
+#define EMAC_RSE        (116) // Receive Symbol Errors Register
+#define EMAC_ELE        (120) // Excessive Length Errors Register
+#define EMAC_RJA        (124) // Receive Jabbers Register
+#define EMAC_USF        (128) // Undersize Frames Register
+#define EMAC_STE        (132) // SQE Test Error Register
+#define EMAC_RLE        (136) // Receive Length Field Mismatch Register
+#define EMAC_TPF        (140) // Transmitted Pause Frames Register
+#define EMAC_HRB        (144) // Hash Address Bottom[31:0]
+#define EMAC_HRT        (148) // Hash Address Top[63:32]
+#define EMAC_SA1L       (152) // Specific Address 1 Bottom, First 4 bytes
+#define EMAC_SA1H       (156) // Specific Address 1 Top, Last 2 bytes
+#define EMAC_SA2L       (160) // Specific Address 2 Bottom, First 4 bytes
+#define EMAC_SA2H       (164) // Specific Address 2 Top, Last 2 bytes
+#define EMAC_SA3L       (168) // Specific Address 3 Bottom, First 4 bytes
+#define EMAC_SA3H       (172) // Specific Address 3 Top, Last 2 bytes
+#define EMAC_SA4L       (176) // Specific Address 4 Bottom, First 4 bytes
+#define EMAC_SA4H       (180) // Specific Address 4 Top, Last 2 bytes
+#define EMAC_TID        (184) // Type ID Checking Register
+#define EMAC_TPQ        (188) // Transmit Pause Quantum Register
+#define EMAC_USRIO      (192) // USER Input/Output Register
+#define EMAC_WOL        (196) // Wake On LAN Register
+#define EMAC_REV        (252) // Revision Register
+// -------- EMAC_NCR : (EMAC Offset: 0x0)  --------
+#define AT91C_EMAC_LB             (0x1 <<  0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level.
+#define AT91C_EMAC_LLB            (0x1 <<  1) // (EMAC) Loopback local.
+#define AT91C_EMAC_RE             (0x1 <<  2) // (EMAC) Receive enable.
+#define AT91C_EMAC_TE             (0x1 <<  3) // (EMAC) Transmit enable.
+#define AT91C_EMAC_MPE            (0x1 <<  4) // (EMAC) Management port enable.
+#define AT91C_EMAC_CLRSTAT        (0x1 <<  5) // (EMAC) Clear statistics registers.
+#define AT91C_EMAC_INCSTAT        (0x1 <<  6) // (EMAC) Increment statistics registers.
+#define AT91C_EMAC_WESTAT         (0x1 <<  7) // (EMAC) Write enable for statistics registers.
+#define AT91C_EMAC_BP             (0x1 <<  8) // (EMAC) Back pressure.
+#define AT91C_EMAC_TSTART         (0x1 <<  9) // (EMAC) Start Transmission.
+#define AT91C_EMAC_THALT          (0x1 << 10) // (EMAC) Transmission Halt.
+#define AT91C_EMAC_TPFR           (0x1 << 11) // (EMAC) Transmit pause frame
+#define AT91C_EMAC_TZQ            (0x1 << 12) // (EMAC) Transmit zero quantum pause frame
+// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register --------
+#define AT91C_EMAC_SPD            (0x1 <<  0) // (EMAC) Speed.
+#define AT91C_EMAC_FD             (0x1 <<  1) // (EMAC) Full duplex.
+#define AT91C_EMAC_JFRAME         (0x1 <<  3) // (EMAC) Jumbo Frames.
+#define AT91C_EMAC_CAF            (0x1 <<  4) // (EMAC) Copy all frames.
+#define AT91C_EMAC_NBC            (0x1 <<  5) // (EMAC) No broadcast.
+#define AT91C_EMAC_MTI            (0x1 <<  6) // (EMAC) Multicast hash event enable
+#define AT91C_EMAC_UNI            (0x1 <<  7) // (EMAC) Unicast hash enable.
+#define AT91C_EMAC_BIG            (0x1 <<  8) // (EMAC) Receive 1522 bytes.
+#define AT91C_EMAC_EAE            (0x1 <<  9) // (EMAC) External address match enable.
+#define AT91C_EMAC_CLK            (0x3 << 10) // (EMAC)
+#define     AT91C_EMAC_CLK_HCLK_8               (0x0 << 10) // (EMAC) HCLK divided by 8
+#define     AT91C_EMAC_CLK_HCLK_16              (0x1 << 10) // (EMAC) HCLK divided by 16
+#define     AT91C_EMAC_CLK_HCLK_32              (0x2 << 10) // (EMAC) HCLK divided by 32
+#define     AT91C_EMAC_CLK_HCLK_64              (0x3 << 10) // (EMAC) HCLK divided by 64
+#define AT91C_EMAC_RTY            (0x1 << 12) // (EMAC)
+#define AT91C_EMAC_PAE            (0x1 << 13) // (EMAC)
+#define AT91C_EMAC_RBOF           (0x3 << 14) // (EMAC)
+#define     AT91C_EMAC_RBOF_OFFSET_0             (0x0 << 14) // (EMAC) no offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_1             (0x1 << 14) // (EMAC) one byte offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_2             (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer
+#define     AT91C_EMAC_RBOF_OFFSET_3             (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer
+#define AT91C_EMAC_RLCE           (0x1 << 16) // (EMAC) Receive Length field Checking Enable
+#define AT91C_EMAC_DRFCS          (0x1 << 17) // (EMAC) Discard Receive FCS
+#define AT91C_EMAC_EFRHD          (0x1 << 18) // (EMAC)
+#define AT91C_EMAC_IRXFCS         (0x1 << 19) // (EMAC) Ignore RX FCS
+// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register --------
+#define AT91C_EMAC_LINKR          (0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_MDIO           (0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_IDLE           (0x1 <<  2) // (EMAC)
+// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register --------
+#define AT91C_EMAC_UBR            (0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_COL            (0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_RLES           (0x1 <<  2) // (EMAC)
+#define AT91C_EMAC_TGO            (0x1 <<  3) // (EMAC) Transmit Go
+#define AT91C_EMAC_BEX            (0x1 <<  4) // (EMAC) Buffers exhausted mid frame
+#define AT91C_EMAC_COMP           (0x1 <<  5) // (EMAC)
+#define AT91C_EMAC_UND            (0x1 <<  6) // (EMAC)
+// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register --------
+#define AT91C_EMAC_BNA            (0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_REC            (0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_OVR            (0x1 <<  2) // (EMAC)
+// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register --------
+#define AT91C_EMAC_MFD            (0x1 <<  0) // (EMAC)
+#define AT91C_EMAC_RCOMP          (0x1 <<  1) // (EMAC)
+#define AT91C_EMAC_RXUBR          (0x1 <<  2) // (EMAC)
+#define AT91C_EMAC_TXUBR          (0x1 <<  3) // (EMAC)
+#define AT91C_EMAC_TUNDR          (0x1 <<  4) // (EMAC)
+#define AT91C_EMAC_RLEX           (0x1 <<  5) // (EMAC)
+#define AT91C_EMAC_TXERR          (0x1 <<  6) // (EMAC)
+#define AT91C_EMAC_TCOMP          (0x1 <<  7) // (EMAC)
+#define AT91C_EMAC_LINK           (0x1 <<  9) // (EMAC)
+#define AT91C_EMAC_ROVR           (0x1 << 10) // (EMAC)
+#define AT91C_EMAC_HRESP          (0x1 << 11) // (EMAC)
+#define AT91C_EMAC_PFRE           (0x1 << 12) // (EMAC)
+#define AT91C_EMAC_PTZ            (0x1 << 13) // (EMAC)
+// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register --------
+// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register --------
+// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register --------
+// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register --------
+#define AT91C_EMAC_DATA           (0xFFFF <<  0) // (EMAC)
+#define AT91C_EMAC_CODE           (0x3 << 16) // (EMAC)
+#define AT91C_EMAC_REGA           (0x1F << 18) // (EMAC)
+#define AT91C_EMAC_PHYA           (0x1F << 23) // (EMAC)
+#define AT91C_EMAC_RW             (0x3 << 28) // (EMAC)
+#define AT91C_EMAC_SOF            (0x3 << 30) // (EMAC)
+// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register --------
+#define AT91C_EMAC_RMII           (0x1 <<  0) // (EMAC) Reduce MII
+// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register --------
+#define AT91C_EMAC_IP             (0xFFFF <<  0) // (EMAC) ARP request IP address
+#define AT91C_EMAC_MAG            (0x1 << 16) // (EMAC) Magic packet event enable
+#define AT91C_EMAC_ARP            (0x1 << 17) // (EMAC) ARP request event enable
+#define AT91C_EMAC_SA1            (0x1 << 18) // (EMAC) Specific address register 1 event enable
+// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register --------
+#define AT91C_EMAC_REVREF         (0xFFFF <<  0) // (EMAC)
+#define AT91C_EMAC_PARTREF        (0xFFFF << 16) // (EMAC)
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Analog to Digital Convertor
+// *****************************************************************************
+// *** Register offset in AT91S_ADC structure ***
+#define ADC_CR          ( 0) // ADC Control Register
+#define ADC_MR          ( 4) // ADC Mode Register
+#define ADC_CHER        (16) // ADC Channel Enable Register
+#define ADC_CHDR        (20) // ADC Channel Disable Register
+#define ADC_CHSR        (24) // ADC Channel Status Register
+#define ADC_SR          (28) // ADC Status Register
+#define ADC_LCDR        (32) // ADC Last Converted Data Register
+#define ADC_IER         (36) // ADC Interrupt Enable Register
+#define ADC_IDR         (40) // ADC Interrupt Disable Register
+#define ADC_IMR         (44) // ADC Interrupt Mask Register
+#define ADC_CDR0        (48) // ADC Channel Data Register 0
+#define ADC_CDR1        (52) // ADC Channel Data Register 1
+#define ADC_CDR2        (56) // ADC Channel Data Register 2
+#define ADC_CDR3        (60) // ADC Channel Data Register 3
+#define ADC_CDR4        (64) // ADC Channel Data Register 4
+#define ADC_CDR5        (68) // ADC Channel Data Register 5
+#define ADC_CDR6        (72) // ADC Channel Data Register 6
+#define ADC_CDR7        (76) // ADC Channel Data Register 7
+#define ADC_RPR         (256) // Receive Pointer Register
+#define ADC_RCR         (260) // Receive Counter Register
+#define ADC_TPR         (264) // Transmit Pointer Register
+#define ADC_TCR         (268) // Transmit Counter Register
+#define ADC_RNPR        (272) // Receive Next Pointer Register
+#define ADC_RNCR        (276) // Receive Next Counter Register
+#define ADC_TNPR        (280) // Transmit Next Pointer Register
+#define ADC_TNCR        (284) // Transmit Next Counter Register
+#define ADC_PTCR        (288) // PDC Transfer Control Register
+#define ADC_PTSR        (292) // PDC Transfer Status Register
+// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register --------
+#define AT91C_ADC_SWRST           (0x1 <<  0) // (ADC) Software Reset
+#define AT91C_ADC_START           (0x1 <<  1) // (ADC) Start Conversion
+// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register --------
+#define AT91C_ADC_TRGEN           (0x1 <<  0) // (ADC) Trigger Enable
+#define     AT91C_ADC_TRGEN_DIS                  (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software
+#define     AT91C_ADC_TRGEN_EN                   (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled.
+#define AT91C_ADC_TRGSEL          (0x7 <<  1) // (ADC) Trigger Selection
+#define     AT91C_ADC_TRGSEL_TIOA0                (0x0 <<  1) // (ADC) Selected TRGSEL = TIAO0
+#define     AT91C_ADC_TRGSEL_TIOA1                (0x1 <<  1) // (ADC) Selected TRGSEL = TIAO1
+#define     AT91C_ADC_TRGSEL_TIOA2                (0x2 <<  1) // (ADC) Selected TRGSEL = TIAO2
+#define     AT91C_ADC_TRGSEL_TIOA3                (0x3 <<  1) // (ADC) Selected TRGSEL = TIAO3
+#define     AT91C_ADC_TRGSEL_TIOA4                (0x4 <<  1) // (ADC) Selected TRGSEL = TIAO4
+#define     AT91C_ADC_TRGSEL_TIOA5                (0x5 <<  1) // (ADC) Selected TRGSEL = TIAO5
+#define     AT91C_ADC_TRGSEL_EXT                  (0x6 <<  1) // (ADC) Selected TRGSEL = External Trigger
+#define AT91C_ADC_LOWRES          (0x1 <<  4) // (ADC) Resolution.
+#define     AT91C_ADC_LOWRES_10_BIT               (0x0 <<  4) // (ADC) 10-bit resolution
+#define     AT91C_ADC_LOWRES_8_BIT                (0x1 <<  4) // (ADC) 8-bit resolution
+#define AT91C_ADC_SLEEP           (0x1 <<  5) // (ADC) Sleep Mode
+#define     AT91C_ADC_SLEEP_NORMAL_MODE          (0x0 <<  5) // (ADC) Normal Mode
+#define     AT91C_ADC_SLEEP_MODE                 (0x1 <<  5) // (ADC) Sleep Mode
+#define AT91C_ADC_PRESCAL         (0x3F <<  8) // (ADC) Prescaler rate selection
+#define AT91C_ADC_STARTUP         (0x1F << 16) // (ADC) Startup Time
+#define AT91C_ADC_SHTIM           (0xF << 24) // (ADC) Sample & Hold Time
+// --------     ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register --------
+#define AT91C_ADC_CH0             (0x1 <<  0) // (ADC) Channel 0
+#define AT91C_ADC_CH1             (0x1 <<  1) // (ADC) Channel 1
+#define AT91C_ADC_CH2             (0x1 <<  2) // (ADC) Channel 2
+#define AT91C_ADC_CH3             (0x1 <<  3) // (ADC) Channel 3
+#define AT91C_ADC_CH4             (0x1 <<  4) // (ADC) Channel 4
+#define AT91C_ADC_CH5             (0x1 <<  5) // (ADC) Channel 5
+#define AT91C_ADC_CH6             (0x1 <<  6) // (ADC) Channel 6
+#define AT91C_ADC_CH7             (0x1 <<  7) // (ADC) Channel 7
+// --------     ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register --------
+// --------     ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register --------
+// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register --------
+#define AT91C_ADC_EOC0            (0x1 <<  0) // (ADC) End of Conversion
+#define AT91C_ADC_EOC1            (0x1 <<  1) // (ADC) End of Conversion
+#define AT91C_ADC_EOC2            (0x1 <<  2) // (ADC) End of Conversion
+#define AT91C_ADC_EOC3            (0x1 <<  3) // (ADC) End of Conversion
+#define AT91C_ADC_EOC4            (0x1 <<  4) // (ADC) End of Conversion
+#define AT91C_ADC_EOC5            (0x1 <<  5) // (ADC) End of Conversion
+#define AT91C_ADC_EOC6            (0x1 <<  6) // (ADC) End of Conversion
+#define AT91C_ADC_EOC7            (0x1 <<  7) // (ADC) End of Conversion
+#define AT91C_ADC_OVRE0           (0x1 <<  8) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE1           (0x1 <<  9) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE2           (0x1 << 10) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE3           (0x1 << 11) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE4           (0x1 << 12) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE5           (0x1 << 13) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE6           (0x1 << 14) // (ADC) Overrun Error
+#define AT91C_ADC_OVRE7           (0x1 << 15) // (ADC) Overrun Error
+#define AT91C_ADC_DRDY            (0x1 << 16) // (ADC) Data Ready
+#define AT91C_ADC_GOVRE           (0x1 << 17) // (ADC) General Overrun
+#define AT91C_ADC_ENDRX           (0x1 << 18) // (ADC) End of Receiver Transfer
+#define AT91C_ADC_RXBUFF          (0x1 << 19) // (ADC) RXBUFF Interrupt
+// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register --------
+#define AT91C_ADC_LDATA           (0x3FF <<  0) // (ADC) Last Data Converted
+// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register --------
+// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register --------
+// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register --------
+// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 --------
+#define AT91C_ADC_DATA            (0x3FF <<  0) // (ADC) Converted Data
+// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 --------
+// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 --------
+// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 --------
+// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 --------
+// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 --------
+// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 --------
+// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 --------
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Advanced  Encryption Standard
+// *****************************************************************************
+// *** Register offset in AT91S_AES structure ***
+#define AES_CR          ( 0) // Control Register
+#define AES_MR          ( 4) // Mode Register
+#define AES_IER         (16) // Interrupt Enable Register
+#define AES_IDR         (20) // Interrupt Disable Register
+#define AES_IMR         (24) // Interrupt Mask Register
+#define AES_ISR         (28) // Interrupt Status Register
+#define AES_KEYWxR      (32) // Key Word x Register
+#define AES_IDATAxR     (64) // Input Data x Register
+#define AES_ODATAxR     (80) // Output Data x Register
+#define AES_IVxR        (96) // Initialization Vector x Register
+#define AES_VR          (252) // AES Version Register
+#define AES_RPR         (256) // Receive Pointer Register
+#define AES_RCR         (260) // Receive Counter Register
+#define AES_TPR         (264) // Transmit Pointer Register
+#define AES_TCR         (268) // Transmit Counter Register
+#define AES_RNPR        (272) // Receive Next Pointer Register
+#define AES_RNCR        (276) // Receive Next Counter Register
+#define AES_TNPR        (280) // Transmit Next Pointer Register
+#define AES_TNCR        (284) // Transmit Next Counter Register
+#define AES_PTCR        (288) // PDC Transfer Control Register
+#define AES_PTSR        (292) // PDC Transfer Status Register
+// -------- AES_CR : (AES Offset: 0x0) Control Register --------
+#define AT91C_AES_START           (0x1 <<  0) // (AES) Starts Processing
+#define AT91C_AES_SWRST           (0x1 <<  8) // (AES) Software Reset
+#define AT91C_AES_LOADSEED        (0x1 << 16) // (AES) Random Number Generator Seed Loading
+// -------- AES_MR : (AES Offset: 0x4) Mode Register --------
+#define AT91C_AES_CIPHER          (0x1 <<  0) // (AES) Processing Mode
+#define AT91C_AES_PROCDLY         (0xF <<  4) // (AES) Processing Delay
+#define AT91C_AES_SMOD            (0x3 <<  8) // (AES) Start Mode
+#define     AT91C_AES_SMOD_MANUAL               (0x0 <<  8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption.
+#define     AT91C_AES_SMOD_AUTO                 (0x1 <<  8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet).
+#define     AT91C_AES_SMOD_PDC                  (0x2 <<  8) // (AES) PDC Mode (cf datasheet).
+#define AT91C_AES_OPMOD           (0x7 << 12) // (AES) Operation Mode
+#define     AT91C_AES_OPMOD_ECB                  (0x0 << 12) // (AES) ECB Electronic CodeBook mode.
+#define     AT91C_AES_OPMOD_CBC                  (0x1 << 12) // (AES) CBC Cipher Block Chaining mode.
+#define     AT91C_AES_OPMOD_OFB                  (0x2 << 12) // (AES) OFB Output Feedback mode.
+#define     AT91C_AES_OPMOD_CFB                  (0x3 << 12) // (AES) CFB Cipher Feedback mode.
+#define     AT91C_AES_OPMOD_CTR                  (0x4 << 12) // (AES) CTR Counter mode.
+#define AT91C_AES_LOD             (0x1 << 15) // (AES) Last Output Data Mode
+#define AT91C_AES_CFBS            (0x7 << 16) // (AES) Cipher Feedback Data Size
+#define     AT91C_AES_CFBS_128_BIT              (0x0 << 16) // (AES) 128-bit.
+#define     AT91C_AES_CFBS_64_BIT               (0x1 << 16) // (AES) 64-bit.
+#define     AT91C_AES_CFBS_32_BIT               (0x2 << 16) // (AES) 32-bit.
+#define     AT91C_AES_CFBS_16_BIT               (0x3 << 16) // (AES) 16-bit.
+#define     AT91C_AES_CFBS_8_BIT                (0x4 << 16) // (AES) 8-bit.
+#define AT91C_AES_CKEY            (0xF << 20) // (AES) Countermeasure Key
+#define AT91C_AES_CTYPE           (0x1F << 24) // (AES) Countermeasure Type
+#define     AT91C_AES_CTYPE_TYPE1_EN             (0x1 << 24) // (AES) Countermeasure type 1 is enabled.
+#define     AT91C_AES_CTYPE_TYPE2_EN             (0x2 << 24) // (AES) Countermeasure type 2 is enabled.
+#define     AT91C_AES_CTYPE_TYPE3_EN             (0x4 << 24) // (AES) Countermeasure type 3 is enabled.
+#define     AT91C_AES_CTYPE_TYPE4_EN             (0x8 << 24) // (AES) Countermeasure type 4 is enabled.
+#define     AT91C_AES_CTYPE_TYPE5_EN             (0x10 << 24) // (AES) Countermeasure type 5 is enabled.
+// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register --------
+#define AT91C_AES_DATRDY          (0x1 <<  0) // (AES) DATRDY
+#define AT91C_AES_ENDRX           (0x1 <<  1) // (AES) PDC Read Buffer End
+#define AT91C_AES_ENDTX           (0x1 <<  2) // (AES) PDC Write Buffer End
+#define AT91C_AES_RXBUFF          (0x1 <<  3) // (AES) PDC Read Buffer Full
+#define AT91C_AES_TXBUFE          (0x1 <<  4) // (AES) PDC Write Buffer Empty
+#define AT91C_AES_URAD            (0x1 <<  8) // (AES) Unspecified Register Access Detection
+// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register --------
+// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register --------
+// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register --------
+#define AT91C_AES_URAT            (0x7 << 12) // (AES) Unspecified Register Access Type Status
+#define     AT91C_AES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (AES) Input data register written during the data processing in PDC mode.
+#define     AT91C_AES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (AES) Output data register read during the data processing.
+#define     AT91C_AES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (AES) Mode register written during the data processing.
+#define     AT91C_AES_URAT_OUT_DAT_READ_SUBKEY  (0x3 << 12) // (AES) Output data register read during the sub-keys generation.
+#define     AT91C_AES_URAT_MODEREG_WRITE_SUBKEY (0x4 << 12) // (AES) Mode register written during the sub-keys generation.
+#define     AT91C_AES_URAT_WO_REG_READ          (0x5 << 12) // (AES) Write-only register read access.
+
+// *****************************************************************************
+//              SOFTWARE API DEFINITION  FOR Triple Data Encryption Standard
+// *****************************************************************************
+// *** Register offset in AT91S_TDES structure ***
+#define TDES_CR         ( 0) // Control Register
+#define TDES_MR         ( 4) // Mode Register
+#define TDES_IER        (16) // Interrupt Enable Register
+#define TDES_IDR        (20) // Interrupt Disable Register
+#define TDES_IMR        (24) // Interrupt Mask Register
+#define TDES_ISR        (28) // Interrupt Status Register
+#define TDES_KEY1WxR    (32) // Key 1 Word x Register
+#define TDES_KEY2WxR    (40) // Key 2 Word x Register
+#define TDES_KEY3WxR    (48) // Key 3 Word x Register
+#define TDES_IDATAxR    (64) // Input Data x Register
+#define TDES_ODATAxR    (80) // Output Data x Register
+#define TDES_IVxR       (96) // Initialization Vector x Register
+#define TDES_VR         (252) // TDES Version Register
+#define TDES_RPR        (256) // Receive Pointer Register
+#define TDES_RCR        (260) // Receive Counter Register
+#define TDES_TPR        (264) // Transmit Pointer Register
+#define TDES_TCR        (268) // Transmit Counter Register
+#define TDES_RNPR       (272) // Receive Next Pointer Register
+#define TDES_RNCR       (276) // Receive Next Counter Register
+#define TDES_TNPR       (280) // Transmit Next Pointer Register
+#define TDES_TNCR       (284) // Transmit Next Counter Register
+#define TDES_PTCR       (288) // PDC Transfer Control Register
+#define TDES_PTSR       (292) // PDC Transfer Status Register
+// -------- TDES_CR : (TDES Offset: 0x0) Control Register --------
+#define AT91C_TDES_START          (0x1 <<  0) // (TDES) Starts Processing
+#define AT91C_TDES_SWRST          (0x1 <<  8) // (TDES) Software Reset
+// -------- TDES_MR : (TDES Offset: 0x4) Mode Register --------
+#define AT91C_TDES_CIPHER         (0x1 <<  0) // (TDES) Processing Mode
+#define AT91C_TDES_TDESMOD        (0x1 <<  1) // (TDES) Single or Triple DES Mode
+#define AT91C_TDES_KEYMOD         (0x1 <<  4) // (TDES) Key Mode
+#define AT91C_TDES_SMOD           (0x3 <<  8) // (TDES) Start Mode
+#define     AT91C_TDES_SMOD_MANUAL               (0x0 <<  8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption.
+#define     AT91C_TDES_SMOD_AUTO                 (0x1 <<  8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet).
+#define     AT91C_TDES_SMOD_PDC                  (0x2 <<  8) // (TDES) PDC Mode (cf datasheet).
+#define AT91C_TDES_OPMOD          (0x3 << 12) // (TDES) Operation Mode
+#define     AT91C_TDES_OPMOD_ECB                  (0x0 << 12) // (TDES) ECB Electronic CodeBook mode.
+#define     AT91C_TDES_OPMOD_CBC                  (0x1 << 12) // (TDES) CBC Cipher Block Chaining mode.
+#define     AT91C_TDES_OPMOD_OFB                  (0x2 << 12) // (TDES) OFB Output Feedback mode.
+#define     AT91C_TDES_OPMOD_CFB                  (0x3 << 12) // (TDES) CFB Cipher Feedback mode.
+#define AT91C_TDES_LOD            (0x1 << 15) // (TDES) Last Output Data Mode
+#define AT91C_TDES_CFBS           (0x3 << 16) // (TDES) Cipher Feedback Data Size
+#define     AT91C_TDES_CFBS_64_BIT               (0x0 << 16) // (TDES) 64-bit.
+#define     AT91C_TDES_CFBS_32_BIT               (0x1 << 16) // (TDES) 32-bit.
+#define     AT91C_TDES_CFBS_16_BIT               (0x2 << 16) // (TDES) 16-bit.
+#define     AT91C_TDES_CFBS_8_BIT                (0x3 << 16) // (TDES) 8-bit.
+// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register --------
+#define AT91C_TDES_DATRDY         (0x1 <<  0) // (TDES) DATRDY
+#define AT91C_TDES_ENDRX          (0x1 <<  1) // (TDES) PDC Read Buffer End
+#define AT91C_TDES_ENDTX          (0x1 <<  2) // (TDES) PDC Write Buffer End
+#define AT91C_TDES_RXBUFF         (0x1 <<  3) // (TDES) PDC Read Buffer Full
+#define AT91C_TDES_TXBUFE         (0x1 <<  4) // (TDES) PDC Write Buffer Empty
+#define AT91C_TDES_URAD           (0x1 <<  8) // (TDES) Unspecified Register Access Detection
+// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register --------
+// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register --------
+// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register --------
+#define AT91C_TDES_URAT           (0x3 << 12) // (TDES) Unspecified Register Access Type Status
+#define     AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode.
+#define     AT91C_TDES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (TDES) Output data register read during the data processing.
+#define     AT91C_TDES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (TDES) Mode register written during the data processing.
+#define     AT91C_TDES_URAT_WO_REG_READ          (0x3 << 12) // (TDES) Write-only register read access.
+
+// *****************************************************************************
+//               REGISTER ADDRESS DEFINITION FOR AT91SAM7X256
+// *****************************************************************************
+// ========== Register definition for SYS peripheral ==========
+// ========== Register definition for AIC peripheral ==========
+#define AT91C_AIC_IVR             (0xFFFFF100) // (AIC) IRQ Vector Register
+#define AT91C_AIC_SMR             (0xFFFFF000) // (AIC) Source Mode Register
+#define AT91C_AIC_FVR             (0xFFFFF104) // (AIC) FIQ Vector Register
+#define AT91C_AIC_DCR             (0xFFFFF138) // (AIC) Debug Control Register (Protect)
+#define AT91C_AIC_EOICR           (0xFFFFF130) // (AIC) End of Interrupt Command Register
+#define AT91C_AIC_SVR             (0xFFFFF080) // (AIC) Source Vector Register
+#define AT91C_AIC_FFSR            (0xFFFFF148) // (AIC) Fast Forcing Status Register
+#define AT91C_AIC_ICCR            (0xFFFFF128) // (AIC) Interrupt Clear Command Register
+#define AT91C_AIC_ISR             (0xFFFFF108) // (AIC) Interrupt Status Register
+#define AT91C_AIC_IMR             (0xFFFFF110) // (AIC) Interrupt Mask Register
+#define AT91C_AIC_IPR             (0xFFFFF10C) // (AIC) Interrupt Pending Register
+#define AT91C_AIC_FFER            (0xFFFFF140) // (AIC) Fast Forcing Enable Register
+#define AT91C_AIC_IECR            (0xFFFFF120) // (AIC) Interrupt Enable Command Register
+#define AT91C_AIC_ISCR            (0xFFFFF12C) // (AIC) Interrupt Set Command Register
+#define AT91C_AIC_FFDR            (0xFFFFF144) // (AIC) Fast Forcing Disable Register
+#define AT91C_AIC_CISR            (0xFFFFF114) // (AIC) Core Interrupt Status Register
+#define AT91C_AIC_IDCR            (0xFFFFF124) // (AIC) Interrupt Disable Command Register
+#define AT91C_AIC_SPU             (0xFFFFF134) // (AIC) Spurious Vector Register
+// ========== Register definition for PDC_DBGU peripheral ==========
+#define AT91C_DBGU_TCR            (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register
+#define AT91C_DBGU_RNPR           (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register
+#define AT91C_DBGU_TNPR           (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register
+#define AT91C_DBGU_TPR            (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register
+#define AT91C_DBGU_RPR            (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register
+#define AT91C_DBGU_RCR            (0xFFFFF304) // (PDC_DBGU) Receive Counter Register
+#define AT91C_DBGU_RNCR           (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register
+#define AT91C_DBGU_PTCR           (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register
+#define AT91C_DBGU_PTSR           (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register
+#define AT91C_DBGU_TNCR           (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register
+// ========== Register definition for DBGU peripheral ==========
+#define AT91C_DBGU_EXID           (0xFFFFF244) // (DBGU) Chip ID Extension Register
+#define AT91C_DBGU_BRGR           (0xFFFFF220) // (DBGU) Baud Rate Generator Register
+#define AT91C_DBGU_IDR            (0xFFFFF20C) // (DBGU) Interrupt Disable Register
+#define AT91C_DBGU_CSR            (0xFFFFF214) // (DBGU) Channel Status Register
+#define AT91C_DBGU_CIDR           (0xFFFFF240) // (DBGU) Chip ID Register
+#define AT91C_DBGU_MR             (0xFFFFF204) // (DBGU) Mode Register
+#define AT91C_DBGU_IMR            (0xFFFFF210) // (DBGU) Interrupt Mask Register
+#define AT91C_DBGU_CR             (0xFFFFF200) // (DBGU) Control Register
+#define AT91C_DBGU_FNTR           (0xFFFFF248) // (DBGU) Force NTRST Register
+#define AT91C_DBGU_THR            (0xFFFFF21C) // (DBGU) Transmitter Holding Register
+#define AT91C_DBGU_RHR            (0xFFFFF218) // (DBGU) Receiver Holding Register
+#define AT91C_DBGU_IER            (0xFFFFF208) // (DBGU) Interrupt Enable Register
+// ========== Register definition for PIOA peripheral ==========
+#define AT91C_PIOA_ODR            (0xFFFFF414) // (PIOA) Output Disable Registerr
+#define AT91C_PIOA_SODR           (0xFFFFF430) // (PIOA) Set Output Data Register
+#define AT91C_PIOA_ISR            (0xFFFFF44C) // (PIOA) Interrupt Status Register
+#define AT91C_PIOA_ABSR           (0xFFFFF478) // (PIOA) AB Select Status Register
+#define AT91C_PIOA_IER            (0xFFFFF440) // (PIOA) Interrupt Enable Register
+#define AT91C_PIOA_PPUDR          (0xFFFFF460) // (PIOA) Pull-up Disable Register
+#define AT91C_PIOA_IMR            (0xFFFFF448) // (PIOA) Interrupt Mask Register
+#define AT91C_PIOA_PER            (0xFFFFF400) // (PIOA) PIO Enable Register
+#define AT91C_PIOA_IFDR           (0xFFFFF424) // (PIOA) Input Filter Disable Register
+#define AT91C_PIOA_OWDR           (0xFFFFF4A4) // (PIOA) Output Write Disable Register
+#define AT91C_PIOA_MDSR           (0xFFFFF458) // (PIOA) Multi-driver Status Register
+#define AT91C_PIOA_IDR            (0xFFFFF444) // (PIOA) Interrupt Disable Register
+#define AT91C_PIOA_ODSR           (0xFFFFF438) // (PIOA) Output Data Status Register
+#define AT91C_PIOA_PPUSR          (0xFFFFF468) // (PIOA) Pull-up Status Register
+#define AT91C_PIOA_OWSR           (0xFFFFF4A8) // (PIOA) Output Write Status Register
+#define AT91C_PIOA_BSR            (0xFFFFF474) // (PIOA) Select B Register
+#define AT91C_PIOA_OWER           (0xFFFFF4A0) // (PIOA) Output Write Enable Register
+#define AT91C_PIOA_IFER           (0xFFFFF420) // (PIOA) Input Filter Enable Register
+#define AT91C_PIOA_PDSR           (0xFFFFF43C) // (PIOA) Pin Data Status Register
+#define AT91C_PIOA_PPUER          (0xFFFFF464) // (PIOA) Pull-up Enable Register
+#define AT91C_PIOA_OSR            (0xFFFFF418) // (PIOA) Output Status Register
+#define AT91C_PIOA_ASR            (0xFFFFF470) // (PIOA) Select A Register
+#define AT91C_PIOA_MDDR           (0xFFFFF454) // (PIOA) Multi-driver Disable Register
+#define AT91C_PIOA_CODR           (0xFFFFF434) // (PIOA) Clear Output Data Register
+#define AT91C_PIOA_MDER           (0xFFFFF450) // (PIOA) Multi-driver Enable Register
+#define AT91C_PIOA_PDR            (0xFFFFF404) // (PIOA) PIO Disable Register
+#define AT91C_PIOA_IFSR           (0xFFFFF428) // (PIOA) Input Filter Status Register
+#define AT91C_PIOA_OER            (0xFFFFF410) // (PIOA) Output Enable Register
+#define AT91C_PIOA_PSR            (0xFFFFF408) // (PIOA) PIO Status Register
+// ========== Register definition for PIOB peripheral ==========
+#define AT91C_PIOB_OWDR           (0xFFFFF6A4) // (PIOB) Output Write Disable Register
+#define AT91C_PIOB_MDER           (0xFFFFF650) // (PIOB) Multi-driver Enable Register
+#define AT91C_PIOB_PPUSR          (0xFFFFF668) // (PIOB) Pull-up Status Register
+#define AT91C_PIOB_IMR            (0xFFFFF648) // (PIOB) Interrupt Mask Register
+#define AT91C_PIOB_ASR            (0xFFFFF670) // (PIOB) Select A Register
+#define AT91C_PIOB_PPUDR          (0xFFFFF660) // (PIOB) Pull-up Disable Register
+#define AT91C_PIOB_PSR            (0xFFFFF608) // (PIOB) PIO Status Register
+#define AT91C_PIOB_IER            (0xFFFFF640) // (PIOB) Interrupt Enable Register
+#define AT91C_PIOB_CODR           (0xFFFFF634) // (PIOB) Clear Output Data Register
+#define AT91C_PIOB_OWER           (0xFFFFF6A0) // (PIOB) Output Write Enable Register
+#define AT91C_PIOB_ABSR           (0xFFFFF678) // (PIOB) AB Select Status Register
+#define AT91C_PIOB_IFDR           (0xFFFFF624) // (PIOB) Input Filter Disable Register
+#define AT91C_PIOB_PDSR           (0xFFFFF63C) // (PIOB) Pin Data Status Register
+#define AT91C_PIOB_IDR            (0xFFFFF644) // (PIOB) Interrupt Disable Register
+#define AT91C_PIOB_OWSR           (0xFFFFF6A8) // (PIOB) Output Write Status Register
+#define AT91C_PIOB_PDR            (0xFFFFF604) // (PIOB) PIO Disable Register
+#define AT91C_PIOB_ODR            (0xFFFFF614) // (PIOB) Output Disable Registerr
+#define AT91C_PIOB_IFSR           (0xFFFFF628) // (PIOB) Input Filter Status Register
+#define AT91C_PIOB_PPUER          (0xFFFFF664) // (PIOB) Pull-up Enable Register
+#define AT91C_PIOB_SODR           (0xFFFFF630) // (PIOB) Set Output Data Register
+#define AT91C_PIOB_ISR            (0xFFFFF64C) // (PIOB) Interrupt Status Register
+#define AT91C_PIOB_ODSR           (0xFFFFF638) // (PIOB) Output Data Status Register
+#define AT91C_PIOB_OSR            (0xFFFFF618) // (PIOB) Output Status Register
+#define AT91C_PIOB_MDSR           (0xFFFFF658) // (PIOB) Multi-driver Status Register
+#define AT91C_PIOB_IFER           (0xFFFFF620) // (PIOB) Input Filter Enable Register
+#define AT91C_PIOB_BSR            (0xFFFFF674) // (PIOB) Select B Register
+#define AT91C_PIOB_MDDR           (0xFFFFF654) // (PIOB) Multi-driver Disable Register
+#define AT91C_PIOB_OER            (0xFFFFF610) // (PIOB) Output Enable Register
+#define AT91C_PIOB_PER            (0xFFFFF600) // (PIOB) PIO Enable Register
+// ========== Register definition for CKGR peripheral ==========
+#define AT91C_CKGR_MOR            (0xFFFFFC20) // (CKGR) Main Oscillator Register
+#define AT91C_CKGR_PLLR           (0xFFFFFC2C) // (CKGR) PLL Register
+#define AT91C_CKGR_MCFR           (0xFFFFFC24) // (CKGR) Main Clock  Frequency Register
+// ========== Register definition for PMC peripheral ==========
+#define AT91C_PMC_IDR             (0xFFFFFC64) // (PMC) Interrupt Disable Register
+#define AT91C_PMC_MOR             (0xFFFFFC20) // (PMC) Main Oscillator Register
+#define AT91C_PMC_PLLR            (0xFFFFFC2C) // (PMC) PLL Register
+#define AT91C_PMC_PCER            (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register
+#define AT91C_PMC_PCKR            (0xFFFFFC40) // (PMC) Programmable Clock Register
+#define AT91C_PMC_MCKR            (0xFFFFFC30) // (PMC) Master Clock Register
+#define AT91C_PMC_SCDR            (0xFFFFFC04) // (PMC) System Clock Disable Register
+#define AT91C_PMC_PCDR            (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register
+#define AT91C_PMC_SCSR            (0xFFFFFC08) // (PMC) System Clock Status Register
+#define AT91C_PMC_PCSR            (0xFFFFFC18) // (PMC) Peripheral Clock Status Register
+#define AT91C_PMC_MCFR            (0xFFFFFC24) // (PMC) Main Clock  Frequency Register
+#define AT91C_PMC_SCER            (0xFFFFFC00) // (PMC) System Clock Enable Register
+#define AT91C_PMC_IMR             (0xFFFFFC6C) // (PMC) Interrupt Mask Register
+#define AT91C_PMC_IER             (0xFFFFFC60) // (PMC) Interrupt Enable Register
+#define AT91C_PMC_SR              (0xFFFFFC68) // (PMC) Status Register
+// ========== Register definition for RSTC peripheral ==========
+#define AT91C_RSTC_RCR            (0xFFFFFD00) // (RSTC) Reset Control Register
+#define AT91C_RSTC_RMR            (0xFFFFFD08) // (RSTC) Reset Mode Register
+#define AT91C_RSTC_RSR            (0xFFFFFD04) // (RSTC) Reset Status Register
+// ========== Register definition for RTTC peripheral ==========
+#define AT91C_RTTC_RTSR           (0xFFFFFD2C) // (RTTC) Real-time Status Register
+#define AT91C_RTTC_RTMR           (0xFFFFFD20) // (RTTC) Real-time Mode Register
+#define AT91C_RTTC_RTVR           (0xFFFFFD28) // (RTTC) Real-time Value Register
+#define AT91C_RTTC_RTAR           (0xFFFFFD24) // (RTTC) Real-time Alarm Register
+// ========== Register definition for PITC peripheral ==========
+#define AT91C_PITC_PIVR           (0xFFFFFD38) // (PITC) Period Interval Value Register
+#define AT91C_PITC_PISR           (0xFFFFFD34) // (PITC) Period Interval Status Register
+#define AT91C_PITC_PIIR           (0xFFFFFD3C) // (PITC) Period Interval Image Register
+#define AT91C_PITC_PIMR           (0xFFFFFD30) // (PITC) Period Interval Mode Register
+// ========== Register definition for WDTC peripheral ==========
+#define AT91C_WDTC_WDCR           (0xFFFFFD40) // (WDTC) Watchdog Control Register
+#define AT91C_WDTC_WDSR           (0xFFFFFD48) // (WDTC) Watchdog Status Register
+#define AT91C_WDTC_WDMR           (0xFFFFFD44) // (WDTC) Watchdog Mode Register
+// ========== Register definition for VREG peripheral ==========
+#define AT91C_VREG_MR             (0xFFFFFD60) // (VREG) Voltage Regulator Mode Register
+// ========== Register definition for MC peripheral ==========
+#define AT91C_MC_ASR              (0xFFFFFF04) // (MC) MC Abort Status Register
+#define AT91C_MC_RCR              (0xFFFFFF00) // (MC) MC Remap Control Register
+#define AT91C_MC_FCR              (0xFFFFFF64) // (MC) MC Flash Command Register
+#define AT91C_MC_AASR             (0xFFFFFF08) // (MC) MC Abort Address Status Register
+#define AT91C_MC_FSR              (0xFFFFFF68) // (MC) MC Flash Status Register
+#define AT91C_MC_FMR              (0xFFFFFF60) // (MC) MC Flash Mode Register
+// ========== Register definition for PDC_SPI1 peripheral ==========
+#define AT91C_SPI1_PTCR           (0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register
+#define AT91C_SPI1_RPR            (0xFFFE4100) // (PDC_SPI1) Receive Pointer Register
+#define AT91C_SPI1_TNCR           (0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register
+#define AT91C_SPI1_TPR            (0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register
+#define AT91C_SPI1_TNPR           (0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register
+#define AT91C_SPI1_TCR            (0xFFFE410C) // (PDC_SPI1) Transmit Counter Register
+#define AT91C_SPI1_RCR            (0xFFFE4104) // (PDC_SPI1) Receive Counter Register
+#define AT91C_SPI1_RNPR           (0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register
+#define AT91C_SPI1_RNCR           (0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register
+#define AT91C_SPI1_PTSR           (0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register
+// ========== Register definition for SPI1 peripheral ==========
+#define AT91C_SPI1_IMR            (0xFFFE401C) // (SPI1) Interrupt Mask Register
+#define AT91C_SPI1_IER            (0xFFFE4014) // (SPI1) Interrupt Enable Register
+#define AT91C_SPI1_MR             (0xFFFE4004) // (SPI1) Mode Register
+#define AT91C_SPI1_RDR            (0xFFFE4008) // (SPI1) Receive Data Register
+#define AT91C_SPI1_IDR            (0xFFFE4018) // (SPI1) Interrupt Disable Register
+#define AT91C_SPI1_SR             (0xFFFE4010) // (SPI1) Status Register
+#define AT91C_SPI1_TDR            (0xFFFE400C) // (SPI1) Transmit Data Register
+#define AT91C_SPI1_CR             (0xFFFE4000) // (SPI1) Control Register
+#define AT91C_SPI1_CSR            (0xFFFE4030) // (SPI1) Chip Select Register
+// ========== Register definition for PDC_SPI0 peripheral ==========
+#define AT91C_SPI0_PTCR           (0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register
+#define AT91C_SPI0_TPR            (0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register
+#define AT91C_SPI0_TCR            (0xFFFE010C) // (PDC_SPI0) Transmit Counter Register
+#define AT91C_SPI0_RCR            (0xFFFE0104) // (PDC_SPI0) Receive Counter Register
+#define AT91C_SPI0_PTSR           (0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register
+#define AT91C_SPI0_RNPR           (0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register
+#define AT91C_SPI0_RPR            (0xFFFE0100) // (PDC_SPI0) Receive Pointer Register
+#define AT91C_SPI0_TNCR           (0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register
+#define AT91C_SPI0_RNCR           (0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register
+#define AT91C_SPI0_TNPR           (0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register
+// ========== Register definition for SPI0 peripheral ==========
+#define AT91C_SPI0_IER            (0xFFFE0014) // (SPI0) Interrupt Enable Register
+#define AT91C_SPI0_SR             (0xFFFE0010) // (SPI0) Status Register
+#define AT91C_SPI0_IDR            (0xFFFE0018) // (SPI0) Interrupt Disable Register
+#define AT91C_SPI0_CR             (0xFFFE0000) // (SPI0) Control Register
+#define AT91C_SPI0_MR             (0xFFFE0004) // (SPI0) Mode Register
+#define AT91C_SPI0_IMR            (0xFFFE001C) // (SPI0) Interrupt Mask Register
+#define AT91C_SPI0_TDR            (0xFFFE000C) // (SPI0) Transmit Data Register
+#define AT91C_SPI0_RDR            (0xFFFE0008) // (SPI0) Receive Data Register
+#define AT91C_SPI0_CSR            (0xFFFE0030) // (SPI0) Chip Select Register
+// ========== Register definition for PDC_US1 peripheral ==========
+#define AT91C_US1_RNCR            (0xFFFC4114) // (PDC_US1) Receive Next Counter Register
+#define AT91C_US1_PTCR            (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register
+#define AT91C_US1_TCR             (0xFFFC410C) // (PDC_US1) Transmit Counter Register
+#define AT91C_US1_PTSR            (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register
+#define AT91C_US1_TNPR            (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register
+#define AT91C_US1_RCR             (0xFFFC4104) // (PDC_US1) Receive Counter Register
+#define AT91C_US1_RNPR            (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register
+#define AT91C_US1_RPR             (0xFFFC4100) // (PDC_US1) Receive Pointer Register
+#define AT91C_US1_TNCR            (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register
+#define AT91C_US1_TPR             (0xFFFC4108) // (PDC_US1) Transmit Pointer Register
+// ========== Register definition for US1 peripheral ==========
+#define AT91C_US1_IF              (0xFFFC404C) // (US1) IRDA_FILTER Register
+#define AT91C_US1_NER             (0xFFFC4044) // (US1) Nb Errors Register
+#define AT91C_US1_RTOR            (0xFFFC4024) // (US1) Receiver Time-out Register
+#define AT91C_US1_CSR             (0xFFFC4014) // (US1) Channel Status Register
+#define AT91C_US1_IDR             (0xFFFC400C) // (US1) Interrupt Disable Register
+#define AT91C_US1_IER             (0xFFFC4008) // (US1) Interrupt Enable Register
+#define AT91C_US1_THR             (0xFFFC401C) // (US1) Transmitter Holding Register
+#define AT91C_US1_TTGR            (0xFFFC4028) // (US1) Transmitter Time-guard Register
+#define AT91C_US1_RHR             (0xFFFC4018) // (US1) Receiver Holding Register
+#define AT91C_US1_BRGR            (0xFFFC4020) // (US1) Baud Rate Generator Register
+#define AT91C_US1_IMR             (0xFFFC4010) // (US1) Interrupt Mask Register
+#define AT91C_US1_FIDI            (0xFFFC4040) // (US1) FI_DI_Ratio Register
+#define AT91C_US1_CR              (0xFFFC4000) // (US1) Control Register
+#define AT91C_US1_MR              (0xFFFC4004) // (US1) Mode Register
+// ========== Register definition for PDC_US0 peripheral ==========
+#define AT91C_US0_TNPR            (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register
+#define AT91C_US0_RNPR            (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register
+#define AT91C_US0_TCR             (0xFFFC010C) // (PDC_US0) Transmit Counter Register
+#define AT91C_US0_PTCR            (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register
+#define AT91C_US0_PTSR            (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register
+#define AT91C_US0_TNCR            (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register
+#define AT91C_US0_TPR             (0xFFFC0108) // (PDC_US0) Transmit Pointer Register
+#define AT91C_US0_RCR             (0xFFFC0104) // (PDC_US0) Receive Counter Register
+#define AT91C_US0_RPR             (0xFFFC0100) // (PDC_US0) Receive Pointer Register
+#define AT91C_US0_RNCR            (0xFFFC0114) // (PDC_US0) Receive Next Counter Register
+// ========== Register definition for US0 peripheral ==========
+#define AT91C_US0_BRGR            (0xFFFC0020) // (US0) Baud Rate Generator Register
+#define AT91C_US0_NER             (0xFFFC0044) // (US0) Nb Errors Register
+#define AT91C_US0_CR              (0xFFFC0000) // (US0) Control Register
+#define AT91C_US0_IMR             (0xFFFC0010) // (US0) Interrupt Mask Register
+#define AT91C_US0_FIDI            (0xFFFC0040) // (US0) FI_DI_Ratio Register
+#define AT91C_US0_TTGR            (0xFFFC0028) // (US0) Transmitter Time-guard Register
+#define AT91C_US0_MR              (0xFFFC0004) // (US0) Mode Register
+#define AT91C_US0_RTOR            (0xFFFC0024) // (US0) Receiver Time-out Register
+#define AT91C_US0_CSR             (0xFFFC0014) // (US0) Channel Status Register
+#define AT91C_US0_RHR             (0xFFFC0018) // (US0) Receiver Holding Register
+#define AT91C_US0_IDR             (0xFFFC000C) // (US0) Interrupt Disable Register
+#define AT91C_US0_THR             (0xFFFC001C) // (US0) Transmitter Holding Register
+#define AT91C_US0_IF              (0xFFFC004C) // (US0) IRDA_FILTER Register
+#define AT91C_US0_IER             (0xFFFC0008) // (US0) Interrupt Enable Register
+// ========== Register definition for PDC_SSC peripheral ==========
+#define AT91C_SSC_TNCR            (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register
+#define AT91C_SSC_RPR             (0xFFFD4100) // (PDC_SSC) Receive Pointer Register
+#define AT91C_SSC_RNCR            (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register
+#define AT91C_SSC_TPR             (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register
+#define AT91C_SSC_PTCR            (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register
+#define AT91C_SSC_TCR             (0xFFFD410C) // (PDC_SSC) Transmit Counter Register
+#define AT91C_SSC_RCR             (0xFFFD4104) // (PDC_SSC) Receive Counter Register
+#define AT91C_SSC_RNPR            (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register
+#define AT91C_SSC_TNPR            (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register
+#define AT91C_SSC_PTSR            (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register
+// ========== Register definition for SSC peripheral ==========
+#define AT91C_SSC_RHR             (0xFFFD4020) // (SSC) Receive Holding Register
+#define AT91C_SSC_RSHR            (0xFFFD4030) // (SSC) Receive Sync Holding Register
+#define AT91C_SSC_TFMR            (0xFFFD401C) // (SSC) Transmit Frame Mode Register
+#define AT91C_SSC_IDR             (0xFFFD4048) // (SSC) Interrupt Disable Register
+#define AT91C_SSC_THR             (0xFFFD4024) // (SSC) Transmit Holding Register
+#define AT91C_SSC_RCMR            (0xFFFD4010) // (SSC) Receive Clock ModeRegister
+#define AT91C_SSC_IER             (0xFFFD4044) // (SSC) Interrupt Enable Register
+#define AT91C_SSC_TSHR            (0xFFFD4034) // (SSC) Transmit Sync Holding Register
+#define AT91C_SSC_SR              (0xFFFD4040) // (SSC) Status Register
+#define AT91C_SSC_CMR             (0xFFFD4004) // (SSC) Clock Mode Register
+#define AT91C_SSC_TCMR            (0xFFFD4018) // (SSC) Transmit Clock Mode Register
+#define AT91C_SSC_CR              (0xFFFD4000) // (SSC) Control Register
+#define AT91C_SSC_IMR             (0xFFFD404C) // (SSC) Interrupt Mask Register
+#define AT91C_SSC_RFMR            (0xFFFD4014) // (SSC) Receive Frame Mode Register
+// ========== Register definition for TWI peripheral ==========
+#define AT91C_TWI_IER             (0xFFFB8024) // (TWI) Interrupt Enable Register
+#define AT91C_TWI_CR              (0xFFFB8000) // (TWI) Control Register
+#define AT91C_TWI_SR              (0xFFFB8020) // (TWI) Status Register
+#define AT91C_TWI_IMR             (0xFFFB802C) // (TWI) Interrupt Mask Register
+#define AT91C_TWI_THR             (0xFFFB8034) // (TWI) Transmit Holding Register
+#define AT91C_TWI_IDR             (0xFFFB8028) // (TWI) Interrupt Disable Register
+#define AT91C_TWI_IADR            (0xFFFB800C) // (TWI) Internal Address Register
+#define AT91C_TWI_MMR             (0xFFFB8004) // (TWI) Master Mode Register
+#define AT91C_TWI_CWGR            (0xFFFB8010) // (TWI) Clock Waveform Generator Register
+#define AT91C_TWI_RHR             (0xFFFB8030) // (TWI) Receive Holding Register
+// ========== Register definition for PWMC_CH3 peripheral ==========
+#define AT91C_PWMC_CH3_CUPDR      (0xFFFCC270) // (PWMC_CH3) Channel Update Register
+#define AT91C_PWMC_CH3_Reserved   (0xFFFCC274) // (PWMC_CH3) Reserved
+#define AT91C_PWMC_CH3_CPRDR      (0xFFFCC268) // (PWMC_CH3) Channel Period Register
+#define AT91C_PWMC_CH3_CDTYR      (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register
+#define AT91C_PWMC_CH3_CCNTR      (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register
+#define AT91C_PWMC_CH3_CMR        (0xFFFCC260) // (PWMC_CH3) Channel Mode Register
+// ========== Register definition for PWMC_CH2 peripheral ==========
+#define AT91C_PWMC_CH2_Reserved   (0xFFFCC254) // (PWMC_CH2) Reserved
+#define AT91C_PWMC_CH2_CMR        (0xFFFCC240) // (PWMC_CH2) Channel Mode Register
+#define AT91C_PWMC_CH2_CCNTR      (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register
+#define AT91C_PWMC_CH2_CPRDR      (0xFFFCC248) // (PWMC_CH2) Channel Period Register
+#define AT91C_PWMC_CH2_CUPDR      (0xFFFCC250) // (PWMC_CH2) Channel Update Register
+#define AT91C_PWMC_CH2_CDTYR      (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register
+// ========== Register definition for PWMC_CH1 peripheral ==========
+#define AT91C_PWMC_CH1_Reserved   (0xFFFCC234) // (PWMC_CH1) Reserved
+#define AT91C_PWMC_CH1_CUPDR      (0xFFFCC230) // (PWMC_CH1) Channel Update Register
+#define AT91C_PWMC_CH1_CPRDR      (0xFFFCC228) // (PWMC_CH1) Channel Period Register
+#define AT91C_PWMC_CH1_CCNTR      (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register
+#define AT91C_PWMC_CH1_CDTYR      (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register
+#define AT91C_PWMC_CH1_CMR        (0xFFFCC220) // (PWMC_CH1) Channel Mode Register
+// ========== Register definition for PWMC_CH0 peripheral ==========
+#define AT91C_PWMC_CH0_Reserved   (0xFFFCC214) // (PWMC_CH0) Reserved
+#define AT91C_PWMC_CH0_CPRDR      (0xFFFCC208) // (PWMC_CH0) Channel Period Register
+#define AT91C_PWMC_CH0_CDTYR      (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register
+#define AT91C_PWMC_CH0_CMR        (0xFFFCC200) // (PWMC_CH0) Channel Mode Register
+#define AT91C_PWMC_CH0_CUPDR      (0xFFFCC210) // (PWMC_CH0) Channel Update Register
+#define AT91C_PWMC_CH0_CCNTR      (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register
+// ========== Register definition for PWMC peripheral ==========
+#define AT91C_PWMC_IDR            (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register
+#define AT91C_PWMC_DIS            (0xFFFCC008) // (PWMC) PWMC Disable Register
+#define AT91C_PWMC_IER            (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register
+#define AT91C_PWMC_VR             (0xFFFCC0FC) // (PWMC) PWMC Version Register
+#define AT91C_PWMC_ISR            (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register
+#define AT91C_PWMC_SR             (0xFFFCC00C) // (PWMC) PWMC Status Register
+#define AT91C_PWMC_IMR            (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register
+#define AT91C_PWMC_MR             (0xFFFCC000) // (PWMC) PWMC Mode Register
+#define AT91C_PWMC_ENA            (0xFFFCC004) // (PWMC) PWMC Enable Register
+// ========== Register definition for UDP peripheral ==========
+#define AT91C_UDP_IMR             (0xFFFB0018) // (UDP) Interrupt Mask Register
+#define AT91C_UDP_FADDR           (0xFFFB0008) // (UDP) Function Address Register
+#define AT91C_UDP_NUM             (0xFFFB0000) // (UDP) Frame Number Register
+#define AT91C_UDP_FDR             (0xFFFB0050) // (UDP) Endpoint FIFO Data Register
+#define AT91C_UDP_ISR             (0xFFFB001C) // (UDP) Interrupt Status Register
+#define AT91C_UDP_CSR             (0xFFFB0030) // (UDP) Endpoint Control and Status Register
+#define AT91C_UDP_IDR             (0xFFFB0014) // (UDP) Interrupt Disable Register
+#define AT91C_UDP_ICR             (0xFFFB0020) // (UDP) Interrupt Clear Register
+#define AT91C_UDP_RSTEP           (0xFFFB0028) // (UDP) Reset Endpoint Register
+#define AT91C_UDP_TXVC            (0xFFFB0074) // (UDP) Transceiver Control Register
+#define AT91C_UDP_GLBSTATE        (0xFFFB0004) // (UDP) Global State Register
+#define AT91C_UDP_IER             (0xFFFB0010) // (UDP) Interrupt Enable Register
+// ========== Register definition for TC0 peripheral ==========
+#define AT91C_TC0_SR              (0xFFFA0020) // (TC0) Status Register
+#define AT91C_TC0_RC              (0xFFFA001C) // (TC0) Register C
+#define AT91C_TC0_RB              (0xFFFA0018) // (TC0) Register B
+#define AT91C_TC0_CCR             (0xFFFA0000) // (TC0) Channel Control Register
+#define AT91C_TC0_CMR             (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC0_IER             (0xFFFA0024) // (TC0) Interrupt Enable Register
+#define AT91C_TC0_RA              (0xFFFA0014) // (TC0) Register A
+#define AT91C_TC0_IDR             (0xFFFA0028) // (TC0) Interrupt Disable Register
+#define AT91C_TC0_CV              (0xFFFA0010) // (TC0) Counter Value
+#define AT91C_TC0_IMR             (0xFFFA002C) // (TC0) Interrupt Mask Register
+// ========== Register definition for TC1 peripheral ==========
+#define AT91C_TC1_RB              (0xFFFA0058) // (TC1) Register B
+#define AT91C_TC1_CCR             (0xFFFA0040) // (TC1) Channel Control Register
+#define AT91C_TC1_IER             (0xFFFA0064) // (TC1) Interrupt Enable Register
+#define AT91C_TC1_IDR             (0xFFFA0068) // (TC1) Interrupt Disable Register
+#define AT91C_TC1_SR              (0xFFFA0060) // (TC1) Status Register
+#define AT91C_TC1_CMR             (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC1_RA              (0xFFFA0054) // (TC1) Register A
+#define AT91C_TC1_RC              (0xFFFA005C) // (TC1) Register C
+#define AT91C_TC1_IMR             (0xFFFA006C) // (TC1) Interrupt Mask Register
+#define AT91C_TC1_CV              (0xFFFA0050) // (TC1) Counter Value
+// ========== Register definition for TC2 peripheral ==========
+#define AT91C_TC2_CMR             (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode)
+#define AT91C_TC2_CCR             (0xFFFA0080) // (TC2) Channel Control Register
+#define AT91C_TC2_CV              (0xFFFA0090) // (TC2) Counter Value
+#define AT91C_TC2_RA              (0xFFFA0094) // (TC2) Register A
+#define AT91C_TC2_RB              (0xFFFA0098) // (TC2) Register B
+#define AT91C_TC2_IDR             (0xFFFA00A8) // (TC2) Interrupt Disable Register
+#define AT91C_TC2_IMR             (0xFFFA00AC) // (TC2) Interrupt Mask Register
+#define AT91C_TC2_RC              (0xFFFA009C) // (TC2) Register C
+#define AT91C_TC2_IER             (0xFFFA00A4) // (TC2) Interrupt Enable Register
+#define AT91C_TC2_SR              (0xFFFA00A0) // (TC2) Status Register
+// ========== Register definition for TCB peripheral ==========
+#define AT91C_TCB_BMR             (0xFFFA00C4) // (TCB) TC Block Mode Register
+#define AT91C_TCB_BCR             (0xFFFA00C0) // (TCB) TC Block Control Register
+// ========== Register definition for CAN_MB0 peripheral ==========
+#define AT91C_CAN_MB0_MDL         (0xFFFD0214) // (CAN_MB0) MailBox Data Low Register
+#define AT91C_CAN_MB0_MAM         (0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB0_MCR         (0xFFFD021C) // (CAN_MB0) MailBox Control Register
+#define AT91C_CAN_MB0_MID         (0xFFFD0208) // (CAN_MB0) MailBox ID Register
+#define AT91C_CAN_MB0_MSR         (0xFFFD0210) // (CAN_MB0) MailBox Status Register
+#define AT91C_CAN_MB0_MFID        (0xFFFD020C) // (CAN_MB0) MailBox Family ID Register
+#define AT91C_CAN_MB0_MDH         (0xFFFD0218) // (CAN_MB0) MailBox Data High Register
+#define AT91C_CAN_MB0_MMR         (0xFFFD0200) // (CAN_MB0) MailBox Mode Register
+// ========== Register definition for CAN_MB1 peripheral ==========
+#define AT91C_CAN_MB1_MDL         (0xFFFD0234) // (CAN_MB1) MailBox Data Low Register
+#define AT91C_CAN_MB1_MID         (0xFFFD0228) // (CAN_MB1) MailBox ID Register
+#define AT91C_CAN_MB1_MMR         (0xFFFD0220) // (CAN_MB1) MailBox Mode Register
+#define AT91C_CAN_MB1_MSR         (0xFFFD0230) // (CAN_MB1) MailBox Status Register
+#define AT91C_CAN_MB1_MAM         (0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB1_MDH         (0xFFFD0238) // (CAN_MB1) MailBox Data High Register
+#define AT91C_CAN_MB1_MCR         (0xFFFD023C) // (CAN_MB1) MailBox Control Register
+#define AT91C_CAN_MB1_MFID        (0xFFFD022C) // (CAN_MB1) MailBox Family ID Register
+// ========== Register definition for CAN_MB2 peripheral ==========
+#define AT91C_CAN_MB2_MCR         (0xFFFD025C) // (CAN_MB2) MailBox Control Register
+#define AT91C_CAN_MB2_MDH         (0xFFFD0258) // (CAN_MB2) MailBox Data High Register
+#define AT91C_CAN_MB2_MID         (0xFFFD0248) // (CAN_MB2) MailBox ID Register
+#define AT91C_CAN_MB2_MDL         (0xFFFD0254) // (CAN_MB2) MailBox Data Low Register
+#define AT91C_CAN_MB2_MMR         (0xFFFD0240) // (CAN_MB2) MailBox Mode Register
+#define AT91C_CAN_MB2_MAM         (0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB2_MFID        (0xFFFD024C) // (CAN_MB2) MailBox Family ID Register
+#define AT91C_CAN_MB2_MSR         (0xFFFD0250) // (CAN_MB2) MailBox Status Register
+// ========== Register definition for CAN_MB3 peripheral ==========
+#define AT91C_CAN_MB3_MFID        (0xFFFD026C) // (CAN_MB3) MailBox Family ID Register
+#define AT91C_CAN_MB3_MAM         (0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB3_MID         (0xFFFD0268) // (CAN_MB3) MailBox ID Register
+#define AT91C_CAN_MB3_MCR         (0xFFFD027C) // (CAN_MB3) MailBox Control Register
+#define AT91C_CAN_MB3_MMR         (0xFFFD0260) // (CAN_MB3) MailBox Mode Register
+#define AT91C_CAN_MB3_MSR         (0xFFFD0270) // (CAN_MB3) MailBox Status Register
+#define AT91C_CAN_MB3_MDL         (0xFFFD0274) // (CAN_MB3) MailBox Data Low Register
+#define AT91C_CAN_MB3_MDH         (0xFFFD0278) // (CAN_MB3) MailBox Data High Register
+// ========== Register definition for CAN_MB4 peripheral ==========
+#define AT91C_CAN_MB4_MID         (0xFFFD0288) // (CAN_MB4) MailBox ID Register
+#define AT91C_CAN_MB4_MMR         (0xFFFD0280) // (CAN_MB4) MailBox Mode Register
+#define AT91C_CAN_MB4_MDH         (0xFFFD0298) // (CAN_MB4) MailBox Data High Register
+#define AT91C_CAN_MB4_MFID        (0xFFFD028C) // (CAN_MB4) MailBox Family ID Register
+#define AT91C_CAN_MB4_MSR         (0xFFFD0290) // (CAN_MB4) MailBox Status Register
+#define AT91C_CAN_MB4_MCR         (0xFFFD029C) // (CAN_MB4) MailBox Control Register
+#define AT91C_CAN_MB4_MDL         (0xFFFD0294) // (CAN_MB4) MailBox Data Low Register
+#define AT91C_CAN_MB4_MAM         (0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register
+// ========== Register definition for CAN_MB5 peripheral ==========
+#define AT91C_CAN_MB5_MSR         (0xFFFD02B0) // (CAN_MB5) MailBox Status Register
+#define AT91C_CAN_MB5_MCR         (0xFFFD02BC) // (CAN_MB5) MailBox Control Register
+#define AT91C_CAN_MB5_MFID        (0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register
+#define AT91C_CAN_MB5_MDH         (0xFFFD02B8) // (CAN_MB5) MailBox Data High Register
+#define AT91C_CAN_MB5_MID         (0xFFFD02A8) // (CAN_MB5) MailBox ID Register
+#define AT91C_CAN_MB5_MMR         (0xFFFD02A0) // (CAN_MB5) MailBox Mode Register
+#define AT91C_CAN_MB5_MDL         (0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register
+#define AT91C_CAN_MB5_MAM         (0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register
+// ========== Register definition for CAN_MB6 peripheral ==========
+#define AT91C_CAN_MB6_MFID        (0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register
+#define AT91C_CAN_MB6_MID         (0xFFFD02C8) // (CAN_MB6) MailBox ID Register
+#define AT91C_CAN_MB6_MAM         (0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB6_MSR         (0xFFFD02D0) // (CAN_MB6) MailBox Status Register
+#define AT91C_CAN_MB6_MDL         (0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register
+#define AT91C_CAN_MB6_MCR         (0xFFFD02DC) // (CAN_MB6) MailBox Control Register
+#define AT91C_CAN_MB6_MDH         (0xFFFD02D8) // (CAN_MB6) MailBox Data High Register
+#define AT91C_CAN_MB6_MMR         (0xFFFD02C0) // (CAN_MB6) MailBox Mode Register
+// ========== Register definition for CAN_MB7 peripheral ==========
+#define AT91C_CAN_MB7_MCR         (0xFFFD02FC) // (CAN_MB7) MailBox Control Register
+#define AT91C_CAN_MB7_MDH         (0xFFFD02F8) // (CAN_MB7) MailBox Data High Register
+#define AT91C_CAN_MB7_MFID        (0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register
+#define AT91C_CAN_MB7_MDL         (0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register
+#define AT91C_CAN_MB7_MID         (0xFFFD02E8) // (CAN_MB7) MailBox ID Register
+#define AT91C_CAN_MB7_MMR         (0xFFFD02E0) // (CAN_MB7) MailBox Mode Register
+#define AT91C_CAN_MB7_MAM         (0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register
+#define AT91C_CAN_MB7_MSR         (0xFFFD02F0) // (CAN_MB7) MailBox Status Register
+// ========== Register definition for CAN peripheral ==========
+#define AT91C_CAN_TCR             (0xFFFD0024) // (CAN) Transfer Command Register
+#define AT91C_CAN_IMR             (0xFFFD000C) // (CAN) Interrupt Mask Register
+#define AT91C_CAN_IER             (0xFFFD0004) // (CAN) Interrupt Enable Register
+#define AT91C_CAN_ECR             (0xFFFD0020) // (CAN) Error Counter Register
+#define AT91C_CAN_TIMESTP         (0xFFFD001C) // (CAN) Time Stamp Register
+#define AT91C_CAN_MR              (0xFFFD0000) // (CAN) Mode Register
+#define AT91C_CAN_IDR             (0xFFFD0008) // (CAN) Interrupt Disable Register
+#define AT91C_CAN_ACR             (0xFFFD0028) // (CAN) Abort Command Register
+#define AT91C_CAN_TIM             (0xFFFD0018) // (CAN) Timer Register
+#define AT91C_CAN_SR              (0xFFFD0010) // (CAN) Status Register
+#define AT91C_CAN_BR              (0xFFFD0014) // (CAN) Baudrate Register
+#define AT91C_CAN_VR              (0xFFFD00FC) // (CAN) Version Register
+// ========== Register definition for EMAC peripheral ==========
+#define AT91C_EMAC_ISR            (0xFFFDC024) // (EMAC) Interrupt Status Register
+#define AT91C_EMAC_SA4H           (0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes
+#define AT91C_EMAC_SA1L           (0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes
+#define AT91C_EMAC_ELE            (0xFFFDC078) // (EMAC) Excessive Length Errors Register
+#define AT91C_EMAC_LCOL           (0xFFFDC05C) // (EMAC) Late Collision Register
+#define AT91C_EMAC_RLE            (0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register
+#define AT91C_EMAC_WOL            (0xFFFDC0C4) // (EMAC) Wake On LAN Register
+#define AT91C_EMAC_DTF            (0xFFFDC058) // (EMAC) Deferred Transmission Frame Register
+#define AT91C_EMAC_TUND           (0xFFFDC064) // (EMAC) Transmit Underrun Error Register
+#define AT91C_EMAC_NCR            (0xFFFDC000) // (EMAC) Network Control Register
+#define AT91C_EMAC_SA4L           (0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes
+#define AT91C_EMAC_RSR            (0xFFFDC020) // (EMAC) Receive Status Register
+#define AT91C_EMAC_SA3L           (0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes
+#define AT91C_EMAC_TSR            (0xFFFDC014) // (EMAC) Transmit Status Register
+#define AT91C_EMAC_IDR            (0xFFFDC02C) // (EMAC) Interrupt Disable Register
+#define AT91C_EMAC_RSE            (0xFFFDC074) // (EMAC) Receive Symbol Errors Register
+#define AT91C_EMAC_ECOL           (0xFFFDC060) // (EMAC) Excessive Collision Register
+#define AT91C_EMAC_TID            (0xFFFDC0B8) // (EMAC) Type ID Checking Register
+#define AT91C_EMAC_HRB            (0xFFFDC090) // (EMAC) Hash Address Bottom[31:0]
+#define AT91C_EMAC_TBQP           (0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer
+#define AT91C_EMAC_USRIO          (0xFFFDC0C0) // (EMAC) USER Input/Output Register
+#define AT91C_EMAC_PTR            (0xFFFDC038) // (EMAC) Pause Time Register
+#define AT91C_EMAC_SA2H           (0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes
+#define AT91C_EMAC_ROV            (0xFFFDC070) // (EMAC) Receive Overrun Errors Register
+#define AT91C_EMAC_ALE            (0xFFFDC054) // (EMAC) Alignment Error Register
+#define AT91C_EMAC_RJA            (0xFFFDC07C) // (EMAC) Receive Jabbers Register
+#define AT91C_EMAC_RBQP           (0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer
+#define AT91C_EMAC_TPF            (0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register
+#define AT91C_EMAC_NCFGR          (0xFFFDC004) // (EMAC) Network Configuration Register
+#define AT91C_EMAC_HRT            (0xFFFDC094) // (EMAC) Hash Address Top[63:32]
+#define AT91C_EMAC_USF            (0xFFFDC080) // (EMAC) Undersize Frames Register
+#define AT91C_EMAC_FCSE           (0xFFFDC050) // (EMAC) Frame Check Sequence Error Register
+#define AT91C_EMAC_TPQ            (0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register
+#define AT91C_EMAC_MAN            (0xFFFDC034) // (EMAC) PHY Maintenance Register
+#define AT91C_EMAC_FTO            (0xFFFDC040) // (EMAC) Frames Transmitted OK Register
+#define AT91C_EMAC_REV            (0xFFFDC0FC) // (EMAC) Revision Register
+#define AT91C_EMAC_IMR            (0xFFFDC030) // (EMAC) Interrupt Mask Register
+#define AT91C_EMAC_SCF            (0xFFFDC044) // (EMAC) Single Collision Frame Register
+#define AT91C_EMAC_PFR            (0xFFFDC03C) // (EMAC) Pause Frames received Register
+#define AT91C_EMAC_MCF            (0xFFFDC048) // (EMAC) Multiple Collision Frame Register
+#define AT91C_EMAC_NSR            (0xFFFDC008) // (EMAC) Network Status Register
+#define AT91C_EMAC_SA2L           (0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes
+#define AT91C_EMAC_FRO            (0xFFFDC04C) // (EMAC) Frames Received OK Register
+#define AT91C_EMAC_IER            (0xFFFDC028) // (EMAC) Interrupt Enable Register
+#define AT91C_EMAC_SA1H           (0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes
+#define AT91C_EMAC_CSE            (0xFFFDC068) // (EMAC) Carrier Sense Error Register
+#define AT91C_EMAC_SA3H           (0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes
+#define AT91C_EMAC_RRE            (0xFFFDC06C) // (EMAC) Receive Ressource Error Register
+#define AT91C_EMAC_STE            (0xFFFDC084) // (EMAC) SQE Test Error Register
+// ========== Register definition for PDC_ADC peripheral ==========
+#define AT91C_ADC_PTSR            (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register
+#define AT91C_ADC_PTCR            (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register
+#define AT91C_ADC_TNPR            (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register
+#define AT91C_ADC_TNCR            (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register
+#define AT91C_ADC_RNPR            (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register
+#define AT91C_ADC_RNCR            (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register
+#define AT91C_ADC_RPR             (0xFFFD8100) // (PDC_ADC) Receive Pointer Register
+#define AT91C_ADC_TCR             (0xFFFD810C) // (PDC_ADC) Transmit Counter Register
+#define AT91C_ADC_TPR             (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register
+#define AT91C_ADC_RCR             (0xFFFD8104) // (PDC_ADC) Receive Counter Register
+// ========== Register definition for ADC peripheral ==========
+#define AT91C_ADC_CDR2            (0xFFFD8038) // (ADC) ADC Channel Data Register 2
+#define AT91C_ADC_CDR3            (0xFFFD803C) // (ADC) ADC Channel Data Register 3
+#define AT91C_ADC_CDR0            (0xFFFD8030) // (ADC) ADC Channel Data Register 0
+#define AT91C_ADC_CDR5            (0xFFFD8044) // (ADC) ADC Channel Data Register 5
+#define AT91C_ADC_CHDR            (0xFFFD8014) // (ADC) ADC Channel Disable Register
+#define AT91C_ADC_SR              (0xFFFD801C) // (ADC) ADC Status Register
+#define AT91C_ADC_CDR4            (0xFFFD8040) // (ADC) ADC Channel Data Register 4
+#define AT91C_ADC_CDR1            (0xFFFD8034) // (ADC) ADC Channel Data Register 1
+#define AT91C_ADC_LCDR            (0xFFFD8020) // (ADC) ADC Last Converted Data Register
+#define AT91C_ADC_IDR             (0xFFFD8028) // (ADC) ADC Interrupt Disable Register
+#define AT91C_ADC_CR              (0xFFFD8000) // (ADC) ADC Control Register
+#define AT91C_ADC_CDR7            (0xFFFD804C) // (ADC) ADC Channel Data Register 7
+#define AT91C_ADC_CDR6            (0xFFFD8048) // (ADC) ADC Channel Data Register 6
+#define AT91C_ADC_IER             (0xFFFD8024) // (ADC) ADC Interrupt Enable Register
+#define AT91C_ADC_CHER            (0xFFFD8010) // (ADC) ADC Channel Enable Register
+#define AT91C_ADC_CHSR            (0xFFFD8018) // (ADC) ADC Channel Status Register
+#define AT91C_ADC_MR              (0xFFFD8004) // (ADC) ADC Mode Register
+#define AT91C_ADC_IMR             (0xFFFD802C) // (ADC) ADC Interrupt Mask Register
+// ========== Register definition for PDC_AES peripheral ==========
+#define AT91C_AES_TPR             (0xFFFA4108) // (PDC_AES) Transmit Pointer Register
+#define AT91C_AES_PTCR            (0xFFFA4120) // (PDC_AES) PDC Transfer Control Register
+#define AT91C_AES_RNPR            (0xFFFA4110) // (PDC_AES) Receive Next Pointer Register
+#define AT91C_AES_TNCR            (0xFFFA411C) // (PDC_AES) Transmit Next Counter Register
+#define AT91C_AES_TCR             (0xFFFA410C) // (PDC_AES) Transmit Counter Register
+#define AT91C_AES_RCR             (0xFFFA4104) // (PDC_AES) Receive Counter Register
+#define AT91C_AES_RNCR            (0xFFFA4114) // (PDC_AES) Receive Next Counter Register
+#define AT91C_AES_TNPR            (0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register
+#define AT91C_AES_RPR             (0xFFFA4100) // (PDC_AES) Receive Pointer Register
+#define AT91C_AES_PTSR            (0xFFFA4124) // (PDC_AES) PDC Transfer Status Register
+// ========== Register definition for AES peripheral ==========
+#define AT91C_AES_IVxR            (0xFFFA4060) // (AES) Initialization Vector x Register
+#define AT91C_AES_MR              (0xFFFA4004) // (AES) Mode Register
+#define AT91C_AES_VR              (0xFFFA40FC) // (AES) AES Version Register
+#define AT91C_AES_ODATAxR         (0xFFFA4050) // (AES) Output Data x Register
+#define AT91C_AES_IDATAxR         (0xFFFA4040) // (AES) Input Data x Register
+#define AT91C_AES_CR              (0xFFFA4000) // (AES) Control Register
+#define AT91C_AES_IDR             (0xFFFA4014) // (AES) Interrupt Disable Register
+#define AT91C_AES_IMR             (0xFFFA4018) // (AES) Interrupt Mask Register
+#define AT91C_AES_IER             (0xFFFA4010) // (AES) Interrupt Enable Register
+#define AT91C_AES_KEYWxR          (0xFFFA4020) // (AES) Key Word x Register
+#define AT91C_AES_ISR             (0xFFFA401C) // (AES) Interrupt Status Register
+// ========== Register definition for PDC_TDES peripheral ==========
+#define AT91C_TDES_RNCR           (0xFFFA8114) // (PDC_TDES) Receive Next Counter Register
+#define AT91C_TDES_TCR            (0xFFFA810C) // (PDC_TDES) Transmit Counter Register
+#define AT91C_TDES_RCR            (0xFFFA8104) // (PDC_TDES) Receive Counter Register
+#define AT91C_TDES_TNPR           (0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register
+#define AT91C_TDES_RNPR           (0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register
+#define AT91C_TDES_RPR            (0xFFFA8100) // (PDC_TDES) Receive Pointer Register
+#define AT91C_TDES_TNCR           (0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register
+#define AT91C_TDES_TPR            (0xFFFA8108) // (PDC_TDES) Transmit Pointer Register
+#define AT91C_TDES_PTSR           (0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register
+#define AT91C_TDES_PTCR           (0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register
+// ========== Register definition for TDES peripheral ==========
+#define AT91C_TDES_KEY2WxR        (0xFFFA8028) // (TDES) Key 2 Word x Register
+#define AT91C_TDES_KEY3WxR        (0xFFFA8030) // (TDES) Key 3 Word x Register
+#define AT91C_TDES_IDR            (0xFFFA8014) // (TDES) Interrupt Disable Register
+#define AT91C_TDES_VR             (0xFFFA80FC) // (TDES) TDES Version Register
+#define AT91C_TDES_IVxR           (0xFFFA8060) // (TDES) Initialization Vector x Register
+#define AT91C_TDES_ODATAxR        (0xFFFA8050) // (TDES) Output Data x Register
+#define AT91C_TDES_IMR            (0xFFFA8018) // (TDES) Interrupt Mask Register
+#define AT91C_TDES_MR             (0xFFFA8004) // (TDES) Mode Register
+#define AT91C_TDES_CR             (0xFFFA8000) // (TDES) Control Register
+#define AT91C_TDES_IER            (0xFFFA8010) // (TDES) Interrupt Enable Register
+#define AT91C_TDES_ISR            (0xFFFA801C) // (TDES) Interrupt Status Register
+#define AT91C_TDES_IDATAxR        (0xFFFA8040) // (TDES) Input Data x Register
+#define AT91C_TDES_KEY1WxR        (0xFFFA8020) // (TDES) Key 1 Word x Register
+
+// *****************************************************************************
+//               PIO DEFINITIONS FOR AT91SAM7X256
+// *****************************************************************************
+#define AT91C_PIO_PA0             (1 <<  0) // Pin Controlled by PA0
+#define AT91C_PA0_RXD0            (AT91C_PIO_PA0) //  USART 0 Receive Data
+#define AT91C_PIO_PA1             (1 <<  1) // Pin Controlled by PA1
+#define AT91C_PA1_TXD0            (AT91C_PIO_PA1) //  USART 0 Transmit Data
+#define AT91C_PIO_PA10            (1 << 10) // Pin Controlled by PA10
+#define AT91C_PA10_TWD            (AT91C_PIO_PA10) //  TWI Two-wire Serial Data
+#define AT91C_PIO_PA11            (1 << 11) // Pin Controlled by PA11
+#define AT91C_PA11_TWCK           (AT91C_PIO_PA11) //  TWI Two-wire Serial Clock
+#define AT91C_PIO_PA12            (1 << 12) // Pin Controlled by PA12
+#define AT91C_PA12_NPCS00         (AT91C_PIO_PA12) //  SPI 0 Peripheral Chip Select 0
+#define AT91C_PIO_PA13            (1 << 13) // Pin Controlled by PA13
+#define AT91C_PA13_NPCS01         (AT91C_PIO_PA13) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PA13_PCK1           (AT91C_PIO_PA13) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PA14            (1 << 14) // Pin Controlled by PA14
+#define AT91C_PA14_NPCS02         (AT91C_PIO_PA14) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PA14_IRQ1           (AT91C_PIO_PA14) //  External Interrupt 1
+#define AT91C_PIO_PA15            (1 << 15) // Pin Controlled by PA15
+#define AT91C_PA15_NPCS03         (AT91C_PIO_PA15) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PA15_TCLK2          (AT91C_PIO_PA15) //  Timer Counter 2 external clock input
+#define AT91C_PIO_PA16            (1 << 16) // Pin Controlled by PA16
+#define AT91C_PA16_MISO0          (AT91C_PIO_PA16) //  SPI 0 Master In Slave
+#define AT91C_PIO_PA17            (1 << 17) // Pin Controlled by PA17
+#define AT91C_PA17_MOSI0          (AT91C_PIO_PA17) //  SPI 0 Master Out Slave
+#define AT91C_PIO_PA18            (1 << 18) // Pin Controlled by PA18
+#define AT91C_PA18_SPCK0          (AT91C_PIO_PA18) //  SPI 0 Serial Clock
+#define AT91C_PIO_PA19            (1 << 19) // Pin Controlled by PA19
+#define AT91C_PA19_CANRX          (AT91C_PIO_PA19) //  CAN Receive
+#define AT91C_PIO_PA2             (1 <<  2) // Pin Controlled by PA2
+#define AT91C_PA2_SCK0            (AT91C_PIO_PA2) //  USART 0 Serial Clock
+#define AT91C_PA2_NPCS11          (AT91C_PIO_PA2) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PA20            (1 << 20) // Pin Controlled by PA20
+#define AT91C_PA20_CANTX          (AT91C_PIO_PA20) //  CAN Transmit
+#define AT91C_PIO_PA21            (1 << 21) // Pin Controlled by PA21
+#define AT91C_PA21_TF             (AT91C_PIO_PA21) //  SSC Transmit Frame Sync
+#define AT91C_PA21_NPCS10         (AT91C_PIO_PA21) //  SPI 1 Peripheral Chip Select 0
+#define AT91C_PIO_PA22            (1 << 22) // Pin Controlled by PA22
+#define AT91C_PA22_TK             (AT91C_PIO_PA22) //  SSC Transmit Clock
+#define AT91C_PA22_SPCK1          (AT91C_PIO_PA22) //  SPI 1 Serial Clock
+#define AT91C_PIO_PA23            (1 << 23) // Pin Controlled by PA23
+#define AT91C_PA23_TD             (AT91C_PIO_PA23) //  SSC Transmit data
+#define AT91C_PA23_MOSI1          (AT91C_PIO_PA23) //  SPI 1 Master Out Slave
+#define AT91C_PIO_PA24            (1 << 24) // Pin Controlled by PA24
+#define AT91C_PA24_RD             (AT91C_PIO_PA24) //  SSC Receive Data
+#define AT91C_PA24_MISO1          (AT91C_PIO_PA24) //  SPI 1 Master In Slave
+#define AT91C_PIO_PA25            (1 << 25) // Pin Controlled by PA25
+#define AT91C_PA25_RK             (AT91C_PIO_PA25) //  SSC Receive Clock
+#define AT91C_PA25_NPCS11         (AT91C_PIO_PA25) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PA26            (1 << 26) // Pin Controlled by PA26
+#define AT91C_PA26_RF             (AT91C_PIO_PA26) //  SSC Receive Frame Sync
+#define AT91C_PA26_NPCS12         (AT91C_PIO_PA26) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PA27            (1 << 27) // Pin Controlled by PA27
+#define AT91C_PA27_DRXD           (AT91C_PIO_PA27) //  DBGU Debug Receive Data
+#define AT91C_PA27_PCK3           (AT91C_PIO_PA27) //  PMC Programmable Clock Output 3
+#define AT91C_PIO_PA28            (1 << 28) // Pin Controlled by PA28
+#define AT91C_PA28_DTXD           (AT91C_PIO_PA28) //  DBGU Debug Transmit Data
+#define AT91C_PIO_PA29            (1 << 29) // Pin Controlled by PA29
+#define AT91C_PA29_FIQ            (AT91C_PIO_PA29) //  AIC Fast Interrupt Input
+#define AT91C_PA29_NPCS13         (AT91C_PIO_PA29) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PA3             (1 <<  3) // Pin Controlled by PA3
+#define AT91C_PA3_RTS0            (AT91C_PIO_PA3) //  USART 0 Ready To Send
+#define AT91C_PA3_NPCS12          (AT91C_PIO_PA3) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PA30            (1 << 30) // Pin Controlled by PA30
+#define AT91C_PA30_IRQ0           (AT91C_PIO_PA30) //  External Interrupt 0
+#define AT91C_PA30_PCK2           (AT91C_PIO_PA30) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PA4             (1 <<  4) // Pin Controlled by PA4
+#define AT91C_PA4_CTS0            (AT91C_PIO_PA4) //  USART 0 Clear To Send
+#define AT91C_PA4_NPCS13          (AT91C_PIO_PA4) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PA5             (1 <<  5) // Pin Controlled by PA5
+#define AT91C_PA5_RXD1            (AT91C_PIO_PA5) //  USART 1 Receive Data
+#define AT91C_PIO_PA6             (1 <<  6) // Pin Controlled by PA6
+#define AT91C_PA6_TXD1            (AT91C_PIO_PA6) //  USART 1 Transmit Data
+#define AT91C_PIO_PA7             (1 <<  7) // Pin Controlled by PA7
+#define AT91C_PA7_SCK1            (AT91C_PIO_PA7) //  USART 1 Serial Clock
+#define AT91C_PA7_NPCS01          (AT91C_PIO_PA7) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PIO_PA8             (1 <<  8) // Pin Controlled by PA8
+#define AT91C_PA8_RTS1            (AT91C_PIO_PA8) //  USART 1 Ready To Send
+#define AT91C_PA8_NPCS02          (AT91C_PIO_PA8) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PIO_PA9             (1 <<  9) // Pin Controlled by PA9
+#define AT91C_PA9_CTS1            (AT91C_PIO_PA9) //  USART 1 Clear To Send
+#define AT91C_PA9_NPCS03          (AT91C_PIO_PA9) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PIO_PB0             (1 <<  0) // Pin Controlled by PB0
+#define AT91C_PB0_ETXCK_EREFCK    (AT91C_PIO_PB0) //  Ethernet MAC Transmit Clock/Reference Clock
+#define AT91C_PB0_PCK0            (AT91C_PIO_PB0) //  PMC Programmable Clock Output 0
+#define AT91C_PIO_PB1             (1 <<  1) // Pin Controlled by PB1
+#define AT91C_PB1_ETXEN           (AT91C_PIO_PB1) //  Ethernet MAC Transmit Enable
+#define AT91C_PIO_PB10            (1 << 10) // Pin Controlled by PB10
+#define AT91C_PB10_ETX2           (AT91C_PIO_PB10) //  Ethernet MAC Transmit Data 2
+#define AT91C_PB10_NPCS11         (AT91C_PIO_PB10) //  SPI 1 Peripheral Chip Select 1
+#define AT91C_PIO_PB11            (1 << 11) // Pin Controlled by PB11
+#define AT91C_PB11_ETX3           (AT91C_PIO_PB11) //  Ethernet MAC Transmit Data 3
+#define AT91C_PB11_NPCS12         (AT91C_PIO_PB11) //  SPI 1 Peripheral Chip Select 2
+#define AT91C_PIO_PB12            (1 << 12) // Pin Controlled by PB12
+#define AT91C_PB12_ETXER          (AT91C_PIO_PB12) //  Ethernet MAC Transmikt Coding Error
+#define AT91C_PB12_TCLK0          (AT91C_PIO_PB12) //  Timer Counter 0 external clock input
+#define AT91C_PIO_PB13            (1 << 13) // Pin Controlled by PB13
+#define AT91C_PB13_ERX2           (AT91C_PIO_PB13) //  Ethernet MAC Receive Data 2
+#define AT91C_PB13_NPCS01         (AT91C_PIO_PB13) //  SPI 0 Peripheral Chip Select 1
+#define AT91C_PIO_PB14            (1 << 14) // Pin Controlled by PB14
+#define AT91C_PB14_ERX3           (AT91C_PIO_PB14) //  Ethernet MAC Receive Data 3
+#define AT91C_PB14_NPCS02         (AT91C_PIO_PB14) //  SPI 0 Peripheral Chip Select 2
+#define AT91C_PIO_PB15            (1 << 15) // Pin Controlled by PB15
+#define AT91C_PB15_ERXDV          (AT91C_PIO_PB15) //  Ethernet MAC Receive Data Valid
+#define AT91C_PIO_PB16            (1 << 16) // Pin Controlled by PB16
+#define AT91C_PB16_ECOL           (AT91C_PIO_PB16) //  Ethernet MAC Collision Detected
+#define AT91C_PB16_NPCS13         (AT91C_PIO_PB16) //  SPI 1 Peripheral Chip Select 3
+#define AT91C_PIO_PB17            (1 << 17) // Pin Controlled by PB17
+#define AT91C_PB17_ERXCK          (AT91C_PIO_PB17) //  Ethernet MAC Receive Clock
+#define AT91C_PB17_NPCS03         (AT91C_PIO_PB17) //  SPI 0 Peripheral Chip Select 3
+#define AT91C_PIO_PB18            (1 << 18) // Pin Controlled by PB18
+#define AT91C_PB18_EF100          (AT91C_PIO_PB18) //  Ethernet MAC Force 100 Mbits/sec
+#define AT91C_PB18_ADTRG          (AT91C_PIO_PB18) //  ADC External Trigger
+#define AT91C_PIO_PB19            (1 << 19) // Pin Controlled by PB19
+#define AT91C_PB19_PWM0           (AT91C_PIO_PB19) //  PWM Channel 0
+#define AT91C_PB19_TCLK1          (AT91C_PIO_PB19) //  Timer Counter 1 external clock input
+#define AT91C_PIO_PB2             (1 <<  2) // Pin Controlled by PB2
+#define AT91C_PB2_ETX0            (AT91C_PIO_PB2) //  Ethernet MAC Transmit Data 0
+#define AT91C_PIO_PB20            (1 << 20) // Pin Controlled by PB20
+#define AT91C_PB20_PWM1           (AT91C_PIO_PB20) //  PWM Channel 1
+#define AT91C_PB20_PCK0           (AT91C_PIO_PB20) //  PMC Programmable Clock Output 0
+#define AT91C_PIO_PB21            (1 << 21) // Pin Controlled by PB21
+#define AT91C_PB21_PWM2           (AT91C_PIO_PB21) //  PWM Channel 2
+#define AT91C_PB21_PCK1           (AT91C_PIO_PB21) //  PMC Programmable Clock Output 1
+#define AT91C_PIO_PB22            (1 << 22) // Pin Controlled by PB22
+#define AT91C_PB22_PWM3           (AT91C_PIO_PB22) //  PWM Channel 3
+#define AT91C_PB22_PCK2           (AT91C_PIO_PB22) //  PMC Programmable Clock Output 2
+#define AT91C_PIO_PB23            (1 << 23) // Pin Controlled by PB23
+#define AT91C_PB23_TIOA0          (AT91C_PIO_PB23) //  Timer Counter 0 Multipurpose Timer I/O Pin A
+#define AT91C_PB23_DCD1           (AT91C_PIO_PB23) //  USART 1 Data Carrier Detect
+#define AT91C_PIO_PB24            (1 << 24) // Pin Controlled by PB24
+#define AT91C_PB24_TIOB0          (AT91C_PIO_PB24) //  Timer Counter 0 Multipurpose Timer I/O Pin B
+#define AT91C_PB24_DSR1           (AT91C_PIO_PB24) //  USART 1 Data Set ready
+#define AT91C_PIO_PB25            (1 << 25) // Pin Controlled by PB25
+#define AT91C_PB25_TIOA1          (AT91C_PIO_PB25) //  Timer Counter 1 Multipurpose Timer I/O Pin A
+#define AT91C_PB25_DTR1           (AT91C_PIO_PB25) //  USART 1 Data Terminal ready
+#define AT91C_PIO_PB26            (1 << 26) // Pin Controlled by PB26
+#define AT91C_PB26_TIOB1          (AT91C_PIO_PB26) //  Timer Counter 1 Multipurpose Timer I/O Pin B
+#define AT91C_PB26_RI1            (AT91C_PIO_PB26) //  USART 1 Ring Indicator
+#define AT91C_PIO_PB27            (1 << 27) // Pin Controlled by PB27
+#define AT91C_PB27_TIOA2          (AT91C_PIO_PB27) //  Timer Counter 2 Multipurpose Timer I/O Pin A
+#define AT91C_PB27_PWM0           (AT91C_PIO_PB27) //  PWM Channel 0
+#define AT91C_PIO_PB28            (1 << 28) // Pin Controlled by PB28
+#define AT91C_PB28_TIOB2          (AT91C_PIO_PB28) //  Timer Counter 2 Multipurpose Timer I/O Pin B
+#define AT91C_PB28_PWM1           (AT91C_PIO_PB28) //  PWM Channel 1
+#define AT91C_PIO_PB29            (1 << 29) // Pin Controlled by PB29
+#define AT91C_PB29_PCK1           (AT91C_PIO_PB29) //  PMC Programmable Clock Output 1
+#define AT91C_PB29_PWM2           (AT91C_PIO_PB29) //  PWM Channel 2
+#define AT91C_PIO_PB3             (1 <<  3) // Pin Controlled by PB3
+#define AT91C_PB3_ETX1            (AT91C_PIO_PB3) //  Ethernet MAC Transmit Data 1
+#define AT91C_PIO_PB30            (1 << 30) // Pin Controlled by PB30
+#define AT91C_PB30_PCK2           (AT91C_PIO_PB30) //  PMC Programmable Clock Output 2
+#define AT91C_PB30_PWM3           (AT91C_PIO_PB30) //  PWM Channel 3
+#define AT91C_PIO_PB4             (1 <<  4) // Pin Controlled by PB4
+#define AT91C_PB4_ECRS_ECRSDV     (AT91C_PIO_PB4) //  Ethernet MAC Carrier Sense/Carrier Sense and Data Valid
+#define AT91C_PIO_PB5             (1 <<  5) // Pin Controlled by PB5
+#define AT91C_PB5_ERX0            (AT91C_PIO_PB5) //  Ethernet MAC Receive Data 0
+#define AT91C_PIO_PB6             (1 <<  6) // Pin Controlled by PB6
+#define AT91C_PB6_ERX1            (AT91C_PIO_PB6) //  Ethernet MAC Receive Data 1
+#define AT91C_PIO_PB7             (1 <<  7) // Pin Controlled by PB7
+#define AT91C_PB7_ERXER           (AT91C_PIO_PB7) //  Ethernet MAC Receive Error
+#define AT91C_PIO_PB8             (1 <<  8) // Pin Controlled by PB8
+#define AT91C_PB8_EMDC            (AT91C_PIO_PB8) //  Ethernet MAC Management Data Clock
+#define AT91C_PIO_PB9             (1 <<  9) // Pin Controlled by PB9
+#define AT91C_PB9_EMDIO           (AT91C_PIO_PB9) //  Ethernet MAC Management Data Input/Output
+
+// *****************************************************************************
+//               PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256
+// *****************************************************************************
+#define AT91C_ID_FIQ              ( 0) // Advanced Interrupt Controller (FIQ)
+#define AT91C_ID_SYS              ( 1) // System Peripheral
+#define AT91C_ID_PIOA             ( 2) // Parallel IO Controller A
+#define AT91C_ID_PIOB             ( 3) // Parallel IO Controller B
+#define AT91C_ID_SPI0             ( 4) // Serial Peripheral Interface 0
+#define AT91C_ID_SPI1             ( 5) // Serial Peripheral Interface 1
+#define AT91C_ID_US0              ( 6) // USART 0
+#define AT91C_ID_US1              ( 7) // USART 1
+#define AT91C_ID_SSC              ( 8) // Serial Synchronous Controller
+#define AT91C_ID_TWI              ( 9) // Two-Wire Interface
+#define AT91C_ID_PWMC             (10) // PWM Controller
+#define AT91C_ID_UDP              (11) // USB Device Port
+#define AT91C_ID_TC0              (12) // Timer Counter 0
+#define AT91C_ID_TC1              (13) // Timer Counter 1
+#define AT91C_ID_TC2              (14) // Timer Counter 2
+#define AT91C_ID_CAN              (15) // Control Area Network Controller
+#define AT91C_ID_EMAC             (16) // Ethernet MAC
+#define AT91C_ID_ADC              (17) // Analog-to-Digital Converter
+#define AT91C_ID_AES              (18) // Advanced Encryption Standard 128-bit
+#define AT91C_ID_TDES             (19) // Triple Data Encryption Standard
+#define AT91C_ID_20_Reserved      (20) // Reserved
+#define AT91C_ID_21_Reserved      (21) // Reserved
+#define AT91C_ID_22_Reserved      (22) // Reserved
+#define AT91C_ID_23_Reserved      (23) // Reserved
+#define AT91C_ID_24_Reserved      (24) // Reserved
+#define AT91C_ID_25_Reserved      (25) // Reserved
+#define AT91C_ID_26_Reserved      (26) // Reserved
+#define AT91C_ID_27_Reserved      (27) // Reserved
+#define AT91C_ID_28_Reserved      (28) // Reserved
+#define AT91C_ID_29_Reserved      (29) // Reserved
+#define AT91C_ID_IRQ0             (30) // Advanced Interrupt Controller (IRQ0)
+#define AT91C_ID_IRQ1             (31) // Advanced Interrupt Controller (IRQ1)
+
+// *****************************************************************************
+//               BASE ADDRESS DEFINITIONS FOR AT91SAM7X256
+// *****************************************************************************
+#define AT91C_BASE_SYS            (0xFFFFF000) // (SYS) Base Address
+#define AT91C_BASE_AIC            (0xFFFFF000) // (AIC) Base Address
+#define AT91C_BASE_PDC_DBGU       (0xFFFFF300) // (PDC_DBGU) Base Address
+#define AT91C_BASE_DBGU           (0xFFFFF200) // (DBGU) Base Address
+#define AT91C_BASE_PIOA           (0xFFFFF400) // (PIOA) Base Address
+#define AT91C_BASE_PIOB           (0xFFFFF600) // (PIOB) Base Address
+#define AT91C_BASE_CKGR           (0xFFFFFC20) // (CKGR) Base Address
+#define AT91C_BASE_PMC            (0xFFFFFC00) // (PMC) Base Address
+#define AT91C_BASE_RSTC           (0xFFFFFD00) // (RSTC) Base Address
+#define AT91C_BASE_RTTC           (0xFFFFFD20) // (RTTC) Base Address
+#define AT91C_BASE_PITC           (0xFFFFFD30) // (PITC) Base Address
+#define AT91C_BASE_WDTC           (0xFFFFFD40) // (WDTC) Base Address
+#define AT91C_BASE_VREG           (0xFFFFFD60) // (VREG) Base Address
+#define AT91C_BASE_MC             (0xFFFFFF00) // (MC) Base Address
+#define AT91C_BASE_PDC_SPI1       (0xFFFE4100) // (PDC_SPI1) Base Address
+#define AT91C_BASE_SPI1           (0xFFFE4000) // (SPI1) Base Address
+#define AT91C_BASE_PDC_SPI0       (0xFFFE0100) // (PDC_SPI0) Base Address
+#define AT91C_BASE_SPI0           (0xFFFE0000) // (SPI0) Base Address
+#define AT91C_BASE_PDC_US1        (0xFFFC4100) // (PDC_US1) Base Address
+#define AT91C_BASE_US1            (0xFFFC4000) // (US1) Base Address
+#define AT91C_BASE_PDC_US0        (0xFFFC0100) // (PDC_US0) Base Address
+#define AT91C_BASE_US0            (0xFFFC0000) // (US0) Base Address
+#define AT91C_BASE_PDC_SSC        (0xFFFD4100) // (PDC_SSC) Base Address
+#define AT91C_BASE_SSC            (0xFFFD4000) // (SSC) Base Address
+#define AT91C_BASE_TWI            (0xFFFB8000) // (TWI) Base Address
+#define AT91C_BASE_PWMC_CH3       (0xFFFCC260) // (PWMC_CH3) Base Address
+#define AT91C_BASE_PWMC_CH2       (0xFFFCC240) // (PWMC_CH2) Base Address
+#define AT91C_BASE_PWMC_CH1       (0xFFFCC220) // (PWMC_CH1) Base Address
+#define AT91C_BASE_PWMC_CH0       (0xFFFCC200) // (PWMC_CH0) Base Address
+#define AT91C_BASE_PWMC           (0xFFFCC000) // (PWMC) Base Address
+#define AT91C_BASE_UDP            (0xFFFB0000) // (UDP) Base Address
+#define AT91C_BASE_TC0            (0xFFFA0000) // (TC0) Base Address
+#define AT91C_BASE_TC1            (0xFFFA0040) // (TC1) Base Address
+#define AT91C_BASE_TC2            (0xFFFA0080) // (TC2) Base Address
+#define AT91C_BASE_TCB            (0xFFFA0000) // (TCB) Base Address
+#define AT91C_BASE_CAN_MB0        (0xFFFD0200) // (CAN_MB0) Base Address
+#define AT91C_BASE_CAN_MB1        (0xFFFD0220) // (CAN_MB1) Base Address
+#define AT91C_BASE_CAN_MB2        (0xFFFD0240) // (CAN_MB2) Base Address
+#define AT91C_BASE_CAN_MB3        (0xFFFD0260) // (CAN_MB3) Base Address
+#define AT91C_BASE_CAN_MB4        (0xFFFD0280) // (CAN_MB4) Base Address
+#define AT91C_BASE_CAN_MB5        (0xFFFD02A0) // (CAN_MB5) Base Address
+#define AT91C_BASE_CAN_MB6        (0xFFFD02C0) // (CAN_MB6) Base Address
+#define AT91C_BASE_CAN_MB7        (0xFFFD02E0) // (CAN_MB7) Base Address
+#define AT91C_BASE_CAN            (0xFFFD0000) // (CAN) Base Address
+#define AT91C_BASE_EMAC           (0xFFFDC000) // (EMAC) Base Address
+#define AT91C_BASE_PDC_ADC        (0xFFFD8100) // (PDC_ADC) Base Address
+#define AT91C_BASE_ADC            (0xFFFD8000) // (ADC) Base Address
+#define AT91C_BASE_PDC_AES        (0xFFFA4100) // (PDC_AES) Base Address
+#define AT91C_BASE_AES            (0xFFFA4000) // (AES) Base Address
+#define AT91C_BASE_PDC_TDES       (0xFFFA8100) // (PDC_TDES) Base Address
+#define AT91C_BASE_TDES           (0xFFFA8000) // (TDES) Base Address
+
+// *****************************************************************************
+//               MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256
+// *****************************************************************************
+#define AT91C_ISRAM               (0x00200000) // Internal SRAM base address
+#define AT91C_ISRAM_SIZE             (0x00010000) // Internal SRAM size in byte (64 Kbyte)
+#define AT91C_IFLASH                 (0x00100000) // Internal ROM base address
+#define AT91C_IFLASH_SIZE           (0x00040000) // Internal ROM size in byte (256 Kbyte)
diff --git a/portable/IAR/AtmelSAM7S64/ISR_Support.h b/portable/IAR/AtmelSAM7S64/ISR_Support.h
index 27287d2..4651c2d 100644
--- a/portable/IAR/AtmelSAM7S64/ISR_Support.h
+++ b/portable/IAR/AtmelSAM7S64/ISR_Support.h
@@ -1,106 +1,105 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-	EXTERN pxCurrentTCB

-	EXTERN ulCriticalNesting

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Context save and restore macro definitions

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-

-portSAVE_CONTEXT MACRO

-

-	; Push R0 as we are going to use the register.

-	STMDB	SP!, {R0}

-

-	; Set R0 to point to the task stack pointer.

-	STMDB	SP, {SP}^

-	NOP

-	SUB		SP, SP, #4

-	LDMIA	SP!, {R0}

-

-	; Push the return address onto the stack.

-	STMDB	R0!, {LR}

-

-	; Now we have saved LR we can use it instead of R0.

-	MOV		LR, R0

-

-	; Pop R0 so we can save it onto the system mode stack.

-	LDMIA	SP!, {R0}

-

-	; Push all the system mode registers onto the task stack.

-	STMDB	LR, {R0-LR}^

-	NOP

-	SUB		LR, LR, #60

-

-	; Push the SPSR onto the task stack.

-	MRS		R0, SPSR

-	STMDB	LR!, {R0}

-

-	LDR		R0, =ulCriticalNesting

-	LDR		R0, [R0]

-	STMDB	LR!, {R0}

-

-	; Store the new top of stack for the task.

-	LDR		R1, =pxCurrentTCB

-	LDR		R0, [R1]

-	STR		LR, [R0]

-

-	ENDM

-

-

-portRESTORE_CONTEXT MACRO

-

-	; Set the LR to the task stack.

-	LDR		R1, =pxCurrentTCB

-	LDR		R0, [R1]

-	LDR		LR, [R0]

-

-	; The critical nesting depth is the first item on the stack.

-	; Load it into the ulCriticalNesting variable.

-	LDR		R0, =ulCriticalNesting

-	LDMFD	LR!, {R1}

-	STR		R1, [R0]

-

-	; Get the SPSR from the stack.

-	LDMFD	LR!, {R0}

-	MSR		SPSR_cxsf, R0

-

-	; Restore all system mode registers for the task.

-	LDMFD	LR, {R0-R14}^

-	NOP

-

-	; Restore the return address.

-	LDR		LR, [LR, #+60]

-

-	; And return - correcting the offset in the LR to obtain the

-	; correct address.

-	SUBS	PC, LR, #4

-

-	ENDM

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+    EXTERN pxCurrentTCB
+    EXTERN ulCriticalNesting
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Context save and restore macro definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+portSAVE_CONTEXT MACRO
+
+    ; Push R0 as we are going to use the register.
+    STMDB   SP!, {R0}
+
+    ; Set R0 to point to the task stack pointer.
+    STMDB   SP, {SP}^
+    NOP
+    SUB     SP, SP, #4
+    LDMIA   SP!, {R0}
+
+    ; Push the return address onto the stack.
+    STMDB   R0!, {LR}
+
+    ; Now we have saved LR we can use it instead of R0.
+    MOV     LR, R0
+
+    ; Pop R0 so we can save it onto the system mode stack.
+    LDMIA   SP!, {R0}
+
+    ; Push all the system mode registers onto the task stack.
+    STMDB   LR, {R0-LR}^
+    NOP
+    SUB     LR, LR, #60
+
+    ; Push the SPSR onto the task stack.
+    MRS     R0, SPSR
+    STMDB   LR!, {R0}
+
+    LDR     R0, =ulCriticalNesting
+    LDR     R0, [R0]
+    STMDB   LR!, {R0}
+
+    ; Store the new top of stack for the task.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    STR     LR, [R0]
+
+    ENDM
+
+
+portRESTORE_CONTEXT MACRO
+
+    ; Set the LR to the task stack.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    LDR     LR, [R0]
+
+    ; The critical nesting depth is the first item on the stack.
+    ; Load it into the ulCriticalNesting variable.
+    LDR     R0, =ulCriticalNesting
+    LDMFD   LR!, {R1}
+    STR     R1, [R0]
+
+    ; Get the SPSR from the stack.
+    LDMFD   LR!, {R0}
+    MSR     SPSR_cxsf, R0
+
+    ; Restore all system mode registers for the task.
+    LDMFD   LR, {R0-R14}^
+    NOP
+
+    ; Restore the return address.
+    LDR     LR, [LR, #+60]
+
+    ; And return - correcting the offset in the LR to obtain the
+    ; correct address.
+    SUBS    PC, LR, #4
+
+    ENDM
diff --git a/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h b/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h
index 9d012c4..144dc73 100644
--- a/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h
+++ b/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h
@@ -1,3265 +1,3265 @@
-//*----------------------------------------------------------------------------

-//*         ATMEL Microcontroller Software Support  -  ROUSSET  -

-//*----------------------------------------------------------------------------

-//* The software is delivered "AS IS" without warranty or condition of any

-//* kind, either express, implied or statutory. This includes without

-//* limitation any warranty or condition with respect to merchantability or

-//* fitness for any particular purpose, or against the infringements of

-//* intellectual property rights of others.

-//*----------------------------------------------------------------------------

-//* File Name           : lib_AT91SAM7S64.h

-//* Object              : AT91SAM7S64 inlined functions

-//* Generated           : AT91 SW Application Group  07/16/2004 (07:43:09)

-//*

-//* CVS Reference       : /lib_MC_SAM.h/1.3/Thu Mar 25 15:19:14 2004//

-//* CVS Reference       : /lib_pdc_1363d.h/1.2/Wed Feb 19 09:25:22 2003//

-//* CVS Reference       : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003//

-//* CVS Reference       : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003//

-//* CVS Reference       : /lib_spi2.h/1.1/Mon Aug 25 13:23:52 2003//

-//* CVS Reference       : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004//

-//* CVS Reference       : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003//

-//* CVS Reference       : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004//

-//* CVS Reference       : /lib_adc.h/1.6/Fri Oct 17 08:12:38 2003//

-//* CVS Reference       : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003//

-//* CVS Reference       : /lib_twi.h/1.2/Fri Jan 31 12:19:38 2003//

-//* CVS Reference       : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002//

-//* CVS Reference       : /lib_udp.h/1.3/Fri Jan 31 12:19:48 2003//

-//* CVS Reference       : /lib_aic.h/1.3/Fri Jul 12 07:46:12 2002//

-//*----------------------------------------------------------------------------

-

-#ifndef lib_AT91SAM7S64_H

-#define lib_AT91SAM7S64_H

-

-/* *****************************************************************************

-                SOFTWARE API FOR MC

-   ***************************************************************************** */

-

-#define AT91C_MC_CORRECT_KEY  ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_Remap

-//* \brief Make Remap

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_Remap (void)     //  

-{

-    AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC;

-    

-    pMC->MC_RCR = AT91C_MC_RCB;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_CfgModeReg

-//* \brief Configure the EFC Mode Register of the MC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_EFC_CfgModeReg (

-	AT91PS_MC pMC, // pointer to a MC controller

-	unsigned int mode)        // mode register 

-{

-	// Write to the FMR register

-	pMC->MC_FMR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_GetModeReg

-//* \brief Return MC EFC Mode Regsiter

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_GetModeReg(

-	AT91PS_MC pMC) // pointer to a MC controller

-{

-	return pMC->MC_FMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_ComputeFMCN

-//* \brief Return MC EFC Mode Regsiter

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_ComputeFMCN(

-	int master_clock) // master clock in Hz

-{

-	return (master_clock/1000000 +2);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_PerformCmd

-//* \brief Perform EFC Command

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_EFC_PerformCmd (

-	AT91PS_MC pMC, // pointer to a MC controller

-    unsigned int transfer_cmd)

-{

-	pMC->MC_FCR = transfer_cmd;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_GetStatus

-//* \brief Return MC EFC Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_GetStatus(

-	AT91PS_MC pMC) // pointer to a MC controller

-{

-	return pMC->MC_FSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_IsInterruptMasked

-//* \brief Test if EFC MC Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_IsInterruptMasked(

-        AT91PS_MC pMC,   // \arg  pointer to a MC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_MC_EFC_GetModeReg(pMC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_IsInterruptSet

-//* \brief Test if EFC MC Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_IsInterruptSet(

-        AT91PS_MC pMC,   // \arg  pointer to a MC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_MC_EFC_GetStatus(pMC) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR PDC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetNextRx

-//* \brief Set the next receive transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetNextRx (

-	AT91PS_PDC pPDC,     // \arg pointer to a PDC controller

-	char *address,       // \arg address to the next bloc to be received

-	unsigned int bytes)  // \arg number of bytes to be received

-{

-	pPDC->PDC_RNPR = (unsigned int) address;

-	pPDC->PDC_RNCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetNextTx

-//* \brief Set the next transmit transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetNextTx (

-	AT91PS_PDC pPDC,       // \arg pointer to a PDC controller

-	char *address,         // \arg address to the next bloc to be transmitted

-	unsigned int bytes)    // \arg number of bytes to be transmitted

-{

-	pPDC->PDC_TNPR = (unsigned int) address;

-	pPDC->PDC_TNCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetRx

-//* \brief Set the receive transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetRx (

-	AT91PS_PDC pPDC,       // \arg pointer to a PDC controller

-	char *address,         // \arg address to the next bloc to be received

-	unsigned int bytes)    // \arg number of bytes to be received

-{

-	pPDC->PDC_RPR = (unsigned int) address;

-	pPDC->PDC_RCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetTx

-//* \brief Set the transmit transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetTx (

-	AT91PS_PDC pPDC,       // \arg pointer to a PDC controller

-	char *address,         // \arg address to the next bloc to be transmitted

-	unsigned int bytes)    // \arg number of bytes to be transmitted

-{

-	pPDC->PDC_TPR = (unsigned int) address;

-	pPDC->PDC_TCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_EnableTx

-//* \brief Enable transmit

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_EnableTx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_TXTEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_EnableRx

-//* \brief Enable receive

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_EnableRx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_RXTEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_DisableTx

-//* \brief Disable transmit

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_DisableTx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_TXTDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_DisableRx

-//* \brief Disable receive

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_DisableRx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_RXTDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsTxEmpty

-//* \brief Test if the current transfer descriptor has been sent

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_TCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsNextTxEmpty

-//* \brief Test if the next transfer descriptor has been moved to the current td

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_TNCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsRxEmpty

-//* \brief Test if the current transfer descriptor has been filled

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_RCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsNextRxEmpty

-//* \brief Test if the next transfer descriptor has been moved to the current td

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_RNCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_Open

-//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_Open (

-	AT91PS_PDC pPDC)       // \arg pointer to a PDC controller

-{

-    //* Disable the RX and TX PDC transfer requests

-	AT91F_PDC_DisableRx(pPDC);

-	AT91F_PDC_DisableTx(pPDC);

-

-	//* Reset all Counter register Next buffer first

-	AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetRx(pPDC, (char *) 0, 0);

-

-    //* Enable the RX and TX PDC transfer requests

-	AT91F_PDC_EnableRx(pPDC);

-	AT91F_PDC_EnableTx(pPDC);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_Close

-//* \brief Close PDC: disable TX and RX reset transfer descriptors

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_Close (

-	AT91PS_PDC pPDC)       // \arg pointer to a PDC controller

-{

-    //* Disable the RX and TX PDC transfer requests

-	AT91F_PDC_DisableRx(pPDC);

-	AT91F_PDC_DisableTx(pPDC);

-

-	//* Reset all Counter register Next buffer first

-	AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetRx(pPDC, (char *) 0, 0);

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SendFrame

-//* \brief Close PDC: disable TX and RX reset transfer descriptors

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PDC_SendFrame(

-	AT91PS_PDC pPDC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	if (AT91F_PDC_IsTxEmpty(pPDC)) {

-		//* Buffer and next buffer can be initialized

-		AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer);

-		AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer);

-		return 2;

-	}

-	else if (AT91F_PDC_IsNextTxEmpty(pPDC)) {

-		//* Only one buffer can be initialized

-		AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer);

-		return 1;

-	}

-	else {

-		//* All buffer are in use...

-		return 0;

-	}

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_ReceiveFrame

-//* \brief Close PDC: disable TX and RX reset transfer descriptors

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PDC_ReceiveFrame (

-	AT91PS_PDC pPDC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	if (AT91F_PDC_IsRxEmpty(pPDC)) {

-		//* Buffer and next buffer can be initialized

-		AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer);

-		AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer);

-		return 2;

-	}

-	else if (AT91F_PDC_IsNextRxEmpty(pPDC)) {

-		//* Only one buffer can be initialized

-		AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer);

-		return 1;

-	}

-	else {

-		//* All buffer are in use...

-		return 0;

-	}

-}

-/* *****************************************************************************

-                SOFTWARE API FOR DBGU

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_InterruptEnable

-//* \brief Enable DBGU Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_InterruptEnable(

-        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller

-        unsigned int flag) // \arg  dbgu interrupt to be enabled

-{

-        pDbgu->DBGU_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_InterruptDisable

-//* \brief Disable DBGU Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_InterruptDisable(

-        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller

-        unsigned int flag) // \arg  dbgu interrupt to be disabled

-{

-        pDbgu->DBGU_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_GetInterruptMaskStatus

-//* \brief Return DBGU Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status

-        AT91PS_DBGU pDbgu) // \arg  pointer to a DBGU controller

-{

-        return pDbgu->DBGU_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_IsInterruptMasked

-//* \brief Test if DBGU Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_DBGU_IsInterruptMasked(

-        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR SSC

-   ***************************************************************************** */

-//* Define the standard I2S mode configuration

-

-//* Configuration to set in the SSC Transmit Clock Mode Register

-//* Parameters :  nb_bit_by_slot : 8, 16 or 32 bits

-//* 			  nb_slot_by_frame : number of channels

-#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\

-									   AT91C_SSC_CKS_DIV   +\

-                            		   AT91C_SSC_CKO_CONTINOUS      +\

-                            		   AT91C_SSC_CKG_NONE    +\

-                                       AT91C_SSC_START_FALL_RF +\

-                           			   AT91C_SSC_STTOUT  +\

-                            		   ((1<<16) & AT91C_SSC_STTDLY) +\

-                            		   ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24))

-

-

-//* Configuration to set in the SSC Transmit Frame Mode Register

-//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits

-//* 			 nb_slot_by_frame : number of channels

-#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\

-									(nb_bit_by_slot-1)  +\

-                            		AT91C_SSC_MSBF   +\

-                            		(((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB)  +\

-                            		(((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\

-                            		AT91C_SSC_FSOS_NEGATIVE)

-

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_SetBaudrate

-//* \brief Set the baudrate according to the CPU clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_SetBaudrate (

-        AT91PS_SSC pSSC,        // \arg pointer to a SSC controller

-        unsigned int mainClock, // \arg peripheral clock

-        unsigned int speed)     // \arg SSC baudrate

-{

-        unsigned int baud_value;

-        //* Define the baud rate divisor register

-        if (speed == 0)

-           baud_value = 0;

-        else

-        {

-           baud_value = (unsigned int) (mainClock * 10)/(2*speed);

-           if ((baud_value % 10) >= 5)

-                  baud_value = (baud_value / 10) + 1;

-           else

-                  baud_value /= 10;

-        }

-

-        pSSC->SSC_CMR = baud_value;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_Configure

-//* \brief Configure SSC

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_Configure (

-             AT91PS_SSC pSSC,          // \arg pointer to a SSC controller

-             unsigned int syst_clock,  // \arg System Clock Frequency

-             unsigned int baud_rate,   // \arg Expected Baud Rate Frequency

-             unsigned int clock_rx,    // \arg Receiver Clock Parameters

-             unsigned int mode_rx,     // \arg mode Register to be programmed

-             unsigned int clock_tx,    // \arg Transmitter Clock Parameters

-             unsigned int mode_tx)     // \arg mode Register to be programmed

-{

-    //* Disable interrupts

-	pSSC->SSC_IDR = (unsigned int) -1;

-

-    //* Reset receiver and transmitter

-	pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ;

-

-    //* Define the Clock Mode Register

-	AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate);

-

-     //* Write the Receive Clock Mode Register

-	pSSC->SSC_RCMR =  clock_rx;

-

-     //* Write the Transmit Clock Mode Register

-	pSSC->SSC_TCMR =  clock_tx;

-

-     //* Write the Receive Frame Mode Register

-	pSSC->SSC_RFMR =  mode_rx;

-

-     //* Write the Transmit Frame Mode Register

-	pSSC->SSC_TFMR =  mode_tx;

-

-    //* Clear Transmit and Receive Counters

-	AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR));

-

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_EnableRx

-//* \brief Enable receiving datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_EnableRx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Enable receiver

-    pSSC->SSC_CR = AT91C_SSC_RXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_DisableRx

-//* \brief Disable receiving datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_DisableRx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Disable receiver

-    pSSC->SSC_CR = AT91C_SSC_RXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_EnableTx

-//* \brief Enable sending datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_EnableTx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Enable  transmitter

-    pSSC->SSC_CR = AT91C_SSC_TXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_DisableTx

-//* \brief Disable sending datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_DisableTx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Disable  transmitter

-    pSSC->SSC_CR = AT91C_SSC_TXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_EnableIt

-//* \brief Enable SSC IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_EnableIt (

-	AT91PS_SSC pSSC, // \arg pointer to a SSC controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pSSC->SSC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_DisableIt

-//* \brief Disable SSC IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_DisableIt (

-	AT91PS_SSC pSSC, // \arg pointer to a SSC controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IDR register

-	pSSC->SSC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_ReceiveFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SSC_ReceiveFrame (

-	AT91PS_SSC pSSC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_ReceiveFrame(

-		(AT91PS_PDC) &(pSSC->SSC_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_SendFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SSC_SendFrame(

-	AT91PS_SSC pSSC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_SendFrame(

-		(AT91PS_PDC) &(pSSC->SSC_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_GetInterruptMaskStatus

-//* \brief Return SSC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status

-        AT91PS_SSC pSsc) // \arg  pointer to a SSC controller

-{

-        return pSsc->SSC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_IsInterruptMasked

-//* \brief Test if SSC Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_SSC_IsInterruptMasked(

-        AT91PS_SSC pSsc,   // \arg  pointer to a SSC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR SPI

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Open

-//* \brief Open a SPI Port

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_Open (

-        const unsigned int null)  // \arg

-{

-        /* NOT DEFINED AT THIS MOMENT */

-        return ( 0 );

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgCs

-//* \brief Configure SPI chip select register

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgCs (

-	AT91PS_SPI pSPI,     // pointer to a SPI controller

-	int cs,     // SPI cs number (0 to 3)

- 	int val)   //  chip select register

-{

-	//* Write to the CSR register

-	*(pSPI->SPI_CSR + cs) = val;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_EnableIt

-//* \brief Enable SPI interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_EnableIt (

-	AT91PS_SPI pSPI,     // pointer to a SPI controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pSPI->SPI_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_DisableIt

-//* \brief Disable SPI interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_DisableIt (

-	AT91PS_SPI pSPI, // pointer to a SPI controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pSPI->SPI_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Reset

-//* \brief Reset the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Reset (

-	AT91PS_SPI pSPI // pointer to a SPI controller

-	)

-{

-	//* Write to the CR register

-	pSPI->SPI_CR = AT91C_SPI_SWRST;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Enable

-//* \brief Enable the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Enable (

-	AT91PS_SPI pSPI // pointer to a SPI controller

-	)

-{

-	//* Write to the CR register

-	pSPI->SPI_CR = AT91C_SPI_SPIEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Disable

-//* \brief Disable the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Disable (

-	AT91PS_SPI pSPI // pointer to a SPI controller

-	)

-{

-	//* Write to the CR register

-	pSPI->SPI_CR = AT91C_SPI_SPIDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgMode

-//* \brief Enable the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgMode (

-	AT91PS_SPI pSPI, // pointer to a SPI controller

-	int mode)        // mode register 

-{

-	//* Write to the MR register

-	pSPI->SPI_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgPCS

-//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgPCS (

-	AT91PS_SPI pSPI, // pointer to a SPI controller

-	char PCS_Device) // PCS of the Device

-{	

- 	//* Write to the MR register

-	pSPI->SPI_MR &= 0xFFF0FFFF;

-	pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS );

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_ReceiveFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_ReceiveFrame (

-	AT91PS_SPI pSPI,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_ReceiveFrame(

-		(AT91PS_PDC) &(pSPI->SPI_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_SendFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_SendFrame(

-	AT91PS_SPI pSPI,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_SendFrame(

-		(AT91PS_PDC) &(pSPI->SPI_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Close

-//* \brief Close SPI: disable IT disable transfert, close PDC

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Close (

-	AT91PS_SPI pSPI)     // \arg pointer to a SPI controller

-{

-    //* Reset all the Chip Select register

-    pSPI->SPI_CSR[0] = 0 ;

-    pSPI->SPI_CSR[1] = 0 ;

-    pSPI->SPI_CSR[2] = 0 ;

-    pSPI->SPI_CSR[3] = 0 ;

-

-    //* Reset the SPI mode

-    pSPI->SPI_MR = 0  ;

-

-    //* Disable all interrupts

-    pSPI->SPI_IDR = 0xFFFFFFFF ;

-

-    //* Abort the Peripheral Data Transfers

-    AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR));

-

-    //* Disable receiver and transmitter and stop any activity immediately

-    pSPI->SPI_CR = AT91C_SPI_SPIDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_PutChar

-//* \brief Send a character,does not check if ready to send

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_PutChar (

-	AT91PS_SPI pSPI,

-	unsigned int character,

-             unsigned int cs_number )

-{

-    unsigned int value_for_cs;

-    value_for_cs = (~(1 << cs_number)) & 0xF;  //Place a zero among a 4 ONEs number

-    pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_GetChar

-//* \brief Receive a character,does not check if a character is available

-//*----------------------------------------------------------------------------

-__inline int AT91F_SPI_GetChar (

-	const AT91PS_SPI pSPI)

-{

-    return((pSPI->SPI_RDR) & 0xFFFF);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_GetInterruptMaskStatus

-//* \brief Return SPI Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status

-        AT91PS_SPI pSpi) // \arg  pointer to a SPI controller

-{

-        return pSpi->SPI_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_IsInterruptMasked

-//* \brief Test if SPI Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_SPI_IsInterruptMasked(

-        AT91PS_SPI pSpi,   // \arg  pointer to a SPI controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR PWMC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_GetStatus

-//* \brief Return PWM Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status

-	AT91PS_PWMC pPWM) // pointer to a PWM controller

-{

-	return pPWM->PWMC_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_InterruptEnable

-//* \brief Enable PWM Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_InterruptEnable(

-        AT91PS_PWMC pPwm,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  PWM interrupt to be enabled

-{

-        pPwm->PWMC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_InterruptDisable

-//* \brief Disable PWM Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_InterruptDisable(

-        AT91PS_PWMC pPwm,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  PWM interrupt to be disabled

-{

-        pPwm->PWMC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_GetInterruptMaskStatus

-//* \brief Return PWM Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status

-        AT91PS_PWMC pPwm) // \arg  pointer to a PWM controller

-{

-        return pPwm->PWMC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_IsInterruptMasked

-//* \brief Test if PWM Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_IsInterruptMasked(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_IsStatusSet

-//* \brief Test if PWM Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_IsStatusSet(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PWMC_GetStatus(pPWM) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_CfgChannel

-//* \brief Test if PWM Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CfgChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int channelId, // \arg PWM channel ID

-        unsigned int mode, // \arg  PWM mode

-        unsigned int period, // \arg PWM period

-        unsigned int duty) // \arg PWM duty cycle

-{

-	pPWM->PWMC_CH[channelId].PWMC_CMR = mode;

-	pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty;

-	pPWM->PWMC_CH[channelId].PWMC_CPRDR = period;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_StartChannel

-//* \brief Enable channel

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_StartChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  Channels IDs to be enabled

-{

-	pPWM->PWMC_ENA = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_StopChannel

-//* \brief Disable channel

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_StopChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  Channels IDs to be enabled

-{

-	pPWM->PWMC_DIS = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_UpdateChannel

-//* \brief Update Period or Duty Cycle

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_UpdateChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int channelId, // \arg PWM channel ID

-        unsigned int update) // \arg  Channels IDs to be enabled

-{

-	pPWM->PWMC_CH[channelId].PWMC_CUPDR = update;

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR TC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_InterruptEnable

-//* \brief Enable TC Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC_InterruptEnable(

-        AT91PS_TC pTc,   // \arg  pointer to a TC controller

-        unsigned int flag) // \arg  TC interrupt to be enabled

-{

-        pTc->TC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_InterruptDisable

-//* \brief Disable TC Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC_InterruptDisable(

-        AT91PS_TC pTc,   // \arg  pointer to a TC controller

-        unsigned int flag) // \arg  TC interrupt to be disabled

-{

-        pTc->TC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_GetInterruptMaskStatus

-//* \brief Return TC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status

-        AT91PS_TC pTc) // \arg  pointer to a TC controller

-{

-        return pTc->TC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_IsInterruptMasked

-//* \brief Test if TC Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_TC_IsInterruptMasked(

-        AT91PS_TC pTc,   // \arg  pointer to a TC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR PMC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgSysClkEnableReg

-//* \brief Configure the System Clock Enable Register of the PMC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgSysClkEnableReg (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int mode)

-{

-	//* Write to the SCER register

-	pPMC->PMC_SCER = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgSysClkDisableReg

-//* \brief Configure the System Clock Disable Register of the PMC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgSysClkDisableReg (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int mode)

-{

-	//* Write to the SCDR register

-	pPMC->PMC_SCDR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetSysClkStatusReg

-//* \brief Return the System Clock Status Register of the PMC controller

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetSysClkStatusReg (

-	AT91PS_PMC pPMC // pointer to a CAN controller

-	)

-{

-	return pPMC->PMC_SCSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_EnablePeriphClock

-//* \brief Enable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_EnablePeriphClock (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int periphIds)  // \arg IDs of peripherals to enable

-{

-	pPMC->PMC_PCER = periphIds;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_DisablePeriphClock

-//* \brief Disable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_DisablePeriphClock (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int periphIds)  // \arg IDs of peripherals to enable

-{

-	pPMC->PMC_PCDR = periphIds;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetPeriphClock

-//* \brief Get peripheral clock status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetPeriphClock (

-	AT91PS_PMC pPMC) // \arg pointer to PMC controller

-{

-	return pPMC->PMC_PCSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_CfgMainOscillatorReg

-//* \brief Cfg the main oscillator

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_CfgMainOscillatorReg (

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int mode)

-{

-	pCKGR->CKGR_MOR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_GetMainOscillatorReg

-//* \brief Cfg the main oscillator

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CKGR_GetMainOscillatorReg (

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	return pCKGR->CKGR_MOR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_EnableMainOscillator

-//* \brief Enable the main oscillator

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_EnableMainOscillator(

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_DisableMainOscillator

-//* \brief Disable the main oscillator

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_DisableMainOscillator (

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_CfgMainOscStartUpTime

-//* \brief Cfg MOR Register according to the main osc startup time

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_CfgMainOscStartUpTime (

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int startup_time,  // \arg main osc startup time in microsecond (us)

-	unsigned int slowClock)  // \arg slowClock in Hz

-{

-	pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT;

-	pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_GetMainClockFreqReg

-//* \brief Cfg the main oscillator

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CKGR_GetMainClockFreqReg (

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	return pCKGR->CKGR_MCFR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_GetMainClock

-//* \brief Return Main clock in Hz

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CKGR_GetMainClock (

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int slowClock)  // \arg slowClock in Hz

-{

-	return ((pCKGR->CKGR_MCFR  & AT91C_CKGR_MAINF) * slowClock) >> 4;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgMCKReg

-//* \brief Cfg Master Clock Register

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgMCKReg (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int mode)

-{

-	pPMC->PMC_MCKR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetMCKReg

-//* \brief Return Master Clock Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetMCKReg(

-	AT91PS_PMC pPMC) // \arg pointer to PMC controller

-{

-	return pPMC->PMC_MCKR;

-}

-

-//*------------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetMasterClock

-//* \brief Return master clock in Hz which correponds to processor clock for ARM7

-//*------------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetMasterClock (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int slowClock)  // \arg slowClock in Hz

-{

-	unsigned int reg = pPMC->PMC_MCKR;

-	unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2));

-	unsigned int pllDivider, pllMultiplier;

-

-	switch (reg & AT91C_PMC_CSS) {

-		case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected

-			return slowClock / prescaler;

-		case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected

-			return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler;

-		case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected

-			reg = pCKGR->CKGR_PLLR;

-			pllDivider    = (reg  & AT91C_CKGR_DIV);

-			pllMultiplier = ((reg  & AT91C_CKGR_MUL) >> 16) + 1;

-			return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler;

-	}

-	return 0;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_EnablePCK

-//* \brief Enable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_EnablePCK (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int pck,  // \arg Peripheral clock identifier 0 .. 7

-	unsigned int mode)

-{

-	pPMC->PMC_PCKR[pck] = mode;

-	pPMC->PMC_SCER = (1 << pck) << 8;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_DisablePCK

-//* \brief Enable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_DisablePCK (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int pck)  // \arg Peripheral clock identifier 0 .. 7

-{

-	pPMC->PMC_SCDR = (1 << pck) << 8;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_EnableIt

-//* \brief Enable PMC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_EnableIt (

-	AT91PS_PMC pPMC,     // pointer to a PMC controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pPMC->PMC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_DisableIt

-//* \brief Disable PMC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_DisableIt (

-	AT91PS_PMC pPMC, // pointer to a PMC controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pPMC->PMC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetStatus

-//* \brief Return PMC Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status

-	AT91PS_PMC pPMC) // pointer to a PMC controller

-{

-	return pPMC->PMC_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetInterruptMaskStatus

-//* \brief Return PMC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status

-	AT91PS_PMC pPMC) // pointer to a PMC controller

-{

-	return pPMC->PMC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_IsInterruptMasked

-//* \brief Test if PMC Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_IsInterruptMasked(

-        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_IsStatusSet

-//* \brief Test if PMC Status is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_IsStatusSet(

-        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PMC_GetStatus(pPMC) & flag);

-}/* *****************************************************************************

-                SOFTWARE API FOR ADC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_EnableIt

-//* \brief Enable ADC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_EnableIt (

-	AT91PS_ADC pADC,     // pointer to a ADC controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pADC->ADC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_DisableIt

-//* \brief Disable ADC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_DisableIt (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pADC->ADC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetStatus

-//* \brief Return ADC Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status

-	AT91PS_ADC pADC) // pointer to a ADC controller

-{

-	return pADC->ADC_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetInterruptMaskStatus

-//* \brief Return ADC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status

-	AT91PS_ADC pADC) // pointer to a ADC controller

-{

-	return pADC->ADC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_IsInterruptMasked

-//* \brief Test if ADC Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_IsInterruptMasked(

-        AT91PS_ADC pADC,   // \arg  pointer to a ADC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_IsStatusSet

-//* \brief Test if ADC Status is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_IsStatusSet(

-        AT91PS_ADC pADC,   // \arg  pointer to a ADC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_ADC_GetStatus(pADC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgModeReg

-//* \brief Configure the Mode Register of the ADC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgModeReg (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int mode)        // mode register 

-{

-	//* Write to the MR register

-	pADC->ADC_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetModeReg

-//* \brief Return the Mode Register of the ADC controller value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetModeReg (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_MR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgTimings

-//* \brief Configure the different necessary timings of the ADC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgTimings (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int mck_clock, // in MHz 

-	unsigned int adc_clock, // in MHz 

-	unsigned int startup_time, // in us 

-	unsigned int sample_and_hold_time)	// in ns  

-{

-	unsigned int prescal,startup,shtim;

-	

-	prescal = mck_clock/(2*adc_clock) - 1;

-	startup = adc_clock*startup_time/8 - 1;

-	shtim = adc_clock*sample_and_hold_time/1000 - 1;

-	

-	//* Write to the MR register

-	pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_EnableChannel

-//* \brief Return ADC Timer Register Value

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_EnableChannel (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int channel)        // mode register 

-{

-	//* Write to the CHER register

-	pADC->ADC_CHER = channel;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_DisableChannel

-//* \brief Return ADC Timer Register Value

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_DisableChannel (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int channel)        // mode register 

-{

-	//* Write to the CHDR register

-	pADC->ADC_CHDR = channel;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetChannelStatus

-//* \brief Return ADC Timer Register Value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetChannelStatus (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CHSR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_StartConversion

-//* \brief Software request for a analog to digital conversion 

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_StartConversion (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	pADC->ADC_CR = AT91C_ADC_START;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_SoftReset

-//* \brief Software reset

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_SoftReset (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	pADC->ADC_CR = AT91C_ADC_SWRST;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetLastConvertedData

-//* \brief Return the Last Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetLastConvertedData (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_LCDR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH0

-//* \brief Return the Channel 0 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH0 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR0;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH1

-//* \brief Return the Channel 1 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH1 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR1;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH2

-//* \brief Return the Channel 2 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH2 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR2;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH3

-//* \brief Return the Channel 3 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH3 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR3;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH4

-//* \brief Return the Channel 4 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH4 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR4;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH5

-//* \brief Return the Channel 5 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH5 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR5;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH6

-//* \brief Return the Channel 6 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH6 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR6;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH7

-//* \brief Return the Channel 7 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH7 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR7;	

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR PIO

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgPeriph

-//* \brief Enable pins to be drived by peripheral

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgPeriph(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int periphAEnable,  // \arg PERIPH A to enable

-	unsigned int periphBEnable)  // \arg PERIPH B to enable

-

-{

-	pPio->PIO_ASR = periphAEnable;

-	pPio->PIO_BSR = periphBEnable;

-	pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgOutput

-//* \brief Enable PIO in output mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgOutput(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int pioEnable)      // \arg PIO to be enabled

-{

-	pPio->PIO_PER = pioEnable; // Set in PIO mode

-	pPio->PIO_OER = pioEnable; // Configure in Output

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgInput

-//* \brief Enable PIO in input mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgInput(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int inputEnable)      // \arg PIO to be enabled

-{

-	// Disable output

-	pPio->PIO_ODR  = inputEnable;

-	pPio->PIO_PER  = inputEnable;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgOpendrain

-//* \brief Configure PIO in open drain

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgOpendrain(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int multiDrvEnable) // \arg pio to be configured in open drain

-{

-	// Configure the multi-drive option

-	pPio->PIO_MDDR = ~multiDrvEnable;

-	pPio->PIO_MDER = multiDrvEnable;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgPullup

-//* \brief Enable pullup on PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgPullup(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int pullupEnable)   // \arg enable pullup on PIO

-{

-		// Connect or not Pullup

-	pPio->PIO_PPUDR = ~pullupEnable;

-	pPio->PIO_PPUER = pullupEnable;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgDirectDrive

-//* \brief Enable direct drive on PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgDirectDrive(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int directDrive)    // \arg PIO to be configured with direct drive

-

-{

-	// Configure the Direct Drive

-	pPio->PIO_OWDR  = ~directDrive;

-	pPio->PIO_OWER  = directDrive;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgInputFilter

-//* \brief Enable input filter on input PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgInputFilter(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int inputFilter)    // \arg PIO to be configured with input filter

-

-{

-	// Configure the Direct Drive

-	pPio->PIO_IFDR  = ~inputFilter;

-	pPio->PIO_IFER  = inputFilter;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInput

-//* \brief Return PIO input value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInput( // \return PIO input

-	AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-	return pPio->PIO_PDSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInputSet

-//* \brief Test if PIO is input flag is active

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInputSet(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PIO_GetInput(pPio) & flag);

-}

-

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_SetOutput

-//* \brief Set to 1 output PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_SetOutput(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  output to be set

-{

-	pPio->PIO_SODR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_ClearOutput

-//* \brief Set to 0 output PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_ClearOutput(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  output to be cleared

-{

-	pPio->PIO_CODR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_ForceOutput

-//* \brief Force output when Direct drive option is enabled

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_ForceOutput(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  output to be forced

-{

-	pPio->PIO_ODSR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_Enable

-//* \brief Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_Enable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be enabled 

-{

-        pPio->PIO_PER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_Disable

-//* \brief Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_Disable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be disabled 

-{

-        pPio->PIO_PDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetStatus

-//* \brief Return PIO Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_PSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsSet

-//* \brief Test if PIO is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputEnable

-//* \brief Output Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output to be enabled

-{

-        pPio->PIO_OER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputDisable

-//* \brief Output Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output to be disabled

-{

-        pPio->PIO_ODR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetOutputStatus

-//* \brief Return PIO Output Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_OSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsOuputSet

-//* \brief Test if PIO Output is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsOutputSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetOutputStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InputFilterEnable

-//* \brief Input Filter Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InputFilterEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio input filter to be enabled

-{

-        pPio->PIO_IFER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InputFilterDisable

-//* \brief Input Filter Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InputFilterDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio input filter to be disabled

-{

-        pPio->PIO_IFDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInputFilterStatus

-//* \brief Return PIO Input Filter Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_IFSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInputFilterSet

-//* \brief Test if PIO Input filter is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInputFilterSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetInputFilterStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetOutputDataStatus

-//* \brief Return PIO Output Data Status 

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status 

-	AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_ODSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InterruptEnable

-//* \brief Enable PIO Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InterruptEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio interrupt to be enabled

-{

-        pPio->PIO_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InterruptDisable

-//* \brief Disable PIO Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InterruptDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio interrupt to be disabled

-{

-        pPio->PIO_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInterruptMaskStatus

-//* \brief Return PIO Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInterruptStatus

-//* \brief Return PIO Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_ISR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInterruptMasked

-//* \brief Test if PIO Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInterruptMasked(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInterruptSet

-//* \brief Test if PIO Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInterruptSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetInterruptStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_MultiDriverEnable

-//* \brief Multi Driver Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_MultiDriverEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be enabled

-{

-        pPio->PIO_MDER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_MultiDriverDisable

-//* \brief Multi Driver Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_MultiDriverDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be disabled

-{

-        pPio->PIO_MDDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetMultiDriverStatus

-//* \brief Return PIO Multi Driver Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_MDSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsMultiDriverSet

-//* \brief Test if PIO MultiDriver is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsMultiDriverSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_A_RegisterSelection

-//* \brief PIO A Register Selection 

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_A_RegisterSelection(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio A register selection

-{

-        pPio->PIO_ASR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_B_RegisterSelection

-//* \brief PIO B Register Selection 

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_B_RegisterSelection(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio B register selection 

-{

-        pPio->PIO_BSR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_Get_AB_RegisterStatus

-//* \brief Return PIO Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_ABSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsAB_RegisterSet

-//* \brief Test if PIO AB Register is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsAB_RegisterSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputWriteEnable

-//* \brief Output Write Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputWriteEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output write to be enabled

-{

-        pPio->PIO_OWER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputWriteDisable

-//* \brief Output Write Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputWriteDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output write to be disabled

-{

-        pPio->PIO_OWDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetOutputWriteStatus

-//* \brief Return PIO Output Write Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_OWSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsOutputWriteSet

-//* \brief Test if PIO OutputWrite is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsOutputWriteSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetCfgPullup

-//* \brief Return PIO Configuration Pullup

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup 

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_PPUSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsOutputDataStatusSet

-//* \brief Test if PIO Output Data Status is Set 

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsOutputDataStatusSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetOutputDataStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsCfgPullupStatusSet

-//* \brief Test if PIO Configuration Pullup Status is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsCfgPullupStatusSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (~AT91F_PIO_GetCfgPullup(pPio) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR TWI

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_EnableIt

-//* \brief Enable TWI IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_EnableIt (

-	AT91PS_TWI pTWI, // \arg pointer to a TWI controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pTWI->TWI_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_DisableIt

-//* \brief Disable TWI IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_DisableIt (

-	AT91PS_TWI pTWI, // \arg pointer to a TWI controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IDR register

-	pTWI->TWI_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_Configure

-//* \brief Configure TWI in master mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI )          // \arg pointer to a TWI controller

-{

-    //* Disable interrupts

-	pTWI->TWI_IDR = (unsigned int) -1;

-

-    //* Reset peripheral

-	pTWI->TWI_CR = AT91C_TWI_SWRST;

-

-	//* Set Master mode

-	pTWI->TWI_CR = AT91C_TWI_MSEN | AT91C_TWI_SVDIS;

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_GetInterruptMaskStatus

-//* \brief Return TWI Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status

-        AT91PS_TWI pTwi) // \arg  pointer to a TWI controller

-{

-        return pTwi->TWI_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_IsInterruptMasked

-//* \brief Test if TWI Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_TWI_IsInterruptMasked(

-        AT91PS_TWI pTwi,   // \arg  pointer to a TWI controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR USART

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Baudrate

-//* \brief Calculate the baudrate

-//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity

-#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \

-                        AT91C_US_NBSTOP_1_BIT + \

-                        AT91C_US_PAR_NONE + \

-                        AT91C_US_CHRL_8_BITS + \

-                        AT91C_US_CLKS_CLOCK )

-

-//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity

-#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \

-                            AT91C_US_NBSTOP_1_BIT + \

-                            AT91C_US_PAR_NONE + \

-                            AT91C_US_CHRL_8_BITS + \

-                            AT91C_US_CLKS_EXT )

-

-//* Standard Synchronous Mode : 8 bits , 1 stop , no parity

-#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \

-                       AT91C_US_USMODE_NORMAL + \

-                       AT91C_US_NBSTOP_1_BIT + \

-                       AT91C_US_PAR_NONE + \

-                       AT91C_US_CHRL_8_BITS + \

-                       AT91C_US_CLKS_CLOCK )

-

-//* SCK used Label

-#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT)

-

-//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity

-#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \

-					   		 AT91C_US_CLKS_CLOCK +\

-                       		 AT91C_US_NBSTOP_1_BIT + \

-                       		 AT91C_US_PAR_EVEN + \

-                       		 AT91C_US_CHRL_8_BITS + \

-                       		 AT91C_US_CKLO +\

-                       		 AT91C_US_OVER)

-

-//* Standard IRDA mode

-#define AT91C_US_ASYNC_IRDA_MODE (  AT91C_US_USMODE_IRDA + \

-                            AT91C_US_NBSTOP_1_BIT + \

-                            AT91C_US_PAR_NONE + \

-                            AT91C_US_CHRL_8_BITS + \

-                            AT91C_US_CLKS_CLOCK )

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Baudrate

-//* \brief Caluculate baud_value according to the main clock and the baud rate

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_Baudrate (

-	const unsigned int main_clock, // \arg peripheral clock

-	const unsigned int baud_rate)  // \arg UART baudrate

-{

-	unsigned int baud_value = ((main_clock*10)/(baud_rate * 16));

-	if ((baud_value % 10) >= 5)

-		baud_value = (baud_value / 10) + 1;

-	else

-		baud_value /= 10;

-	return baud_value;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SetBaudrate

-//* \brief Set the baudrate according to the CPU clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_SetBaudrate (

-	AT91PS_USART pUSART,    // \arg pointer to a USART controller

-	unsigned int mainClock, // \arg peripheral clock

-	unsigned int speed)     // \arg UART baudrate

-{

-	//* Define the baud rate divisor register

-	pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SetTimeguard

-//* \brief Set USART timeguard

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_SetTimeguard (

-	AT91PS_USART pUSART,    // \arg pointer to a USART controller

-	unsigned int timeguard) // \arg timeguard value

-{

-	//* Write the Timeguard Register

-	pUSART->US_TTGR = timeguard ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_EnableIt

-//* \brief Enable USART IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_EnableIt (

-	AT91PS_USART pUSART, // \arg pointer to a USART controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pUSART->US_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_DisableIt

-//* \brief Disable USART IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_DisableIt (

-	AT91PS_USART pUSART, // \arg pointer to a USART controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IER register

-	pUSART->US_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Configure

-//* \brief Configure USART

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_Configure (

-	AT91PS_USART pUSART,     // \arg pointer to a USART controller

-	unsigned int mainClock,  // \arg peripheral clock

-	unsigned int mode ,      // \arg mode Register to be programmed

-	unsigned int baudRate ,  // \arg baudrate to be programmed

-	unsigned int timeguard ) // \arg timeguard to be programmed

-{

-    //* Disable interrupts

-    pUSART->US_IDR = (unsigned int) -1;

-

-    //* Reset receiver and transmitter

-    pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ;

-

-	//* Define the baud rate divisor register

-	AT91F_US_SetBaudrate(pUSART, mainClock, baudRate);

-

-	//* Write the Timeguard Register

-	AT91F_US_SetTimeguard(pUSART, timeguard);

-

-    //* Clear Transmit and Receive Counters

-    AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR));

-

-    //* Define the USART mode

-    pUSART->US_MR = mode  ;

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_EnableRx

-//* \brief Enable receiving characters

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_EnableRx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Enable receiver

-    pUSART->US_CR = AT91C_US_RXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_EnableTx

-//* \brief Enable sending characters

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_EnableTx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Enable  transmitter

-    pUSART->US_CR = AT91C_US_TXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_ResetRx

-//* \brief Reset Receiver and re-enable it

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_ResetRx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-	//* Reset receiver

-	pUSART->US_CR = AT91C_US_RSTRX;

-    //* Re-Enable receiver

-    pUSART->US_CR = AT91C_US_RXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_ResetTx

-//* \brief Reset Transmitter and re-enable it

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_ResetTx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-	//* Reset transmitter

-	pUSART->US_CR = AT91C_US_RSTTX;

-    //* Enable transmitter

-    pUSART->US_CR = AT91C_US_TXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_DisableRx

-//* \brief Disable Receiver

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_DisableRx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Disable receiver

-    pUSART->US_CR = AT91C_US_RXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_DisableTx

-//* \brief Disable Transmitter

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_DisableTx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Disable transmitter

-    pUSART->US_CR = AT91C_US_TXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Close

-//* \brief Close USART: disable IT disable receiver and transmitter, close PDC

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_Close (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Reset the baud rate divisor register

-    pUSART->US_BRGR = 0 ;

-

-    //* Reset the USART mode

-    pUSART->US_MR = 0  ;

-

-    //* Reset the Timeguard Register

-    pUSART->US_TTGR = 0;

-

-    //* Disable all interrupts

-    pUSART->US_IDR = 0xFFFFFFFF ;

-

-    //* Abort the Peripheral Data Transfers

-    AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR));

-

-    //* Disable receiver and transmitter and stop any activity immediately

-    pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_TxReady

-//* \brief Return 1 if a character can be written in US_THR

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_TxReady (

-	AT91PS_USART pUSART )     // \arg pointer to a USART controller

-{

-    return (pUSART->US_CSR & AT91C_US_TXRDY);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_RxReady

-//* \brief Return 1 if a character can be read in US_RHR

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_RxReady (

-	AT91PS_USART pUSART )     // \arg pointer to a USART controller

-{

-    return (pUSART->US_CSR & AT91C_US_RXRDY);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Error

-//* \brief Return the error flag

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_Error (

-	AT91PS_USART pUSART )     // \arg pointer to a USART controller

-{

-    return (pUSART->US_CSR &

-    	(AT91C_US_OVRE |  // Overrun error

-    	 AT91C_US_FRAME | // Framing error

-    	 AT91C_US_PARE));  // Parity error

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_PutChar

-//* \brief Send a character,does not check if ready to send

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_PutChar (

-	AT91PS_USART pUSART,

-	int character )

-{

-    pUSART->US_THR = (character & 0x1FF);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_GetChar

-//* \brief Receive a character,does not check if a character is available

-//*----------------------------------------------------------------------------

-__inline int AT91F_US_GetChar (

-	const AT91PS_USART pUSART)

-{

-    return((pUSART->US_RHR) & 0x1FF);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SendFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_SendFrame(

-	AT91PS_USART pUSART,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_SendFrame(

-		(AT91PS_PDC) &(pUSART->US_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_ReceiveFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_ReceiveFrame (

-	AT91PS_USART pUSART,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_ReceiveFrame(

-		(AT91PS_PDC) &(pUSART->US_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SetIrdaFilter

-//* \brief Set the value of IrDa filter tregister

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_SetIrdaFilter (

-	AT91PS_USART pUSART,

-	unsigned char value

-)

-{

-	pUSART->US_IF = value;

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR UDP

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EnableIt

-//* \brief Enable UDP IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EnableIt (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pUDP->UDP_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_DisableIt

-//* \brief Disable UDP IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_DisableIt (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IDR register

-	pUDP->UDP_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_SetAddress

-//* \brief Set UDP functional address

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_SetAddress (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned char address)   // \arg new UDP address

-{

-	pUDP->UDP_FADDR = (AT91C_UDP_FEN | address);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EnableEp

-//* \brief Enable Endpoint

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EnableEp (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg endpoints to be enabled

-{

-	pUDP->UDP_GLBSTATE  |= flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_DisableEp

-//* \brief Enable Endpoint

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_DisableEp (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg endpoints to be enabled

-{

-	pUDP->UDP_GLBSTATE  &= ~(flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_SetState

-//* \brief Set UDP Device state

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_SetState (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg new UDP address

-{

-	pUDP->UDP_GLBSTATE  &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG);

-	pUDP->UDP_GLBSTATE  |= flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_GetState

-//* \brief return UDP Device state

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state

-	AT91PS_UDP pUDP)     // \arg pointer to a UDP controller

-{

-	return (pUDP->UDP_GLBSTATE  & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_ResetEp

-//* \brief Reset UDP endpoint

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_ResetEp ( // \return the UDP device state

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg Endpoints to be reset

-{

-	pUDP->UDP_RSTEP = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpStall

-//* \brief Endpoint will STALL requests

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpStall(

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned char endpoint)   // \arg endpoint number

-{

-	pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpWrite

-//* \brief Write value in the DPR

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpWrite(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint,  // \arg endpoint number

-	unsigned char value)     // \arg value to be written in the DPR

-{

-	pUDP->UDP_FDR[endpoint] = value;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpRead

-//* \brief Return value from the DPR

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_EpRead(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint)  // \arg endpoint number

-{

-	return pUDP->UDP_FDR[endpoint];

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpEndOfWr

-//* \brief Notify the UDP that values in DPR are ready to be sent

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpEndOfWr(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint)  // \arg endpoint number

-{

-	pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpClear

-//* \brief Clear flag in the endpoint CSR register

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpClear(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint,  // \arg endpoint number

-	unsigned int flag)       // \arg flag to be cleared

-{

-	pUDP->UDP_CSR[endpoint] &= ~(flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpSet

-//* \brief Set flag in the endpoint CSR register

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpSet(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint,  // \arg endpoint number

-	unsigned int flag)       // \arg flag to be cleared

-{

-	pUDP->UDP_CSR[endpoint] |= flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpStatus

-//* \brief Return the endpoint CSR register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_EpStatus(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint)  // \arg endpoint number

-{

-	return pUDP->UDP_CSR[endpoint];

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_GetInterruptMaskStatus

-//* \brief Return UDP Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status

-        AT91PS_UDP pUdp) // \arg  pointer to a UDP controller

-{

-        return pUdp->UDP_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_IsInterruptMasked

-//* \brief Test if UDP Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_UDP_IsInterruptMasked(

-        AT91PS_UDP pUdp,   // \arg  pointer to a UDP controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR AIC

-   ***************************************************************************** */

-#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20]

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_ConfigureIt

-//* \brief Interrupt Handler Initialization

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AIC_ConfigureIt (

-	AT91PS_AIC pAic,  // \arg pointer to the AIC registers

-	unsigned int irq_id,     // \arg interrupt number to initialize

-	unsigned int priority,   // \arg priority to give to the interrupt

-	unsigned int src_type,   // \arg activation and sense of activation

-	void (*newHandler) (void) ) // \arg address of the interrupt handler

-{

-	unsigned int oldHandler;

-    unsigned int mask ;

-

-    oldHandler = pAic->AIC_SVR[irq_id];

-

-    mask = 0x1 << irq_id ;

-    //* Disable the interrupt on the interrupt controller

-    pAic->AIC_IDCR = mask ;

-    //* Save the interrupt handler routine pointer and the interrupt priority

-    pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ;

-    //* Store the Source Mode Register

-    pAic->AIC_SMR[irq_id] = src_type | priority  ;

-    //* Clear the interrupt on the interrupt controller

-    pAic->AIC_ICCR = mask ;

-

-	return oldHandler;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_EnableIt

-//* \brief Enable corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_EnableIt (

-	AT91PS_AIC pAic,      // \arg pointer to the AIC registers

-	unsigned int irq_id ) // \arg interrupt number to initialize

-{

-    //* Enable the interrupt on the interrupt controller

-    pAic->AIC_IECR = 0x1 << irq_id ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_DisableIt

-//* \brief Disable corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_DisableIt (

-	AT91PS_AIC pAic,      // \arg pointer to the AIC registers

-	unsigned int irq_id ) // \arg interrupt number to initialize

-{

-    unsigned int mask = 0x1 << irq_id;

-    //* Disable the interrupt on the interrupt controller

-    pAic->AIC_IDCR = mask ;

-    //* Clear the interrupt on the Interrupt Controller ( if one is pending )

-    pAic->AIC_ICCR = mask ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_ClearIt

-//* \brief Clear corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_ClearIt (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg interrupt number to initialize

-{

-    //* Clear the interrupt on the Interrupt Controller ( if one is pending )

-    pAic->AIC_ICCR = (0x1 << irq_id);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_AcknowledgeIt

-//* \brief Acknowledge corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_AcknowledgeIt (

-	AT91PS_AIC pAic)     // \arg pointer to the AIC registers

-{

-    pAic->AIC_EOICR = pAic->AIC_EOICR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_SetExceptionVector

-//* \brief Configure vector handler

-//*----------------------------------------------------------------------------

-__inline unsigned int  AT91F_AIC_SetExceptionVector (

-	unsigned int *pVector, // \arg pointer to the AIC registers

-	void (*Handler) () )   // \arg Interrupt Handler

-{

-	unsigned int oldVector = *pVector;

-

-	if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE)

-		*pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE;

-	else

-		*pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000;

-

-	return oldVector;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_Trig

-//* \brief Trig an IT

-//*----------------------------------------------------------------------------

-__inline void  AT91F_AIC_Trig (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg interrupt number

-{

-	pAic->AIC_ISCR = (0x1 << irq_id) ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_IsActive

-//* \brief Test if an IT is active

-//*----------------------------------------------------------------------------

-__inline unsigned int  AT91F_AIC_IsActive (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg Interrupt Number

-{

-	return (pAic->AIC_ISR & (0x1 << irq_id));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_IsPending

-//* \brief Test if an IT is pending

-//*----------------------------------------------------------------------------

-__inline unsigned int  AT91F_AIC_IsPending (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg Interrupt Number

-{

-	return (pAic->AIC_IPR & (0x1 << irq_id));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_Open

-//* \brief Set exception vectors and AIC registers to default values

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_Open(

-	AT91PS_AIC pAic,        // \arg pointer to the AIC registers

-	void (*IrqHandler) (),  // \arg Default IRQ vector exception

-	void (*FiqHandler) (),  // \arg Default FIQ vector exception

-	void (*DefaultHandler)  (), // \arg Default Handler set in ISR

-	void (*SpuriousHandler) (), // \arg Default Spurious Handler

-	unsigned int protectMode)   // \arg Debug Control Register

-{

-	int i;

-

-	// Disable all interrupts and set IVR to the default handler

-	for (i = 0; i < 32; ++i) {

-		AT91F_AIC_DisableIt(pAic, i);

-		AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, DefaultHandler);

-	}

-

-	// Set the IRQ exception vector

-	AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler);

-	// Set the Fast Interrupt exception vector

-	AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler);

-

-	pAic->AIC_SPU = (unsigned int) SpuriousHandler;

-	pAic->AIC_DCR = protectMode;

-}

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  MC

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  DBGU

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_CfgPIO

-//* \brief Configure PIO controllers to drive DBGU signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA10_DTXD    ) |

-		((unsigned int) AT91C_PA9_DRXD    ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH3_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH3 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH3_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA14_PWM3    ) |

-		((unsigned int) AT91C_PA7_PWM3    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH2_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH2 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH2_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA2_PWM2    ), // Peripheral A

-		((unsigned int) AT91C_PA25_PWM2    ) |

-		((unsigned int) AT91C_PA13_PWM2    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH1_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA1_PWM1    ), // Peripheral A

-		((unsigned int) AT91C_PA24_PWM1    ) |

-		((unsigned int) AT91C_PA12_PWM1    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH0_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA0_PWM0    ), // Peripheral A

-		((unsigned int) AT91C_PA23_PWM0    ) |

-		((unsigned int) AT91C_PA11_PWM0    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  SSC

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SSC));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_CfgPIO

-//* \brief Configure PIO controllers to drive SSC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA17_TD      ) |

-		((unsigned int) AT91C_PA15_TF      ) |

-		((unsigned int) AT91C_PA19_RK      ) |

-		((unsigned int) AT91C_PA18_RD      ) |

-		((unsigned int) AT91C_PA20_RF      ) |

-		((unsigned int) AT91C_PA16_TK      ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  SPI

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SPI));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgPIO

-//* \brief Configure PIO controllers to drive SPI signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA11_NPCS0   ) |

-		((unsigned int) AT91C_PA13_MOSI    ) |

-		((unsigned int) AT91C_PA31_NPCS1   ) |

-		((unsigned int) AT91C_PA12_MISO    ) |

-		((unsigned int) AT91C_PA14_SPCK    ), // Peripheral A

-		((unsigned int) AT91C_PA9_NPCS1   ) |

-		((unsigned int) AT91C_PA30_NPCS2   ) |

-		((unsigned int) AT91C_PA10_NPCS2   ) |

-		((unsigned int) AT91C_PA22_NPCS3   ) |

-		((unsigned int) AT91C_PA3_NPCS3   ) |

-		((unsigned int) AT91C_PA5_NPCS3   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PWMC

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_PWMC));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC2_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TC2

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC2_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TC2));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC2_CfgPIO

-//* \brief Configure PIO controllers to drive TC2 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC2_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA26_TIOA2   ) |

-		((unsigned int) AT91C_PA27_TIOB2   ) |

-		((unsigned int) AT91C_PA29_TCLK2   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC1_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TC1

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC1_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TC1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC1_CfgPIO

-//* \brief Configure PIO controllers to drive TC1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA15_TIOA1   ) |

-		((unsigned int) AT91C_PA16_TIOB1   ) |

-		((unsigned int) AT91C_PA28_TCLK1   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC0_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TC0

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC0_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TC0));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC0_CfgPIO

-//* \brief Configure PIO controllers to drive TC0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA0_TIOA0   ) |

-		((unsigned int) AT91C_PA1_TIOB0   ) |

-		((unsigned int) AT91C_PA4_TCLK0   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PMC

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgPIO

-//* \brief Configure PIO controllers to drive PMC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA17_PCK1    ) |

-		((unsigned int) AT91C_PA21_PCK1    ) |

-		((unsigned int) AT91C_PA31_PCK2    ) |

-		((unsigned int) AT91C_PA18_PCK2    ) |

-		((unsigned int) AT91C_PA6_PCK0    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  ADC

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_ADC));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgPIO

-//* \brief Configure PIO controllers to drive ADC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA8_ADTRG   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIOA_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PIOA

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIOA_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_PIOA));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TWI

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TWI));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_CfgPIO

-//* \brief Configure PIO controllers to drive TWI signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA3_TWD     ) |

-		((unsigned int) AT91C_PA4_TWCK    ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US1_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  US1

-//*----------------------------------------------------------------------------

-__inline void AT91F_US1_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_US1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US1_CfgPIO

-//* \brief Configure PIO controllers to drive US1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_US1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA21_RXD1    ) |

-		((unsigned int) AT91C_PA27_DTR1    ) |

-		((unsigned int) AT91C_PA26_DCD1    ) |

-		((unsigned int) AT91C_PA22_TXD1    ) |

-		((unsigned int) AT91C_PA24_RTS1    ) |

-		((unsigned int) AT91C_PA23_SCK1    ) |

-		((unsigned int) AT91C_PA28_DSR1    ) |

-		((unsigned int) AT91C_PA29_RI1     ) |

-		((unsigned int) AT91C_PA25_CTS1    ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US0_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  US0

-//*----------------------------------------------------------------------------

-__inline void AT91F_US0_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_US0));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US0_CfgPIO

-//* \brief Configure PIO controllers to drive US0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_US0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA5_RXD0    ) |

-		((unsigned int) AT91C_PA6_TXD0    ) |

-		((unsigned int) AT91C_PA7_RTS0    ) |

-		((unsigned int) AT91C_PA8_CTS0    ), // Peripheral A

-		((unsigned int) AT91C_PA2_SCK0    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  UDP

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_UDP));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  AIC

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_IRQ0) |

-		((unsigned int) 1 << AT91C_ID_FIQ) |

-		((unsigned int) 1 << AT91C_ID_IRQ1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_CfgPIO

-//* \brief Configure PIO controllers to drive AIC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA30_IRQ1    ), // Peripheral A

-		((unsigned int) AT91C_PA20_IRQ0    ) |

-		((unsigned int) AT91C_PA19_FIQ     )); // Peripheral B

-}

-

-#endif // lib_AT91SAM7S64_H

+//*----------------------------------------------------------------------------
+//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
+//*----------------------------------------------------------------------------
+//* The software is delivered "AS IS" without warranty or condition of any
+//* kind, either express, implied or statutory. This includes without
+//* limitation any warranty or condition with respect to merchantability or
+//* fitness for any particular purpose, or against the infringements of
+//* intellectual property rights of others.
+//*----------------------------------------------------------------------------
+//* File Name           : lib_AT91SAM7S64.h
+//* Object              : AT91SAM7S64 inlined functions
+//* Generated           : AT91 SW Application Group  07/16/2004 (07:43:09)
+//*
+//* CVS Reference       : /lib_MC_SAM.h/1.3/Thu Mar 25 15:19:14 2004//
+//* CVS Reference       : /lib_pdc_1363d.h/1.2/Wed Feb 19 09:25:22 2003//
+//* CVS Reference       : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003//
+//* CVS Reference       : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003//
+//* CVS Reference       : /lib_spi2.h/1.1/Mon Aug 25 13:23:52 2003//
+//* CVS Reference       : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004//
+//* CVS Reference       : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003//
+//* CVS Reference       : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004//
+//* CVS Reference       : /lib_adc.h/1.6/Fri Oct 17 08:12:38 2003//
+//* CVS Reference       : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003//
+//* CVS Reference       : /lib_twi.h/1.2/Fri Jan 31 12:19:38 2003//
+//* CVS Reference       : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002//
+//* CVS Reference       : /lib_udp.h/1.3/Fri Jan 31 12:19:48 2003//
+//* CVS Reference       : /lib_aic.h/1.3/Fri Jul 12 07:46:12 2002//
+//*----------------------------------------------------------------------------
+
+#ifndef lib_AT91SAM7S64_H
+#define lib_AT91SAM7S64_H
+
+/* *****************************************************************************
+                SOFTWARE API FOR MC
+   ***************************************************************************** */
+
+#define AT91C_MC_CORRECT_KEY  ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_MC_Remap
+//* \brief Make Remap
+//*----------------------------------------------------------------------------
+__inline void AT91F_MC_Remap (void)     //
+{
+    AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC;
+
+    pMC->MC_RCR = AT91C_MC_RCB;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_MC_EFC_CfgModeReg
+//* \brief Configure the EFC Mode Register of the MC controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_MC_EFC_CfgModeReg (
+    AT91PS_MC pMC, // pointer to a MC controller
+    unsigned int mode)        // mode register
+{
+    // Write to the FMR register
+    pMC->MC_FMR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_MC_EFC_GetModeReg
+//* \brief Return MC EFC Mode Regsiter
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_MC_EFC_GetModeReg(
+    AT91PS_MC pMC) // pointer to a MC controller
+{
+    return pMC->MC_FMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_MC_EFC_ComputeFMCN
+//* \brief Return MC EFC Mode Regsiter
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_MC_EFC_ComputeFMCN(
+    int master_clock) // master clock in Hz
+{
+    return (master_clock/1000000 +2);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_MC_EFC_PerformCmd
+//* \brief Perform EFC Command
+//*----------------------------------------------------------------------------
+__inline void AT91F_MC_EFC_PerformCmd (
+    AT91PS_MC pMC, // pointer to a MC controller
+    unsigned int transfer_cmd)
+{
+    pMC->MC_FCR = transfer_cmd;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_MC_EFC_GetStatus
+//* \brief Return MC EFC Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_MC_EFC_GetStatus(
+    AT91PS_MC pMC) // pointer to a MC controller
+{
+    return pMC->MC_FSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_MC_EFC_IsInterruptMasked
+//* \brief Test if EFC MC Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_MC_EFC_IsInterruptMasked(
+        AT91PS_MC pMC,   // \arg  pointer to a MC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_MC_EFC_GetModeReg(pMC) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_MC_EFC_IsInterruptSet
+//* \brief Test if EFC MC Interrupt is Set
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_MC_EFC_IsInterruptSet(
+        AT91PS_MC pMC,   // \arg  pointer to a MC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_MC_EFC_GetStatus(pMC) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR PDC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetNextRx
+//* \brief Set the next receive transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetNextRx (
+    AT91PS_PDC pPDC,     // \arg pointer to a PDC controller
+    char *address,       // \arg address to the next bloc to be received
+    unsigned int bytes)  // \arg number of bytes to be received
+{
+    pPDC->PDC_RNPR = (unsigned int) address;
+    pPDC->PDC_RNCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetNextTx
+//* \brief Set the next transmit transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetNextTx (
+    AT91PS_PDC pPDC,       // \arg pointer to a PDC controller
+    char *address,         // \arg address to the next bloc to be transmitted
+    unsigned int bytes)    // \arg number of bytes to be transmitted
+{
+    pPDC->PDC_TNPR = (unsigned int) address;
+    pPDC->PDC_TNCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetRx
+//* \brief Set the receive transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetRx (
+    AT91PS_PDC pPDC,       // \arg pointer to a PDC controller
+    char *address,         // \arg address to the next bloc to be received
+    unsigned int bytes)    // \arg number of bytes to be received
+{
+    pPDC->PDC_RPR = (unsigned int) address;
+    pPDC->PDC_RCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetTx
+//* \brief Set the transmit transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetTx (
+    AT91PS_PDC pPDC,       // \arg pointer to a PDC controller
+    char *address,         // \arg address to the next bloc to be transmitted
+    unsigned int bytes)    // \arg number of bytes to be transmitted
+{
+    pPDC->PDC_TPR = (unsigned int) address;
+    pPDC->PDC_TCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_EnableTx
+//* \brief Enable transmit
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_EnableTx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_TXTEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_EnableRx
+//* \brief Enable receive
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_EnableRx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_RXTEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_DisableTx
+//* \brief Disable transmit
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_DisableTx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_TXTDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_DisableRx
+//* \brief Disable receive
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_DisableRx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_RXTDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsTxEmpty
+//* \brief Test if the current transfer descriptor has been sent
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_TCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsNextTxEmpty
+//* \brief Test if the next transfer descriptor has been moved to the current td
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_TNCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsRxEmpty
+//* \brief Test if the current transfer descriptor has been filled
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_RCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsNextRxEmpty
+//* \brief Test if the next transfer descriptor has been moved to the current td
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_RNCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_Open
+//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_Open (
+    AT91PS_PDC pPDC)       // \arg pointer to a PDC controller
+{
+    //* Disable the RX and TX PDC transfer requests
+    AT91F_PDC_DisableRx(pPDC);
+    AT91F_PDC_DisableTx(pPDC);
+
+    //* Reset all Counter register Next buffer first
+    AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetRx(pPDC, (char *) 0, 0);
+
+    //* Enable the RX and TX PDC transfer requests
+    AT91F_PDC_EnableRx(pPDC);
+    AT91F_PDC_EnableTx(pPDC);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_Close
+//* \brief Close PDC: disable TX and RX reset transfer descriptors
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_Close (
+    AT91PS_PDC pPDC)       // \arg pointer to a PDC controller
+{
+    //* Disable the RX and TX PDC transfer requests
+    AT91F_PDC_DisableRx(pPDC);
+    AT91F_PDC_DisableTx(pPDC);
+
+    //* Reset all Counter register Next buffer first
+    AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetRx(pPDC, (char *) 0, 0);
+
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SendFrame
+//* \brief Close PDC: disable TX and RX reset transfer descriptors
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PDC_SendFrame(
+    AT91PS_PDC pPDC,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    if (AT91F_PDC_IsTxEmpty(pPDC)) {
+        //* Buffer and next buffer can be initialized
+        AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer);
+        AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer);
+        return 2;
+    }
+    else if (AT91F_PDC_IsNextTxEmpty(pPDC)) {
+        //* Only one buffer can be initialized
+        AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer);
+        return 1;
+    }
+    else {
+        //* All buffer are in use...
+        return 0;
+    }
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_ReceiveFrame
+//* \brief Close PDC: disable TX and RX reset transfer descriptors
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PDC_ReceiveFrame (
+    AT91PS_PDC pPDC,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    if (AT91F_PDC_IsRxEmpty(pPDC)) {
+        //* Buffer and next buffer can be initialized
+        AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer);
+        AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer);
+        return 2;
+    }
+    else if (AT91F_PDC_IsNextRxEmpty(pPDC)) {
+        //* Only one buffer can be initialized
+        AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer);
+        return 1;
+    }
+    else {
+        //* All buffer are in use...
+        return 0;
+    }
+}
+/* *****************************************************************************
+                SOFTWARE API FOR DBGU
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_InterruptEnable
+//* \brief Enable DBGU Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_DBGU_InterruptEnable(
+        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller
+        unsigned int flag) // \arg  dbgu interrupt to be enabled
+{
+        pDbgu->DBGU_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_InterruptDisable
+//* \brief Disable DBGU Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_DBGU_InterruptDisable(
+        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller
+        unsigned int flag) // \arg  dbgu interrupt to be disabled
+{
+        pDbgu->DBGU_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_GetInterruptMaskStatus
+//* \brief Return DBGU Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status
+        AT91PS_DBGU pDbgu) // \arg  pointer to a DBGU controller
+{
+        return pDbgu->DBGU_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_IsInterruptMasked
+//* \brief Test if DBGU Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_DBGU_IsInterruptMasked(
+        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR SSC
+   ***************************************************************************** */
+//* Define the standard I2S mode configuration
+
+//* Configuration to set in the SSC Transmit Clock Mode Register
+//* Parameters :  nb_bit_by_slot : 8, 16 or 32 bits
+//*               nb_slot_by_frame : number of channels
+#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\
+                                       AT91C_SSC_CKS_DIV   +\
+                                       AT91C_SSC_CKO_CONTINOUS      +\
+                                       AT91C_SSC_CKG_NONE    +\
+                                       AT91C_SSC_START_FALL_RF +\
+                                       AT91C_SSC_STTOUT  +\
+                                       ((1<<16) & AT91C_SSC_STTDLY) +\
+                                       ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24))
+
+
+//* Configuration to set in the SSC Transmit Frame Mode Register
+//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits
+//*              nb_slot_by_frame : number of channels
+#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\
+                                    (nb_bit_by_slot-1)  +\
+                                    AT91C_SSC_MSBF   +\
+                                    (((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB)  +\
+                                    (((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\
+                                    AT91C_SSC_FSOS_NEGATIVE)
+
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_SetBaudrate
+//* \brief Set the baudrate according to the CPU clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_SSC_SetBaudrate (
+        AT91PS_SSC pSSC,        // \arg pointer to a SSC controller
+        unsigned int mainClock, // \arg peripheral clock
+        unsigned int speed)     // \arg SSC baudrate
+{
+        unsigned int baud_value;
+        //* Define the baud rate divisor register
+        if (speed == 0)
+           baud_value = 0;
+        else
+        {
+           baud_value = (unsigned int) (mainClock * 10)/(2*speed);
+           if ((baud_value % 10) >= 5)
+                  baud_value = (baud_value / 10) + 1;
+           else
+                  baud_value /= 10;
+        }
+
+        pSSC->SSC_CMR = baud_value;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_Configure
+//* \brief Configure SSC
+//*----------------------------------------------------------------------------
+__inline void AT91F_SSC_Configure (
+             AT91PS_SSC pSSC,          // \arg pointer to a SSC controller
+             unsigned int syst_clock,  // \arg System Clock Frequency
+             unsigned int baud_rate,   // \arg Expected Baud Rate Frequency
+             unsigned int clock_rx,    // \arg Receiver Clock Parameters
+             unsigned int mode_rx,     // \arg mode Register to be programmed
+             unsigned int clock_tx,    // \arg Transmitter Clock Parameters
+             unsigned int mode_tx)     // \arg mode Register to be programmed
+{
+    //* Disable interrupts
+    pSSC->SSC_IDR = (unsigned int) -1;
+
+    //* Reset receiver and transmitter
+    pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ;
+
+    //* Define the Clock Mode Register
+    AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate);
+
+     //* Write the Receive Clock Mode Register
+    pSSC->SSC_RCMR =  clock_rx;
+
+     //* Write the Transmit Clock Mode Register
+    pSSC->SSC_TCMR =  clock_tx;
+
+     //* Write the Receive Frame Mode Register
+    pSSC->SSC_RFMR =  mode_rx;
+
+     //* Write the Transmit Frame Mode Register
+    pSSC->SSC_TFMR =  mode_tx;
+
+    //* Clear Transmit and Receive Counters
+    AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR));
+
+
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_EnableRx
+//* \brief Enable receiving datas
+//*----------------------------------------------------------------------------
+__inline void AT91F_SSC_EnableRx (
+    AT91PS_SSC pSSC)     // \arg pointer to a SSC controller
+{
+    //* Enable receiver
+    pSSC->SSC_CR = AT91C_SSC_RXEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_DisableRx
+//* \brief Disable receiving datas
+//*----------------------------------------------------------------------------
+__inline void AT91F_SSC_DisableRx (
+    AT91PS_SSC pSSC)     // \arg pointer to a SSC controller
+{
+    //* Disable receiver
+    pSSC->SSC_CR = AT91C_SSC_RXDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_EnableTx
+//* \brief Enable sending datas
+//*----------------------------------------------------------------------------
+__inline void AT91F_SSC_EnableTx (
+    AT91PS_SSC pSSC)     // \arg pointer to a SSC controller
+{
+    //* Enable  transmitter
+    pSSC->SSC_CR = AT91C_SSC_TXEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_DisableTx
+//* \brief Disable sending datas
+//*----------------------------------------------------------------------------
+__inline void AT91F_SSC_DisableTx (
+    AT91PS_SSC pSSC)     // \arg pointer to a SSC controller
+{
+    //* Disable  transmitter
+    pSSC->SSC_CR = AT91C_SSC_TXDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_EnableIt
+//* \brief Enable SSC IT
+//*----------------------------------------------------------------------------
+__inline void AT91F_SSC_EnableIt (
+    AT91PS_SSC pSSC, // \arg pointer to a SSC controller
+    unsigned int flag)   // \arg IT to be enabled
+{
+    //* Write to the IER register
+    pSSC->SSC_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_DisableIt
+//* \brief Disable SSC IT
+//*----------------------------------------------------------------------------
+__inline void AT91F_SSC_DisableIt (
+    AT91PS_SSC pSSC, // \arg pointer to a SSC controller
+    unsigned int flag)   // \arg IT to be disabled
+{
+    //* Write to the IDR register
+    pSSC->SSC_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_ReceiveFrame
+//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_SSC_ReceiveFrame (
+    AT91PS_SSC pSSC,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    return AT91F_PDC_ReceiveFrame(
+        (AT91PS_PDC) &(pSSC->SSC_RPR),
+        pBuffer,
+        szBuffer,
+        pNextBuffer,
+        szNextBuffer);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_SendFrame
+//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_SSC_SendFrame(
+    AT91PS_SSC pSSC,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    return AT91F_PDC_SendFrame(
+        (AT91PS_PDC) &(pSSC->SSC_RPR),
+        pBuffer,
+        szBuffer,
+        pNextBuffer,
+        szNextBuffer);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_GetInterruptMaskStatus
+//* \brief Return SSC Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status
+        AT91PS_SSC pSsc) // \arg  pointer to a SSC controller
+{
+        return pSsc->SSC_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_IsInterruptMasked
+//* \brief Test if SSC Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_SSC_IsInterruptMasked(
+        AT91PS_SSC pSsc,   // \arg  pointer to a SSC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR SPI
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_Open
+//* \brief Open a SPI Port
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_SPI_Open (
+        const unsigned int null)  // \arg
+{
+        /* NOT DEFINED AT THIS MOMENT */
+        return ( 0 );
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_CfgCs
+//* \brief Configure SPI chip select register
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_CfgCs (
+    AT91PS_SPI pSPI,     // pointer to a SPI controller
+    int cs,     // SPI cs number (0 to 3)
+    int val)   //  chip select register
+{
+    //* Write to the CSR register
+    *(pSPI->SPI_CSR + cs) = val;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_EnableIt
+//* \brief Enable SPI interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_EnableIt (
+    AT91PS_SPI pSPI,     // pointer to a SPI controller
+    unsigned int flag)   // IT to be enabled
+{
+    //* Write to the IER register
+    pSPI->SPI_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_DisableIt
+//* \brief Disable SPI interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_DisableIt (
+    AT91PS_SPI pSPI, // pointer to a SPI controller
+    unsigned int flag) // IT to be disabled
+{
+    //* Write to the IDR register
+    pSPI->SPI_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_Reset
+//* \brief Reset the SPI controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_Reset (
+    AT91PS_SPI pSPI // pointer to a SPI controller
+    )
+{
+    //* Write to the CR register
+    pSPI->SPI_CR = AT91C_SPI_SWRST;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_Enable
+//* \brief Enable the SPI controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_Enable (
+    AT91PS_SPI pSPI // pointer to a SPI controller
+    )
+{
+    //* Write to the CR register
+    pSPI->SPI_CR = AT91C_SPI_SPIEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_Disable
+//* \brief Disable the SPI controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_Disable (
+    AT91PS_SPI pSPI // pointer to a SPI controller
+    )
+{
+    //* Write to the CR register
+    pSPI->SPI_CR = AT91C_SPI_SPIDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_CfgMode
+//* \brief Enable the SPI controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_CfgMode (
+    AT91PS_SPI pSPI, // pointer to a SPI controller
+    int mode)        // mode register
+{
+    //* Write to the MR register
+    pSPI->SPI_MR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_CfgPCS
+//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_CfgPCS (
+    AT91PS_SPI pSPI, // pointer to a SPI controller
+    char PCS_Device) // PCS of the Device
+{
+    //* Write to the MR register
+    pSPI->SPI_MR &= 0xFFF0FFFF;
+    pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS );
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_ReceiveFrame
+//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_SPI_ReceiveFrame (
+    AT91PS_SPI pSPI,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    return AT91F_PDC_ReceiveFrame(
+        (AT91PS_PDC) &(pSPI->SPI_RPR),
+        pBuffer,
+        szBuffer,
+        pNextBuffer,
+        szNextBuffer);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_SendFrame
+//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_SPI_SendFrame(
+    AT91PS_SPI pSPI,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    return AT91F_PDC_SendFrame(
+        (AT91PS_PDC) &(pSPI->SPI_RPR),
+        pBuffer,
+        szBuffer,
+        pNextBuffer,
+        szNextBuffer);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_Close
+//* \brief Close SPI: disable IT disable transfert, close PDC
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_Close (
+    AT91PS_SPI pSPI)     // \arg pointer to a SPI controller
+{
+    //* Reset all the Chip Select register
+    pSPI->SPI_CSR[0] = 0 ;
+    pSPI->SPI_CSR[1] = 0 ;
+    pSPI->SPI_CSR[2] = 0 ;
+    pSPI->SPI_CSR[3] = 0 ;
+
+    //* Reset the SPI mode
+    pSPI->SPI_MR = 0  ;
+
+    //* Disable all interrupts
+    pSPI->SPI_IDR = 0xFFFFFFFF ;
+
+    //* Abort the Peripheral Data Transfers
+    AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR));
+
+    //* Disable receiver and transmitter and stop any activity immediately
+    pSPI->SPI_CR = AT91C_SPI_SPIDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_PutChar
+//* \brief Send a character,does not check if ready to send
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_PutChar (
+    AT91PS_SPI pSPI,
+    unsigned int character,
+             unsigned int cs_number )
+{
+    unsigned int value_for_cs;
+    value_for_cs = (~(1 << cs_number)) & 0xF;  //Place a zero among a 4 ONEs number
+    pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_GetChar
+//* \brief Receive a character,does not check if a character is available
+//*----------------------------------------------------------------------------
+__inline int AT91F_SPI_GetChar (
+    const AT91PS_SPI pSPI)
+{
+    return((pSPI->SPI_RDR) & 0xFFFF);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_GetInterruptMaskStatus
+//* \brief Return SPI Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status
+        AT91PS_SPI pSpi) // \arg  pointer to a SPI controller
+{
+        return pSpi->SPI_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_IsInterruptMasked
+//* \brief Test if SPI Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_SPI_IsInterruptMasked(
+        AT91PS_SPI pSpi,   // \arg  pointer to a SPI controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR PWMC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWM_GetStatus
+//* \brief Return PWM Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status
+    AT91PS_PWMC pPWM) // pointer to a PWM controller
+{
+    return pPWM->PWMC_SR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWM_InterruptEnable
+//* \brief Enable PWM Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_InterruptEnable(
+        AT91PS_PWMC pPwm,   // \arg  pointer to a PWM controller
+        unsigned int flag) // \arg  PWM interrupt to be enabled
+{
+        pPwm->PWMC_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWM_InterruptDisable
+//* \brief Disable PWM Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_InterruptDisable(
+        AT91PS_PWMC pPwm,   // \arg  pointer to a PWM controller
+        unsigned int flag) // \arg  PWM interrupt to be disabled
+{
+        pPwm->PWMC_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWM_GetInterruptMaskStatus
+//* \brief Return PWM Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status
+        AT91PS_PWMC pPwm) // \arg  pointer to a PWM controller
+{
+        return pPwm->PWMC_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWM_IsInterruptMasked
+//* \brief Test if PWM Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PWMC_IsInterruptMasked(
+        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWM_IsStatusSet
+//* \brief Test if PWM Interrupt is Set
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PWMC_IsStatusSet(
+        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PWMC_GetStatus(pPWM) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWM_CfgChannel
+//* \brief Test if PWM Interrupt is Set
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_CfgChannel(
+        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller
+        unsigned int channelId, // \arg PWM channel ID
+        unsigned int mode, // \arg  PWM mode
+        unsigned int period, // \arg PWM period
+        unsigned int duty) // \arg PWM duty cycle
+{
+    pPWM->PWMC_CH[channelId].PWMC_CMR = mode;
+    pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty;
+    pPWM->PWMC_CH[channelId].PWMC_CPRDR = period;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWM_StartChannel
+//* \brief Enable channel
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_StartChannel(
+        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller
+        unsigned int flag) // \arg  Channels IDs to be enabled
+{
+    pPWM->PWMC_ENA = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWM_StopChannel
+//* \brief Disable channel
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_StopChannel(
+        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller
+        unsigned int flag) // \arg  Channels IDs to be enabled
+{
+    pPWM->PWMC_DIS = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWM_UpdateChannel
+//* \brief Update Period or Duty Cycle
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_UpdateChannel(
+        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller
+        unsigned int channelId, // \arg PWM channel ID
+        unsigned int update) // \arg  Channels IDs to be enabled
+{
+    pPWM->PWMC_CH[channelId].PWMC_CUPDR = update;
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR TC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TC_InterruptEnable
+//* \brief Enable TC Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_TC_InterruptEnable(
+        AT91PS_TC pTc,   // \arg  pointer to a TC controller
+        unsigned int flag) // \arg  TC interrupt to be enabled
+{
+        pTc->TC_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TC_InterruptDisable
+//* \brief Disable TC Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_TC_InterruptDisable(
+        AT91PS_TC pTc,   // \arg  pointer to a TC controller
+        unsigned int flag) // \arg  TC interrupt to be disabled
+{
+        pTc->TC_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TC_GetInterruptMaskStatus
+//* \brief Return TC Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status
+        AT91PS_TC pTc) // \arg  pointer to a TC controller
+{
+        return pTc->TC_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TC_IsInterruptMasked
+//* \brief Test if TC Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_TC_IsInterruptMasked(
+        AT91PS_TC pTc,   // \arg  pointer to a TC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR PMC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgSysClkEnableReg
+//* \brief Configure the System Clock Enable Register of the PMC controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgSysClkEnableReg (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int mode)
+{
+    //* Write to the SCER register
+    pPMC->PMC_SCER = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgSysClkDisableReg
+//* \brief Configure the System Clock Disable Register of the PMC controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgSysClkDisableReg (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int mode)
+{
+    //* Write to the SCDR register
+    pPMC->PMC_SCDR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetSysClkStatusReg
+//* \brief Return the System Clock Status Register of the PMC controller
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetSysClkStatusReg (
+    AT91PS_PMC pPMC // pointer to a CAN controller
+    )
+{
+    return pPMC->PMC_SCSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_EnablePeriphClock
+//* \brief Enable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_EnablePeriphClock (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int periphIds)  // \arg IDs of peripherals to enable
+{
+    pPMC->PMC_PCER = periphIds;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_DisablePeriphClock
+//* \brief Disable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_DisablePeriphClock (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int periphIds)  // \arg IDs of peripherals to enable
+{
+    pPMC->PMC_PCDR = periphIds;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetPeriphClock
+//* \brief Get peripheral clock status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetPeriphClock (
+    AT91PS_PMC pPMC) // \arg pointer to PMC controller
+{
+    return pPMC->PMC_PCSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_CfgMainOscillatorReg
+//* \brief Cfg the main oscillator
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_CfgMainOscillatorReg (
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int mode)
+{
+    pCKGR->CKGR_MOR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_GetMainOscillatorReg
+//* \brief Cfg the main oscillator
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_CKGR_GetMainOscillatorReg (
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    return pCKGR->CKGR_MOR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_EnableMainOscillator
+//* \brief Enable the main oscillator
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_EnableMainOscillator(
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_DisableMainOscillator
+//* \brief Disable the main oscillator
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_DisableMainOscillator (
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_CfgMainOscStartUpTime
+//* \brief Cfg MOR Register according to the main osc startup time
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_CfgMainOscStartUpTime (
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int startup_time,  // \arg main osc startup time in microsecond (us)
+    unsigned int slowClock)  // \arg slowClock in Hz
+{
+    pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT;
+    pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_GetMainClockFreqReg
+//* \brief Cfg the main oscillator
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_CKGR_GetMainClockFreqReg (
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    return pCKGR->CKGR_MCFR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_GetMainClock
+//* \brief Return Main clock in Hz
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_CKGR_GetMainClock (
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int slowClock)  // \arg slowClock in Hz
+{
+    return ((pCKGR->CKGR_MCFR  & AT91C_CKGR_MAINF) * slowClock) >> 4;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgMCKReg
+//* \brief Cfg Master Clock Register
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgMCKReg (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int mode)
+{
+    pPMC->PMC_MCKR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetMCKReg
+//* \brief Return Master Clock Register
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetMCKReg(
+    AT91PS_PMC pPMC) // \arg pointer to PMC controller
+{
+    return pPMC->PMC_MCKR;
+}
+
+//*------------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetMasterClock
+//* \brief Return master clock in Hz which correponds to processor clock for ARM7
+//*------------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetMasterClock (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int slowClock)  // \arg slowClock in Hz
+{
+    unsigned int reg = pPMC->PMC_MCKR;
+    unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2));
+    unsigned int pllDivider, pllMultiplier;
+
+    switch (reg & AT91C_PMC_CSS) {
+        case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected
+            return slowClock / prescaler;
+        case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected
+            return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler;
+        case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected
+            reg = pCKGR->CKGR_PLLR;
+            pllDivider    = (reg  & AT91C_CKGR_DIV);
+            pllMultiplier = ((reg  & AT91C_CKGR_MUL) >> 16) + 1;
+            return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler;
+    }
+    return 0;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_EnablePCK
+//* \brief Enable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_EnablePCK (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int pck,  // \arg Peripheral clock identifier 0 .. 7
+    unsigned int mode)
+{
+    pPMC->PMC_PCKR[pck] = mode;
+    pPMC->PMC_SCER = (1 << pck) << 8;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_DisablePCK
+//* \brief Enable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_DisablePCK (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int pck)  // \arg Peripheral clock identifier 0 .. 7
+{
+    pPMC->PMC_SCDR = (1 << pck) << 8;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_EnableIt
+//* \brief Enable PMC interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_EnableIt (
+    AT91PS_PMC pPMC,     // pointer to a PMC controller
+    unsigned int flag)   // IT to be enabled
+{
+    //* Write to the IER register
+    pPMC->PMC_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_DisableIt
+//* \brief Disable PMC interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_DisableIt (
+    AT91PS_PMC pPMC, // pointer to a PMC controller
+    unsigned int flag) // IT to be disabled
+{
+    //* Write to the IDR register
+    pPMC->PMC_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetStatus
+//* \brief Return PMC Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status
+    AT91PS_PMC pPMC) // pointer to a PMC controller
+{
+    return pPMC->PMC_SR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetInterruptMaskStatus
+//* \brief Return PMC Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status
+    AT91PS_PMC pPMC) // pointer to a PMC controller
+{
+    return pPMC->PMC_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_IsInterruptMasked
+//* \brief Test if PMC Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_IsInterruptMasked(
+        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_IsStatusSet
+//* \brief Test if PMC Status is Set
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_IsStatusSet(
+        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PMC_GetStatus(pPMC) & flag);
+}/* *****************************************************************************
+                SOFTWARE API FOR ADC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_EnableIt
+//* \brief Enable ADC interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_ADC_EnableIt (
+    AT91PS_ADC pADC,     // pointer to a ADC controller
+    unsigned int flag)   // IT to be enabled
+{
+    //* Write to the IER register
+    pADC->ADC_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_DisableIt
+//* \brief Disable ADC interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_ADC_DisableIt (
+    AT91PS_ADC pADC, // pointer to a ADC controller
+    unsigned int flag) // IT to be disabled
+{
+    //* Write to the IDR register
+    pADC->ADC_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetStatus
+//* \brief Return ADC Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status
+    AT91PS_ADC pADC) // pointer to a ADC controller
+{
+    return pADC->ADC_SR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetInterruptMaskStatus
+//* \brief Return ADC Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status
+    AT91PS_ADC pADC) // pointer to a ADC controller
+{
+    return pADC->ADC_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_IsInterruptMasked
+//* \brief Test if ADC Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_IsInterruptMasked(
+        AT91PS_ADC pADC,   // \arg  pointer to a ADC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_IsStatusSet
+//* \brief Test if ADC Status is Set
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_IsStatusSet(
+        AT91PS_ADC pADC,   // \arg  pointer to a ADC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_ADC_GetStatus(pADC) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_CfgModeReg
+//* \brief Configure the Mode Register of the ADC controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_ADC_CfgModeReg (
+    AT91PS_ADC pADC, // pointer to a ADC controller
+    unsigned int mode)        // mode register
+{
+    //* Write to the MR register
+    pADC->ADC_MR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetModeReg
+//* \brief Return the Mode Register of the ADC controller value
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetModeReg (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_MR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_CfgTimings
+//* \brief Configure the different necessary timings of the ADC controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_ADC_CfgTimings (
+    AT91PS_ADC pADC, // pointer to a ADC controller
+    unsigned int mck_clock, // in MHz
+    unsigned int adc_clock, // in MHz
+    unsigned int startup_time, // in us
+    unsigned int sample_and_hold_time)  // in ns
+{
+    unsigned int prescal,startup,shtim;
+
+    prescal = mck_clock/(2*adc_clock) - 1;
+    startup = adc_clock*startup_time/8 - 1;
+    shtim = adc_clock*sample_and_hold_time/1000 - 1;
+
+    //* Write to the MR register
+    pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_EnableChannel
+//* \brief Return ADC Timer Register Value
+//*----------------------------------------------------------------------------
+__inline void AT91F_ADC_EnableChannel (
+    AT91PS_ADC pADC, // pointer to a ADC controller
+    unsigned int channel)        // mode register
+{
+    //* Write to the CHER register
+    pADC->ADC_CHER = channel;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_DisableChannel
+//* \brief Return ADC Timer Register Value
+//*----------------------------------------------------------------------------
+__inline void AT91F_ADC_DisableChannel (
+    AT91PS_ADC pADC, // pointer to a ADC controller
+    unsigned int channel)        // mode register
+{
+    //* Write to the CHDR register
+    pADC->ADC_CHDR = channel;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetChannelStatus
+//* \brief Return ADC Timer Register Value
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetChannelStatus (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_CHSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_StartConversion
+//* \brief Software request for a analog to digital conversion
+//*----------------------------------------------------------------------------
+__inline void AT91F_ADC_StartConversion (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    pADC->ADC_CR = AT91C_ADC_START;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_SoftReset
+//* \brief Software reset
+//*----------------------------------------------------------------------------
+__inline void AT91F_ADC_SoftReset (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    pADC->ADC_CR = AT91C_ADC_SWRST;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetLastConvertedData
+//* \brief Return the Last Converted Data
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetLastConvertedData (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_LCDR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetConvertedDataCH0
+//* \brief Return the Channel 0 Converted Data
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetConvertedDataCH0 (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_CDR0;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetConvertedDataCH1
+//* \brief Return the Channel 1 Converted Data
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetConvertedDataCH1 (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_CDR1;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetConvertedDataCH2
+//* \brief Return the Channel 2 Converted Data
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetConvertedDataCH2 (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_CDR2;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetConvertedDataCH3
+//* \brief Return the Channel 3 Converted Data
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetConvertedDataCH3 (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_CDR3;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetConvertedDataCH4
+//* \brief Return the Channel 4 Converted Data
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetConvertedDataCH4 (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_CDR4;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetConvertedDataCH5
+//* \brief Return the Channel 5 Converted Data
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetConvertedDataCH5 (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_CDR5;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetConvertedDataCH6
+//* \brief Return the Channel 6 Converted Data
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetConvertedDataCH6 (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_CDR6;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_GetConvertedDataCH7
+//* \brief Return the Channel 7 Converted Data
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_ADC_GetConvertedDataCH7 (
+    AT91PS_ADC pADC // pointer to a ADC controller
+    )
+{
+    return pADC->ADC_CDR7;
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR PIO
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgPeriph
+//* \brief Enable pins to be drived by peripheral
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgPeriph(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int periphAEnable,  // \arg PERIPH A to enable
+    unsigned int periphBEnable)  // \arg PERIPH B to enable
+
+{
+    pPio->PIO_ASR = periphAEnable;
+    pPio->PIO_BSR = periphBEnable;
+    pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgOutput
+//* \brief Enable PIO in output mode
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgOutput(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int pioEnable)      // \arg PIO to be enabled
+{
+    pPio->PIO_PER = pioEnable; // Set in PIO mode
+    pPio->PIO_OER = pioEnable; // Configure in Output
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgInput
+//* \brief Enable PIO in input mode
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgInput(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int inputEnable)      // \arg PIO to be enabled
+{
+    // Disable output
+    pPio->PIO_ODR  = inputEnable;
+    pPio->PIO_PER  = inputEnable;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgOpendrain
+//* \brief Configure PIO in open drain
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgOpendrain(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int multiDrvEnable) // \arg pio to be configured in open drain
+{
+    // Configure the multi-drive option
+    pPio->PIO_MDDR = ~multiDrvEnable;
+    pPio->PIO_MDER = multiDrvEnable;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgPullup
+//* \brief Enable pullup on PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgPullup(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int pullupEnable)   // \arg enable pullup on PIO
+{
+        // Connect or not Pullup
+    pPio->PIO_PPUDR = ~pullupEnable;
+    pPio->PIO_PPUER = pullupEnable;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgDirectDrive
+//* \brief Enable direct drive on PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgDirectDrive(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int directDrive)    // \arg PIO to be configured with direct drive
+
+{
+    // Configure the Direct Drive
+    pPio->PIO_OWDR  = ~directDrive;
+    pPio->PIO_OWER  = directDrive;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgInputFilter
+//* \brief Enable input filter on input PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgInputFilter(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int inputFilter)    // \arg PIO to be configured with input filter
+
+{
+    // Configure the Direct Drive
+    pPio->PIO_IFDR  = ~inputFilter;
+    pPio->PIO_IFER  = inputFilter;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInput
+//* \brief Return PIO input value
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInput( // \return PIO input
+    AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+    return pPio->PIO_PDSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInputSet
+//* \brief Test if PIO is input flag is active
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInputSet(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PIO_GetInput(pPio) & flag);
+}
+
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_SetOutput
+//* \brief Set to 1 output PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_SetOutput(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  output to be set
+{
+    pPio->PIO_SODR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_ClearOutput
+//* \brief Set to 0 output PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_ClearOutput(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  output to be cleared
+{
+    pPio->PIO_CODR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_ForceOutput
+//* \brief Force output when Direct drive option is enabled
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_ForceOutput(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  output to be forced
+{
+    pPio->PIO_ODSR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_Enable
+//* \brief Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_Enable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be enabled
+{
+        pPio->PIO_PER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_Disable
+//* \brief Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_Disable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be disabled
+{
+        pPio->PIO_PDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetStatus
+//* \brief Return PIO Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_PSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsSet
+//* \brief Test if PIO is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputEnable
+//* \brief Output Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output to be enabled
+{
+        pPio->PIO_OER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputDisable
+//* \brief Output Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output to be disabled
+{
+        pPio->PIO_ODR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetOutputStatus
+//* \brief Return PIO Output Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_OSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsOuputSet
+//* \brief Test if PIO Output is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsOutputSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetOutputStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InputFilterEnable
+//* \brief Input Filter Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InputFilterEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio input filter to be enabled
+{
+        pPio->PIO_IFER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InputFilterDisable
+//* \brief Input Filter Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InputFilterDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio input filter to be disabled
+{
+        pPio->PIO_IFDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInputFilterStatus
+//* \brief Return PIO Input Filter Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_IFSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInputFilterSet
+//* \brief Test if PIO Input filter is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInputFilterSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetInputFilterStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetOutputDataStatus
+//* \brief Return PIO Output Data Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status
+    AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_ODSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InterruptEnable
+//* \brief Enable PIO Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InterruptEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio interrupt to be enabled
+{
+        pPio->PIO_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InterruptDisable
+//* \brief Disable PIO Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InterruptDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio interrupt to be disabled
+{
+        pPio->PIO_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInterruptMaskStatus
+//* \brief Return PIO Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInterruptStatus
+//* \brief Return PIO Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_ISR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInterruptMasked
+//* \brief Test if PIO Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInterruptMasked(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInterruptSet
+//* \brief Test if PIO Interrupt is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInterruptSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetInterruptStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_MultiDriverEnable
+//* \brief Multi Driver Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_MultiDriverEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be enabled
+{
+        pPio->PIO_MDER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_MultiDriverDisable
+//* \brief Multi Driver Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_MultiDriverDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be disabled
+{
+        pPio->PIO_MDDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetMultiDriverStatus
+//* \brief Return PIO Multi Driver Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_MDSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsMultiDriverSet
+//* \brief Test if PIO MultiDriver is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsMultiDriverSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_A_RegisterSelection
+//* \brief PIO A Register Selection
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_A_RegisterSelection(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio A register selection
+{
+        pPio->PIO_ASR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_B_RegisterSelection
+//* \brief PIO B Register Selection
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_B_RegisterSelection(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio B register selection
+{
+        pPio->PIO_BSR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_Get_AB_RegisterStatus
+//* \brief Return PIO Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_ABSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsAB_RegisterSet
+//* \brief Test if PIO AB Register is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsAB_RegisterSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputWriteEnable
+//* \brief Output Write Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputWriteEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output write to be enabled
+{
+        pPio->PIO_OWER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputWriteDisable
+//* \brief Output Write Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputWriteDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output write to be disabled
+{
+        pPio->PIO_OWDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetOutputWriteStatus
+//* \brief Return PIO Output Write Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_OWSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsOutputWriteSet
+//* \brief Test if PIO OutputWrite is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsOutputWriteSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetCfgPullup
+//* \brief Return PIO Configuration Pullup
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_PPUSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsOutputDataStatusSet
+//* \brief Test if PIO Output Data Status is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsOutputDataStatusSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetOutputDataStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsCfgPullupStatusSet
+//* \brief Test if PIO Configuration Pullup Status is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsCfgPullupStatusSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (~AT91F_PIO_GetCfgPullup(pPio) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR TWI
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TWI_EnableIt
+//* \brief Enable TWI IT
+//*----------------------------------------------------------------------------
+__inline void AT91F_TWI_EnableIt (
+    AT91PS_TWI pTWI, // \arg pointer to a TWI controller
+    unsigned int flag)   // \arg IT to be enabled
+{
+    //* Write to the IER register
+    pTWI->TWI_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TWI_DisableIt
+//* \brief Disable TWI IT
+//*----------------------------------------------------------------------------
+__inline void AT91F_TWI_DisableIt (
+    AT91PS_TWI pTWI, // \arg pointer to a TWI controller
+    unsigned int flag)   // \arg IT to be disabled
+{
+    //* Write to the IDR register
+    pTWI->TWI_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TWI_Configure
+//* \brief Configure TWI in master mode
+//*----------------------------------------------------------------------------
+__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI )          // \arg pointer to a TWI controller
+{
+    //* Disable interrupts
+    pTWI->TWI_IDR = (unsigned int) -1;
+
+    //* Reset peripheral
+    pTWI->TWI_CR = AT91C_TWI_SWRST;
+
+    //* Set Master mode
+    pTWI->TWI_CR = AT91C_TWI_MSEN | AT91C_TWI_SVDIS;
+
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TWI_GetInterruptMaskStatus
+//* \brief Return TWI Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status
+        AT91PS_TWI pTwi) // \arg  pointer to a TWI controller
+{
+        return pTwi->TWI_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TWI_IsInterruptMasked
+//* \brief Test if TWI Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_TWI_IsInterruptMasked(
+        AT91PS_TWI pTwi,   // \arg  pointer to a TWI controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR USART
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_Baudrate
+//* \brief Calculate the baudrate
+//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity
+#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \
+                        AT91C_US_NBSTOP_1_BIT + \
+                        AT91C_US_PAR_NONE + \
+                        AT91C_US_CHRL_8_BITS + \
+                        AT91C_US_CLKS_CLOCK )
+
+//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity
+#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \
+                            AT91C_US_NBSTOP_1_BIT + \
+                            AT91C_US_PAR_NONE + \
+                            AT91C_US_CHRL_8_BITS + \
+                            AT91C_US_CLKS_EXT )
+
+//* Standard Synchronous Mode : 8 bits , 1 stop , no parity
+#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \
+                       AT91C_US_USMODE_NORMAL + \
+                       AT91C_US_NBSTOP_1_BIT + \
+                       AT91C_US_PAR_NONE + \
+                       AT91C_US_CHRL_8_BITS + \
+                       AT91C_US_CLKS_CLOCK )
+
+//* SCK used Label
+#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT)
+
+//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity
+#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \
+                             AT91C_US_CLKS_CLOCK +\
+                             AT91C_US_NBSTOP_1_BIT + \
+                             AT91C_US_PAR_EVEN + \
+                             AT91C_US_CHRL_8_BITS + \
+                             AT91C_US_CKLO +\
+                             AT91C_US_OVER)
+
+//* Standard IRDA mode
+#define AT91C_US_ASYNC_IRDA_MODE (  AT91C_US_USMODE_IRDA + \
+                            AT91C_US_NBSTOP_1_BIT + \
+                            AT91C_US_PAR_NONE + \
+                            AT91C_US_CHRL_8_BITS + \
+                            AT91C_US_CLKS_CLOCK )
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_Baudrate
+//* \brief Caluculate baud_value according to the main clock and the baud rate
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_US_Baudrate (
+    const unsigned int main_clock, // \arg peripheral clock
+    const unsigned int baud_rate)  // \arg UART baudrate
+{
+    unsigned int baud_value = ((main_clock*10)/(baud_rate * 16));
+    if ((baud_value % 10) >= 5)
+        baud_value = (baud_value / 10) + 1;
+    else
+        baud_value /= 10;
+    return baud_value;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_SetBaudrate
+//* \brief Set the baudrate according to the CPU clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_SetBaudrate (
+    AT91PS_USART pUSART,    // \arg pointer to a USART controller
+    unsigned int mainClock, // \arg peripheral clock
+    unsigned int speed)     // \arg UART baudrate
+{
+    //* Define the baud rate divisor register
+    pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_SetTimeguard
+//* \brief Set USART timeguard
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_SetTimeguard (
+    AT91PS_USART pUSART,    // \arg pointer to a USART controller
+    unsigned int timeguard) // \arg timeguard value
+{
+    //* Write the Timeguard Register
+    pUSART->US_TTGR = timeguard ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_EnableIt
+//* \brief Enable USART IT
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_EnableIt (
+    AT91PS_USART pUSART, // \arg pointer to a USART controller
+    unsigned int flag)   // \arg IT to be enabled
+{
+    //* Write to the IER register
+    pUSART->US_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_DisableIt
+//* \brief Disable USART IT
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_DisableIt (
+    AT91PS_USART pUSART, // \arg pointer to a USART controller
+    unsigned int flag)   // \arg IT to be disabled
+{
+    //* Write to the IER register
+    pUSART->US_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_Configure
+//* \brief Configure USART
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_Configure (
+    AT91PS_USART pUSART,     // \arg pointer to a USART controller
+    unsigned int mainClock,  // \arg peripheral clock
+    unsigned int mode ,      // \arg mode Register to be programmed
+    unsigned int baudRate ,  // \arg baudrate to be programmed
+    unsigned int timeguard ) // \arg timeguard to be programmed
+{
+    //* Disable interrupts
+    pUSART->US_IDR = (unsigned int) -1;
+
+    //* Reset receiver and transmitter
+    pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ;
+
+    //* Define the baud rate divisor register
+    AT91F_US_SetBaudrate(pUSART, mainClock, baudRate);
+
+    //* Write the Timeguard Register
+    AT91F_US_SetTimeguard(pUSART, timeguard);
+
+    //* Clear Transmit and Receive Counters
+    AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR));
+
+    //* Define the USART mode
+    pUSART->US_MR = mode  ;
+
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_EnableRx
+//* \brief Enable receiving characters
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_EnableRx (
+    AT91PS_USART pUSART)     // \arg pointer to a USART controller
+{
+    //* Enable receiver
+    pUSART->US_CR = AT91C_US_RXEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_EnableTx
+//* \brief Enable sending characters
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_EnableTx (
+    AT91PS_USART pUSART)     // \arg pointer to a USART controller
+{
+    //* Enable  transmitter
+    pUSART->US_CR = AT91C_US_TXEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_ResetRx
+//* \brief Reset Receiver and re-enable it
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_ResetRx (
+    AT91PS_USART pUSART)     // \arg pointer to a USART controller
+{
+    //* Reset receiver
+    pUSART->US_CR = AT91C_US_RSTRX;
+    //* Re-Enable receiver
+    pUSART->US_CR = AT91C_US_RXEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_ResetTx
+//* \brief Reset Transmitter and re-enable it
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_ResetTx (
+    AT91PS_USART pUSART)     // \arg pointer to a USART controller
+{
+    //* Reset transmitter
+    pUSART->US_CR = AT91C_US_RSTTX;
+    //* Enable transmitter
+    pUSART->US_CR = AT91C_US_TXEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_DisableRx
+//* \brief Disable Receiver
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_DisableRx (
+    AT91PS_USART pUSART)     // \arg pointer to a USART controller
+{
+    //* Disable receiver
+    pUSART->US_CR = AT91C_US_RXDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_DisableTx
+//* \brief Disable Transmitter
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_DisableTx (
+    AT91PS_USART pUSART)     // \arg pointer to a USART controller
+{
+    //* Disable transmitter
+    pUSART->US_CR = AT91C_US_TXDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_Close
+//* \brief Close USART: disable IT disable receiver and transmitter, close PDC
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_Close (
+    AT91PS_USART pUSART)     // \arg pointer to a USART controller
+{
+    //* Reset the baud rate divisor register
+    pUSART->US_BRGR = 0 ;
+
+    //* Reset the USART mode
+    pUSART->US_MR = 0  ;
+
+    //* Reset the Timeguard Register
+    pUSART->US_TTGR = 0;
+
+    //* Disable all interrupts
+    pUSART->US_IDR = 0xFFFFFFFF ;
+
+    //* Abort the Peripheral Data Transfers
+    AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR));
+
+    //* Disable receiver and transmitter and stop any activity immediately
+    pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_TxReady
+//* \brief Return 1 if a character can be written in US_THR
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_US_TxReady (
+    AT91PS_USART pUSART )     // \arg pointer to a USART controller
+{
+    return (pUSART->US_CSR & AT91C_US_TXRDY);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_RxReady
+//* \brief Return 1 if a character can be read in US_RHR
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_US_RxReady (
+    AT91PS_USART pUSART )     // \arg pointer to a USART controller
+{
+    return (pUSART->US_CSR & AT91C_US_RXRDY);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_Error
+//* \brief Return the error flag
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_US_Error (
+    AT91PS_USART pUSART )     // \arg pointer to a USART controller
+{
+    return (pUSART->US_CSR &
+        (AT91C_US_OVRE |  // Overrun error
+         AT91C_US_FRAME | // Framing error
+         AT91C_US_PARE));  // Parity error
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_PutChar
+//* \brief Send a character,does not check if ready to send
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_PutChar (
+    AT91PS_USART pUSART,
+    int character )
+{
+    pUSART->US_THR = (character & 0x1FF);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_GetChar
+//* \brief Receive a character,does not check if a character is available
+//*----------------------------------------------------------------------------
+__inline int AT91F_US_GetChar (
+    const AT91PS_USART pUSART)
+{
+    return((pUSART->US_RHR) & 0x1FF);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_SendFrame
+//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_US_SendFrame(
+    AT91PS_USART pUSART,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    return AT91F_PDC_SendFrame(
+        (AT91PS_PDC) &(pUSART->US_RPR),
+        pBuffer,
+        szBuffer,
+        pNextBuffer,
+        szNextBuffer);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_ReceiveFrame
+//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_US_ReceiveFrame (
+    AT91PS_USART pUSART,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    return AT91F_PDC_ReceiveFrame(
+        (AT91PS_PDC) &(pUSART->US_RPR),
+        pBuffer,
+        szBuffer,
+        pNextBuffer,
+        szNextBuffer);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US_SetIrdaFilter
+//* \brief Set the value of IrDa filter tregister
+//*----------------------------------------------------------------------------
+__inline void AT91F_US_SetIrdaFilter (
+    AT91PS_USART pUSART,
+    unsigned char value
+)
+{
+    pUSART->US_IF = value;
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR UDP
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_EnableIt
+//* \brief Enable UDP IT
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_EnableIt (
+    AT91PS_UDP pUDP,     // \arg pointer to a UDP controller
+    unsigned int flag)   // \arg IT to be enabled
+{
+    //* Write to the IER register
+    pUDP->UDP_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_DisableIt
+//* \brief Disable UDP IT
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_DisableIt (
+    AT91PS_UDP pUDP,     // \arg pointer to a UDP controller
+    unsigned int flag)   // \arg IT to be disabled
+{
+    //* Write to the IDR register
+    pUDP->UDP_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_SetAddress
+//* \brief Set UDP functional address
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_SetAddress (
+    AT91PS_UDP pUDP,     // \arg pointer to a UDP controller
+    unsigned char address)   // \arg new UDP address
+{
+    pUDP->UDP_FADDR = (AT91C_UDP_FEN | address);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_EnableEp
+//* \brief Enable Endpoint
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_EnableEp (
+    AT91PS_UDP pUDP,     // \arg pointer to a UDP controller
+    unsigned int flag)   // \arg endpoints to be enabled
+{
+    pUDP->UDP_GLBSTATE  |= flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_DisableEp
+//* \brief Enable Endpoint
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_DisableEp (
+    AT91PS_UDP pUDP,     // \arg pointer to a UDP controller
+    unsigned int flag)   // \arg endpoints to be enabled
+{
+    pUDP->UDP_GLBSTATE  &= ~(flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_SetState
+//* \brief Set UDP Device state
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_SetState (
+    AT91PS_UDP pUDP,     // \arg pointer to a UDP controller
+    unsigned int flag)   // \arg new UDP address
+{
+    pUDP->UDP_GLBSTATE  &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG);
+    pUDP->UDP_GLBSTATE  |= flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_GetState
+//* \brief return UDP Device state
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state
+    AT91PS_UDP pUDP)     // \arg pointer to a UDP controller
+{
+    return (pUDP->UDP_GLBSTATE  & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_ResetEp
+//* \brief Reset UDP endpoint
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_ResetEp ( // \return the UDP device state
+    AT91PS_UDP pUDP,     // \arg pointer to a UDP controller
+    unsigned int flag)   // \arg Endpoints to be reset
+{
+    pUDP->UDP_RSTEP = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_EpStall
+//* \brief Endpoint will STALL requests
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_EpStall(
+    AT91PS_UDP pUDP,     // \arg pointer to a UDP controller
+    unsigned char endpoint)   // \arg endpoint number
+{
+    pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_EpWrite
+//* \brief Write value in the DPR
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_EpWrite(
+    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
+    unsigned char endpoint,  // \arg endpoint number
+    unsigned char value)     // \arg value to be written in the DPR
+{
+    pUDP->UDP_FDR[endpoint] = value;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_EpRead
+//* \brief Return value from the DPR
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_UDP_EpRead(
+    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
+    unsigned char endpoint)  // \arg endpoint number
+{
+    return pUDP->UDP_FDR[endpoint];
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_EpEndOfWr
+//* \brief Notify the UDP that values in DPR are ready to be sent
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_EpEndOfWr(
+    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
+    unsigned char endpoint)  // \arg endpoint number
+{
+    pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_EpClear
+//* \brief Clear flag in the endpoint CSR register
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_EpClear(
+    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
+    unsigned char endpoint,  // \arg endpoint number
+    unsigned int flag)       // \arg flag to be cleared
+{
+    pUDP->UDP_CSR[endpoint] &= ~(flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_EpSet
+//* \brief Set flag in the endpoint CSR register
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_EpSet(
+    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
+    unsigned char endpoint,  // \arg endpoint number
+    unsigned int flag)       // \arg flag to be cleared
+{
+    pUDP->UDP_CSR[endpoint] |= flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_EpStatus
+//* \brief Return the endpoint CSR register
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_UDP_EpStatus(
+    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
+    unsigned char endpoint)  // \arg endpoint number
+{
+    return pUDP->UDP_CSR[endpoint];
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_GetInterruptMaskStatus
+//* \brief Return UDP Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status
+        AT91PS_UDP pUdp) // \arg  pointer to a UDP controller
+{
+        return pUdp->UDP_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_IsInterruptMasked
+//* \brief Test if UDP Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_UDP_IsInterruptMasked(
+        AT91PS_UDP pUdp,   // \arg  pointer to a UDP controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR AIC
+   ***************************************************************************** */
+#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20]
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_ConfigureIt
+//* \brief Interrupt Handler Initialization
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_AIC_ConfigureIt (
+    AT91PS_AIC pAic,  // \arg pointer to the AIC registers
+    unsigned int irq_id,     // \arg interrupt number to initialize
+    unsigned int priority,   // \arg priority to give to the interrupt
+    unsigned int src_type,   // \arg activation and sense of activation
+    void (*newHandler) (void) ) // \arg address of the interrupt handler
+{
+    unsigned int oldHandler;
+    unsigned int mask ;
+
+    oldHandler = pAic->AIC_SVR[irq_id];
+
+    mask = 0x1 << irq_id ;
+    //* Disable the interrupt on the interrupt controller
+    pAic->AIC_IDCR = mask ;
+    //* Save the interrupt handler routine pointer and the interrupt priority
+    pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ;
+    //* Store the Source Mode Register
+    pAic->AIC_SMR[irq_id] = src_type | priority  ;
+    //* Clear the interrupt on the interrupt controller
+    pAic->AIC_ICCR = mask ;
+
+    return oldHandler;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_EnableIt
+//* \brief Enable corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_EnableIt (
+    AT91PS_AIC pAic,      // \arg pointer to the AIC registers
+    unsigned int irq_id ) // \arg interrupt number to initialize
+{
+    //* Enable the interrupt on the interrupt controller
+    pAic->AIC_IECR = 0x1 << irq_id ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_DisableIt
+//* \brief Disable corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_DisableIt (
+    AT91PS_AIC pAic,      // \arg pointer to the AIC registers
+    unsigned int irq_id ) // \arg interrupt number to initialize
+{
+    unsigned int mask = 0x1 << irq_id;
+    //* Disable the interrupt on the interrupt controller
+    pAic->AIC_IDCR = mask ;
+    //* Clear the interrupt on the Interrupt Controller ( if one is pending )
+    pAic->AIC_ICCR = mask ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_ClearIt
+//* \brief Clear corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_ClearIt (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg interrupt number to initialize
+{
+    //* Clear the interrupt on the Interrupt Controller ( if one is pending )
+    pAic->AIC_ICCR = (0x1 << irq_id);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_AcknowledgeIt
+//* \brief Acknowledge corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_AcknowledgeIt (
+    AT91PS_AIC pAic)     // \arg pointer to the AIC registers
+{
+    pAic->AIC_EOICR = pAic->AIC_EOICR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_SetExceptionVector
+//* \brief Configure vector handler
+//*----------------------------------------------------------------------------
+__inline unsigned int  AT91F_AIC_SetExceptionVector (
+    unsigned int *pVector, // \arg pointer to the AIC registers
+    void (*Handler) () )   // \arg Interrupt Handler
+{
+    unsigned int oldVector = *pVector;
+
+    if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE)
+        *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE;
+    else
+        *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000;
+
+    return oldVector;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_Trig
+//* \brief Trig an IT
+//*----------------------------------------------------------------------------
+__inline void  AT91F_AIC_Trig (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg interrupt number
+{
+    pAic->AIC_ISCR = (0x1 << irq_id) ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_IsActive
+//* \brief Test if an IT is active
+//*----------------------------------------------------------------------------
+__inline unsigned int  AT91F_AIC_IsActive (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg Interrupt Number
+{
+    return (pAic->AIC_ISR & (0x1 << irq_id));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_IsPending
+//* \brief Test if an IT is pending
+//*----------------------------------------------------------------------------
+__inline unsigned int  AT91F_AIC_IsPending (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg Interrupt Number
+{
+    return (pAic->AIC_IPR & (0x1 << irq_id));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_Open
+//* \brief Set exception vectors and AIC registers to default values
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_Open(
+    AT91PS_AIC pAic,        // \arg pointer to the AIC registers
+    void (*IrqHandler) (),  // \arg Default IRQ vector exception
+    void (*FiqHandler) (),  // \arg Default FIQ vector exception
+    void (*DefaultHandler)  (), // \arg Default Handler set in ISR
+    void (*SpuriousHandler) (), // \arg Default Spurious Handler
+    unsigned int protectMode)   // \arg Debug Control Register
+{
+    int i;
+
+    // Disable all interrupts and set IVR to the default handler
+    for (i = 0; i < 32; ++i) {
+        AT91F_AIC_DisableIt(pAic, i);
+        AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, DefaultHandler);
+    }
+
+    // Set the IRQ exception vector
+    AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler);
+    // Set the Fast Interrupt exception vector
+    AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler);
+
+    pAic->AIC_SPU = (unsigned int) SpuriousHandler;
+    pAic->AIC_DCR = protectMode;
+}
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_MC_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  MC
+//*----------------------------------------------------------------------------
+__inline void AT91F_MC_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_SYS));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  DBGU
+//*----------------------------------------------------------------------------
+__inline void AT91F_DBGU_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_SYS));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_CfgPIO
+//* \brief Configure PIO controllers to drive DBGU signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_DBGU_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        ((unsigned int) AT91C_PA10_DTXD    ) |
+        ((unsigned int) AT91C_PA9_DRXD    ), // Peripheral A
+        0); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWMC_CH3_CfgPIO
+//* \brief Configure PIO controllers to drive PWMC_CH3 signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_CH3_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        0, // Peripheral A
+        ((unsigned int) AT91C_PA14_PWM3    ) |
+        ((unsigned int) AT91C_PA7_PWM3    )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWMC_CH2_CfgPIO
+//* \brief Configure PIO controllers to drive PWMC_CH2 signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_CH2_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        ((unsigned int) AT91C_PA2_PWM2    ), // Peripheral A
+        ((unsigned int) AT91C_PA25_PWM2    ) |
+        ((unsigned int) AT91C_PA13_PWM2    )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWMC_CH1_CfgPIO
+//* \brief Configure PIO controllers to drive PWMC_CH1 signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_CH1_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        ((unsigned int) AT91C_PA1_PWM1    ), // Peripheral A
+        ((unsigned int) AT91C_PA24_PWM1    ) |
+        ((unsigned int) AT91C_PA12_PWM1    )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWMC_CH0_CfgPIO
+//* \brief Configure PIO controllers to drive PWMC_CH0 signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_CH0_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        ((unsigned int) AT91C_PA0_PWM0    ), // Peripheral A
+        ((unsigned int) AT91C_PA23_PWM0    ) |
+        ((unsigned int) AT91C_PA11_PWM0    )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  SSC
+//*----------------------------------------------------------------------------
+__inline void AT91F_SSC_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_SSC));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SSC_CfgPIO
+//* \brief Configure PIO controllers to drive SSC signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_SSC_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        ((unsigned int) AT91C_PA17_TD      ) |
+        ((unsigned int) AT91C_PA15_TF      ) |
+        ((unsigned int) AT91C_PA19_RK      ) |
+        ((unsigned int) AT91C_PA18_RD      ) |
+        ((unsigned int) AT91C_PA20_RF      ) |
+        ((unsigned int) AT91C_PA16_TK      ), // Peripheral A
+        0); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  SPI
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_SPI));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_SPI_CfgPIO
+//* \brief Configure PIO controllers to drive SPI signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_SPI_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        ((unsigned int) AT91C_PA11_NPCS0   ) |
+        ((unsigned int) AT91C_PA13_MOSI    ) |
+        ((unsigned int) AT91C_PA31_NPCS1   ) |
+        ((unsigned int) AT91C_PA12_MISO    ) |
+        ((unsigned int) AT91C_PA14_SPCK    ), // Peripheral A
+        ((unsigned int) AT91C_PA9_NPCS1   ) |
+        ((unsigned int) AT91C_PA30_NPCS2   ) |
+        ((unsigned int) AT91C_PA10_NPCS2   ) |
+        ((unsigned int) AT91C_PA22_NPCS3   ) |
+        ((unsigned int) AT91C_PA3_NPCS3   ) |
+        ((unsigned int) AT91C_PA5_NPCS3   )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PWMC_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  PWMC
+//*----------------------------------------------------------------------------
+__inline void AT91F_PWMC_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_PWMC));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TC2_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  TC2
+//*----------------------------------------------------------------------------
+__inline void AT91F_TC2_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_TC2));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TC2_CfgPIO
+//* \brief Configure PIO controllers to drive TC2 signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_TC2_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        0, // Peripheral A
+        ((unsigned int) AT91C_PA26_TIOA2   ) |
+        ((unsigned int) AT91C_PA27_TIOB2   ) |
+        ((unsigned int) AT91C_PA29_TCLK2   )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TC1_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  TC1
+//*----------------------------------------------------------------------------
+__inline void AT91F_TC1_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_TC1));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TC1_CfgPIO
+//* \brief Configure PIO controllers to drive TC1 signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_TC1_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        0, // Peripheral A
+        ((unsigned int) AT91C_PA15_TIOA1   ) |
+        ((unsigned int) AT91C_PA16_TIOB1   ) |
+        ((unsigned int) AT91C_PA28_TCLK1   )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TC0_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  TC0
+//*----------------------------------------------------------------------------
+__inline void AT91F_TC0_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_TC0));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TC0_CfgPIO
+//* \brief Configure PIO controllers to drive TC0 signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_TC0_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        0, // Peripheral A
+        ((unsigned int) AT91C_PA0_TIOA0   ) |
+        ((unsigned int) AT91C_PA1_TIOB0   ) |
+        ((unsigned int) AT91C_PA4_TCLK0   )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  PMC
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_SYS));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgPIO
+//* \brief Configure PIO controllers to drive PMC signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        0, // Peripheral A
+        ((unsigned int) AT91C_PA17_PCK1    ) |
+        ((unsigned int) AT91C_PA21_PCK1    ) |
+        ((unsigned int) AT91C_PA31_PCK2    ) |
+        ((unsigned int) AT91C_PA18_PCK2    ) |
+        ((unsigned int) AT91C_PA6_PCK0    )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  ADC
+//*----------------------------------------------------------------------------
+__inline void AT91F_ADC_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_ADC));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_ADC_CfgPIO
+//* \brief Configure PIO controllers to drive ADC signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_ADC_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        0, // Peripheral A
+        ((unsigned int) AT91C_PA8_ADTRG   )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIOA_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  PIOA
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIOA_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_PIOA));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TWI_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  TWI
+//*----------------------------------------------------------------------------
+__inline void AT91F_TWI_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_TWI));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_TWI_CfgPIO
+//* \brief Configure PIO controllers to drive TWI signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_TWI_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        ((unsigned int) AT91C_PA3_TWD     ) |
+        ((unsigned int) AT91C_PA4_TWCK    ), // Peripheral A
+        0); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US1_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  US1
+//*----------------------------------------------------------------------------
+__inline void AT91F_US1_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_US1));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US1_CfgPIO
+//* \brief Configure PIO controllers to drive US1 signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_US1_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        ((unsigned int) AT91C_PA21_RXD1    ) |
+        ((unsigned int) AT91C_PA27_DTR1    ) |
+        ((unsigned int) AT91C_PA26_DCD1    ) |
+        ((unsigned int) AT91C_PA22_TXD1    ) |
+        ((unsigned int) AT91C_PA24_RTS1    ) |
+        ((unsigned int) AT91C_PA23_SCK1    ) |
+        ((unsigned int) AT91C_PA28_DSR1    ) |
+        ((unsigned int) AT91C_PA29_RI1     ) |
+        ((unsigned int) AT91C_PA25_CTS1    ), // Peripheral A
+        0); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US0_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  US0
+//*----------------------------------------------------------------------------
+__inline void AT91F_US0_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_US0));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_US0_CfgPIO
+//* \brief Configure PIO controllers to drive US0 signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_US0_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        ((unsigned int) AT91C_PA5_RXD0    ) |
+        ((unsigned int) AT91C_PA6_TXD0    ) |
+        ((unsigned int) AT91C_PA7_RTS0    ) |
+        ((unsigned int) AT91C_PA8_CTS0    ), // Peripheral A
+        ((unsigned int) AT91C_PA2_SCK0    )); // Peripheral B
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_UDP_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  UDP
+//*----------------------------------------------------------------------------
+__inline void AT91F_UDP_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_UDP));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_CfgPMC
+//* \brief Enable Peripheral clock in PMC for  AIC
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_CfgPMC (void)
+{
+    AT91F_PMC_EnablePeriphClock(
+        AT91C_BASE_PMC, // PIO controller base address
+        ((unsigned int) 1 << AT91C_ID_IRQ0) |
+        ((unsigned int) 1 << AT91C_ID_FIQ) |
+        ((unsigned int) 1 << AT91C_ID_IRQ1));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_CfgPIO
+//* \brief Configure PIO controllers to drive AIC signals
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_CfgPIO (void)
+{
+    // Configure PIO controllers to periph mode
+    AT91F_PIO_CfgPeriph(
+        AT91C_BASE_PIOA, // PIO controller base address
+        ((unsigned int) AT91C_PA30_IRQ1    ), // Peripheral A
+        ((unsigned int) AT91C_PA20_IRQ0    ) |
+        ((unsigned int) AT91C_PA19_FIQ     )); // Peripheral B
+}
+
+#endif // lib_AT91SAM7S64_H
diff --git a/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h b/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h
index 805a2bc..26afc94 100644
--- a/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h
+++ b/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h
@@ -1,4558 +1,1469 @@
-//* ----------------------------------------------------------------------------

-//*         ATMEL Microcontroller Software Support  -  ROUSSET  -

-//* ----------------------------------------------------------------------------

-//* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR

-//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

-//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE

-//* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,

-//* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

-//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,

-//* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

-//* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

-//* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,

-//* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-//* ----------------------------------------------------------------------------

-//* File Name           : lib_AT91SAM7X128.h

-//* Object              : AT91SAM7X128 inlined functions

-//* Generated           : AT91 SW Application Group  05/20/2005 (16:22:23)

-//*

-//* CVS Reference       : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003//

-//* CVS Reference       : /lib_pmc_SAM7X.h/1.1/Tue Feb  1 08:32:10 2005//

-//* CVS Reference       : /lib_VREG_6085B.h/1.1/Tue Feb  1 16:20:47 2005//

-//* CVS Reference       : /lib_rstc_6098A.h/1.1/Wed Oct  6 10:39:20 2004//

-//* CVS Reference       : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003//

-//* CVS Reference       : /lib_wdtc_6080A.h/1.1/Wed Oct  6 10:38:30 2004//

-//* CVS Reference       : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002//

-//* CVS Reference       : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003//

-//* CVS Reference       : /lib_pitc_6079A.h/1.2/Tue Nov  9 14:43:56 2004//

-//* CVS Reference       : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005//

-//* CVS Reference       : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005//

-//* CVS Reference       : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004//

-//* CVS Reference       : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003//

-//* CVS Reference       : /lib_rttc_6081A.h/1.1/Wed Oct  6 10:39:38 2004//

-//* CVS Reference       : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005//

-//* CVS Reference       : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005//

-//* CVS Reference       : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003//

-//* CVS Reference       : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004//

-//* CVS Reference       : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003//

-//* CVS Reference       : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003//

-//* CVS Reference       : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004//

-//* CVS Reference       : /lib_pdc.h/1.2/Tue Jul  2 13:29:40 2002//

-//* ----------------------------------------------------------------------------

-

-#ifndef lib_AT91SAM7X128_H

-#define lib_AT91SAM7X128_H

-

-/* *****************************************************************************

-                SOFTWARE API FOR AIC

-   ***************************************************************************** */

-#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20]

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_ConfigureIt

-//* \brief Interrupt Handler Initialization

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AIC_ConfigureIt (

-	AT91PS_AIC pAic,  // \arg pointer to the AIC registers

-	unsigned int irq_id,     // \arg interrupt number to initialize

-	unsigned int priority,   // \arg priority to give to the interrupt

-	unsigned int src_type,   // \arg activation and sense of activation

-	void (*newHandler) (void) ) // \arg address of the interrupt handler

-{

-	unsigned int oldHandler;

-    unsigned int mask ;

-

-    oldHandler = pAic->AIC_SVR[irq_id];

-

-    mask = 0x1 << irq_id ;

-    //* Disable the interrupt on the interrupt controller

-    pAic->AIC_IDCR = mask ;

-    //* Save the interrupt handler routine pointer and the interrupt priority

-    pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ;

-    //* Store the Source Mode Register

-    pAic->AIC_SMR[irq_id] = src_type | priority  ;

-    //* Clear the interrupt on the interrupt controller

-    pAic->AIC_ICCR = mask ;

-

-	return oldHandler;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_EnableIt

-//* \brief Enable corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_EnableIt (

-	AT91PS_AIC pAic,      // \arg pointer to the AIC registers

-	unsigned int irq_id ) // \arg interrupt number to initialize

-{

-    //* Enable the interrupt on the interrupt controller

-    pAic->AIC_IECR = 0x1 << irq_id ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_DisableIt

-//* \brief Disable corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_DisableIt (

-	AT91PS_AIC pAic,      // \arg pointer to the AIC registers

-	unsigned int irq_id ) // \arg interrupt number to initialize

-{

-    unsigned int mask = 0x1 << irq_id;

-    //* Disable the interrupt on the interrupt controller

-    pAic->AIC_IDCR = mask ;

-    //* Clear the interrupt on the Interrupt Controller ( if one is pending )

-    pAic->AIC_ICCR = mask ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_ClearIt

-//* \brief Clear corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_ClearIt (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg interrupt number to initialize

-{

-    //* Clear the interrupt on the Interrupt Controller ( if one is pending )

-    pAic->AIC_ICCR = (0x1 << irq_id);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_AcknowledgeIt

-//* \brief Acknowledge corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_AcknowledgeIt (

-	AT91PS_AIC pAic)     // \arg pointer to the AIC registers

-{

-    pAic->AIC_EOICR = pAic->AIC_EOICR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_SetExceptionVector

-//* \brief Configure vector handler

-//*----------------------------------------------------------------------------

-__inline unsigned int  AT91F_AIC_SetExceptionVector (

-	unsigned int *pVector, // \arg pointer to the AIC registers

-	void (*Handler) () )   // \arg Interrupt Handler

-{

-	unsigned int oldVector = *pVector;

-

-	if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE)

-		*pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE;

-	else

-		*pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000;

-

-	return oldVector;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_Trig

-//* \brief Trig an IT

-//*----------------------------------------------------------------------------

-__inline void  AT91F_AIC_Trig (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg interrupt number

-{

-	pAic->AIC_ISCR = (0x1 << irq_id) ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_IsActive

-//* \brief Test if an IT is active

-//*----------------------------------------------------------------------------

-__inline unsigned int  AT91F_AIC_IsActive (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg Interrupt Number

-{

-	return (pAic->AIC_ISR & (0x1 << irq_id));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_IsPending

-//* \brief Test if an IT is pending

-//*----------------------------------------------------------------------------

-__inline unsigned int  AT91F_AIC_IsPending (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg Interrupt Number

-{

-	return (pAic->AIC_IPR & (0x1 << irq_id));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_Open

-//* \brief Set exception vectors and AIC registers to default values

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_Open(

-	AT91PS_AIC pAic,        // \arg pointer to the AIC registers

-	void (*IrqHandler) (),  // \arg Default IRQ vector exception

-	void (*FiqHandler) (),  // \arg Default FIQ vector exception

-	void (*DefaultHandler)  (), // \arg Default Handler set in ISR

-	void (*SpuriousHandler) (), // \arg Default Spurious Handler

-	unsigned int protectMode)   // \arg Debug Control Register

-{

-	int i;

-

-	// Disable all interrupts and set IVR to the default handler

-	for (i = 0; i < 32; ++i) {

-		AT91F_AIC_DisableIt(pAic, i);

-		AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler);

-	}

-

-	// Set the IRQ exception vector

-	AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler);

-	// Set the Fast Interrupt exception vector

-	AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler);

-

-	pAic->AIC_SPU = (unsigned int) SpuriousHandler;

-	pAic->AIC_DCR = protectMode;

-}

-/* *****************************************************************************

-                SOFTWARE API FOR PDC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetNextRx

-//* \brief Set the next receive transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetNextRx (

-	AT91PS_PDC pPDC,     // \arg pointer to a PDC controller

-	char *address,       // \arg address to the next bloc to be received

-	unsigned int bytes)  // \arg number of bytes to be received

-{

-	pPDC->PDC_RNPR = (unsigned int) address;

-	pPDC->PDC_RNCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetNextTx

-//* \brief Set the next transmit transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetNextTx (

-	AT91PS_PDC pPDC,       // \arg pointer to a PDC controller

-	char *address,         // \arg address to the next bloc to be transmitted

-	unsigned int bytes)    // \arg number of bytes to be transmitted

-{

-	pPDC->PDC_TNPR = (unsigned int) address;

-	pPDC->PDC_TNCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetRx

-//* \brief Set the receive transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetRx (

-	AT91PS_PDC pPDC,       // \arg pointer to a PDC controller

-	char *address,         // \arg address to the next bloc to be received

-	unsigned int bytes)    // \arg number of bytes to be received

-{

-	pPDC->PDC_RPR = (unsigned int) address;

-	pPDC->PDC_RCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetTx

-//* \brief Set the transmit transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetTx (

-	AT91PS_PDC pPDC,       // \arg pointer to a PDC controller

-	char *address,         // \arg address to the next bloc to be transmitted

-	unsigned int bytes)    // \arg number of bytes to be transmitted

-{

-	pPDC->PDC_TPR = (unsigned int) address;

-	pPDC->PDC_TCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_EnableTx

-//* \brief Enable transmit

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_EnableTx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_TXTEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_EnableRx

-//* \brief Enable receive

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_EnableRx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_RXTEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_DisableTx

-//* \brief Disable transmit

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_DisableTx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_TXTDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_DisableRx

-//* \brief Disable receive

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_DisableRx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_RXTDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsTxEmpty

-//* \brief Test if the current transfer descriptor has been sent

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_TCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsNextTxEmpty

-//* \brief Test if the next transfer descriptor has been moved to the current td

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_TNCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsRxEmpty

-//* \brief Test if the current transfer descriptor has been filled

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_RCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsNextRxEmpty

-//* \brief Test if the next transfer descriptor has been moved to the current td

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_RNCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_Open

-//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_Open (

-	AT91PS_PDC pPDC)       // \arg pointer to a PDC controller

-{

-    //* Disable the RX and TX PDC transfer requests

-	AT91F_PDC_DisableRx(pPDC);

-	AT91F_PDC_DisableTx(pPDC);

-

-	//* Reset all Counter register Next buffer first

-	AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetRx(pPDC, (char *) 0, 0);

-

-    //* Enable the RX and TX PDC transfer requests

-	AT91F_PDC_EnableRx(pPDC);

-	AT91F_PDC_EnableTx(pPDC);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_Close

-//* \brief Close PDC: disable TX and RX reset transfer descriptors

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_Close (

-	AT91PS_PDC pPDC)       // \arg pointer to a PDC controller

-{

-    //* Disable the RX and TX PDC transfer requests

-	AT91F_PDC_DisableRx(pPDC);

-	AT91F_PDC_DisableTx(pPDC);

-

-	//* Reset all Counter register Next buffer first

-	AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetRx(pPDC, (char *) 0, 0);

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SendFrame

-//* \brief Close PDC: disable TX and RX reset transfer descriptors

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PDC_SendFrame(

-	AT91PS_PDC pPDC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	if (AT91F_PDC_IsTxEmpty(pPDC)) {

-		//* Buffer and next buffer can be initialized

-		AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer);

-		AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer);

-		return 2;

-	}

-	else if (AT91F_PDC_IsNextTxEmpty(pPDC)) {

-		//* Only one buffer can be initialized

-		AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer);

-		return 1;

-	}

-	else {

-		//* All buffer are in use...

-		return 0;

-	}

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_ReceiveFrame

-//* \brief Close PDC: disable TX and RX reset transfer descriptors

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PDC_ReceiveFrame (

-	AT91PS_PDC pPDC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	if (AT91F_PDC_IsRxEmpty(pPDC)) {

-		//* Buffer and next buffer can be initialized

-		AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer);

-		AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer);

-		return 2;

-	}

-	else if (AT91F_PDC_IsNextRxEmpty(pPDC)) {

-		//* Only one buffer can be initialized

-		AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer);

-		return 1;

-	}

-	else {

-		//* All buffer are in use...

-		return 0;

-	}

-}

-/* *****************************************************************************

-                SOFTWARE API FOR DBGU

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_InterruptEnable

-//* \brief Enable DBGU Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_InterruptEnable(

-        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller

-        unsigned int flag) // \arg  dbgu interrupt to be enabled

-{

-        pDbgu->DBGU_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_InterruptDisable

-//* \brief Disable DBGU Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_InterruptDisable(

-        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller

-        unsigned int flag) // \arg  dbgu interrupt to be disabled

-{

-        pDbgu->DBGU_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_GetInterruptMaskStatus

-//* \brief Return DBGU Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status

-        AT91PS_DBGU pDbgu) // \arg  pointer to a DBGU controller

-{

-        return pDbgu->DBGU_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_IsInterruptMasked

-//* \brief Test if DBGU Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_DBGU_IsInterruptMasked(

-        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR PIO

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgPeriph

-//* \brief Enable pins to be drived by peripheral

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgPeriph(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int periphAEnable,  // \arg PERIPH A to enable

-	unsigned int periphBEnable)  // \arg PERIPH B to enable

-

-{

-	pPio->PIO_ASR = periphAEnable;

-	pPio->PIO_BSR = periphBEnable;

-	pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgOutput

-//* \brief Enable PIO in output mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgOutput(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int pioEnable)      // \arg PIO to be enabled

-{

-	pPio->PIO_PER = pioEnable; // Set in PIO mode

-	pPio->PIO_OER = pioEnable; // Configure in Output

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgInput

-//* \brief Enable PIO in input mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgInput(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int inputEnable)      // \arg PIO to be enabled

-{

-	// Disable output

-	pPio->PIO_ODR  = inputEnable;

-	pPio->PIO_PER  = inputEnable;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgOpendrain

-//* \brief Configure PIO in open drain

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgOpendrain(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int multiDrvEnable) // \arg pio to be configured in open drain

-{

-	// Configure the multi-drive option

-	pPio->PIO_MDDR = ~multiDrvEnable;

-	pPio->PIO_MDER = multiDrvEnable;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgPullup

-//* \brief Enable pullup on PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgPullup(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int pullupEnable)   // \arg enable pullup on PIO

-{

-		// Connect or not Pullup

-	pPio->PIO_PPUDR = ~pullupEnable;

-	pPio->PIO_PPUER = pullupEnable;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgDirectDrive

-//* \brief Enable direct drive on PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgDirectDrive(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int directDrive)    // \arg PIO to be configured with direct drive

-

-{

-	// Configure the Direct Drive

-	pPio->PIO_OWDR  = ~directDrive;

-	pPio->PIO_OWER  = directDrive;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgInputFilter

-//* \brief Enable input filter on input PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgInputFilter(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int inputFilter)    // \arg PIO to be configured with input filter

-

-{

-	// Configure the Direct Drive

-	pPio->PIO_IFDR  = ~inputFilter;

-	pPio->PIO_IFER  = inputFilter;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInput

-//* \brief Return PIO input value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInput( // \return PIO input

-	AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-	return pPio->PIO_PDSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInputSet

-//* \brief Test if PIO is input flag is active

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInputSet(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PIO_GetInput(pPio) & flag);

-}

-

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_SetOutput

-//* \brief Set to 1 output PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_SetOutput(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  output to be set

-{

-	pPio->PIO_SODR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_ClearOutput

-//* \brief Set to 0 output PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_ClearOutput(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  output to be cleared

-{

-	pPio->PIO_CODR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_ForceOutput

-//* \brief Force output when Direct drive option is enabled

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_ForceOutput(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  output to be forced

-{

-	pPio->PIO_ODSR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_Enable

-//* \brief Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_Enable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be enabled 

-{

-        pPio->PIO_PER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_Disable

-//* \brief Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_Disable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be disabled 

-{

-        pPio->PIO_PDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetStatus

-//* \brief Return PIO Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_PSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsSet

-//* \brief Test if PIO is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputEnable

-//* \brief Output Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output to be enabled

-{

-        pPio->PIO_OER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputDisable

-//* \brief Output Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output to be disabled

-{

-        pPio->PIO_ODR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetOutputStatus

-//* \brief Return PIO Output Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_OSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsOuputSet

-//* \brief Test if PIO Output is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsOutputSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetOutputStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InputFilterEnable

-//* \brief Input Filter Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InputFilterEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio input filter to be enabled

-{

-        pPio->PIO_IFER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InputFilterDisable

-//* \brief Input Filter Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InputFilterDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio input filter to be disabled

-{

-        pPio->PIO_IFDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInputFilterStatus

-//* \brief Return PIO Input Filter Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_IFSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInputFilterSet

-//* \brief Test if PIO Input filter is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInputFilterSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetInputFilterStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetOutputDataStatus

-//* \brief Return PIO Output Data Status 

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status 

-	AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_ODSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InterruptEnable

-//* \brief Enable PIO Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InterruptEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio interrupt to be enabled

-{

-        pPio->PIO_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InterruptDisable

-//* \brief Disable PIO Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InterruptDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio interrupt to be disabled

-{

-        pPio->PIO_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInterruptMaskStatus

-//* \brief Return PIO Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInterruptStatus

-//* \brief Return PIO Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_ISR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInterruptMasked

-//* \brief Test if PIO Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInterruptMasked(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInterruptSet

-//* \brief Test if PIO Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInterruptSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetInterruptStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_MultiDriverEnable

-//* \brief Multi Driver Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_MultiDriverEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be enabled

-{

-        pPio->PIO_MDER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_MultiDriverDisable

-//* \brief Multi Driver Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_MultiDriverDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be disabled

-{

-        pPio->PIO_MDDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetMultiDriverStatus

-//* \brief Return PIO Multi Driver Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_MDSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsMultiDriverSet

-//* \brief Test if PIO MultiDriver is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsMultiDriverSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_A_RegisterSelection

-//* \brief PIO A Register Selection 

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_A_RegisterSelection(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio A register selection

-{

-        pPio->PIO_ASR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_B_RegisterSelection

-//* \brief PIO B Register Selection 

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_B_RegisterSelection(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio B register selection 

-{

-        pPio->PIO_BSR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_Get_AB_RegisterStatus

-//* \brief Return PIO Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_ABSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsAB_RegisterSet

-//* \brief Test if PIO AB Register is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsAB_RegisterSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputWriteEnable

-//* \brief Output Write Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputWriteEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output write to be enabled

-{

-        pPio->PIO_OWER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputWriteDisable

-//* \brief Output Write Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputWriteDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output write to be disabled

-{

-        pPio->PIO_OWDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetOutputWriteStatus

-//* \brief Return PIO Output Write Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_OWSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsOutputWriteSet

-//* \brief Test if PIO OutputWrite is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsOutputWriteSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetCfgPullup

-//* \brief Return PIO Configuration Pullup

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup 

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_PPUSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsOutputDataStatusSet

-//* \brief Test if PIO Output Data Status is Set 

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsOutputDataStatusSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetOutputDataStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsCfgPullupStatusSet

-//* \brief Test if PIO Configuration Pullup Status is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsCfgPullupStatusSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (~AT91F_PIO_GetCfgPullup(pPio) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR PMC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgSysClkEnableReg

-//* \brief Configure the System Clock Enable Register of the PMC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgSysClkEnableReg (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int mode)

-{

-	//* Write to the SCER register

-	pPMC->PMC_SCER = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgSysClkDisableReg

-//* \brief Configure the System Clock Disable Register of the PMC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgSysClkDisableReg (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int mode)

-{

-	//* Write to the SCDR register

-	pPMC->PMC_SCDR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetSysClkStatusReg

-//* \brief Return the System Clock Status Register of the PMC controller

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetSysClkStatusReg (

-	AT91PS_PMC pPMC // pointer to a CAN controller

-	)

-{

-	return pPMC->PMC_SCSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_EnablePeriphClock

-//* \brief Enable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_EnablePeriphClock (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int periphIds)  // \arg IDs of peripherals to enable

-{

-	pPMC->PMC_PCER = periphIds;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_DisablePeriphClock

-//* \brief Disable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_DisablePeriphClock (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int periphIds)  // \arg IDs of peripherals to enable

-{

-	pPMC->PMC_PCDR = periphIds;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetPeriphClock

-//* \brief Get peripheral clock status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetPeriphClock (

-	AT91PS_PMC pPMC) // \arg pointer to PMC controller

-{

-	return pPMC->PMC_PCSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_CfgMainOscillatorReg

-//* \brief Cfg the main oscillator

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_CfgMainOscillatorReg (

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int mode)

-{

-	pCKGR->CKGR_MOR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_GetMainOscillatorReg

-//* \brief Cfg the main oscillator

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CKGR_GetMainOscillatorReg (

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	return pCKGR->CKGR_MOR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_EnableMainOscillator

-//* \brief Enable the main oscillator

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_EnableMainOscillator(

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_DisableMainOscillator

-//* \brief Disable the main oscillator

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_DisableMainOscillator (

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_CfgMainOscStartUpTime

-//* \brief Cfg MOR Register according to the main osc startup time

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_CfgMainOscStartUpTime (

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int startup_time,  // \arg main osc startup time in microsecond (us)

-	unsigned int slowClock)  // \arg slowClock in Hz

-{

-	pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT;

-	pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_GetMainClockFreqReg

-//* \brief Cfg the main oscillator

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CKGR_GetMainClockFreqReg (

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	return pCKGR->CKGR_MCFR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_GetMainClock

-//* \brief Return Main clock in Hz

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CKGR_GetMainClock (

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int slowClock)  // \arg slowClock in Hz

-{

-	return ((pCKGR->CKGR_MCFR  & AT91C_CKGR_MAINF) * slowClock) >> 4;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgMCKReg

-//* \brief Cfg Master Clock Register

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgMCKReg (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int mode)

-{

-	pPMC->PMC_MCKR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetMCKReg

-//* \brief Return Master Clock Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetMCKReg(

-	AT91PS_PMC pPMC) // \arg pointer to PMC controller

-{

-	return pPMC->PMC_MCKR;

-}

-

-//*------------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetMasterClock

-//* \brief Return master clock in Hz which correponds to processor clock for ARM7

-//*------------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetMasterClock (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int slowClock)  // \arg slowClock in Hz

-{

-	unsigned int reg = pPMC->PMC_MCKR;

-	unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2));

-	unsigned int pllDivider, pllMultiplier;

-

-	switch (reg & AT91C_PMC_CSS) {

-		case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected

-			return slowClock / prescaler;

-		case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected

-			return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler;

-		case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected

-			reg = pCKGR->CKGR_PLLR;

-			pllDivider    = (reg  & AT91C_CKGR_DIV);

-			pllMultiplier = ((reg  & AT91C_CKGR_MUL) >> 16) + 1;

-			return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler;

-	}

-	return 0;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_EnablePCK

-//* \brief Enable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_EnablePCK (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int pck,  // \arg Peripheral clock identifier 0 .. 7

-	unsigned int mode)

-{

-	pPMC->PMC_PCKR[pck] = mode;

-	pPMC->PMC_SCER = (1 << pck) << 8;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_DisablePCK

-//* \brief Enable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_DisablePCK (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int pck)  // \arg Peripheral clock identifier 0 .. 7

-{

-	pPMC->PMC_SCDR = (1 << pck) << 8;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_EnableIt

-//* \brief Enable PMC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_EnableIt (

-	AT91PS_PMC pPMC,     // pointer to a PMC controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pPMC->PMC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_DisableIt

-//* \brief Disable PMC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_DisableIt (

-	AT91PS_PMC pPMC, // pointer to a PMC controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pPMC->PMC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetStatus

-//* \brief Return PMC Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status

-	AT91PS_PMC pPMC) // pointer to a PMC controller

-{

-	return pPMC->PMC_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetInterruptMaskStatus

-//* \brief Return PMC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status

-	AT91PS_PMC pPMC) // pointer to a PMC controller

-{

-	return pPMC->PMC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_IsInterruptMasked

-//* \brief Test if PMC Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_IsInterruptMasked(

-        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_IsStatusSet

-//* \brief Test if PMC Status is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_IsStatusSet(

-        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PMC_GetStatus(pPMC) & flag);

-}/* *****************************************************************************

-                SOFTWARE API FOR RSTC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTSoftReset

-//* \brief Start Software Reset

-//*----------------------------------------------------------------------------

-__inline void AT91F_RSTSoftReset(

-        AT91PS_RSTC pRSTC,

-        unsigned int reset)

-{

-	pRSTC->RSTC_RCR = (0xA5000000 | reset);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTSetMode

-//* \brief Set Reset Mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_RSTSetMode(

-        AT91PS_RSTC pRSTC,

-        unsigned int mode)

-{

-	pRSTC->RSTC_RMR = (0xA5000000 | mode);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTGetMode

-//* \brief Get Reset Mode

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_RSTGetMode(

-        AT91PS_RSTC pRSTC)

-{

-	return (pRSTC->RSTC_RMR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTGetStatus

-//* \brief Get Reset Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_RSTGetStatus(

-        AT91PS_RSTC pRSTC)

-{

-	return (pRSTC->RSTC_RSR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTIsSoftRstActive

-//* \brief Return !=0 if software reset is still not completed

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_RSTIsSoftRstActive(

-        AT91PS_RSTC pRSTC)

-{

-	return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP);

-}

-/* *****************************************************************************

-                SOFTWARE API FOR RTTC

-   ***************************************************************************** */

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_SetRTT_TimeBase()

-//* \brief  Set the RTT prescaler according to the TimeBase in ms

-//*--------------------------------------------------------------------------------------

-__inline unsigned int AT91F_RTTSetTimeBase(

-        AT91PS_RTTC pRTTC, 

-        unsigned int ms)

-{

-	if (ms > 2000)

-		return 1;   // AT91C_TIME_OUT_OF_RANGE

-	pRTTC->RTTC_RTMR &= ~0xFFFF;	

-	pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF);	

-	return 0;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTTSetPrescaler()

-//* \brief  Set the new prescaler value

-//*--------------------------------------------------------------------------------------

-__inline unsigned int AT91F_RTTSetPrescaler(

-        AT91PS_RTTC pRTTC, 

-        unsigned int rtpres)

-{

-	pRTTC->RTTC_RTMR &= ~0xFFFF;	

-	pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF);	

-	return (pRTTC->RTTC_RTMR);

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTTRestart()

-//* \brief  Restart the RTT prescaler

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTRestart(

-        AT91PS_RTTC pRTTC)

-{

-	pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST;	

-}

-

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_SetAlarmINT()

-//* \brief  Enable RTT Alarm Interrupt

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTSetAlarmINT(

-        AT91PS_RTTC pRTTC)

-{

-	pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_ClearAlarmINT()

-//* \brief  Disable RTT Alarm Interrupt

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTClearAlarmINT(

-        AT91PS_RTTC pRTTC)

-{

-	pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_SetRttIncINT()

-//* \brief  Enable RTT INC Interrupt

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTSetRttIncINT(

-        AT91PS_RTTC pRTTC)

-{

-	pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_ClearRttIncINT()

-//* \brief  Disable RTT INC Interrupt

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTClearRttIncINT(

-        AT91PS_RTTC pRTTC)

-{

-	pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_SetAlarmValue()

-//* \brief  Set RTT Alarm Value

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTSetAlarmValue(

-        AT91PS_RTTC pRTTC, unsigned int alarm)

-{

-	pRTTC->RTTC_RTAR = alarm;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_GetAlarmValue()

-//* \brief  Get RTT Alarm Value

-//*--------------------------------------------------------------------------------------

-__inline unsigned int AT91F_RTTGetAlarmValue(

-        AT91PS_RTTC pRTTC)

-{

-	return(pRTTC->RTTC_RTAR);

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTTGetStatus()

-//* \brief  Read the RTT status

-//*--------------------------------------------------------------------------------------

-__inline unsigned int AT91F_RTTGetStatus(

-        AT91PS_RTTC pRTTC)

-{

-	return(pRTTC->RTTC_RTSR);

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_ReadValue()

-//* \brief  Read the RTT value

-//*--------------------------------------------------------------------------------------

-__inline unsigned int AT91F_RTTReadValue(

-        AT91PS_RTTC pRTTC)

-{

-        register volatile unsigned int val1,val2;

-	do

-	{

-		val1 = pRTTC->RTTC_RTVR;

-		val2 = pRTTC->RTTC_RTVR;

-	}	

-	while(val1 != val2);

-	return(val1);

-}

-/* *****************************************************************************

-                SOFTWARE API FOR PITC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITInit

-//* \brief System timer init : period in µsecond, system clock freq in MHz

-//*----------------------------------------------------------------------------

-__inline void AT91F_PITInit(

-        AT91PS_PITC pPITC,

-        unsigned int period,

-        unsigned int pit_frequency)

-{

-	pPITC->PITC_PIMR = period? (period * pit_frequency + 8) >> 4 : 0; // +8 to avoid %10 and /10

-	pPITC->PITC_PIMR |= AT91C_PITC_PITEN;	 

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITSetPIV

-//* \brief Set the PIT Periodic Interval Value 

-//*----------------------------------------------------------------------------

-__inline void AT91F_PITSetPIV(

-        AT91PS_PITC pPITC,

-        unsigned int piv)

-{

-	pPITC->PITC_PIMR = piv | (pPITC->PITC_PIMR & (AT91C_PITC_PITEN | AT91C_PITC_PITIEN));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITEnableInt

-//* \brief Enable PIT periodic interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PITEnableInt(

-        AT91PS_PITC pPITC)

-{

-	pPITC->PITC_PIMR |= AT91C_PITC_PITIEN;	 

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITDisableInt

-//* \brief Disable PIT periodic interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PITDisableInt(

-        AT91PS_PITC pPITC)

-{

-	pPITC->PITC_PIMR &= ~AT91C_PITC_PITIEN;	 

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITGetMode

-//* \brief Read PIT mode register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PITGetMode(

-        AT91PS_PITC pPITC)

-{

-	return(pPITC->PITC_PIMR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITGetStatus

-//* \brief Read PIT status register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PITGetStatus(

-        AT91PS_PITC pPITC)

-{

-	return(pPITC->PITC_PISR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITGetPIIR

-//* \brief Read PIT CPIV and PICNT without ressetting the counters

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PITGetPIIR(

-        AT91PS_PITC pPITC)

-{

-	return(pPITC->PITC_PIIR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITGetPIVR

-//* \brief Read System timer CPIV and PICNT without ressetting the counters

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PITGetPIVR(

-        AT91PS_PITC pPITC)

-{

-	return(pPITC->PITC_PIVR);

-}

-/* *****************************************************************************

-                SOFTWARE API FOR WDTC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_WDTSetMode

-//* \brief Set Watchdog Mode Register

-//*----------------------------------------------------------------------------

-__inline void AT91F_WDTSetMode(

-        AT91PS_WDTC pWDTC,

-        unsigned int Mode)

-{

-	pWDTC->WDTC_WDMR = Mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_WDTRestart

-//* \brief Restart Watchdog

-//*----------------------------------------------------------------------------

-__inline void AT91F_WDTRestart(

-        AT91PS_WDTC pWDTC)

-{

-	pWDTC->WDTC_WDCR = 0xA5000001;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_WDTSGettatus

-//* \brief Get Watchdog Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_WDTSGettatus(

-        AT91PS_WDTC pWDTC)

-{

-	return(pWDTC->WDTC_WDSR & 0x3);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_WDTGetPeriod

-//* \brief Translate ms into Watchdog Compatible value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_WDTGetPeriod(unsigned int ms)

-{

-	if ((ms < 4) || (ms > 16000))

-		return 0;

-	return((ms << 8) / 1000);

-}

-/* *****************************************************************************

-                SOFTWARE API FOR VREG

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_VREG_Enable_LowPowerMode

-//* \brief Enable VREG Low Power Mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_VREG_Enable_LowPowerMode(

-        AT91PS_VREG pVREG)

-{

-	pVREG->VREG_MR |= AT91C_VREG_PSTDBY;	 

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_VREG_Disable_LowPowerMode

-//* \brief Disable VREG Low Power Mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_VREG_Disable_LowPowerMode(

-        AT91PS_VREG pVREG)

-{

-	pVREG->VREG_MR &= ~AT91C_VREG_PSTDBY;	 

-}/* *****************************************************************************

-                SOFTWARE API FOR MC

-   ***************************************************************************** */

-

-#define AT91C_MC_CORRECT_KEY  ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_Remap

-//* \brief Make Remap

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_Remap (void)     //  

-{

-    AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC;

-    

-    pMC->MC_RCR = AT91C_MC_RCB;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_CfgModeReg

-//* \brief Configure the EFC Mode Register of the MC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_EFC_CfgModeReg (

-	AT91PS_MC pMC, // pointer to a MC controller

-	unsigned int mode)        // mode register 

-{

-	// Write to the FMR register

-	pMC->MC_FMR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_GetModeReg

-//* \brief Return MC EFC Mode Regsiter

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_GetModeReg(

-	AT91PS_MC pMC) // pointer to a MC controller

-{

-	return pMC->MC_FMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_ComputeFMCN

-//* \brief Return MC EFC Mode Regsiter

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_ComputeFMCN(

-	int master_clock) // master clock in Hz

-{

-	return (master_clock/1000000 +2);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_PerformCmd

-//* \brief Perform EFC Command

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_EFC_PerformCmd (

-	AT91PS_MC pMC, // pointer to a MC controller

-    unsigned int transfer_cmd)

-{

-	pMC->MC_FCR = transfer_cmd;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_GetStatus

-//* \brief Return MC EFC Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_GetStatus(

-	AT91PS_MC pMC) // pointer to a MC controller

-{

-	return pMC->MC_FSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_IsInterruptMasked

-//* \brief Test if EFC MC Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_IsInterruptMasked(

-        AT91PS_MC pMC,   // \arg  pointer to a MC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_MC_EFC_GetModeReg(pMC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_IsInterruptSet

-//* \brief Test if EFC MC Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_IsInterruptSet(

-        AT91PS_MC pMC,   // \arg  pointer to a MC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_MC_EFC_GetStatus(pMC) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR SPI

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Open

-//* \brief Open a SPI Port

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_Open (

-        const unsigned int null)  // \arg

-{

-        /* NOT DEFINED AT THIS MOMENT */

-        return ( 0 );

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgCs

-//* \brief Configure SPI chip select register

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgCs (

-	AT91PS_SPI pSPI,     // pointer to a SPI controller

-	int cs,     // SPI cs number (0 to 3)

- 	int val)   //  chip select register

-{

-	//* Write to the CSR register

-	*(pSPI->SPI_CSR + cs) = val;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_EnableIt

-//* \brief Enable SPI interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_EnableIt (

-	AT91PS_SPI pSPI,     // pointer to a SPI controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pSPI->SPI_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_DisableIt

-//* \brief Disable SPI interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_DisableIt (

-	AT91PS_SPI pSPI, // pointer to a SPI controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pSPI->SPI_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Reset

-//* \brief Reset the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Reset (

-	AT91PS_SPI pSPI // pointer to a SPI controller

-	)

-{

-	//* Write to the CR register

-	pSPI->SPI_CR = AT91C_SPI_SWRST;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Enable

-//* \brief Enable the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Enable (

-	AT91PS_SPI pSPI // pointer to a SPI controller

-	)

-{

-	//* Write to the CR register

-	pSPI->SPI_CR = AT91C_SPI_SPIEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Disable

-//* \brief Disable the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Disable (

-	AT91PS_SPI pSPI // pointer to a SPI controller

-	)

-{

-	//* Write to the CR register

-	pSPI->SPI_CR = AT91C_SPI_SPIDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgMode

-//* \brief Enable the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgMode (

-	AT91PS_SPI pSPI, // pointer to a SPI controller

-	int mode)        // mode register 

-{

-	//* Write to the MR register

-	pSPI->SPI_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgPCS

-//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgPCS (

-	AT91PS_SPI pSPI, // pointer to a SPI controller

-	char PCS_Device) // PCS of the Device

-{	

- 	//* Write to the MR register

-	pSPI->SPI_MR &= 0xFFF0FFFF;

-	pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS );

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_ReceiveFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_ReceiveFrame (

-	AT91PS_SPI pSPI,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_ReceiveFrame(

-		(AT91PS_PDC) &(pSPI->SPI_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_SendFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_SendFrame(

-	AT91PS_SPI pSPI,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_SendFrame(

-		(AT91PS_PDC) &(pSPI->SPI_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Close

-//* \brief Close SPI: disable IT disable transfert, close PDC

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Close (

-	AT91PS_SPI pSPI)     // \arg pointer to a SPI controller

-{

-    //* Reset all the Chip Select register

-    pSPI->SPI_CSR[0] = 0 ;

-    pSPI->SPI_CSR[1] = 0 ;

-    pSPI->SPI_CSR[2] = 0 ;

-    pSPI->SPI_CSR[3] = 0 ;

-

-    //* Reset the SPI mode

-    pSPI->SPI_MR = 0  ;

-

-    //* Disable all interrupts

-    pSPI->SPI_IDR = 0xFFFFFFFF ;

-

-    //* Abort the Peripheral Data Transfers

-    AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR));

-

-    //* Disable receiver and transmitter and stop any activity immediately

-    pSPI->SPI_CR = AT91C_SPI_SPIDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_PutChar

-//* \brief Send a character,does not check if ready to send

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_PutChar (

-	AT91PS_SPI pSPI,

-	unsigned int character,

-             unsigned int cs_number )

-{

-    unsigned int value_for_cs;

-    value_for_cs = (~(1 << cs_number)) & 0xF;  //Place a zero among a 4 ONEs number

-    pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_GetChar

-//* \brief Receive a character,does not check if a character is available

-//*----------------------------------------------------------------------------

-__inline int AT91F_SPI_GetChar (

-	const AT91PS_SPI pSPI)

-{

-    return((pSPI->SPI_RDR) & 0xFFFF);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_GetInterruptMaskStatus

-//* \brief Return SPI Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status

-        AT91PS_SPI pSpi) // \arg  pointer to a SPI controller

-{

-        return pSpi->SPI_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_IsInterruptMasked

-//* \brief Test if SPI Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_SPI_IsInterruptMasked(

-        AT91PS_SPI pSpi,   // \arg  pointer to a SPI controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR USART

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Baudrate

-//* \brief Calculate the baudrate

-//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity

-#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \

-                        AT91C_US_NBSTOP_1_BIT + \

-                        AT91C_US_PAR_NONE + \

-                        AT91C_US_CHRL_8_BITS + \

-                        AT91C_US_CLKS_CLOCK )

-

-//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity

-#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \

-                            AT91C_US_NBSTOP_1_BIT + \

-                            AT91C_US_PAR_NONE + \

-                            AT91C_US_CHRL_8_BITS + \

-                            AT91C_US_CLKS_EXT )

-

-//* Standard Synchronous Mode : 8 bits , 1 stop , no parity

-#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \

-                       AT91C_US_USMODE_NORMAL + \

-                       AT91C_US_NBSTOP_1_BIT + \

-                       AT91C_US_PAR_NONE + \

-                       AT91C_US_CHRL_8_BITS + \

-                       AT91C_US_CLKS_CLOCK )

-

-//* SCK used Label

-#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT)

-

-//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity

-#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \

-					   		 AT91C_US_CLKS_CLOCK +\

-                       		 AT91C_US_NBSTOP_1_BIT + \

-                       		 AT91C_US_PAR_EVEN + \

-                       		 AT91C_US_CHRL_8_BITS + \

-                       		 AT91C_US_CKLO +\

-                       		 AT91C_US_OVER)

-

-//* Standard IRDA mode

-#define AT91C_US_ASYNC_IRDA_MODE (  AT91C_US_USMODE_IRDA + \

-                            AT91C_US_NBSTOP_1_BIT + \

-                            AT91C_US_PAR_NONE + \

-                            AT91C_US_CHRL_8_BITS + \

-                            AT91C_US_CLKS_CLOCK )

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Baudrate

-//* \brief Caluculate baud_value according to the main clock and the baud rate

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_Baudrate (

-	const unsigned int main_clock, // \arg peripheral clock

-	const unsigned int baud_rate)  // \arg UART baudrate

-{

-	unsigned int baud_value = ((main_clock*10)/(baud_rate * 16));

-	if ((baud_value % 10) >= 5)

-		baud_value = (baud_value / 10) + 1;

-	else

-		baud_value /= 10;

-	return baud_value;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SetBaudrate

-//* \brief Set the baudrate according to the CPU clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_SetBaudrate (

-	AT91PS_USART pUSART,    // \arg pointer to a USART controller

-	unsigned int mainClock, // \arg peripheral clock

-	unsigned int speed)     // \arg UART baudrate

-{

-	//* Define the baud rate divisor register

-	pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SetTimeguard

-//* \brief Set USART timeguard

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_SetTimeguard (

-	AT91PS_USART pUSART,    // \arg pointer to a USART controller

-	unsigned int timeguard) // \arg timeguard value

-{

-	//* Write the Timeguard Register

-	pUSART->US_TTGR = timeguard ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_EnableIt

-//* \brief Enable USART IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_EnableIt (

-	AT91PS_USART pUSART, // \arg pointer to a USART controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pUSART->US_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_DisableIt

-//* \brief Disable USART IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_DisableIt (

-	AT91PS_USART pUSART, // \arg pointer to a USART controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IER register

-	pUSART->US_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Configure

-//* \brief Configure USART

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_Configure (

-	AT91PS_USART pUSART,     // \arg pointer to a USART controller

-	unsigned int mainClock,  // \arg peripheral clock

-	unsigned int mode ,      // \arg mode Register to be programmed

-	unsigned int baudRate ,  // \arg baudrate to be programmed

-	unsigned int timeguard ) // \arg timeguard to be programmed

-{

-    //* Disable interrupts

-    pUSART->US_IDR = (unsigned int) -1;

-

-    //* Reset receiver and transmitter

-    pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ;

-

-	//* Define the baud rate divisor register

-	AT91F_US_SetBaudrate(pUSART, mainClock, baudRate);

-

-	//* Write the Timeguard Register

-	AT91F_US_SetTimeguard(pUSART, timeguard);

-

-    //* Clear Transmit and Receive Counters

-    AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR));

-

-    //* Define the USART mode

-    pUSART->US_MR = mode  ;

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_EnableRx

-//* \brief Enable receiving characters

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_EnableRx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Enable receiver

-    pUSART->US_CR = AT91C_US_RXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_EnableTx

-//* \brief Enable sending characters

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_EnableTx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Enable  transmitter

-    pUSART->US_CR = AT91C_US_TXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_ResetRx

-//* \brief Reset Receiver and re-enable it

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_ResetRx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-	//* Reset receiver

-	pUSART->US_CR = AT91C_US_RSTRX;

-    //* Re-Enable receiver

-    pUSART->US_CR = AT91C_US_RXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_ResetTx

-//* \brief Reset Transmitter and re-enable it

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_ResetTx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-	//* Reset transmitter

-	pUSART->US_CR = AT91C_US_RSTTX;

-    //* Enable transmitter

-    pUSART->US_CR = AT91C_US_TXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_DisableRx

-//* \brief Disable Receiver

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_DisableRx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Disable receiver

-    pUSART->US_CR = AT91C_US_RXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_DisableTx

-//* \brief Disable Transmitter

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_DisableTx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Disable transmitter

-    pUSART->US_CR = AT91C_US_TXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Close

-//* \brief Close USART: disable IT disable receiver and transmitter, close PDC

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_Close (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Reset the baud rate divisor register

-    pUSART->US_BRGR = 0 ;

-

-    //* Reset the USART mode

-    pUSART->US_MR = 0  ;

-

-    //* Reset the Timeguard Register

-    pUSART->US_TTGR = 0;

-

-    //* Disable all interrupts

-    pUSART->US_IDR = 0xFFFFFFFF ;

-

-    //* Abort the Peripheral Data Transfers

-    AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR));

-

-    //* Disable receiver and transmitter and stop any activity immediately

-    pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_TxReady

-//* \brief Return 1 if a character can be written in US_THR

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_TxReady (

-	AT91PS_USART pUSART )     // \arg pointer to a USART controller

-{

-    return (pUSART->US_CSR & AT91C_US_TXRDY);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_RxReady

-//* \brief Return 1 if a character can be read in US_RHR

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_RxReady (

-	AT91PS_USART pUSART )     // \arg pointer to a USART controller

-{

-    return (pUSART->US_CSR & AT91C_US_RXRDY);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Error

-//* \brief Return the error flag

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_Error (

-	AT91PS_USART pUSART )     // \arg pointer to a USART controller

-{

-    return (pUSART->US_CSR &

-    	(AT91C_US_OVRE |  // Overrun error

-    	 AT91C_US_FRAME | // Framing error

-    	 AT91C_US_PARE));  // Parity error

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_PutChar

-//* \brief Send a character,does not check if ready to send

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_PutChar (

-	AT91PS_USART pUSART,

-	int character )

-{

-    pUSART->US_THR = (character & 0x1FF);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_GetChar

-//* \brief Receive a character,does not check if a character is available

-//*----------------------------------------------------------------------------

-__inline int AT91F_US_GetChar (

-	const AT91PS_USART pUSART)

-{

-    return((pUSART->US_RHR) & 0x1FF);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SendFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_SendFrame(

-	AT91PS_USART pUSART,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_SendFrame(

-		(AT91PS_PDC) &(pUSART->US_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_ReceiveFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_ReceiveFrame (

-	AT91PS_USART pUSART,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_ReceiveFrame(

-		(AT91PS_PDC) &(pUSART->US_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SetIrdaFilter

-//* \brief Set the value of IrDa filter tregister

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_SetIrdaFilter (

-	AT91PS_USART pUSART,

-	unsigned char value

-)

-{

-	pUSART->US_IF = value;

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR SSC

-   ***************************************************************************** */

-//* Define the standard I2S mode configuration

-

-//* Configuration to set in the SSC Transmit Clock Mode Register

-//* Parameters :  nb_bit_by_slot : 8, 16 or 32 bits

-//* 			  nb_slot_by_frame : number of channels

-#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\

-									   AT91C_SSC_CKS_DIV   +\

-                            		   AT91C_SSC_CKO_CONTINOUS      +\

-                            		   AT91C_SSC_CKG_NONE    +\

-                                       AT91C_SSC_START_FALL_RF +\

-                           			   AT91C_SSC_STTOUT  +\

-                            		   ((1<<16) & AT91C_SSC_STTDLY) +\

-                            		   ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24))

-

-

-//* Configuration to set in the SSC Transmit Frame Mode Register

-//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits

-//* 			 nb_slot_by_frame : number of channels

-#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\

-									(nb_bit_by_slot-1)  +\

-                            		AT91C_SSC_MSBF   +\

-                            		(((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB)  +\

-                            		(((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\

-                            		AT91C_SSC_FSOS_NEGATIVE)

-

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_SetBaudrate

-//* \brief Set the baudrate according to the CPU clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_SetBaudrate (

-        AT91PS_SSC pSSC,        // \arg pointer to a SSC controller

-        unsigned int mainClock, // \arg peripheral clock

-        unsigned int speed)     // \arg SSC baudrate

-{

-        unsigned int baud_value;

-        //* Define the baud rate divisor register

-        if (speed == 0)

-           baud_value = 0;

-        else

-        {

-           baud_value = (unsigned int) (mainClock * 10)/(2*speed);

-           if ((baud_value % 10) >= 5)

-                  baud_value = (baud_value / 10) + 1;

-           else

-                  baud_value /= 10;

-        }

-

-        pSSC->SSC_CMR = baud_value;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_Configure

-//* \brief Configure SSC

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_Configure (

-             AT91PS_SSC pSSC,          // \arg pointer to a SSC controller

-             unsigned int syst_clock,  // \arg System Clock Frequency

-             unsigned int baud_rate,   // \arg Expected Baud Rate Frequency

-             unsigned int clock_rx,    // \arg Receiver Clock Parameters

-             unsigned int mode_rx,     // \arg mode Register to be programmed

-             unsigned int clock_tx,    // \arg Transmitter Clock Parameters

-             unsigned int mode_tx)     // \arg mode Register to be programmed

-{

-    //* Disable interrupts

-	pSSC->SSC_IDR = (unsigned int) -1;

-

-    //* Reset receiver and transmitter

-	pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ;

-

-    //* Define the Clock Mode Register

-	AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate);

-

-     //* Write the Receive Clock Mode Register

-	pSSC->SSC_RCMR =  clock_rx;

-

-     //* Write the Transmit Clock Mode Register

-	pSSC->SSC_TCMR =  clock_tx;

-

-     //* Write the Receive Frame Mode Register

-	pSSC->SSC_RFMR =  mode_rx;

-

-     //* Write the Transmit Frame Mode Register

-	pSSC->SSC_TFMR =  mode_tx;

-

-    //* Clear Transmit and Receive Counters

-	AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR));

-

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_EnableRx

-//* \brief Enable receiving datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_EnableRx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Enable receiver

-    pSSC->SSC_CR = AT91C_SSC_RXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_DisableRx

-//* \brief Disable receiving datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_DisableRx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Disable receiver

-    pSSC->SSC_CR = AT91C_SSC_RXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_EnableTx

-//* \brief Enable sending datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_EnableTx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Enable  transmitter

-    pSSC->SSC_CR = AT91C_SSC_TXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_DisableTx

-//* \brief Disable sending datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_DisableTx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Disable  transmitter

-    pSSC->SSC_CR = AT91C_SSC_TXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_EnableIt

-//* \brief Enable SSC IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_EnableIt (

-	AT91PS_SSC pSSC, // \arg pointer to a SSC controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pSSC->SSC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_DisableIt

-//* \brief Disable SSC IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_DisableIt (

-	AT91PS_SSC pSSC, // \arg pointer to a SSC controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IDR register

-	pSSC->SSC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_ReceiveFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SSC_ReceiveFrame (

-	AT91PS_SSC pSSC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_ReceiveFrame(

-		(AT91PS_PDC) &(pSSC->SSC_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_SendFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SSC_SendFrame(

-	AT91PS_SSC pSSC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_SendFrame(

-		(AT91PS_PDC) &(pSSC->SSC_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_GetInterruptMaskStatus

-//* \brief Return SSC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status

-        AT91PS_SSC pSsc) // \arg  pointer to a SSC controller

-{

-        return pSsc->SSC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_IsInterruptMasked

-//* \brief Test if SSC Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_SSC_IsInterruptMasked(

-        AT91PS_SSC pSsc,   // \arg  pointer to a SSC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR TWI

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_EnableIt

-//* \brief Enable TWI IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_EnableIt (

-	AT91PS_TWI pTWI, // \arg pointer to a TWI controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pTWI->TWI_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_DisableIt

-//* \brief Disable TWI IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_DisableIt (

-	AT91PS_TWI pTWI, // \arg pointer to a TWI controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IDR register

-	pTWI->TWI_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_Configure

-//* \brief Configure TWI in master mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI )          // \arg pointer to a TWI controller

-{

-    //* Disable interrupts

-	pTWI->TWI_IDR = (unsigned int) -1;

-

-    //* Reset peripheral

-	pTWI->TWI_CR = AT91C_TWI_SWRST;

-

-	//* Set Master mode

-	pTWI->TWI_CR = AT91C_TWI_MSEN;

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_GetInterruptMaskStatus

-//* \brief Return TWI Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status

-        AT91PS_TWI pTwi) // \arg  pointer to a TWI controller

-{

-        return pTwi->TWI_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_IsInterruptMasked

-//* \brief Test if TWI Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_TWI_IsInterruptMasked(

-        AT91PS_TWI pTwi,   // \arg  pointer to a TWI controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR PWMC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_GetStatus

-//* \brief Return PWM Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status

-	AT91PS_PWMC pPWM) // pointer to a PWM controller

-{

-	return pPWM->PWMC_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_InterruptEnable

-//* \brief Enable PWM Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_InterruptEnable(

-        AT91PS_PWMC pPwm,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  PWM interrupt to be enabled

-{

-        pPwm->PWMC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_InterruptDisable

-//* \brief Disable PWM Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_InterruptDisable(

-        AT91PS_PWMC pPwm,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  PWM interrupt to be disabled

-{

-        pPwm->PWMC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_GetInterruptMaskStatus

-//* \brief Return PWM Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status

-        AT91PS_PWMC pPwm) // \arg  pointer to a PWM controller

-{

-        return pPwm->PWMC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_IsInterruptMasked

-//* \brief Test if PWM Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_IsInterruptMasked(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_IsStatusSet

-//* \brief Test if PWM Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_IsStatusSet(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PWMC_GetStatus(pPWM) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_CfgChannel

-//* \brief Test if PWM Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CfgChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int channelId, // \arg PWM channel ID

-        unsigned int mode, // \arg  PWM mode

-        unsigned int period, // \arg PWM period

-        unsigned int duty) // \arg PWM duty cycle

-{

-	pPWM->PWMC_CH[channelId].PWMC_CMR = mode;

-	pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty;

-	pPWM->PWMC_CH[channelId].PWMC_CPRDR = period;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_StartChannel

-//* \brief Enable channel

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_StartChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  Channels IDs to be enabled

-{

-	pPWM->PWMC_ENA = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_StopChannel

-//* \brief Disable channel

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_StopChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  Channels IDs to be enabled

-{

-	pPWM->PWMC_DIS = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_UpdateChannel

-//* \brief Update Period or Duty Cycle

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_UpdateChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int channelId, // \arg PWM channel ID

-        unsigned int update) // \arg  Channels IDs to be enabled

-{

-	pPWM->PWMC_CH[channelId].PWMC_CUPDR = update;

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR UDP

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EnableIt

-//* \brief Enable UDP IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EnableIt (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pUDP->UDP_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_DisableIt

-//* \brief Disable UDP IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_DisableIt (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IDR register

-	pUDP->UDP_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_SetAddress

-//* \brief Set UDP functional address

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_SetAddress (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned char address)   // \arg new UDP address

-{

-	pUDP->UDP_FADDR = (AT91C_UDP_FEN | address);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EnableEp

-//* \brief Enable Endpoint

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EnableEp (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned char endpoint)   // \arg endpoint number

-{

-	pUDP->UDP_CSR[endpoint] |= AT91C_UDP_EPEDS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_DisableEp

-//* \brief Enable Endpoint

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_DisableEp (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned char endpoint)   // \arg endpoint number

-{

-	pUDP->UDP_CSR[endpoint] &= ~AT91C_UDP_EPEDS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_SetState

-//* \brief Set UDP Device state

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_SetState (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg new UDP address

-{

-	pUDP->UDP_GLBSTATE  &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG);

-	pUDP->UDP_GLBSTATE  |= flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_GetState

-//* \brief return UDP Device state

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state

-	AT91PS_UDP pUDP)     // \arg pointer to a UDP controller

-{

-	return (pUDP->UDP_GLBSTATE  & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_ResetEp

-//* \brief Reset UDP endpoint

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_ResetEp ( // \return the UDP device state

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg Endpoints to be reset

-{

-	pUDP->UDP_RSTEP = flag;

-	pUDP->UDP_RSTEP = 0;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpStall

-//* \brief Endpoint will STALL requests

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpStall(

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned char endpoint)   // \arg endpoint number

-{

-	pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpWrite

-//* \brief Write value in the DPR

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpWrite(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint,  // \arg endpoint number

-	unsigned char value)     // \arg value to be written in the DPR

-{

-	pUDP->UDP_FDR[endpoint] = value;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpRead

-//* \brief Return value from the DPR

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_EpRead(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint)  // \arg endpoint number

-{

-	return pUDP->UDP_FDR[endpoint];

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpEndOfWr

-//* \brief Notify the UDP that values in DPR are ready to be sent

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpEndOfWr(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint)  // \arg endpoint number

-{

-	pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpClear

-//* \brief Clear flag in the endpoint CSR register

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpClear(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint,  // \arg endpoint number

-	unsigned int flag)       // \arg flag to be cleared

-{

-	pUDP->UDP_CSR[endpoint] &= ~(flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpSet

-//* \brief Set flag in the endpoint CSR register

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpSet(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint,  // \arg endpoint number

-	unsigned int flag)       // \arg flag to be cleared

-{

-	pUDP->UDP_CSR[endpoint] |= flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpStatus

-//* \brief Return the endpoint CSR register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_EpStatus(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint)  // \arg endpoint number

-{

-	return pUDP->UDP_CSR[endpoint];

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_GetInterruptMaskStatus

-//* \brief Return UDP Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status

-        AT91PS_UDP pUdp) // \arg  pointer to a UDP controller

-{

-        return pUdp->UDP_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_IsInterruptMasked

-//* \brief Test if UDP Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_UDP_IsInterruptMasked(

-        AT91PS_UDP pUdp,   // \arg  pointer to a UDP controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR TC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_InterruptEnable

-//* \brief Enable TC Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC_InterruptEnable(

-        AT91PS_TC pTc,   // \arg  pointer to a TC controller

-        unsigned int flag) // \arg  TC interrupt to be enabled

-{

-        pTc->TC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_InterruptDisable

-//* \brief Disable TC Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC_InterruptDisable(

-        AT91PS_TC pTc,   // \arg  pointer to a TC controller

-        unsigned int flag) // \arg  TC interrupt to be disabled

-{

-        pTc->TC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_GetInterruptMaskStatus

-//* \brief Return TC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status

-        AT91PS_TC pTc) // \arg  pointer to a TC controller

-{

-        return pTc->TC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_IsInterruptMasked

-//* \brief Test if TC Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline int AT91F_TC_IsInterruptMasked(

-        AT91PS_TC pTc,   // \arg  pointer to a TC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR CAN

-   ***************************************************************************** */

-#define	STANDARD_FORMAT 0

-#define	EXTENDED_FORMAT 1

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_InitMailboxRegisters()

-//* \brief Configure the corresponding mailbox

-//*----------------------------------------------------------------------------

-__inline void AT91F_InitMailboxRegisters(AT91PS_CAN_MB	CAN_Mailbox,

-								int  			mode_reg,

-								int 			acceptance_mask_reg,

-								int  			id_reg,

-								int  			data_low_reg,

-								int  			data_high_reg,

-								int  			control_reg)

-{

-	CAN_Mailbox->CAN_MB_MCR 	= 0x0;

-	CAN_Mailbox->CAN_MB_MMR 	= mode_reg;

-	CAN_Mailbox->CAN_MB_MAM 	= acceptance_mask_reg;

-	CAN_Mailbox->CAN_MB_MID 	= id_reg;

-	CAN_Mailbox->CAN_MB_MDL 	= data_low_reg; 		

-	CAN_Mailbox->CAN_MB_MDH 	= data_high_reg;

-	CAN_Mailbox->CAN_MB_MCR 	= control_reg;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_EnableCAN()

-//* \brief 

-//*----------------------------------------------------------------------------

-__inline void AT91F_EnableCAN(

-	AT91PS_CAN pCAN)     // pointer to a CAN controller

-{

-	pCAN->CAN_MR |= AT91C_CAN_CANEN;

-

-	// Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver

-	while( (pCAN->CAN_SR & AT91C_CAN_WAKEUP) != AT91C_CAN_WAKEUP );

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DisableCAN()

-//* \brief 

-//*----------------------------------------------------------------------------

-__inline void AT91F_DisableCAN(

-	AT91PS_CAN pCAN)     // pointer to a CAN controller

-{

-	pCAN->CAN_MR &= ~AT91C_CAN_CANEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_EnableIt

-//* \brief Enable CAN interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_EnableIt (

-	AT91PS_CAN pCAN,     // pointer to a CAN controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pCAN->CAN_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_DisableIt

-//* \brief Disable CAN interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_DisableIt (

-	AT91PS_CAN pCAN, // pointer to a CAN controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pCAN->CAN_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetStatus

-//* \brief Return CAN Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetStatus( // \return CAN Interrupt Status

-	AT91PS_CAN pCAN) // pointer to a CAN controller

-{

-	return pCAN->CAN_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetInterruptMaskStatus

-//* \brief Return CAN Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetInterruptMaskStatus( // \return CAN Interrupt Mask Status

-	AT91PS_CAN pCAN) // pointer to a CAN controller

-{

-	return pCAN->CAN_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_IsInterruptMasked

-//* \brief Test if CAN Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_IsInterruptMasked(

-        AT91PS_CAN pCAN,   // \arg  pointer to a CAN controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_CAN_GetInterruptMaskStatus(pCAN) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_IsStatusSet

-//* \brief Test if CAN Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_IsStatusSet(

-        AT91PS_CAN pCAN,   // \arg  pointer to a CAN controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_CAN_GetStatus(pCAN) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgModeReg

-//* \brief Configure the Mode Register of the CAN controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgModeReg (

-	AT91PS_CAN pCAN, // pointer to a CAN controller

-	unsigned int mode)        // mode register 

-{

-	//* Write to the MR register

-	pCAN->CAN_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetModeReg

-//* \brief Return the Mode Register of the CAN controller value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetModeReg (

-	AT91PS_CAN pCAN // pointer to a CAN controller

-	)

-{

-	return pCAN->CAN_MR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgBaudrateReg

-//* \brief Configure the Baudrate of the CAN controller for the network

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgBaudrateReg (

-	AT91PS_CAN pCAN, // pointer to a CAN controller

-	unsigned int baudrate_cfg)

-{

-	//* Write to the BR register

-	pCAN->CAN_BR = baudrate_cfg;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetBaudrate

-//* \brief Return the Baudrate of the CAN controller for the network value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetBaudrate (

-	AT91PS_CAN pCAN // pointer to a CAN controller

-	)

-{

-	return pCAN->CAN_BR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetInternalCounter

-//* \brief Return CAN Timer Regsiter Value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetInternalCounter (

-	AT91PS_CAN pCAN // pointer to a CAN controller

-	)

-{

-	return pCAN->CAN_TIM;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetTimestamp

-//* \brief Return CAN Timestamp Register Value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetTimestamp (

-	AT91PS_CAN pCAN // pointer to a CAN controller

-	)

-{

-	return pCAN->CAN_TIMESTP;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetErrorCounter

-//* \brief Return CAN Error Counter Register Value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetErrorCounter (

-	AT91PS_CAN pCAN // pointer to a CAN controller

-	)

-{

-	return pCAN->CAN_ECR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_InitTransferRequest

-//* \brief Request for a transfer on the corresponding mailboxes

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_InitTransferRequest (

-	AT91PS_CAN pCAN, // pointer to a CAN controller

-    unsigned int transfer_cmd)

-{

-	pCAN->CAN_TCR = transfer_cmd;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_InitAbortRequest

-//* \brief Abort the corresponding mailboxes

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_InitAbortRequest (

-	AT91PS_CAN pCAN, // pointer to a CAN controller

-    unsigned int abort_cmd)

-{

-	pCAN->CAN_ACR = abort_cmd;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageModeReg

-//* \brief Program the Message Mode Register

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageModeReg (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int mode)

-{

-	CAN_Mailbox->CAN_MB_MMR = mode;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageModeReg

-//* \brief Return the Message Mode Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageModeReg (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MMR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageIDReg

-//* \brief Program the Message ID Register

-//* \brief Version == 0 for Standard messsage, Version == 1 for Extended  

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageIDReg (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int id,

-    unsigned char version)

-{

-	if(version==0)	// IDvA Standard Format

-		CAN_Mailbox->CAN_MB_MID = id<<18;

-	else	// IDvB Extended Format

-		CAN_Mailbox->CAN_MB_MID = id | (1<<29);	// set MIDE bit

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageIDReg

-//* \brief Return the Message ID Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageIDReg (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MID;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageAcceptanceMaskReg

-//* \brief Program the Message Acceptance Mask Register

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageAcceptanceMaskReg (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int mask)

-{

-	CAN_Mailbox->CAN_MB_MAM = mask;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageAcceptanceMaskReg

-//* \brief Return the Message Acceptance Mask Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageAcceptanceMaskReg (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MAM;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetFamilyID

-//* \brief Return the Message ID Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetFamilyID (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MFID;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageCtrl

-//* \brief Request and config for a transfer on the corresponding mailbox

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageCtrlReg (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int message_ctrl_cmd)

-{

-	CAN_Mailbox->CAN_MB_MCR = message_ctrl_cmd;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageStatus

-//* \brief Return CAN Mailbox Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageStatus (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MSR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageDataLow

-//* \brief Program data low value

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageDataLow (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int data)

-{

-	CAN_Mailbox->CAN_MB_MDL = data;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageDataLow

-//* \brief Return data low value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageDataLow (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MDL;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageDataHigh

-//* \brief Program data high value

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageDataHigh (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int data)

-{

-	CAN_Mailbox->CAN_MB_MDH = data;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageDataHigh

-//* \brief Return data high value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageDataHigh (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MDH;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_Open

-//* \brief Open a CAN Port

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_Open (

-        const unsigned int null)  // \arg

-{

-        /* NOT DEFINED AT THIS MOMENT */

-        return ( 0 );

-}

-/* *****************************************************************************

-                SOFTWARE API FOR ADC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_EnableIt

-//* \brief Enable ADC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_EnableIt (

-	AT91PS_ADC pADC,     // pointer to a ADC controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pADC->ADC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_DisableIt

-//* \brief Disable ADC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_DisableIt (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pADC->ADC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetStatus

-//* \brief Return ADC Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status

-	AT91PS_ADC pADC) // pointer to a ADC controller

-{

-	return pADC->ADC_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetInterruptMaskStatus

-//* \brief Return ADC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status

-	AT91PS_ADC pADC) // pointer to a ADC controller

-{

-	return pADC->ADC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_IsInterruptMasked

-//* \brief Test if ADC Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_IsInterruptMasked(

-        AT91PS_ADC pADC,   // \arg  pointer to a ADC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_IsStatusSet

-//* \brief Test if ADC Status is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_IsStatusSet(

-        AT91PS_ADC pADC,   // \arg  pointer to a ADC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_ADC_GetStatus(pADC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgModeReg

-//* \brief Configure the Mode Register of the ADC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgModeReg (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int mode)        // mode register 

-{

-	//* Write to the MR register

-	pADC->ADC_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetModeReg

-//* \brief Return the Mode Register of the ADC controller value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetModeReg (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_MR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgTimings

-//* \brief Configure the different necessary timings of the ADC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgTimings (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int mck_clock, // in MHz 

-	unsigned int adc_clock, // in MHz 

-	unsigned int startup_time, // in us 

-	unsigned int sample_and_hold_time)	// in ns  

-{

-	unsigned int prescal,startup,shtim;

-	

-	prescal = mck_clock/(2*adc_clock) - 1;

-	startup = adc_clock*startup_time/8 - 1;

-	shtim = adc_clock*sample_and_hold_time/1000 - 1;

-	

-	//* Write to the MR register

-	pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_EnableChannel

-//* \brief Return ADC Timer Register Value

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_EnableChannel (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int channel)        // mode register 

-{

-	//* Write to the CHER register

-	pADC->ADC_CHER = channel;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_DisableChannel

-//* \brief Return ADC Timer Register Value

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_DisableChannel (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int channel)        // mode register 

-{

-	//* Write to the CHDR register

-	pADC->ADC_CHDR = channel;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetChannelStatus

-//* \brief Return ADC Timer Register Value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetChannelStatus (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CHSR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_StartConversion

-//* \brief Software request for a analog to digital conversion 

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_StartConversion (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	pADC->ADC_CR = AT91C_ADC_START;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_SoftReset

-//* \brief Software reset

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_SoftReset (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	pADC->ADC_CR = AT91C_ADC_SWRST;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetLastConvertedData

-//* \brief Return the Last Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetLastConvertedData (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_LCDR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH0

-//* \brief Return the Channel 0 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH0 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR0;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH1

-//* \brief Return the Channel 1 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH1 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR1;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH2

-//* \brief Return the Channel 2 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH2 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR2;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH3

-//* \brief Return the Channel 3 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH3 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR3;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH4

-//* \brief Return the Channel 4 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH4 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR4;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH5

-//* \brief Return the Channel 5 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH5 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR5;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH6

-//* \brief Return the Channel 6 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH6 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR6;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH7

-//* \brief Return the Channel 7 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH7 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR7;	

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR AES

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_EnableIt

-//* \brief Enable AES interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_EnableIt (

-	AT91PS_AES pAES,     // pointer to a AES controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pAES->AES_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_DisableIt

-//* \brief Disable AES interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_DisableIt (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pAES->AES_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_GetStatus

-//* \brief Return AES Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_GetStatus( // \return AES Interrupt Status

-	AT91PS_AES pAES) // pointer to a AES controller

-{

-	return pAES->AES_ISR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_GetInterruptMaskStatus

-//* \brief Return AES Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_GetInterruptMaskStatus( // \return AES Interrupt Mask Status

-	AT91PS_AES pAES) // pointer to a AES controller

-{

-	return pAES->AES_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_IsInterruptMasked

-//* \brief Test if AES Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_IsInterruptMasked(

-        AT91PS_AES pAES,   // \arg  pointer to a AES controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_AES_GetInterruptMaskStatus(pAES) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_IsStatusSet

-//* \brief Test if AES Status is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_IsStatusSet(

-        AT91PS_AES pAES,   // \arg  pointer to a AES controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_AES_GetStatus(pAES) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_CfgModeReg

-//* \brief Configure the Mode Register of the AES controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_CfgModeReg (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned int mode)        // mode register 

-{

-	//* Write to the MR register

-	pAES->AES_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_GetModeReg

-//* \brief Return the Mode Register of the AES controller value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_GetModeReg (

-	AT91PS_AES pAES // pointer to a AES controller

-	)

-{

-	return pAES->AES_MR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_StartProcessing

-//* \brief Start Encryption or Decryption

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_StartProcessing (

-	AT91PS_AES pAES // pointer to a AES controller

-	)

-{

-	pAES->AES_CR = AT91C_AES_START;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_SoftReset

-//* \brief Reset AES

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_SoftReset (

-	AT91PS_AES pAES // pointer to a AES controller

-	)

-{

-	pAES->AES_CR = AT91C_AES_SWRST;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_LoadNewSeed

-//* \brief Load New Seed in the random number generator

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_LoadNewSeed (

-	AT91PS_AES pAES // pointer to a AES controller

-	)

-{

-	pAES->AES_CR = AT91C_AES_LOADSEED;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_SetCryptoKey

-//* \brief Set Cryptographic Key x

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_SetCryptoKey (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned char index,

-	unsigned int keyword

-	)

-{

-	pAES->AES_KEYWxR[index] = keyword;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_InputData

-//* \brief Set Input Data x

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_InputData (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned char index,

-	unsigned int indata

-	)

-{

-	pAES->AES_IDATAxR[index] = indata;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_GetOutputData

-//* \brief Get Output Data x

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_GetOutputData (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned char index

-	)

-{

-	return pAES->AES_ODATAxR[index];	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_SetInitializationVector

-//* \brief Set Initialization Vector (or Counter) x

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_SetInitializationVector (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned char index,

-	unsigned int initvector

-	)

-{

-	pAES->AES_IVxR[index] = initvector;	

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR TDES

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_EnableIt

-//* \brief Enable TDES interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_EnableIt (

-	AT91PS_TDES pTDES,     // pointer to a TDES controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pTDES->TDES_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_DisableIt

-//* \brief Disable TDES interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_DisableIt (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pTDES->TDES_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_GetStatus

-//* \brief Return TDES Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_GetStatus( // \return TDES Interrupt Status

-	AT91PS_TDES pTDES) // pointer to a TDES controller

-{

-	return pTDES->TDES_ISR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_GetInterruptMaskStatus

-//* \brief Return TDES Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_GetInterruptMaskStatus( // \return TDES Interrupt Mask Status

-	AT91PS_TDES pTDES) // pointer to a TDES controller

-{

-	return pTDES->TDES_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_IsInterruptMasked

-//* \brief Test if TDES Interrupt is Masked 

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_IsInterruptMasked(

-        AT91PS_TDES pTDES,   // \arg  pointer to a TDES controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_TDES_GetInterruptMaskStatus(pTDES) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_IsStatusSet

-//* \brief Test if TDES Status is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_IsStatusSet(

-        AT91PS_TDES pTDES,   // \arg  pointer to a TDES controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_TDES_GetStatus(pTDES) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_CfgModeReg

-//* \brief Configure the Mode Register of the TDES controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_CfgModeReg (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned int mode)        // mode register 

-{

-	//* Write to the MR register

-	pTDES->TDES_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_GetModeReg

-//* \brief Return the Mode Register of the TDES controller value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_GetModeReg (

-	AT91PS_TDES pTDES // pointer to a TDES controller

-	)

-{

-	return pTDES->TDES_MR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_StartProcessing

-//* \brief Start Encryption or Decryption

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_StartProcessing (

-	AT91PS_TDES pTDES // pointer to a TDES controller

-	)

-{

-	pTDES->TDES_CR = AT91C_TDES_START;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_SoftReset

-//* \brief Reset TDES

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_SoftReset (

-	AT91PS_TDES pTDES // pointer to a TDES controller

-	)

-{

-	pTDES->TDES_CR = AT91C_TDES_SWRST;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_SetCryptoKey1

-//* \brief Set Cryptographic Key 1 Word x

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_SetCryptoKey1 (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index,

-	unsigned int keyword

-	)

-{

-	pTDES->TDES_KEY1WxR[index] = keyword;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_SetCryptoKey2

-//* \brief Set Cryptographic Key 2 Word x

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_SetCryptoKey2 (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index,

-	unsigned int keyword

-	)

-{

-	pTDES->TDES_KEY2WxR[index] = keyword;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_SetCryptoKey3

-//* \brief Set Cryptographic Key 3 Word x

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_SetCryptoKey3 (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index,

-	unsigned int keyword

-	)

-{

-	pTDES->TDES_KEY3WxR[index] = keyword;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_InputData

-//* \brief Set Input Data x

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_InputData (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index,

-	unsigned int indata

-	)

-{

-	pTDES->TDES_IDATAxR[index] = indata;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_GetOutputData

-//* \brief Get Output Data x

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_GetOutputData (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index

-	)

-{

-	return pTDES->TDES_ODATAxR[index];	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_SetInitializationVector

-//* \brief Set Initialization Vector x

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_SetInitializationVector (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index,

-	unsigned int initvector

-	)

-{

-	pTDES->TDES_IVxR[index] = initvector;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  DBGU

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_CfgPIO

-//* \brief Configure PIO controllers to drive DBGU signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA27_DRXD    ) |

-		((unsigned int) AT91C_PA28_DTXD    ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PMC

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgPIO

-//* \brief Configure PIO controllers to drive PMC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB30_PCK2    ) |

-		((unsigned int) AT91C_PB29_PCK1    ), // Peripheral A

-		((unsigned int) AT91C_PB20_PCK0    ) |

-		((unsigned int) AT91C_PB0_PCK0    ) |

-		((unsigned int) AT91C_PB22_PCK2    ) |

-		((unsigned int) AT91C_PB21_PCK1    )); // Peripheral B

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA30_PCK2    ) |

-		((unsigned int) AT91C_PA13_PCK1    ) |

-		((unsigned int) AT91C_PA27_PCK3    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_VREG_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  VREG

-//*----------------------------------------------------------------------------

-__inline void AT91F_VREG_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  RSTC

-//*----------------------------------------------------------------------------

-__inline void AT91F_RSTC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  SSC

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SSC));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_CfgPIO

-//* \brief Configure PIO controllers to drive SSC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA25_RK      ) |

-		((unsigned int) AT91C_PA22_TK      ) |

-		((unsigned int) AT91C_PA21_TF      ) |

-		((unsigned int) AT91C_PA24_RD      ) |

-		((unsigned int) AT91C_PA26_RF      ) |

-		((unsigned int) AT91C_PA23_TD      ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_WDTC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  WDTC

-//*----------------------------------------------------------------------------

-__inline void AT91F_WDTC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US1_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  US1

-//*----------------------------------------------------------------------------

-__inline void AT91F_US1_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_US1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US1_CfgPIO

-//* \brief Configure PIO controllers to drive US1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_US1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PB26_RI1     ) |

-		((unsigned int) AT91C_PB24_DSR1    ) |

-		((unsigned int) AT91C_PB23_DCD1    ) |

-		((unsigned int) AT91C_PB25_DTR1    )); // Peripheral B

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA7_SCK1    ) |

-		((unsigned int) AT91C_PA8_RTS1    ) |

-		((unsigned int) AT91C_PA6_TXD1    ) |

-		((unsigned int) AT91C_PA5_RXD1    ) |

-		((unsigned int) AT91C_PA9_CTS1    ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US0_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  US0

-//*----------------------------------------------------------------------------

-__inline void AT91F_US0_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_US0));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US0_CfgPIO

-//* \brief Configure PIO controllers to drive US0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_US0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA0_RXD0    ) |

-		((unsigned int) AT91C_PA4_CTS0    ) |

-		((unsigned int) AT91C_PA3_RTS0    ) |

-		((unsigned int) AT91C_PA2_SCK0    ) |

-		((unsigned int) AT91C_PA1_TXD0    ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI1_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  SPI1

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI1_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SPI1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI1_CfgPIO

-//* \brief Configure PIO controllers to drive SPI1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PB16_NPCS13  ) |

-		((unsigned int) AT91C_PB10_NPCS11  ) |

-		((unsigned int) AT91C_PB11_NPCS12  )); // Peripheral B

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA4_NPCS13  ) |

-		((unsigned int) AT91C_PA29_NPCS13  ) |

-		((unsigned int) AT91C_PA21_NPCS10  ) |

-		((unsigned int) AT91C_PA22_SPCK1   ) |

-		((unsigned int) AT91C_PA25_NPCS11  ) |

-		((unsigned int) AT91C_PA2_NPCS11  ) |

-		((unsigned int) AT91C_PA24_MISO1   ) |

-		((unsigned int) AT91C_PA3_NPCS12  ) |

-		((unsigned int) AT91C_PA26_NPCS12  ) |

-		((unsigned int) AT91C_PA23_MOSI1   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI0_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  SPI0

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI0_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SPI0));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI0_CfgPIO

-//* \brief Configure PIO controllers to drive SPI0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PB13_NPCS01  ) |

-		((unsigned int) AT91C_PB17_NPCS03  ) |

-		((unsigned int) AT91C_PB14_NPCS02  )); // Peripheral B

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA16_MISO0   ) |

-		((unsigned int) AT91C_PA13_NPCS01  ) |

-		((unsigned int) AT91C_PA15_NPCS03  ) |

-		((unsigned int) AT91C_PA17_MOSI0   ) |

-		((unsigned int) AT91C_PA18_SPCK0   ) |

-		((unsigned int) AT91C_PA14_NPCS02  ) |

-		((unsigned int) AT91C_PA12_NPCS00  ), // Peripheral A

-		((unsigned int) AT91C_PA7_NPCS01  ) |

-		((unsigned int) AT91C_PA9_NPCS03  ) |

-		((unsigned int) AT91C_PA8_NPCS02  )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PITC

-//*----------------------------------------------------------------------------

-__inline void AT91F_PITC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  AIC

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_FIQ) |

-		((unsigned int) 1 << AT91C_ID_IRQ0) |

-		((unsigned int) 1 << AT91C_ID_IRQ1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_CfgPIO

-//* \brief Configure PIO controllers to drive AIC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA30_IRQ0    ) |

-		((unsigned int) AT91C_PA29_FIQ     ), // Peripheral A

-		((unsigned int) AT91C_PA14_IRQ1    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  AES

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_AES));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TWI

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TWI));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_CfgPIO

-//* \brief Configure PIO controllers to drive TWI signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA11_TWCK    ) |

-		((unsigned int) AT91C_PA10_TWD     ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  ADC

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_ADC));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgPIO

-//* \brief Configure PIO controllers to drive ADC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PB18_ADTRG   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH3_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH3 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH3_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB22_PWM3    ), // Peripheral A

-		((unsigned int) AT91C_PB30_PWM3    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH2_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH2 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH2_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB21_PWM2    ), // Peripheral A

-		((unsigned int) AT91C_PB29_PWM2    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH1_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB20_PWM1    ), // Peripheral A

-		((unsigned int) AT91C_PB28_PWM1    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH0_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB19_PWM0    ), // Peripheral A

-		((unsigned int) AT91C_PB27_PWM0    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RTTC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  RTTC

-//*----------------------------------------------------------------------------

-__inline void AT91F_RTTC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  UDP

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_UDP));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TDES

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TDES));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_EMAC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  EMAC

-//*----------------------------------------------------------------------------

-__inline void AT91F_EMAC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_EMAC));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_EMAC_CfgPIO

-//* \brief Configure PIO controllers to drive EMAC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_EMAC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB2_ETX0    ) |

-		((unsigned int) AT91C_PB12_ETXER   ) |

-		((unsigned int) AT91C_PB16_ECOL    ) |

-		((unsigned int) AT91C_PB11_ETX3    ) |

-		((unsigned int) AT91C_PB6_ERX1    ) |

-		((unsigned int) AT91C_PB15_ERXDV   ) |

-		((unsigned int) AT91C_PB13_ERX2    ) |

-		((unsigned int) AT91C_PB3_ETX1    ) |

-		((unsigned int) AT91C_PB8_EMDC    ) |

-		((unsigned int) AT91C_PB5_ERX0    ) |

-		//((unsigned int) AT91C_PB18_EF100   ) |

-		((unsigned int) AT91C_PB14_ERX3    ) |

-		((unsigned int) AT91C_PB4_ECRS_ECRSDV) |

-		((unsigned int) AT91C_PB1_ETXEN   ) |

-		((unsigned int) AT91C_PB10_ETX2    ) |

-		((unsigned int) AT91C_PB0_ETXCK_EREFCK) |

-		((unsigned int) AT91C_PB9_EMDIO   ) |

-		((unsigned int) AT91C_PB7_ERXER   ) |

-		((unsigned int) AT91C_PB17_ERXCK   ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC0_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TC0

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC0_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TC0));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC0_CfgPIO

-//* \brief Configure PIO controllers to drive TC0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB23_TIOA0   ) |

-		((unsigned int) AT91C_PB24_TIOB0   ), // Peripheral A

-		((unsigned int) AT91C_PB12_TCLK0   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC1_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TC1

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC1_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TC1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC1_CfgPIO

-//* \brief Configure PIO controllers to drive TC1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB25_TIOA1   ) |

-		((unsigned int) AT91C_PB26_TIOB1   ), // Peripheral A

-		((unsigned int) AT91C_PB19_TCLK1   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC2_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TC2

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC2_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TC2));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC2_CfgPIO

-//* \brief Configure PIO controllers to drive TC2 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC2_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB28_TIOB2   ) |

-		((unsigned int) AT91C_PB27_TIOA2   ), // Peripheral A

-		0); // Peripheral B

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA15_TCLK2   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  MC

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIOA_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PIOA

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIOA_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_PIOA));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIOB_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PIOB

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIOB_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_PIOB));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  CAN

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_CAN));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgPIO

-//* \brief Configure PIO controllers to drive CAN signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA20_CANTX   ) |

-		((unsigned int) AT91C_PA19_CANRX   ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PWMC

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_PWMC));

-}

-

-#endif // lib_AT91SAM7X128_H

+//* ----------------------------------------------------------------------------
+//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
+//* ----------------------------------------------------------------------------
+//* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+//* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+//* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+//* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+//* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//* ----------------------------------------------------------------------------
+//* File Name           : lib_AT91SAM7X128.h
+//* Object              : AT91SAM7X128 inlined functions
+//* Generated           : AT91 SW Application Group  05/20/2005 (16:22:23)
+//*
+//* CVS Reference       : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003//
+//* CVS Reference       : /lib_pmc_SAM7X.h/1.1/Tue Feb  1 08:32:10 2005//
+//* CVS Reference       : /lib_VREG_6085B.h/1.1/Tue Feb  1 16:20:47 2005//
+//* CVS Reference       : /lib_rstc_6098A.h/1.1/Wed Oct  6 10:39:20 2004//
+//* CVS Reference       : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003//
+//* CVS Reference       : /lib_wdtc_6080A.h/1.1/Wed Oct  6 10:38:30 2004//
+//* CVS Reference       : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002//
+//* CVS Reference       : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003//
+//* CVS Reference       : /lib_pitc_6079A.h/1.2/Tue Nov  9 14:43:56 2004//
+//* CVS Reference       : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005//
+//* CVS Reference       : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005//
+//* CVS Reference       : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004//
+//* CVS Reference       : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003//
+//* CVS Reference       : /lib_rttc_6081A.h/1.1/Wed Oct  6 10:39:38 2004//
+//* CVS Reference       : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005//
+//* CVS Reference       : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005//
+//* CVS Reference       : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003//
+//* CVS Reference       : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004//
+//* CVS Reference       : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003//
+//* CVS Reference       : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003//
+//* CVS Reference       : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004//
+//* CVS Reference       : /lib_pdc.h/1.2/Tue Jul  2 13:29:40 2002//
+//* ----------------------------------------------------------------------------
+
+#ifndef lib_AT91SAM7X128_H
+#define lib_AT91SAM7X128_H
+
+/* *****************************************************************************
+                SOFTWARE API FOR AIC
+   ***************************************************************************** */
+#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20]
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_ConfigureIt
+//* \brief Interrupt Handler Initialization
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_AIC_ConfigureIt (
+    AT91PS_AIC pAic,  // \arg pointer to the AIC registers
+    unsigned int irq_id,     // \arg interrupt number to initialize
+    unsigned int priority,   // \arg priority to give to the interrupt
+    unsigned int src_type,   // \arg activation and sense of activation
+    void (*newHandler) (void) ) // \arg address of the interrupt handler
+{
+    unsigned int oldHandler;
+    unsigned int mask ;
+
+    oldHandler = pAic->AIC_SVR[irq_id];
+
+    mask = 0x1 << irq_id ;
+    //* Disable the interrupt on the interrupt controller
+    pAic->AIC_IDCR = mask ;
+    //* Save the interrupt handler routine pointer and the interrupt priority
+    pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ;
+    //* Store the Source Mode Register
+    pAic->AIC_SMR[irq_id] = src_type | priority  ;
+    //* Clear the interrupt on the interrupt controller
+    pAic->AIC_ICCR = mask ;
+
+    return oldHandler;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_EnableIt
+//* \brief Enable corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_EnableIt (
+    AT91PS_AIC pAic,      // \arg pointer to the AIC registers
+    unsigned int irq_id ) // \arg interrupt number to initialize
+{
+    //* Enable the interrupt on the interrupt controller
+    pAic->AIC_IECR = 0x1 << irq_id ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_DisableIt
+//* \brief Disable corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_DisableIt (
+    AT91PS_AIC pAic,      // \arg pointer to the AIC registers
+    unsigned int irq_id ) // \arg interrupt number to initialize
+{
+    unsigned int mask = 0x1 << irq_id;
+    //* Disable the interrupt on the interrupt controller
+    pAic->AIC_IDCR = mask ;
+    //* Clear the interrupt on the Interrupt Controller ( if one is pending )
+    pAic->AIC_ICCR = mask ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_ClearIt
+//* \brief Clear corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_ClearIt (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg interrupt number to initialize
+{
+    //* Clear the interrupt on the Interrupt Controller ( if one is pending )
+    pAic->AIC_ICCR = (0x1 << irq_id);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_AcknowledgeIt
+//* \brief Acknowledge corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_AcknowledgeIt (
+    AT91PS_AIC pAic)     // \arg pointer to the AIC registers
+{
+    pAic->AIC_EOICR = pAic->AIC_EOICR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_SetExceptionVector
+//* \brief Configure vector handler
+//*----------------------------------------------------------------------------
+__inline unsigned int  AT91F_AIC_SetExceptionVector (
+    unsigned int *pVector, // \arg pointer to the AIC registers
+    void (*Handler) () )   // \arg Interrupt Handler
+{
+    unsigned int oldVector = *pVector;
+
+    if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE)
+        *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE;
+    else
+        *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000;
+
+    return oldVector;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_Trig
+//* \brief Trig an IT
+//*----------------------------------------------------------------------------
+__inline void  AT91F_AIC_Trig (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg interrupt number
+{
+    pAic->AIC_ISCR = (0x1 << irq_id) ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_IsActive
+//* \brief Test if an IT is active
+//*----------------------------------------------------------------------------
+__inline unsigned int  AT91F_AIC_IsActive (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg Interrupt Number
+{
+    return (pAic->AIC_ISR & (0x1 << irq_id));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_IsPending
+//* \brief Test if an IT is pending
+//*----------------------------------------------------------------------------
+__inline unsigned int  AT91F_AIC_IsPending (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg Interrupt Number
+{
+    return (pAic->AIC_IPR & (0x1 << irq_id));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_Open
+//* \brief Set exception vectors and AIC registers to default values
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_Open(
+    AT91PS_AIC pAic,        // \arg pointer to the AIC registers
+    void (*IrqHandler) (),  // \arg Default IRQ vector exception
+    void (*FiqHandler) (),  // \arg Default FIQ vector exception
+    void (*DefaultHandler)  (), // \arg Default Handler set in ISR
+    void (*SpuriousHandler) (), // \arg Default Spurious Handler
+    unsigned int protectMode)   // \arg Debug Control Register
+{
+    int i;
+
+    // Disable all interrupts and set IVR to the default handler
+    for (i = 0; i < 32; ++i) {
+        AT91F_AIC_DisableIt(pAic, i);
+        AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler);
+    }
+
+    // Set the IRQ exception vector
+    AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler);
+    // Set the Fast Interrupt exception vector
+    AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler);
+
+    pAic->AIC_SPU = (unsigned int) SpuriousHandler;
+    pAic->AIC_DCR = protectMode;
+}
+/* *****************************************************************************
+                SOFTWARE API FOR PDC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetNextRx
+//* \brief Set the next receive transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetNextRx (
+    AT91PS_PDC pPDC,     // \arg pointer to a PDC controller
+    char *address,       // \arg address to the next bloc to be received
+    unsigned int bytes)  // \arg number of bytes to be received
+{
+    pPDC->PDC_RNPR = (unsigned int) address;
+    pPDC->PDC_RNCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetNextTx
+//* \brief Set the next transmit transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetNextTx (
+    AT91PS_PDC pPDC,       // \arg pointer to a PDC controller
+    char *address,         // \arg address to the next bloc to be transmitted
+    unsigned int bytes)    // \arg number of bytes to be transmitted
+{
+    pPDC->PDC_TNPR = (unsigned int) address;
+    pPDC->PDC_TNCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetRx
+//* \brief Set the receive transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetRx (
+    AT91PS_PDC pPDC,       // \arg pointer to a PDC controller
+    char *address,         // \arg address to the next bloc to be received
+    unsigned int bytes)    // \arg number of bytes to be received
+{
+    pPDC->PDC_RPR = (unsigned int) address;
+    pPDC->PDC_RCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetTx
+//* \brief Set the transmit transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetTx (
+    AT91PS_PDC pPDC,       // \arg pointer to a PDC controller
+    char *address,         // \arg address to the next bloc to be transmitted
+    unsigned int bytes)    // \arg number of bytes to be transmitted
+{
+    pPDC->PDC_TPR = (unsigned int) address;
+    pPDC->PDC_TCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_EnableTx
+//* \brief Enable transmit
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_EnableTx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_TXTEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_EnableRx
+//* \brief Enable receive
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_EnableRx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_RXTEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_DisableTx
+//* \brief Disable transmit
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_DisableTx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_TXTDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_DisableRx
+//* \brief Disable receive
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_DisableRx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_RXTDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsTxEmpty
+//* \brief Test if the current transfer descriptor has been sent
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_TCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsNextTxEmpty
+//* \brief Test if the next transfer descriptor has been moved to the current td
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_TNCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsRxEmpty
+//* \brief Test if the current transfer descriptor has been filled
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_RCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsNextRxEmpty
+//* \brief Test if the next transfer descriptor has been moved to the current td
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_RNCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_Open
+//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_Open (
+    AT91PS_PDC pPDC)       // \arg pointer to a PDC controller
+{
+    //* Disable the RX and TX PDC transfer requests
+    AT91F_PDC_DisableRx(pPDC);
+    AT91F_PDC_DisableTx(pPDC);
+
+    //* Reset all Counter register Next buffer first
+    AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetRx(pPDC, (char *) 0, 0);
+
+    //* Enable the RX and TX PDC transfer requests
+    AT91F_PDC_EnableRx(pPDC);
+    AT91F_PDC_EnableTx(pPDC);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_Close
+//* \brief Close PDC: disable TX and RX reset transfer descriptors
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_Close (
+    AT91PS_PDC pPDC)       // \arg pointer to a PDC controller
+{
+    //* Disable the RX and TX PDC transfer requests
+    AT91F_PDC_DisableRx(pPDC);
+    AT91F_PDC_DisableTx(pPDC);
+
+    //* Reset all Counter register Next buffer first
+    AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetRx(pPDC, (char *) 0, 0);
+
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SendFrame
+//* \brief Close PDC: disable TX and RX reset transfer descriptors
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PDC_SendFrame(
+    AT91PS_PDC pPDC,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    if (AT91F_PDC_IsTxEmpty(pPDC)) {
+        //* Buffer and next buffer can be initialized
+        AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer);
+        AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer);
+        return 2;
+    }
+    else if (AT91F_PDC_IsNextTxEmpty(pPDC)) {
+        //* Only one buffer can be initialized
+        AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer);
+        return 1;
+    }
+    else {
+        //* All buffer are in use...
+        return 0;
+    }
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_ReceiveFrame
+//* \brief Close PDC: disable TX and RX reset transfer descriptors
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PDC_ReceiveFrame (
+    AT91PS_PDC pPDC,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    if (AT91F_PDC_IsRxEmpty(pPDC)) {
+        //* Buffer and next buffer can be initialized
+        AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer);
+        AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer);
+        return 2;
+    }
+    else if (AT91F_PDC_IsNextRxEmpty(pPDC)) {
+        //* Only one buffer can be initialized
+        AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer);
+        return 1;
+    }
+    else {
+        //* All buffer are in use...
+        return 0;
+    }
+}
+/* *****************************************************************************
+                SOFTWARE API FOR DBGU
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_InterruptEnable
+//* \brief Enable DBGU Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_DBGU_InterruptEnable(
+        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller
+        unsigned int flag) // \arg  dbgu interrupt to be enabled
+{
+        pDbgu->DBGU_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_InterruptDisable
+//* \brief Disable DBGU Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_DBGU_InterruptDisable(
+        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller
+        unsigned int flag) // \arg  dbgu interrupt to be disabled
+{
+        pDbgu->DBGU_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_GetInterruptMaskStatus
+//* \brief Return DBGU Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status
+        AT91PS_DBGU pDbgu) // \arg  pointer to a DBGU controller
+{
+        return pDbgu->DBGU_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_IsInterruptMasked
+//* \brief Test if DBGU Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_DBGU_IsInterruptMasked(
+        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR PIO
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgPeriph
+//* \brief Enable pins to be drived by peripheral
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgPeriph(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int periphAEnable,  // \arg PERIPH A to enable
+    unsigned int periphBEnable)  // \arg PERIPH B to enable
+
+{
+    pPio->PIO_ASR = periphAEnable;
+    pPio->PIO_BSR = periphBEnable;
+    pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgOutput
+//* \brief Enable PIO in output mode
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgOutput(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int pioEnable)      // \arg PIO to be enabled
+{
+    pPio->PIO_PER = pioEnable; // Set in PIO mode
+    pPio->PIO_OER = pioEnable; // Configure in Output
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgInput
+//* \brief Enable PIO in input mode
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgInput(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int inputEnable)      // \arg PIO to be enabled
+{
+    // Disable output
+    pPio->PIO_ODR  = inputEnable;
+    pPio->PIO_PER  = inputEnable;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgOpendrain
+//* \brief Configure PIO in open drain
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgOpendrain(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int multiDrvEnable) // \arg pio to be configured in open drain
+{
+    // Configure the multi-drive option
+    pPio->PIO_MDDR = ~multiDrvEnable;
+    pPio->PIO_MDER = multiDrvEnable;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgPullup
+//* \brief Enable pullup on PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgPullup(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int pullupEnable)   // \arg enable pullup on PIO
+{
+        // Connect or not Pullup
+    pPio->PIO_PPUDR = ~pullupEnable;
+    pPio->PIO_PPUER = pullupEnable;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgDirectDrive
+//* \brief Enable direct drive on PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgDirectDrive(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int directDrive)    // \arg PIO to be configured with direct drive
+
+{
+    // Configure the Direct Drive
+    pPio->PIO_OWDR  = ~directDrive;
+    pPio->PIO_OWER  = directDrive;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgInputFilter
+//* \brief Enable input filter on input PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgInputFilter(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int inputFilter)    // \arg PIO to be configured with input filter
+
+{
+    // Configure the Direct Drive
+    pPio->PIO_IFDR  = ~inputFilter;
+    pPio->PIO_IFER  = inputFilter;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInput
+//* \brief Return PIO input value
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInput( // \return PIO input
+    AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+    return pPio->PIO_PDSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInputSet
+//* \brief Test if PIO is input flag is active
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInputSet(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PIO_GetInput(pPio) & flag);
+}
+
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_SetOutput
+//* \brief Set to 1 output PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_SetOutput(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  output to be set
+{
+    pPio->PIO_SODR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_ClearOutput
+//* \brief Set to 0 output PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_ClearOutput(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  output to be cleared
+{
+    pPio->PIO_CODR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_ForceOutput
+//* \brief Force output when Direct drive option is enabled
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_ForceOutput(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  output to be forced
+{
+    pPio->PIO_ODSR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_Enable
+//* \brief Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_Enable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be enabled
+{
+        pPio->PIO_PER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_Disable
+//* \brief Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_Disable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be disabled
+{
+        pPio->PIO_PDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetStatus
+//* \brief Return PIO Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_PSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsSet
+//* \brief Test if PIO is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputEnable
+//* \brief Output Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output to be enabled
+{
+        pPio->PIO_OER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputDisable
+//* \brief Output Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output to be disabled
+{
+        pPio->PIO_ODR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetOutputStatus
+//* \brief Return PIO Output Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_OSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsOuputSet
+//* \brief Test if PIO Output is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsOutputSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetOutputStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InputFilterEnable
+//* \brief Input Filter Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InputFilterEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio input filter to be enabled
+{
+        pPio->PIO_IFER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InputFilterDisable
+//* \brief Input Filter Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InputFilterDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio input filter to be disabled
+{
+        pPio->PIO_IFDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInputFilterStatus
+//* \brief Return PIO Input Filter Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_IFSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInputFilterSet
+//* \brief Test if PIO Input filter is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInputFilterSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetInputFilterStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetOutputDataStatus
+//* \brief Return PIO Output Data Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status
+    AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_ODSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InterruptEnable
+//* \brief Enable PIO Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InterruptEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio interrupt to be enabled
+{
+        pPio->PIO_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InterruptDisable
+//* \brief Disable PIO Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InterruptDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio interrupt to be disabled
+{
+        pPio->PIO_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInterruptMaskStatus
+//* \brief Return PIO Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInterruptStatus
+//* \brief Return PIO Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_ISR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInterruptMasked
+//* \brief Test if PIO Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInterruptMasked(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInterruptSet
+//* \brief Test if PIO Interrupt is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInterruptSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetInterruptStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_MultiDriverEnable
+//* \brief Multi Driver Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_MultiDriverEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be enabled
+{
+        pPio->PIO_MDER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_MultiDriverDisable
+//* \brief Multi Driver Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_MultiDriverDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be disabled
+{
+        pPio->PIO_MDDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetMultiDriverStatus
+//* \brief Return PIO Multi Driver Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_MDSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsMultiDriverSet
+//* \brief Test if PIO MultiDriver is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsMultiDriverSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_A_RegisterSelection
+//* \brief PIO A Register Selection
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_A_RegisterSelection(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio A register selection
+{
+        pPio->PIO_ASR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_B_RegisterSelection
+//* \brief PIO B Register Selection
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_B_RegisterSelection(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio B register selection
+{
+        pPio->PIO_BSR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_Get_AB_RegisterStatus
+//* \brief Return PIO Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_ABSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsAB_RegisterSet
+//* \brief Test if PIO AB Register is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsAB_RegisterSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputWriteEnable
+//* \brief Output Write Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputWriteEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output write to be enabled
+{
+        pPio->PIO_OWER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputWriteDisable
+//* \brief Output Write Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputWriteDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output write to be disabled
+{
+        pPio->PIO_OWDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetOutputWriteStatus
+//* \brief Return PIO Output Write Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_OWSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsOutputWriteSet
+//* \brief Test if PIO OutputWrite is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsOutputWriteSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetCfgPullup
+//* \brief Return PIO Configuration Pullup
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_PPUSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsOutputDataStatusSet
+//* \brief Test if PIO Output Data Status is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsOutputDataStatusSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetOutputDataStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsCfgPullupStatusSet
+//* \brief Test if PIO Configuration Pullup Status is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsCfgPullupStatusSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (~AT91F_PIO_GetCfgPullup(pPio) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR PMC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgSysClkEnableReg
+//* \brief Configure the System Clock Enable Register of the PMC controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgSysClkEnableReg (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int mode)
+{
+    //* Write to the SCER register
+    pPMC->PMC_SCER = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgSysClkDisableReg
+//* \brief Configure the System Clock Disable Register of the PMC controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgSysClkDisableReg (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int mode)
+{
+    //* Write to the SCDR register
+    pPMC->PMC_SCDR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetSysClkStatusReg
+//* \brief Return the System Clock Status Register of the PMC controller
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetSysClkStatusReg (
+    AT91PS_PMC pPMC // pointer to a CAN controller
+    )
+{
+    return pPMC->PMC_SCSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_EnablePeriphClock
+//* \brief Enable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_EnablePeriphClock (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int periphIds)  // \arg IDs of peripherals to enable
+{
+    pPMC->PMC_PCER = periphIds;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_DisablePeriphClock
+//* \brief Disable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_DisablePeriphClock (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int periphIds)  // \arg IDs of peripherals to enable
+{
+    pPMC->PMC_PCDR = periphIds;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetPeriphClock
+//* \brief Get peripheral clock status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetPeriphClock (
+    AT91PS_PMC pPMC) // \arg pointer to PMC controller
+{
+    return pPMC->PMC_PCSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_CfgMainOscillatorReg
+//* \brief Cfg the main oscillator
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_CfgMainOscillatorReg (
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int mode)
+{
+    pCKGR->CKGR_MOR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_GetMainOscillatorReg
+//* \brief Cfg the main oscillator
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_CKGR_GetMainOscillatorReg (
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    return pCKGR->CKGR_MOR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_EnableMainOscillator
+//* \brief Enable the main oscillator
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_EnableMainOscillator(
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_DisableMainOscillator
+//* \brief Disable the main oscillator
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_DisableMainOscillator (
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_CfgMainOscStartUpTime
+//* \brief Cfg MOR Register according to the main osc startup time
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_CfgMainOscStartUpTime (
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int startup_time,  // \arg main osc startup time in microsecond (us)
+    unsigned int slowClock)  // \arg slowClock in Hz
+{
+    pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT;
+    pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_GetMainClockFreqReg
+//* \brief Cfg the main oscillator
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_CKGR_GetMainClockFreqReg (
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    return pCKGR->CKGR_MCFR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_GetMainClock
+//* \brief Return Main clock in Hz
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_CKGR_GetMainClock (
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int slowClock)  // \arg slowClock in Hz
+{
+    return ((pCKGR->CKGR_MCFR  & AT91C_CKGR_MAINF) * slowClock) >> 4;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgMCKReg
+//* \brief Cfg Master Clock Register
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgMCKReg (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int mode)
+{
+    pPMC->PMC_MCKR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetMCKReg
+//* \brief Return Master Clock Register
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetMCKReg(
+    AT91PS_PMC pPMC) // \arg pointer to PMC controller
+{
+    return pPMC->PMC_MCKR;
+}
+
+//*------------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetMasterClock
+//* \brief Return master clock in Hz which correponds to processor clock for ARM7
+//*------------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetMasterClock (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int slowClock)  // \arg slowClock in Hz
+{
+    unsigned int reg = pPMC->PMC_MCKR;
+    unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2));
+    unsigned int pllDivider, pllMultiplier;
+
+    switch (reg & AT91C_PMC_CSS) {
+        case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected
+            return slowClock / prescaler;
+        case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected
+            return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler;
+        case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected
+            reg = pCKGR->CKGR_PLLR;
+            pllDivider    = (reg  & AT91C_CKGR_DIV);
+            pllMultiplier = ((reg  & AT91C_CKGR_MUL) >> 16) + 1;
+            return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler;
+    }
+    return 0;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_EnablePCK
+//* \brief Enable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_EnablePCK (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int pck,  // \arg Peripheral clock identifier 0 .. 7
+    unsigned int mode)
+{
+    pPMC->PMC_PCKR[pck] = mode;
+    pPMC->PMC_SCER = (1 << pck) << 8;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_DisablePCK
+//* \brief Enable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_DisablePCK (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int pck)  // \arg Peripheral clock identifier 0 .. 7
+{
+    pPMC->PMC_SCDR = (1 << pck) << 8;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_EnableIt
+//* \brief Enable PMC interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_EnableIt (
+    AT91PS_PMC pPMC,     // pointer to a PMC controller
+    unsigned int flag)   // IT to be enabled
+{
+    //* Write to the IER register
+    pPMC->PMC_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_DisableIt
+//* \brief Disable PMC interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_DisableIt (
+    AT91PS_PMC pPMC, // pointer to a PMC controller
+    unsigned int flag) // IT to be disabled
+{
+    //* Write to the IDR register
+    pPMC->PMC_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetStatus
+//* \brief Return PMC Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status
+    AT91PS_PMC pPMC) // pointer to a PMC controller
+{
+    return pPMC->PMC_SR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetInterruptMaskStatus
+//* \brief Return PMC Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status
+    AT91PS_PMC pPMC) // pointer to a PMC controller
+{
+    return pPMC->PMC_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_IsInterruptMasked
+//* \brief Test if PMC Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_IsInterruptMasked(
+        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_IsStatusSet
+//* \brief Test if PMC Status is Set
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_IsStatusSet(
+        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PMC_GetStatus(pPMC) & flag);
+}/* *****************************************************************************
+                SOFTWARE API FOR RSTC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_RSTSoftReset
+//* \brief Start Software Reset
+//*----------------------------------------------------------------------------
+__inline void AT91F_RSTSoftReset(
+        AT91PS_RSTC pRSTC,
+        unsigned int reset)
+{
+    pRSTC->RSTC_RCR = (0xA5000000 | reset);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_RSTSetMode
+//* \brief Set Reset Mode
+//*----------------------------------------------------------------------------
+__inline void AT91F_RSTSetMode(
+        AT91PS_RSTC pRSTC,
+        unsigned int mode)
+{
+    pRSTC->RSTC_RMR = (0xA5000000 | mode);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_RSTGetMode
+//* \brief Get Reset Mode
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_RSTGetMode(
+        AT91PS_RSTC pRSTC)
+{
+    return (pRSTC->RSTC_RMR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_RSTGetStatus
+//* \brief Get Reset Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_RSTGetStatus(
+        AT91PS_RSTC pRSTC)
+{
+    return (pRSTC->RSTC_RSR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_RSTIsSoftRstActive
+//* \brief Return !=0 if software reset is still not completed
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_RSTIsSoftRstActive(
+        AT91PS_RSTC pRSTC)
+{
+    return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP);
+}
+/* *****************************************************************************
+                SOFTWARE API FOR RTTC
+   ***************************************************************************** */
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_SetRTT_TimeBase()
+//* \brief  Set the RTT prescaler according to the TimeBase in ms
+//*--------------------------------------------------------------------------------------
+__inline unsigned int AT91F_RTTSetTimeBase(
+        AT91PS_RTTC pRTTC,
+        unsigned int ms)
+{
+    if (ms > 2000)
+        return 1;   // AT91C_TIME_OUT_OF_RANGE
+    pRTTC->RTTC_RTMR &= ~0xFFFF;
+    pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF);
+    return 0;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTTSetPrescaler()
+//* \brief  Set the new prescaler value
+//*--------------------------------------------------------------------------------------
+__inline unsigned int AT91F_RTTSetPrescaler(
+        AT91PS_RTTC pRTTC,
+        unsigned int rtpres)
+{
+    pRTTC->RTTC_RTMR &= ~0xFFFF;
+    pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF);
+    return (pRTTC->RTTC_RTMR);
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTTRestart()
+//* \brief  Restart the RTT prescaler
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTRestart(
+        AT91PS_RTTC pRTTC)
+{
+    pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST;
+}
+
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_SetAlarmINT()
+//* \brief  Enable RTT Alarm Interrupt
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTSetAlarmINT(
+        AT91PS_RTTC pRTTC)
+{
+    pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_ClearAlarmINT()
+//* \brief  Disable RTT Alarm Interrupt
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTClearAlarmINT(
+        AT91PS_RTTC pRTTC)
+{
+    pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_SetRttIncINT()
+//* \brief  Enable RTT INC Interrupt
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTSetRttIncINT(
+        AT91PS_RTTC pRTTC)
+{
+    pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_ClearRttIncINT()
+//* \brief  Disable RTT INC Interrupt
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTClearRttIncINT(
+        AT91PS_RTTC pRTTC)
+{
+    pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_SetAlarmValue()
+//* \brief  Set RTT Alarm Value
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTSetAlarmValue(
+        AT91PS_RTTC pRTTC, unsigned int alarm)
+{
+    pRTTC->RTTC_RTAR = alarm;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_GetAlarmValue()
+//* \brief  Get RTT Alarm Value
+//*--------------------------------------------------------------------------------------
+__inline unsigned int AT91F_RTTGetAlarmValue(
+        AT91PS_RTTC pRTTC)
+{
+    return(pRTTC->RTTC_RTAR);
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTTGetStatus()
+//* \brief  Read the RTT status
+//*--------------------------------------------------------------------------------------
+__inline unsigned int AT91F_RTTGetStatus(
+        AT91PS_RTTC pRTTC)
+{
+    return(pRTTC->RTTC_RTSR);
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_ReadValue()
+//* \brief  Read the RTT value
+//*--------------------------------------------------------------------------------------
+__inline unsigned int AT91F_RTTReadValue(
+        AT91PS_RTTC pRTTC)
+{
+        register volatile unsigned int val1,val2;
+    do
+    {
+        val1 = pRTTC->RTTC_RTVR;
+        val2 = pRTTC->RTTC_RTVR;
+    }
+    while(val1 != val2);
+    return(val1);
+}
+/* *****************************************************************************
+                SOFTWARE API FOR PITC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PITInit
+//* \brief System timer init : period in
\ No newline at end of file
diff --git a/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h b/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h
index 02ee900..556e0ca 100644
--- a/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h
+++ b/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h
@@ -1,4558 +1,1469 @@
-//* ----------------------------------------------------------------------------

-//*         ATMEL Microcontroller Software Support  -  ROUSSET  -

-//* ----------------------------------------------------------------------------

-//* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR

-//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

-//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE

-//* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,

-//* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

-//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,

-//* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

-//* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

-//* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,

-//* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-//* ----------------------------------------------------------------------------

-//* File Name           : lib_AT91SAM7X256.h

-//* Object              : AT91SAM7X256 inlined functions

-//* Generated           : AT91 SW Application Group  05/20/2005 (16:22:29)

-//*

-//* CVS Reference       : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003//

-//* CVS Reference       : /lib_pmc_SAM7X.h/1.1/Tue Feb  1 08:32:10 2005//

-//* CVS Reference       : /lib_VREG_6085B.h/1.1/Tue Feb  1 16:20:47 2005//

-//* CVS Reference       : /lib_rstc_6098A.h/1.1/Wed Oct  6 10:39:20 2004//

-//* CVS Reference       : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003//

-//* CVS Reference       : /lib_wdtc_6080A.h/1.1/Wed Oct  6 10:38:30 2004//

-//* CVS Reference       : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002//

-//* CVS Reference       : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003//

-//* CVS Reference       : /lib_pitc_6079A.h/1.2/Tue Nov  9 14:43:56 2004//

-//* CVS Reference       : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005//

-//* CVS Reference       : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005//

-//* CVS Reference       : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004//

-//* CVS Reference       : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003//

-//* CVS Reference       : /lib_rttc_6081A.h/1.1/Wed Oct  6 10:39:38 2004//

-//* CVS Reference       : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005//

-//* CVS Reference       : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005//

-//* CVS Reference       : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003//

-//* CVS Reference       : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004//

-//* CVS Reference       : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003//

-//* CVS Reference       : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003//

-//* CVS Reference       : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004//

-//* CVS Reference       : /lib_pdc.h/1.2/Tue Jul  2 13:29:40 2002//

-//* ----------------------------------------------------------------------------

-

-#ifndef lib_AT91SAM7X256_H

-#define lib_AT91SAM7X256_H

-

-/* *****************************************************************************

-                SOFTWARE API FOR AIC

-   ***************************************************************************** */

-#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20]

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_ConfigureIt

-//* \brief Interrupt Handler Initialization

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AIC_ConfigureIt (

-	AT91PS_AIC pAic,  // \arg pointer to the AIC registers

-	unsigned int irq_id,     // \arg interrupt number to initialize

-	unsigned int priority,   // \arg priority to give to the interrupt

-	unsigned int src_type,   // \arg activation and sense of activation

-	void (*newHandler) (void) ) // \arg address of the interrupt handler

-{

-	unsigned int oldHandler;

-    unsigned int mask ;

-

-    oldHandler = pAic->AIC_SVR[irq_id];

-

-    mask = 0x1 << irq_id ;

-    //* Disable the interrupt on the interrupt controller

-    pAic->AIC_IDCR = mask ;

-    //* Save the interrupt handler routine pointer and the interrupt priority

-    pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ;

-    //* Store the Source Mode Register

-    pAic->AIC_SMR[irq_id] = src_type | priority  ;

-    //* Clear the interrupt on the interrupt controller

-    pAic->AIC_ICCR = mask ;

-

-	return oldHandler;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_EnableIt

-//* \brief Enable corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_EnableIt (

-	AT91PS_AIC pAic,      // \arg pointer to the AIC registers

-	unsigned int irq_id ) // \arg interrupt number to initialize

-{

-    //* Enable the interrupt on the interrupt controller

-    pAic->AIC_IECR = 0x1 << irq_id ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_DisableIt

-//* \brief Disable corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_DisableIt (

-	AT91PS_AIC pAic,      // \arg pointer to the AIC registers

-	unsigned int irq_id ) // \arg interrupt number to initialize

-{

-    unsigned int mask = 0x1 << irq_id;

-    //* Disable the interrupt on the interrupt controller

-    pAic->AIC_IDCR = mask ;

-    //* Clear the interrupt on the Interrupt Controller ( if one is pending )

-    pAic->AIC_ICCR = mask ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_ClearIt

-//* \brief Clear corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_ClearIt (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg interrupt number to initialize

-{

-    //* Clear the interrupt on the Interrupt Controller ( if one is pending )

-    pAic->AIC_ICCR = (0x1 << irq_id);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_AcknowledgeIt

-//* \brief Acknowledge corresponding IT number

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_AcknowledgeIt (

-	AT91PS_AIC pAic)     // \arg pointer to the AIC registers

-{

-    pAic->AIC_EOICR = pAic->AIC_EOICR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_SetExceptionVector

-//* \brief Configure vector handler

-//*----------------------------------------------------------------------------

-__inline unsigned int  AT91F_AIC_SetExceptionVector (

-	unsigned int *pVector, // \arg pointer to the AIC registers

-	void (*Handler) () )   // \arg Interrupt Handler

-{

-	unsigned int oldVector = *pVector;

-

-	if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE)

-		*pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE;

-	else

-		*pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000;

-

-	return oldVector;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_Trig

-//* \brief Trig an IT

-//*----------------------------------------------------------------------------

-__inline void  AT91F_AIC_Trig (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg interrupt number

-{

-	pAic->AIC_ISCR = (0x1 << irq_id) ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_IsActive

-//* \brief Test if an IT is active

-//*----------------------------------------------------------------------------

-__inline unsigned int  AT91F_AIC_IsActive (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg Interrupt Number

-{

-	return (pAic->AIC_ISR & (0x1 << irq_id));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_IsPending

-//* \brief Test if an IT is pending

-//*----------------------------------------------------------------------------

-__inline unsigned int  AT91F_AIC_IsPending (

-	AT91PS_AIC pAic,     // \arg pointer to the AIC registers

-	unsigned int irq_id) // \arg Interrupt Number

-{

-	return (pAic->AIC_IPR & (0x1 << irq_id));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_Open

-//* \brief Set exception vectors and AIC registers to default values

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_Open(

-	AT91PS_AIC pAic,        // \arg pointer to the AIC registers

-	void (*IrqHandler) (),  // \arg Default IRQ vector exception

-	void (*FiqHandler) (),  // \arg Default FIQ vector exception

-	void (*DefaultHandler)  (), // \arg Default Handler set in ISR

-	void (*SpuriousHandler) (), // \arg Default Spurious Handler

-	unsigned int protectMode)   // \arg Debug Control Register

-{

-	int i;

-

-	// Disable all interrupts and set IVR to the default handler

-	for (i = 0; i < 32; ++i) {

-		AT91F_AIC_DisableIt(pAic, i);

-		AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler);

-	}

-

-	// Set the IRQ exception vector

-	AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler);

-	// Set the Fast Interrupt exception vector

-	AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler);

-

-	pAic->AIC_SPU = (unsigned int) SpuriousHandler;

-	pAic->AIC_DCR = protectMode;

-}

-/* *****************************************************************************

-                SOFTWARE API FOR PDC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetNextRx

-//* \brief Set the next receive transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetNextRx (

-	AT91PS_PDC pPDC,     // \arg pointer to a PDC controller

-	char *address,       // \arg address to the next bloc to be received

-	unsigned int bytes)  // \arg number of bytes to be received

-{

-	pPDC->PDC_RNPR = (unsigned int) address;

-	pPDC->PDC_RNCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetNextTx

-//* \brief Set the next transmit transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetNextTx (

-	AT91PS_PDC pPDC,       // \arg pointer to a PDC controller

-	char *address,         // \arg address to the next bloc to be transmitted

-	unsigned int bytes)    // \arg number of bytes to be transmitted

-{

-	pPDC->PDC_TNPR = (unsigned int) address;

-	pPDC->PDC_TNCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetRx

-//* \brief Set the receive transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetRx (

-	AT91PS_PDC pPDC,       // \arg pointer to a PDC controller

-	char *address,         // \arg address to the next bloc to be received

-	unsigned int bytes)    // \arg number of bytes to be received

-{

-	pPDC->PDC_RPR = (unsigned int) address;

-	pPDC->PDC_RCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SetTx

-//* \brief Set the transmit transfer descriptor

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_SetTx (

-	AT91PS_PDC pPDC,       // \arg pointer to a PDC controller

-	char *address,         // \arg address to the next bloc to be transmitted

-	unsigned int bytes)    // \arg number of bytes to be transmitted

-{

-	pPDC->PDC_TPR = (unsigned int) address;

-	pPDC->PDC_TCR = bytes;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_EnableTx

-//* \brief Enable transmit

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_EnableTx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_TXTEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_EnableRx

-//* \brief Enable receive

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_EnableRx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_RXTEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_DisableTx

-//* \brief Disable transmit

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_DisableTx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_TXTDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_DisableRx

-//* \brief Disable receive

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_DisableRx (

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	pPDC->PDC_PTCR = AT91C_PDC_RXTDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsTxEmpty

-//* \brief Test if the current transfer descriptor has been sent

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_TCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsNextTxEmpty

-//* \brief Test if the next transfer descriptor has been moved to the current td

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_TNCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsRxEmpty

-//* \brief Test if the current transfer descriptor has been filled

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_RCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_IsNextRxEmpty

-//* \brief Test if the next transfer descriptor has been moved to the current td

-//*----------------------------------------------------------------------------

-__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete

-	AT91PS_PDC pPDC )       // \arg pointer to a PDC controller

-{

-	return !(pPDC->PDC_RNCR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_Open

-//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_Open (

-	AT91PS_PDC pPDC)       // \arg pointer to a PDC controller

-{

-    //* Disable the RX and TX PDC transfer requests

-	AT91F_PDC_DisableRx(pPDC);

-	AT91F_PDC_DisableTx(pPDC);

-

-	//* Reset all Counter register Next buffer first

-	AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetRx(pPDC, (char *) 0, 0);

-

-    //* Enable the RX and TX PDC transfer requests

-	AT91F_PDC_EnableRx(pPDC);

-	AT91F_PDC_EnableTx(pPDC);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_Close

-//* \brief Close PDC: disable TX and RX reset transfer descriptors

-//*----------------------------------------------------------------------------

-__inline void AT91F_PDC_Close (

-	AT91PS_PDC pPDC)       // \arg pointer to a PDC controller

-{

-    //* Disable the RX and TX PDC transfer requests

-	AT91F_PDC_DisableRx(pPDC);

-	AT91F_PDC_DisableTx(pPDC);

-

-	//* Reset all Counter register Next buffer first

-	AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetTx(pPDC, (char *) 0, 0);

-	AT91F_PDC_SetRx(pPDC, (char *) 0, 0);

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_SendFrame

-//* \brief Close PDC: disable TX and RX reset transfer descriptors

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PDC_SendFrame(

-	AT91PS_PDC pPDC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	if (AT91F_PDC_IsTxEmpty(pPDC)) {

-		//* Buffer and next buffer can be initialized

-		AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer);

-		AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer);

-		return 2;

-	}

-	else if (AT91F_PDC_IsNextTxEmpty(pPDC)) {

-		//* Only one buffer can be initialized

-		AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer);

-		return 1;

-	}

-	else {

-		//* All buffer are in use...

-		return 0;

-	}

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PDC_ReceiveFrame

-//* \brief Close PDC: disable TX and RX reset transfer descriptors

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PDC_ReceiveFrame (

-	AT91PS_PDC pPDC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	if (AT91F_PDC_IsRxEmpty(pPDC)) {

-		//* Buffer and next buffer can be initialized

-		AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer);

-		AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer);

-		return 2;

-	}

-	else if (AT91F_PDC_IsNextRxEmpty(pPDC)) {

-		//* Only one buffer can be initialized

-		AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer);

-		return 1;

-	}

-	else {

-		//* All buffer are in use...

-		return 0;

-	}

-}

-/* *****************************************************************************

-                SOFTWARE API FOR DBGU

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_InterruptEnable

-//* \brief Enable DBGU Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_InterruptEnable(

-        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller

-        unsigned int flag) // \arg  dbgu interrupt to be enabled

-{

-        pDbgu->DBGU_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_InterruptDisable

-//* \brief Disable DBGU Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_InterruptDisable(

-        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller

-        unsigned int flag) // \arg  dbgu interrupt to be disabled

-{

-        pDbgu->DBGU_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_GetInterruptMaskStatus

-//* \brief Return DBGU Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status

-        AT91PS_DBGU pDbgu) // \arg  pointer to a DBGU controller

-{

-        return pDbgu->DBGU_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_IsInterruptMasked

-//* \brief Test if DBGU Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline int AT91F_DBGU_IsInterruptMasked(

-        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR PIO

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgPeriph

-//* \brief Enable pins to be drived by peripheral

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgPeriph(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int periphAEnable,  // \arg PERIPH A to enable

-	unsigned int periphBEnable)  // \arg PERIPH B to enable

-

-{

-	pPio->PIO_ASR = periphAEnable;

-	pPio->PIO_BSR = periphBEnable;

-	pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgOutput

-//* \brief Enable PIO in output mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgOutput(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int pioEnable)      // \arg PIO to be enabled

-{

-	pPio->PIO_PER = pioEnable; // Set in PIO mode

-	pPio->PIO_OER = pioEnable; // Configure in Output

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgInput

-//* \brief Enable PIO in input mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgInput(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int inputEnable)      // \arg PIO to be enabled

-{

-	// Disable output

-	pPio->PIO_ODR  = inputEnable;

-	pPio->PIO_PER  = inputEnable;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgOpendrain

-//* \brief Configure PIO in open drain

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgOpendrain(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int multiDrvEnable) // \arg pio to be configured in open drain

-{

-	// Configure the multi-drive option

-	pPio->PIO_MDDR = ~multiDrvEnable;

-	pPio->PIO_MDER = multiDrvEnable;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgPullup

-//* \brief Enable pullup on PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgPullup(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int pullupEnable)   // \arg enable pullup on PIO

-{

-		// Connect or not Pullup

-	pPio->PIO_PPUDR = ~pullupEnable;

-	pPio->PIO_PPUER = pullupEnable;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgDirectDrive

-//* \brief Enable direct drive on PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgDirectDrive(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int directDrive)    // \arg PIO to be configured with direct drive

-

-{

-	// Configure the Direct Drive

-	pPio->PIO_OWDR  = ~directDrive;

-	pPio->PIO_OWER  = directDrive;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_CfgInputFilter

-//* \brief Enable input filter on input PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_CfgInputFilter(

-	AT91PS_PIO pPio,             // \arg pointer to a PIO controller

-	unsigned int inputFilter)    // \arg PIO to be configured with input filter

-

-{

-	// Configure the Direct Drive

-	pPio->PIO_IFDR  = ~inputFilter;

-	pPio->PIO_IFER  = inputFilter;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInput

-//* \brief Return PIO input value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInput( // \return PIO input

-	AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-	return pPio->PIO_PDSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInputSet

-//* \brief Test if PIO is input flag is active

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInputSet(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PIO_GetInput(pPio) & flag);

-}

-

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_SetOutput

-//* \brief Set to 1 output PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_SetOutput(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  output to be set

-{

-	pPio->PIO_SODR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_ClearOutput

-//* \brief Set to 0 output PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_ClearOutput(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  output to be cleared

-{

-	pPio->PIO_CODR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_ForceOutput

-//* \brief Force output when Direct drive option is enabled

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_ForceOutput(

-	AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-	unsigned int flag) // \arg  output to be forced

-{

-	pPio->PIO_ODSR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_Enable

-//* \brief Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_Enable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be enabled

-{

-        pPio->PIO_PER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_Disable

-//* \brief Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_Disable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be disabled

-{

-        pPio->PIO_PDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetStatus

-//* \brief Return PIO Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_PSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsSet

-//* \brief Test if PIO is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputEnable

-//* \brief Output Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output to be enabled

-{

-        pPio->PIO_OER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputDisable

-//* \brief Output Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output to be disabled

-{

-        pPio->PIO_ODR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetOutputStatus

-//* \brief Return PIO Output Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_OSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsOuputSet

-//* \brief Test if PIO Output is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsOutputSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetOutputStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InputFilterEnable

-//* \brief Input Filter Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InputFilterEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio input filter to be enabled

-{

-        pPio->PIO_IFER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InputFilterDisable

-//* \brief Input Filter Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InputFilterDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio input filter to be disabled

-{

-        pPio->PIO_IFDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInputFilterStatus

-//* \brief Return PIO Input Filter Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_IFSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInputFilterSet

-//* \brief Test if PIO Input filter is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInputFilterSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetInputFilterStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetOutputDataStatus

-//* \brief Return PIO Output Data Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status

-	AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_ODSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InterruptEnable

-//* \brief Enable PIO Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InterruptEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio interrupt to be enabled

-{

-        pPio->PIO_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_InterruptDisable

-//* \brief Disable PIO Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_InterruptDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio interrupt to be disabled

-{

-        pPio->PIO_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInterruptMaskStatus

-//* \brief Return PIO Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetInterruptStatus

-//* \brief Return PIO Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_ISR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInterruptMasked

-//* \brief Test if PIO Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInterruptMasked(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsInterruptSet

-//* \brief Test if PIO Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsInterruptSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetInterruptStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_MultiDriverEnable

-//* \brief Multi Driver Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_MultiDriverEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be enabled

-{

-        pPio->PIO_MDER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_MultiDriverDisable

-//* \brief Multi Driver Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_MultiDriverDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio to be disabled

-{

-        pPio->PIO_MDDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetMultiDriverStatus

-//* \brief Return PIO Multi Driver Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_MDSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsMultiDriverSet

-//* \brief Test if PIO MultiDriver is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsMultiDriverSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_A_RegisterSelection

-//* \brief PIO A Register Selection

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_A_RegisterSelection(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio A register selection

-{

-        pPio->PIO_ASR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_B_RegisterSelection

-//* \brief PIO B Register Selection

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_B_RegisterSelection(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio B register selection

-{

-        pPio->PIO_BSR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_Get_AB_RegisterStatus

-//* \brief Return PIO Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_ABSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsAB_RegisterSet

-//* \brief Test if PIO AB Register is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsAB_RegisterSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputWriteEnable

-//* \brief Output Write Enable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputWriteEnable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output write to be enabled

-{

-        pPio->PIO_OWER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_OutputWriteDisable

-//* \brief Output Write Disable PIO

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIO_OutputWriteDisable(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  pio output write to be disabled

-{

-        pPio->PIO_OWDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetOutputWriteStatus

-//* \brief Return PIO Output Write Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_OWSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsOutputWriteSet

-//* \brief Test if PIO OutputWrite is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsOutputWriteSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_GetCfgPullup

-//* \brief Return PIO Configuration Pullup

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup

-        AT91PS_PIO pPio) // \arg  pointer to a PIO controller

-{

-        return pPio->PIO_PPUSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsOutputDataStatusSet

-//* \brief Test if PIO Output Data Status is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsOutputDataStatusSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_PIO_GetOutputDataStatus(pPio) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIO_IsCfgPullupStatusSet

-//* \brief Test if PIO Configuration Pullup Status is Set

-//*----------------------------------------------------------------------------

-__inline int AT91F_PIO_IsCfgPullupStatusSet(

-        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (~AT91F_PIO_GetCfgPullup(pPio) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR PMC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgSysClkEnableReg

-//* \brief Configure the System Clock Enable Register of the PMC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgSysClkEnableReg (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int mode)

-{

-	//* Write to the SCER register

-	pPMC->PMC_SCER = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgSysClkDisableReg

-//* \brief Configure the System Clock Disable Register of the PMC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgSysClkDisableReg (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int mode)

-{

-	//* Write to the SCDR register

-	pPMC->PMC_SCDR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetSysClkStatusReg

-//* \brief Return the System Clock Status Register of the PMC controller

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetSysClkStatusReg (

-	AT91PS_PMC pPMC // pointer to a CAN controller

-	)

-{

-	return pPMC->PMC_SCSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_EnablePeriphClock

-//* \brief Enable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_EnablePeriphClock (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int periphIds)  // \arg IDs of peripherals to enable

-{

-	pPMC->PMC_PCER = periphIds;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_DisablePeriphClock

-//* \brief Disable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_DisablePeriphClock (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int periphIds)  // \arg IDs of peripherals to enable

-{

-	pPMC->PMC_PCDR = periphIds;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetPeriphClock

-//* \brief Get peripheral clock status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetPeriphClock (

-	AT91PS_PMC pPMC) // \arg pointer to PMC controller

-{

-	return pPMC->PMC_PCSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_CfgMainOscillatorReg

-//* \brief Cfg the main oscillator

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_CfgMainOscillatorReg (

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int mode)

-{

-	pCKGR->CKGR_MOR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_GetMainOscillatorReg

-//* \brief Cfg the main oscillator

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CKGR_GetMainOscillatorReg (

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	return pCKGR->CKGR_MOR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_EnableMainOscillator

-//* \brief Enable the main oscillator

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_EnableMainOscillator(

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_DisableMainOscillator

-//* \brief Disable the main oscillator

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_DisableMainOscillator (

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_CfgMainOscStartUpTime

-//* \brief Cfg MOR Register according to the main osc startup time

-//*----------------------------------------------------------------------------

-__inline void AT91F_CKGR_CfgMainOscStartUpTime (

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int startup_time,  // \arg main osc startup time in microsecond (us)

-	unsigned int slowClock)  // \arg slowClock in Hz

-{

-	pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT;

-	pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_GetMainClockFreqReg

-//* \brief Cfg the main oscillator

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CKGR_GetMainClockFreqReg (

-	AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller

-{

-	return pCKGR->CKGR_MCFR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CKGR_GetMainClock

-//* \brief Return Main clock in Hz

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CKGR_GetMainClock (

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int slowClock)  // \arg slowClock in Hz

-{

-	return ((pCKGR->CKGR_MCFR  & AT91C_CKGR_MAINF) * slowClock) >> 4;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgMCKReg

-//* \brief Cfg Master Clock Register

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgMCKReg (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int mode)

-{

-	pPMC->PMC_MCKR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetMCKReg

-//* \brief Return Master Clock Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetMCKReg(

-	AT91PS_PMC pPMC) // \arg pointer to PMC controller

-{

-	return pPMC->PMC_MCKR;

-}

-

-//*------------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetMasterClock

-//* \brief Return master clock in Hz which correponds to processor clock for ARM7

-//*------------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetMasterClock (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller

-	unsigned int slowClock)  // \arg slowClock in Hz

-{

-	unsigned int reg = pPMC->PMC_MCKR;

-	unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2));

-	unsigned int pllDivider, pllMultiplier;

-

-	switch (reg & AT91C_PMC_CSS) {

-		case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected

-			return slowClock / prescaler;

-		case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected

-			return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler;

-		case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected

-			reg = pCKGR->CKGR_PLLR;

-			pllDivider    = (reg  & AT91C_CKGR_DIV);

-			pllMultiplier = ((reg  & AT91C_CKGR_MUL) >> 16) + 1;

-			return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler;

-	}

-	return 0;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_EnablePCK

-//* \brief Enable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_EnablePCK (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int pck,  // \arg Peripheral clock identifier 0 .. 7

-	unsigned int mode)

-{

-	pPMC->PMC_PCKR[pck] = mode;

-	pPMC->PMC_SCER = (1 << pck) << 8;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_DisablePCK

-//* \brief Enable peripheral clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_DisablePCK (

-	AT91PS_PMC pPMC, // \arg pointer to PMC controller

-	unsigned int pck)  // \arg Peripheral clock identifier 0 .. 7

-{

-	pPMC->PMC_SCDR = (1 << pck) << 8;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_EnableIt

-//* \brief Enable PMC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_EnableIt (

-	AT91PS_PMC pPMC,     // pointer to a PMC controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pPMC->PMC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_DisableIt

-//* \brief Disable PMC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_DisableIt (

-	AT91PS_PMC pPMC, // pointer to a PMC controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pPMC->PMC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetStatus

-//* \brief Return PMC Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status

-	AT91PS_PMC pPMC) // pointer to a PMC controller

-{

-	return pPMC->PMC_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_GetInterruptMaskStatus

-//* \brief Return PMC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status

-	AT91PS_PMC pPMC) // pointer to a PMC controller

-{

-	return pPMC->PMC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_IsInterruptMasked

-//* \brief Test if PMC Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_IsInterruptMasked(

-        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_IsStatusSet

-//* \brief Test if PMC Status is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PMC_IsStatusSet(

-        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PMC_GetStatus(pPMC) & flag);

-}/* *****************************************************************************

-                SOFTWARE API FOR RSTC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTSoftReset

-//* \brief Start Software Reset

-//*----------------------------------------------------------------------------

-__inline void AT91F_RSTSoftReset(

-        AT91PS_RSTC pRSTC,

-        unsigned int reset)

-{

-	pRSTC->RSTC_RCR = (0xA5000000 | reset);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTSetMode

-//* \brief Set Reset Mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_RSTSetMode(

-        AT91PS_RSTC pRSTC,

-        unsigned int mode)

-{

-	pRSTC->RSTC_RMR = (0xA5000000 | mode);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTGetMode

-//* \brief Get Reset Mode

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_RSTGetMode(

-        AT91PS_RSTC pRSTC)

-{

-	return (pRSTC->RSTC_RMR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTGetStatus

-//* \brief Get Reset Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_RSTGetStatus(

-        AT91PS_RSTC pRSTC)

-{

-	return (pRSTC->RSTC_RSR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTIsSoftRstActive

-//* \brief Return !=0 if software reset is still not completed

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_RSTIsSoftRstActive(

-        AT91PS_RSTC pRSTC)

-{

-	return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP);

-}

-/* *****************************************************************************

-                SOFTWARE API FOR RTTC

-   ***************************************************************************** */

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_SetRTT_TimeBase()

-//* \brief  Set the RTT prescaler according to the TimeBase in ms

-//*--------------------------------------------------------------------------------------

-__inline unsigned int AT91F_RTTSetTimeBase(

-        AT91PS_RTTC pRTTC,

-        unsigned int ms)

-{

-	if (ms > 2000)

-		return 1;   // AT91C_TIME_OUT_OF_RANGE

-	pRTTC->RTTC_RTMR &= ~0xFFFF;	

-	pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF);	

-	return 0;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTTSetPrescaler()

-//* \brief  Set the new prescaler value

-//*--------------------------------------------------------------------------------------

-__inline unsigned int AT91F_RTTSetPrescaler(

-        AT91PS_RTTC pRTTC,

-        unsigned int rtpres)

-{

-	pRTTC->RTTC_RTMR &= ~0xFFFF;	

-	pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF);	

-	return (pRTTC->RTTC_RTMR);

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTTRestart()

-//* \brief  Restart the RTT prescaler

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTRestart(

-        AT91PS_RTTC pRTTC)

-{

-	pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST;	

-}

-

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_SetAlarmINT()

-//* \brief  Enable RTT Alarm Interrupt

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTSetAlarmINT(

-        AT91PS_RTTC pRTTC)

-{

-	pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_ClearAlarmINT()

-//* \brief  Disable RTT Alarm Interrupt

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTClearAlarmINT(

-        AT91PS_RTTC pRTTC)

-{

-	pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_SetRttIncINT()

-//* \brief  Enable RTT INC Interrupt

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTSetRttIncINT(

-        AT91PS_RTTC pRTTC)

-{

-	pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_ClearRttIncINT()

-//* \brief  Disable RTT INC Interrupt

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTClearRttIncINT(

-        AT91PS_RTTC pRTTC)

-{

-	pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_SetAlarmValue()

-//* \brief  Set RTT Alarm Value

-//*--------------------------------------------------------------------------------------

-__inline void AT91F_RTTSetAlarmValue(

-        AT91PS_RTTC pRTTC, unsigned int alarm)

-{

-	pRTTC->RTTC_RTAR = alarm;

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_GetAlarmValue()

-//* \brief  Get RTT Alarm Value

-//*--------------------------------------------------------------------------------------

-__inline unsigned int AT91F_RTTGetAlarmValue(

-        AT91PS_RTTC pRTTC)

-{

-	return(pRTTC->RTTC_RTAR);

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTTGetStatus()

-//* \brief  Read the RTT status

-//*--------------------------------------------------------------------------------------

-__inline unsigned int AT91F_RTTGetStatus(

-        AT91PS_RTTC pRTTC)

-{

-	return(pRTTC->RTTC_RTSR);

-}

-

-//*--------------------------------------------------------------------------------------

-//* \fn     AT91F_RTT_ReadValue()

-//* \brief  Read the RTT value

-//*--------------------------------------------------------------------------------------

-__inline unsigned int AT91F_RTTReadValue(

-        AT91PS_RTTC pRTTC)

-{

-        register volatile unsigned int val1,val2;

-	do

-	{

-		val1 = pRTTC->RTTC_RTVR;

-		val2 = pRTTC->RTTC_RTVR;

-	}	

-	while(val1 != val2);

-	return(val1);

-}

-/* *****************************************************************************

-                SOFTWARE API FOR PITC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITInit

-//* \brief System timer init : period in µsecond, system clock freq in MHz

-//*----------------------------------------------------------------------------

-__inline void AT91F_PITInit(

-        AT91PS_PITC pPITC,

-        unsigned int period,

-        unsigned int pit_frequency)

-{

-	pPITC->PITC_PIMR = period? (period * pit_frequency + 8) >> 4 : 0; // +8 to avoid %10 and /10

-	pPITC->PITC_PIMR |= AT91C_PITC_PITEN;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITSetPIV

-//* \brief Set the PIT Periodic Interval Value

-//*----------------------------------------------------------------------------

-__inline void AT91F_PITSetPIV(

-        AT91PS_PITC pPITC,

-        unsigned int piv)

-{

-	pPITC->PITC_PIMR = piv | (pPITC->PITC_PIMR & (AT91C_PITC_PITEN | AT91C_PITC_PITIEN));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITEnableInt

-//* \brief Enable PIT periodic interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PITEnableInt(

-        AT91PS_PITC pPITC)

-{

-	pPITC->PITC_PIMR |= AT91C_PITC_PITIEN;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITDisableInt

-//* \brief Disable PIT periodic interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PITDisableInt(

-        AT91PS_PITC pPITC)

-{

-	pPITC->PITC_PIMR &= ~AT91C_PITC_PITIEN;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITGetMode

-//* \brief Read PIT mode register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PITGetMode(

-        AT91PS_PITC pPITC)

-{

-	return(pPITC->PITC_PIMR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITGetStatus

-//* \brief Read PIT status register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PITGetStatus(

-        AT91PS_PITC pPITC)

-{

-	return(pPITC->PITC_PISR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITGetPIIR

-//* \brief Read PIT CPIV and PICNT without ressetting the counters

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PITGetPIIR(

-        AT91PS_PITC pPITC)

-{

-	return(pPITC->PITC_PIIR);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITGetPIVR

-//* \brief Read System timer CPIV and PICNT without ressetting the counters

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PITGetPIVR(

-        AT91PS_PITC pPITC)

-{

-	return(pPITC->PITC_PIVR);

-}

-/* *****************************************************************************

-                SOFTWARE API FOR WDTC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_WDTSetMode

-//* \brief Set Watchdog Mode Register

-//*----------------------------------------------------------------------------

-__inline void AT91F_WDTSetMode(

-        AT91PS_WDTC pWDTC,

-        unsigned int Mode)

-{

-	pWDTC->WDTC_WDMR = Mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_WDTRestart

-//* \brief Restart Watchdog

-//*----------------------------------------------------------------------------

-__inline void AT91F_WDTRestart(

-        AT91PS_WDTC pWDTC)

-{

-	pWDTC->WDTC_WDCR = 0xA5000001;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_WDTSGettatus

-//* \brief Get Watchdog Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_WDTSGettatus(

-        AT91PS_WDTC pWDTC)

-{

-	return(pWDTC->WDTC_WDSR & 0x3);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_WDTGetPeriod

-//* \brief Translate ms into Watchdog Compatible value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_WDTGetPeriod(unsigned int ms)

-{

-	if ((ms < 4) || (ms > 16000))

-		return 0;

-	return((ms << 8) / 1000);

-}

-/* *****************************************************************************

-                SOFTWARE API FOR VREG

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_VREG_Enable_LowPowerMode

-//* \brief Enable VREG Low Power Mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_VREG_Enable_LowPowerMode(

-        AT91PS_VREG pVREG)

-{

-	pVREG->VREG_MR |= AT91C_VREG_PSTDBY;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_VREG_Disable_LowPowerMode

-//* \brief Disable VREG Low Power Mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_VREG_Disable_LowPowerMode(

-        AT91PS_VREG pVREG)

-{

-	pVREG->VREG_MR &= ~AT91C_VREG_PSTDBY;	

-}/* *****************************************************************************

-                SOFTWARE API FOR MC

-   ***************************************************************************** */

-

-#define AT91C_MC_CORRECT_KEY  ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_Remap

-//* \brief Make Remap

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_Remap (void)     //

-{

-    AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC;

-

-    pMC->MC_RCR = AT91C_MC_RCB;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_CfgModeReg

-//* \brief Configure the EFC Mode Register of the MC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_EFC_CfgModeReg (

-	AT91PS_MC pMC, // pointer to a MC controller

-	unsigned int mode)        // mode register

-{

-	// Write to the FMR register

-	pMC->MC_FMR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_GetModeReg

-//* \brief Return MC EFC Mode Regsiter

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_GetModeReg(

-	AT91PS_MC pMC) // pointer to a MC controller

-{

-	return pMC->MC_FMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_ComputeFMCN

-//* \brief Return MC EFC Mode Regsiter

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_ComputeFMCN(

-	int master_clock) // master clock in Hz

-{

-	return (master_clock/1000000 +2);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_PerformCmd

-//* \brief Perform EFC Command

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_EFC_PerformCmd (

-	AT91PS_MC pMC, // pointer to a MC controller

-    unsigned int transfer_cmd)

-{

-	pMC->MC_FCR = transfer_cmd;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_GetStatus

-//* \brief Return MC EFC Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_GetStatus(

-	AT91PS_MC pMC) // pointer to a MC controller

-{

-	return pMC->MC_FSR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_IsInterruptMasked

-//* \brief Test if EFC MC Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_IsInterruptMasked(

-        AT91PS_MC pMC,   // \arg  pointer to a MC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_MC_EFC_GetModeReg(pMC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_EFC_IsInterruptSet

-//* \brief Test if EFC MC Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_MC_EFC_IsInterruptSet(

-        AT91PS_MC pMC,   // \arg  pointer to a MC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_MC_EFC_GetStatus(pMC) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR SPI

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Open

-//* \brief Open a SPI Port

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_Open (

-        const unsigned int null)  // \arg

-{

-        /* NOT DEFINED AT THIS MOMENT */

-        return ( 0 );

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgCs

-//* \brief Configure SPI chip select register

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgCs (

-	AT91PS_SPI pSPI,     // pointer to a SPI controller

-	int cs,     // SPI cs number (0 to 3)

- 	int val)   //  chip select register

-{

-	//* Write to the CSR register

-	*(pSPI->SPI_CSR + cs) = val;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_EnableIt

-//* \brief Enable SPI interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_EnableIt (

-	AT91PS_SPI pSPI,     // pointer to a SPI controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pSPI->SPI_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_DisableIt

-//* \brief Disable SPI interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_DisableIt (

-	AT91PS_SPI pSPI, // pointer to a SPI controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pSPI->SPI_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Reset

-//* \brief Reset the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Reset (

-	AT91PS_SPI pSPI // pointer to a SPI controller

-	)

-{

-	//* Write to the CR register

-	pSPI->SPI_CR = AT91C_SPI_SWRST;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Enable

-//* \brief Enable the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Enable (

-	AT91PS_SPI pSPI // pointer to a SPI controller

-	)

-{

-	//* Write to the CR register

-	pSPI->SPI_CR = AT91C_SPI_SPIEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Disable

-//* \brief Disable the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Disable (

-	AT91PS_SPI pSPI // pointer to a SPI controller

-	)

-{

-	//* Write to the CR register

-	pSPI->SPI_CR = AT91C_SPI_SPIDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgMode

-//* \brief Enable the SPI controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgMode (

-	AT91PS_SPI pSPI, // pointer to a SPI controller

-	int mode)        // mode register

-{

-	//* Write to the MR register

-	pSPI->SPI_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_CfgPCS

-//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_CfgPCS (

-	AT91PS_SPI pSPI, // pointer to a SPI controller

-	char PCS_Device) // PCS of the Device

-{	

- 	//* Write to the MR register

-	pSPI->SPI_MR &= 0xFFF0FFFF;

-	pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS );

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_ReceiveFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_ReceiveFrame (

-	AT91PS_SPI pSPI,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_ReceiveFrame(

-		(AT91PS_PDC) &(pSPI->SPI_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_SendFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_SendFrame(

-	AT91PS_SPI pSPI,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_SendFrame(

-		(AT91PS_PDC) &(pSPI->SPI_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_Close

-//* \brief Close SPI: disable IT disable transfert, close PDC

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_Close (

-	AT91PS_SPI pSPI)     // \arg pointer to a SPI controller

-{

-    //* Reset all the Chip Select register

-    pSPI->SPI_CSR[0] = 0 ;

-    pSPI->SPI_CSR[1] = 0 ;

-    pSPI->SPI_CSR[2] = 0 ;

-    pSPI->SPI_CSR[3] = 0 ;

-

-    //* Reset the SPI mode

-    pSPI->SPI_MR = 0  ;

-

-    //* Disable all interrupts

-    pSPI->SPI_IDR = 0xFFFFFFFF ;

-

-    //* Abort the Peripheral Data Transfers

-    AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR));

-

-    //* Disable receiver and transmitter and stop any activity immediately

-    pSPI->SPI_CR = AT91C_SPI_SPIDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_PutChar

-//* \brief Send a character,does not check if ready to send

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI_PutChar (

-	AT91PS_SPI pSPI,

-	unsigned int character,

-             unsigned int cs_number )

-{

-    unsigned int value_for_cs;

-    value_for_cs = (~(1 << cs_number)) & 0xF;  //Place a zero among a 4 ONEs number

-    pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_GetChar

-//* \brief Receive a character,does not check if a character is available

-//*----------------------------------------------------------------------------

-__inline int AT91F_SPI_GetChar (

-	const AT91PS_SPI pSPI)

-{

-    return((pSPI->SPI_RDR) & 0xFFFF);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_GetInterruptMaskStatus

-//* \brief Return SPI Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status

-        AT91PS_SPI pSpi) // \arg  pointer to a SPI controller

-{

-        return pSpi->SPI_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI_IsInterruptMasked

-//* \brief Test if SPI Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline int AT91F_SPI_IsInterruptMasked(

-        AT91PS_SPI pSpi,   // \arg  pointer to a SPI controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR USART

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Baudrate

-//* \brief Calculate the baudrate

-//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity

-#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \

-                        AT91C_US_NBSTOP_1_BIT + \

-                        AT91C_US_PAR_NONE + \

-                        AT91C_US_CHRL_8_BITS + \

-                        AT91C_US_CLKS_CLOCK )

-

-//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity

-#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \

-                            AT91C_US_NBSTOP_1_BIT + \

-                            AT91C_US_PAR_NONE + \

-                            AT91C_US_CHRL_8_BITS + \

-                            AT91C_US_CLKS_EXT )

-

-//* Standard Synchronous Mode : 8 bits , 1 stop , no parity

-#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \

-                       AT91C_US_USMODE_NORMAL + \

-                       AT91C_US_NBSTOP_1_BIT + \

-                       AT91C_US_PAR_NONE + \

-                       AT91C_US_CHRL_8_BITS + \

-                       AT91C_US_CLKS_CLOCK )

-

-//* SCK used Label

-#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT)

-

-//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity

-#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \

-					   		 AT91C_US_CLKS_CLOCK +\

-                       		 AT91C_US_NBSTOP_1_BIT + \

-                       		 AT91C_US_PAR_EVEN + \

-                       		 AT91C_US_CHRL_8_BITS + \

-                       		 AT91C_US_CKLO +\

-                       		 AT91C_US_OVER)

-

-//* Standard IRDA mode

-#define AT91C_US_ASYNC_IRDA_MODE (  AT91C_US_USMODE_IRDA + \

-                            AT91C_US_NBSTOP_1_BIT + \

-                            AT91C_US_PAR_NONE + \

-                            AT91C_US_CHRL_8_BITS + \

-                            AT91C_US_CLKS_CLOCK )

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Baudrate

-//* \brief Caluculate baud_value according to the main clock and the baud rate

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_Baudrate (

-	const unsigned int main_clock, // \arg peripheral clock

-	const unsigned int baud_rate)  // \arg UART baudrate

-{

-	unsigned int baud_value = ((main_clock*10)/(baud_rate * 16));

-	if ((baud_value % 10) >= 5)

-		baud_value = (baud_value / 10) + 1;

-	else

-		baud_value /= 10;

-	return baud_value;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SetBaudrate

-//* \brief Set the baudrate according to the CPU clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_SetBaudrate (

-	AT91PS_USART pUSART,    // \arg pointer to a USART controller

-	unsigned int mainClock, // \arg peripheral clock

-	unsigned int speed)     // \arg UART baudrate

-{

-	//* Define the baud rate divisor register

-	pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SetTimeguard

-//* \brief Set USART timeguard

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_SetTimeguard (

-	AT91PS_USART pUSART,    // \arg pointer to a USART controller

-	unsigned int timeguard) // \arg timeguard value

-{

-	//* Write the Timeguard Register

-	pUSART->US_TTGR = timeguard ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_EnableIt

-//* \brief Enable USART IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_EnableIt (

-	AT91PS_USART pUSART, // \arg pointer to a USART controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pUSART->US_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_DisableIt

-//* \brief Disable USART IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_DisableIt (

-	AT91PS_USART pUSART, // \arg pointer to a USART controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IER register

-	pUSART->US_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Configure

-//* \brief Configure USART

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_Configure (

-	AT91PS_USART pUSART,     // \arg pointer to a USART controller

-	unsigned int mainClock,  // \arg peripheral clock

-	unsigned int mode ,      // \arg mode Register to be programmed

-	unsigned int baudRate ,  // \arg baudrate to be programmed

-	unsigned int timeguard ) // \arg timeguard to be programmed

-{

-    //* Disable interrupts

-    pUSART->US_IDR = (unsigned int) -1;

-

-    //* Reset receiver and transmitter

-    pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ;

-

-	//* Define the baud rate divisor register

-	AT91F_US_SetBaudrate(pUSART, mainClock, baudRate);

-

-	//* Write the Timeguard Register

-	AT91F_US_SetTimeguard(pUSART, timeguard);

-

-    //* Clear Transmit and Receive Counters

-    AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR));

-

-    //* Define the USART mode

-    pUSART->US_MR = mode  ;

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_EnableRx

-//* \brief Enable receiving characters

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_EnableRx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Enable receiver

-    pUSART->US_CR = AT91C_US_RXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_EnableTx

-//* \brief Enable sending characters

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_EnableTx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Enable  transmitter

-    pUSART->US_CR = AT91C_US_TXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_ResetRx

-//* \brief Reset Receiver and re-enable it

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_ResetRx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-	//* Reset receiver

-	pUSART->US_CR = AT91C_US_RSTRX;

-    //* Re-Enable receiver

-    pUSART->US_CR = AT91C_US_RXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_ResetTx

-//* \brief Reset Transmitter and re-enable it

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_ResetTx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-	//* Reset transmitter

-	pUSART->US_CR = AT91C_US_RSTTX;

-    //* Enable transmitter

-    pUSART->US_CR = AT91C_US_TXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_DisableRx

-//* \brief Disable Receiver

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_DisableRx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Disable receiver

-    pUSART->US_CR = AT91C_US_RXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_DisableTx

-//* \brief Disable Transmitter

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_DisableTx (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Disable transmitter

-    pUSART->US_CR = AT91C_US_TXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Close

-//* \brief Close USART: disable IT disable receiver and transmitter, close PDC

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_Close (

-	AT91PS_USART pUSART)     // \arg pointer to a USART controller

-{

-    //* Reset the baud rate divisor register

-    pUSART->US_BRGR = 0 ;

-

-    //* Reset the USART mode

-    pUSART->US_MR = 0  ;

-

-    //* Reset the Timeguard Register

-    pUSART->US_TTGR = 0;

-

-    //* Disable all interrupts

-    pUSART->US_IDR = 0xFFFFFFFF ;

-

-    //* Abort the Peripheral Data Transfers

-    AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR));

-

-    //* Disable receiver and transmitter and stop any activity immediately

-    pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_TxReady

-//* \brief Return 1 if a character can be written in US_THR

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_TxReady (

-	AT91PS_USART pUSART )     // \arg pointer to a USART controller

-{

-    return (pUSART->US_CSR & AT91C_US_TXRDY);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_RxReady

-//* \brief Return 1 if a character can be read in US_RHR

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_RxReady (

-	AT91PS_USART pUSART )     // \arg pointer to a USART controller

-{

-    return (pUSART->US_CSR & AT91C_US_RXRDY);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_Error

-//* \brief Return the error flag

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_Error (

-	AT91PS_USART pUSART )     // \arg pointer to a USART controller

-{

-    return (pUSART->US_CSR &

-    	(AT91C_US_OVRE |  // Overrun error

-    	 AT91C_US_FRAME | // Framing error

-    	 AT91C_US_PARE));  // Parity error

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_PutChar

-//* \brief Send a character,does not check if ready to send

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_PutChar (

-	AT91PS_USART pUSART,

-	int character )

-{

-    pUSART->US_THR = (character & 0x1FF);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_GetChar

-//* \brief Receive a character,does not check if a character is available

-//*----------------------------------------------------------------------------

-__inline int AT91F_US_GetChar (

-	const AT91PS_USART pUSART)

-{

-    return((pUSART->US_RHR) & 0x1FF);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SendFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_SendFrame(

-	AT91PS_USART pUSART,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_SendFrame(

-		(AT91PS_PDC) &(pUSART->US_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_ReceiveFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_US_ReceiveFrame (

-	AT91PS_USART pUSART,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_ReceiveFrame(

-		(AT91PS_PDC) &(pUSART->US_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US_SetIrdaFilter

-//* \brief Set the value of IrDa filter tregister

-//*----------------------------------------------------------------------------

-__inline void AT91F_US_SetIrdaFilter (

-	AT91PS_USART pUSART,

-	unsigned char value

-)

-{

-	pUSART->US_IF = value;

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR SSC

-   ***************************************************************************** */

-//* Define the standard I2S mode configuration

-

-//* Configuration to set in the SSC Transmit Clock Mode Register

-//* Parameters :  nb_bit_by_slot : 8, 16 or 32 bits

-//* 			  nb_slot_by_frame : number of channels

-#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\

-									   AT91C_SSC_CKS_DIV   +\

-                            		   AT91C_SSC_CKO_CONTINOUS      +\

-                            		   AT91C_SSC_CKG_NONE    +\

-                                       AT91C_SSC_START_FALL_RF +\

-                           			   AT91C_SSC_STTOUT  +\

-                            		   ((1<<16) & AT91C_SSC_STTDLY) +\

-                            		   ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24))

-

-

-//* Configuration to set in the SSC Transmit Frame Mode Register

-//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits

-//* 			 nb_slot_by_frame : number of channels

-#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\

-									(nb_bit_by_slot-1)  +\

-                            		AT91C_SSC_MSBF   +\

-                            		(((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB)  +\

-                            		(((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\

-                            		AT91C_SSC_FSOS_NEGATIVE)

-

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_SetBaudrate

-//* \brief Set the baudrate according to the CPU clock

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_SetBaudrate (

-        AT91PS_SSC pSSC,        // \arg pointer to a SSC controller

-        unsigned int mainClock, // \arg peripheral clock

-        unsigned int speed)     // \arg SSC baudrate

-{

-        unsigned int baud_value;

-        //* Define the baud rate divisor register

-        if (speed == 0)

-           baud_value = 0;

-        else

-        {

-           baud_value = (unsigned int) (mainClock * 10)/(2*speed);

-           if ((baud_value % 10) >= 5)

-                  baud_value = (baud_value / 10) + 1;

-           else

-                  baud_value /= 10;

-        }

-

-        pSSC->SSC_CMR = baud_value;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_Configure

-//* \brief Configure SSC

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_Configure (

-             AT91PS_SSC pSSC,          // \arg pointer to a SSC controller

-             unsigned int syst_clock,  // \arg System Clock Frequency

-             unsigned int baud_rate,   // \arg Expected Baud Rate Frequency

-             unsigned int clock_rx,    // \arg Receiver Clock Parameters

-             unsigned int mode_rx,     // \arg mode Register to be programmed

-             unsigned int clock_tx,    // \arg Transmitter Clock Parameters

-             unsigned int mode_tx)     // \arg mode Register to be programmed

-{

-    //* Disable interrupts

-	pSSC->SSC_IDR = (unsigned int) -1;

-

-    //* Reset receiver and transmitter

-	pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ;

-

-    //* Define the Clock Mode Register

-	AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate);

-

-     //* Write the Receive Clock Mode Register

-	pSSC->SSC_RCMR =  clock_rx;

-

-     //* Write the Transmit Clock Mode Register

-	pSSC->SSC_TCMR =  clock_tx;

-

-     //* Write the Receive Frame Mode Register

-	pSSC->SSC_RFMR =  mode_rx;

-

-     //* Write the Transmit Frame Mode Register

-	pSSC->SSC_TFMR =  mode_tx;

-

-    //* Clear Transmit and Receive Counters

-	AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR));

-

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_EnableRx

-//* \brief Enable receiving datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_EnableRx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Enable receiver

-    pSSC->SSC_CR = AT91C_SSC_RXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_DisableRx

-//* \brief Disable receiving datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_DisableRx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Disable receiver

-    pSSC->SSC_CR = AT91C_SSC_RXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_EnableTx

-//* \brief Enable sending datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_EnableTx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Enable  transmitter

-    pSSC->SSC_CR = AT91C_SSC_TXEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_DisableTx

-//* \brief Disable sending datas

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_DisableTx (

-	AT91PS_SSC pSSC)     // \arg pointer to a SSC controller

-{

-    //* Disable  transmitter

-    pSSC->SSC_CR = AT91C_SSC_TXDIS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_EnableIt

-//* \brief Enable SSC IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_EnableIt (

-	AT91PS_SSC pSSC, // \arg pointer to a SSC controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pSSC->SSC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_DisableIt

-//* \brief Disable SSC IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_DisableIt (

-	AT91PS_SSC pSSC, // \arg pointer to a SSC controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IDR register

-	pSSC->SSC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_ReceiveFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SSC_ReceiveFrame (

-	AT91PS_SSC pSSC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_ReceiveFrame(

-		(AT91PS_PDC) &(pSSC->SSC_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_SendFrame

-//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SSC_SendFrame(

-	AT91PS_SSC pSSC,

-	char *pBuffer,

-	unsigned int szBuffer,

-	char *pNextBuffer,

-	unsigned int szNextBuffer )

-{

-	return AT91F_PDC_SendFrame(

-		(AT91PS_PDC) &(pSSC->SSC_RPR),

-		pBuffer,

-		szBuffer,

-		pNextBuffer,

-		szNextBuffer);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_GetInterruptMaskStatus

-//* \brief Return SSC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status

-        AT91PS_SSC pSsc) // \arg  pointer to a SSC controller

-{

-        return pSsc->SSC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_IsInterruptMasked

-//* \brief Test if SSC Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline int AT91F_SSC_IsInterruptMasked(

-        AT91PS_SSC pSsc,   // \arg  pointer to a SSC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR TWI

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_EnableIt

-//* \brief Enable TWI IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_EnableIt (

-	AT91PS_TWI pTWI, // \arg pointer to a TWI controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pTWI->TWI_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_DisableIt

-//* \brief Disable TWI IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_DisableIt (

-	AT91PS_TWI pTWI, // \arg pointer to a TWI controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IDR register

-	pTWI->TWI_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_Configure

-//* \brief Configure TWI in master mode

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI )          // \arg pointer to a TWI controller

-{

-    //* Disable interrupts

-	pTWI->TWI_IDR = (unsigned int) -1;

-

-    //* Reset peripheral

-	pTWI->TWI_CR = AT91C_TWI_SWRST;

-

-	//* Set Master mode

-	pTWI->TWI_CR = AT91C_TWI_MSEN;

-

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_GetInterruptMaskStatus

-//* \brief Return TWI Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status

-        AT91PS_TWI pTwi) // \arg  pointer to a TWI controller

-{

-        return pTwi->TWI_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_IsInterruptMasked

-//* \brief Test if TWI Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline int AT91F_TWI_IsInterruptMasked(

-        AT91PS_TWI pTwi,   // \arg  pointer to a TWI controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR PWMC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_GetStatus

-//* \brief Return PWM Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status

-	AT91PS_PWMC pPWM) // pointer to a PWM controller

-{

-	return pPWM->PWMC_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_InterruptEnable

-//* \brief Enable PWM Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_InterruptEnable(

-        AT91PS_PWMC pPwm,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  PWM interrupt to be enabled

-{

-        pPwm->PWMC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_InterruptDisable

-//* \brief Disable PWM Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_InterruptDisable(

-        AT91PS_PWMC pPwm,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  PWM interrupt to be disabled

-{

-        pPwm->PWMC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_GetInterruptMaskStatus

-//* \brief Return PWM Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status

-        AT91PS_PWMC pPwm) // \arg  pointer to a PWM controller

-{

-        return pPwm->PWMC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_IsInterruptMasked

-//* \brief Test if PWM Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_IsInterruptMasked(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_IsStatusSet

-//* \brief Test if PWM Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_PWMC_IsStatusSet(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_PWMC_GetStatus(pPWM) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_CfgChannel

-//* \brief Test if PWM Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CfgChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int channelId, // \arg PWM channel ID

-        unsigned int mode, // \arg  PWM mode

-        unsigned int period, // \arg PWM period

-        unsigned int duty) // \arg PWM duty cycle

-{

-	pPWM->PWMC_CH[channelId].PWMC_CMR = mode;

-	pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty;

-	pPWM->PWMC_CH[channelId].PWMC_CPRDR = period;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_StartChannel

-//* \brief Enable channel

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_StartChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  Channels IDs to be enabled

-{

-	pPWM->PWMC_ENA = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_StopChannel

-//* \brief Disable channel

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_StopChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int flag) // \arg  Channels IDs to be enabled

-{

-	pPWM->PWMC_DIS = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWM_UpdateChannel

-//* \brief Update Period or Duty Cycle

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_UpdateChannel(

-        AT91PS_PWMC pPWM,   // \arg  pointer to a PWM controller

-        unsigned int channelId, // \arg PWM channel ID

-        unsigned int update) // \arg  Channels IDs to be enabled

-{

-	pPWM->PWMC_CH[channelId].PWMC_CUPDR = update;

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR UDP

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EnableIt

-//* \brief Enable UDP IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EnableIt (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg IT to be enabled

-{

-	//* Write to the IER register

-	pUDP->UDP_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_DisableIt

-//* \brief Disable UDP IT

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_DisableIt (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg IT to be disabled

-{

-	//* Write to the IDR register

-	pUDP->UDP_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_SetAddress

-//* \brief Set UDP functional address

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_SetAddress (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned char address)   // \arg new UDP address

-{

-	pUDP->UDP_FADDR = (AT91C_UDP_FEN | address);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EnableEp

-//* \brief Enable Endpoint

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EnableEp (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned char endpoint)   // \arg endpoint number

-{

-	pUDP->UDP_CSR[endpoint] |= AT91C_UDP_EPEDS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_DisableEp

-//* \brief Enable Endpoint

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_DisableEp (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned char endpoint)   // \arg endpoint number

-{

-	pUDP->UDP_CSR[endpoint] &= ~AT91C_UDP_EPEDS;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_SetState

-//* \brief Set UDP Device state

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_SetState (

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg new UDP address

-{

-	pUDP->UDP_GLBSTATE  &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG);

-	pUDP->UDP_GLBSTATE  |= flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_GetState

-//* \brief return UDP Device state

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state

-	AT91PS_UDP pUDP)     // \arg pointer to a UDP controller

-{

-	return (pUDP->UDP_GLBSTATE  & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_ResetEp

-//* \brief Reset UDP endpoint

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_ResetEp ( // \return the UDP device state

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned int flag)   // \arg Endpoints to be reset

-{

-	pUDP->UDP_RSTEP = flag;

-	pUDP->UDP_RSTEP = 0;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpStall

-//* \brief Endpoint will STALL requests

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpStall(

-	AT91PS_UDP pUDP,     // \arg pointer to a UDP controller

-	unsigned char endpoint)   // \arg endpoint number

-{

-	pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpWrite

-//* \brief Write value in the DPR

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpWrite(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint,  // \arg endpoint number

-	unsigned char value)     // \arg value to be written in the DPR

-{

-	pUDP->UDP_FDR[endpoint] = value;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpRead

-//* \brief Return value from the DPR

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_EpRead(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint)  // \arg endpoint number

-{

-	return pUDP->UDP_FDR[endpoint];

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpEndOfWr

-//* \brief Notify the UDP that values in DPR are ready to be sent

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpEndOfWr(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint)  // \arg endpoint number

-{

-	pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpClear

-//* \brief Clear flag in the endpoint CSR register

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpClear(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint,  // \arg endpoint number

-	unsigned int flag)       // \arg flag to be cleared

-{

-	pUDP->UDP_CSR[endpoint] &= ~(flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpSet

-//* \brief Set flag in the endpoint CSR register

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_EpSet(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint,  // \arg endpoint number

-	unsigned int flag)       // \arg flag to be cleared

-{

-	pUDP->UDP_CSR[endpoint] |= flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_EpStatus

-//* \brief Return the endpoint CSR register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_EpStatus(

-	AT91PS_UDP pUDP,         // \arg pointer to a UDP controller

-	unsigned char endpoint)  // \arg endpoint number

-{

-	return pUDP->UDP_CSR[endpoint];

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_GetInterruptMaskStatus

-//* \brief Return UDP Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status

-        AT91PS_UDP pUdp) // \arg  pointer to a UDP controller

-{

-        return pUdp->UDP_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_IsInterruptMasked

-//* \brief Test if UDP Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline int AT91F_UDP_IsInterruptMasked(

-        AT91PS_UDP pUdp,   // \arg  pointer to a UDP controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR TC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_InterruptEnable

-//* \brief Enable TC Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC_InterruptEnable(

-        AT91PS_TC pTc,   // \arg  pointer to a TC controller

-        unsigned int flag) // \arg  TC interrupt to be enabled

-{

-        pTc->TC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_InterruptDisable

-//* \brief Disable TC Interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC_InterruptDisable(

-        AT91PS_TC pTc,   // \arg  pointer to a TC controller

-        unsigned int flag) // \arg  TC interrupt to be disabled

-{

-        pTc->TC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_GetInterruptMaskStatus

-//* \brief Return TC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status

-        AT91PS_TC pTc) // \arg  pointer to a TC controller

-{

-        return pTc->TC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC_IsInterruptMasked

-//* \brief Test if TC Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline int AT91F_TC_IsInterruptMasked(

-        AT91PS_TC pTc,   // \arg  pointer to a TC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-        return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag);

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR CAN

-   ***************************************************************************** */

-#define	STANDARD_FORMAT 0

-#define	EXTENDED_FORMAT 1

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_InitMailboxRegisters()

-//* \brief Configure the corresponding mailbox

-//*----------------------------------------------------------------------------

-__inline void AT91F_InitMailboxRegisters(AT91PS_CAN_MB	CAN_Mailbox,

-								int  			mode_reg,

-								int 			acceptance_mask_reg,

-								int  			id_reg,

-								int  			data_low_reg,

-								int  			data_high_reg,

-								int  			control_reg)

-{

-	CAN_Mailbox->CAN_MB_MCR 	= 0x0;

-	CAN_Mailbox->CAN_MB_MMR 	= mode_reg;

-	CAN_Mailbox->CAN_MB_MAM 	= acceptance_mask_reg;

-	CAN_Mailbox->CAN_MB_MID 	= id_reg;

-	CAN_Mailbox->CAN_MB_MDL 	= data_low_reg; 		

-	CAN_Mailbox->CAN_MB_MDH 	= data_high_reg;

-	CAN_Mailbox->CAN_MB_MCR 	= control_reg;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_EnableCAN()

-//* \brief

-//*----------------------------------------------------------------------------

-__inline void AT91F_EnableCAN(

-	AT91PS_CAN pCAN)     // pointer to a CAN controller

-{

-	pCAN->CAN_MR |= AT91C_CAN_CANEN;

-

-	// Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver

-	while( (pCAN->CAN_SR & AT91C_CAN_WAKEUP) != AT91C_CAN_WAKEUP );

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DisableCAN()

-//* \brief

-//*----------------------------------------------------------------------------

-__inline void AT91F_DisableCAN(

-	AT91PS_CAN pCAN)     // pointer to a CAN controller

-{

-	pCAN->CAN_MR &= ~AT91C_CAN_CANEN;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_EnableIt

-//* \brief Enable CAN interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_EnableIt (

-	AT91PS_CAN pCAN,     // pointer to a CAN controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pCAN->CAN_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_DisableIt

-//* \brief Disable CAN interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_DisableIt (

-	AT91PS_CAN pCAN, // pointer to a CAN controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pCAN->CAN_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetStatus

-//* \brief Return CAN Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetStatus( // \return CAN Interrupt Status

-	AT91PS_CAN pCAN) // pointer to a CAN controller

-{

-	return pCAN->CAN_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetInterruptMaskStatus

-//* \brief Return CAN Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetInterruptMaskStatus( // \return CAN Interrupt Mask Status

-	AT91PS_CAN pCAN) // pointer to a CAN controller

-{

-	return pCAN->CAN_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_IsInterruptMasked

-//* \brief Test if CAN Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_IsInterruptMasked(

-        AT91PS_CAN pCAN,   // \arg  pointer to a CAN controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_CAN_GetInterruptMaskStatus(pCAN) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_IsStatusSet

-//* \brief Test if CAN Interrupt is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_IsStatusSet(

-        AT91PS_CAN pCAN,   // \arg  pointer to a CAN controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_CAN_GetStatus(pCAN) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgModeReg

-//* \brief Configure the Mode Register of the CAN controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgModeReg (

-	AT91PS_CAN pCAN, // pointer to a CAN controller

-	unsigned int mode)        // mode register

-{

-	//* Write to the MR register

-	pCAN->CAN_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetModeReg

-//* \brief Return the Mode Register of the CAN controller value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetModeReg (

-	AT91PS_CAN pCAN // pointer to a CAN controller

-	)

-{

-	return pCAN->CAN_MR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgBaudrateReg

-//* \brief Configure the Baudrate of the CAN controller for the network

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgBaudrateReg (

-	AT91PS_CAN pCAN, // pointer to a CAN controller

-	unsigned int baudrate_cfg)

-{

-	//* Write to the BR register

-	pCAN->CAN_BR = baudrate_cfg;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetBaudrate

-//* \brief Return the Baudrate of the CAN controller for the network value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetBaudrate (

-	AT91PS_CAN pCAN // pointer to a CAN controller

-	)

-{

-	return pCAN->CAN_BR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetInternalCounter

-//* \brief Return CAN Timer Regsiter Value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetInternalCounter (

-	AT91PS_CAN pCAN // pointer to a CAN controller

-	)

-{

-	return pCAN->CAN_TIM;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetTimestamp

-//* \brief Return CAN Timestamp Register Value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetTimestamp (

-	AT91PS_CAN pCAN // pointer to a CAN controller

-	)

-{

-	return pCAN->CAN_TIMESTP;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetErrorCounter

-//* \brief Return CAN Error Counter Register Value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetErrorCounter (

-	AT91PS_CAN pCAN // pointer to a CAN controller

-	)

-{

-	return pCAN->CAN_ECR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_InitTransferRequest

-//* \brief Request for a transfer on the corresponding mailboxes

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_InitTransferRequest (

-	AT91PS_CAN pCAN, // pointer to a CAN controller

-    unsigned int transfer_cmd)

-{

-	pCAN->CAN_TCR = transfer_cmd;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_InitAbortRequest

-//* \brief Abort the corresponding mailboxes

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_InitAbortRequest (

-	AT91PS_CAN pCAN, // pointer to a CAN controller

-    unsigned int abort_cmd)

-{

-	pCAN->CAN_ACR = abort_cmd;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageModeReg

-//* \brief Program the Message Mode Register

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageModeReg (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int mode)

-{

-	CAN_Mailbox->CAN_MB_MMR = mode;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageModeReg

-//* \brief Return the Message Mode Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageModeReg (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MMR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageIDReg

-//* \brief Program the Message ID Register

-//* \brief Version == 0 for Standard messsage, Version == 1 for Extended

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageIDReg (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int id,

-    unsigned char version)

-{

-	if(version==0)	// IDvA Standard Format

-		CAN_Mailbox->CAN_MB_MID = id<<18;

-	else	// IDvB Extended Format

-		CAN_Mailbox->CAN_MB_MID = id | (1<<29);	// set MIDE bit

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageIDReg

-//* \brief Return the Message ID Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageIDReg (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MID;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageAcceptanceMaskReg

-//* \brief Program the Message Acceptance Mask Register

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageAcceptanceMaskReg (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int mask)

-{

-	CAN_Mailbox->CAN_MB_MAM = mask;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageAcceptanceMaskReg

-//* \brief Return the Message Acceptance Mask Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageAcceptanceMaskReg (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MAM;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetFamilyID

-//* \brief Return the Message ID Register

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetFamilyID (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MFID;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageCtrl

-//* \brief Request and config for a transfer on the corresponding mailbox

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageCtrlReg (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int message_ctrl_cmd)

-{

-	CAN_Mailbox->CAN_MB_MCR = message_ctrl_cmd;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageStatus

-//* \brief Return CAN Mailbox Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageStatus (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MSR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageDataLow

-//* \brief Program data low value

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageDataLow (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int data)

-{

-	CAN_Mailbox->CAN_MB_MDL = data;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageDataLow

-//* \brief Return data low value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageDataLow (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MDL;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgMessageDataHigh

-//* \brief Program data high value

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgMessageDataHigh (

-	AT91PS_CAN_MB	CAN_Mailbox, // pointer to a CAN Mailbox

-    unsigned int data)

-{

-	CAN_Mailbox->CAN_MB_MDH = data;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_GetMessageDataHigh

-//* \brief Return data high value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_GetMessageDataHigh (

-	AT91PS_CAN_MB	CAN_Mailbox) // pointer to a CAN Mailbox

-{

-	return CAN_Mailbox->CAN_MB_MDH;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_Open

-//* \brief Open a CAN Port

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_CAN_Open (

-        const unsigned int null)  // \arg

-{

-        /* NOT DEFINED AT THIS MOMENT */

-        return ( 0 );

-}

-/* *****************************************************************************

-                SOFTWARE API FOR ADC

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_EnableIt

-//* \brief Enable ADC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_EnableIt (

-	AT91PS_ADC pADC,     // pointer to a ADC controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pADC->ADC_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_DisableIt

-//* \brief Disable ADC interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_DisableIt (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pADC->ADC_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetStatus

-//* \brief Return ADC Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status

-	AT91PS_ADC pADC) // pointer to a ADC controller

-{

-	return pADC->ADC_SR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetInterruptMaskStatus

-//* \brief Return ADC Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status

-	AT91PS_ADC pADC) // pointer to a ADC controller

-{

-	return pADC->ADC_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_IsInterruptMasked

-//* \brief Test if ADC Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_IsInterruptMasked(

-        AT91PS_ADC pADC,   // \arg  pointer to a ADC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_IsStatusSet

-//* \brief Test if ADC Status is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_IsStatusSet(

-        AT91PS_ADC pADC,   // \arg  pointer to a ADC controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_ADC_GetStatus(pADC) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgModeReg

-//* \brief Configure the Mode Register of the ADC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgModeReg (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int mode)        // mode register

-{

-	//* Write to the MR register

-	pADC->ADC_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetModeReg

-//* \brief Return the Mode Register of the ADC controller value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetModeReg (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_MR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgTimings

-//* \brief Configure the different necessary timings of the ADC controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgTimings (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int mck_clock, // in MHz

-	unsigned int adc_clock, // in MHz

-	unsigned int startup_time, // in us

-	unsigned int sample_and_hold_time)	// in ns

-{

-	unsigned int prescal,startup,shtim;

-	

-	prescal = mck_clock/(2*adc_clock) - 1;

-	startup = adc_clock*startup_time/8 - 1;

-	shtim = adc_clock*sample_and_hold_time/1000 - 1;

-	

-	//* Write to the MR register

-	pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_EnableChannel

-//* \brief Return ADC Timer Register Value

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_EnableChannel (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int channel)        // mode register

-{

-	//* Write to the CHER register

-	pADC->ADC_CHER = channel;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_DisableChannel

-//* \brief Return ADC Timer Register Value

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_DisableChannel (

-	AT91PS_ADC pADC, // pointer to a ADC controller

-	unsigned int channel)        // mode register

-{

-	//* Write to the CHDR register

-	pADC->ADC_CHDR = channel;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetChannelStatus

-//* \brief Return ADC Timer Register Value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetChannelStatus (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CHSR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_StartConversion

-//* \brief Software request for a analog to digital conversion

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_StartConversion (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	pADC->ADC_CR = AT91C_ADC_START;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_SoftReset

-//* \brief Software reset

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_SoftReset (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	pADC->ADC_CR = AT91C_ADC_SWRST;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetLastConvertedData

-//* \brief Return the Last Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetLastConvertedData (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_LCDR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH0

-//* \brief Return the Channel 0 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH0 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR0;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH1

-//* \brief Return the Channel 1 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH1 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR1;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH2

-//* \brief Return the Channel 2 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH2 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR2;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH3

-//* \brief Return the Channel 3 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH3 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR3;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH4

-//* \brief Return the Channel 4 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH4 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR4;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH5

-//* \brief Return the Channel 5 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH5 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR5;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH6

-//* \brief Return the Channel 6 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH6 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR6;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_GetConvertedDataCH7

-//* \brief Return the Channel 7 Converted Data

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_ADC_GetConvertedDataCH7 (

-	AT91PS_ADC pADC // pointer to a ADC controller

-	)

-{

-	return pADC->ADC_CDR7;	

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR AES

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_EnableIt

-//* \brief Enable AES interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_EnableIt (

-	AT91PS_AES pAES,     // pointer to a AES controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pAES->AES_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_DisableIt

-//* \brief Disable AES interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_DisableIt (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pAES->AES_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_GetStatus

-//* \brief Return AES Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_GetStatus( // \return AES Interrupt Status

-	AT91PS_AES pAES) // pointer to a AES controller

-{

-	return pAES->AES_ISR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_GetInterruptMaskStatus

-//* \brief Return AES Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_GetInterruptMaskStatus( // \return AES Interrupt Mask Status

-	AT91PS_AES pAES) // pointer to a AES controller

-{

-	return pAES->AES_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_IsInterruptMasked

-//* \brief Test if AES Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_IsInterruptMasked(

-        AT91PS_AES pAES,   // \arg  pointer to a AES controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_AES_GetInterruptMaskStatus(pAES) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_IsStatusSet

-//* \brief Test if AES Status is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_IsStatusSet(

-        AT91PS_AES pAES,   // \arg  pointer to a AES controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_AES_GetStatus(pAES) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_CfgModeReg

-//* \brief Configure the Mode Register of the AES controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_CfgModeReg (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned int mode)        // mode register

-{

-	//* Write to the MR register

-	pAES->AES_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_GetModeReg

-//* \brief Return the Mode Register of the AES controller value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_GetModeReg (

-	AT91PS_AES pAES // pointer to a AES controller

-	)

-{

-	return pAES->AES_MR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_StartProcessing

-//* \brief Start Encryption or Decryption

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_StartProcessing (

-	AT91PS_AES pAES // pointer to a AES controller

-	)

-{

-	pAES->AES_CR = AT91C_AES_START;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_SoftReset

-//* \brief Reset AES

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_SoftReset (

-	AT91PS_AES pAES // pointer to a AES controller

-	)

-{

-	pAES->AES_CR = AT91C_AES_SWRST;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_LoadNewSeed

-//* \brief Load New Seed in the random number generator

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_LoadNewSeed (

-	AT91PS_AES pAES // pointer to a AES controller

-	)

-{

-	pAES->AES_CR = AT91C_AES_LOADSEED;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_SetCryptoKey

-//* \brief Set Cryptographic Key x

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_SetCryptoKey (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned char index,

-	unsigned int keyword

-	)

-{

-	pAES->AES_KEYWxR[index] = keyword;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_InputData

-//* \brief Set Input Data x

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_InputData (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned char index,

-	unsigned int indata

-	)

-{

-	pAES->AES_IDATAxR[index] = indata;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_GetOutputData

-//* \brief Get Output Data x

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_AES_GetOutputData (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned char index

-	)

-{

-	return pAES->AES_ODATAxR[index];	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_SetInitializationVector

-//* \brief Set Initialization Vector (or Counter) x

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_SetInitializationVector (

-	AT91PS_AES pAES, // pointer to a AES controller

-	unsigned char index,

-	unsigned int initvector

-	)

-{

-	pAES->AES_IVxR[index] = initvector;	

-}

-

-/* *****************************************************************************

-                SOFTWARE API FOR TDES

-   ***************************************************************************** */

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_EnableIt

-//* \brief Enable TDES interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_EnableIt (

-	AT91PS_TDES pTDES,     // pointer to a TDES controller

-	unsigned int flag)   // IT to be enabled

-{

-	//* Write to the IER register

-	pTDES->TDES_IER = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_DisableIt

-//* \brief Disable TDES interrupt

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_DisableIt (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned int flag) // IT to be disabled

-{

-	//* Write to the IDR register

-	pTDES->TDES_IDR = flag;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_GetStatus

-//* \brief Return TDES Interrupt Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_GetStatus( // \return TDES Interrupt Status

-	AT91PS_TDES pTDES) // pointer to a TDES controller

-{

-	return pTDES->TDES_ISR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_GetInterruptMaskStatus

-//* \brief Return TDES Interrupt Mask Status

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_GetInterruptMaskStatus( // \return TDES Interrupt Mask Status

-	AT91PS_TDES pTDES) // pointer to a TDES controller

-{

-	return pTDES->TDES_IMR;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_IsInterruptMasked

-//* \brief Test if TDES Interrupt is Masked

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_IsInterruptMasked(

-        AT91PS_TDES pTDES,   // \arg  pointer to a TDES controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_TDES_GetInterruptMaskStatus(pTDES) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_IsStatusSet

-//* \brief Test if TDES Status is Set

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_IsStatusSet(

-        AT91PS_TDES pTDES,   // \arg  pointer to a TDES controller

-        unsigned int flag) // \arg  flag to be tested

-{

-	return (AT91F_TDES_GetStatus(pTDES) & flag);

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_CfgModeReg

-//* \brief Configure the Mode Register of the TDES controller

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_CfgModeReg (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned int mode)        // mode register

-{

-	//* Write to the MR register

-	pTDES->TDES_MR = mode;

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_GetModeReg

-//* \brief Return the Mode Register of the TDES controller value

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_GetModeReg (

-	AT91PS_TDES pTDES // pointer to a TDES controller

-	)

-{

-	return pTDES->TDES_MR;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_StartProcessing

-//* \brief Start Encryption or Decryption

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_StartProcessing (

-	AT91PS_TDES pTDES // pointer to a TDES controller

-	)

-{

-	pTDES->TDES_CR = AT91C_TDES_START;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_SoftReset

-//* \brief Reset TDES

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_SoftReset (

-	AT91PS_TDES pTDES // pointer to a TDES controller

-	)

-{

-	pTDES->TDES_CR = AT91C_TDES_SWRST;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_SetCryptoKey1

-//* \brief Set Cryptographic Key 1 Word x

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_SetCryptoKey1 (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index,

-	unsigned int keyword

-	)

-{

-	pTDES->TDES_KEY1WxR[index] = keyword;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_SetCryptoKey2

-//* \brief Set Cryptographic Key 2 Word x

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_SetCryptoKey2 (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index,

-	unsigned int keyword

-	)

-{

-	pTDES->TDES_KEY2WxR[index] = keyword;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_SetCryptoKey3

-//* \brief Set Cryptographic Key 3 Word x

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_SetCryptoKey3 (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index,

-	unsigned int keyword

-	)

-{

-	pTDES->TDES_KEY3WxR[index] = keyword;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_InputData

-//* \brief Set Input Data x

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_InputData (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index,

-	unsigned int indata

-	)

-{

-	pTDES->TDES_IDATAxR[index] = indata;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_GetOutputData

-//* \brief Get Output Data x

-//*----------------------------------------------------------------------------

-__inline unsigned int AT91F_TDES_GetOutputData (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index

-	)

-{

-	return pTDES->TDES_ODATAxR[index];	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_SetInitializationVector

-//* \brief Set Initialization Vector x

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_SetInitializationVector (

-	AT91PS_TDES pTDES, // pointer to a TDES controller

-	unsigned char index,

-	unsigned int initvector

-	)

-{

-	pTDES->TDES_IVxR[index] = initvector;	

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  DBGU

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_DBGU_CfgPIO

-//* \brief Configure PIO controllers to drive DBGU signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_DBGU_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA27_DRXD    ) |

-		((unsigned int) AT91C_PA28_DTXD    ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PMC

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PMC_CfgPIO

-//* \brief Configure PIO controllers to drive PMC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PMC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB30_PCK2    ) |

-		((unsigned int) AT91C_PB29_PCK1    ), // Peripheral A

-		((unsigned int) AT91C_PB20_PCK0    ) |

-		((unsigned int) AT91C_PB0_PCK0    ) |

-		((unsigned int) AT91C_PB22_PCK2    ) |

-		((unsigned int) AT91C_PB21_PCK1    )); // Peripheral B

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA30_PCK2    ) |

-		((unsigned int) AT91C_PA13_PCK1    ) |

-		((unsigned int) AT91C_PA27_PCK3    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_VREG_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  VREG

-//*----------------------------------------------------------------------------

-__inline void AT91F_VREG_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RSTC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  RSTC

-//*----------------------------------------------------------------------------

-__inline void AT91F_RSTC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  SSC

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SSC));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SSC_CfgPIO

-//* \brief Configure PIO controllers to drive SSC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_SSC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA25_RK      ) |

-		((unsigned int) AT91C_PA22_TK      ) |

-		((unsigned int) AT91C_PA21_TF      ) |

-		((unsigned int) AT91C_PA24_RD      ) |

-		((unsigned int) AT91C_PA26_RF      ) |

-		((unsigned int) AT91C_PA23_TD      ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_WDTC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  WDTC

-//*----------------------------------------------------------------------------

-__inline void AT91F_WDTC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US1_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  US1

-//*----------------------------------------------------------------------------

-__inline void AT91F_US1_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_US1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US1_CfgPIO

-//* \brief Configure PIO controllers to drive US1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_US1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PB26_RI1     ) |

-		((unsigned int) AT91C_PB24_DSR1    ) |

-		((unsigned int) AT91C_PB23_DCD1    ) |

-		((unsigned int) AT91C_PB25_DTR1    )); // Peripheral B

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA7_SCK1    ) |

-		((unsigned int) AT91C_PA8_RTS1    ) |

-		((unsigned int) AT91C_PA6_TXD1    ) |

-		((unsigned int) AT91C_PA5_RXD1    ) |

-		((unsigned int) AT91C_PA9_CTS1    ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US0_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  US0

-//*----------------------------------------------------------------------------

-__inline void AT91F_US0_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_US0));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_US0_CfgPIO

-//* \brief Configure PIO controllers to drive US0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_US0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA0_RXD0    ) |

-		((unsigned int) AT91C_PA4_CTS0    ) |

-		((unsigned int) AT91C_PA3_RTS0    ) |

-		((unsigned int) AT91C_PA2_SCK0    ) |

-		((unsigned int) AT91C_PA1_TXD0    ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI1_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  SPI1

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI1_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SPI1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI1_CfgPIO

-//* \brief Configure PIO controllers to drive SPI1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PB16_NPCS13  ) |

-		((unsigned int) AT91C_PB10_NPCS11  ) |

-		((unsigned int) AT91C_PB11_NPCS12  )); // Peripheral B

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA4_NPCS13  ) |

-		((unsigned int) AT91C_PA29_NPCS13  ) |

-		((unsigned int) AT91C_PA21_NPCS10  ) |

-		((unsigned int) AT91C_PA22_SPCK1   ) |

-		((unsigned int) AT91C_PA25_NPCS11  ) |

-		((unsigned int) AT91C_PA2_NPCS11  ) |

-		((unsigned int) AT91C_PA24_MISO1   ) |

-		((unsigned int) AT91C_PA3_NPCS12  ) |

-		((unsigned int) AT91C_PA26_NPCS12  ) |

-		((unsigned int) AT91C_PA23_MOSI1   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI0_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  SPI0

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI0_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SPI0));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_SPI0_CfgPIO

-//* \brief Configure PIO controllers to drive SPI0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_SPI0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PB13_NPCS01  ) |

-		((unsigned int) AT91C_PB17_NPCS03  ) |

-		((unsigned int) AT91C_PB14_NPCS02  )); // Peripheral B

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA16_MISO0   ) |

-		((unsigned int) AT91C_PA13_NPCS01  ) |

-		((unsigned int) AT91C_PA15_NPCS03  ) |

-		((unsigned int) AT91C_PA17_MOSI0   ) |

-		((unsigned int) AT91C_PA18_SPCK0   ) |

-		((unsigned int) AT91C_PA14_NPCS02  ) |

-		((unsigned int) AT91C_PA12_NPCS00  ), // Peripheral A

-		((unsigned int) AT91C_PA7_NPCS01  ) |

-		((unsigned int) AT91C_PA9_NPCS03  ) |

-		((unsigned int) AT91C_PA8_NPCS02  )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PITC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PITC

-//*----------------------------------------------------------------------------

-__inline void AT91F_PITC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  AIC

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_FIQ) |

-		((unsigned int) 1 << AT91C_ID_IRQ0) |

-		((unsigned int) 1 << AT91C_ID_IRQ1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AIC_CfgPIO

-//* \brief Configure PIO controllers to drive AIC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_AIC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA30_IRQ0    ) |

-		((unsigned int) AT91C_PA29_FIQ     ), // Peripheral A

-		((unsigned int) AT91C_PA14_IRQ1    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_AES_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  AES

-//*----------------------------------------------------------------------------

-__inline void AT91F_AES_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_AES));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TWI

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TWI));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TWI_CfgPIO

-//* \brief Configure PIO controllers to drive TWI signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TWI_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA11_TWCK    ) |

-		((unsigned int) AT91C_PA10_TWD     ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  ADC

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_ADC));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_ADC_CfgPIO

-//* \brief Configure PIO controllers to drive ADC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_ADC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PB18_ADTRG   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH3_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH3 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH3_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB22_PWM3    ), // Peripheral A

-		((unsigned int) AT91C_PB30_PWM3    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH2_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH2 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH2_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB21_PWM2    ), // Peripheral A

-		((unsigned int) AT91C_PB29_PWM2    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH1_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB20_PWM1    ), // Peripheral A

-		((unsigned int) AT91C_PB28_PWM1    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CH0_CfgPIO

-//* \brief Configure PIO controllers to drive PWMC_CH0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CH0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB19_PWM0    ), // Peripheral A

-		((unsigned int) AT91C_PB27_PWM0    )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_RTTC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  RTTC

-//*----------------------------------------------------------------------------

-__inline void AT91F_RTTC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_UDP_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  UDP

-//*----------------------------------------------------------------------------

-__inline void AT91F_UDP_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_UDP));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TDES_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TDES

-//*----------------------------------------------------------------------------

-__inline void AT91F_TDES_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TDES));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_EMAC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  EMAC

-//*----------------------------------------------------------------------------

-__inline void AT91F_EMAC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_EMAC));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_EMAC_CfgPIO

-//* \brief Configure PIO controllers to drive EMAC signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_EMAC_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB2_ETX0    ) |

-		((unsigned int) AT91C_PB12_ETXER   ) |

-		((unsigned int) AT91C_PB16_ECOL    ) |

-		((unsigned int) AT91C_PB11_ETX3    ) |

-		((unsigned int) AT91C_PB6_ERX1    ) |

-		((unsigned int) AT91C_PB15_ERXDV   ) |

-		((unsigned int) AT91C_PB13_ERX2    ) |

-		((unsigned int) AT91C_PB3_ETX1    ) |

-		((unsigned int) AT91C_PB8_EMDC    ) |

-		((unsigned int) AT91C_PB5_ERX0    ) |

-		//((unsigned int) AT91C_PB18_EF100   ) |

-		((unsigned int) AT91C_PB14_ERX3    ) |

-		((unsigned int) AT91C_PB4_ECRS_ECRSDV) |

-		((unsigned int) AT91C_PB1_ETXEN   ) |

-		((unsigned int) AT91C_PB10_ETX2    ) |

-		((unsigned int) AT91C_PB0_ETXCK_EREFCK) |

-		((unsigned int) AT91C_PB9_EMDIO   ) |

-		((unsigned int) AT91C_PB7_ERXER   ) |

-		((unsigned int) AT91C_PB17_ERXCK   ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC0_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TC0

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC0_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TC0));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC0_CfgPIO

-//* \brief Configure PIO controllers to drive TC0 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC0_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB23_TIOA0   ) |

-		((unsigned int) AT91C_PB24_TIOB0   ), // Peripheral A

-		((unsigned int) AT91C_PB12_TCLK0   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC1_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TC1

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC1_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TC1));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC1_CfgPIO

-//* \brief Configure PIO controllers to drive TC1 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC1_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB25_TIOA1   ) |

-		((unsigned int) AT91C_PB26_TIOB1   ), // Peripheral A

-		((unsigned int) AT91C_PB19_TCLK1   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC2_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  TC2

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC2_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_TC2));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_TC2_CfgPIO

-//* \brief Configure PIO controllers to drive TC2 signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_TC2_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOB, // PIO controller base address

-		((unsigned int) AT91C_PB28_TIOB2   ) |

-		((unsigned int) AT91C_PB27_TIOA2   ), // Peripheral A

-		0); // Peripheral B

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		0, // Peripheral A

-		((unsigned int) AT91C_PA15_TCLK2   )); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_MC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  MC

-//*----------------------------------------------------------------------------

-__inline void AT91F_MC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_SYS));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIOA_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PIOA

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIOA_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_PIOA));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PIOB_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PIOB

-//*----------------------------------------------------------------------------

-__inline void AT91F_PIOB_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_PIOB));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  CAN

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_CAN));

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_CAN_CfgPIO

-//* \brief Configure PIO controllers to drive CAN signals

-//*----------------------------------------------------------------------------

-__inline void AT91F_CAN_CfgPIO (void)

-{

-	// Configure PIO controllers to periph mode

-	AT91F_PIO_CfgPeriph(

-		AT91C_BASE_PIOA, // PIO controller base address

-		((unsigned int) AT91C_PA20_CANTX   ) |

-		((unsigned int) AT91C_PA19_CANRX   ), // Peripheral A

-		0); // Peripheral B

-}

-

-//*----------------------------------------------------------------------------

-//* \fn    AT91F_PWMC_CfgPMC

-//* \brief Enable Peripheral clock in PMC for  PWMC

-//*----------------------------------------------------------------------------

-__inline void AT91F_PWMC_CfgPMC (void)

-{

-	AT91F_PMC_EnablePeriphClock(

-		AT91C_BASE_PMC, // PIO controller base address

-		((unsigned int) 1 << AT91C_ID_PWMC));

-}

-

-#endif // lib_AT91SAM7X256_H

+//* ----------------------------------------------------------------------------
+//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
+//* ----------------------------------------------------------------------------
+//* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+//* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+//* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+//* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+//* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+//* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+//* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//* ----------------------------------------------------------------------------
+//* File Name           : lib_AT91SAM7X256.h
+//* Object              : AT91SAM7X256 inlined functions
+//* Generated           : AT91 SW Application Group  05/20/2005 (16:22:29)
+//*
+//* CVS Reference       : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003//
+//* CVS Reference       : /lib_pmc_SAM7X.h/1.1/Tue Feb  1 08:32:10 2005//
+//* CVS Reference       : /lib_VREG_6085B.h/1.1/Tue Feb  1 16:20:47 2005//
+//* CVS Reference       : /lib_rstc_6098A.h/1.1/Wed Oct  6 10:39:20 2004//
+//* CVS Reference       : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003//
+//* CVS Reference       : /lib_wdtc_6080A.h/1.1/Wed Oct  6 10:38:30 2004//
+//* CVS Reference       : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002//
+//* CVS Reference       : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003//
+//* CVS Reference       : /lib_pitc_6079A.h/1.2/Tue Nov  9 14:43:56 2004//
+//* CVS Reference       : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005//
+//* CVS Reference       : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005//
+//* CVS Reference       : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004//
+//* CVS Reference       : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003//
+//* CVS Reference       : /lib_rttc_6081A.h/1.1/Wed Oct  6 10:39:38 2004//
+//* CVS Reference       : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005//
+//* CVS Reference       : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005//
+//* CVS Reference       : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003//
+//* CVS Reference       : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004//
+//* CVS Reference       : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003//
+//* CVS Reference       : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003//
+//* CVS Reference       : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004//
+//* CVS Reference       : /lib_pdc.h/1.2/Tue Jul  2 13:29:40 2002//
+//* ----------------------------------------------------------------------------
+
+#ifndef lib_AT91SAM7X256_H
+#define lib_AT91SAM7X256_H
+
+/* *****************************************************************************
+                SOFTWARE API FOR AIC
+   ***************************************************************************** */
+#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20]
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_ConfigureIt
+//* \brief Interrupt Handler Initialization
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_AIC_ConfigureIt (
+    AT91PS_AIC pAic,  // \arg pointer to the AIC registers
+    unsigned int irq_id,     // \arg interrupt number to initialize
+    unsigned int priority,   // \arg priority to give to the interrupt
+    unsigned int src_type,   // \arg activation and sense of activation
+    void (*newHandler) (void) ) // \arg address of the interrupt handler
+{
+    unsigned int oldHandler;
+    unsigned int mask ;
+
+    oldHandler = pAic->AIC_SVR[irq_id];
+
+    mask = 0x1 << irq_id ;
+    //* Disable the interrupt on the interrupt controller
+    pAic->AIC_IDCR = mask ;
+    //* Save the interrupt handler routine pointer and the interrupt priority
+    pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ;
+    //* Store the Source Mode Register
+    pAic->AIC_SMR[irq_id] = src_type | priority  ;
+    //* Clear the interrupt on the interrupt controller
+    pAic->AIC_ICCR = mask ;
+
+    return oldHandler;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_EnableIt
+//* \brief Enable corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_EnableIt (
+    AT91PS_AIC pAic,      // \arg pointer to the AIC registers
+    unsigned int irq_id ) // \arg interrupt number to initialize
+{
+    //* Enable the interrupt on the interrupt controller
+    pAic->AIC_IECR = 0x1 << irq_id ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_DisableIt
+//* \brief Disable corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_DisableIt (
+    AT91PS_AIC pAic,      // \arg pointer to the AIC registers
+    unsigned int irq_id ) // \arg interrupt number to initialize
+{
+    unsigned int mask = 0x1 << irq_id;
+    //* Disable the interrupt on the interrupt controller
+    pAic->AIC_IDCR = mask ;
+    //* Clear the interrupt on the Interrupt Controller ( if one is pending )
+    pAic->AIC_ICCR = mask ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_ClearIt
+//* \brief Clear corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_ClearIt (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg interrupt number to initialize
+{
+    //* Clear the interrupt on the Interrupt Controller ( if one is pending )
+    pAic->AIC_ICCR = (0x1 << irq_id);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_AcknowledgeIt
+//* \brief Acknowledge corresponding IT number
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_AcknowledgeIt (
+    AT91PS_AIC pAic)     // \arg pointer to the AIC registers
+{
+    pAic->AIC_EOICR = pAic->AIC_EOICR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_SetExceptionVector
+//* \brief Configure vector handler
+//*----------------------------------------------------------------------------
+__inline unsigned int  AT91F_AIC_SetExceptionVector (
+    unsigned int *pVector, // \arg pointer to the AIC registers
+    void (*Handler) () )   // \arg Interrupt Handler
+{
+    unsigned int oldVector = *pVector;
+
+    if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE)
+        *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE;
+    else
+        *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000;
+
+    return oldVector;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_Trig
+//* \brief Trig an IT
+//*----------------------------------------------------------------------------
+__inline void  AT91F_AIC_Trig (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg interrupt number
+{
+    pAic->AIC_ISCR = (0x1 << irq_id) ;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_IsActive
+//* \brief Test if an IT is active
+//*----------------------------------------------------------------------------
+__inline unsigned int  AT91F_AIC_IsActive (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg Interrupt Number
+{
+    return (pAic->AIC_ISR & (0x1 << irq_id));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_IsPending
+//* \brief Test if an IT is pending
+//*----------------------------------------------------------------------------
+__inline unsigned int  AT91F_AIC_IsPending (
+    AT91PS_AIC pAic,     // \arg pointer to the AIC registers
+    unsigned int irq_id) // \arg Interrupt Number
+{
+    return (pAic->AIC_IPR & (0x1 << irq_id));
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_AIC_Open
+//* \brief Set exception vectors and AIC registers to default values
+//*----------------------------------------------------------------------------
+__inline void AT91F_AIC_Open(
+    AT91PS_AIC pAic,        // \arg pointer to the AIC registers
+    void (*IrqHandler) (),  // \arg Default IRQ vector exception
+    void (*FiqHandler) (),  // \arg Default FIQ vector exception
+    void (*DefaultHandler)  (), // \arg Default Handler set in ISR
+    void (*SpuriousHandler) (), // \arg Default Spurious Handler
+    unsigned int protectMode)   // \arg Debug Control Register
+{
+    int i;
+
+    // Disable all interrupts and set IVR to the default handler
+    for (i = 0; i < 32; ++i) {
+        AT91F_AIC_DisableIt(pAic, i);
+        AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler);
+    }
+
+    // Set the IRQ exception vector
+    AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler);
+    // Set the Fast Interrupt exception vector
+    AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler);
+
+    pAic->AIC_SPU = (unsigned int) SpuriousHandler;
+    pAic->AIC_DCR = protectMode;
+}
+/* *****************************************************************************
+                SOFTWARE API FOR PDC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetNextRx
+//* \brief Set the next receive transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetNextRx (
+    AT91PS_PDC pPDC,     // \arg pointer to a PDC controller
+    char *address,       // \arg address to the next bloc to be received
+    unsigned int bytes)  // \arg number of bytes to be received
+{
+    pPDC->PDC_RNPR = (unsigned int) address;
+    pPDC->PDC_RNCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetNextTx
+//* \brief Set the next transmit transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetNextTx (
+    AT91PS_PDC pPDC,       // \arg pointer to a PDC controller
+    char *address,         // \arg address to the next bloc to be transmitted
+    unsigned int bytes)    // \arg number of bytes to be transmitted
+{
+    pPDC->PDC_TNPR = (unsigned int) address;
+    pPDC->PDC_TNCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetRx
+//* \brief Set the receive transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetRx (
+    AT91PS_PDC pPDC,       // \arg pointer to a PDC controller
+    char *address,         // \arg address to the next bloc to be received
+    unsigned int bytes)    // \arg number of bytes to be received
+{
+    pPDC->PDC_RPR = (unsigned int) address;
+    pPDC->PDC_RCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SetTx
+//* \brief Set the transmit transfer descriptor
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_SetTx (
+    AT91PS_PDC pPDC,       // \arg pointer to a PDC controller
+    char *address,         // \arg address to the next bloc to be transmitted
+    unsigned int bytes)    // \arg number of bytes to be transmitted
+{
+    pPDC->PDC_TPR = (unsigned int) address;
+    pPDC->PDC_TCR = bytes;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_EnableTx
+//* \brief Enable transmit
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_EnableTx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_TXTEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_EnableRx
+//* \brief Enable receive
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_EnableRx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_RXTEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_DisableTx
+//* \brief Disable transmit
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_DisableTx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_TXTDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_DisableRx
+//* \brief Disable receive
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_DisableRx (
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    pPDC->PDC_PTCR = AT91C_PDC_RXTDIS;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsTxEmpty
+//* \brief Test if the current transfer descriptor has been sent
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_TCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsNextTxEmpty
+//* \brief Test if the next transfer descriptor has been moved to the current td
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_TNCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsRxEmpty
+//* \brief Test if the current transfer descriptor has been filled
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_RCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_IsNextRxEmpty
+//* \brief Test if the next transfer descriptor has been moved to the current td
+//*----------------------------------------------------------------------------
+__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete
+    AT91PS_PDC pPDC )       // \arg pointer to a PDC controller
+{
+    return !(pPDC->PDC_RNCR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_Open
+//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_Open (
+    AT91PS_PDC pPDC)       // \arg pointer to a PDC controller
+{
+    //* Disable the RX and TX PDC transfer requests
+    AT91F_PDC_DisableRx(pPDC);
+    AT91F_PDC_DisableTx(pPDC);
+
+    //* Reset all Counter register Next buffer first
+    AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetRx(pPDC, (char *) 0, 0);
+
+    //* Enable the RX and TX PDC transfer requests
+    AT91F_PDC_EnableRx(pPDC);
+    AT91F_PDC_EnableTx(pPDC);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_Close
+//* \brief Close PDC: disable TX and RX reset transfer descriptors
+//*----------------------------------------------------------------------------
+__inline void AT91F_PDC_Close (
+    AT91PS_PDC pPDC)       // \arg pointer to a PDC controller
+{
+    //* Disable the RX and TX PDC transfer requests
+    AT91F_PDC_DisableRx(pPDC);
+    AT91F_PDC_DisableTx(pPDC);
+
+    //* Reset all Counter register Next buffer first
+    AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetTx(pPDC, (char *) 0, 0);
+    AT91F_PDC_SetRx(pPDC, (char *) 0, 0);
+
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_SendFrame
+//* \brief Close PDC: disable TX and RX reset transfer descriptors
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PDC_SendFrame(
+    AT91PS_PDC pPDC,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    if (AT91F_PDC_IsTxEmpty(pPDC)) {
+        //* Buffer and next buffer can be initialized
+        AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer);
+        AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer);
+        return 2;
+    }
+    else if (AT91F_PDC_IsNextTxEmpty(pPDC)) {
+        //* Only one buffer can be initialized
+        AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer);
+        return 1;
+    }
+    else {
+        //* All buffer are in use...
+        return 0;
+    }
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PDC_ReceiveFrame
+//* \brief Close PDC: disable TX and RX reset transfer descriptors
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PDC_ReceiveFrame (
+    AT91PS_PDC pPDC,
+    char *pBuffer,
+    unsigned int szBuffer,
+    char *pNextBuffer,
+    unsigned int szNextBuffer )
+{
+    if (AT91F_PDC_IsRxEmpty(pPDC)) {
+        //* Buffer and next buffer can be initialized
+        AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer);
+        AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer);
+        return 2;
+    }
+    else if (AT91F_PDC_IsNextRxEmpty(pPDC)) {
+        //* Only one buffer can be initialized
+        AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer);
+        return 1;
+    }
+    else {
+        //* All buffer are in use...
+        return 0;
+    }
+}
+/* *****************************************************************************
+                SOFTWARE API FOR DBGU
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_InterruptEnable
+//* \brief Enable DBGU Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_DBGU_InterruptEnable(
+        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller
+        unsigned int flag) // \arg  dbgu interrupt to be enabled
+{
+        pDbgu->DBGU_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_InterruptDisable
+//* \brief Disable DBGU Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_DBGU_InterruptDisable(
+        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller
+        unsigned int flag) // \arg  dbgu interrupt to be disabled
+{
+        pDbgu->DBGU_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_GetInterruptMaskStatus
+//* \brief Return DBGU Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status
+        AT91PS_DBGU pDbgu) // \arg  pointer to a DBGU controller
+{
+        return pDbgu->DBGU_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_DBGU_IsInterruptMasked
+//* \brief Test if DBGU Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_DBGU_IsInterruptMasked(
+        AT91PS_DBGU pDbgu,   // \arg  pointer to a DBGU controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR PIO
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgPeriph
+//* \brief Enable pins to be drived by peripheral
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgPeriph(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int periphAEnable,  // \arg PERIPH A to enable
+    unsigned int periphBEnable)  // \arg PERIPH B to enable
+
+{
+    pPio->PIO_ASR = periphAEnable;
+    pPio->PIO_BSR = periphBEnable;
+    pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgOutput
+//* \brief Enable PIO in output mode
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgOutput(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int pioEnable)      // \arg PIO to be enabled
+{
+    pPio->PIO_PER = pioEnable; // Set in PIO mode
+    pPio->PIO_OER = pioEnable; // Configure in Output
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgInput
+//* \brief Enable PIO in input mode
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgInput(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int inputEnable)      // \arg PIO to be enabled
+{
+    // Disable output
+    pPio->PIO_ODR  = inputEnable;
+    pPio->PIO_PER  = inputEnable;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgOpendrain
+//* \brief Configure PIO in open drain
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgOpendrain(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int multiDrvEnable) // \arg pio to be configured in open drain
+{
+    // Configure the multi-drive option
+    pPio->PIO_MDDR = ~multiDrvEnable;
+    pPio->PIO_MDER = multiDrvEnable;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgPullup
+//* \brief Enable pullup on PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgPullup(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int pullupEnable)   // \arg enable pullup on PIO
+{
+        // Connect or not Pullup
+    pPio->PIO_PPUDR = ~pullupEnable;
+    pPio->PIO_PPUER = pullupEnable;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgDirectDrive
+//* \brief Enable direct drive on PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgDirectDrive(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int directDrive)    // \arg PIO to be configured with direct drive
+
+{
+    // Configure the Direct Drive
+    pPio->PIO_OWDR  = ~directDrive;
+    pPio->PIO_OWER  = directDrive;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_CfgInputFilter
+//* \brief Enable input filter on input PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_CfgInputFilter(
+    AT91PS_PIO pPio,             // \arg pointer to a PIO controller
+    unsigned int inputFilter)    // \arg PIO to be configured with input filter
+
+{
+    // Configure the Direct Drive
+    pPio->PIO_IFDR  = ~inputFilter;
+    pPio->PIO_IFER  = inputFilter;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInput
+//* \brief Return PIO input value
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInput( // \return PIO input
+    AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+    return pPio->PIO_PDSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInputSet
+//* \brief Test if PIO is input flag is active
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInputSet(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PIO_GetInput(pPio) & flag);
+}
+
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_SetOutput
+//* \brief Set to 1 output PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_SetOutput(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  output to be set
+{
+    pPio->PIO_SODR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_ClearOutput
+//* \brief Set to 0 output PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_ClearOutput(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  output to be cleared
+{
+    pPio->PIO_CODR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_ForceOutput
+//* \brief Force output when Direct drive option is enabled
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_ForceOutput(
+    AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+    unsigned int flag) // \arg  output to be forced
+{
+    pPio->PIO_ODSR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_Enable
+//* \brief Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_Enable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be enabled
+{
+        pPio->PIO_PER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_Disable
+//* \brief Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_Disable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be disabled
+{
+        pPio->PIO_PDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetStatus
+//* \brief Return PIO Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_PSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsSet
+//* \brief Test if PIO is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputEnable
+//* \brief Output Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output to be enabled
+{
+        pPio->PIO_OER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputDisable
+//* \brief Output Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output to be disabled
+{
+        pPio->PIO_ODR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetOutputStatus
+//* \brief Return PIO Output Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_OSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsOuputSet
+//* \brief Test if PIO Output is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsOutputSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetOutputStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InputFilterEnable
+//* \brief Input Filter Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InputFilterEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio input filter to be enabled
+{
+        pPio->PIO_IFER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InputFilterDisable
+//* \brief Input Filter Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InputFilterDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio input filter to be disabled
+{
+        pPio->PIO_IFDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInputFilterStatus
+//* \brief Return PIO Input Filter Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_IFSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInputFilterSet
+//* \brief Test if PIO Input filter is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInputFilterSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetInputFilterStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetOutputDataStatus
+//* \brief Return PIO Output Data Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status
+    AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_ODSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InterruptEnable
+//* \brief Enable PIO Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InterruptEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio interrupt to be enabled
+{
+        pPio->PIO_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_InterruptDisable
+//* \brief Disable PIO Interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_InterruptDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio interrupt to be disabled
+{
+        pPio->PIO_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInterruptMaskStatus
+//* \brief Return PIO Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetInterruptStatus
+//* \brief Return PIO Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_ISR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInterruptMasked
+//* \brief Test if PIO Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInterruptMasked(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsInterruptSet
+//* \brief Test if PIO Interrupt is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsInterruptSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetInterruptStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_MultiDriverEnable
+//* \brief Multi Driver Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_MultiDriverEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be enabled
+{
+        pPio->PIO_MDER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_MultiDriverDisable
+//* \brief Multi Driver Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_MultiDriverDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio to be disabled
+{
+        pPio->PIO_MDDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetMultiDriverStatus
+//* \brief Return PIO Multi Driver Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_MDSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsMultiDriverSet
+//* \brief Test if PIO MultiDriver is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsMultiDriverSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_A_RegisterSelection
+//* \brief PIO A Register Selection
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_A_RegisterSelection(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio A register selection
+{
+        pPio->PIO_ASR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_B_RegisterSelection
+//* \brief PIO B Register Selection
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_B_RegisterSelection(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio B register selection
+{
+        pPio->PIO_BSR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_Get_AB_RegisterStatus
+//* \brief Return PIO Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_ABSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsAB_RegisterSet
+//* \brief Test if PIO AB Register is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsAB_RegisterSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputWriteEnable
+//* \brief Output Write Enable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputWriteEnable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output write to be enabled
+{
+        pPio->PIO_OWER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_OutputWriteDisable
+//* \brief Output Write Disable PIO
+//*----------------------------------------------------------------------------
+__inline void AT91F_PIO_OutputWriteDisable(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  pio output write to be disabled
+{
+        pPio->PIO_OWDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetOutputWriteStatus
+//* \brief Return PIO Output Write Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_OWSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsOutputWriteSet
+//* \brief Test if PIO OutputWrite is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsOutputWriteSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_GetCfgPullup
+//* \brief Return PIO Configuration Pullup
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup
+        AT91PS_PIO pPio) // \arg  pointer to a PIO controller
+{
+        return pPio->PIO_PPUSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsOutputDataStatusSet
+//* \brief Test if PIO Output Data Status is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsOutputDataStatusSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (AT91F_PIO_GetOutputDataStatus(pPio) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PIO_IsCfgPullupStatusSet
+//* \brief Test if PIO Configuration Pullup Status is Set
+//*----------------------------------------------------------------------------
+__inline int AT91F_PIO_IsCfgPullupStatusSet(
+        AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
+        unsigned int flag) // \arg  flag to be tested
+{
+        return (~AT91F_PIO_GetCfgPullup(pPio) & flag);
+}
+
+/* *****************************************************************************
+                SOFTWARE API FOR PMC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgSysClkEnableReg
+//* \brief Configure the System Clock Enable Register of the PMC controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgSysClkEnableReg (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int mode)
+{
+    //* Write to the SCER register
+    pPMC->PMC_SCER = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgSysClkDisableReg
+//* \brief Configure the System Clock Disable Register of the PMC controller
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgSysClkDisableReg (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int mode)
+{
+    //* Write to the SCDR register
+    pPMC->PMC_SCDR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetSysClkStatusReg
+//* \brief Return the System Clock Status Register of the PMC controller
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetSysClkStatusReg (
+    AT91PS_PMC pPMC // pointer to a CAN controller
+    )
+{
+    return pPMC->PMC_SCSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_EnablePeriphClock
+//* \brief Enable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_EnablePeriphClock (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int periphIds)  // \arg IDs of peripherals to enable
+{
+    pPMC->PMC_PCER = periphIds;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_DisablePeriphClock
+//* \brief Disable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_DisablePeriphClock (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int periphIds)  // \arg IDs of peripherals to enable
+{
+    pPMC->PMC_PCDR = periphIds;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetPeriphClock
+//* \brief Get peripheral clock status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetPeriphClock (
+    AT91PS_PMC pPMC) // \arg pointer to PMC controller
+{
+    return pPMC->PMC_PCSR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_CfgMainOscillatorReg
+//* \brief Cfg the main oscillator
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_CfgMainOscillatorReg (
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int mode)
+{
+    pCKGR->CKGR_MOR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_GetMainOscillatorReg
+//* \brief Cfg the main oscillator
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_CKGR_GetMainOscillatorReg (
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    return pCKGR->CKGR_MOR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_EnableMainOscillator
+//* \brief Enable the main oscillator
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_EnableMainOscillator(
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_DisableMainOscillator
+//* \brief Disable the main oscillator
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_DisableMainOscillator (
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_CfgMainOscStartUpTime
+//* \brief Cfg MOR Register according to the main osc startup time
+//*----------------------------------------------------------------------------
+__inline void AT91F_CKGR_CfgMainOscStartUpTime (
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int startup_time,  // \arg main osc startup time in microsecond (us)
+    unsigned int slowClock)  // \arg slowClock in Hz
+{
+    pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT;
+    pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_GetMainClockFreqReg
+//* \brief Cfg the main oscillator
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_CKGR_GetMainClockFreqReg (
+    AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+    return pCKGR->CKGR_MCFR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_CKGR_GetMainClock
+//* \brief Return Main clock in Hz
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_CKGR_GetMainClock (
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int slowClock)  // \arg slowClock in Hz
+{
+    return ((pCKGR->CKGR_MCFR  & AT91C_CKGR_MAINF) * slowClock) >> 4;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_CfgMCKReg
+//* \brief Cfg Master Clock Register
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_CfgMCKReg (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int mode)
+{
+    pPMC->PMC_MCKR = mode;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetMCKReg
+//* \brief Return Master Clock Register
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetMCKReg(
+    AT91PS_PMC pPMC) // \arg pointer to PMC controller
+{
+    return pPMC->PMC_MCKR;
+}
+
+//*------------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetMasterClock
+//* \brief Return master clock in Hz which correponds to processor clock for ARM7
+//*------------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetMasterClock (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+    unsigned int slowClock)  // \arg slowClock in Hz
+{
+    unsigned int reg = pPMC->PMC_MCKR;
+    unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2));
+    unsigned int pllDivider, pllMultiplier;
+
+    switch (reg & AT91C_PMC_CSS) {
+        case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected
+            return slowClock / prescaler;
+        case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected
+            return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler;
+        case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected
+            reg = pCKGR->CKGR_PLLR;
+            pllDivider    = (reg  & AT91C_CKGR_DIV);
+            pllMultiplier = ((reg  & AT91C_CKGR_MUL) >> 16) + 1;
+            return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler;
+    }
+    return 0;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_EnablePCK
+//* \brief Enable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_EnablePCK (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int pck,  // \arg Peripheral clock identifier 0 .. 7
+    unsigned int mode)
+{
+    pPMC->PMC_PCKR[pck] = mode;
+    pPMC->PMC_SCER = (1 << pck) << 8;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_DisablePCK
+//* \brief Enable peripheral clock
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_DisablePCK (
+    AT91PS_PMC pPMC, // \arg pointer to PMC controller
+    unsigned int pck)  // \arg Peripheral clock identifier 0 .. 7
+{
+    pPMC->PMC_SCDR = (1 << pck) << 8;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_EnableIt
+//* \brief Enable PMC interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_EnableIt (
+    AT91PS_PMC pPMC,     // pointer to a PMC controller
+    unsigned int flag)   // IT to be enabled
+{
+    //* Write to the IER register
+    pPMC->PMC_IER = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_DisableIt
+//* \brief Disable PMC interrupt
+//*----------------------------------------------------------------------------
+__inline void AT91F_PMC_DisableIt (
+    AT91PS_PMC pPMC, // pointer to a PMC controller
+    unsigned int flag) // IT to be disabled
+{
+    //* Write to the IDR register
+    pPMC->PMC_IDR = flag;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetStatus
+//* \brief Return PMC Interrupt Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status
+    AT91PS_PMC pPMC) // pointer to a PMC controller
+{
+    return pPMC->PMC_SR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_GetInterruptMaskStatus
+//* \brief Return PMC Interrupt Mask Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status
+    AT91PS_PMC pPMC) // pointer to a PMC controller
+{
+    return pPMC->PMC_IMR;
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_IsInterruptMasked
+//* \brief Test if PMC Interrupt is Masked
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_IsInterruptMasked(
+        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PMC_IsStatusSet
+//* \brief Test if PMC Status is Set
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_PMC_IsStatusSet(
+        AT91PS_PMC pPMC,   // \arg  pointer to a PMC controller
+        unsigned int flag) // \arg  flag to be tested
+{
+    return (AT91F_PMC_GetStatus(pPMC) & flag);
+}/* *****************************************************************************
+                SOFTWARE API FOR RSTC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_RSTSoftReset
+//* \brief Start Software Reset
+//*----------------------------------------------------------------------------
+__inline void AT91F_RSTSoftReset(
+        AT91PS_RSTC pRSTC,
+        unsigned int reset)
+{
+    pRSTC->RSTC_RCR = (0xA5000000 | reset);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_RSTSetMode
+//* \brief Set Reset Mode
+//*----------------------------------------------------------------------------
+__inline void AT91F_RSTSetMode(
+        AT91PS_RSTC pRSTC,
+        unsigned int mode)
+{
+    pRSTC->RSTC_RMR = (0xA5000000 | mode);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_RSTGetMode
+//* \brief Get Reset Mode
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_RSTGetMode(
+        AT91PS_RSTC pRSTC)
+{
+    return (pRSTC->RSTC_RMR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_RSTGetStatus
+//* \brief Get Reset Status
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_RSTGetStatus(
+        AT91PS_RSTC pRSTC)
+{
+    return (pRSTC->RSTC_RSR);
+}
+
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_RSTIsSoftRstActive
+//* \brief Return !=0 if software reset is still not completed
+//*----------------------------------------------------------------------------
+__inline unsigned int AT91F_RSTIsSoftRstActive(
+        AT91PS_RSTC pRSTC)
+{
+    return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP);
+}
+/* *****************************************************************************
+                SOFTWARE API FOR RTTC
+   ***************************************************************************** */
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_SetRTT_TimeBase()
+//* \brief  Set the RTT prescaler according to the TimeBase in ms
+//*--------------------------------------------------------------------------------------
+__inline unsigned int AT91F_RTTSetTimeBase(
+        AT91PS_RTTC pRTTC,
+        unsigned int ms)
+{
+    if (ms > 2000)
+        return 1;   // AT91C_TIME_OUT_OF_RANGE
+    pRTTC->RTTC_RTMR &= ~0xFFFF;
+    pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF);
+    return 0;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTTSetPrescaler()
+//* \brief  Set the new prescaler value
+//*--------------------------------------------------------------------------------------
+__inline unsigned int AT91F_RTTSetPrescaler(
+        AT91PS_RTTC pRTTC,
+        unsigned int rtpres)
+{
+    pRTTC->RTTC_RTMR &= ~0xFFFF;
+    pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF);
+    return (pRTTC->RTTC_RTMR);
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTTRestart()
+//* \brief  Restart the RTT prescaler
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTRestart(
+        AT91PS_RTTC pRTTC)
+{
+    pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST;
+}
+
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_SetAlarmINT()
+//* \brief  Enable RTT Alarm Interrupt
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTSetAlarmINT(
+        AT91PS_RTTC pRTTC)
+{
+    pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_ClearAlarmINT()
+//* \brief  Disable RTT Alarm Interrupt
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTClearAlarmINT(
+        AT91PS_RTTC pRTTC)
+{
+    pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_SetRttIncINT()
+//* \brief  Enable RTT INC Interrupt
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTSetRttIncINT(
+        AT91PS_RTTC pRTTC)
+{
+    pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_ClearRttIncINT()
+//* \brief  Disable RTT INC Interrupt
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTClearRttIncINT(
+        AT91PS_RTTC pRTTC)
+{
+    pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_SetAlarmValue()
+//* \brief  Set RTT Alarm Value
+//*--------------------------------------------------------------------------------------
+__inline void AT91F_RTTSetAlarmValue(
+        AT91PS_RTTC pRTTC, unsigned int alarm)
+{
+    pRTTC->RTTC_RTAR = alarm;
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_GetAlarmValue()
+//* \brief  Get RTT Alarm Value
+//*--------------------------------------------------------------------------------------
+__inline unsigned int AT91F_RTTGetAlarmValue(
+        AT91PS_RTTC pRTTC)
+{
+    return(pRTTC->RTTC_RTAR);
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTTGetStatus()
+//* \brief  Read the RTT status
+//*--------------------------------------------------------------------------------------
+__inline unsigned int AT91F_RTTGetStatus(
+        AT91PS_RTTC pRTTC)
+{
+    return(pRTTC->RTTC_RTSR);
+}
+
+//*--------------------------------------------------------------------------------------
+//* \fn     AT91F_RTT_ReadValue()
+//* \brief  Read the RTT value
+//*--------------------------------------------------------------------------------------
+__inline unsigned int AT91F_RTTReadValue(
+        AT91PS_RTTC pRTTC)
+{
+        register volatile unsigned int val1,val2;
+    do
+    {
+        val1 = pRTTC->RTTC_RTVR;
+        val2 = pRTTC->RTTC_RTVR;
+    }
+    while(val1 != val2);
+    return(val1);
+}
+/* *****************************************************************************
+                SOFTWARE API FOR PITC
+   ***************************************************************************** */
+//*----------------------------------------------------------------------------
+//* \fn    AT91F_PITInit
+//* \brief System timer init : period in
\ No newline at end of file
diff --git a/portable/IAR/AtmelSAM7S64/port.c b/portable/IAR/AtmelSAM7S64/port.c
index 15d00fe..1e14d2e 100644
--- a/portable/IAR/AtmelSAM7S64/port.c
+++ b/portable/IAR/AtmelSAM7S64/port.c
@@ -1,260 +1,254 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the Atmel ARM7 port.

- *----------------------------------------------------------*/

-

-

-/* Standard includes. */

-#include <stdlib.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Constants required to setup the initial stack. */

-#define portINITIAL_SPSR				( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */

-#define portTHUMB_MODE_BIT				( ( StackType_t ) 0x20 )

-#define portINSTRUCTION_SIZE			( ( StackType_t ) 4 )

-

-/* Constants required to setup the PIT. */

-#define portPIT_CLOCK_DIVISOR			( ( uint32_t ) 16 )

-#define portPIT_COUNTER_VALUE			( ( ( configCPU_CLOCK_HZ / portPIT_CLOCK_DIVISOR ) / 1000UL ) * portTICK_PERIOD_MS )

-

-/* Constants required to handle critical sections. */

-#define portNO_CRITICAL_NESTING 		( ( uint32_t ) 0 )

-

-

-#define portINT_LEVEL_SENSITIVE  0

-#define portPIT_ENABLE      	( ( uint16_t ) 0x1 << 24 )

-#define portPIT_INT_ENABLE     	( ( uint16_t ) 0x1 << 25 )

-/*-----------------------------------------------------------*/

-

-/* Setup the PIT to generate the tick interrupts. */

-static void prvSetupTimerInterrupt( void );

-

-/* ulCriticalNesting will get set to zero when the first task starts.  It

-cannot be initialised to 0 as this will cause interrupts to be enabled

-during the kernel initialisation process. */

-uint32_t ulCriticalNesting = ( uint32_t ) 9999;

-

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-StackType_t *pxOriginalTOS;

-

-	pxOriginalTOS = pxTopOfStack;

-

-	/* To ensure asserts in tasks.c don't fail, although in this case the assert

-	is not really required. */

-	pxTopOfStack--;

-

-	/* Setup the initial stack of the task.  The stack is set exactly as

-	expected by the portRESTORE_CONTEXT() macro. */

-

-	/* First on the stack is the return address - which in this case is the

-	start of the task.  The offset is added to make the return address appear

-	as it would within an IRQ ISR. */

-	*pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;		

-	pxTopOfStack--;

-

-	*pxTopOfStack = ( StackType_t ) 0xaaaaaaaa;	/* R14 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12121212;	/* R12 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x11111111;	/* R11 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x10101010;	/* R10 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x09090909;	/* R9 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x08080808;	/* R8 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x07070707;	/* R7 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x06060606;	/* R6 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x05050505;	/* R5 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x04040404;	/* R4 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x03030303;	/* R3 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x02020202;	/* R2 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x01010101;	/* R1 */

-	pxTopOfStack--;	

-

-	/* When the task starts is will expect to find the function parameter in

-	R0. */

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-	pxTopOfStack--;

-

-	/* The status register is set for system mode, with interrupts enabled. */

-	*pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;

-	

-	if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL )

-	{

-		/* We want the task to start in thumb mode. */

-		*pxTopOfStack |= portTHUMB_MODE_BIT;

-	}	

-	

-	pxTopOfStack--;

-

-	/* Interrupt flags cannot always be stored on the stack and will

-	instead be stored in a variable, which is then saved as part of the

-	tasks context. */

-	*pxTopOfStack = portNO_CRITICAL_NESTING;

-

-	return pxTopOfStack;	

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-extern void vPortStartFirstTask( void );

-

-	/* Start the timer that generates the tick ISR.  Interrupts are disabled

-	here already. */

-	prvSetupTimerInterrupt();

-

-	/* Start the first task. */

-	vPortStartFirstTask();	

-

-	/* Should not get here! */

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the ARM port will require this function as there

-	is nothing to return to.  */

-}

-/*-----------------------------------------------------------*/

-

-#if configUSE_PREEMPTION == 0

-

-	/* The cooperative scheduler requires a normal IRQ service routine to

-	simply increment the system tick. */

-	static __arm __irq void vPortNonPreemptiveTick( void );

-	static __arm __irq void vPortNonPreemptiveTick( void )

-	{

-		uint32_t ulDummy;

-		

-		/* Increment the tick count - which may wake some tasks but as the

-		preemptive scheduler is not being used any woken task is not given

-		processor time no matter what its priority. */

-		xTaskIncrementTick();

-		

-		/* Clear the PIT interrupt. */

-		ulDummy = AT91C_BASE_PITC->PITC_PIVR;

-		

-		/* End the interrupt in the AIC. */

-		AT91C_BASE_AIC->AIC_EOICR = ulDummy;

-	}

-

-#else

-

-	/* Currently the IAR port requires the preemptive tick function to be

-	defined in an asm file. */

-

-#endif

-

-/*-----------------------------------------------------------*/

-

-static void prvSetupTimerInterrupt( void )

-{

-AT91PS_PITC pxPIT = AT91C_BASE_PITC;

-

-	/* Setup the AIC for PIT interrupts.  The interrupt routine chosen depends

-	on whether the preemptive or cooperative scheduler is being used. */

-	#if configUSE_PREEMPTION == 0

-

-		AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPortNonPreemptiveTick );

-

-	#else

-		

-		extern void ( vPortPreemptiveTick )( void );

-		AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPortPreemptiveTick );

-

-	#endif

-

-	/* Configure the PIT period. */

-	pxPIT->PITC_PIMR = portPIT_ENABLE | portPIT_INT_ENABLE | portPIT_COUNTER_VALUE;

-

-	/* Enable the interrupt.  Global interrupts are disables at this point so

-	this is safe. */

-	AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_SYS );

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-	/* Disable interrupts first! */

-	__disable_interrupt();

-

-	/* Now interrupts are disabled ulCriticalNesting can be accessed

-	directly.  Increment ulCriticalNesting to keep a count of how many times

-	portENTER_CRITICAL() has been called. */

-	ulCriticalNesting++;

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-	if( ulCriticalNesting > portNO_CRITICAL_NESTING )

-	{

-		/* Decrement the nesting count as we are leaving a critical section. */

-		ulCriticalNesting--;

-

-		/* If the nesting level has reached zero then interrupts should be

-		re-enabled. */

-		if( ulCriticalNesting == portNO_CRITICAL_NESTING )

-		{

-			__enable_interrupt();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-

-

-

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the Atmel ARM7 port.
+ *----------------------------------------------------------*/
+
+
+/* Standard includes. */
+#include <stdlib.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Constants required to setup the initial stack. */
+#define portINITIAL_SPSR                ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */
+#define portTHUMB_MODE_BIT              ( ( StackType_t ) 0x20 )
+#define portINSTRUCTION_SIZE            ( ( StackType_t ) 4 )
+
+/* Constants required to setup the PIT. */
+#define portPIT_CLOCK_DIVISOR           ( ( uint32_t ) 16 )
+#define portPIT_COUNTER_VALUE           ( ( ( configCPU_CLOCK_HZ / portPIT_CLOCK_DIVISOR ) / 1000UL ) * portTICK_PERIOD_MS )
+
+/* Constants required to handle critical sections. */
+#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
+
+
+#define portINT_LEVEL_SENSITIVE  0
+#define portPIT_ENABLE          ( ( uint16_t ) 0x1 << 24 )
+#define portPIT_INT_ENABLE      ( ( uint16_t ) 0x1 << 25 )
+/*-----------------------------------------------------------*/
+
+/* Setup the PIT to generate the tick interrupts. */
+static void prvSetupTimerInterrupt( void );
+
+/* ulCriticalNesting will get set to zero when the first task starts.  It
+cannot be initialised to 0 as this will cause interrupts to be enabled
+during the kernel initialisation process. */
+uint32_t ulCriticalNesting = ( uint32_t ) 9999;
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+StackType_t *pxOriginalTOS;
+
+    pxOriginalTOS = pxTopOfStack;
+
+    /* To ensure asserts in tasks.c don't fail, although in this case the assert
+    is not really required. */
+    pxTopOfStack--;
+
+    /* Setup the initial stack of the task.  The stack is set exactly as
+    expected by the portRESTORE_CONTEXT() macro. */
+
+    /* First on the stack is the return address - which in this case is the
+    start of the task.  The offset is added to make the return address appear
+    as it would within an IRQ ISR. */
+    *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;
+    pxTopOfStack--;
+
+    *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
+    pxTopOfStack--;
+
+    /* When the task starts is will expect to find the function parameter in
+    R0. */
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+    pxTopOfStack--;
+
+    /* The status register is set for system mode, with interrupts enabled. */
+    *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;
+
+    if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL )
+    {
+        /* We want the task to start in thumb mode. */
+        *pxTopOfStack |= portTHUMB_MODE_BIT;
+    }
+
+    pxTopOfStack--;
+
+    /* Interrupt flags cannot always be stored on the stack and will
+    instead be stored in a variable, which is then saved as part of the
+    tasks context. */
+    *pxTopOfStack = portNO_CRITICAL_NESTING;
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+extern void vPortStartFirstTask( void );
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+    here already. */
+    prvSetupTimerInterrupt();
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the ARM port will require this function as there
+    is nothing to return to.  */
+}
+/*-----------------------------------------------------------*/
+
+#if configUSE_PREEMPTION == 0
+
+    /* The cooperative scheduler requires a normal IRQ service routine to
+    simply increment the system tick. */
+    static __arm __irq void vPortNonPreemptiveTick( void );
+    static __arm __irq void vPortNonPreemptiveTick( void )
+    {
+        uint32_t ulDummy;
+
+        /* Increment the tick count - which may wake some tasks but as the
+        preemptive scheduler is not being used any woken task is not given
+        processor time no matter what its priority. */
+        xTaskIncrementTick();
+
+        /* Clear the PIT interrupt. */
+        ulDummy = AT91C_BASE_PITC->PITC_PIVR;
+
+        /* End the interrupt in the AIC. */
+        AT91C_BASE_AIC->AIC_EOICR = ulDummy;
+    }
+
+#else
+
+    /* Currently the IAR port requires the preemptive tick function to be
+    defined in an asm file. */
+
+#endif
+
+/*-----------------------------------------------------------*/
+
+static void prvSetupTimerInterrupt( void )
+{
+AT91PS_PITC pxPIT = AT91C_BASE_PITC;
+
+    /* Setup the AIC for PIT interrupts.  The interrupt routine chosen depends
+    on whether the preemptive or cooperative scheduler is being used. */
+    #if configUSE_PREEMPTION == 0
+
+        AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPortNonPreemptiveTick );
+
+    #else
+
+        extern void ( vPortPreemptiveTick )( void );
+        AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPortPreemptiveTick );
+
+    #endif
+
+    /* Configure the PIT period. */
+    pxPIT->PITC_PIMR = portPIT_ENABLE | portPIT_INT_ENABLE | portPIT_COUNTER_VALUE;
+
+    /* Enable the interrupt.  Global interrupts are disables at this point so
+    this is safe. */
+    AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_SYS );
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    /* Disable interrupts first! */
+    __disable_interrupt();
+
+    /* Now interrupts are disabled ulCriticalNesting can be accessed
+    directly.  Increment ulCriticalNesting to keep a count of how many times
+    portENTER_CRITICAL() has been called. */
+    ulCriticalNesting++;
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
+    {
+        /* Decrement the nesting count as we are leaving a critical section. */
+        ulCriticalNesting--;
+
+        /* If the nesting level has reached zero then interrupts should be
+        re-enabled. */
+        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
+        {
+            __enable_interrupt();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/AtmelSAM7S64/portasm.s79 b/portable/IAR/AtmelSAM7S64/portasm.s79
index 275ec94..b01bcf5 100644
--- a/portable/IAR/AtmelSAM7S64/portasm.s79
+++ b/portable/IAR/AtmelSAM7S64/portasm.s79
@@ -1,89 +1,88 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-		RSEG ICODE:CODE

-		CODE32

-

-	EXTERN vTaskSwitchContext

-	EXTERN xTaskIncrementTick

-

-	PUBLIC vPortYieldProcessor

-	PUBLIC vPortPreemptiveTick

-	PUBLIC vPortStartFirstTask

-

-#include "AT91SAM7S64_inc.h"

-#include "ISR_Support.h"

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Starting the first task is just a matter of restoring the context that

-; was created by pxPortInitialiseStack().

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortStartFirstTask:

-	portRESTORE_CONTEXT

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Manual context switch function.  This is the SWI hander.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortYieldProcessor:

-	ADD		LR, LR, #4			; Add 4 to the LR to make the LR appear exactly

-								; as if the context was saved during and IRQ

-								; handler.

-

-	portSAVE_CONTEXT			; Save the context of the current task...

-	LDR R0, =vTaskSwitchContext	; before selecting the next task to execute.

-	mov     lr, pc

-	BX R0

-	portRESTORE_CONTEXT			; Restore the context of the selected task.

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Preemptive context switch function.  This will only ever get installed if

-; portUSE_PREEMPTION is set to 1 in portmacro.h.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortPreemptiveTick:

-	portSAVE_CONTEXT			; Save the context of the current task.

-

-	LDR R0, =xTaskIncrementTick ; Increment the tick count - this may wake a task.

-	mov lr, pc

-	BX R0

-

-	CMP R0, #0

-	BEQ SkipContextSwitch

-	LDR R0, =vTaskSwitchContext ; Select the next task to execute.

-	mov lr, pc

-	BX R0

-SkipContextSwitch

-	LDR	R14, =AT91C_BASE_PITC	; Clear the PIT interrupt

-	LDR	R0, [R14, #PITC_PIVR ]

-

-	LDR R14, =AT91C_BASE_AIC	; Mark the End of Interrupt on the AIC

-    STR	R14, [R14, #AIC_EOICR]

-

-	portRESTORE_CONTEXT			; Restore the context of the selected task.

-

-

-	END

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+        RSEG ICODE:CODE
+        CODE32
+
+    EXTERN vTaskSwitchContext
+    EXTERN xTaskIncrementTick
+
+    PUBLIC vPortYieldProcessor
+    PUBLIC vPortPreemptiveTick
+    PUBLIC vPortStartFirstTask
+
+#include "AT91SAM7S64_inc.h"
+#include "ISR_Support.h"
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Starting the first task is just a matter of restoring the context that
+; was created by pxPortInitialiseStack().
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortStartFirstTask:
+    portRESTORE_CONTEXT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Manual context switch function.  This is the SWI hander.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortYieldProcessor:
+    ADD     LR, LR, #4          ; Add 4 to the LR to make the LR appear exactly
+                                ; as if the context was saved during and IRQ
+                                ; handler.
+
+    portSAVE_CONTEXT            ; Save the context of the current task...
+    LDR R0, =vTaskSwitchContext ; before selecting the next task to execute.
+    mov     lr, pc
+    BX R0
+    portRESTORE_CONTEXT         ; Restore the context of the selected task.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Preemptive context switch function.  This will only ever get installed if
+; portUSE_PREEMPTION is set to 1 in portmacro.h.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortPreemptiveTick:
+    portSAVE_CONTEXT            ; Save the context of the current task.
+
+    LDR R0, =xTaskIncrementTick ; Increment the tick count - this may wake a task.
+    mov lr, pc
+    BX R0
+
+    CMP R0, #0
+    BEQ SkipContextSwitch
+    LDR R0, =vTaskSwitchContext ; Select the next task to execute.
+    mov lr, pc
+    BX R0
+SkipContextSwitch
+    LDR R14, =AT91C_BASE_PITC   ; Clear the PIT interrupt
+    LDR R0, [R14, #PITC_PIVR ]
+
+    LDR R14, =AT91C_BASE_AIC    ; Mark the End of Interrupt on the AIC
+    STR R14, [R14, #AIC_EOICR]
+
+    portRESTORE_CONTEXT         ; Restore the context of the selected task.
+
+
+    END
diff --git a/portable/IAR/AtmelSAM7S64/portmacro.h b/portable/IAR/AtmelSAM7S64/portmacro.h
index 0d4a503..3c651b0 100644
--- a/portable/IAR/AtmelSAM7S64/portmacro.h
+++ b/portable/IAR/AtmelSAM7S64/portmacro.h
@@ -1,112 +1,110 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		short

-#define portSTACK_TYPE	uint32_t

-#define portBASE_TYPE	long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portBYTE_ALIGNMENT			8

-#define portYIELD()					asm ( "SWI 0" )

-#define portNOP()					asm ( "NOP" )

-/*-----------------------------------------------------------*/

-

-/* Critical section handling. */

-__arm __interwork void vPortDisableInterruptsFromThumb( void );

-__arm __interwork void vPortEnableInterruptsFromThumb( void );

-__arm __interwork void vPortEnterCritical( void );

-__arm __interwork void vPortExitCritical( void );

-

-#define portDISABLE_INTERRUPTS()	__disable_interrupt()

-#define portENABLE_INTERRUPTS()		__enable_interrupt()

-#define portENTER_CRITICAL()		vPortEnterCritical()

-#define portEXIT_CRITICAL()			vPortExitCritical()

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-#define portEND_SWITCHING_ISR( xSwitchRequired ) 	\

-{													\

-extern void vTaskSwitchContext( void );				\

-													\

-	if( xSwitchRequired ) 							\

-	{												\

-		vTaskSwitchContext();						\

-	}												\

-}

-/*-----------------------------------------------------------*/

-

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint32_t
+#define portBASE_TYPE   long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT          8
+#define portYIELD()                 asm ( "SWI 0" )
+#define portNOP()                   asm ( "NOP" )
+/*-----------------------------------------------------------*/
+
+/* Critical section handling. */
+__arm __interwork void vPortDisableInterruptsFromThumb( void );
+__arm __interwork void vPortEnableInterruptsFromThumb( void );
+__arm __interwork void vPortEnterCritical( void );
+__arm __interwork void vPortExitCritical( void );
+
+#define portDISABLE_INTERRUPTS()    __disable_interrupt()
+#define portENABLE_INTERRUPTS()     __enable_interrupt()
+#define portENTER_CRITICAL()        vPortEnterCritical()
+#define portEXIT_CRITICAL()         vPortExitCritical()
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+#define portEND_SWITCHING_ISR( xSwitchRequired )    \
+{                                                   \
+extern void vTaskSwitchContext( void );             \
+                                                    \
+    if( xSwitchRequired )                           \
+    {                                               \
+        vTaskSwitchContext();                       \
+    }                                               \
+}
+/*-----------------------------------------------------------*/
+
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/AtmelSAM9XE/ISR_Support.h b/portable/IAR/AtmelSAM9XE/ISR_Support.h
index 6fabc47..44414ec 100644
--- a/portable/IAR/AtmelSAM9XE/ISR_Support.h
+++ b/portable/IAR/AtmelSAM9XE/ISR_Support.h
@@ -25,8 +25,8 @@
 ; * https://github.com/FreeRTOS
 ; *
 ; */
-	EXTERN pxCurrentTCB
-	EXTERN ulCriticalNesting
+    EXTERN pxCurrentTCB
+    EXTERN ulCriticalNesting
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Context save and restore macro definitions
@@ -34,72 +34,71 @@
 
 portSAVE_CONTEXT MACRO
 
-	; Push R0 as we are going to use the register.
-	STMDB	SP!, {R0}
+    ; Push R0 as we are going to use the register.
+    STMDB   SP!, {R0}
 
-	; Set R0 to point to the task stack pointer.
-	STMDB	SP, {SP}^
-	NOP
-	SUB		SP, SP, #4
-	LDMIA	SP!, {R0}
+    ; Set R0 to point to the task stack pointer.
+    STMDB   SP, {SP}^
+    NOP
+    SUB     SP, SP, #4
+    LDMIA   SP!, {R0}
 
-	; Push the return address onto the stack.
-	STMDB	R0!, {LR}
+    ; Push the return address onto the stack.
+    STMDB   R0!, {LR}
 
-	; Now we have saved LR we can use it instead of R0.
-	MOV		LR, R0
+    ; Now we have saved LR we can use it instead of R0.
+    MOV     LR, R0
 
-	; Pop R0 so we can save it onto the system mode stack.
-	LDMIA	SP!, {R0}
+    ; Pop R0 so we can save it onto the system mode stack.
+    LDMIA   SP!, {R0}
 
-	; Push all the system mode registers onto the task stack.
-	STMDB	LR, {R0-LR}^
-	NOP
-	SUB		LR, LR, #60
+    ; Push all the system mode registers onto the task stack.
+    STMDB   LR, {R0-LR}^
+    NOP
+    SUB     LR, LR, #60
 
-	; Push the SPSR onto the task stack.
-	MRS		R0, SPSR
-	STMDB	LR!, {R0}
+    ; Push the SPSR onto the task stack.
+    MRS     R0, SPSR
+    STMDB   LR!, {R0}
 
-	LDR		R0, =ulCriticalNesting
-	LDR		R0, [R0]
-	STMDB	LR!, {R0}
+    LDR     R0, =ulCriticalNesting
+    LDR     R0, [R0]
+    STMDB   LR!, {R0}
 
-	; Store the new top of stack for the task.
-	LDR		R1, =pxCurrentTCB
-	LDR		R0, [R1]
-	STR		LR, [R0]
+    ; Store the new top of stack for the task.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    STR     LR, [R0]
 
-	ENDM
+    ENDM
 
 
 portRESTORE_CONTEXT MACRO
 
-	; Set the LR to the task stack.
-	LDR		R1, =pxCurrentTCB
-	LDR		R0, [R1]
-	LDR		LR, [R0]
+    ; Set the LR to the task stack.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    LDR     LR, [R0]
 
-	; The critical nesting depth is the first item on the stack.
-	; Load it into the ulCriticalNesting variable.
-	LDR		R0, =ulCriticalNesting
-	LDMFD	LR!, {R1}
-	STR		R1, [R0]
+    ; The critical nesting depth is the first item on the stack.
+    ; Load it into the ulCriticalNesting variable.
+    LDR     R0, =ulCriticalNesting
+    LDMFD   LR!, {R1}
+    STR     R1, [R0]
 
-	; Get the SPSR from the stack.
-	LDMFD	LR!, {R0}
-	MSR		SPSR_cxsf, R0
+    ; Get the SPSR from the stack.
+    LDMFD   LR!, {R0}
+    MSR     SPSR_cxsf, R0
 
-	; Restore all system mode registers for the task.
-	LDMFD	LR, {R0-R14}^
-	NOP
+    ; Restore all system mode registers for the task.
+    LDMFD   LR, {R0-R14}^
+    NOP
 
-	; Restore the return address.
-	LDR		LR, [LR, #+60]
+    ; Restore the return address.
+    LDR     LR, [LR, #+60]
 
-	; And return - correcting the offset in the LR to obtain the
-	; correct address.
-	SUBS	PC, LR, #4
+    ; And return - correcting the offset in the LR to obtain the
+    ; correct address.
+    SUBS    PC, LR, #4
 
-	ENDM
-
+    ENDM
diff --git a/portable/IAR/AtmelSAM9XE/port.c b/portable/IAR/AtmelSAM9XE/port.c
index fd53a38..cb4b7be 100644
--- a/portable/IAR/AtmelSAM9XE/port.c
+++ b/portable/IAR/AtmelSAM9XE/port.c
@@ -1,257 +1,251 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the Atmel ARM7 port.

- *----------------------------------------------------------*/

-

-

-/* Standard includes. */

-#include <stdlib.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Hardware includes. */

-#include <board.h>

-#include <pio/pio.h>

-#include <pio/pio_it.h>

-#include <pit/pit.h>

-#include <aic/aic.h>

-#include <tc/tc.h>

-#include <utility/led.h>

-#include <utility/trace.h>

-

-/*-----------------------------------------------------------*/

-

-/* Constants required to setup the initial stack. */

-#define portINITIAL_SPSR				( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */

-#define portTHUMB_MODE_BIT				( ( StackType_t ) 0x20 )

-#define portINSTRUCTION_SIZE			( ( StackType_t ) 4 )

-

-/* Constants required to setup the PIT. */

-#define port1MHz_IN_Hz 					( 1000000ul )

-#define port1SECOND_IN_uS				( 1000000.0 )

-

-/* Constants required to handle critical sections. */

-#define portNO_CRITICAL_NESTING 		( ( uint32_t ) 0 )

-

-

-#define portINT_LEVEL_SENSITIVE  0

-#define portPIT_ENABLE      	( ( uint16_t ) 0x1 << 24 )

-#define portPIT_INT_ENABLE     	( ( uint16_t ) 0x1 << 25 )

-/*-----------------------------------------------------------*/

-

-/* Setup the PIT to generate the tick interrupts. */

-static void prvSetupTimerInterrupt( void );

-

-/* The PIT interrupt handler - the RTOS tick. */

-static void vPortTickISR( void );

-

-/* ulCriticalNesting will get set to zero when the first task starts.  It

-cannot be initialised to 0 as this will cause interrupts to be enabled

-during the kernel initialisation process. */

-uint32_t ulCriticalNesting = ( uint32_t ) 9999;

-

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-StackType_t *pxOriginalTOS;

-

-	pxOriginalTOS = pxTopOfStack;

-

-	/* To ensure asserts in tasks.c don't fail, although in this case the assert

-	is not really required. */

-	pxTopOfStack--;

-

-	/* Setup the initial stack of the task.  The stack is set exactly as

-	expected by the portRESTORE_CONTEXT() macro. */

-

-	/* First on the stack is the return address - which in this case is the

-	start of the task.  The offset is added to make the return address appear

-	as it would within an IRQ ISR. */

-	*pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;		

-	pxTopOfStack--;

-

-	*pxTopOfStack = ( StackType_t ) 0xaaaaaaaa;	/* R14 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12121212;	/* R12 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x11111111;	/* R11 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x10101010;	/* R10 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x09090909;	/* R9 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x08080808;	/* R8 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x07070707;	/* R7 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x06060606;	/* R6 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x05050505;	/* R5 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x04040404;	/* R4 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x03030303;	/* R3 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x02020202;	/* R2 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x01010101;	/* R1 */

-	pxTopOfStack--;	

-

-	/* When the task starts is will expect to find the function parameter in

-	R0. */

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-	pxTopOfStack--;

-

-	/* The status register is set for system mode, with interrupts enabled. */

-	*pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;

-	

-	#ifdef THUMB_INTERWORK

-	{

-		/* We want the task to start in thumb mode. */

-		*pxTopOfStack |= portTHUMB_MODE_BIT;

-	}

-	#endif

-	

-	pxTopOfStack--;

-

-	/* Interrupt flags cannot always be stored on the stack and will

-	instead be stored in a variable, which is then saved as part of the

-	tasks context. */

-	*pxTopOfStack = portNO_CRITICAL_NESTING;

-

-	return pxTopOfStack;	

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-extern void vPortStartFirstTask( void );

-

-	/* Start the timer that generates the tick ISR.  Interrupts are disabled

-	here already. */

-	prvSetupTimerInterrupt();

-

-	/* Start the first task. */

-	vPortStartFirstTask();	

-

-	/* Should not get here! */

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the ARM port will require this function as there

-	is nothing to return to.  */

-}

-/*-----------------------------------------------------------*/

-

-static __arm void vPortTickISR( void )

-{

-volatile uint32_t ulDummy;

-	

-	/* Increment the tick count - which may wake some tasks but as the

-	preemptive scheduler is not being used any woken task is not given

-	processor time no matter what its priority. */

-	if( xTaskIncrementTick() != pdFALSE )

-	{

-		vTaskSwitchContext();

-	}

-		

-	/* Clear the PIT interrupt. */

-	ulDummy = AT91C_BASE_PITC->PITC_PIVR;

-	

-	/* To remove compiler warning. */

-	( void ) ulDummy;

-	

-	/* The AIC is cleared in the asm wrapper, outside of this function. */

-}

-/*-----------------------------------------------------------*/

-

-static void prvSetupTimerInterrupt( void )

-{

-const uint32_t ulPeriodIn_uS = ( 1.0 / ( double ) configTICK_RATE_HZ ) * port1SECOND_IN_uS;

-

-	/* Setup the PIT for the required frequency. */

-	PIT_Init( ulPeriodIn_uS, BOARD_MCK / port1MHz_IN_Hz );

-	

-	/* Setup the PIT interrupt. */

-	AIC_DisableIT( AT91C_ID_SYS );

-	AIC_ConfigureIT( AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, vPortTickISR );

-	AIC_EnableIT( AT91C_ID_SYS );

-	PIT_EnableIT();

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-	/* Disable interrupts first! */

-	__disable_irq();

-

-	/* Now interrupts are disabled ulCriticalNesting can be accessed

-	directly.  Increment ulCriticalNesting to keep a count of how many times

-	portENTER_CRITICAL() has been called. */

-	ulCriticalNesting++;

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-	if( ulCriticalNesting > portNO_CRITICAL_NESTING )

-	{

-		/* Decrement the nesting count as we are leaving a critical section. */

-		ulCriticalNesting--;

-

-		/* If the nesting level has reached zero then interrupts should be

-		re-enabled. */

-		if( ulCriticalNesting == portNO_CRITICAL_NESTING )

-		{

-			__enable_irq();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-

-

-

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the Atmel ARM7 port.
+ *----------------------------------------------------------*/
+
+
+/* Standard includes. */
+#include <stdlib.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Hardware includes. */
+#include <board.h>
+#include <pio/pio.h>
+#include <pio/pio_it.h>
+#include <pit/pit.h>
+#include <aic/aic.h>
+#include <tc/tc.h>
+#include <utility/led.h>
+#include <utility/trace.h>
+
+/*-----------------------------------------------------------*/
+
+/* Constants required to setup the initial stack. */
+#define portINITIAL_SPSR                ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */
+#define portTHUMB_MODE_BIT              ( ( StackType_t ) 0x20 )
+#define portINSTRUCTION_SIZE            ( ( StackType_t ) 4 )
+
+/* Constants required to setup the PIT. */
+#define port1MHz_IN_Hz                  ( 1000000ul )
+#define port1SECOND_IN_uS               ( 1000000.0 )
+
+/* Constants required to handle critical sections. */
+#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
+
+
+#define portINT_LEVEL_SENSITIVE  0
+#define portPIT_ENABLE          ( ( uint16_t ) 0x1 << 24 )
+#define portPIT_INT_ENABLE      ( ( uint16_t ) 0x1 << 25 )
+/*-----------------------------------------------------------*/
+
+/* Setup the PIT to generate the tick interrupts. */
+static void prvSetupTimerInterrupt( void );
+
+/* The PIT interrupt handler - the RTOS tick. */
+static void vPortTickISR( void );
+
+/* ulCriticalNesting will get set to zero when the first task starts.  It
+cannot be initialised to 0 as this will cause interrupts to be enabled
+during the kernel initialisation process. */
+uint32_t ulCriticalNesting = ( uint32_t ) 9999;
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+StackType_t *pxOriginalTOS;
+
+    pxOriginalTOS = pxTopOfStack;
+
+    /* To ensure asserts in tasks.c don't fail, although in this case the assert
+    is not really required. */
+    pxTopOfStack--;
+
+    /* Setup the initial stack of the task.  The stack is set exactly as
+    expected by the portRESTORE_CONTEXT() macro. */
+
+    /* First on the stack is the return address - which in this case is the
+    start of the task.  The offset is added to make the return address appear
+    as it would within an IRQ ISR. */
+    *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;
+    pxTopOfStack--;
+
+    *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
+    pxTopOfStack--;
+
+    /* When the task starts is will expect to find the function parameter in
+    R0. */
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+    pxTopOfStack--;
+
+    /* The status register is set for system mode, with interrupts enabled. */
+    *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;
+
+    #ifdef THUMB_INTERWORK
+    {
+        /* We want the task to start in thumb mode. */
+        *pxTopOfStack |= portTHUMB_MODE_BIT;
+    }
+    #endif
+
+    pxTopOfStack--;
+
+    /* Interrupt flags cannot always be stored on the stack and will
+    instead be stored in a variable, which is then saved as part of the
+    tasks context. */
+    *pxTopOfStack = portNO_CRITICAL_NESTING;
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+extern void vPortStartFirstTask( void );
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+    here already. */
+    prvSetupTimerInterrupt();
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the ARM port will require this function as there
+    is nothing to return to.  */
+}
+/*-----------------------------------------------------------*/
+
+static __arm void vPortTickISR( void )
+{
+volatile uint32_t ulDummy;
+
+    /* Increment the tick count - which may wake some tasks but as the
+    preemptive scheduler is not being used any woken task is not given
+    processor time no matter what its priority. */
+    if( xTaskIncrementTick() != pdFALSE )
+    {
+        vTaskSwitchContext();
+    }
+
+    /* Clear the PIT interrupt. */
+    ulDummy = AT91C_BASE_PITC->PITC_PIVR;
+
+    /* To remove compiler warning. */
+    ( void ) ulDummy;
+
+    /* The AIC is cleared in the asm wrapper, outside of this function. */
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupTimerInterrupt( void )
+{
+const uint32_t ulPeriodIn_uS = ( 1.0 / ( double ) configTICK_RATE_HZ ) * port1SECOND_IN_uS;
+
+    /* Setup the PIT for the required frequency. */
+    PIT_Init( ulPeriodIn_uS, BOARD_MCK / port1MHz_IN_Hz );
+
+    /* Setup the PIT interrupt. */
+    AIC_DisableIT( AT91C_ID_SYS );
+    AIC_ConfigureIT( AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, vPortTickISR );
+    AIC_EnableIT( AT91C_ID_SYS );
+    PIT_EnableIT();
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    /* Disable interrupts first! */
+    __disable_irq();
+
+    /* Now interrupts are disabled ulCriticalNesting can be accessed
+    directly.  Increment ulCriticalNesting to keep a count of how many times
+    portENTER_CRITICAL() has been called. */
+    ulCriticalNesting++;
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
+    {
+        /* Decrement the nesting count as we are leaving a critical section. */
+        ulCriticalNesting--;
+
+        /* If the nesting level has reached zero then interrupts should be
+        re-enabled. */
+        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
+        {
+            __enable_irq();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/AtmelSAM9XE/portasm.s79 b/portable/IAR/AtmelSAM9XE/portasm.s79
index 0beaa64..d3434ec 100644
--- a/portable/IAR/AtmelSAM9XE/portasm.s79
+++ b/portable/IAR/AtmelSAM9XE/portasm.s79
@@ -25,13 +25,13 @@
 ; * https://github.com/FreeRTOS
 ; *
 ; */
-		RSEG ICODE:CODE
-		CODE32
+        RSEG ICODE:CODE
+        CODE32
 
-	EXTERN vTaskSwitchContext
+    EXTERN vTaskSwitchContext
 
-	PUBLIC vPortYieldProcessor
-	PUBLIC vPortStartFirstTask
+    PUBLIC vPortYieldProcessor
+    PUBLIC vPortStartFirstTask
 
 #include "ISR_Support.h"
 
@@ -40,22 +40,21 @@
 ; was created by pxPortInitialiseStack().
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 vPortStartFirstTask:
-	portRESTORE_CONTEXT
+    portRESTORE_CONTEXT
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Manual context switch function.  This is the SWI hander.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 vPortYieldProcessor:
-	ADD		LR, LR, #4			; Add 4 to the LR to make the LR appear exactly
-								; as if the context was saved during and IRQ
-								; handler.
+    ADD     LR, LR, #4          ; Add 4 to the LR to make the LR appear exactly
+                                ; as if the context was saved during and IRQ
+                                ; handler.
 
-	portSAVE_CONTEXT			; Save the context of the current task...
-	LDR R0, =vTaskSwitchContext	; before selecting the next task to execute.
-	mov     lr, pc
-	BX R0
-	portRESTORE_CONTEXT			; Restore the context of the selected task.
+    portSAVE_CONTEXT            ; Save the context of the current task...
+    LDR R0, =vTaskSwitchContext ; before selecting the next task to execute.
+    mov     lr, pc
+    BX R0
+    portRESTORE_CONTEXT         ; Restore the context of the selected task.
 
 
-	END
-
+    END
diff --git a/portable/IAR/AtmelSAM9XE/portmacro.h b/portable/IAR/AtmelSAM9XE/portmacro.h
index 5d28bcf..623a7b0 100644
--- a/portable/IAR/AtmelSAM9XE/portmacro.h
+++ b/portable/IAR/AtmelSAM9XE/portmacro.h
@@ -1,115 +1,113 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#include <intrinsics.h>

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		short

-#define portSTACK_TYPE	uint32_t

-#define portBASE_TYPE	long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portBYTE_ALIGNMENT			8

-#define portYIELD()					asm ( "SWI 0" )

-#define portNOP()					asm ( "NOP" )

-/*-----------------------------------------------------------*/

-

-/* Critical section handling. */

-__arm __interwork void vPortDisableInterruptsFromThumb( void );

-__arm __interwork void vPortEnableInterruptsFromThumb( void );

-__arm __interwork void vPortEnterCritical( void );

-__arm __interwork void vPortExitCritical( void );

-

-#define portDISABLE_INTERRUPTS()	__disable_irq()

-#define portENABLE_INTERRUPTS()		__enable_irq()

-#define portENTER_CRITICAL()		vPortEnterCritical()

-#define portEXIT_CRITICAL()			vPortExitCritical()

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-#define portEND_SWITCHING_ISR( xSwitchRequired ) 	\

-{													\

-extern void vTaskSwitchContext( void );				\

-													\

-	if( xSwitchRequired ) 							\

-	{												\

-		vTaskSwitchContext();						\

-	}												\

-}

-/*-----------------------------------------------------------*/

-

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#include <intrinsics.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint32_t
+#define portBASE_TYPE   long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT          8
+#define portYIELD()                 asm ( "SWI 0" )
+#define portNOP()                   asm ( "NOP" )
+/*-----------------------------------------------------------*/
+
+/* Critical section handling. */
+__arm __interwork void vPortDisableInterruptsFromThumb( void );
+__arm __interwork void vPortEnableInterruptsFromThumb( void );
+__arm __interwork void vPortEnterCritical( void );
+__arm __interwork void vPortExitCritical( void );
+
+#define portDISABLE_INTERRUPTS()    __disable_irq()
+#define portENABLE_INTERRUPTS()     __enable_irq()
+#define portENTER_CRITICAL()        vPortEnterCritical()
+#define portEXIT_CRITICAL()         vPortExitCritical()
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+#define portEND_SWITCHING_ISR( xSwitchRequired )    \
+{                                                   \
+extern void vTaskSwitchContext( void );             \
+                                                    \
+    if( xSwitchRequired )                           \
+    {                                               \
+        vTaskSwitchContext();                       \
+    }                                               \
+}
+/*-----------------------------------------------------------*/
+
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/LPC2000/ISR_Support.h b/portable/IAR/LPC2000/ISR_Support.h
index 27287d2..4651c2d 100644
--- a/portable/IAR/LPC2000/ISR_Support.h
+++ b/portable/IAR/LPC2000/ISR_Support.h
@@ -1,106 +1,105 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-	EXTERN pxCurrentTCB

-	EXTERN ulCriticalNesting

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Context save and restore macro definitions

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-

-portSAVE_CONTEXT MACRO

-

-	; Push R0 as we are going to use the register.

-	STMDB	SP!, {R0}

-

-	; Set R0 to point to the task stack pointer.

-	STMDB	SP, {SP}^

-	NOP

-	SUB		SP, SP, #4

-	LDMIA	SP!, {R0}

-

-	; Push the return address onto the stack.

-	STMDB	R0!, {LR}

-

-	; Now we have saved LR we can use it instead of R0.

-	MOV		LR, R0

-

-	; Pop R0 so we can save it onto the system mode stack.

-	LDMIA	SP!, {R0}

-

-	; Push all the system mode registers onto the task stack.

-	STMDB	LR, {R0-LR}^

-	NOP

-	SUB		LR, LR, #60

-

-	; Push the SPSR onto the task stack.

-	MRS		R0, SPSR

-	STMDB	LR!, {R0}

-

-	LDR		R0, =ulCriticalNesting

-	LDR		R0, [R0]

-	STMDB	LR!, {R0}

-

-	; Store the new top of stack for the task.

-	LDR		R1, =pxCurrentTCB

-	LDR		R0, [R1]

-	STR		LR, [R0]

-

-	ENDM

-

-

-portRESTORE_CONTEXT MACRO

-

-	; Set the LR to the task stack.

-	LDR		R1, =pxCurrentTCB

-	LDR		R0, [R1]

-	LDR		LR, [R0]

-

-	; The critical nesting depth is the first item on the stack.

-	; Load it into the ulCriticalNesting variable.

-	LDR		R0, =ulCriticalNesting

-	LDMFD	LR!, {R1}

-	STR		R1, [R0]

-

-	; Get the SPSR from the stack.

-	LDMFD	LR!, {R0}

-	MSR		SPSR_cxsf, R0

-

-	; Restore all system mode registers for the task.

-	LDMFD	LR, {R0-R14}^

-	NOP

-

-	; Restore the return address.

-	LDR		LR, [LR, #+60]

-

-	; And return - correcting the offset in the LR to obtain the

-	; correct address.

-	SUBS	PC, LR, #4

-

-	ENDM

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+    EXTERN pxCurrentTCB
+    EXTERN ulCriticalNesting
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Context save and restore macro definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+portSAVE_CONTEXT MACRO
+
+    ; Push R0 as we are going to use the register.
+    STMDB   SP!, {R0}
+
+    ; Set R0 to point to the task stack pointer.
+    STMDB   SP, {SP}^
+    NOP
+    SUB     SP, SP, #4
+    LDMIA   SP!, {R0}
+
+    ; Push the return address onto the stack.
+    STMDB   R0!, {LR}
+
+    ; Now we have saved LR we can use it instead of R0.
+    MOV     LR, R0
+
+    ; Pop R0 so we can save it onto the system mode stack.
+    LDMIA   SP!, {R0}
+
+    ; Push all the system mode registers onto the task stack.
+    STMDB   LR, {R0-LR}^
+    NOP
+    SUB     LR, LR, #60
+
+    ; Push the SPSR onto the task stack.
+    MRS     R0, SPSR
+    STMDB   LR!, {R0}
+
+    LDR     R0, =ulCriticalNesting
+    LDR     R0, [R0]
+    STMDB   LR!, {R0}
+
+    ; Store the new top of stack for the task.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    STR     LR, [R0]
+
+    ENDM
+
+
+portRESTORE_CONTEXT MACRO
+
+    ; Set the LR to the task stack.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    LDR     LR, [R0]
+
+    ; The critical nesting depth is the first item on the stack.
+    ; Load it into the ulCriticalNesting variable.
+    LDR     R0, =ulCriticalNesting
+    LDMFD   LR!, {R1}
+    STR     R1, [R0]
+
+    ; Get the SPSR from the stack.
+    LDMFD   LR!, {R0}
+    MSR     SPSR_cxsf, R0
+
+    ; Restore all system mode registers for the task.
+    LDMFD   LR, {R0-R14}^
+    NOP
+
+    ; Restore the return address.
+    LDR     LR, [LR, #+60]
+
+    ; And return - correcting the offset in the LR to obtain the
+    ; correct address.
+    SUBS    PC, LR, #4
+
+    ENDM
diff --git a/portable/IAR/LPC2000/port.c b/portable/IAR/LPC2000/port.c
index 8552f5b..3758c5d 100644
--- a/portable/IAR/LPC2000/port.c
+++ b/portable/IAR/LPC2000/port.c
@@ -1,318 +1,312 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the Philips ARM7 port.

- *----------------------------------------------------------*/

-

-/*

-	Changes from V3.2.2

-

-	+ Bug fix - The prescale value for the timer setup is now written to T0PR

-	  instead of T0PC.  This bug would have had no effect unless a prescale

-	  value was actually used.

-*/

-

-/* Standard includes. */

-#include <stdlib.h>

-#include <intrinsics.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Constants required to setup the tick ISR. */

-#define portENABLE_TIMER			( ( uint8_t ) 0x01 )

-#define portPRESCALE_VALUE			0x00

-#define portINTERRUPT_ON_MATCH		( ( uint32_t ) 0x01 )

-#define portRESET_COUNT_ON_MATCH	( ( uint32_t ) 0x02 )

-

-/* Constants required to setup the initial stack. */

-#define portINITIAL_SPSR				( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */

-#define portTHUMB_MODE_BIT				( ( StackType_t ) 0x20 )

-#define portINSTRUCTION_SIZE			( ( StackType_t ) 4 )

-

-/* Constants required to setup the PIT. */

-#define portPIT_CLOCK_DIVISOR			( ( uint32_t ) 16 )

-#define portPIT_COUNTER_VALUE			( ( ( configCPU_CLOCK_HZ / portPIT_CLOCK_DIVISOR ) / 1000UL ) * portTICK_PERIOD_MS )

-

-/* Constants required to handle interrupts. */

-#define portTIMER_MATCH_ISR_BIT		( ( uint8_t ) 0x01 )

-#define portCLEAR_VIC_INTERRUPT		( ( uint32_t ) 0 )

-

-/* Constants required to handle critical sections. */

-#define portNO_CRITICAL_NESTING 		( ( uint32_t ) 0 )

-

-

-#define portINT_LEVEL_SENSITIVE  0

-#define portPIT_ENABLE      	( ( uint16_t ) 0x1 << 24 )

-#define portPIT_INT_ENABLE     	( ( uint16_t ) 0x1 << 25 )

-

-/* Constants required to setup the VIC for the tick ISR. */

-#define portTIMER_VIC_CHANNEL		( ( uint32_t ) 0x0004 )

-#define portTIMER_VIC_CHANNEL_BIT	( ( uint32_t ) 0x0010 )

-#define portTIMER_VIC_ENABLE		( ( uint32_t ) 0x0020 )

-

-/*-----------------------------------------------------------*/

-

-/* Setup the PIT to generate the tick interrupts. */

-static void prvSetupTimerInterrupt( void );

-

-/* ulCriticalNesting will get set to zero when the first task starts.  It

-cannot be initialised to 0 as this will cause interrupts to be enabled

-during the kernel initialisation process. */

-uint32_t ulCriticalNesting = ( uint32_t ) 9999;

-

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-StackType_t *pxOriginalTOS;

-

-	pxOriginalTOS = pxTopOfStack;

-

-	/* Setup the initial stack of the task.  The stack is set exactly as

-	expected by the portRESTORE_CONTEXT() macro. */

-

-	/* First on the stack is the return address - which in this case is the

-	start of the task.  The offset is added to make the return address appear

-	as it would within an IRQ ISR. */

-	*pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;		

-	pxTopOfStack--;

-

-	*pxTopOfStack = ( StackType_t ) 0xaaaaaaaa;	/* R14 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12121212;	/* R12 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x11111111;	/* R11 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x10101010;	/* R10 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x09090909;	/* R9 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x08080808;	/* R8 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x07070707;	/* R7 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x06060606;	/* R6 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x05050505;	/* R5 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x04040404;	/* R4 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x03030303;	/* R3 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x02020202;	/* R2 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x01010101;	/* R1 */

-	pxTopOfStack--;	

-

-	/* When the task starts is will expect to find the function parameter in

-	R0. */

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-	pxTopOfStack--;

-

-	/* The status register is set for system mode, with interrupts enabled. */

-	*pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;

-	

-	if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL )

-	{

-		/* We want the task to start in thumb mode. */

-		*pxTopOfStack |= portTHUMB_MODE_BIT;

-	}

-	

-	pxTopOfStack--;

-

-	/* Interrupt flags cannot always be stored on the stack and will

-	instead be stored in a variable, which is then saved as part of the

-	tasks context. */

-	*pxTopOfStack = portNO_CRITICAL_NESTING;

-

-	return pxTopOfStack;	

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-extern void vPortStartFirstTask( void );

-

-	/* Start the timer that generates the tick ISR.  Interrupts are disabled

-	here already. */

-	prvSetupTimerInterrupt();

-

-	/* Start the first task. */

-	vPortStartFirstTask();	

-

-	/* Should not get here! */

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the ARM port will require this function as there

-	is nothing to return to.  */

-}

-/*-----------------------------------------------------------*/

-

-#if configUSE_PREEMPTION == 0

-

-	/* The cooperative scheduler requires a normal IRQ service routine to

-	simply increment the system tick. */

-	static __arm __irq void vPortNonPreemptiveTick( void );

-	static __arm __irq void vPortNonPreemptiveTick( void )

-	{

-		/* Increment the tick count - which may wake some tasks but as the

-		preemptive scheduler is not being used any woken task is not given

-		processor time no matter what its priority. */

-		xTaskIncrementTick();

-		

-		/* Ready for the next interrupt. */

-		T0IR = portTIMER_MATCH_ISR_BIT;

-		VICVectAddr = portCLEAR_VIC_INTERRUPT;

-	}

-

-#else

-

-	/* This function is called from an asm wrapper, so does not require the __irq

-	keyword. */

-	void vPortPreemptiveTick( void );

-	void vPortPreemptiveTick( void )

-	{

-		/* Increment the tick counter. */

-		if( xTaskIncrementTick() != pdFALSE )

-		{	

-			/* The new tick value might unblock a task.  Ensure the highest task that

-			is ready to execute is the task that will execute when the tick ISR

-			exits. */

-			vTaskSwitchContext();

-		}

-	

-		/* Ready for the next interrupt. */

-		T0IR = portTIMER_MATCH_ISR_BIT;

-		VICVectAddr = portCLEAR_VIC_INTERRUPT;

-	}

-

-#endif

-

-/*-----------------------------------------------------------*/

-

-static void prvSetupTimerInterrupt( void )

-{

-uint32_t ulCompareMatch;

-

-	/* A 1ms tick does not require the use of the timer prescale.  This is

-	defaulted to zero but can be used if necessary. */

-	T0PR = portPRESCALE_VALUE;

-

-	/* Calculate the match value required for our wanted tick rate. */

-	ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ;

-

-	/* Protect against divide by zero.  Using an if() statement still results

-	in a warning - hence the #if. */

-	#if portPRESCALE_VALUE != 0

-	{

-		ulCompareMatch /= ( portPRESCALE_VALUE + 1 );

-	}

-	#endif

-

-	T0MR0 = ulCompareMatch;

-

-	/* Generate tick with timer 0 compare match. */

-	T0MCR = portRESET_COUNT_ON_MATCH | portINTERRUPT_ON_MATCH;

-

-	/* Setup the VIC for the timer. */

-	VICIntSelect &= ~( portTIMER_VIC_CHANNEL_BIT );

-	VICIntEnable |= portTIMER_VIC_CHANNEL_BIT;

-	

-	/* The ISR installed depends on whether the preemptive or cooperative

-	scheduler is being used. */

-	#if configUSE_PREEMPTION == 1

-	{	

-		extern void ( vPortPreemptiveTickEntry )( void );

-

-		VICVectAddr0 = ( uint32_t ) vPortPreemptiveTickEntry;

-	}

-	#else

-	{

-		extern void ( vNonPreemptiveTick )( void );

-

-		VICVectAddr0 = ( int32_t ) vPortNonPreemptiveTick;

-	}

-	#endif

-

-	VICVectCntl0 = portTIMER_VIC_CHANNEL | portTIMER_VIC_ENABLE;

-

-	/* Start the timer - interrupts are disabled when this function is called

-	so it is okay to do this here. */

-	T0TCR = portENABLE_TIMER;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-	/* Disable interrupts first! */

-	__disable_interrupt();

-

-	/* Now interrupts are disabled ulCriticalNesting can be accessed

-	directly.  Increment ulCriticalNesting to keep a count of how many times

-	portENTER_CRITICAL() has been called. */

-	ulCriticalNesting++;

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-	if( ulCriticalNesting > portNO_CRITICAL_NESTING )

-	{

-		/* Decrement the nesting count as we are leaving a critical section. */

-		ulCriticalNesting--;

-

-		/* If the nesting level has reached zero then interrupts should be

-		re-enabled. */

-		if( ulCriticalNesting == portNO_CRITICAL_NESTING )

-		{

-			__enable_interrupt();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-

-

-

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the Philips ARM7 port.
+ *----------------------------------------------------------*/
+
+/*
+    Changes from V3.2.2
+
+    + Bug fix - The prescale value for the timer setup is now written to T0PR
+      instead of T0PC.  This bug would have had no effect unless a prescale
+      value was actually used.
+*/
+
+/* Standard includes. */
+#include <stdlib.h>
+#include <intrinsics.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Constants required to setup the tick ISR. */
+#define portENABLE_TIMER            ( ( uint8_t ) 0x01 )
+#define portPRESCALE_VALUE          0x00
+#define portINTERRUPT_ON_MATCH      ( ( uint32_t ) 0x01 )
+#define portRESET_COUNT_ON_MATCH    ( ( uint32_t ) 0x02 )
+
+/* Constants required to setup the initial stack. */
+#define portINITIAL_SPSR                ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */
+#define portTHUMB_MODE_BIT              ( ( StackType_t ) 0x20 )
+#define portINSTRUCTION_SIZE            ( ( StackType_t ) 4 )
+
+/* Constants required to setup the PIT. */
+#define portPIT_CLOCK_DIVISOR           ( ( uint32_t ) 16 )
+#define portPIT_COUNTER_VALUE           ( ( ( configCPU_CLOCK_HZ / portPIT_CLOCK_DIVISOR ) / 1000UL ) * portTICK_PERIOD_MS )
+
+/* Constants required to handle interrupts. */
+#define portTIMER_MATCH_ISR_BIT     ( ( uint8_t ) 0x01 )
+#define portCLEAR_VIC_INTERRUPT     ( ( uint32_t ) 0 )
+
+/* Constants required to handle critical sections. */
+#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
+
+
+#define portINT_LEVEL_SENSITIVE  0
+#define portPIT_ENABLE          ( ( uint16_t ) 0x1 << 24 )
+#define portPIT_INT_ENABLE      ( ( uint16_t ) 0x1 << 25 )
+
+/* Constants required to setup the VIC for the tick ISR. */
+#define portTIMER_VIC_CHANNEL       ( ( uint32_t ) 0x0004 )
+#define portTIMER_VIC_CHANNEL_BIT   ( ( uint32_t ) 0x0010 )
+#define portTIMER_VIC_ENABLE        ( ( uint32_t ) 0x0020 )
+
+/*-----------------------------------------------------------*/
+
+/* Setup the PIT to generate the tick interrupts. */
+static void prvSetupTimerInterrupt( void );
+
+/* ulCriticalNesting will get set to zero when the first task starts.  It
+cannot be initialised to 0 as this will cause interrupts to be enabled
+during the kernel initialisation process. */
+uint32_t ulCriticalNesting = ( uint32_t ) 9999;
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+StackType_t *pxOriginalTOS;
+
+    pxOriginalTOS = pxTopOfStack;
+
+    /* Setup the initial stack of the task.  The stack is set exactly as
+    expected by the portRESTORE_CONTEXT() macro. */
+
+    /* First on the stack is the return address - which in this case is the
+    start of the task.  The offset is added to make the return address appear
+    as it would within an IRQ ISR. */
+    *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;
+    pxTopOfStack--;
+
+    *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
+    pxTopOfStack--;
+
+    /* When the task starts is will expect to find the function parameter in
+    R0. */
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+    pxTopOfStack--;
+
+    /* The status register is set for system mode, with interrupts enabled. */
+    *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;
+
+    if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL )
+    {
+        /* We want the task to start in thumb mode. */
+        *pxTopOfStack |= portTHUMB_MODE_BIT;
+    }
+
+    pxTopOfStack--;
+
+    /* Interrupt flags cannot always be stored on the stack and will
+    instead be stored in a variable, which is then saved as part of the
+    tasks context. */
+    *pxTopOfStack = portNO_CRITICAL_NESTING;
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+extern void vPortStartFirstTask( void );
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+    here already. */
+    prvSetupTimerInterrupt();
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the ARM port will require this function as there
+    is nothing to return to.  */
+}
+/*-----------------------------------------------------------*/
+
+#if configUSE_PREEMPTION == 0
+
+    /* The cooperative scheduler requires a normal IRQ service routine to
+    simply increment the system tick. */
+    static __arm __irq void vPortNonPreemptiveTick( void );
+    static __arm __irq void vPortNonPreemptiveTick( void )
+    {
+        /* Increment the tick count - which may wake some tasks but as the
+        preemptive scheduler is not being used any woken task is not given
+        processor time no matter what its priority. */
+        xTaskIncrementTick();
+
+        /* Ready for the next interrupt. */
+        T0IR = portTIMER_MATCH_ISR_BIT;
+        VICVectAddr = portCLEAR_VIC_INTERRUPT;
+    }
+
+#else
+
+    /* This function is called from an asm wrapper, so does not require the __irq
+    keyword. */
+    void vPortPreemptiveTick( void );
+    void vPortPreemptiveTick( void )
+    {
+        /* Increment the tick counter. */
+        if( xTaskIncrementTick() != pdFALSE )
+        {
+            /* The new tick value might unblock a task.  Ensure the highest task that
+            is ready to execute is the task that will execute when the tick ISR
+            exits. */
+            vTaskSwitchContext();
+        }
+
+        /* Ready for the next interrupt. */
+        T0IR = portTIMER_MATCH_ISR_BIT;
+        VICVectAddr = portCLEAR_VIC_INTERRUPT;
+    }
+
+#endif
+
+/*-----------------------------------------------------------*/
+
+static void prvSetupTimerInterrupt( void )
+{
+uint32_t ulCompareMatch;
+
+    /* A 1ms tick does not require the use of the timer prescale.  This is
+    defaulted to zero but can be used if necessary. */
+    T0PR = portPRESCALE_VALUE;
+
+    /* Calculate the match value required for our wanted tick rate. */
+    ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ;
+
+    /* Protect against divide by zero.  Using an if() statement still results
+    in a warning - hence the #if. */
+    #if portPRESCALE_VALUE != 0
+    {
+        ulCompareMatch /= ( portPRESCALE_VALUE + 1 );
+    }
+    #endif
+
+    T0MR0 = ulCompareMatch;
+
+    /* Generate tick with timer 0 compare match. */
+    T0MCR = portRESET_COUNT_ON_MATCH | portINTERRUPT_ON_MATCH;
+
+    /* Setup the VIC for the timer. */
+    VICIntSelect &= ~( portTIMER_VIC_CHANNEL_BIT );
+    VICIntEnable |= portTIMER_VIC_CHANNEL_BIT;
+
+    /* The ISR installed depends on whether the preemptive or cooperative
+    scheduler is being used. */
+    #if configUSE_PREEMPTION == 1
+    {
+        extern void ( vPortPreemptiveTickEntry )( void );
+
+        VICVectAddr0 = ( uint32_t ) vPortPreemptiveTickEntry;
+    }
+    #else
+    {
+        extern void ( vNonPreemptiveTick )( void );
+
+        VICVectAddr0 = ( int32_t ) vPortNonPreemptiveTick;
+    }
+    #endif
+
+    VICVectCntl0 = portTIMER_VIC_CHANNEL | portTIMER_VIC_ENABLE;
+
+    /* Start the timer - interrupts are disabled when this function is called
+    so it is okay to do this here. */
+    T0TCR = portENABLE_TIMER;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEnterCritical( void )
+{
+    /* Disable interrupts first! */
+    __disable_interrupt();
+
+    /* Now interrupts are disabled ulCriticalNesting can be accessed
+    directly.  Increment ulCriticalNesting to keep a count of how many times
+    portENTER_CRITICAL() has been called. */
+    ulCriticalNesting++;
+}
+/*-----------------------------------------------------------*/
+
+void vPortExitCritical( void )
+{
+    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
+    {
+        /* Decrement the nesting count as we are leaving a critical section. */
+        ulCriticalNesting--;
+
+        /* If the nesting level has reached zero then interrupts should be
+        re-enabled. */
+        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
+        {
+            __enable_interrupt();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/LPC2000/portasm.s79 b/portable/IAR/LPC2000/portasm.s79
index b7ffbe9..eb17933 100644
--- a/portable/IAR/LPC2000/portasm.s79
+++ b/portable/IAR/LPC2000/portasm.s79
@@ -1,77 +1,76 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-		RSEG ICODE:CODE

-		CODE32

-

-	EXTERN vTaskSwitchContext

-	EXTERN vPortPreemptiveTick

-

-	PUBLIC vPortPreemptiveTickEntry

-	PUBLIC vPortYieldProcessor

-	PUBLIC vPortStartFirstTask

-

-#include "FreeRTOSConfig.h"

-#include "ISR_Support.h"

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Starting the first task is just a matter of restoring the context that

-; was created by pxPortInitialiseStack().

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortStartFirstTask:

-	portRESTORE_CONTEXT

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Manual context switch function.  This is the SWI hander.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortYieldProcessor:

-	ADD		LR, LR, #4			; Add 4 to the LR to make the LR appear exactly

-								; as if the context was saved during and IRQ

-								; handler.

-

-	portSAVE_CONTEXT			; Save the context of the current task...

-	LDR R0, =vTaskSwitchContext	; before selecting the next task to execute.

-	mov     lr, pc

-	BX R0

-	portRESTORE_CONTEXT			; Restore the context of the selected task.

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Preemptive context switch function.  This will only ever get installed if

-; portUSE_PREEMPTION is set to 1 in portmacro.h.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortPreemptiveTickEntry:

-#if configUSE_PREEMPTION == 1

-	portSAVE_CONTEXT			; Save the context of the current task...

-	LDR R0, =vPortPreemptiveTick; before selecting the next task to execute.

-	mov     lr, pc

-	BX R0

-	portRESTORE_CONTEXT			; Restore the context of the selected task.

-#endif

-

-	END

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+        RSEG ICODE:CODE
+        CODE32
+
+    EXTERN vTaskSwitchContext
+    EXTERN vPortPreemptiveTick
+
+    PUBLIC vPortPreemptiveTickEntry
+    PUBLIC vPortYieldProcessor
+    PUBLIC vPortStartFirstTask
+
+#include "FreeRTOSConfig.h"
+#include "ISR_Support.h"
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Starting the first task is just a matter of restoring the context that
+; was created by pxPortInitialiseStack().
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortStartFirstTask:
+    portRESTORE_CONTEXT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Manual context switch function.  This is the SWI hander.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortYieldProcessor:
+    ADD     LR, LR, #4          ; Add 4 to the LR to make the LR appear exactly
+                                ; as if the context was saved during and IRQ
+                                ; handler.
+
+    portSAVE_CONTEXT            ; Save the context of the current task...
+    LDR R0, =vTaskSwitchContext ; before selecting the next task to execute.
+    mov     lr, pc
+    BX R0
+    portRESTORE_CONTEXT         ; Restore the context of the selected task.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Preemptive context switch function.  This will only ever get installed if
+; portUSE_PREEMPTION is set to 1 in portmacro.h.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortPreemptiveTickEntry:
+#if configUSE_PREEMPTION == 1
+    portSAVE_CONTEXT            ; Save the context of the current task...
+    LDR R0, =vPortPreemptiveTick; before selecting the next task to execute.
+    mov     lr, pc
+    BX R0
+    portRESTORE_CONTEXT         ; Restore the context of the selected task.
+#endif
+
+    END
diff --git a/portable/IAR/LPC2000/portmacro.h b/portable/IAR/LPC2000/portmacro.h
index 709caeb..e7fd109 100644
--- a/portable/IAR/LPC2000/portmacro.h
+++ b/portable/IAR/LPC2000/portmacro.h
@@ -1,114 +1,112 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#include <intrinsics.h>

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		short

-#define portSTACK_TYPE	uint32_t

-#define portBASE_TYPE	long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portBYTE_ALIGNMENT			8

-#define portYIELD()					asm ( "SWI 0" )

-#define portNOP()					asm ( "NOP" )

-/*-----------------------------------------------------------*/

-

-/* Critical section handling. */

-__arm __interwork void vPortDisableInterruptsFromThumb( void );

-__arm __interwork void vPortEnableInterruptsFromThumb( void );

-__arm __interwork void vPortEnterCritical( void );

-__arm __interwork void vPortExitCritical( void );

-

-#define portDISABLE_INTERRUPTS()	__disable_interrupt()

-#define portENABLE_INTERRUPTS()		__enable_interrupt()

-#define portENTER_CRITICAL()		vPortEnterCritical()

-#define portEXIT_CRITICAL()			vPortExitCritical()

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-#define portEND_SWITCHING_ISR( xSwitchRequired ) 	\

-{													\

-extern void vTaskSwitchContext( void );				\

-													\

-	if( xSwitchRequired ) 							\

-	{												\

-		vTaskSwitchContext();						\

-	}												\

-}

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#include <intrinsics.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint32_t
+#define portBASE_TYPE   long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT          8
+#define portYIELD()                 asm ( "SWI 0" )
+#define portNOP()                   asm ( "NOP" )
+/*-----------------------------------------------------------*/
+
+/* Critical section handling. */
+__arm __interwork void vPortDisableInterruptsFromThumb( void );
+__arm __interwork void vPortEnableInterruptsFromThumb( void );
+__arm __interwork void vPortEnterCritical( void );
+__arm __interwork void vPortExitCritical( void );
+
+#define portDISABLE_INTERRUPTS()    __disable_interrupt()
+#define portENABLE_INTERRUPTS()     __enable_interrupt()
+#define portENTER_CRITICAL()        vPortEnterCritical()
+#define portEXIT_CRITICAL()         vPortExitCritical()
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+#define portEND_SWITCHING_ISR( xSwitchRequired )    \
+{                                                   \
+extern void vTaskSwitchContext( void );             \
+                                                    \
+    if( xSwitchRequired )                           \
+    {                                               \
+        vTaskSwitchContext();                       \
+    }                                               \
+}
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/MSP430/port.c b/portable/IAR/MSP430/port.c
index e825baf..4375634 100644
--- a/portable/IAR/MSP430/port.c
+++ b/portable/IAR/MSP430/port.c
@@ -1,174 +1,174 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the MSP430 port.

- *----------------------------------------------------------*/

-

-/* Constants required for hardware setup.  The tick ISR runs off the ACLK,

-not the MCLK. */

-#define portACLK_FREQUENCY_HZ			( ( TickType_t ) 32768 )

-#define portINITIAL_CRITICAL_NESTING	( ( uint16_t ) 10 )

-#define portFLAGS_INT_ENABLED			( ( StackType_t ) 0x08 )

-

-/* We require the address of the pxCurrentTCB variable, but don't want to know

-any details of its type. */

-typedef void TCB_t;

-extern volatile TCB_t * volatile pxCurrentTCB;

-

-/* Each task maintains a count of the critical section nesting depth.  Each

-time a critical section is entered the count is incremented.  Each time a

-critical section is exited the count is decremented - with interrupts only

-being re-enabled if the count is zero.

-

-usCriticalNesting will get set to zero when the scheduler starts, but must

-not be initialised to zero as this will cause problems during the startup

-sequence. */

-volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;

-/*-----------------------------------------------------------*/

-

-

-/*

- * Sets up the periodic ISR used for the RTOS tick.  This uses timer 0, but

- * could have alternatively used the watchdog timer or timer 1.

- */

-void vPortSetupTimerInterrupt( void );

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See the header file portable.h.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-	/*

-		Place a few bytes of known values on the bottom of the stack.

-		This is just useful for debugging and can be included if required.

-

-		*pxTopOfStack = ( StackType_t ) 0x1111;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0x2222;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0x3333;

-		pxTopOfStack--;

-	*/

-

-	/* The msp430 automatically pushes the PC then SR onto the stack before

-	executing an ISR.  We want the stack to look just as if this has happened

-	so place a pointer to the start of the task on the stack first - followed

-	by the flags we want the task to use when it starts up. */

-	*pxTopOfStack = ( StackType_t ) pxCode;

-	pxTopOfStack--;

-	*pxTopOfStack = portFLAGS_INT_ENABLED;

-	pxTopOfStack--;

-

-	/* Next the general purpose registers. */

-	*pxTopOfStack = ( StackType_t ) 0x4444;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x5555;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x6666;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x7777;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x8888;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x9999;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0xaaaa;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0xbbbb;

-	pxTopOfStack--;	

-	

-	/* When the task starts is will expect to find the function parameter in

-	R15. */

-	*pxTopOfStack = ( StackType_t ) pvParameters;

-	pxTopOfStack--;

-	

-	*pxTopOfStack = ( StackType_t ) 0xdddd;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0xeeee;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0xffff;

-	pxTopOfStack--;

-

-	/* A variable is used to keep track of the critical section nesting.

-	This variable has to be stored as part of the task context and is

-	initially set to zero. */

-	*pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;	

-

-	/* Return a pointer to the top of the stack we have generated so this can

-	be stored in the task control block for the task. */

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the MSP430 port will get stopped.  If required simply

-	disable the tick interrupt here. */

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Hardware initialisation to generate the RTOS tick.  This uses timer 0

- * but could alternatively use the watchdog timer or timer 1.

- */

-void vPortSetupTimerInterrupt( void )

-{

-	/* Ensure the timer is stopped. */

-	TACTL = 0;

-

-	/* Run the timer of the ACLK. */

-	TACTL = TASSEL_1;

-

-	/* Clear everything to start with. */

-	TACTL |= TACLR;

-

-	/* Set the compare match value according to the tick rate we want. */

-	TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ;

-

-	/* Enable the interrupts. */

-	TACCTL0 = CCIE;

-

-	/* Start up clean. */

-	TACTL |= TACLR;

-

-	/* Up mode. */

-	TACTL |= MC_1;

-}

-/*-----------------------------------------------------------*/

-

-

-	

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the MSP430 port.
+ *----------------------------------------------------------*/
+
+/* Constants required for hardware setup.  The tick ISR runs off the ACLK,
+not the MCLK. */
+#define portACLK_FREQUENCY_HZ           ( ( TickType_t ) 32768 )
+#define portINITIAL_CRITICAL_NESTING    ( ( uint16_t ) 10 )
+#define portFLAGS_INT_ENABLED           ( ( StackType_t ) 0x08 )
+
+/* We require the address of the pxCurrentTCB variable, but don't want to know
+any details of its type. */
+typedef void TCB_t;
+extern volatile TCB_t * volatile pxCurrentTCB;
+
+/* Each task maintains a count of the critical section nesting depth.  Each
+time a critical section is entered the count is incremented.  Each time a
+critical section is exited the count is decremented - with interrupts only
+being re-enabled if the count is zero.
+
+usCriticalNesting will get set to zero when the scheduler starts, but must
+not be initialised to zero as this will cause problems during the startup
+sequence. */
+volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;
+/*-----------------------------------------------------------*/
+
+
+/*
+ * Sets up the periodic ISR used for the RTOS tick.  This uses timer 0, but
+ * could have alternatively used the watchdog timer or timer 1.
+ */
+void vPortSetupTimerInterrupt( void );
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See the header file portable.h.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+    /*
+        Place a few bytes of known values on the bottom of the stack.
+        This is just useful for debugging and can be included if required.
+
+        *pxTopOfStack = ( StackType_t ) 0x1111;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0x2222;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0x3333;
+        pxTopOfStack--;
+    */
+
+    /* The msp430 automatically pushes the PC then SR onto the stack before
+    executing an ISR.  We want the stack to look just as if this has happened
+    so place a pointer to the start of the task on the stack first - followed
+    by the flags we want the task to use when it starts up. */
+    *pxTopOfStack = ( StackType_t ) pxCode;
+    pxTopOfStack--;
+    *pxTopOfStack = portFLAGS_INT_ENABLED;
+    pxTopOfStack--;
+
+    /* Next the general purpose registers. */
+    *pxTopOfStack = ( StackType_t ) 0x4444;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x5555;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x6666;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x7777;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x8888;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x9999;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0xaaaa;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0xbbbb;
+    pxTopOfStack--;
+
+    /* When the task starts is will expect to find the function parameter in
+    R15. */
+    *pxTopOfStack = ( StackType_t ) pvParameters;
+    pxTopOfStack--;
+
+    *pxTopOfStack = ( StackType_t ) 0xdddd;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0xeeee;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0xffff;
+    pxTopOfStack--;
+
+    /* A variable is used to keep track of the critical section nesting.
+    This variable has to be stored as part of the task context and is
+    initially set to zero. */
+    *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;
+
+    /* Return a pointer to the top of the stack we have generated so this can
+    be stored in the task control block for the task. */
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the MSP430 port will get stopped.  If required simply
+    disable the tick interrupt here. */
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * Hardware initialisation to generate the RTOS tick.  This uses timer 0
+ * but could alternatively use the watchdog timer or timer 1.
+ */
+void vPortSetupTimerInterrupt( void )
+{
+    /* Ensure the timer is stopped. */
+    TACTL = 0;
+
+    /* Run the timer of the ACLK. */
+    TACTL = TASSEL_1;
+
+    /* Clear everything to start with. */
+    TACTL |= TACLR;
+
+    /* Set the compare match value according to the tick rate we want. */
+    TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ;
+
+    /* Enable the interrupts. */
+    TACCTL0 = CCIE;
+
+    /* Start up clean. */
+    TACTL |= TACLR;
+
+    /* Up mode. */
+    TACTL |= MC_1;
+}
+/*-----------------------------------------------------------*/
+
+
+
diff --git a/portable/IAR/MSP430/portasm.h b/portable/IAR/MSP430/portasm.h
index 743e802..5a8fa0a 100644
--- a/portable/IAR/MSP430/portasm.h
+++ b/portable/IAR/MSP430/portasm.h
@@ -1,85 +1,84 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTASM_H

-#define PORTASM_H

-

-portSAVE_CONTEXT macro

-

-		IMPORT pxCurrentTCB

-		IMPORT usCriticalNesting

-

-		/* Save the remaining registers. */

-		push	r4

-		push	r5

-		push	r6

-		push	r7

-		push	r8

-		push	r9

-		push	r10

-		push	r11

-		push	r12

-		push	r13

-		push	r14

-		push	r15

-		mov.w	&usCriticalNesting, r14

-		push	r14

-		mov.w	&pxCurrentTCB, r12

-		mov.w	r1, 0(r12)

-		endm

-/*-----------------------------------------------------------*/

-		

-portRESTORE_CONTEXT macro

-		mov.w	&pxCurrentTCB, r12

-		mov.w	@r12, r1

-		pop		r15

-		mov.w	r15, &usCriticalNesting

-		pop		r15

-		pop		r14

-		pop		r13

-		pop		r12

-		pop		r11

-		pop		r10

-		pop		r9

-		pop		r8

-		pop		r7

-		pop		r6

-		pop		r5

-		pop		r4

-

-		/* The last thing on the stack will be the status register.

-        Ensure the power down bits are clear ready for the next

-        time this power down register is popped from the stack. */

-		bic.w   #0xf0,0(SP)

-

-		reti

-		endm

-/*-----------------------------------------------------------*/

-

-#endif

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTASM_H
+#define PORTASM_H
+
+portSAVE_CONTEXT macro
+
+        IMPORT pxCurrentTCB
+        IMPORT usCriticalNesting
+
+        /* Save the remaining registers. */
+        push    r4
+        push    r5
+        push    r6
+        push    r7
+        push    r8
+        push    r9
+        push    r10
+        push    r11
+        push    r12
+        push    r13
+        push    r14
+        push    r15
+        mov.w   &usCriticalNesting, r14
+        push    r14
+        mov.w   &pxCurrentTCB, r12
+        mov.w   r1, 0(r12)
+        endm
+/*-----------------------------------------------------------*/
+
+portRESTORE_CONTEXT macro
+        mov.w   &pxCurrentTCB, r12
+        mov.w   @r12, r1
+        pop     r15
+        mov.w   r15, &usCriticalNesting
+        pop     r15
+        pop     r14
+        pop     r13
+        pop     r12
+        pop     r11
+        pop     r10
+        pop     r9
+        pop     r8
+        pop     r7
+        pop     r6
+        pop     r5
+        pop     r4
+
+        /* The last thing on the stack will be the status register.
+        Ensure the power down bits are clear ready for the next
+        time this power down register is popped from the stack. */
+        bic.w   #0xf0,0(SP)
+
+        reti
+        endm
+/*-----------------------------------------------------------*/
+
+#endif
diff --git a/portable/IAR/MSP430/portext.s43 b/portable/IAR/MSP430/portext.s43
index d6f347d..5360a97 100644
--- a/portable/IAR/MSP430/portext.s43
+++ b/portable/IAR/MSP430/portext.s43
@@ -1,107 +1,106 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-#include "FreeRTOSConfig.h"

-#include "portasm.h"

-

-	IMPORT xTaskIncrementTick

-	IMPORT vTaskSwitchContext

-	IMPORT vPortSetupTimerInterrupt

-

-	EXPORT vTickISR

-	EXPORT vPortYield

-	EXPORT xPortStartScheduler

-

-	RSEG CODE

-

-/*

- * The RTOS tick ISR.

- *

- * If the cooperative scheduler is in use this simply increments the tick

- * count.

- *

- * If the preemptive scheduler is in use a context switch can also occur.

- */

-vTickISR:

-	portSAVE_CONTEXT

-

-	call	#xTaskIncrementTick

-	cmp.w	#0x0, R12

-    jeq		SkipContextSwitch

-	call	#vTaskSwitchContext

-SkipContextSwitch:

-

-	portRESTORE_CONTEXT

-/*-----------------------------------------------------------*/

-

-

-/*

- * Manual context switch called by the portYIELD() macro.

- */

-vPortYield:

-

-	/* Mimic an interrupt by pushing the SR. */

-	push	SR

-

-	/* Now the SR is stacked we can disable interrupts. */

-	dint

-

-	/* Save the context of the current task. */

-	portSAVE_CONTEXT

-

-	/* Switch to the highest priority task that is ready to run. */

-	call	#vTaskSwitchContext

-

-	/* Restore the context of the new task. */

-	portRESTORE_CONTEXT

-/*-----------------------------------------------------------*/

-

-

-/*

- * Start off the scheduler by initialising the RTOS tick timer, then restoring

- * the context of the first task.

- */

-xPortStartScheduler:

-

-	/* Setup the hardware to generate the tick.  Interrupts are disabled

-	when this function is called. */

-	call	#vPortSetupTimerInterrupt

-

-	/* Restore the context of the first task that is going to run. */

-	portRESTORE_CONTEXT

-/*-----------------------------------------------------------*/

-

-

-	/* Install vTickISR as the timer A0 interrupt. */

-	ASEG

-	ORG 0xFFE0 + TIMERA0_VECTOR

-

-	_vTickISR_: DC16 vTickISR

-

-

-	END

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+#include "FreeRTOSConfig.h"
+#include "portasm.h"
+
+    IMPORT xTaskIncrementTick
+    IMPORT vTaskSwitchContext
+    IMPORT vPortSetupTimerInterrupt
+
+    EXPORT vTickISR
+    EXPORT vPortYield
+    EXPORT xPortStartScheduler
+
+    RSEG CODE
+
+/*
+ * The RTOS tick ISR.
+ *
+ * If the cooperative scheduler is in use this simply increments the tick
+ * count.
+ *
+ * If the preemptive scheduler is in use a context switch can also occur.
+ */
+vTickISR:
+    portSAVE_CONTEXT
+
+    call    #xTaskIncrementTick
+    cmp.w   #0x0, R12
+    jeq     SkipContextSwitch
+    call    #vTaskSwitchContext
+SkipContextSwitch:
+
+    portRESTORE_CONTEXT
+/*-----------------------------------------------------------*/
+
+
+/*
+ * Manual context switch called by the portYIELD() macro.
+ */
+vPortYield:
+
+    /* Mimic an interrupt by pushing the SR. */
+    push    SR
+
+    /* Now the SR is stacked we can disable interrupts. */
+    dint
+
+    /* Save the context of the current task. */
+    portSAVE_CONTEXT
+
+    /* Switch to the highest priority task that is ready to run. */
+    call    #vTaskSwitchContext
+
+    /* Restore the context of the new task. */
+    portRESTORE_CONTEXT
+/*-----------------------------------------------------------*/
+
+
+/*
+ * Start off the scheduler by initialising the RTOS tick timer, then restoring
+ * the context of the first task.
+ */
+xPortStartScheduler:
+
+    /* Setup the hardware to generate the tick.  Interrupts are disabled
+    when this function is called. */
+    call    #vPortSetupTimerInterrupt
+
+    /* Restore the context of the first task that is going to run. */
+    portRESTORE_CONTEXT
+/*-----------------------------------------------------------*/
+
+
+    /* Install vTickISR as the timer A0 interrupt. */
+    ASEG
+    ORG 0xFFE0 + TIMERA0_VECTOR
+
+    _vTickISR_: DC16 vTickISR
+
+
+    END
diff --git a/portable/IAR/MSP430/portmacro.h b/portable/IAR/MSP430/portmacro.h
index b7f55a5..8659c4f 100644
--- a/portable/IAR/MSP430/portmacro.h
+++ b/portable/IAR/MSP430/portmacro.h
@@ -1,134 +1,133 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		int

-#define portSTACK_TYPE	uint16_t

-#define portBASE_TYPE	short

-

-typedef portSTACK_TYPE StackType_t;

-typedef short BaseType_t;

-typedef unsigned short UBaseType_t;

-

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-

-/*-----------------------------------------------------------*/

-

-/* Interrupt control macros. */

-#define portDISABLE_INTERRUPTS()	_DINT(); _NOP()

-#define portENABLE_INTERRUPTS()		_EINT(); _NOP()

-/*-----------------------------------------------------------*/

-

-/* Critical section control macros. */

-#define portNO_CRITICAL_SECTION_NESTING		( ( uint16_t ) 0 )

-

-#define portENTER_CRITICAL()													\

-{																				\

-extern volatile uint16_t usCriticalNesting;							\

-																				\

-	portDISABLE_INTERRUPTS();													\

-																				\

-	/* Now interrupts are disabled usCriticalNesting can be accessed */			\

-	/* directly.  Increment ulCriticalNesting to keep a count of how many */	\

-	/* times portENTER_CRITICAL() has been called. */							\

-	usCriticalNesting++;														\

-}

-

-#define portEXIT_CRITICAL()														\

-{																				\

-extern volatile uint16_t usCriticalNesting;							\

-																				\

-	if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )					\

-	{																			\

-		/* Decrement the nesting count as we are leaving a critical section. */	\

-		usCriticalNesting--;													\

-																				\

-		/* If the nesting level has reached zero then interrupts should be */	\

-		/* re-enabled. */														\

-		if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )				\

-		{																		\

-			portENABLE_INTERRUPTS();											\

-		}																		\

-	}																			\

-}

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-

-/*

- * Manual context switch called by portYIELD or taskYIELD.

- */

-extern void vPortYield( void );

-#define portYIELD() vPortYield()

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portBYTE_ALIGNMENT			2

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portNOP()

-#define portPOINTER_SIZE_TYPE		uint16_t

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-#if configINTERRUPT_EXAMPLE_METHOD == 2

-

-extern void vTaskSwitchContext( void );

-#define portYIELD_FROM_ISR( x ) do { if( x ) vTaskSwitchContext(); } while( 0 )

-

-#endif

-

-#endif /* PORTMACRO_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       int
+#define portSTACK_TYPE  uint16_t
+#define portBASE_TYPE   short
+
+typedef portSTACK_TYPE StackType_t;
+typedef short BaseType_t;
+typedef unsigned short UBaseType_t;
+
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+
+/*-----------------------------------------------------------*/
+
+/* Interrupt control macros. */
+#define portDISABLE_INTERRUPTS()    _DINT(); _NOP()
+#define portENABLE_INTERRUPTS()     _EINT(); _NOP()
+/*-----------------------------------------------------------*/
+
+/* Critical section control macros. */
+#define portNO_CRITICAL_SECTION_NESTING     ( ( uint16_t ) 0 )
+
+#define portENTER_CRITICAL()                                                    \
+{                                                                               \
+extern volatile uint16_t usCriticalNesting;                         \
+                                                                                \
+    portDISABLE_INTERRUPTS();                                                   \
+                                                                                \
+    /* Now interrupts are disabled usCriticalNesting can be accessed */         \
+    /* directly.  Increment ulCriticalNesting to keep a count of how many */    \
+    /* times portENTER_CRITICAL() has been called. */                           \
+    usCriticalNesting++;                                                        \
+}
+
+#define portEXIT_CRITICAL()                                                     \
+{                                                                               \
+extern volatile uint16_t usCriticalNesting;                         \
+                                                                                \
+    if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )                   \
+    {                                                                           \
+        /* Decrement the nesting count as we are leaving a critical section. */ \
+        usCriticalNesting--;                                                    \
+                                                                                \
+        /* If the nesting level has reached zero then interrupts should be */   \
+        /* re-enabled. */                                                       \
+        if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )              \
+        {                                                                       \
+            portENABLE_INTERRUPTS();                                            \
+        }                                                                       \
+    }                                                                           \
+}
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+
+/*
+ * Manual context switch called by portYIELD or taskYIELD.
+ */
+extern void vPortYield( void );
+#define portYIELD() vPortYield()
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portBYTE_ALIGNMENT          2
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portNOP()
+#define portPOINTER_SIZE_TYPE       uint16_t
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+#if configINTERRUPT_EXAMPLE_METHOD == 2
+
+extern void vTaskSwitchContext( void );
+#define portYIELD_FROM_ISR( x ) do { if( x ) vTaskSwitchContext(); } while( 0 )
+
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/MSP430X/data_model.h b/portable/IAR/MSP430X/data_model.h
index 68c3b9c..0601356 100644
--- a/portable/IAR/MSP430X/data_model.h
+++ b/portable/IAR/MSP430X/data_model.h
@@ -1,64 +1,63 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef DATA_MODEL_H

-#define DATA_MODEL_H

-

-#if __DATA_MODEL__ == __DATA_MODEL_SMALL__

-	#define pushm_x pushm.w

-	#define popm_x popm.w

-	#define push_x push.w

-	#define pop_x pop.w

-	#define mov_x mov.w

-	#define cmp_x cmp.w

-#endif

-

-#if __DATA_MODEL__ == __DATA_MODEL_MEDIUM__

-	#define pushm_x pushm.a

-	#define popm_x popm.a

-	#define push_x pushx.a

-	#define pop_x popx.a

-	#define mov_x mov.w

-	#define cmp_x cmp.w

-#endif

-

-#if __DATA_MODEL__ == __DATA_MODEL_LARGE__

-	#define pushm_x pushm.a

-	#define popm_x popm.a

-	#define push_x pushx.a

-	#define pop_x popx.a

-	#define mov_x movx.a

-	#define cmp_x cmpx.a

-#endif

-

-#ifndef pushm_x

-	#error The assembler options must define one of the following symbols: __DATA_MODEL_SMALL__, __DATA_MODEL_MEDIUM__, or __DATA_MODEL_LARGE__

-#endif

-

-#endif /* DATA_MODEL_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef DATA_MODEL_H
+#define DATA_MODEL_H
+
+#if __DATA_MODEL__ == __DATA_MODEL_SMALL__
+    #define pushm_x pushm.w
+    #define popm_x popm.w
+    #define push_x push.w
+    #define pop_x pop.w
+    #define mov_x mov.w
+    #define cmp_x cmp.w
+#endif
+
+#if __DATA_MODEL__ == __DATA_MODEL_MEDIUM__
+    #define pushm_x pushm.a
+    #define popm_x popm.a
+    #define push_x pushx.a
+    #define pop_x popx.a
+    #define mov_x mov.w
+    #define cmp_x cmp.w
+#endif
+
+#if __DATA_MODEL__ == __DATA_MODEL_LARGE__
+    #define pushm_x pushm.a
+    #define popm_x popm.a
+    #define push_x pushx.a
+    #define pop_x popx.a
+    #define mov_x movx.a
+    #define cmp_x cmpx.a
+#endif
+
+#ifndef pushm_x
+    #error The assembler options must define one of the following symbols: __DATA_MODEL_SMALL__, __DATA_MODEL_MEDIUM__, or __DATA_MODEL_LARGE__
+#endif
+
+#endif /* DATA_MODEL_H */
diff --git a/portable/IAR/MSP430X/port.c b/portable/IAR/MSP430X/port.c
index 8ffec93..ea35d9a 100644
--- a/portable/IAR/MSP430X/port.c
+++ b/portable/IAR/MSP430X/port.c
@@ -1,183 +1,183 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the MSP430X port.

- *----------------------------------------------------------*/

-

-/* Constants required for hardware setup.  The tick ISR runs off the ACLK,

-not the MCLK. */

-#define portACLK_FREQUENCY_HZ			( ( TickType_t ) 32768 )

-#define portINITIAL_CRITICAL_NESTING	( ( uint16_t ) 10 )

-#define portFLAGS_INT_ENABLED			( ( StackType_t ) 0x08 )

-

-/* We require the address of the pxCurrentTCB variable, but don't want to know

-any details of its type. */

-typedef void TCB_t;

-extern volatile TCB_t * volatile pxCurrentTCB;

-

-/* Each task maintains a count of the critical section nesting depth.  Each

-time a critical section is entered the count is incremented.  Each time a

-critical section is exited the count is decremented - with interrupts only

-being re-enabled if the count is zero.

-

-usCriticalNesting will get set to zero when the scheduler starts, but must

-not be initialised to zero as this will cause problems during the startup

-sequence. */

-volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;

-/*-----------------------------------------------------------*/

-

-

-/*

- * Sets up the periodic ISR used for the RTOS tick.  This uses timer 0, but

- * could have alternatively used the watchdog timer or timer 1.

- */

-void vPortSetupTimerInterrupt( void );

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See the header file portable.h.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-uint16_t *pusTopOfStack;

-uint32_t *pulTopOfStack;

-

-	/*

-		Place a few bytes of known values on the bottom of the stack.

-		This is just useful for debugging and can be included if required.

-	

-		*pxTopOfStack = ( StackType_t ) 0x1111;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0x2222;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0x3333;

-	*/

-

-	/* StackType_t is either 16 bits or 32 bits depending on the data model.

-	Some stacked items do not change size depending on the data model so have

-	to be explicitly cast to the correct size so this function will work

-	whichever data model is being used. */

-	if( sizeof( StackType_t ) == sizeof( uint16_t ) )

-	{

-		/* Make room for a 20 bit value stored as a 32 bit value. */

-		pusTopOfStack = ( uint16_t * ) pxTopOfStack;

-		pusTopOfStack--;

-		pulTopOfStack = ( uint32_t * ) pusTopOfStack;

-	}

-	else

-	{

-		pulTopOfStack = ( uint32_t * ) pxTopOfStack;

-	}

-	*pulTopOfStack = ( uint32_t ) pxCode;

-	

-	pusTopOfStack = ( uint16_t * ) pulTopOfStack;

-	pusTopOfStack--;

-	*pusTopOfStack = portFLAGS_INT_ENABLED;

-	pusTopOfStack -= ( sizeof( StackType_t ) / 2 );

-	

-	/* From here on the size of stacked items depends on the memory model. */

-	pxTopOfStack = ( StackType_t * ) pusTopOfStack;

-

-	/* Next the general purpose registers. */

-	#ifdef PRELOAD_REGISTER_VALUES

-		*pxTopOfStack = ( StackType_t ) 0xffff;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0xeeee;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0xdddd;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) pvParameters;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0xbbbb;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0xaaaa;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0x9999;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0x8888;

-		pxTopOfStack--;	

-		*pxTopOfStack = ( StackType_t ) 0x5555;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0x6666;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0x5555;

-		pxTopOfStack--;

-		*pxTopOfStack = ( StackType_t ) 0x4444;

-		pxTopOfStack--;

-	#else

-		pxTopOfStack -= 3;

-		*pxTopOfStack = ( StackType_t ) pvParameters;

-		pxTopOfStack -= 9;

-	#endif

-

-

-	/* A variable is used to keep track of the critical section nesting.

-	This variable has to be stored as part of the task context and is

-	initially set to zero. */

-	*pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;	

-

-	/* Return a pointer to the top of the stack we have generated so this can

-	be stored in the task control block for the task. */

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the MSP430 port will get stopped.  If required simply

-	disable the tick interrupt here. */

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Hardware initialisation to generate the RTOS tick.

- */

-void vPortSetupTimerInterrupt( void )

-{

-	vApplicationSetupTimerInterrupt();

-}

-/*-----------------------------------------------------------*/

-

-#pragma vector=configTICK_VECTOR

-__interrupt __raw void vTickISREntry( void )

-{

-extern void vPortTickISR( void );

-

-	__bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );

-	vPortTickISR();

-}

-

-	

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the MSP430X port.
+ *----------------------------------------------------------*/
+
+/* Constants required for hardware setup.  The tick ISR runs off the ACLK,
+not the MCLK. */
+#define portACLK_FREQUENCY_HZ           ( ( TickType_t ) 32768 )
+#define portINITIAL_CRITICAL_NESTING    ( ( uint16_t ) 10 )
+#define portFLAGS_INT_ENABLED           ( ( StackType_t ) 0x08 )
+
+/* We require the address of the pxCurrentTCB variable, but don't want to know
+any details of its type. */
+typedef void TCB_t;
+extern volatile TCB_t * volatile pxCurrentTCB;
+
+/* Each task maintains a count of the critical section nesting depth.  Each
+time a critical section is entered the count is incremented.  Each time a
+critical section is exited the count is decremented - with interrupts only
+being re-enabled if the count is zero.
+
+usCriticalNesting will get set to zero when the scheduler starts, but must
+not be initialised to zero as this will cause problems during the startup
+sequence. */
+volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;
+/*-----------------------------------------------------------*/
+
+
+/*
+ * Sets up the periodic ISR used for the RTOS tick.  This uses timer 0, but
+ * could have alternatively used the watchdog timer or timer 1.
+ */
+void vPortSetupTimerInterrupt( void );
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See the header file portable.h.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+uint16_t *pusTopOfStack;
+uint32_t *pulTopOfStack;
+
+    /*
+        Place a few bytes of known values on the bottom of the stack.
+        This is just useful for debugging and can be included if required.
+
+        *pxTopOfStack = ( StackType_t ) 0x1111;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0x2222;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0x3333;
+    */
+
+    /* StackType_t is either 16 bits or 32 bits depending on the data model.
+    Some stacked items do not change size depending on the data model so have
+    to be explicitly cast to the correct size so this function will work
+    whichever data model is being used. */
+    if( sizeof( StackType_t ) == sizeof( uint16_t ) )
+    {
+        /* Make room for a 20 bit value stored as a 32 bit value. */
+        pusTopOfStack = ( uint16_t * ) pxTopOfStack;
+        pusTopOfStack--;
+        pulTopOfStack = ( uint32_t * ) pusTopOfStack;
+    }
+    else
+    {
+        pulTopOfStack = ( uint32_t * ) pxTopOfStack;
+    }
+    *pulTopOfStack = ( uint32_t ) pxCode;
+
+    pusTopOfStack = ( uint16_t * ) pulTopOfStack;
+    pusTopOfStack--;
+    *pusTopOfStack = portFLAGS_INT_ENABLED;
+    pusTopOfStack -= ( sizeof( StackType_t ) / 2 );
+
+    /* From here on the size of stacked items depends on the memory model. */
+    pxTopOfStack = ( StackType_t * ) pusTopOfStack;
+
+    /* Next the general purpose registers. */
+    #ifdef PRELOAD_REGISTER_VALUES
+        *pxTopOfStack = ( StackType_t ) 0xffff;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0xeeee;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0xdddd;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) pvParameters;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0xbbbb;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0xaaaa;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0x9999;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0x8888;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0x5555;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0x6666;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0x5555;
+        pxTopOfStack--;
+        *pxTopOfStack = ( StackType_t ) 0x4444;
+        pxTopOfStack--;
+    #else
+        pxTopOfStack -= 3;
+        *pxTopOfStack = ( StackType_t ) pvParameters;
+        pxTopOfStack -= 9;
+    #endif
+
+
+    /* A variable is used to keep track of the critical section nesting.
+    This variable has to be stored as part of the task context and is
+    initially set to zero. */
+    *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;
+
+    /* Return a pointer to the top of the stack we have generated so this can
+    be stored in the task control block for the task. */
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the MSP430 port will get stopped.  If required simply
+    disable the tick interrupt here. */
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * Hardware initialisation to generate the RTOS tick.
+ */
+void vPortSetupTimerInterrupt( void )
+{
+    vApplicationSetupTimerInterrupt();
+}
+/*-----------------------------------------------------------*/
+
+#pragma vector=configTICK_VECTOR
+__interrupt __raw void vTickISREntry( void )
+{
+extern void vPortTickISR( void );
+
+    __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );
+    vPortTickISR();
+}
+
+
diff --git a/portable/IAR/MSP430X/portext.s43 b/portable/IAR/MSP430X/portext.s43
index 98268e1..cc2f592 100644
--- a/portable/IAR/MSP430X/portext.s43
+++ b/portable/IAR/MSP430X/portext.s43
@@ -1,139 +1,138 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-#include "msp430.h"

-#include "FreeRTOSConfig.h"

-#include "data_model.h"

-

-	IMPORT xTaskIncrementTick

-	IMPORT vTaskSwitchContext

-	IMPORT vPortSetupTimerInterrupt

-	IMPORT pxCurrentTCB

-	IMPORT usCriticalNesting

-

-	EXPORT vPortTickISR

-	EXPORT vPortYield

-	EXPORT xPortStartScheduler

-

-portSAVE_CONTEXT macro

-

-	/* Save the remaining registers. */

-	pushm_x	#12, r15

-	mov.w	&usCriticalNesting, r14

-	push_x r14

-	mov_x	&pxCurrentTCB, r12

-	mov_x	sp, 0( r12 )

-	endm

-/*-----------------------------------------------------------*/

-

-portRESTORE_CONTEXT macro

-

-	mov_x	&pxCurrentTCB, r12

-	mov_x	@r12, sp

-	pop_x	r15

-	mov.w	r15, &usCriticalNesting

-	popm_x	#12, r15

-	nop

-	pop.w	sr

-	nop

-	reta

-	endm

-/*-----------------------------------------------------------*/

-

-

-/*

- * The RTOS tick ISR.

- *

- * If the cooperative scheduler is in use this simply increments the tick

- * count.

- *

- * If the preemptive scheduler is in use a context switch can also occur.

- */

-

-	RSEG CODE

-	EVEN

-

-vPortTickISR:

-

-	/* The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs

-	to save it manually before it gets modified (interrupts get disabled).

-	Entering through this interrupt means the SR is already on the stack, but

-	this keeps the stack frames identical. */

-	push.w sr

-	portSAVE_CONTEXT

-

-	calla	#xTaskIncrementTick

-	cmp.w   #0x0, R12

-    jeq     SkipContextSwitch

-    calla   #vTaskSwitchContext

-SkipContextSwitch:

-	portRESTORE_CONTEXT

-/*-----------------------------------------------------------*/

-

-/*

- * Manual context switch called by the portYIELD() macro.

- */

- 	EVEN

-

-vPortYield:

-

-	/* The sr needs saving before it is modified. */

-	push.w	sr

-

-	/* Now the SR is stacked interrupts can be disabled. */

-	dint

-	nop

-

-	/* Save the context of the current task. */

-	portSAVE_CONTEXT

-

-	/* Select the next task to run. */

-	calla	#vTaskSwitchContext

-

-	/* Restore the context of the new task. */

-	portRESTORE_CONTEXT

-/*-----------------------------------------------------------*/

-

-

-/*

- * Start off the scheduler by initialising the RTOS tick timer, then restoring

- * the context of the first task.

- */

- 	EVEN

-

-xPortStartScheduler:

-

-	/* Setup the hardware to generate the tick.  Interrupts are disabled

-	when this function is called. */

-	calla	#vPortSetupTimerInterrupt

-

-	/* Restore the context of the first task that is going to run. */

-	portRESTORE_CONTEXT

-/*-----------------------------------------------------------*/

-

-	END

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+#include "msp430.h"
+#include "FreeRTOSConfig.h"
+#include "data_model.h"
+
+    IMPORT xTaskIncrementTick
+    IMPORT vTaskSwitchContext
+    IMPORT vPortSetupTimerInterrupt
+    IMPORT pxCurrentTCB
+    IMPORT usCriticalNesting
+
+    EXPORT vPortTickISR
+    EXPORT vPortYield
+    EXPORT xPortStartScheduler
+
+portSAVE_CONTEXT macro
+
+    /* Save the remaining registers. */
+    pushm_x #12, r15
+    mov.w   &usCriticalNesting, r14
+    push_x r14
+    mov_x   &pxCurrentTCB, r12
+    mov_x   sp, 0( r12 )
+    endm
+/*-----------------------------------------------------------*/
+
+portRESTORE_CONTEXT macro
+
+    mov_x   &pxCurrentTCB, r12
+    mov_x   @r12, sp
+    pop_x   r15
+    mov.w   r15, &usCriticalNesting
+    popm_x  #12, r15
+    nop
+    pop.w   sr
+    nop
+    reta
+    endm
+/*-----------------------------------------------------------*/
+
+
+/*
+ * The RTOS tick ISR.
+ *
+ * If the cooperative scheduler is in use this simply increments the tick
+ * count.
+ *
+ * If the preemptive scheduler is in use a context switch can also occur.
+ */
+
+    RSEG CODE
+    EVEN
+
+vPortTickISR:
+
+    /* The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs
+    to save it manually before it gets modified (interrupts get disabled).
+    Entering through this interrupt means the SR is already on the stack, but
+    this keeps the stack frames identical. */
+    push.w sr
+    portSAVE_CONTEXT
+
+    calla   #xTaskIncrementTick
+    cmp.w   #0x0, R12
+    jeq     SkipContextSwitch
+    calla   #vTaskSwitchContext
+SkipContextSwitch:
+    portRESTORE_CONTEXT
+/*-----------------------------------------------------------*/
+
+/*
+ * Manual context switch called by the portYIELD() macro.
+ */
+    EVEN
+
+vPortYield:
+
+    /* The sr needs saving before it is modified. */
+    push.w  sr
+
+    /* Now the SR is stacked interrupts can be disabled. */
+    dint
+    nop
+
+    /* Save the context of the current task. */
+    portSAVE_CONTEXT
+
+    /* Select the next task to run. */
+    calla   #vTaskSwitchContext
+
+    /* Restore the context of the new task. */
+    portRESTORE_CONTEXT
+/*-----------------------------------------------------------*/
+
+
+/*
+ * Start off the scheduler by initialising the RTOS tick timer, then restoring
+ * the context of the first task.
+ */
+    EVEN
+
+xPortStartScheduler:
+
+    /* Setup the hardware to generate the tick.  Interrupts are disabled
+    when this function is called. */
+    calla   #vPortSetupTimerInterrupt
+
+    /* Restore the context of the first task that is going to run. */
+    portRESTORE_CONTEXT
+/*-----------------------------------------------------------*/
+
+    END
diff --git a/portable/IAR/MSP430X/portmacro.h b/portable/IAR/MSP430X/portmacro.h
index aa05246..d7d6048 100644
--- a/portable/IAR/MSP430X/portmacro.h
+++ b/portable/IAR/MSP430X/portmacro.h
@@ -1,143 +1,142 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Hardware includes. */

-#include "msp430.h"

-

-/* Type definitions. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		int

-#define portBASE_TYPE	short

-

-/* The stack type changes depending on the data model. */

-#if( __DATA_MODEL__ == __DATA_MODEL_SMALL__ )

-	#define portSTACK_TYPE uint16_t

-	#define portPOINTER_SIZE_TYPE uint16_t

-#else

-	#define portSTACK_TYPE uint32_t

-#endif

-

-typedef portSTACK_TYPE StackType_t;

-typedef short BaseType_t;

-typedef unsigned short UBaseType_t;

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-

-/*-----------------------------------------------------------*/

-

-/* Interrupt control macros. */

-#define portDISABLE_INTERRUPTS()	_DINT(); _NOP()

-#define portENABLE_INTERRUPTS()		_EINT(); _NOP()

-/*-----------------------------------------------------------*/

-

-/* Critical section control macros. */

-#define portNO_CRITICAL_SECTION_NESTING		( ( uint16_t ) 0 )

-

-#define portENTER_CRITICAL()													\

-{																				\

-extern volatile uint16_t usCriticalNesting;										\

-																				\

-	portDISABLE_INTERRUPTS();													\

-																				\

-	/* Now interrupts are disabled usCriticalNesting can be accessed */			\

-	/* directly.  Increment ulCriticalNesting to keep a count of how many */	\

-	/* times portENTER_CRITICAL() has been called. */							\

-	usCriticalNesting++;														\

-}

-

-#define portEXIT_CRITICAL()														\

-{																				\

-extern volatile uint16_t usCriticalNesting;										\

-																				\

-	if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )					\

-	{																			\

-		/* Decrement the nesting count as we are leaving a critical section. */	\

-		usCriticalNesting--;													\

-																				\

-		/* If the nesting level has reached zero then interrupts should be */	\

-		/* re-enabled. */														\

-		if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )				\

-		{																		\

-			portENABLE_INTERRUPTS();											\

-		}																		\

-	}																			\

-}

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-

-/*

- * Manual context switch called by portYIELD or taskYIELD.

- */

-extern void vPortYield( void );

-#define portYIELD() vPortYield()

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portBYTE_ALIGNMENT			2

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portNOP()					__no_operation()

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-#define portYIELD_FROM_ISR( x ) do { if( x ) vPortYield(); } while( 0 )

-

-void vApplicationSetupTimerInterrupt( void );

-

-/* sizeof( int ) != sizeof( long ) so a full printf() library is required if

-run time stats information is to be displayed. */

-#define portLU_PRINTF_SPECIFIER_REQUIRED

-

-#endif /* PORTMACRO_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Hardware includes. */
+#include "msp430.h"
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       int
+#define portBASE_TYPE   short
+
+/* The stack type changes depending on the data model. */
+#if( __DATA_MODEL__ == __DATA_MODEL_SMALL__ )
+    #define portSTACK_TYPE uint16_t
+    #define portPOINTER_SIZE_TYPE uint16_t
+#else
+    #define portSTACK_TYPE uint32_t
+#endif
+
+typedef portSTACK_TYPE StackType_t;
+typedef short BaseType_t;
+typedef unsigned short UBaseType_t;
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+
+/*-----------------------------------------------------------*/
+
+/* Interrupt control macros. */
+#define portDISABLE_INTERRUPTS()    _DINT(); _NOP()
+#define portENABLE_INTERRUPTS()     _EINT(); _NOP()
+/*-----------------------------------------------------------*/
+
+/* Critical section control macros. */
+#define portNO_CRITICAL_SECTION_NESTING     ( ( uint16_t ) 0 )
+
+#define portENTER_CRITICAL()                                                    \
+{                                                                               \
+extern volatile uint16_t usCriticalNesting;                                     \
+                                                                                \
+    portDISABLE_INTERRUPTS();                                                   \
+                                                                                \
+    /* Now interrupts are disabled usCriticalNesting can be accessed */         \
+    /* directly.  Increment ulCriticalNesting to keep a count of how many */    \
+    /* times portENTER_CRITICAL() has been called. */                           \
+    usCriticalNesting++;                                                        \
+}
+
+#define portEXIT_CRITICAL()                                                     \
+{                                                                               \
+extern volatile uint16_t usCriticalNesting;                                     \
+                                                                                \
+    if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )                   \
+    {                                                                           \
+        /* Decrement the nesting count as we are leaving a critical section. */ \
+        usCriticalNesting--;                                                    \
+                                                                                \
+        /* If the nesting level has reached zero then interrupts should be */   \
+        /* re-enabled. */                                                       \
+        if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )              \
+        {                                                                       \
+            portENABLE_INTERRUPTS();                                            \
+        }                                                                       \
+    }                                                                           \
+}
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+
+/*
+ * Manual context switch called by portYIELD or taskYIELD.
+ */
+extern void vPortYield( void );
+#define portYIELD() vPortYield()
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portBYTE_ALIGNMENT          2
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portNOP()                   __no_operation()
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+#define portYIELD_FROM_ISR( x ) do { if( x ) vPortYield(); } while( 0 )
+
+void vApplicationSetupTimerInterrupt( void );
+
+/* sizeof( int ) != sizeof( long ) so a full printf() library is required if
+run time stats information is to be displayed. */
+#define portLU_PRINTF_SPECIFIER_REQUIRED
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/RISC-V/Documentation.url b/portable/IAR/RISC-V/Documentation.url
index c7819d5..5546f87 100644
--- a/portable/IAR/RISC-V/Documentation.url
+++ b/portable/IAR/RISC-V/Documentation.url
@@ -1,5 +1,5 @@
-[{000214A0-0000-0000-C000-000000000046}]

-Prop3=19,11

-[InternetShortcut]

-IDList=

-URL=https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html

+[{000214A0-0000-0000-C000-000000000046}]
+Prop3=19,11
+[InternetShortcut]
+IDList=
+URL=https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html
diff --git a/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h
index d5cc6e3..3261831 100644
--- a/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h
+++ b/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h
@@ -1,69 +1,69 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*

- * The FreeRTOS kernel's RISC-V port is split between the the code that is

- * common across all currently supported RISC-V chips (implementations of the

- * RISC-V ISA), and code that tailors the port to a specific RISC-V chip:

- *

- * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that

- *   is common to all currently supported RISC-V chips.  There is only one

- *   portASM.S file because the same file is built for all RISC-V target chips.

- *

- * + Header files called freertos_risc_v_chip_specific_extensions.h contain the

- *   code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V

- *   chip.  There are multiple freertos_risc_v_chip_specific_extensions.h files

- *   as there are multiple RISC-V chip implementations.

- *

- * !!!NOTE!!!

- * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h

- * HEADER FILE FOR THE CHIP IN USE.  This is done using the assembler's (not the

- * compiler's!) include path.  For example, if the chip in use includes a core

- * local interrupter (CLINT) and does not include any chip specific register

- * extensions then add the path below to the assembler's include path:

- * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions

- *

- */

-

-

-#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__

-#define __FREERTOS_RISC_V_EXTENSIONS_H__

-

-#define portasmHAS_SIFIVE_CLINT 1

-#define portasmHAS_MTIME 1

-#define portasmADDITIONAL_CONTEXT_SIZE 0 /* Must be even number on 32-bit cores. */

-

-portasmSAVE_ADDITIONAL_REGISTERS MACRO

-	/* No additional registers to save, so this macro does nothing. */

-	ENDM

-

-portasmRESTORE_ADDITIONAL_REGISTERS MACRO

-	/* No additional registers to restore, so this macro does nothing. */

-	ENDM

-

-#endif /* __FREERTOS_RISC_V_EXTENSIONS_H__ */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*
+ * The FreeRTOS kernel's RISC-V port is split between the the code that is
+ * common across all currently supported RISC-V chips (implementations of the
+ * RISC-V ISA), and code that tailors the port to a specific RISC-V chip:
+ *
+ * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that
+ *   is common to all currently supported RISC-V chips.  There is only one
+ *   portASM.S file because the same file is built for all RISC-V target chips.
+ *
+ * + Header files called freertos_risc_v_chip_specific_extensions.h contain the
+ *   code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V
+ *   chip.  There are multiple freertos_risc_v_chip_specific_extensions.h files
+ *   as there are multiple RISC-V chip implementations.
+ *
+ * !!!NOTE!!!
+ * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h
+ * HEADER FILE FOR THE CHIP IN USE.  This is done using the assembler's (not the
+ * compiler's!) include path.  For example, if the chip in use includes a core
+ * local interrupter (CLINT) and does not include any chip specific register
+ * extensions then add the path below to the assembler's include path:
+ * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions
+ *
+ */
+
+
+#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__
+#define __FREERTOS_RISC_V_EXTENSIONS_H__
+
+#define portasmHAS_SIFIVE_CLINT 1
+#define portasmHAS_MTIME 1
+#define portasmADDITIONAL_CONTEXT_SIZE 0 /* Must be even number on 32-bit cores. */
+
+portasmSAVE_ADDITIONAL_REGISTERS MACRO
+    /* No additional registers to save, so this macro does nothing. */
+    ENDM
+
+portasmRESTORE_ADDITIONAL_REGISTERS MACRO
+    /* No additional registers to restore, so this macro does nothing. */
+    ENDM
+
+#endif /* __FREERTOS_RISC_V_EXTENSIONS_H__ */
diff --git a/portable/IAR/RISC-V/chip_specific_extensions/readme.txt b/portable/IAR/RISC-V/chip_specific_extensions/readme.txt
index 69d98d9..b24c0b9 100644
--- a/portable/IAR/RISC-V/chip_specific_extensions/readme.txt
+++ b/portable/IAR/RISC-V/chip_specific_extensions/readme.txt
@@ -1,23 +1,23 @@
-/*

- * The FreeRTOS kernel's RISC-V port is split between the the code that is

- * common across all currently supported RISC-V chips (implementations of the

- * RISC-V ISA), and code that tailors the port to a specific RISC-V chip:

- *

- * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that

- *   is common to all currently supported RISC-V chips.  There is only one

- *   portASM.S file because the same file is built for all RISC-V target chips.

- *

- * + Header files called freertos_risc_v_chip_specific_extensions.h contain the

- *   code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V

- *   chip.  There are multiple freertos_risc_v_chip_specific_extensions.h files

- *   as there are multiple RISC-V chip implementations.

- *

- * !!!NOTE!!!

- * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h

- * HEADER FILE FOR THE CHIP IN USE.  This is done using the assembler's (not the

- * compiler's!) include path.  For example, if the chip in use includes a core

- * local interrupter (CLINT) and does not include any chip specific register

- * extensions then add the path below to the assembler's include path:

- * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions

- *

- */

+/*
+ * The FreeRTOS kernel's RISC-V port is split between the the code that is
+ * common across all currently supported RISC-V chips (implementations of the
+ * RISC-V ISA), and code that tailors the port to a specific RISC-V chip:
+ *
+ * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that
+ *   is common to all currently supported RISC-V chips.  There is only one
+ *   portASM.S file because the same file is built for all RISC-V target chips.
+ *
+ * + Header files called freertos_risc_v_chip_specific_extensions.h contain the
+ *   code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V
+ *   chip.  There are multiple freertos_risc_v_chip_specific_extensions.h files
+ *   as there are multiple RISC-V chip implementations.
+ *
+ * !!!NOTE!!!
+ * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h
+ * HEADER FILE FOR THE CHIP IN USE.  This is done using the assembler's (not the
+ * compiler's!) include path.  For example, if the chip in use includes a core
+ * local interrupter (CLINT) and does not include any chip specific register
+ * extensions then add the path below to the assembler's include path:
+ * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions
+ *
+ */
diff --git a/portable/IAR/RISC-V/port.c b/portable/IAR/RISC-V/port.c
index 1e8819d..984b833 100644
--- a/portable/IAR/RISC-V/port.c
+++ b/portable/IAR/RISC-V/port.c
@@ -1,241 +1,241 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

-* Implementation of functions defined in portable.h for the RISC-V port.

-*----------------------------------------------------------*/

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-#include "portmacro.h"

-

-/* Standard includes. */

-#include "string.h"

-

-#ifdef configCLINT_BASE_ADDRESS

-    #warning The configCLINT_BASE_ADDRESS constant has been deprecated.  configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS are currently being derived from the (possibly 0) configCLINT_BASE_ADDRESS setting.  Please update to define configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS dirctly in place of configCLINT_BASE_ADDRESS.  See https: /*www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html */

-#endif

-

-#ifndef configMTIME_BASE_ADDRESS

-    #warning configMTIME_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  If the target chip includes a memory-mapped mtime register then set configMTIME_BASE_ADDRESS to the mapped address.  Otherwise set configMTIME_BASE_ADDRESS to 0.  See https: /*www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html */

-#endif

-

-#ifndef configMTIMECMP_BASE_ADDRESS

-    #warning configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  If the target chip includes a memory-mapped mtimecmp register then set configMTIMECMP_BASE_ADDRESS to the mapped address.  Otherwise set configMTIMECMP_BASE_ADDRESS to 0.  See https: /*www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html */

-#endif

-

-/* Let the user override the pre-loading of the initial LR with the address of

- * prvTaskExitError() in case it messes up unwinding of the stack in the

- * debugger. */

-#ifdef configTASK_RETURN_ADDRESS

-    #define portTASK_RETURN_ADDRESS    configTASK_RETURN_ADDRESS

-#else

-    #define portTASK_RETURN_ADDRESS    prvTaskExitError

-#endif

-

-/* The stack used by interrupt service routines.  Set configISR_STACK_SIZE_WORDS

- * to use a statically allocated array as the interrupt stack.  Alternative leave

- * configISR_STACK_SIZE_WORDS undefined and update the linker script so that a

- * linker variable names __freertos_irq_stack_top has the same value as the top

- * of the stack used by main.  Using the linker script method will repurpose the

- * stack that was used by main before the scheduler was started for use as the

- * interrupt stack after the scheduler has started. */

-#ifdef configISR_STACK_SIZE_WORDS

-static __attribute__( ( aligned( 16 ) ) ) StackType_t xISRStack[ configISR_STACK_SIZE_WORDS ] = { 0 };

-const StackType_t xISRStackTop = ( StackType_t ) &( xISRStack[ configISR_STACK_SIZE_WORDS & ~portBYTE_ALIGNMENT_MASK ] );

-

-/* Don't use 0xa5 as the stack fill bytes as that is used by the kernerl for

- * the task stacks, and so will legitimately appear in many positions within

- * the ISR stack. */

-    #define portISR_STACK_FILL_BYTE    0xee

-#else

-    extern const uint32_t __freertos_irq_stack_top[];

-    const StackType_t xISRStackTop = ( StackType_t ) __freertos_irq_stack_top;

-#endif

-

-/**

- * @brief Used to catch tasks that attempt to return from their implementing

- * function.

- */

-static void prvTaskExitError( void );

-

-/*

- * Setup the timer to generate the tick interrupts.  The implementation in this

- * file is weak to allow application writers to change the timer used to

- * generate the tick interrupt.

- */

-void vPortSetupTimerInterrupt( void ) __attribute__( ( weak ) );

-

-/*-----------------------------------------------------------*/

-

-/* Used to program the machine timer compare register. */

-uint64_t ullNextTime = 0ULL;

-const uint64_t * pullNextTime = &ullNextTime;

-const size_t uxTimerIncrementsForOneTick = ( size_t ) ( ( configCPU_CLOCK_HZ ) / ( configTICK_RATE_HZ ) ); /* Assumes increment won't go over 32-bits. */

-uint32_t const ullMachineTimerCompareRegisterBase = configMTIMECMP_BASE_ADDRESS;

-volatile uint64_t * pullMachineTimerCompareRegister = NULL;

-

-/* Holds the critical nesting value - deliberately non-zero at start up to

- * ensure interrupts are not accidentally enabled before the scheduler starts. */

-size_t xCriticalNesting = ( size_t ) 0xaaaaaaaa;

-size_t * pxCriticalNesting = &xCriticalNesting;

-

-/* Used to catch tasks that attempt to return from their implementing function. */

-size_t xTaskReturnAddress = ( size_t ) portTASK_RETURN_ADDRESS;

-

-/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task

- * stack checking.  A problem in the ISR stack will trigger an assert, not call

- * the stack overflow hook function (because the stack overflow hook is specific

- * to a task stack, not the ISR stack). */

-#if defined( configISR_STACK_SIZE_WORDS ) && ( configCHECK_FOR_STACK_OVERFLOW > 2 )

-    #warning This path not tested, or even compiled yet.

-

-    static const uint8_t ucExpectedStackBytes[] =

-    {

-        portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \

-        portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \

-        portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \

-        portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \

-        portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE

-    }; \

-

-    #define portCHECK_ISR_STACK()    configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) )

-#else  /* if defined( configISR_STACK_SIZE_WORDS ) && ( configCHECK_FOR_STACK_OVERFLOW > 2 ) */

-    /* Define the function away. */

-    #define portCHECK_ISR_STACK()

-#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */

-

-/*-----------------------------------------------------------*/

-

-static void prvTaskExitError( void )

-{

-    volatile uint32_t ulDummy = 0UL;

-

-    /* A function that implements a task must not exit or attempt to return to

-     * its caller as there is nothing to return to. If a task wants to exit it

-     * should instead call vTaskDelete( NULL ). Artificially force an assert()

-     * to be triggered if configASSERT() is defined, then stop here so

-     * application writers can catch the error. */

-    configASSERT( xCriticalNesting == ~0UL );

-    portDISABLE_INTERRUPTS();

-

-    while( ulDummy == 0 )

-    {

-        /* This file calls prvTaskExitError() after the scheduler has been

-         * started to remove a compiler warning about the function being

-         * defined but never called.  ulDummy is used purely to quieten other

-         * warnings about code appearing after this function is called - making

-         * ulDummy volatile makes the compiler think the function could return

-         * and therefore not output an 'unreachable code' warning for code that

-         * appears after it. */

-    }

-}

-/*-----------------------------------------------------------*/

-

-#if ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 )

-

-    void vPortSetupTimerInterrupt( void )

-    {

-        uint32_t ulCurrentTimeHigh, ulCurrentTimeLow;

-        volatile uint32_t * const pulTimeHigh = ( uint32_t * ) ( ( configMTIME_BASE_ADDRESS ) + 4UL ); /* 8-byte type so high 32-bit word is 4 bytes up. */

-        volatile uint32_t * const pulTimeLow = ( uint32_t * ) ( configMTIME_BASE_ADDRESS );

-        volatile uint32_t ulHartId;

-

-        __asm volatile ( "csrr %0, 0xf14" : "=r" ( ulHartId ) ); /* 0xf14 is hartid. */

-

-        pullMachineTimerCompareRegister = ( volatile uint64_t * ) ( ullMachineTimerCompareRegisterBase + ( ulHartId * sizeof( uint64_t ) ) );

-

-        do

-        {

-            ulCurrentTimeHigh = *pulTimeHigh;

-            ulCurrentTimeLow = *pulTimeLow;

-        } while( ulCurrentTimeHigh != *pulTimeHigh );

-

-        ullNextTime = ( uint64_t ) ulCurrentTimeHigh;

-        ullNextTime <<= 32ULL; /* High 4-byte word is 32-bits up. */

-        ullNextTime |= ( uint64_t ) ulCurrentTimeLow;

-        ullNextTime += ( uint64_t ) uxTimerIncrementsForOneTick;

-        *pullMachineTimerCompareRegister = ullNextTime;

-

-        /* Prepare the time to use after the next tick interrupt. */

-        ullNextTime += ( uint64_t ) uxTimerIncrementsForOneTick;

-    }

-

-#endif /* ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIME_BASE_ADDRESS != 0 ) */

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-    extern void xPortStartFirstTask( void );

-

-    #if ( configASSERT_DEFINED == 1 )

-    {

-        /* Check alignment of the interrupt stack - which is the same as the

-         * stack that was being used by main() prior to the scheduler being

-         * started. */

-        configASSERT( ( xISRStackTop & portBYTE_ALIGNMENT_MASK ) == 0 );

-

-        #ifdef configISR_STACK_SIZE_WORDS

-        {

-            memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) );

-        }

-        #endif /* configISR_STACK_SIZE_WORDS */

-    }

-    #endif /* configASSERT_DEFINED */

-

-    /* If there is a CLINT then it is ok to use the default implementation

-     * in this file, otherwise vPortSetupTimerInterrupt() must be implemented to

-     * configure whichever clock is to be used to generate the tick interrupt. */

-    vPortSetupTimerInterrupt();

-

-    #if ( ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) )

-    {

-        /* Enable mtime and external interrupts.  1<<7 for timer interrupt,

-         * 1<<11 for external interrupt.  _RB_ What happens here when mtime is

-         * not present as with pulpino? */

-        __asm volatile ( "csrs 0x304, %0" ::"r" ( 0x880 ) ); /* 0x304 is mie. */

-    }

-    #endif /* ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) */

-

-    xPortStartFirstTask();

-

-    /* Should not get here as after calling xPortStartFirstTask() only tasks

-     * should be executing. */

-    return pdFAIL;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-    /* Not implemented. */

-    for( ; ; )

-    {

-    }

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+* Implementation of functions defined in portable.h for the RISC-V port.
+*----------------------------------------------------------*/
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "portmacro.h"
+
+/* Standard includes. */
+#include "string.h"
+
+#ifdef configCLINT_BASE_ADDRESS
+    #warning The configCLINT_BASE_ADDRESS constant has been deprecated.  configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS are currently being derived from the (possibly 0) configCLINT_BASE_ADDRESS setting.  Please update to define configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS dirctly in place of configCLINT_BASE_ADDRESS.  See https: /*www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html */
+#endif
+
+#ifndef configMTIME_BASE_ADDRESS
+    #warning configMTIME_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  If the target chip includes a memory-mapped mtime register then set configMTIME_BASE_ADDRESS to the mapped address.  Otherwise set configMTIME_BASE_ADDRESS to 0.  See https: /*www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html */
+#endif
+
+#ifndef configMTIMECMP_BASE_ADDRESS
+    #warning configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  If the target chip includes a memory-mapped mtimecmp register then set configMTIMECMP_BASE_ADDRESS to the mapped address.  Otherwise set configMTIMECMP_BASE_ADDRESS to 0.  See https: /*www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html */
+#endif
+
+/* Let the user override the pre-loading of the initial LR with the address of
+ * prvTaskExitError() in case it messes up unwinding of the stack in the
+ * debugger. */
+#ifdef configTASK_RETURN_ADDRESS
+    #define portTASK_RETURN_ADDRESS    configTASK_RETURN_ADDRESS
+#else
+    #define portTASK_RETURN_ADDRESS    prvTaskExitError
+#endif
+
+/* The stack used by interrupt service routines.  Set configISR_STACK_SIZE_WORDS
+ * to use a statically allocated array as the interrupt stack.  Alternative leave
+ * configISR_STACK_SIZE_WORDS undefined and update the linker script so that a
+ * linker variable names __freertos_irq_stack_top has the same value as the top
+ * of the stack used by main.  Using the linker script method will repurpose the
+ * stack that was used by main before the scheduler was started for use as the
+ * interrupt stack after the scheduler has started. */
+#ifdef configISR_STACK_SIZE_WORDS
+static __attribute__( ( aligned( 16 ) ) ) StackType_t xISRStack[ configISR_STACK_SIZE_WORDS ] = { 0 };
+const StackType_t xISRStackTop = ( StackType_t ) &( xISRStack[ configISR_STACK_SIZE_WORDS & ~portBYTE_ALIGNMENT_MASK ] );
+
+/* Don't use 0xa5 as the stack fill bytes as that is used by the kernerl for
+ * the task stacks, and so will legitimately appear in many positions within
+ * the ISR stack. */
+    #define portISR_STACK_FILL_BYTE    0xee
+#else
+    extern const uint32_t __freertos_irq_stack_top[];
+    const StackType_t xISRStackTop = ( StackType_t ) __freertos_irq_stack_top;
+#endif
+
+/**
+ * @brief Used to catch tasks that attempt to return from their implementing
+ * function.
+ */
+static void prvTaskExitError( void );
+
+/*
+ * Setup the timer to generate the tick interrupts.  The implementation in this
+ * file is weak to allow application writers to change the timer used to
+ * generate the tick interrupt.
+ */
+void vPortSetupTimerInterrupt( void ) __attribute__( ( weak ) );
+
+/*-----------------------------------------------------------*/
+
+/* Used to program the machine timer compare register. */
+uint64_t ullNextTime = 0ULL;
+const uint64_t * pullNextTime = &ullNextTime;
+const size_t uxTimerIncrementsForOneTick = ( size_t ) ( ( configCPU_CLOCK_HZ ) / ( configTICK_RATE_HZ ) ); /* Assumes increment won't go over 32-bits. */
+uint32_t const ullMachineTimerCompareRegisterBase = configMTIMECMP_BASE_ADDRESS;
+volatile uint64_t * pullMachineTimerCompareRegister = NULL;
+
+/* Holds the critical nesting value - deliberately non-zero at start up to
+ * ensure interrupts are not accidentally enabled before the scheduler starts. */
+size_t xCriticalNesting = ( size_t ) 0xaaaaaaaa;
+size_t * pxCriticalNesting = &xCriticalNesting;
+
+/* Used to catch tasks that attempt to return from their implementing function. */
+size_t xTaskReturnAddress = ( size_t ) portTASK_RETURN_ADDRESS;
+
+/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task
+ * stack checking.  A problem in the ISR stack will trigger an assert, not call
+ * the stack overflow hook function (because the stack overflow hook is specific
+ * to a task stack, not the ISR stack). */
+#if defined( configISR_STACK_SIZE_WORDS ) && ( configCHECK_FOR_STACK_OVERFLOW > 2 )
+    #warning This path not tested, or even compiled yet.
+
+    static const uint8_t ucExpectedStackBytes[] =
+    {
+        portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \
+        portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \
+        portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \
+        portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \
+        portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE
+    }; \
+
+    #define portCHECK_ISR_STACK()    configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) )
+#else  /* if defined( configISR_STACK_SIZE_WORDS ) && ( configCHECK_FOR_STACK_OVERFLOW > 2 ) */
+    /* Define the function away. */
+    #define portCHECK_ISR_STACK()
+#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */
+
+/*-----------------------------------------------------------*/
+
+static void prvTaskExitError( void )
+{
+    volatile uint32_t ulDummy = 0UL;
+
+    /* A function that implements a task must not exit or attempt to return to
+     * its caller as there is nothing to return to. If a task wants to exit it
+     * should instead call vTaskDelete( NULL ). Artificially force an assert()
+     * to be triggered if configASSERT() is defined, then stop here so
+     * application writers can catch the error. */
+    configASSERT( xCriticalNesting == ~0UL );
+    portDISABLE_INTERRUPTS();
+
+    while( ulDummy == 0 )
+    {
+        /* This file calls prvTaskExitError() after the scheduler has been
+         * started to remove a compiler warning about the function being
+         * defined but never called.  ulDummy is used purely to quieten other
+         * warnings about code appearing after this function is called - making
+         * ulDummy volatile makes the compiler think the function could return
+         * and therefore not output an 'unreachable code' warning for code that
+         * appears after it. */
+    }
+}
+/*-----------------------------------------------------------*/
+
+#if ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 )
+
+    void vPortSetupTimerInterrupt( void )
+    {
+        uint32_t ulCurrentTimeHigh, ulCurrentTimeLow;
+        volatile uint32_t * const pulTimeHigh = ( uint32_t * ) ( ( configMTIME_BASE_ADDRESS ) + 4UL ); /* 8-byte type so high 32-bit word is 4 bytes up. */
+        volatile uint32_t * const pulTimeLow = ( uint32_t * ) ( configMTIME_BASE_ADDRESS );
+        volatile uint32_t ulHartId;
+
+        __asm volatile ( "csrr %0, 0xf14" : "=r" ( ulHartId ) ); /* 0xf14 is hartid. */
+
+        pullMachineTimerCompareRegister = ( volatile uint64_t * ) ( ullMachineTimerCompareRegisterBase + ( ulHartId * sizeof( uint64_t ) ) );
+
+        do
+        {
+            ulCurrentTimeHigh = *pulTimeHigh;
+            ulCurrentTimeLow = *pulTimeLow;
+        } while( ulCurrentTimeHigh != *pulTimeHigh );
+
+        ullNextTime = ( uint64_t ) ulCurrentTimeHigh;
+        ullNextTime <<= 32ULL; /* High 4-byte word is 32-bits up. */
+        ullNextTime |= ( uint64_t ) ulCurrentTimeLow;
+        ullNextTime += ( uint64_t ) uxTimerIncrementsForOneTick;
+        *pullMachineTimerCompareRegister = ullNextTime;
+
+        /* Prepare the time to use after the next tick interrupt. */
+        ullNextTime += ( uint64_t ) uxTimerIncrementsForOneTick;
+    }
+
+#endif /* ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIME_BASE_ADDRESS != 0 ) */
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+    extern void xPortStartFirstTask( void );
+
+    #if ( configASSERT_DEFINED == 1 )
+    {
+        /* Check alignment of the interrupt stack - which is the same as the
+         * stack that was being used by main() prior to the scheduler being
+         * started. */
+        configASSERT( ( xISRStackTop & portBYTE_ALIGNMENT_MASK ) == 0 );
+
+        #ifdef configISR_STACK_SIZE_WORDS
+        {
+            memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) );
+        }
+        #endif /* configISR_STACK_SIZE_WORDS */
+    }
+    #endif /* configASSERT_DEFINED */
+
+    /* If there is a CLINT then it is ok to use the default implementation
+     * in this file, otherwise vPortSetupTimerInterrupt() must be implemented to
+     * configure whichever clock is to be used to generate the tick interrupt. */
+    vPortSetupTimerInterrupt();
+
+    #if ( ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) )
+    {
+        /* Enable mtime and external interrupts.  1<<7 for timer interrupt,
+         * 1<<11 for external interrupt.  _RB_ What happens here when mtime is
+         * not present as with pulpino? */
+        __asm volatile ( "csrs 0x304, %0" ::"r" ( 0x880 ) ); /* 0x304 is mie. */
+    }
+    #endif /* ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) */
+
+    xPortStartFirstTask();
+
+    /* Should not get here as after calling xPortStartFirstTask() only tasks
+     * should be executing. */
+    return pdFAIL;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented. */
+    for( ; ; )
+    {
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/RISC-V/portASM.s b/portable/IAR/RISC-V/portASM.s
index 1a7d1c4..005b0eb 100644
--- a/portable/IAR/RISC-V/portASM.s
+++ b/portable/IAR/RISC-V/portASM.s
@@ -1,399 +1,399 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*

- * The FreeRTOS kernel's RISC-V port is split between the the code that is

- * common across all currently supported RISC-V chips (implementations of the

- * RISC-V ISA), and code which tailors the port to a specific RISC-V chip:

- *

- * + The code that is common to all RISC-V chips is implemented in

- *   FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S.  There is only one

- *   portASM.S file because the same file is used no matter which RISC-V chip is

- *   in use.

- *

- * + The code that tailors the kernel's RISC-V port to a specific RISC-V

- *   chip is implemented in freertos_risc_v_chip_specific_extensions.h.  There

- *   is one freertos_risc_v_chip_specific_extensions.h that can be used with any

- *   RISC-V chip that both includes a standard CLINT and does not add to the

- *   base set of RISC-V registers.  There are additional

- *   freertos_risc_v_chip_specific_extensions.h files for RISC-V implementations

- *   that do not include a standard CLINT or do add to the base set of RISC-V

- *   registers.

- *

- * CARE MUST BE TAKEN TO INCLDUE THE CORRECT

- * freertos_risc_v_chip_specific_extensions.h HEADER FILE FOR THE CHIP

- * IN USE.  To include the correct freertos_risc_v_chip_specific_extensions.h

- * header file ensure the path to the correct header file is in the assembler's

- * include path.

- *

- * This freertos_risc_v_chip_specific_extensions.h is for use on RISC-V chips

- * that include a standard CLINT and do not add to the base set of RISC-V

- * registers.

- *

- */

-

-#include "portContext.h"

-

-/* Check the freertos_risc_v_chip_specific_extensions.h and/or command line

-definitions. */

-#if defined( portasmHAS_CLINT ) && defined( portasmHAS_MTIME )

-    #error The portasmHAS_CLINT constant has been deprecated.  Please replace it with portasmHAS_MTIME.  portasmHAS_CLINT and portasmHAS_MTIME cannot both be defined at once.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html

-#endif

-

-#ifdef portasmHAS_CLINT

-    #warning The portasmHAS_CLINT constant has been deprecated.  Please replace it with portasmHAS_MTIME and portasmHAS_SIFIVE_CLINT.  For now portasmHAS_MTIME and portasmHAS_SIFIVE_CLINT are derived from portasmHAS_CLINT.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html

-    #define portasmHAS_MTIME portasmHAS_CLINT

-    #define portasmHAS_SIFIVE_CLINT portasmHAS_CLINT

-#endif

-

-#ifndef portasmHAS_MTIME

-    #error freertos_risc_v_chip_specific_extensions.h must define portasmHAS_MTIME to either 1 (MTIME clock present) or 0 (MTIME clock not present).  See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html

-#endif

-

-#ifndef portasmHAS_SIFIVE_CLINT

-    #define portasmHAS_SIFIVE_CLINT 0

-#endif

-

-/* CSR definitions. */

-#define CSR_MSTATUS 		0x300

-#define CSR_MTVEC			0x305

-#define CSR_MEPC            0x341

-#define CSR_MCAUSE          0x342

-

-	PUBLIC xPortStartFirstTask

-	PUBLIC pxPortInitialiseStack

-	PUBLIC freertos_risc_v_trap_handler

-	PUBLIC freertos_risc_v_exception_handler

-	PUBLIC freertos_risc_v_interrupt_handler

-	PUBLIC freertos_risc_v_mtimer_interrupt_handler

-

-	EXTERN vTaskSwitchContext

-	EXTERN xTaskIncrementTick

-	EXTERN pullMachineTimerCompareRegister

-	EXTERN pullNextTime

-	EXTERN uxTimerIncrementsForOneTick /* size_t type so 32-bit on 32-bit core and 64-bits on 64-bit core. */

-	EXTERN xTaskReturnAddress

-

-	PUBWEAK freertos_risc_v_application_exception_handler

-	PUBWEAK freertos_risc_v_application_interrupt_handler

-/*-----------------------------------------------------------*/

-

-	SECTION `.text`:CODE:NOROOT(2)

-	CODE

-

-portUPDATE_MTIMER_COMPARE_REGISTER MACRO

-    load_x a0, pullMachineTimerCompareRegister  /* Load address of compare register into a0. */

-    load_x a1, pullNextTime                     /* Load the address of ullNextTime into a1. */

-

-    #if( __riscv_xlen == 32 )

-

-        /* Update the 64-bit mtimer compare match value in two 32-bit writes. */

-        li a4, -1

-        lw a2, 0(a1)                /* Load the low word of ullNextTime into a2. */

-        lw a3, 4(a1)                /* Load the high word of ullNextTime into a3. */

-        sw a4, 0(a0)                /* Low word no smaller than old value to start with - will be overwritten below. */

-        sw a3, 4(a0)                /* Store high word of ullNextTime into compare register.  No smaller than new value. */

-        sw a2, 0(a0)                /* Store low word of ullNextTime into compare register. */

-        lw t0, uxTimerIncrementsForOneTick  /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */

-        add a4, t0, a2              /* Add the low word of ullNextTime to the timer increments for one tick (assumes timer increment for one tick fits in 32-bits). */

-        sltu t1, a4, a2             /* See if the sum of low words overflowed (what about the zero case?). */

-        add t2, a3, t1              /* Add overflow to high word of ullNextTime. */

-        sw a4, 0(a1)                /* Store new low word of ullNextTime. */

-        sw t2, 4(a1)                /* Store new high word of ullNextTime. */

-

-    #endif /* __riscv_xlen == 32 */

-

-    #if( __riscv_xlen == 64 )

-

-        /* Update the 64-bit mtimer compare match value. */

-        ld t2, 0(a1)                /* Load ullNextTime into t2. */

-        sd t2, 0(a0)                /* Store ullNextTime into compare register. */

-        ld t0, uxTimerIncrementsForOneTick  /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */

-        add t4, t0, t2              /* Add ullNextTime to the timer increments for one tick. */

-        sd t4, 0(a1)                /* Store ullNextTime. */

-

-    #endif /* __riscv_xlen == 64 */

-	ENDM

-/*-----------------------------------------------------------*/

-

-/*

- * Unlike other ports pxPortInitialiseStack() is written in assembly code as it

- * needs access to the portasmADDITIONAL_CONTEXT_SIZE constant.  The prototype

- * for the function is as per the other ports:

- * StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters );

- *

- * As per the standard RISC-V ABI pxTopcOfStack is passed in in a0, pxCode in

- * a1, and pvParameters in a2.  The new top of stack is passed out in a0.

- *

- * RISC-V maps registers to ABI names as follows (X1 to X31 integer registers

- * for the 'I' profile, X1 to X15 for the 'E' profile, currently I assumed).

- *

- * Register      ABI Name    Description                       Saver

- * x0            zero        Hard-wired zero                   -

- * x1            ra          Return address                    Caller

- * x2            sp          Stack pointer                     Callee

- * x3            gp          Global pointer                    -

- * x4            tp          Thread pointer                    -

- * x5-7          t0-2        Temporaries                       Caller

- * x8            s0/fp       Saved register/Frame pointer      Callee

- * x9            s1          Saved register                    Callee

- * x10-11        a0-1        Function Arguments/return values  Caller

- * x12-17        a2-7        Function arguments                Caller

- * x18-27        s2-11       Saved registers                   Callee

- * x28-31        t3-6        Temporaries                       Caller

- *

- * The RISC-V context is saved t FreeRTOS tasks in the following stack frame,

- * where the global and thread pointers are currently assumed to be constant so

- * are not saved:

- *

- * mstatus

- * xCriticalNesting

- * x31

- * x30

- * x29

- * x28

- * x27

- * x26

- * x25

- * x24

- * x23

- * x22

- * x21

- * x20

- * x19

- * x18

- * x17

- * x16

- * x15

- * x14

- * x13

- * x12

- * x11

- * pvParameters

- * x9

- * x8

- * x7

- * x6

- * x5

- * portTASK_RETURN_ADDRESS

- * [chip specific registers go here]

- * pxCode

- */

-pxPortInitialiseStack:

-    csrr t0, CSR_MSTATUS                /* Obtain current mstatus value. */

-    andi t0, t0, ~0x8                   /* Ensure interrupts are disabled when the stack is restored within an ISR.  Required when a task is created after the schedulre has been started, otherwise interrupts would be disabled anyway. */

-    addi t1, x0, 0x188                  /* Generate the value 0x1880, which are the MPIE and MPP bits to set in mstatus. */

-    slli t1, t1, 4

-    or t0, t0, t1                       /* Set MPIE and MPP bits in mstatus value. */

-

-    addi a0, a0, -portWORD_SIZE

-    store_x t0, 0(a0)                   /* mstatus onto the stack. */

-    addi a0, a0, -portWORD_SIZE         /* Space for critical nesting count. */

-    store_x x0, 0(a0)                   /* Critical nesting count starts at 0 for every task. */

-#ifdef __riscv_32e

-    addi a0, a0, -(6 * portWORD_SIZE)   /* Space for registers x10-15. */

-#else

-    addi a0, a0, -(22 * portWORD_SIZE)  /* Space for registers x10-x31. */

-#endif

-    store_x a2, 0(a0)                   /* Task parameters (pvParameters parameter) goes into register X10/a0 on the stack. */

-    addi a0, a0, -(6 * portWORD_SIZE)   /* Space for registers x5-x9 + taskReturnAddress. */

-    load_x t0, xTaskReturnAddress

-    store_x t0, 0(a0)                   /* Return address onto the stack. */

-    addi t0, x0, portasmADDITIONAL_CONTEXT_SIZE /* The number of chip specific additional registers. */

-chip_specific_stack_frame:              /* First add any chip specific registers to the stack frame being created. */

-    beq t0, x0, no_more_regs			/* No more chip specific registers to save. */

-    addi a0, a0, -portWORD_SIZE         /* Make space for chip specific register. */

-    store_x x0, 0(a0)                   /* Give the chip specific register an initial value of zero. */

-    addi t0, t0, -1                     /* Decrement the count of chip specific registers remaining. */

-    j chip_specific_stack_frame         /* Until no more chip specific registers. */

-no_more_regs:

-    addi a0, a0, -portWORD_SIZE

-    store_x a1, 0(a0)                   /* mret value (pxCode parameter) onto the stack. */

-    ret

-/*-----------------------------------------------------------*/

-

-xPortStartFirstTask:

-    load_x  sp, pxCurrentTCB            /* Load pxCurrentTCB. */

-    load_x  sp, 0( sp )                 /* Read sp from first TCB member. */

-

-    load_x  x1, 0( sp ) /* Note for starting the scheduler the exception return address is used as the function return address. */

-

-    portasmRESTORE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */

-

-    load_x  x7, 4 * portWORD_SIZE( sp )     /* t2 */

-    load_x  x8, 5 * portWORD_SIZE( sp )     /* s0/fp */

-    load_x  x9, 6 * portWORD_SIZE( sp )     /* s1 */

-    load_x  x10, 7 * portWORD_SIZE( sp )    /* a0 */

-    load_x  x11, 8 * portWORD_SIZE( sp )    /* a1 */

-    load_x  x12, 9 * portWORD_SIZE( sp )    /* a2 */

-    load_x  x13, 10 * portWORD_SIZE( sp )   /* a3 */

-    load_x  x14, 11 * portWORD_SIZE( sp )   /* a4 */

-    load_x  x15, 12 * portWORD_SIZE( sp )   /* a5 */

-#ifndef __riscv_32e

-    load_x  x16, 13 * portWORD_SIZE( sp )   /* a6 */

-    load_x  x17, 14 * portWORD_SIZE( sp )   /* a7 */

-    load_x  x18, 15 * portWORD_SIZE( sp )   /* s2 */

-    load_x  x19, 16 * portWORD_SIZE( sp )   /* s3 */

-    load_x  x20, 17 * portWORD_SIZE( sp )   /* s4 */

-    load_x  x21, 18 * portWORD_SIZE( sp )   /* s5 */

-    load_x  x22, 19 * portWORD_SIZE( sp )   /* s6 */

-    load_x  x23, 20 * portWORD_SIZE( sp )   /* s7 */

-    load_x  x24, 21 * portWORD_SIZE( sp )   /* s8 */

-    load_x  x25, 22 * portWORD_SIZE( sp )   /* s9 */

-    load_x  x26, 23 * portWORD_SIZE( sp )   /* s10 */

-    load_x  x27, 24 * portWORD_SIZE( sp )   /* s11 */

-    load_x  x28, 25 * portWORD_SIZE( sp )   /* t3 */

-    load_x  x29, 26 * portWORD_SIZE( sp )   /* t4 */

-    load_x  x30, 27 * portWORD_SIZE( sp )   /* t5 */

-    load_x  x31, 28 * portWORD_SIZE( sp )   /* t6 */

-#endif

-

-    load_x  x5, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( sp )    /* Obtain xCriticalNesting value for this task from task's stack. */

-    load_x  x6, pxCriticalNesting           /* Load the address of xCriticalNesting into x6. */

-    store_x x5, 0( x6 )                     /* Restore the critical nesting value for this task. */

-

-    load_x  x5, portMSTATUS_OFFSET * portWORD_SIZE( sp )    /* Initial mstatus into x5 (t0). */

-    addi    x5, x5, 0x08                    /* Set MIE bit so the first task starts with interrupts enabled - required as returns with ret not eret. */

-    csrrw   x0, CSR_MSTATUS, x5             /* Interrupts enabled from here! */

-

-    load_x  x5, 2 * portWORD_SIZE( sp )     /* Initial x5 (t0) value. */

-    load_x  x6, 3 * portWORD_SIZE( sp )     /* Initial x6 (t1) value. */

-

-    addi    sp, sp, portCONTEXT_SIZE

-    ret

-/*-----------------------------------------------------------*/

-

-freertos_risc_v_application_exception_handler:

-    csrr t0, CSR_MCAUSE     /* For viewing in the debugger only. */

-    csrr t1, CSR_MEPC        /* For viewing in the debugger only */

-    csrr t2, CSR_MSTATUS     /* For viewing in the debugger only */

-    j $

-/*-----------------------------------------------------------*/

-

-freertos_risc_v_application_interrupt_handler:

-    csrr t0, CSR_MCAUSE     /* For viewing in the debugger only. */

-    csrr t1, CSR_MEPC        /* For viewing in the debugger only */

-    csrr t2, CSR_MSTATUS     /* For viewing in the debugger only */

-    j $

-/*-----------------------------------------------------------*/

-

-    SECTION `.text.freertos_risc_v_exception_handler`:CODE:NOROOT(2)

-    CODE

-

-freertos_risc_v_exception_handler:

-    portcontextSAVE_EXCEPTION_CONTEXT

-    /* a0 now contains mcause. */

-    li t0, 11                           /* 11 == environment call. */

-    bne a0, t0, other_exception         /* Not an M environment call, so some other exception. */

-    call vTaskSwitchContext

-    portcontextRESTORE_CONTEXT

-

-other_exception:

-    call freertos_risc_v_application_exception_handler

-    portcontextRESTORE_CONTEXT

-/*-----------------------------------------------------------*/

-

-    SECTION `.text.freertos_risc_v_interrupt_handler`:CODE:NOROOT(2)

-    CODE

-

-freertos_risc_v_interrupt_handler:

-    portcontextSAVE_INTERRUPT_CONTEXT

-    call freertos_risc_v_application_interrupt_handler

-    portcontextRESTORE_CONTEXT

-/*-----------------------------------------------------------*/

-

-    SECTION `.text.freertos_risc_v_mtimer_interrupt_handler`:CODE:NOROOT(2)

-    CODE

-

-freertos_risc_v_mtimer_interrupt_handler:

-    portcontextSAVE_INTERRUPT_CONTEXT

-    portUPDATE_MTIMER_COMPARE_REGISTER

-    call xTaskIncrementTick

-    beqz a0, exit_without_context_switch    /* Don't switch context if incrementing tick didn't unblock a task. */

-    call vTaskSwitchContext

-exit_without_context_switch:

-    portcontextRESTORE_CONTEXT

-/*-----------------------------------------------------------*/

-

-    SECTION `.text.freertos_risc_v_trap_handler`:CODE:NOROOT(8)

-    CODE

-	

-freertos_risc_v_trap_handler:

-    portcontextSAVE_CONTEXT_INTERNAL

-	

-    csrr a0, CSR_MCAUSE

-    csrr a1, CSR_MEPC

-

-    bge a0, x0, synchronous_exception

-

-asynchronous_interrupt:

-    store_x a1, 0( sp )                 /* Asynchronous interrupt so save unmodified exception return address. */

-    load_x sp, xISRStackTop             /* Switch to ISR stack. */

-    j handle_interrupt

-

-synchronous_exception:

-    addi a1, a1, 4                      /* Synchronous so update exception return address to the instruction after the instruction that generated the exeption. */

-    store_x a1, 0( sp )                 /* Save updated exception return address. */

-    load_x sp, xISRStackTop             /* Switch to ISR stack. */

-    j handle_exception

-

-handle_interrupt:

-#if( portasmHAS_MTIME != 0 )

-

-    test_if_mtimer:                     /* If there is a CLINT then the mtimer is used to generate the tick interrupt. */

-        addi t0, x0, 1

-        slli t0, t0, __riscv_xlen - 1   /* LSB is already set, shift into MSB.  Shift 31 on 32-bit or 63 on 64-bit cores. */

-        addi t1, t0, 7                  /* 0x8000[]0007 == machine timer interrupt. */

-        bne a0, t1, application_interrupt_handler

-

-        portUPDATE_MTIMER_COMPARE_REGISTER

-        call xTaskIncrementTick

-        beqz a0, processed_source       /* Don't switch context if incrementing tick didn't unblock a task. */

-        call vTaskSwitchContext

-        j processed_source

-

-#endif /* portasmHAS_MTIME */

-

-application_interrupt_handler:

-    call freertos_risc_v_application_interrupt_handler

-    j processed_source

-

-handle_exception:

-    /* a0 contains mcause. */

-    li t0, 11                                   /* 11 == environment call. */

-    bne a0, t0, application_exception_handler   /* Not an M environment call, so some other exception. */

-    call vTaskSwitchContext

-    j processed_source

-

-application_exception_handler:

-    call freertos_risc_v_application_exception_handler

-    j processed_source                  /* No other exceptions handled yet. */

-

-processed_source:

-    portcontextRESTORE_CONTEXT

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*
+ * The FreeRTOS kernel's RISC-V port is split between the the code that is
+ * common across all currently supported RISC-V chips (implementations of the
+ * RISC-V ISA), and code which tailors the port to a specific RISC-V chip:
+ *
+ * + The code that is common to all RISC-V chips is implemented in
+ *   FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S.  There is only one
+ *   portASM.S file because the same file is used no matter which RISC-V chip is
+ *   in use.
+ *
+ * + The code that tailors the kernel's RISC-V port to a specific RISC-V
+ *   chip is implemented in freertos_risc_v_chip_specific_extensions.h.  There
+ *   is one freertos_risc_v_chip_specific_extensions.h that can be used with any
+ *   RISC-V chip that both includes a standard CLINT and does not add to the
+ *   base set of RISC-V registers.  There are additional
+ *   freertos_risc_v_chip_specific_extensions.h files for RISC-V implementations
+ *   that do not include a standard CLINT or do add to the base set of RISC-V
+ *   registers.
+ *
+ * CARE MUST BE TAKEN TO INCLDUE THE CORRECT
+ * freertos_risc_v_chip_specific_extensions.h HEADER FILE FOR THE CHIP
+ * IN USE.  To include the correct freertos_risc_v_chip_specific_extensions.h
+ * header file ensure the path to the correct header file is in the assembler's
+ * include path.
+ *
+ * This freertos_risc_v_chip_specific_extensions.h is for use on RISC-V chips
+ * that include a standard CLINT and do not add to the base set of RISC-V
+ * registers.
+ *
+ */
+
+#include "portContext.h"
+
+/* Check the freertos_risc_v_chip_specific_extensions.h and/or command line
+definitions. */
+#if defined( portasmHAS_CLINT ) && defined( portasmHAS_MTIME )
+    #error The portasmHAS_CLINT constant has been deprecated.  Please replace it with portasmHAS_MTIME.  portasmHAS_CLINT and portasmHAS_MTIME cannot both be defined at once.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html
+#endif
+
+#ifdef portasmHAS_CLINT
+    #warning The portasmHAS_CLINT constant has been deprecated.  Please replace it with portasmHAS_MTIME and portasmHAS_SIFIVE_CLINT.  For now portasmHAS_MTIME and portasmHAS_SIFIVE_CLINT are derived from portasmHAS_CLINT.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html
+    #define portasmHAS_MTIME portasmHAS_CLINT
+    #define portasmHAS_SIFIVE_CLINT portasmHAS_CLINT
+#endif
+
+#ifndef portasmHAS_MTIME
+    #error freertos_risc_v_chip_specific_extensions.h must define portasmHAS_MTIME to either 1 (MTIME clock present) or 0 (MTIME clock not present).  See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html
+#endif
+
+#ifndef portasmHAS_SIFIVE_CLINT
+    #define portasmHAS_SIFIVE_CLINT 0
+#endif
+
+/* CSR definitions. */
+#define CSR_MSTATUS         0x300
+#define CSR_MTVEC           0x305
+#define CSR_MEPC            0x341
+#define CSR_MCAUSE          0x342
+
+    PUBLIC xPortStartFirstTask
+    PUBLIC pxPortInitialiseStack
+    PUBLIC freertos_risc_v_trap_handler
+    PUBLIC freertos_risc_v_exception_handler
+    PUBLIC freertos_risc_v_interrupt_handler
+    PUBLIC freertos_risc_v_mtimer_interrupt_handler
+
+    EXTERN vTaskSwitchContext
+    EXTERN xTaskIncrementTick
+    EXTERN pullMachineTimerCompareRegister
+    EXTERN pullNextTime
+    EXTERN uxTimerIncrementsForOneTick /* size_t type so 32-bit on 32-bit core and 64-bits on 64-bit core. */
+    EXTERN xTaskReturnAddress
+
+    PUBWEAK freertos_risc_v_application_exception_handler
+    PUBWEAK freertos_risc_v_application_interrupt_handler
+/*-----------------------------------------------------------*/
+
+    SECTION `.text`:CODE:NOROOT(2)
+    CODE
+
+portUPDATE_MTIMER_COMPARE_REGISTER MACRO
+    load_x a0, pullMachineTimerCompareRegister  /* Load address of compare register into a0. */
+    load_x a1, pullNextTime                     /* Load the address of ullNextTime into a1. */
+
+    #if( __riscv_xlen == 32 )
+
+        /* Update the 64-bit mtimer compare match value in two 32-bit writes. */
+        li a4, -1
+        lw a2, 0(a1)                /* Load the low word of ullNextTime into a2. */
+        lw a3, 4(a1)                /* Load the high word of ullNextTime into a3. */
+        sw a4, 0(a0)                /* Low word no smaller than old value to start with - will be overwritten below. */
+        sw a3, 4(a0)                /* Store high word of ullNextTime into compare register.  No smaller than new value. */
+        sw a2, 0(a0)                /* Store low word of ullNextTime into compare register. */
+        lw t0, uxTimerIncrementsForOneTick  /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */
+        add a4, t0, a2              /* Add the low word of ullNextTime to the timer increments for one tick (assumes timer increment for one tick fits in 32-bits). */
+        sltu t1, a4, a2             /* See if the sum of low words overflowed (what about the zero case?). */
+        add t2, a3, t1              /* Add overflow to high word of ullNextTime. */
+        sw a4, 0(a1)                /* Store new low word of ullNextTime. */
+        sw t2, 4(a1)                /* Store new high word of ullNextTime. */
+
+    #endif /* __riscv_xlen == 32 */
+
+    #if( __riscv_xlen == 64 )
+
+        /* Update the 64-bit mtimer compare match value. */
+        ld t2, 0(a1)                /* Load ullNextTime into t2. */
+        sd t2, 0(a0)                /* Store ullNextTime into compare register. */
+        ld t0, uxTimerIncrementsForOneTick  /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */
+        add t4, t0, t2              /* Add ullNextTime to the timer increments for one tick. */
+        sd t4, 0(a1)                /* Store ullNextTime. */
+
+    #endif /* __riscv_xlen == 64 */
+    ENDM
+/*-----------------------------------------------------------*/
+
+/*
+ * Unlike other ports pxPortInitialiseStack() is written in assembly code as it
+ * needs access to the portasmADDITIONAL_CONTEXT_SIZE constant.  The prototype
+ * for the function is as per the other ports:
+ * StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters );
+ *
+ * As per the standard RISC-V ABI pxTopcOfStack is passed in in a0, pxCode in
+ * a1, and pvParameters in a2.  The new top of stack is passed out in a0.
+ *
+ * RISC-V maps registers to ABI names as follows (X1 to X31 integer registers
+ * for the 'I' profile, X1 to X15 for the 'E' profile, currently I assumed).
+ *
+ * Register      ABI Name    Description                       Saver
+ * x0            zero        Hard-wired zero                   -
+ * x1            ra          Return address                    Caller
+ * x2            sp          Stack pointer                     Callee
+ * x3            gp          Global pointer                    -
+ * x4            tp          Thread pointer                    -
+ * x5-7          t0-2        Temporaries                       Caller
+ * x8            s0/fp       Saved register/Frame pointer      Callee
+ * x9            s1          Saved register                    Callee
+ * x10-11        a0-1        Function Arguments/return values  Caller
+ * x12-17        a2-7        Function arguments                Caller
+ * x18-27        s2-11       Saved registers                   Callee
+ * x28-31        t3-6        Temporaries                       Caller
+ *
+ * The RISC-V context is saved t FreeRTOS tasks in the following stack frame,
+ * where the global and thread pointers are currently assumed to be constant so
+ * are not saved:
+ *
+ * mstatus
+ * xCriticalNesting
+ * x31
+ * x30
+ * x29
+ * x28
+ * x27
+ * x26
+ * x25
+ * x24
+ * x23
+ * x22
+ * x21
+ * x20
+ * x19
+ * x18
+ * x17
+ * x16
+ * x15
+ * x14
+ * x13
+ * x12
+ * x11
+ * pvParameters
+ * x9
+ * x8
+ * x7
+ * x6
+ * x5
+ * portTASK_RETURN_ADDRESS
+ * [chip specific registers go here]
+ * pxCode
+ */
+pxPortInitialiseStack:
+    csrr t0, CSR_MSTATUS                /* Obtain current mstatus value. */
+    andi t0, t0, ~0x8                   /* Ensure interrupts are disabled when the stack is restored within an ISR.  Required when a task is created after the schedulre has been started, otherwise interrupts would be disabled anyway. */
+    addi t1, x0, 0x188                  /* Generate the value 0x1880, which are the MPIE and MPP bits to set in mstatus. */
+    slli t1, t1, 4
+    or t0, t0, t1                       /* Set MPIE and MPP bits in mstatus value. */
+
+    addi a0, a0, -portWORD_SIZE
+    store_x t0, 0(a0)                   /* mstatus onto the stack. */
+    addi a0, a0, -portWORD_SIZE         /* Space for critical nesting count. */
+    store_x x0, 0(a0)                   /* Critical nesting count starts at 0 for every task. */
+#ifdef __riscv_32e
+    addi a0, a0, -(6 * portWORD_SIZE)   /* Space for registers x10-15. */
+#else
+    addi a0, a0, -(22 * portWORD_SIZE)  /* Space for registers x10-x31. */
+#endif
+    store_x a2, 0(a0)                   /* Task parameters (pvParameters parameter) goes into register X10/a0 on the stack. */
+    addi a0, a0, -(6 * portWORD_SIZE)   /* Space for registers x5-x9 + taskReturnAddress. */
+    load_x t0, xTaskReturnAddress
+    store_x t0, 0(a0)                   /* Return address onto the stack. */
+    addi t0, x0, portasmADDITIONAL_CONTEXT_SIZE /* The number of chip specific additional registers. */
+chip_specific_stack_frame:              /* First add any chip specific registers to the stack frame being created. */
+    beq t0, x0, no_more_regs            /* No more chip specific registers to save. */
+    addi a0, a0, -portWORD_SIZE         /* Make space for chip specific register. */
+    store_x x0, 0(a0)                   /* Give the chip specific register an initial value of zero. */
+    addi t0, t0, -1                     /* Decrement the count of chip specific registers remaining. */
+    j chip_specific_stack_frame         /* Until no more chip specific registers. */
+no_more_regs:
+    addi a0, a0, -portWORD_SIZE
+    store_x a1, 0(a0)                   /* mret value (pxCode parameter) onto the stack. */
+    ret
+/*-----------------------------------------------------------*/
+
+xPortStartFirstTask:
+    load_x  sp, pxCurrentTCB            /* Load pxCurrentTCB. */
+    load_x  sp, 0( sp )                 /* Read sp from first TCB member. */
+
+    load_x  x1, 0( sp ) /* Note for starting the scheduler the exception return address is used as the function return address. */
+
+    portasmRESTORE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */
+
+    load_x  x7, 4 * portWORD_SIZE( sp )     /* t2 */
+    load_x  x8, 5 * portWORD_SIZE( sp )     /* s0/fp */
+    load_x  x9, 6 * portWORD_SIZE( sp )     /* s1 */
+    load_x  x10, 7 * portWORD_SIZE( sp )    /* a0 */
+    load_x  x11, 8 * portWORD_SIZE( sp )    /* a1 */
+    load_x  x12, 9 * portWORD_SIZE( sp )    /* a2 */
+    load_x  x13, 10 * portWORD_SIZE( sp )   /* a3 */
+    load_x  x14, 11 * portWORD_SIZE( sp )   /* a4 */
+    load_x  x15, 12 * portWORD_SIZE( sp )   /* a5 */
+#ifndef __riscv_32e
+    load_x  x16, 13 * portWORD_SIZE( sp )   /* a6 */
+    load_x  x17, 14 * portWORD_SIZE( sp )   /* a7 */
+    load_x  x18, 15 * portWORD_SIZE( sp )   /* s2 */
+    load_x  x19, 16 * portWORD_SIZE( sp )   /* s3 */
+    load_x  x20, 17 * portWORD_SIZE( sp )   /* s4 */
+    load_x  x21, 18 * portWORD_SIZE( sp )   /* s5 */
+    load_x  x22, 19 * portWORD_SIZE( sp )   /* s6 */
+    load_x  x23, 20 * portWORD_SIZE( sp )   /* s7 */
+    load_x  x24, 21 * portWORD_SIZE( sp )   /* s8 */
+    load_x  x25, 22 * portWORD_SIZE( sp )   /* s9 */
+    load_x  x26, 23 * portWORD_SIZE( sp )   /* s10 */
+    load_x  x27, 24 * portWORD_SIZE( sp )   /* s11 */
+    load_x  x28, 25 * portWORD_SIZE( sp )   /* t3 */
+    load_x  x29, 26 * portWORD_SIZE( sp )   /* t4 */
+    load_x  x30, 27 * portWORD_SIZE( sp )   /* t5 */
+    load_x  x31, 28 * portWORD_SIZE( sp )   /* t6 */
+#endif
+
+    load_x  x5, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( sp )    /* Obtain xCriticalNesting value for this task from task's stack. */
+    load_x  x6, pxCriticalNesting           /* Load the address of xCriticalNesting into x6. */
+    store_x x5, 0( x6 )                     /* Restore the critical nesting value for this task. */
+
+    load_x  x5, portMSTATUS_OFFSET * portWORD_SIZE( sp )    /* Initial mstatus into x5 (t0). */
+    addi    x5, x5, 0x08                    /* Set MIE bit so the first task starts with interrupts enabled - required as returns with ret not eret. */
+    csrrw   x0, CSR_MSTATUS, x5             /* Interrupts enabled from here! */
+
+    load_x  x5, 2 * portWORD_SIZE( sp )     /* Initial x5 (t0) value. */
+    load_x  x6, 3 * portWORD_SIZE( sp )     /* Initial x6 (t1) value. */
+
+    addi    sp, sp, portCONTEXT_SIZE
+    ret
+/*-----------------------------------------------------------*/
+
+freertos_risc_v_application_exception_handler:
+    csrr t0, CSR_MCAUSE     /* For viewing in the debugger only. */
+    csrr t1, CSR_MEPC        /* For viewing in the debugger only */
+    csrr t2, CSR_MSTATUS     /* For viewing in the debugger only */
+    j $
+/*-----------------------------------------------------------*/
+
+freertos_risc_v_application_interrupt_handler:
+    csrr t0, CSR_MCAUSE     /* For viewing in the debugger only. */
+    csrr t1, CSR_MEPC        /* For viewing in the debugger only */
+    csrr t2, CSR_MSTATUS     /* For viewing in the debugger only */
+    j $
+/*-----------------------------------------------------------*/
+
+    SECTION `.text.freertos_risc_v_exception_handler`:CODE:NOROOT(2)
+    CODE
+
+freertos_risc_v_exception_handler:
+    portcontextSAVE_EXCEPTION_CONTEXT
+    /* a0 now contains mcause. */
+    li t0, 11                           /* 11 == environment call. */
+    bne a0, t0, other_exception         /* Not an M environment call, so some other exception. */
+    call vTaskSwitchContext
+    portcontextRESTORE_CONTEXT
+
+other_exception:
+    call freertos_risc_v_application_exception_handler
+    portcontextRESTORE_CONTEXT
+/*-----------------------------------------------------------*/
+
+    SECTION `.text.freertos_risc_v_interrupt_handler`:CODE:NOROOT(2)
+    CODE
+
+freertos_risc_v_interrupt_handler:
+    portcontextSAVE_INTERRUPT_CONTEXT
+    call freertos_risc_v_application_interrupt_handler
+    portcontextRESTORE_CONTEXT
+/*-----------------------------------------------------------*/
+
+    SECTION `.text.freertos_risc_v_mtimer_interrupt_handler`:CODE:NOROOT(2)
+    CODE
+
+freertos_risc_v_mtimer_interrupt_handler:
+    portcontextSAVE_INTERRUPT_CONTEXT
+    portUPDATE_MTIMER_COMPARE_REGISTER
+    call xTaskIncrementTick
+    beqz a0, exit_without_context_switch    /* Don't switch context if incrementing tick didn't unblock a task. */
+    call vTaskSwitchContext
+exit_without_context_switch:
+    portcontextRESTORE_CONTEXT
+/*-----------------------------------------------------------*/
+
+    SECTION `.text.freertos_risc_v_trap_handler`:CODE:NOROOT(8)
+    CODE
+
+freertos_risc_v_trap_handler:
+    portcontextSAVE_CONTEXT_INTERNAL
+
+    csrr a0, CSR_MCAUSE
+    csrr a1, CSR_MEPC
+
+    bge a0, x0, synchronous_exception
+
+asynchronous_interrupt:
+    store_x a1, 0( sp )                 /* Asynchronous interrupt so save unmodified exception return address. */
+    load_x sp, xISRStackTop             /* Switch to ISR stack. */
+    j handle_interrupt
+
+synchronous_exception:
+    addi a1, a1, 4                      /* Synchronous so update exception return address to the instruction after the instruction that generated the exeption. */
+    store_x a1, 0( sp )                 /* Save updated exception return address. */
+    load_x sp, xISRStackTop             /* Switch to ISR stack. */
+    j handle_exception
+
+handle_interrupt:
+#if( portasmHAS_MTIME != 0 )
+
+    test_if_mtimer:                     /* If there is a CLINT then the mtimer is used to generate the tick interrupt. */
+        addi t0, x0, 1
+        slli t0, t0, __riscv_xlen - 1   /* LSB is already set, shift into MSB.  Shift 31 on 32-bit or 63 on 64-bit cores. */
+        addi t1, t0, 7                  /* 0x8000[]0007 == machine timer interrupt. */
+        bne a0, t1, application_interrupt_handler
+
+        portUPDATE_MTIMER_COMPARE_REGISTER
+        call xTaskIncrementTick
+        beqz a0, processed_source       /* Don't switch context if incrementing tick didn't unblock a task. */
+        call vTaskSwitchContext
+        j processed_source
+
+#endif /* portasmHAS_MTIME */
+
+application_interrupt_handler:
+    call freertos_risc_v_application_interrupt_handler
+    j processed_source
+
+handle_exception:
+    /* a0 contains mcause. */
+    li t0, 11                                   /* 11 == environment call. */
+    bne a0, t0, application_exception_handler   /* Not an M environment call, so some other exception. */
+    call vTaskSwitchContext
+    j processed_source
+
+application_exception_handler:
+    call freertos_risc_v_application_exception_handler
+    j processed_source                  /* No other exceptions handled yet. */
+
+processed_source:
+    portcontextRESTORE_CONTEXT
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/RISC-V/portmacro.h b/portable/IAR/RISC-V/portmacro.h
index 7aab094..42def73 100644
--- a/portable/IAR/RISC-V/portmacro.h
+++ b/portable/IAR/RISC-V/portmacro.h
@@ -1,183 +1,183 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#include "intrinsics.h"

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-#if __riscv_xlen == 64

-    #define portSTACK_TYPE          uint64_t

-    #define portBASE_TYPE           int64_t

-    #define portUBASE_TYPE          uint64_t

-    #define portMAX_DELAY           ( TickType_t ) 0xffffffffffffffffUL

-    #define portPOINTER_SIZE_TYPE   uint64_t

-#elif __riscv_xlen == 32

-    #define portSTACK_TYPE          uint32_t

-    #define portBASE_TYPE           int32_t

-    #define portUBASE_TYPE          uint32_t

-    #define portMAX_DELAY           ( TickType_t ) 0xffffffffUL

-#else

-    #error Assembler did not define __riscv_xlen

-#endif

-

-typedef portSTACK_TYPE StackType_t;

-typedef portBASE_TYPE BaseType_t;

-typedef portUBASE_TYPE UBaseType_t;

-typedef portUBASE_TYPE TickType_t;

-

-/* Legacy type definitions. */

-#define portCHAR            char

-#define portFLOAT           float

-#define portDOUBLE          double

-#define portLONG            long

-#define portSHORT           short

-

-/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

- * not need to be guarded with a critical section. */

-#define portTICK_TYPE_IS_ATOMIC 1

-/*-----------------------------------------------------------*/

-

-/* Architecture specifics. */

-#define portSTACK_GROWTH            ( -1 )

-#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#ifdef __riscv_32e

-    #define portBYTE_ALIGNMENT          8   /* RV32E uses RISC-V EABI with reduced stack alignment requirements. */

-#else

-    #define portBYTE_ALIGNMENT          16

-#endif

-/*-----------------------------------------------------------*/

-

-/* Scheduler utilities. */

-extern void vTaskSwitchContext( void );

-#define portYIELD() __asm volatile( "ecall" );

-#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) vTaskSwitchContext(); } while( 0 )

-#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )

-/*-----------------------------------------------------------*/

-

-/* Critical section management. */

-#define portCRITICAL_NESTING_IN_TCB                             0

-

-#define portSET_INTERRUPT_MASK_FROM_ISR()                       0

-#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue

-

-#define portDISABLE_INTERRUPTS()	__disable_interrupt()

-#define portENABLE_INTERRUPTS()		__enable_interrupt()

-

-extern size_t xCriticalNesting;

-#define portENTER_CRITICAL()            \

-{                                       \

-    portDISABLE_INTERRUPTS();           \

-    xCriticalNesting++;                 \

-}

-

-#define portEXIT_CRITICAL()             \

-{                                       \

-    xCriticalNesting--;                 \

-    if( xCriticalNesting == 0 )         \

-    {                                   \

-        portENABLE_INTERRUPTS();        \

-    }                                   \

-}

-

-/*-----------------------------------------------------------*/

-

-/* Architecture specific optimisations. */

-#if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )

-

-	#error configUSE_PORT_OPTIMISED_TASK_SELECTION cannot yet be used in the IAR RISC-V port, the CLZ instruction needs to be emulated.

-

-#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

-

-

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. These are

- * not necessary for to use this port.  They are defined so the common demo

- * files (which build with all the ports) will build. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-/*-----------------------------------------------------------*/

-

-#define portNOP()    __asm volatile( " nop " )

-#define portINLINE   __inline

-

-#ifndef portFORCE_INLINE

-    #define portFORCE_INLINE inline __attribute__(( always_inline))

-#endif

-

-#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )

-/*-----------------------------------------------------------*/

-

-/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in

- * the source code because to do so would cause other compilers to generate

- * warnings. */

-#pragma diag_suppress=Pa082

-

-/* configCLINT_BASE_ADDRESS is a legacy definition that was replaced by the

- * configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS definitions.  For

- * backward compatibility derive the newer definitions from the old if the old

- * definition is found. */

-#if defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS ) && ( configCLINT_BASE_ADDRESS == 0 )

-    /* Legacy case where configCLINT_BASE_ADDRESS was defined as 0 to indicate

-     * there was no CLINT.  Equivalent now is to set the MTIME and MTIMECMP

-     * addresses to 0. */

-    #define configMTIME_BASE_ADDRESS     ( 0 )

-    #define configMTIMECMP_BASE_ADDRESS ( 0 )

-#elif defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS )

-    /* Legacy case where configCLINT_BASE_ADDRESS was set to the base address of

-     * the CLINT.  Equivalent now is to derive the MTIME and MTIMECMP addresses

-     * from the CLINT address. */

-    #define configMTIME_BASE_ADDRESS     ( ( configCLINT_BASE_ADDRESS ) + 0xBFF8UL )

-    #define configMTIMECMP_BASE_ADDRESS ( ( configCLINT_BASE_ADDRESS ) + 0x4000UL )

-#elif !defined( configMTIME_BASE_ADDRESS ) || !defined( configMTIMECMP_BASE_ADDRESS )

-    #error configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  Set them to zero if there is no MTIME (machine time) clock.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html

-#endif

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#include "intrinsics.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions. */
+#if __riscv_xlen == 64
+    #define portSTACK_TYPE          uint64_t
+    #define portBASE_TYPE           int64_t
+    #define portUBASE_TYPE          uint64_t
+    #define portMAX_DELAY           ( TickType_t ) 0xffffffffffffffffUL
+    #define portPOINTER_SIZE_TYPE   uint64_t
+#elif __riscv_xlen == 32
+    #define portSTACK_TYPE          uint32_t
+    #define portBASE_TYPE           int32_t
+    #define portUBASE_TYPE          uint32_t
+    #define portMAX_DELAY           ( TickType_t ) 0xffffffffUL
+#else
+    #error Assembler did not define __riscv_xlen
+#endif
+
+typedef portSTACK_TYPE StackType_t;
+typedef portBASE_TYPE BaseType_t;
+typedef portUBASE_TYPE UBaseType_t;
+typedef portUBASE_TYPE TickType_t;
+
+/* Legacy type definitions. */
+#define portCHAR            char
+#define portFLOAT           float
+#define portDOUBLE          double
+#define portLONG            long
+#define portSHORT           short
+
+/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+ * not need to be guarded with a critical section. */
+#define portTICK_TYPE_IS_ATOMIC 1
+/*-----------------------------------------------------------*/
+
+/* Architecture specifics. */
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#ifdef __riscv_32e
+    #define portBYTE_ALIGNMENT          8   /* RV32E uses RISC-V EABI with reduced stack alignment requirements. */
+#else
+    #define portBYTE_ALIGNMENT          16
+#endif
+/*-----------------------------------------------------------*/
+
+/* Scheduler utilities. */
+extern void vTaskSwitchContext( void );
+#define portYIELD() __asm volatile( "ecall" );
+#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) vTaskSwitchContext(); } while( 0 )
+#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
+/*-----------------------------------------------------------*/
+
+/* Critical section management. */
+#define portCRITICAL_NESTING_IN_TCB                             0
+
+#define portSET_INTERRUPT_MASK_FROM_ISR()                       0
+#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue
+
+#define portDISABLE_INTERRUPTS()	__disable_interrupt()
+#define portENABLE_INTERRUPTS()		__enable_interrupt()
+
+extern size_t xCriticalNesting;
+#define portENTER_CRITICAL()            \
+{                                       \
+    portDISABLE_INTERRUPTS();           \
+    xCriticalNesting++;                 \
+}
+
+#define portEXIT_CRITICAL()             \
+{                                       \
+    xCriticalNesting--;                 \
+    if( xCriticalNesting == 0 )         \
+    {                                   \
+        portENABLE_INTERRUPTS();        \
+    }                                   \
+}
+
+/*-----------------------------------------------------------*/
+
+/* Architecture specific optimisations. */
+#if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )
+
+	#error configUSE_PORT_OPTIMISED_TASK_SELECTION cannot yet be used in the IAR RISC-V port, the CLZ instruction needs to be emulated.
+
+#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+
+
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. These are
+ * not necessary for to use this port.  They are defined so the common demo
+ * files (which build with all the ports) will build. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+/*-----------------------------------------------------------*/
+
+#define portNOP()    __asm volatile( " nop " )
+#define portINLINE   __inline
+
+#ifndef portFORCE_INLINE
+    #define portFORCE_INLINE inline __attribute__(( always_inline))
+#endif
+
+#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
+/*-----------------------------------------------------------*/
+
+/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
+ * the source code because to do so would cause other compilers to generate
+ * warnings. */
+#pragma diag_suppress=Pa082
+
+/* configCLINT_BASE_ADDRESS is a legacy definition that was replaced by the
+ * configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS definitions.  For
+ * backward compatibility derive the newer definitions from the old if the old
+ * definition is found. */
+#if defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS ) && ( configCLINT_BASE_ADDRESS == 0 )
+    /* Legacy case where configCLINT_BASE_ADDRESS was defined as 0 to indicate
+     * there was no CLINT.  Equivalent now is to set the MTIME and MTIMECMP
+     * addresses to 0. */
+    #define configMTIME_BASE_ADDRESS     ( 0 )
+    #define configMTIMECMP_BASE_ADDRESS ( 0 )
+#elif defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS )
+    /* Legacy case where configCLINT_BASE_ADDRESS was set to the base address of
+     * the CLINT.  Equivalent now is to derive the MTIME and MTIMECMP addresses
+     * from the CLINT address. */
+    #define configMTIME_BASE_ADDRESS     ( ( configCLINT_BASE_ADDRESS ) + 0xBFF8UL )
+    #define configMTIMECMP_BASE_ADDRESS ( ( configCLINT_BASE_ADDRESS ) + 0x4000UL )
+#elif !defined( configMTIME_BASE_ADDRESS ) || !defined( configMTIMECMP_BASE_ADDRESS )
+    #error configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  Set them to zero if there is no MTIME (machine time) clock.  See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/RISC-V/readme.txt b/portable/IAR/RISC-V/readme.txt
index 69d98d9..b24c0b9 100644
--- a/portable/IAR/RISC-V/readme.txt
+++ b/portable/IAR/RISC-V/readme.txt
@@ -1,23 +1,23 @@
-/*

- * The FreeRTOS kernel's RISC-V port is split between the the code that is

- * common across all currently supported RISC-V chips (implementations of the

- * RISC-V ISA), and code that tailors the port to a specific RISC-V chip:

- *

- * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that

- *   is common to all currently supported RISC-V chips.  There is only one

- *   portASM.S file because the same file is built for all RISC-V target chips.

- *

- * + Header files called freertos_risc_v_chip_specific_extensions.h contain the

- *   code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V

- *   chip.  There are multiple freertos_risc_v_chip_specific_extensions.h files

- *   as there are multiple RISC-V chip implementations.

- *

- * !!!NOTE!!!

- * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h

- * HEADER FILE FOR THE CHIP IN USE.  This is done using the assembler's (not the

- * compiler's!) include path.  For example, if the chip in use includes a core

- * local interrupter (CLINT) and does not include any chip specific register

- * extensions then add the path below to the assembler's include path:

- * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions

- *

- */

+/*
+ * The FreeRTOS kernel's RISC-V port is split between the the code that is
+ * common across all currently supported RISC-V chips (implementations of the
+ * RISC-V ISA), and code that tailors the port to a specific RISC-V chip:
+ *
+ * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that
+ *   is common to all currently supported RISC-V chips.  There is only one
+ *   portASM.S file because the same file is built for all RISC-V target chips.
+ *
+ * + Header files called freertos_risc_v_chip_specific_extensions.h contain the
+ *   code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V
+ *   chip.  There are multiple freertos_risc_v_chip_specific_extensions.h files
+ *   as there are multiple RISC-V chip implementations.
+ *
+ * !!!NOTE!!!
+ * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h
+ * HEADER FILE FOR THE CHIP IN USE.  This is done using the assembler's (not the
+ * compiler's!) include path.  For example, if the chip in use includes a core
+ * local interrupter (CLINT) and does not include any chip specific register
+ * extensions then add the path below to the assembler's include path:
+ * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions
+ *
+ */
diff --git a/portable/IAR/RL78/port.c b/portable/IAR/RL78/port.c
index 7cfc02b..2f9a08c 100644
--- a/portable/IAR/RL78/port.c
+++ b/portable/IAR/RL78/port.c
@@ -1,210 +1,210 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* The critical nesting value is initialised to a non zero value to ensure

-interrupts don't accidentally become enabled before the scheduler is started. */

-#define portINITIAL_CRITICAL_NESTING  ( ( uint16_t ) 10 )

-

-/* Initial PSW value allocated to a newly created task.

- *   1100011000000000

- *   ||||||||-------------- Fill byte

- *   |||||||--------------- Carry Flag cleared

- *   |||||----------------- In-service priority Flags set to low level

- *   ||||------------------ Register bank Select 0 Flag cleared

- *   |||------------------- Auxiliary Carry Flag cleared

- *   ||-------------------- Register bank Select 1 Flag cleared

- *   |--------------------- Zero Flag set

- *   ---------------------- Global Interrupt Flag set (enabled)

- */

-#define portPSW    ( 0xc6UL )

-

-/* The address of the pxCurrentTCB variable, but don't know or need to know its

-type. */

-typedef void TCB_t;

-extern volatile TCB_t * volatile pxCurrentTCB;

-

-/* Each task maintains a count of the critical section nesting depth.  Each time

-a critical section is entered the count is incremented.  Each time a critical

-section is exited the count is decremented - with interrupts only being

-re-enabled if the count is zero.

-

-usCriticalNesting will get set to zero when the scheduler starts, but must

-not be initialised to zero as that could cause problems during the startup

-sequence. */

-volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;

-

-/*-----------------------------------------------------------*/

-

-/*

- * Sets up the periodic ISR used for the RTOS tick.

- */

-extern void vApplicationSetupTimerInterrupt( void );

-

-/*

- * Starts the scheduler by loading the context of the first Task to run.

- * (implemented in portasm.s).

- */

-extern void vPortStartFirstTask( void );

-

-/*

- * Used to catch tasks that attempt to return from their implementing function.

- */

-static void prvTaskExitError( void );

-

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See the header file portable.h.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-uint32_t *pulLocal;

-

-    /* With large code and large data sizeof( StackType_t ) == 2, and

-    sizeof( StackType_t * ) == 4.  With small code and small data

-    sizeof( StackType_t ) == 2 and sizeof( StackType_t * ) == 2. */

-

-    #if __DATA_MODEL__ == __DATA_MODEL_FAR__

-    {

-        /* Far pointer parameters are passed using the A:DE registers (24-bit).

-        Although they are stored in memory as a 32-bit value.  Hence decrement

-        the stack pointer, so 2 bytes are left for the contents of A, before 

-        storing the pvParameters value. */

-        pxTopOfStack--;

-        pulLocal =  ( uint32_t * ) pxTopOfStack;

-        *pulLocal = ( uint32_t ) pvParameters;

-        pxTopOfStack--;

-

-        /* The return address is a 32-bit value. So decrement the stack pointer

-        in order to make extra room needed to store the correct value.  See the

-        comments above the prvTaskExitError() prototype at the top of this file. */

-        pxTopOfStack--;

-        pulLocal = ( uint32_t * ) pxTopOfStack;

-        *pulLocal = ( uint32_t ) prvTaskExitError;

-        pxTopOfStack--;

-

-        /* The task function start address combined with the PSW is also stored

-        as a 32-bit value. So leave a space for the second two bytes. */

-        pxTopOfStack--;

-        pulLocal = ( uint32_t * ) pxTopOfStack;

-        *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );

-        pxTopOfStack--;

-

-        /* An initial value for the AX register. */

-        *pxTopOfStack = ( StackType_t ) 0x1111;

-        pxTopOfStack--;

-    }

-    #else

-    {

-        /* The return address, leaving space for the first two bytes of the

-        32-bit value.  See the comments above the prvTaskExitError() prototype

-        at the top of this file. */

-        pxTopOfStack--;

-        pulLocal = ( uint32_t * ) pxTopOfStack;

-        *pulLocal = ( uint32_t ) prvTaskExitError;

-        pxTopOfStack--;

-

-        /* Task function.  Again as it is written as a 32-bit value a space is

-        left on the stack for the second two bytes. */

-        pxTopOfStack--;

-

-        /* Task function start address combined with the PSW. */

-        pulLocal = ( uint32_t * ) pxTopOfStack;

-        *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );

-        pxTopOfStack--;

-

-        /* The parameter is passed in AX. */

-        *pxTopOfStack = ( StackType_t ) pvParameters;

-        pxTopOfStack--;

-    }

-    #endif

-

-    /* An initial value for the HL register. */

-    *pxTopOfStack = ( StackType_t ) 0x2222;

-    pxTopOfStack--;

-

-    /* CS and ES registers. */

-    *pxTopOfStack = ( StackType_t ) 0x0F00;

-    pxTopOfStack--;

-

-    /* The remaining general purpose registers DE and BC */

-    *pxTopOfStack = ( StackType_t ) 0xDEDE;

-    pxTopOfStack--;

-    *pxTopOfStack = ( StackType_t ) 0xBCBC;

-    pxTopOfStack--;

-

-    /* Finally the critical section nesting count is set to zero when the task

-    first starts. */

-    *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;

-

-    /* Return a pointer to the top of the stack that has been generated so

-    it can be stored in the task control block for the task. */

-    return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-static void prvTaskExitError( void )

-{

-    /* A function that implements a task must not exit or attempt to return to

-    its caller as there is nothing to return to.  If a task wants to exit it

-    should instead call vTaskDelete( NULL ).

-

-    Artificially force an assert() to be triggered if configASSERT() is

-    defined, then stop here so application writers can catch the error. */

-    configASSERT( usCriticalNesting == ~0U );

-    portDISABLE_INTERRUPTS();

-    for( ;; );

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-    /* Setup the hardware to generate the tick. Interrupts are disabled when

-     this function is called. */

-    vApplicationSetupTimerInterrupt();

-

-    /* Restore the context of the first task that is going to run. */

-    vPortStartFirstTask();

-

-    /* Execution should not reach here as the tasks are now running! */

-    return pdTRUE;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-    /* It is unlikely that the RL78 port will get stopped. */

-}

-/*-----------------------------------------------------------*/

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* The critical nesting value is initialised to a non zero value to ensure
+interrupts don't accidentally become enabled before the scheduler is started. */
+#define portINITIAL_CRITICAL_NESTING  ( ( uint16_t ) 10 )
+
+/* Initial PSW value allocated to a newly created task.
+ *   1100011000000000
+ *   ||||||||-------------- Fill byte
+ *   |||||||--------------- Carry Flag cleared
+ *   |||||----------------- In-service priority Flags set to low level
+ *   ||||------------------ Register bank Select 0 Flag cleared
+ *   |||------------------- Auxiliary Carry Flag cleared
+ *   ||-------------------- Register bank Select 1 Flag cleared
+ *   |--------------------- Zero Flag set
+ *   ---------------------- Global Interrupt Flag set (enabled)
+ */
+#define portPSW    ( 0xc6UL )
+
+/* The address of the pxCurrentTCB variable, but don't know or need to know its
+type. */
+typedef void TCB_t;
+extern volatile TCB_t * volatile pxCurrentTCB;
+
+/* Each task maintains a count of the critical section nesting depth.  Each time
+a critical section is entered the count is incremented.  Each time a critical
+section is exited the count is decremented - with interrupts only being
+re-enabled if the count is zero.
+
+usCriticalNesting will get set to zero when the scheduler starts, but must
+not be initialised to zero as that could cause problems during the startup
+sequence. */
+volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Sets up the periodic ISR used for the RTOS tick.
+ */
+extern void vApplicationSetupTimerInterrupt( void );
+
+/*
+ * Starts the scheduler by loading the context of the first Task to run.
+ * (implemented in portasm.s).
+ */
+extern void vPortStartFirstTask( void );
+
+/*
+ * Used to catch tasks that attempt to return from their implementing function.
+ */
+static void prvTaskExitError( void );
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See the header file portable.h.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+uint32_t *pulLocal;
+
+    /* With large code and large data sizeof( StackType_t ) == 2, and
+    sizeof( StackType_t * ) == 4.  With small code and small data
+    sizeof( StackType_t ) == 2 and sizeof( StackType_t * ) == 2. */
+
+    #if __DATA_MODEL__ == __DATA_MODEL_FAR__
+    {
+        /* Far pointer parameters are passed using the A:DE registers (24-bit).
+        Although they are stored in memory as a 32-bit value.  Hence decrement
+        the stack pointer, so 2 bytes are left for the contents of A, before
+        storing the pvParameters value. */
+        pxTopOfStack--;
+        pulLocal =  ( uint32_t * ) pxTopOfStack;
+        *pulLocal = ( uint32_t ) pvParameters;
+        pxTopOfStack--;
+
+        /* The return address is a 32-bit value. So decrement the stack pointer
+        in order to make extra room needed to store the correct value.  See the
+        comments above the prvTaskExitError() prototype at the top of this file. */
+        pxTopOfStack--;
+        pulLocal = ( uint32_t * ) pxTopOfStack;
+        *pulLocal = ( uint32_t ) prvTaskExitError;
+        pxTopOfStack--;
+
+        /* The task function start address combined with the PSW is also stored
+        as a 32-bit value. So leave a space for the second two bytes. */
+        pxTopOfStack--;
+        pulLocal = ( uint32_t * ) pxTopOfStack;
+        *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );
+        pxTopOfStack--;
+
+        /* An initial value for the AX register. */
+        *pxTopOfStack = ( StackType_t ) 0x1111;
+        pxTopOfStack--;
+    }
+    #else
+    {
+        /* The return address, leaving space for the first two bytes of the
+        32-bit value.  See the comments above the prvTaskExitError() prototype
+        at the top of this file. */
+        pxTopOfStack--;
+        pulLocal = ( uint32_t * ) pxTopOfStack;
+        *pulLocal = ( uint32_t ) prvTaskExitError;
+        pxTopOfStack--;
+
+        /* Task function.  Again as it is written as a 32-bit value a space is
+        left on the stack for the second two bytes. */
+        pxTopOfStack--;
+
+        /* Task function start address combined with the PSW. */
+        pulLocal = ( uint32_t * ) pxTopOfStack;
+        *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );
+        pxTopOfStack--;
+
+        /* The parameter is passed in AX. */
+        *pxTopOfStack = ( StackType_t ) pvParameters;
+        pxTopOfStack--;
+    }
+    #endif
+
+    /* An initial value for the HL register. */
+    *pxTopOfStack = ( StackType_t ) 0x2222;
+    pxTopOfStack--;
+
+    /* CS and ES registers. */
+    *pxTopOfStack = ( StackType_t ) 0x0F00;
+    pxTopOfStack--;
+
+    /* The remaining general purpose registers DE and BC */
+    *pxTopOfStack = ( StackType_t ) 0xDEDE;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0xBCBC;
+    pxTopOfStack--;
+
+    /* Finally the critical section nesting count is set to zero when the task
+    first starts. */
+    *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;
+
+    /* Return a pointer to the top of the stack that has been generated so
+    it can be stored in the task control block for the task. */
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+static void prvTaskExitError( void )
+{
+    /* A function that implements a task must not exit or attempt to return to
+    its caller as there is nothing to return to.  If a task wants to exit it
+    should instead call vTaskDelete( NULL ).
+
+    Artificially force an assert() to be triggered if configASSERT() is
+    defined, then stop here so application writers can catch the error. */
+    configASSERT( usCriticalNesting == ~0U );
+    portDISABLE_INTERRUPTS();
+    for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+    /* Setup the hardware to generate the tick. Interrupts are disabled when
+     this function is called. */
+    vApplicationSetupTimerInterrupt();
+
+    /* Restore the context of the first task that is going to run. */
+    vPortStartFirstTask();
+
+    /* Execution should not reach here as the tasks are now running! */
+    return pdTRUE;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the RL78 port will get stopped. */
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/RL78/portmacro.h b/portable/IAR/RL78/portmacro.h
index 0243125..7467c33 100644
--- a/portable/IAR/RL78/portmacro.h
+++ b/portable/IAR/RL78/portmacro.h
@@ -1,228 +1,228 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#ifdef __IAR_SYSTEMS_ICC__

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-#if __DATA_MODEL__ == __DATA_MODEL_FAR__ && __CODE_MODEL__ == __CODE_MODEL_NEAR__

-    #warning This port has not been tested with your selected memory model combination. If a far data model is required it is recommended to also use a far code model.

-#endif

-

-#if __DATA_MODEL__ == __DATA_MODEL_NEAR__ && __CODE_MODEL__ == __CODE_MODEL_FAR__

-    #warning This port has not been tested with your selected memory model combination. If a far code model is required it is recommended to also use a far data model.

-#endif

-

-/* Type definitions. */

-

-#define portCHAR        char

-#define portFLOAT       float

-#define portDOUBLE      double

-#define portLONG        long

-#define portSHORT       short

-#define portSTACK_TYPE  uint16_t

-#define portBASE_TYPE   short

-

-typedef portSTACK_TYPE StackType_t;

-typedef short BaseType_t;

-typedef unsigned short UBaseType_t;

-

-

-#if __DATA_MODEL__ == __DATA_MODEL_FAR__

-    #define portPOINTER_SIZE_TYPE uint32_t

-#else

-    #define portPOINTER_SIZE_TYPE uint16_t

-#endif

-

-

-#if ( configUSE_16_BIT_TICKS == 1 )

-    typedef unsigned int TickType_t;

-    #define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-    typedef uint32_t TickType_t;

-    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-/*-----------------------------------------------------------*/

-

-/* Interrupt control macros. */

-#define portDISABLE_INTERRUPTS()    __asm ( "DI" )

-#define portENABLE_INTERRUPTS()     __asm ( "EI" )

-/*-----------------------------------------------------------*/

-

-/* Critical section control macros. */

-#define portNO_CRITICAL_SECTION_NESTING        ( ( uint16_t ) 0 )

-

-#define portENTER_CRITICAL()                                                   \

-{                                                                              \

-extern volatile uint16_t usCriticalNesting;                                    \

-                                                                               \

-    portDISABLE_INTERRUPTS();                                                  \

-                                                                               \

-    /* Now interrupts are disabled ulCriticalNesting can be accessed */        \

-    /* directly.  Increment ulCriticalNesting to keep a count of how many */   \

-    /* times portENTER_CRITICAL() has been called. */                          \

-    usCriticalNesting++;                                                       \

-}

-

-#define portEXIT_CRITICAL()                                                    \

-{                                                                              \

-extern volatile uint16_t usCriticalNesting;                                    \

-                                                                               \

-    if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )                  \

-    {                                                                          \

-        /* Decrement the nesting count when leaving a critical section. */     \

-        usCriticalNesting--;                                                   \

-                                                                               \

-        /* If the nesting level has reached zero then interrupts should be */  \

-        /* re-enabled. */                                                      \

-        if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )             \

-        {                                                                      \

-            portENABLE_INTERRUPTS();                                           \

-        }                                                                      \

-    }                                                                          \

-}

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-#define portNOP()      __asm( "NOP" )

-#define portYIELD()    __asm( "BRK" )

-#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 )

-/*-----------------------------------------------------------*/

-

-/* Hardwware specifics. */

-#define portBYTE_ALIGNMENT   2

-#define portSTACK_GROWTH     ( -1 )

-#define portTICK_PERIOD_MS   ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-#ifdef __cplusplus

-}

-#endif /* __cplusplus */

-

-#endif /* __IAR_SYSTEMS_ICC__ */

-

-;//-----------------------------------------------------------------------------

-;// The macros below are processed for asm sources which include portmacro.h.

-;//-----------------------------------------------------------------------------

-#ifdef __IAR_SYSTEMS_ASM__

-

-;/* Functions and variables used by this file. */

-;//-----------------------------------------------------------------------------

-    EXTERN _pxCurrentTCB

-    EXTERN _usCriticalNesting

-

-;/* Macro used to declutter calls, depends on the selected code model. */

-;//-----------------------------------------------------------------------------

-#if __CODE_MODEL__ == __CODE_MODEL_FAR__

-    #define RCALL(X)    CALL    F:X

-#else

-    #define RCALL(X)    CALL    X

-#endif

-

-

-;/*-----------------------------------------------------------------------------

-; * portSAVE_CONTEXT MACRO

-; * Saves the context of the general purpose registers, CS and ES (only in __far

-; * memory mode) registers the _usCriticalNesting value and the Stack Pointer

-; * of the active Task onto the task stack.

-; *---------------------------------------------------------------------------*/

-portSAVE_CONTEXT MACRO

-    PUSH      AX                       ; // Save AX Register to stack.

-    PUSH      HL

-#if  __CODE_MODEL__  == __CODE_MODEL_FAR__

-    MOV       A, CS                    ; // Save CS register.

-    XCH       A, X

-    MOV       A, ES                    ; // Save ES register.

-    PUSH      AX

-#else

-    MOV       A, CS                    ; // Save CS register.

-    PUSH      AX

-#endif

-    PUSH      DE                       ; // Save the remaining general purpose registers.

-    PUSH      BC

-    MOVW      AX, _usCriticalNesting   ; // Save the _usCriticalNesting value.

-    PUSH      AX

-    MOVW      AX, _pxCurrentTCB        ; // Save the Task stack pointer.

-    MOVW      HL, AX

-    MOVW      AX, SP

-    MOVW      [HL], AX

-    ENDM

-;//-----------------------------------------------------------------------------

-

-

-;/*-----------------------------------------------------------------------------

-; * portRESTORE_CONTEXT MACRO

-; * Restores the task Stack Pointer then use this to restore _usCriticalNesting,

-; * general purpose registers and the CS and ES (only in __far memory mode)

-; * of the selected task from the task stack.

-; *---------------------------------------------------------------------------*/

-portRESTORE_CONTEXT MACRO

-    MOVW    AX, _pxCurrentTCB          ; // Restore the Task stack pointer.

-    MOVW    HL, AX

-    MOVW    AX, [HL]

-    MOVW    SP, AX

-    POP     AX                         ; // Restore _usCriticalNesting value.

-    MOVW    _usCriticalNesting, AX

-    POP     BC                         ; // Restore the necessary general purpose registers.

-    POP     DE

-#if __CODE_MODEL__  == __CODE_MODEL_FAR__

-    POP     AX                         ; // Restore the ES register.

-    MOV     ES, A

-    XCH     A, X                       ; // Restore the CS register.

-    MOV     CS, A

-#else

-    POP     AX

-    MOV     CS, A                      ; // Restore CS register.

-#endif

-    POP     HL                         ; // Restore general purpose register HL.

-    POP     AX                         ; // Restore AX.

-    ENDM

-;//-----------------------------------------------------------------------------

-

-#endif /* __IAR_SYSTEMS_ASM__ */

-

-#endif /* PORTMACRO_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#ifdef __IAR_SYSTEMS_ICC__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+#if __DATA_MODEL__ == __DATA_MODEL_FAR__ && __CODE_MODEL__ == __CODE_MODEL_NEAR__
+    #warning This port has not been tested with your selected memory model combination. If a far data model is required it is recommended to also use a far code model.
+#endif
+
+#if __DATA_MODEL__ == __DATA_MODEL_NEAR__ && __CODE_MODEL__ == __CODE_MODEL_FAR__
+    #warning This port has not been tested with your selected memory model combination. If a far code model is required it is recommended to also use a far data model.
+#endif
+
+/* Type definitions. */
+
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint16_t
+#define portBASE_TYPE   short
+
+typedef portSTACK_TYPE StackType_t;
+typedef short BaseType_t;
+typedef unsigned short UBaseType_t;
+
+
+#if __DATA_MODEL__ == __DATA_MODEL_FAR__
+    #define portPOINTER_SIZE_TYPE uint32_t
+#else
+    #define portPOINTER_SIZE_TYPE uint16_t
+#endif
+
+
+#if ( configUSE_16_BIT_TICKS == 1 )
+    typedef unsigned int TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+/*-----------------------------------------------------------*/
+
+/* Interrupt control macros. */
+#define portDISABLE_INTERRUPTS()    __asm ( "DI" )
+#define portENABLE_INTERRUPTS()     __asm ( "EI" )
+/*-----------------------------------------------------------*/
+
+/* Critical section control macros. */
+#define portNO_CRITICAL_SECTION_NESTING        ( ( uint16_t ) 0 )
+
+#define portENTER_CRITICAL()                                                   \
+{                                                                              \
+extern volatile uint16_t usCriticalNesting;                                    \
+                                                                               \
+    portDISABLE_INTERRUPTS();                                                  \
+                                                                               \
+    /* Now interrupts are disabled ulCriticalNesting can be accessed */        \
+    /* directly.  Increment ulCriticalNesting to keep a count of how many */   \
+    /* times portENTER_CRITICAL() has been called. */                          \
+    usCriticalNesting++;                                                       \
+}
+
+#define portEXIT_CRITICAL()                                                    \
+{                                                                              \
+extern volatile uint16_t usCriticalNesting;                                    \
+                                                                               \
+    if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )                  \
+    {                                                                          \
+        /* Decrement the nesting count when leaving a critical section. */     \
+        usCriticalNesting--;                                                   \
+                                                                               \
+        /* If the nesting level has reached zero then interrupts should be */  \
+        /* re-enabled. */                                                      \
+        if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )             \
+        {                                                                      \
+            portENABLE_INTERRUPTS();                                           \
+        }                                                                      \
+    }                                                                          \
+}
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+#define portNOP()      __asm( "NOP" )
+#define portYIELD()    __asm( "BRK" )
+#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 )
+/*-----------------------------------------------------------*/
+
+/* Hardwware specifics. */
+#define portBYTE_ALIGNMENT   2
+#define portSTACK_GROWTH     ( -1 )
+#define portTICK_PERIOD_MS   ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __IAR_SYSTEMS_ICC__ */
+
+;//-----------------------------------------------------------------------------
+;// The macros below are processed for asm sources which include portmacro.h.
+;//-----------------------------------------------------------------------------
+#ifdef __IAR_SYSTEMS_ASM__
+
+;/* Functions and variables used by this file. */
+;//-----------------------------------------------------------------------------
+    EXTERN _pxCurrentTCB
+    EXTERN _usCriticalNesting
+
+;/* Macro used to declutter calls, depends on the selected code model. */
+;//-----------------------------------------------------------------------------
+#if __CODE_MODEL__ == __CODE_MODEL_FAR__
+    #define RCALL(X)    CALL    F:X
+#else
+    #define RCALL(X)    CALL    X
+#endif
+
+
+;/*-----------------------------------------------------------------------------
+; * portSAVE_CONTEXT MACRO
+; * Saves the context of the general purpose registers, CS and ES (only in __far
+; * memory mode) registers the _usCriticalNesting value and the Stack Pointer
+; * of the active Task onto the task stack.
+; *---------------------------------------------------------------------------*/
+portSAVE_CONTEXT MACRO
+    PUSH      AX                       ; // Save AX Register to stack.
+    PUSH      HL
+#if  __CODE_MODEL__  == __CODE_MODEL_FAR__
+    MOV       A, CS                    ; // Save CS register.
+    XCH       A, X
+    MOV       A, ES                    ; // Save ES register.
+    PUSH      AX
+#else
+    MOV       A, CS                    ; // Save CS register.
+    PUSH      AX
+#endif
+    PUSH      DE                       ; // Save the remaining general purpose registers.
+    PUSH      BC
+    MOVW      AX, _usCriticalNesting   ; // Save the _usCriticalNesting value.
+    PUSH      AX
+    MOVW      AX, _pxCurrentTCB        ; // Save the Task stack pointer.
+    MOVW      HL, AX
+    MOVW      AX, SP
+    MOVW      [HL], AX
+    ENDM
+;//-----------------------------------------------------------------------------
+
+
+;/*-----------------------------------------------------------------------------
+; * portRESTORE_CONTEXT MACRO
+; * Restores the task Stack Pointer then use this to restore _usCriticalNesting,
+; * general purpose registers and the CS and ES (only in __far memory mode)
+; * of the selected task from the task stack.
+; *---------------------------------------------------------------------------*/
+portRESTORE_CONTEXT MACRO
+    MOVW    AX, _pxCurrentTCB          ; // Restore the Task stack pointer.
+    MOVW    HL, AX
+    MOVW    AX, [HL]
+    MOVW    SP, AX
+    POP     AX                         ; // Restore _usCriticalNesting value.
+    MOVW    _usCriticalNesting, AX
+    POP     BC                         ; // Restore the necessary general purpose registers.
+    POP     DE
+#if __CODE_MODEL__  == __CODE_MODEL_FAR__
+    POP     AX                         ; // Restore the ES register.
+    MOV     ES, A
+    XCH     A, X                       ; // Restore the CS register.
+    MOV     CS, A
+#else
+    POP     AX
+    MOV     CS, A                      ; // Restore CS register.
+#endif
+    POP     HL                         ; // Restore general purpose register HL.
+    POP     AX                         ; // Restore AX.
+    ENDM
+;//-----------------------------------------------------------------------------
+
+#endif /* __IAR_SYSTEMS_ASM__ */
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/RX100/port.c b/portable/IAR/RX100/port.c
index 1a5fb37..db9bdce 100644
--- a/portable/IAR/RX100/port.c
+++ b/portable/IAR/RX100/port.c
@@ -1,517 +1,516 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the SH2A port.

- *----------------------------------------------------------*/

-

-/* Standard C includes. */

-#include "limits.h"

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Library includes. */

-#include "string.h"

-

-/* Hardware specifics. */

-#include "machine.h"

-

-/*-----------------------------------------------------------*/

-

-/* Tasks should start with interrupts enabled and in Supervisor mode, therefore

-PSW is set with U and I set, and PM and IPL clear. */

-#define portINITIAL_PSW     ( ( StackType_t ) 0x00030000 )

-

-/* The peripheral clock is divided by this value before being supplying the

-CMT. */

-#if ( configUSE_TICKLESS_IDLE == 0 )

-	/* If tickless idle is not used then the divisor can be fixed. */

-	#define portCLOCK_DIVISOR	8UL

-#elif ( configPERIPHERAL_CLOCK_HZ >= 12000000 )

-	#define portCLOCK_DIVISOR	512UL

-#elif ( configPERIPHERAL_CLOCK_HZ >= 6000000 )

-	#define portCLOCK_DIVISOR	128UL

-#elif ( configPERIPHERAL_CLOCK_HZ >= 1000000 )

-	#define portCLOCK_DIVISOR	32UL

-#else

-	#define portCLOCK_DIVISOR	8UL

-#endif

-

-

-/* Keys required to lock and unlock access to certain system registers

-respectively. */

-#define portUNLOCK_KEY		0xA50B

-#define portLOCK_KEY		0xA500

-

-/*-----------------------------------------------------------*/

-

-/*

- * Function to start the first task executing - written in asm code as direct

- * access to registers is required.

- */

-extern void prvStartFirstTask( void );

-

-/*

- * The tick ISR handler.  The peripheral used is configured by the application

- * via a hook/callback function.

- */

-__interrupt static void prvTickISR( void );

-

-/*

- * Sets up the periodic ISR used for the RTOS tick using the CMT.

- * The application writer can define configSETUP_TICK_INTERRUPT() (in

- * FreeRTOSConfig.h) such that their own tick interrupt configuration is used

- * in place of prvSetupTimerInterrupt().

- */

-static void prvSetupTimerInterrupt( void );

-#ifndef configSETUP_TICK_INTERRUPT

-	/* The user has not provided their own tick interrupt configuration so use

-    the definition in this file (which uses the interval timer). */

-	#define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt()

-#endif /* configSETUP_TICK_INTERRUPT */

-

-/*

- * Called after the sleep mode registers have been configured, prvSleep()

- * executes the pre and post sleep macros, and actually calls the wait

- * instruction.

- */

-#if configUSE_TICKLESS_IDLE == 1

-	static void prvSleep( TickType_t xExpectedIdleTime );

-#endif /* configUSE_TICKLESS_IDLE */

-

-/*-----------------------------------------------------------*/

-

-extern void *pxCurrentTCB;

-

-/*-----------------------------------------------------------*/

-

-/* Calculate how many clock increments make up a single tick period. */

-static const uint32_t ulMatchValueForOneTick = ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ );

-

-#if configUSE_TICKLESS_IDLE == 1

-

-	/* Holds the maximum number of ticks that can be suppressed - which is

-	basically how far into the future an interrupt can be generated. Set

-	during initialisation.  This is the maximum possible value that the

-	compare match register can hold divided by ulMatchValueForOneTick. */

-	static const TickType_t xMaximumPossibleSuppressedTicks = USHRT_MAX / ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ );

-

-	/* Flag set from the tick interrupt to allow the sleep processing to know if

-	sleep mode was exited because of a tick interrupt, or an interrupt

-	generated by something else. */

-	static volatile uint32_t ulTickFlag = pdFALSE;

-

-	/* The CMT counter is stopped temporarily each time it is re-programmed.

-	The following constant offsets the CMT counter match value by the number of

-	CMT	counts that would typically be missed while the counter was stopped to

-	compensate for the lost time.  The large difference between the divided CMT

-	clock and the CPU clock means it is likely ulStoppedTimerCompensation will

-	equal zero - and be optimised away. */

-	static const uint32_t ulStoppedTimerCompensation = 100UL / ( configCPU_CLOCK_HZ / ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) );

-

-#endif

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-	/* Offset to end up on 8 byte boundary. */

-	pxTopOfStack--;

-

-	/* R0 is not included as it is the stack pointer. */

-	*pxTopOfStack = 0x00;

-	pxTopOfStack--;

-    *pxTopOfStack = 0x00;

-	pxTopOfStack--;

- 	*pxTopOfStack = portINITIAL_PSW;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) pxCode;

-

-	/* When debugging it can be useful if every register is set to a known

-	value.  Otherwise code space can be saved by just setting the registers

-	that need to be set. */

-	#ifdef USE_FULL_REGISTER_INITIALISATION

-	{

-		pxTopOfStack--;

-		*pxTopOfStack = 0x12345678;	/* r15. */

-		pxTopOfStack--;

-		*pxTopOfStack = 0xaaaabbbb;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xdddddddd;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xcccccccc;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xbbbbbbbb;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xaaaaaaaa;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x99999999;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x88888888;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x77777777;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x66666666;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x55555555;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x44444444;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x33333333;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x22222222;

-		pxTopOfStack--;

-	}

-	#else

-	{

-		/* Leave space for the registers that will get popped from the stack

-		when the task first starts executing. */

-		pxTopOfStack -= 15;

-	}

-	#endif

-

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */

-	pxTopOfStack--;

-	*pxTopOfStack = 0x12345678; /* Accumulator. */

-	pxTopOfStack--;

-	*pxTopOfStack = 0x87654321; /* Accumulator. */

-

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-	/* Use pxCurrentTCB just so it does not get optimised away. */

-	if( pxCurrentTCB != NULL )

-	{

-		/* Call an application function to set up the timer that will generate

-		the tick interrupt.  This way the application can decide which

-		peripheral to use.  If tickless mode is used then the default

-		implementation defined in this file (which uses CMT0) should not be

-		overridden. */

-		configSETUP_TICK_INTERRUPT();

-

-		/* Enable the software interrupt. */

-		_IEN( _ICU_SWINT ) = 1;

-

-		/* Ensure the software interrupt is clear. */

-		_IR( _ICU_SWINT ) = 0;

-

-		/* Ensure the software interrupt is set to the kernel priority. */

-		_IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY;

-

-		/* Start the first task. */

-		prvStartFirstTask();

-	}

-

-	/* Execution should not reach here as the tasks are now running!

-	prvSetupTimerInterrupt() is called here to prevent the compiler outputting

-	a warning about a statically declared function not being referenced in the

-	case that the application writer has provided their own tick interrupt

-	configuration routine (and defined configSETUP_TICK_INTERRUPT() such that

-	their own routine will be called in place of prvSetupTimerInterrupt()). */

-	prvSetupTimerInterrupt();

-

-	/* Should not get here. */

-	return pdFAIL;

-}

-/*-----------------------------------------------------------*/

-

-#pragma vector = configTICK_VECTOR

-__interrupt static void prvTickISR( void )

-{

-	/* Re-enable interrupts. */

-	__enable_interrupt();

-

-	/* Increment the tick, and perform any processing the new tick value

-	necessitates. */

-	__set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY );

-	{

-		if( xTaskIncrementTick() != pdFALSE )

-		{

-			taskYIELD();

-		}

-	}

-	__set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY );

-

-	#if configUSE_TICKLESS_IDLE == 1

-	{

-		/* The CPU woke because of a tick. */

-		ulTickFlag = pdTRUE;

-

-		/* If this is the first tick since exiting tickless mode then the CMT

-		compare match value needs resetting. */

-		CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick;

-	}

-	#endif

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* Not implemented in ports where there is nothing to return to.

-	Artificially force an assert. */

-	configASSERT( pxCurrentTCB == NULL );

-}

-/*-----------------------------------------------------------*/

-

-static void prvSetupTimerInterrupt( void )

-{

-	/* Unlock. */

-	SYSTEM.PRCR.WORD = portUNLOCK_KEY;

-

-	/* Enable CMT0. */

-	MSTP( CMT0 ) = 0;

-

-	/* Lock again. */

-	SYSTEM.PRCR.WORD = portLOCK_KEY;

-

-	/* Interrupt on compare match. */

-	CMT0.CMCR.BIT.CMIE = 1;

-

-	/* Set the compare match value. */

-	CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick;

-

-	/* Divide the PCLK. */

-	#if portCLOCK_DIVISOR == 512

-	{

-		CMT0.CMCR.BIT.CKS = 3;

-	}

-	#elif portCLOCK_DIVISOR == 128

-	{

-		CMT0.CMCR.BIT.CKS = 2;

-	}

-	#elif portCLOCK_DIVISOR == 32

-	{

-		CMT0.CMCR.BIT.CKS = 1;

-	}

-	#elif portCLOCK_DIVISOR == 8

-	{

-		CMT0.CMCR.BIT.CKS = 0;

-	}

-	#else

-	{

-		#error Invalid portCLOCK_DIVISOR setting

-	}

-	#endif

-

-

-	/* Enable the interrupt... */

-	_IEN( _CMT0_CMI0 ) = 1;

-

-	/* ...and set its priority to the application defined kernel priority. */

-	_IPR( _CMT0_CMI0 ) = configKERNEL_INTERRUPT_PRIORITY;

-

-	/* Start the timer. */

-	CMT.CMSTR0.BIT.STR0 = 1;

-}

-/*-----------------------------------------------------------*/

-

-#if configUSE_TICKLESS_IDLE == 1

-

-	static void prvSleep( TickType_t xExpectedIdleTime )

-	{

-		/* Allow the application to define some pre-sleep processing. */

-		configPRE_SLEEP_PROCESSING( xExpectedIdleTime );

-

-		/* xExpectedIdleTime being set to 0 by configPRE_SLEEP_PROCESSING()

-		means the application defined code has already executed the WAIT

-		instruction. */

-		if( xExpectedIdleTime > 0 )

-		{

-			__wait_for_interrupt();

-		}

-

-		/* Allow the application to define some post sleep processing. */

-		configPOST_SLEEP_PROCESSING( xExpectedIdleTime );

-	}

-

-#endif /* configUSE_TICKLESS_IDLE */

-/*-----------------------------------------------------------*/

-

-#if configUSE_TICKLESS_IDLE == 1

-

-	void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )

-	{

-	uint32_t ulMatchValue, ulCompleteTickPeriods, ulCurrentCount;

-	eSleepModeStatus eSleepAction;

-

-		/* THIS FUNCTION IS CALLED WITH THE SCHEDULER SUSPENDED. */

-

-		/* Make sure the CMT reload value does not overflow the counter. */

-		if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )

-		{

-			xExpectedIdleTime = xMaximumPossibleSuppressedTicks;

-		}

-

-		/* Calculate the reload value required to wait xExpectedIdleTime tick

-		periods. */

-		ulMatchValue = ulMatchValueForOneTick * xExpectedIdleTime;

-		if( ulMatchValue > ulStoppedTimerCompensation )

-		{

-			/* Compensate for the fact that the CMT is going to be stopped

-			momentarily. */

-			ulMatchValue -= ulStoppedTimerCompensation;

-		}

-

-		/* Stop the CMT momentarily.  The time the CMT is stopped for is

-		accounted for as best it can be, but using the tickless mode will

-		inevitably result in some tiny drift of the time maintained by the

-		kernel with respect to calendar time. */

-		CMT.CMSTR0.BIT.STR0 = 0;

-		while( CMT.CMSTR0.BIT.STR0 == 1 )

-		{

-			/* Nothing to do here. */

-		}

-

-		/* Critical section using the global interrupt bit as the i bit is

-		automatically reset by the WAIT instruction. */

-		__disable_interrupt();

-

-		/* The tick flag is set to false before sleeping.  If it is true when

-		sleep mode is exited then sleep mode was probably exited because the

-		tick was suppressed for the entire xExpectedIdleTime period. */

-		ulTickFlag = pdFALSE;

-

-		/* If a context switch is pending then abandon the low power entry as

-		the context switch might have been pended by an external interrupt that

-		requires processing. */

-		eSleepAction = eTaskConfirmSleepModeStatus();

-		if( eSleepAction == eAbortSleep )

-		{

-			/* Restart tick. */

-			CMT.CMSTR0.BIT.STR0 = 1;

-			__enable_interrupt();

-		}

-		else if( eSleepAction == eNoTasksWaitingTimeout )

-		{

-		    /* Protection off. */

-		    SYSTEM.PRCR.WORD = portUNLOCK_KEY;

-

-		    /* Ready for software standby with all clocks stopped. */

-			SYSTEM.SBYCR.BIT.SSBY = 1;

-

-		    /* Protection on. */

-		    SYSTEM.PRCR.WORD = portLOCK_KEY;

-

-			/* Sleep until something happens.  Calling prvSleep() will

-			automatically reset the i bit in the PSW. */

-			prvSleep( xExpectedIdleTime );

-

-			/* Restart the CMT. */

-			CMT.CMSTR0.BIT.STR0 = 1;

-		}

-		else

-		{

-		    /* Protection off. */

-		    SYSTEM.PRCR.WORD = portUNLOCK_KEY;

-

-		    /* Ready for deep sleep mode. */

-			SYSTEM.MSTPCRC.BIT.DSLPE = 1;

-			SYSTEM.MSTPCRA.BIT.MSTPA28 = 1;

-			SYSTEM.SBYCR.BIT.SSBY = 0;

-

-		    /* Protection on. */

-		    SYSTEM.PRCR.WORD = portLOCK_KEY;

-

-		    /* Adjust the match value to take into account that the current

-			time slice is already partially complete. */

-			ulMatchValue -= ( uint32_t ) CMT0.CMCNT;

-			CMT0.CMCOR = ( uint16_t ) ulMatchValue;

-

-			/* Restart the CMT to count up to the new match value. */

-			CMT0.CMCNT = 0;

-			CMT.CMSTR0.BIT.STR0 = 1;

-

-			/* Sleep until something happens.  Calling prvSleep() will

-			automatically reset the i bit in the PSW. */

-			prvSleep( xExpectedIdleTime );

-

-			/* Stop CMT.  Again, the time the SysTick is stopped for is

-			accounted for as best it can be, but using the tickless mode will

-			inevitably result in some tiny drift of the time maintained by the

-			kernel with	respect to calendar time. */

-			CMT.CMSTR0.BIT.STR0 = 0;

-			while( CMT.CMSTR0.BIT.STR0 == 1 )

-			{

-				/* Nothing to do here. */

-			}

-

-			ulCurrentCount = ( uint32_t ) CMT0.CMCNT;

-

-			if( ulTickFlag != pdFALSE )

-			{

-				/* The tick interrupt has already executed, although because

-				this function is called with the scheduler suspended the actual

-				tick processing will not occur until after this function has

-				exited.  Reset the match value with whatever remains of this

-				tick period. */

-				ulMatchValue = ulMatchValueForOneTick - ulCurrentCount;

-				CMT0.CMCOR = ( uint16_t ) ulMatchValue;

-

-				/* The tick interrupt handler will already have pended the tick

-				processing in the kernel.  As the pending tick will be

-				processed as soon as this function exits, the tick value

-				maintained by the tick is stepped forward by one less than the

-				time spent sleeping.  The actual stepping of the tick appears

-				later in this function. */

-				ulCompleteTickPeriods = xExpectedIdleTime - 1UL;

-			}

-			else

-			{

-				/* Something other than the tick interrupt ended the sleep.

-				How	many complete tick periods passed while the processor was

-				sleeping? */

-				ulCompleteTickPeriods = ulCurrentCount / ulMatchValueForOneTick;

-

-				/* The match value is set to whatever fraction of a single tick

-				period remains. */

-				ulMatchValue = ulCurrentCount - ( ulCompleteTickPeriods * ulMatchValueForOneTick );

-				CMT0.CMCOR = ( uint16_t ) ulMatchValue;

-			}

-

-			/* Restart the CMT so it runs up to the match value.  The match value

-			will get set to the value required to generate exactly one tick period

-			the next time the CMT interrupt executes. */

-			CMT0.CMCNT = 0;

-			CMT.CMSTR0.BIT.STR0 = 1;

-

-			/* Wind the tick forward by the number of tick periods that the CPU

-			remained in a low power state. */

-			vTaskStepTick( ulCompleteTickPeriods );

-		}

-	}

-

-#endif /* configUSE_TICKLESS_IDLE */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the SH2A port.
+ *----------------------------------------------------------*/
+
+/* Standard C includes. */
+#include "limits.h"
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Library includes. */
+#include "string.h"
+
+/* Hardware specifics. */
+#include "machine.h"
+
+/*-----------------------------------------------------------*/
+
+/* Tasks should start with interrupts enabled and in Supervisor mode, therefore
+PSW is set with U and I set, and PM and IPL clear. */
+#define portINITIAL_PSW     ( ( StackType_t ) 0x00030000 )
+
+/* The peripheral clock is divided by this value before being supplying the
+CMT. */
+#if ( configUSE_TICKLESS_IDLE == 0 )
+    /* If tickless idle is not used then the divisor can be fixed. */
+    #define portCLOCK_DIVISOR   8UL
+#elif ( configPERIPHERAL_CLOCK_HZ >= 12000000 )
+    #define portCLOCK_DIVISOR   512UL
+#elif ( configPERIPHERAL_CLOCK_HZ >= 6000000 )
+    #define portCLOCK_DIVISOR   128UL
+#elif ( configPERIPHERAL_CLOCK_HZ >= 1000000 )
+    #define portCLOCK_DIVISOR   32UL
+#else
+    #define portCLOCK_DIVISOR   8UL
+#endif
+
+
+/* Keys required to lock and unlock access to certain system registers
+respectively. */
+#define portUNLOCK_KEY      0xA50B
+#define portLOCK_KEY        0xA500
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Function to start the first task executing - written in asm code as direct
+ * access to registers is required.
+ */
+extern void prvStartFirstTask( void );
+
+/*
+ * The tick ISR handler.  The peripheral used is configured by the application
+ * via a hook/callback function.
+ */
+__interrupt static void prvTickISR( void );
+
+/*
+ * Sets up the periodic ISR used for the RTOS tick using the CMT.
+ * The application writer can define configSETUP_TICK_INTERRUPT() (in
+ * FreeRTOSConfig.h) such that their own tick interrupt configuration is used
+ * in place of prvSetupTimerInterrupt().
+ */
+static void prvSetupTimerInterrupt( void );
+#ifndef configSETUP_TICK_INTERRUPT
+    /* The user has not provided their own tick interrupt configuration so use
+    the definition in this file (which uses the interval timer). */
+    #define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt()
+#endif /* configSETUP_TICK_INTERRUPT */
+
+/*
+ * Called after the sleep mode registers have been configured, prvSleep()
+ * executes the pre and post sleep macros, and actually calls the wait
+ * instruction.
+ */
+#if configUSE_TICKLESS_IDLE == 1
+    static void prvSleep( TickType_t xExpectedIdleTime );
+#endif /* configUSE_TICKLESS_IDLE */
+
+/*-----------------------------------------------------------*/
+
+extern void *pxCurrentTCB;
+
+/*-----------------------------------------------------------*/
+
+/* Calculate how many clock increments make up a single tick period. */
+static const uint32_t ulMatchValueForOneTick = ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ );
+
+#if configUSE_TICKLESS_IDLE == 1
+
+    /* Holds the maximum number of ticks that can be suppressed - which is
+    basically how far into the future an interrupt can be generated. Set
+    during initialisation.  This is the maximum possible value that the
+    compare match register can hold divided by ulMatchValueForOneTick. */
+    static const TickType_t xMaximumPossibleSuppressedTicks = USHRT_MAX / ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ );
+
+    /* Flag set from the tick interrupt to allow the sleep processing to know if
+    sleep mode was exited because of a tick interrupt, or an interrupt
+    generated by something else. */
+    static volatile uint32_t ulTickFlag = pdFALSE;
+
+    /* The CMT counter is stopped temporarily each time it is re-programmed.
+    The following constant offsets the CMT counter match value by the number of
+    CMT counts that would typically be missed while the counter was stopped to
+    compensate for the lost time.  The large difference between the divided CMT
+    clock and the CPU clock means it is likely ulStoppedTimerCompensation will
+    equal zero - and be optimised away. */
+    static const uint32_t ulStoppedTimerCompensation = 100UL / ( configCPU_CLOCK_HZ / ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) );
+
+#endif
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+    /* Offset to end up on 8 byte boundary. */
+    pxTopOfStack--;
+
+    /* R0 is not included as it is the stack pointer. */
+    *pxTopOfStack = 0x00;
+    pxTopOfStack--;
+    *pxTopOfStack = 0x00;
+    pxTopOfStack--;
+    *pxTopOfStack = portINITIAL_PSW;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxCode;
+
+    /* When debugging it can be useful if every register is set to a known
+    value.  Otherwise code space can be saved by just setting the registers
+    that need to be set. */
+    #ifdef USE_FULL_REGISTER_INITIALISATION
+    {
+        pxTopOfStack--;
+        *pxTopOfStack = 0x12345678; /* r15. */
+        pxTopOfStack--;
+        *pxTopOfStack = 0xaaaabbbb;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xdddddddd;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xcccccccc;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xbbbbbbbb;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xaaaaaaaa;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x99999999;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x88888888;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x77777777;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x66666666;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x55555555;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x44444444;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x33333333;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x22222222;
+        pxTopOfStack--;
+    }
+    #else
+    {
+        /* Leave space for the registers that will get popped from the stack
+        when the task first starts executing. */
+        pxTopOfStack -= 15;
+    }
+    #endif
+
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */
+    pxTopOfStack--;
+    *pxTopOfStack = 0x12345678; /* Accumulator. */
+    pxTopOfStack--;
+    *pxTopOfStack = 0x87654321; /* Accumulator. */
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+    /* Use pxCurrentTCB just so it does not get optimised away. */
+    if( pxCurrentTCB != NULL )
+    {
+        /* Call an application function to set up the timer that will generate
+        the tick interrupt.  This way the application can decide which
+        peripheral to use.  If tickless mode is used then the default
+        implementation defined in this file (which uses CMT0) should not be
+        overridden. */
+        configSETUP_TICK_INTERRUPT();
+
+        /* Enable the software interrupt. */
+        _IEN( _ICU_SWINT ) = 1;
+
+        /* Ensure the software interrupt is clear. */
+        _IR( _ICU_SWINT ) = 0;
+
+        /* Ensure the software interrupt is set to the kernel priority. */
+        _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY;
+
+        /* Start the first task. */
+        prvStartFirstTask();
+    }
+
+    /* Execution should not reach here as the tasks are now running!
+    prvSetupTimerInterrupt() is called here to prevent the compiler outputting
+    a warning about a statically declared function not being referenced in the
+    case that the application writer has provided their own tick interrupt
+    configuration routine (and defined configSETUP_TICK_INTERRUPT() such that
+    their own routine will be called in place of prvSetupTimerInterrupt()). */
+    prvSetupTimerInterrupt();
+
+    /* Should not get here. */
+    return pdFAIL;
+}
+/*-----------------------------------------------------------*/
+
+#pragma vector = configTICK_VECTOR
+__interrupt static void prvTickISR( void )
+{
+    /* Re-enable interrupts. */
+    __enable_interrupt();
+
+    /* Increment the tick, and perform any processing the new tick value
+    necessitates. */
+    __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY );
+    {
+        if( xTaskIncrementTick() != pdFALSE )
+        {
+            taskYIELD();
+        }
+    }
+    __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY );
+
+    #if configUSE_TICKLESS_IDLE == 1
+    {
+        /* The CPU woke because of a tick. */
+        ulTickFlag = pdTRUE;
+
+        /* If this is the first tick since exiting tickless mode then the CMT
+        compare match value needs resetting. */
+        CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick;
+    }
+    #endif
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+    Artificially force an assert. */
+    configASSERT( pxCurrentTCB == NULL );
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupTimerInterrupt( void )
+{
+    /* Unlock. */
+    SYSTEM.PRCR.WORD = portUNLOCK_KEY;
+
+    /* Enable CMT0. */
+    MSTP( CMT0 ) = 0;
+
+    /* Lock again. */
+    SYSTEM.PRCR.WORD = portLOCK_KEY;
+
+    /* Interrupt on compare match. */
+    CMT0.CMCR.BIT.CMIE = 1;
+
+    /* Set the compare match value. */
+    CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick;
+
+    /* Divide the PCLK. */
+    #if portCLOCK_DIVISOR == 512
+    {
+        CMT0.CMCR.BIT.CKS = 3;
+    }
+    #elif portCLOCK_DIVISOR == 128
+    {
+        CMT0.CMCR.BIT.CKS = 2;
+    }
+    #elif portCLOCK_DIVISOR == 32
+    {
+        CMT0.CMCR.BIT.CKS = 1;
+    }
+    #elif portCLOCK_DIVISOR == 8
+    {
+        CMT0.CMCR.BIT.CKS = 0;
+    }
+    #else
+    {
+        #error Invalid portCLOCK_DIVISOR setting
+    }
+    #endif
+
+
+    /* Enable the interrupt... */
+    _IEN( _CMT0_CMI0 ) = 1;
+
+    /* ...and set its priority to the application defined kernel priority. */
+    _IPR( _CMT0_CMI0 ) = configKERNEL_INTERRUPT_PRIORITY;
+
+    /* Start the timer. */
+    CMT.CMSTR0.BIT.STR0 = 1;
+}
+/*-----------------------------------------------------------*/
+
+#if configUSE_TICKLESS_IDLE == 1
+
+    static void prvSleep( TickType_t xExpectedIdleTime )
+    {
+        /* Allow the application to define some pre-sleep processing. */
+        configPRE_SLEEP_PROCESSING( xExpectedIdleTime );
+
+        /* xExpectedIdleTime being set to 0 by configPRE_SLEEP_PROCESSING()
+        means the application defined code has already executed the WAIT
+        instruction. */
+        if( xExpectedIdleTime > 0 )
+        {
+            __wait_for_interrupt();
+        }
+
+        /* Allow the application to define some post sleep processing. */
+        configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
+    }
+
+#endif /* configUSE_TICKLESS_IDLE */
+/*-----------------------------------------------------------*/
+
+#if configUSE_TICKLESS_IDLE == 1
+
+    void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
+    {
+    uint32_t ulMatchValue, ulCompleteTickPeriods, ulCurrentCount;
+    eSleepModeStatus eSleepAction;
+
+        /* THIS FUNCTION IS CALLED WITH THE SCHEDULER SUSPENDED. */
+
+        /* Make sure the CMT reload value does not overflow the counter. */
+        if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )
+        {
+            xExpectedIdleTime = xMaximumPossibleSuppressedTicks;
+        }
+
+        /* Calculate the reload value required to wait xExpectedIdleTime tick
+        periods. */
+        ulMatchValue = ulMatchValueForOneTick * xExpectedIdleTime;
+        if( ulMatchValue > ulStoppedTimerCompensation )
+        {
+            /* Compensate for the fact that the CMT is going to be stopped
+            momentarily. */
+            ulMatchValue -= ulStoppedTimerCompensation;
+        }
+
+        /* Stop the CMT momentarily.  The time the CMT is stopped for is
+        accounted for as best it can be, but using the tickless mode will
+        inevitably result in some tiny drift of the time maintained by the
+        kernel with respect to calendar time. */
+        CMT.CMSTR0.BIT.STR0 = 0;
+        while( CMT.CMSTR0.BIT.STR0 == 1 )
+        {
+            /* Nothing to do here. */
+        }
+
+        /* Critical section using the global interrupt bit as the i bit is
+        automatically reset by the WAIT instruction. */
+        __disable_interrupt();
+
+        /* The tick flag is set to false before sleeping.  If it is true when
+        sleep mode is exited then sleep mode was probably exited because the
+        tick was suppressed for the entire xExpectedIdleTime period. */
+        ulTickFlag = pdFALSE;
+
+        /* If a context switch is pending then abandon the low power entry as
+        the context switch might have been pended by an external interrupt that
+        requires processing. */
+        eSleepAction = eTaskConfirmSleepModeStatus();
+        if( eSleepAction == eAbortSleep )
+        {
+            /* Restart tick. */
+            CMT.CMSTR0.BIT.STR0 = 1;
+            __enable_interrupt();
+        }
+        else if( eSleepAction == eNoTasksWaitingTimeout )
+        {
+            /* Protection off. */
+            SYSTEM.PRCR.WORD = portUNLOCK_KEY;
+
+            /* Ready for software standby with all clocks stopped. */
+            SYSTEM.SBYCR.BIT.SSBY = 1;
+
+            /* Protection on. */
+            SYSTEM.PRCR.WORD = portLOCK_KEY;
+
+            /* Sleep until something happens.  Calling prvSleep() will
+            automatically reset the i bit in the PSW. */
+            prvSleep( xExpectedIdleTime );
+
+            /* Restart the CMT. */
+            CMT.CMSTR0.BIT.STR0 = 1;
+        }
+        else
+        {
+            /* Protection off. */
+            SYSTEM.PRCR.WORD = portUNLOCK_KEY;
+
+            /* Ready for deep sleep mode. */
+            SYSTEM.MSTPCRC.BIT.DSLPE = 1;
+            SYSTEM.MSTPCRA.BIT.MSTPA28 = 1;
+            SYSTEM.SBYCR.BIT.SSBY = 0;
+
+            /* Protection on. */
+            SYSTEM.PRCR.WORD = portLOCK_KEY;
+
+            /* Adjust the match value to take into account that the current
+            time slice is already partially complete. */
+            ulMatchValue -= ( uint32_t ) CMT0.CMCNT;
+            CMT0.CMCOR = ( uint16_t ) ulMatchValue;
+
+            /* Restart the CMT to count up to the new match value. */
+            CMT0.CMCNT = 0;
+            CMT.CMSTR0.BIT.STR0 = 1;
+
+            /* Sleep until something happens.  Calling prvSleep() will
+            automatically reset the i bit in the PSW. */
+            prvSleep( xExpectedIdleTime );
+
+            /* Stop CMT.  Again, the time the SysTick is stopped for is
+            accounted for as best it can be, but using the tickless mode will
+            inevitably result in some tiny drift of the time maintained by the
+            kernel with respect to calendar time. */
+            CMT.CMSTR0.BIT.STR0 = 0;
+            while( CMT.CMSTR0.BIT.STR0 == 1 )
+            {
+                /* Nothing to do here. */
+            }
+
+            ulCurrentCount = ( uint32_t ) CMT0.CMCNT;
+
+            if( ulTickFlag != pdFALSE )
+            {
+                /* The tick interrupt has already executed, although because
+                this function is called with the scheduler suspended the actual
+                tick processing will not occur until after this function has
+                exited.  Reset the match value with whatever remains of this
+                tick period. */
+                ulMatchValue = ulMatchValueForOneTick - ulCurrentCount;
+                CMT0.CMCOR = ( uint16_t ) ulMatchValue;
+
+                /* The tick interrupt handler will already have pended the tick
+                processing in the kernel.  As the pending tick will be
+                processed as soon as this function exits, the tick value
+                maintained by the tick is stepped forward by one less than the
+                time spent sleeping.  The actual stepping of the tick appears
+                later in this function. */
+                ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
+            }
+            else
+            {
+                /* Something other than the tick interrupt ended the sleep.
+                How many complete tick periods passed while the processor was
+                sleeping? */
+                ulCompleteTickPeriods = ulCurrentCount / ulMatchValueForOneTick;
+
+                /* The match value is set to whatever fraction of a single tick
+                period remains. */
+                ulMatchValue = ulCurrentCount - ( ulCompleteTickPeriods * ulMatchValueForOneTick );
+                CMT0.CMCOR = ( uint16_t ) ulMatchValue;
+            }
+
+            /* Restart the CMT so it runs up to the match value.  The match value
+            will get set to the value required to generate exactly one tick period
+            the next time the CMT interrupt executes. */
+            CMT0.CMCNT = 0;
+            CMT.CMSTR0.BIT.STR0 = 1;
+
+            /* Wind the tick forward by the number of tick periods that the CPU
+            remained in a low power state. */
+            vTaskStepTick( ulCompleteTickPeriods );
+        }
+    }
+
+#endif /* configUSE_TICKLESS_IDLE */
diff --git a/portable/IAR/RX100/port_asm.s b/portable/IAR/RX100/port_asm.s
index 9cbabf0..224f448 100644
--- a/portable/IAR/RX100/port_asm.s
+++ b/portable/IAR/RX100/port_asm.s
@@ -1,152 +1,151 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#include "PriorityDefinitions.h"

-

-	PUBLIC _prvStartFirstTask

-	PUBLIC ___interrupt_27

-

-	EXTERN _pxCurrentTCB

-	EXTERN _vTaskSwitchContext

-

-	RSEG CODE:CODE(4)

-

-_prvStartFirstTask:

-

-		/* When starting the scheduler there is nothing that needs moving to the

-		interrupt stack because the function is not called from an interrupt.

-		Just ensure the current stack is the user stack. */

-		SETPSW		U

-

-		/* Obtain the location of the stack associated with which ever task

-		pxCurrentTCB is currently pointing to. */

-		MOV.L		#_pxCurrentTCB, R15

-		MOV.L		[R15], R15

-		MOV.L		[R15], R0

-

-		/* Restore the registers from the stack of the task pointed to by

-		pxCurrentTCB. */

-		POP			R15

-

-		/* Accumulator low 32 bits. */

-		MVTACLO		R15

-		POP			R15

-

-		/* Accumulator high 32 bits. */

-		MVTACHI		R15

-

-		/* R1 to R15 - R0 is not included as it is the SP. */

-		POPM		R1-R15

-

-		/* This pops the remaining registers. */

-		RTE

-		NOP

-		NOP

-

-/*-----------------------------------------------------------*/

-

-/* The software interrupt - overwrite the default 'weak' definition. */

-___interrupt_27:

-

-		/* Re-enable interrupts. */

-		SETPSW		I

-

-		/* Move the data that was automatically pushed onto the interrupt stack when

-		the interrupt occurred from the interrupt stack to the user stack.

-

-		R15 is saved before it is clobbered. */

-		PUSH.L		R15

-

-		/* Read the user stack pointer. */

-		MVFC		USP, R15

-

-		/* Move the address down to the data being moved. */

-		SUB			#12, R15

-		MVTC		R15, USP

-

-		/* Copy the data across, R15, then PC, then PSW. */

-		MOV.L		[ R0 ], [ R15 ]

-		MOV.L 		4[ R0 ], 4[ R15 ]

-		MOV.L		8[ R0 ], 8[ R15 ]

-

-		/* Move the interrupt stack pointer to its new correct position. */

-		ADD		#12, R0

-

-		/* All the rest of the registers are saved directly to the user stack. */

-		SETPSW		U

-

-		/* Save the rest of the general registers (R15 has been saved already). */

-		PUSHM		R1-R14

-

-		/* Save the accumulator. */

-		MVFACHI 	R15

-		PUSH.L		R15

-

-		/* Middle word. */

-		MVFACMI	R15

-

-		/* Shifted left as it is restored to the low order word. */

-		SHLL		#16, R15

-		PUSH.L		R15

-

-		/* Save the stack pointer to the TCB. */

-		MOV.L		#_pxCurrentTCB, R15

-		MOV.L		[ R15 ], R15

-		MOV.L		R0, [ R15 ]

-

-		/* Ensure the interrupt mask is set to the syscall priority while the kernel

-		structures are being accessed. */

-		MVTIPL		#configMAX_SYSCALL_INTERRUPT_PRIORITY

-

-		/* Select the next task to run. */

-		BSR.A		_vTaskSwitchContext

-

-		/* Reset the interrupt mask as no more data structure access is required. */

-		MVTIPL		#configKERNEL_INTERRUPT_PRIORITY

-

-		/* Load the stack pointer of the task that is now selected as the Running

-		state task from its TCB. */

-		MOV.L		#_pxCurrentTCB,R15

-		MOV.L		[ R15 ], R15

-		MOV.L		[ R15 ], R0

-

-		/* Restore the context of the new task.  The PSW (Program Status Word) and

-		PC will be popped by the RTE instruction. */

-		POP			R15

-		MVTACLO 	R15

-		POP			R15

-		MVTACHI 	R15

-		POPM		R1-R15

-		RTE

-		NOP

-		NOP

-

-/*-----------------------------------------------------------*/

-

-		END

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#include "PriorityDefinitions.h"
+
+    PUBLIC _prvStartFirstTask
+    PUBLIC ___interrupt_27
+
+    EXTERN _pxCurrentTCB
+    EXTERN _vTaskSwitchContext
+
+    RSEG CODE:CODE(4)
+
+_prvStartFirstTask:
+
+        /* When starting the scheduler there is nothing that needs moving to the
+        interrupt stack because the function is not called from an interrupt.
+        Just ensure the current stack is the user stack. */
+        SETPSW      U
+
+        /* Obtain the location of the stack associated with which ever task
+        pxCurrentTCB is currently pointing to. */
+        MOV.L       #_pxCurrentTCB, R15
+        MOV.L       [R15], R15
+        MOV.L       [R15], R0
+
+        /* Restore the registers from the stack of the task pointed to by
+        pxCurrentTCB. */
+        POP         R15
+
+        /* Accumulator low 32 bits. */
+        MVTACLO     R15
+        POP         R15
+
+        /* Accumulator high 32 bits. */
+        MVTACHI     R15
+
+        /* R1 to R15 - R0 is not included as it is the SP. */
+        POPM        R1-R15
+
+        /* This pops the remaining registers. */
+        RTE
+        NOP
+        NOP
+
+/*-----------------------------------------------------------*/
+
+/* The software interrupt - overwrite the default 'weak' definition. */
+___interrupt_27:
+
+        /* Re-enable interrupts. */
+        SETPSW      I
+
+        /* Move the data that was automatically pushed onto the interrupt stack when
+        the interrupt occurred from the interrupt stack to the user stack.
+
+        R15 is saved before it is clobbered. */
+        PUSH.L      R15
+
+        /* Read the user stack pointer. */
+        MVFC        USP, R15
+
+        /* Move the address down to the data being moved. */
+        SUB         #12, R15
+        MVTC        R15, USP
+
+        /* Copy the data across, R15, then PC, then PSW. */
+        MOV.L       [ R0 ], [ R15 ]
+        MOV.L       4[ R0 ], 4[ R15 ]
+        MOV.L       8[ R0 ], 8[ R15 ]
+
+        /* Move the interrupt stack pointer to its new correct position. */
+        ADD     #12, R0
+
+        /* All the rest of the registers are saved directly to the user stack. */
+        SETPSW      U
+
+        /* Save the rest of the general registers (R15 has been saved already). */
+        PUSHM       R1-R14
+
+        /* Save the accumulator. */
+        MVFACHI     R15
+        PUSH.L      R15
+
+        /* Middle word. */
+        MVFACMI R15
+
+        /* Shifted left as it is restored to the low order word. */
+        SHLL        #16, R15
+        PUSH.L      R15
+
+        /* Save the stack pointer to the TCB. */
+        MOV.L       #_pxCurrentTCB, R15
+        MOV.L       [ R15 ], R15
+        MOV.L       R0, [ R15 ]
+
+        /* Ensure the interrupt mask is set to the syscall priority while the kernel
+        structures are being accessed. */
+        MVTIPL      #configMAX_SYSCALL_INTERRUPT_PRIORITY
+
+        /* Select the next task to run. */
+        BSR.A       _vTaskSwitchContext
+
+        /* Reset the interrupt mask as no more data structure access is required. */
+        MVTIPL      #configKERNEL_INTERRUPT_PRIORITY
+
+        /* Load the stack pointer of the task that is now selected as the Running
+        state task from its TCB. */
+        MOV.L       #_pxCurrentTCB,R15
+        MOV.L       [ R15 ], R15
+        MOV.L       [ R15 ], R0
+
+        /* Restore the context of the new task.  The PSW (Program Status Word) and
+        PC will be popped by the RTE instruction. */
+        POP         R15
+        MVTACLO     R15
+        POP         R15
+        MVTACHI     R15
+        POPM        R1-R15
+        RTE
+        NOP
+        NOP
+
+/*-----------------------------------------------------------*/
+
+        END
diff --git a/portable/IAR/RX100/portmacro.h b/portable/IAR/RX100/portmacro.h
index 9d8605d..ff1dc0e 100644
--- a/portable/IAR/RX100/portmacro.h
+++ b/portable/IAR/RX100/portmacro.h
@@ -1,151 +1,150 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#include <intrinsics.h>

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/* Hardware specifics. */

-#include "machine.h"

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions - these are a bit legacy and not really used now, other than

-portSTACK_TYPE and portBASE_TYPE. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		short

-#define portSTACK_TYPE	uint32_t

-#define portBASE_TYPE	long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-

-	/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

-	not need to be guarded with a critical section. */

-	#define portTICK_TYPE_IS_ATOMIC 1

-#endif

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portBYTE_ALIGNMENT			8	/* Could make four, according to manual. */

-#define portSTACK_GROWTH			-1

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portNOP()					__no_operation()

-

-#define portYIELD()						\

-	__asm volatile						\

-	(									\

-		"MOV.L #0x872E0, R15		\n"	\

-		"MOV.B #1, [R15]			\n"	\

-		"MOV.L [R15], R15			\n"	\

-		::: "R15"						\

-	)

-

-#define portYIELD_FROM_ISR( x )	do { if( ( x ) != pdFALSE ) { portYIELD(); } } while( 0 )

-

-/* These macros should not be called directly, but through the

-taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros.  An extra check is

-performed if configASSERT() is defined to ensure an assertion handler does not

-inadvertently attempt to lower the IPL when the call to assert was triggered

-because the IPL value was found to be above	configMAX_SYSCALL_INTERRUPT_PRIORITY

-when an ISR safe FreeRTOS API function was executed.  ISR safe FreeRTOS API

-functions are those that end in FromISR.  FreeRTOS maintains a separate

-interrupt API to ensure API function and interrupt entry is as fast and as

-simple as possible. */

-#define portENABLE_INTERRUPTS() 	__set_interrupt_level( ( uint8_t ) 0 )

-#ifdef configASSERT

-	#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) )

-	#define portDISABLE_INTERRUPTS() 	if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )

-#else

-	#define portDISABLE_INTERRUPTS() 	__set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )

-#endif

-

-/* Critical nesting counts are stored in the TCB. */

-#define portCRITICAL_NESTING_IN_TCB ( 1 )

-

-/* The critical nesting functions defined within tasks.c. */

-extern void vTaskEnterCritical( void );

-extern void vTaskExitCritical( void );

-#define portENTER_CRITICAL()	vTaskEnterCritical()

-#define portEXIT_CRITICAL()		vTaskExitCritical()

-

-/* As this port allows interrupt nesting... */

-#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS()

-#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) )

-

-/* Tickless idle/low power functionality. */

-#if configUSE_TICKLESS_IDLE == 1

-	#ifndef portSUPPRESS_TICKS_AND_SLEEP

-		extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );

-		#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )

-	#endif

-#endif

-

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-/* Prevent warnings of undefined behaviour: the order of volatile accesses is

-undefined - all warnings have been manually checked and are not an issue, and

-the warnings cannot be prevent by code changes without undesirable effects. */

-#pragma diag_suppress=Pa082

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#include <intrinsics.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Hardware specifics. */
+#include "machine.h"
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions - these are a bit legacy and not really used now, other than
+portSTACK_TYPE and portBASE_TYPE. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint32_t
+#define portBASE_TYPE   long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+
+    /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+    not need to be guarded with a critical section. */
+    #define portTICK_TYPE_IS_ATOMIC 1
+#endif
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portBYTE_ALIGNMENT          8   /* Could make four, according to manual. */
+#define portSTACK_GROWTH            -1
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portNOP()                   __no_operation()
+
+#define portYIELD()                     \
+    __asm volatile                      \
+    (                                   \
+        "MOV.L #0x872E0, R15        \n" \
+        "MOV.B #1, [R15]            \n" \
+        "MOV.L [R15], R15           \n" \
+        ::: "R15"                       \
+    )
+
+#define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) { portYIELD(); } } while( 0 )
+
+/* These macros should not be called directly, but through the
+taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros.  An extra check is
+performed if configASSERT() is defined to ensure an assertion handler does not
+inadvertently attempt to lower the IPL when the call to assert was triggered
+because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY
+when an ISR safe FreeRTOS API function was executed.  ISR safe FreeRTOS API
+functions are those that end in FromISR.  FreeRTOS maintains a separate
+interrupt API to ensure API function and interrupt entry is as fast and as
+simple as possible. */
+#define portENABLE_INTERRUPTS()     __set_interrupt_level( ( uint8_t ) 0 )
+#ifdef configASSERT
+    #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) )
+    #define portDISABLE_INTERRUPTS()    if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )
+#else
+    #define portDISABLE_INTERRUPTS()    __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )
+#endif
+
+/* Critical nesting counts are stored in the TCB. */
+#define portCRITICAL_NESTING_IN_TCB ( 1 )
+
+/* The critical nesting functions defined within tasks.c. */
+extern void vTaskEnterCritical( void );
+extern void vTaskExitCritical( void );
+#define portENTER_CRITICAL()    vTaskEnterCritical()
+#define portEXIT_CRITICAL()     vTaskExitCritical()
+
+/* As this port allows interrupt nesting... */
+#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS()
+#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) )
+
+/* Tickless idle/low power functionality. */
+#if configUSE_TICKLESS_IDLE == 1
+    #ifndef portSUPPRESS_TICKS_AND_SLEEP
+        extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
+        #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
+    #endif
+#endif
+
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+/* Prevent warnings of undefined behaviour: the order of volatile accesses is
+undefined - all warnings have been manually checked and are not an issue, and
+the warnings cannot be prevent by code changes without undesirable effects. */
+#pragma diag_suppress=Pa082
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/RX100/readme.txt b/portable/IAR/RX100/readme.txt
index 9e89a09..8dbc983 100644
--- a/portable/IAR/RX100/readme.txt
+++ b/portable/IAR/RX100/readme.txt
@@ -69,4 +69,3 @@
 For more information about Renesas RX MCUs, please visit the following URL:
 
 https://www.renesas.com/products/microcontrollers-microprocessors/rx.html
-
diff --git a/portable/IAR/RX600/port.c b/portable/IAR/RX600/port.c
index 8f524dd..547f7fb 100644
--- a/portable/IAR/RX600/port.c
+++ b/portable/IAR/RX600/port.c
@@ -1,194 +1,191 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the SH2A port.

- *----------------------------------------------------------*/

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Library includes. */

-#include "string.h"

-

-/* Hardware specifics. */

-#include <iorx62n.h>

-

-/*-----------------------------------------------------------*/

-

-/* Tasks should start with interrupts enabled and in Supervisor mode, therefore

-PSW is set with U and I set, and PM and IPL clear. */

-#define portINITIAL_PSW	 ( ( StackType_t ) 0x00030000 )

-#define portINITIAL_FPSW	( ( StackType_t ) 0x00000100 )

-

-/*-----------------------------------------------------------*/

-

-/*

- * Function to start the first task executing - written in asm code as direct

- * access to registers is required.

- */

-extern void prvStartFirstTask( void );

-

-/*

- * The tick ISR handler.  The peripheral used is configured by the application

- * via a hook/callback function.

- */

-__interrupt void vTickISR( void );

-

-/*-----------------------------------------------------------*/

-

-extern void *pxCurrentTCB;

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-	/* R0 is not included as it is the stack pointer. */

-

-	*pxTopOfStack = 0x00;

-	pxTopOfStack--;

- 	*pxTopOfStack = portINITIAL_PSW;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) pxCode;

-

-	/* When debugging it can be useful if every register is set to a known

-	value.  Otherwise code space can be saved by just setting the registers

-	that need to be set. */

-	#ifdef USE_FULL_REGISTER_INITIALISATION

-	{

-		pxTopOfStack--;

-		*pxTopOfStack = 0xffffffff;	/* r15. */

-		pxTopOfStack--;

-		*pxTopOfStack = 0xeeeeeeee;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xdddddddd;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xcccccccc;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xbbbbbbbb;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xaaaaaaaa;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x99999999;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x88888888;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x77777777;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x66666666;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x55555555;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x44444444;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x33333333;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x22222222;

-		pxTopOfStack--;

-	}

-	#else

-	{

-		pxTopOfStack -= 15;

-	}

-	#endif

-

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */

-	pxTopOfStack--;

-	*pxTopOfStack = portINITIAL_FPSW;

-	pxTopOfStack--;

-	*pxTopOfStack = 0x12345678; /* Accumulator. */

-	pxTopOfStack--;

-	*pxTopOfStack = 0x87654321; /* Accumulator. */

-

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-extern void vApplicationSetupTimerInterrupt( void );

-

-	/* Use pxCurrentTCB just so it does not get optimised away. */

-	if( pxCurrentTCB != NULL )

-	{

-		/* Call an application function to set up the timer that will generate the

-		tick interrupt.  This way the application can decide which peripheral to

-		use.  A demo application is provided to show a suitable example. */

-		vApplicationSetupTimerInterrupt();

-

-		/* Enable the software interrupt. */

-		_IEN( _ICU_SWINT ) = 1;

-

-		/* Ensure the software interrupt is clear. */

-		_IR( _ICU_SWINT ) = 0;

-

-		/* Ensure the software interrupt is set to the kernel priority. */

-		_IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY;

-

-		/* Start the first task. */

-		prvStartFirstTask();

-	}

-

-	/* Should not get here. */

-	return pdFAIL;

-}

-/*-----------------------------------------------------------*/

-

-#pragma vector = configTICK_VECTOR

-__interrupt void vTickISR( void )

-{

-	/* Re-enable interrupts. */

-	__enable_interrupt();

-

-	/* Increment the tick, and perform any processing the new tick value

-	necessitates. */

-	__set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY );

-	{

-		if( xTaskIncrementTick() != pdFALSE )

-		{

-			taskYIELD();

-		}

-	}

-	__set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY );

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* Not implemented in ports where there is nothing to return to.

-	Artificially force an assert. */

-	configASSERT( pxCurrentTCB == NULL );

-}

-/*-----------------------------------------------------------*/

-

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the SH2A port.
+ *----------------------------------------------------------*/
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Library includes. */
+#include "string.h"
+
+/* Hardware specifics. */
+#include <iorx62n.h>
+
+/*-----------------------------------------------------------*/
+
+/* Tasks should start with interrupts enabled and in Supervisor mode, therefore
+PSW is set with U and I set, and PM and IPL clear. */
+#define portINITIAL_PSW  ( ( StackType_t ) 0x00030000 )
+#define portINITIAL_FPSW    ( ( StackType_t ) 0x00000100 )
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Function to start the first task executing - written in asm code as direct
+ * access to registers is required.
+ */
+extern void prvStartFirstTask( void );
+
+/*
+ * The tick ISR handler.  The peripheral used is configured by the application
+ * via a hook/callback function.
+ */
+__interrupt void vTickISR( void );
+
+/*-----------------------------------------------------------*/
+
+extern void *pxCurrentTCB;
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+    /* R0 is not included as it is the stack pointer. */
+
+    *pxTopOfStack = 0x00;
+    pxTopOfStack--;
+    *pxTopOfStack = portINITIAL_PSW;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxCode;
+
+    /* When debugging it can be useful if every register is set to a known
+    value.  Otherwise code space can be saved by just setting the registers
+    that need to be set. */
+    #ifdef USE_FULL_REGISTER_INITIALISATION
+    {
+        pxTopOfStack--;
+        *pxTopOfStack = 0xffffffff; /* r15. */
+        pxTopOfStack--;
+        *pxTopOfStack = 0xeeeeeeee;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xdddddddd;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xcccccccc;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xbbbbbbbb;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xaaaaaaaa;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x99999999;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x88888888;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x77777777;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x66666666;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x55555555;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x44444444;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x33333333;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x22222222;
+        pxTopOfStack--;
+    }
+    #else
+    {
+        pxTopOfStack -= 15;
+    }
+    #endif
+
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */
+    pxTopOfStack--;
+    *pxTopOfStack = portINITIAL_FPSW;
+    pxTopOfStack--;
+    *pxTopOfStack = 0x12345678; /* Accumulator. */
+    pxTopOfStack--;
+    *pxTopOfStack = 0x87654321; /* Accumulator. */
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+extern void vApplicationSetupTimerInterrupt( void );
+
+    /* Use pxCurrentTCB just so it does not get optimised away. */
+    if( pxCurrentTCB != NULL )
+    {
+        /* Call an application function to set up the timer that will generate the
+        tick interrupt.  This way the application can decide which peripheral to
+        use.  A demo application is provided to show a suitable example. */
+        vApplicationSetupTimerInterrupt();
+
+        /* Enable the software interrupt. */
+        _IEN( _ICU_SWINT ) = 1;
+
+        /* Ensure the software interrupt is clear. */
+        _IR( _ICU_SWINT ) = 0;
+
+        /* Ensure the software interrupt is set to the kernel priority. */
+        _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY;
+
+        /* Start the first task. */
+        prvStartFirstTask();
+    }
+
+    /* Should not get here. */
+    return pdFAIL;
+}
+/*-----------------------------------------------------------*/
+
+#pragma vector = configTICK_VECTOR
+__interrupt void vTickISR( void )
+{
+    /* Re-enable interrupts. */
+    __enable_interrupt();
+
+    /* Increment the tick, and perform any processing the new tick value
+    necessitates. */
+    __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY );
+    {
+        if( xTaskIncrementTick() != pdFALSE )
+        {
+            taskYIELD();
+        }
+    }
+    __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY );
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+    Artificially force an assert. */
+    configASSERT( pxCurrentTCB == NULL );
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/RX600/port_asm.s b/portable/IAR/RX600/port_asm.s
index b1cb7e3..d658426 100644
--- a/portable/IAR/RX600/port_asm.s
+++ b/portable/IAR/RX600/port_asm.s
@@ -1,160 +1,159 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#include "PriorityDefinitions.h"

-

-	PUBLIC _prvStartFirstTask

-	PUBLIC ___interrupt_27

-

-	EXTERN _pxCurrentTCB

-	EXTERN _vTaskSwitchContext

-

-	RSEG CODE:CODE(4)

-

-_prvStartFirstTask:

-

-		/* When starting the scheduler there is nothing that needs moving to the

-		interrupt stack because the function is not called from an interrupt.

-		Just ensure the current stack is the user stack. */

-		SETPSW		U

-

-		/* Obtain the location of the stack associated with which ever task

-		pxCurrentTCB is currently pointing to. */

-		MOV.L		#_pxCurrentTCB, R15

-		MOV.L		[R15], R15

-		MOV.L		[R15], R0

-

-		/* Restore the registers from the stack of the task pointed to by

-		pxCurrentTCB. */

-		POP			R15

-

-		/* Accumulator low 32 bits. */

-		MVTACLO		R15

-		POP			R15

-

-		/* Accumulator high 32 bits. */

-		MVTACHI		R15

-		POP			R15

-

-		/* Floating point status word. */

-		MVTC		R15, FPSW

-

-		/* R1 to R15 - R0 is not included as it is the SP. */

-		POPM		R1-R15

-

-		/* This pops the remaining registers. */

-		RTE

-		NOP

-		NOP

-

-/*-----------------------------------------------------------*/

-

-/* The software interrupt - overwrite the default 'weak' definition. */

-___interrupt_27:

-

-		/* Re-enable interrupts. */

-		SETPSW		I

-

-		/* Move the data that was automatically pushed onto the interrupt stack when

-		the interrupt occurred from the interrupt stack to the user stack.

-

-		R15 is saved before it is clobbered. */

-		PUSH.L		R15

-

-		/* Read the user stack pointer. */

-		MVFC		USP, R15

-

-		/* Move the address down to the data being moved. */

-		SUB			#12, R15

-		MVTC		R15, USP

-

-		/* Copy the data across, R15, then PC, then PSW. */

-		MOV.L		[ R0 ], [ R15 ]

-		MOV.L 		4[ R0 ], 4[ R15 ]

-		MOV.L		8[ R0 ], 8[ R15 ]

-

-		/* Move the interrupt stack pointer to its new correct position. */

-		ADD		#12, R0

-

-		/* All the rest of the registers are saved directly to the user stack. */

-		SETPSW		U

-

-		/* Save the rest of the general registers (R15 has been saved already). */

-		PUSHM		R1-R14

-

-		/* Save the FPSW and accumulator. */

-		MVFC		FPSW, R15

-		PUSH.L		R15

-		MVFACHI 	R15

-		PUSH.L		R15

-

-		/* Middle word. */

-		MVFACMI	R15

-

-		/* Shifted left as it is restored to the low order word. */

-		SHLL		#16, R15

-		PUSH.L		R15

-

-		/* Save the stack pointer to the TCB. */

-		MOV.L		#_pxCurrentTCB, R15

-		MOV.L		[ R15 ], R15

-		MOV.L		R0, [ R15 ]

-

-		/* Ensure the interrupt mask is set to the syscall priority while the kernel

-		structures are being accessed. */

-		MVTIPL		#configMAX_SYSCALL_INTERRUPT_PRIORITY

-

-		/* Select the next task to run. */

-		BSR.A		_vTaskSwitchContext

-

-		/* Reset the interrupt mask as no more data structure access is required. */

-		MVTIPL		#configKERNEL_INTERRUPT_PRIORITY

-

-		/* Load the stack pointer of the task that is now selected as the Running

-		state task from its TCB. */

-		MOV.L		#_pxCurrentTCB,R15

-		MOV.L		[ R15 ], R15

-		MOV.L		[ R15 ], R0

-

-		/* Restore the context of the new task.  The PSW (Program Status Word) and

-		PC will be popped by the RTE instruction. */

-		POP			R15

-		MVTACLO 	R15

-		POP			R15

-		MVTACHI 	R15

-		POP			R15

-		MVTC		R15, FPSW

-		POPM		R1-R15

-		RTE

-		NOP

-		NOP

-

-/*-----------------------------------------------------------*/

-

-		END

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#include "PriorityDefinitions.h"
+
+    PUBLIC _prvStartFirstTask
+    PUBLIC ___interrupt_27
+
+    EXTERN _pxCurrentTCB
+    EXTERN _vTaskSwitchContext
+
+    RSEG CODE:CODE(4)
+
+_prvStartFirstTask:
+
+        /* When starting the scheduler there is nothing that needs moving to the
+        interrupt stack because the function is not called from an interrupt.
+        Just ensure the current stack is the user stack. */
+        SETPSW      U
+
+        /* Obtain the location of the stack associated with which ever task
+        pxCurrentTCB is currently pointing to. */
+        MOV.L       #_pxCurrentTCB, R15
+        MOV.L       [R15], R15
+        MOV.L       [R15], R0
+
+        /* Restore the registers from the stack of the task pointed to by
+        pxCurrentTCB. */
+        POP         R15
+
+        /* Accumulator low 32 bits. */
+        MVTACLO     R15
+        POP         R15
+
+        /* Accumulator high 32 bits. */
+        MVTACHI     R15
+        POP         R15
+
+        /* Floating point status word. */
+        MVTC        R15, FPSW
+
+        /* R1 to R15 - R0 is not included as it is the SP. */
+        POPM        R1-R15
+
+        /* This pops the remaining registers. */
+        RTE
+        NOP
+        NOP
+
+/*-----------------------------------------------------------*/
+
+/* The software interrupt - overwrite the default 'weak' definition. */
+___interrupt_27:
+
+        /* Re-enable interrupts. */
+        SETPSW      I
+
+        /* Move the data that was automatically pushed onto the interrupt stack when
+        the interrupt occurred from the interrupt stack to the user stack.
+
+        R15 is saved before it is clobbered. */
+        PUSH.L      R15
+
+        /* Read the user stack pointer. */
+        MVFC        USP, R15
+
+        /* Move the address down to the data being moved. */
+        SUB         #12, R15
+        MVTC        R15, USP
+
+        /* Copy the data across, R15, then PC, then PSW. */
+        MOV.L       [ R0 ], [ R15 ]
+        MOV.L       4[ R0 ], 4[ R15 ]
+        MOV.L       8[ R0 ], 8[ R15 ]
+
+        /* Move the interrupt stack pointer to its new correct position. */
+        ADD     #12, R0
+
+        /* All the rest of the registers are saved directly to the user stack. */
+        SETPSW      U
+
+        /* Save the rest of the general registers (R15 has been saved already). */
+        PUSHM       R1-R14
+
+        /* Save the FPSW and accumulator. */
+        MVFC        FPSW, R15
+        PUSH.L      R15
+        MVFACHI     R15
+        PUSH.L      R15
+
+        /* Middle word. */
+        MVFACMI R15
+
+        /* Shifted left as it is restored to the low order word. */
+        SHLL        #16, R15
+        PUSH.L      R15
+
+        /* Save the stack pointer to the TCB. */
+        MOV.L       #_pxCurrentTCB, R15
+        MOV.L       [ R15 ], R15
+        MOV.L       R0, [ R15 ]
+
+        /* Ensure the interrupt mask is set to the syscall priority while the kernel
+        structures are being accessed. */
+        MVTIPL      #configMAX_SYSCALL_INTERRUPT_PRIORITY
+
+        /* Select the next task to run. */
+        BSR.A       _vTaskSwitchContext
+
+        /* Reset the interrupt mask as no more data structure access is required. */
+        MVTIPL      #configKERNEL_INTERRUPT_PRIORITY
+
+        /* Load the stack pointer of the task that is now selected as the Running
+        state task from its TCB. */
+        MOV.L       #_pxCurrentTCB,R15
+        MOV.L       [ R15 ], R15
+        MOV.L       [ R15 ], R0
+
+        /* Restore the context of the new task.  The PSW (Program Status Word) and
+        PC will be popped by the RTE instruction. */
+        POP         R15
+        MVTACLO     R15
+        POP         R15
+        MVTACHI     R15
+        POP         R15
+        MVTC        R15, FPSW
+        POPM        R1-R15
+        RTE
+        NOP
+        NOP
+
+/*-----------------------------------------------------------*/
+
+        END
diff --git a/portable/IAR/RX600/portmacro.h b/portable/IAR/RX600/portmacro.h
index 9a27a2a..e80f52a 100644
--- a/portable/IAR/RX600/portmacro.h
+++ b/portable/IAR/RX600/portmacro.h
@@ -1,140 +1,139 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#include <intrinsics.h>

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions - these are a bit legacy and not really used now, other than

-portSTACK_TYPE and portBASE_TYPE. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		short

-#define portSTACK_TYPE	uint32_t

-#define portBASE_TYPE	long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-

-	/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

-	not need to be guarded with a critical section. */

-	#define portTICK_TYPE_IS_ATOMIC 1

-#endif

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portBYTE_ALIGNMENT			8	/* Could make four, according to manual. */

-#define portSTACK_GROWTH			-1

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portNOP()					__no_operation()

-

-/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;"

-where portITU_SWINTR is the location of the software interrupt register

-(0x000872E0).  Don't rely on the assembler to select a register, so instead

-save and restore clobbered registers manually. */

-#define portYIELD()							\

-	__asm volatile 							\

-	(										\

-		"PUSH.L	R10					\n"		\

-		"MOV.L	#0x872E0, R10		\n"		\

-		"MOV.B	#0x1, [R10]			\n"		\

-		"MOV.L	[R10], R10			\n"		\

-		"POP	R10					\n"		\

-	)

-

-#define portYIELD_FROM_ISR( x )	do { if( ( x ) != pdFALSE ) portYIELD(); } while( 0 )

-

-/* These macros should not be called directly, but through the

-taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros.  An extra check is

-performed if configASSERT() is defined to ensure an assertion handler does not

-inadvertently attempt to lower the IPL when the call to assert was triggered

-because the IPL value was found to be above	configMAX_SYSCALL_INTERRUPT_PRIORITY

-when an ISR safe FreeRTOS API function was executed.  ISR safe FreeRTOS API

-functions are those that end in FromISR.  FreeRTOS maintains a separate

-interrupt API to ensure API function and interrupt entry is as fast and as

-simple as possible. */

-#define portENABLE_INTERRUPTS() 	__set_interrupt_level( ( uint8_t ) 0 )

-#ifdef configASSERT

-	#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) )

-	#define portDISABLE_INTERRUPTS() 	if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )

-#else

-	#define portDISABLE_INTERRUPTS() 	__set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )

-#endif

-

-/* Critical nesting counts are stored in the TCB. */

-#define portCRITICAL_NESTING_IN_TCB ( 1 )

-

-/* The critical nesting functions defined within tasks.c. */

-extern void vTaskEnterCritical( void );

-extern void vTaskExitCritical( void );

-#define portENTER_CRITICAL()	vTaskEnterCritical()

-#define portEXIT_CRITICAL()		vTaskExitCritical()

-

-/* As this port allows interrupt nesting... */

-#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS()

-#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) )

-

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#include <intrinsics.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions - these are a bit legacy and not really used now, other than
+portSTACK_TYPE and portBASE_TYPE. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint32_t
+#define portBASE_TYPE   long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+
+    /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+    not need to be guarded with a critical section. */
+    #define portTICK_TYPE_IS_ATOMIC 1
+#endif
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portBYTE_ALIGNMENT          8   /* Could make four, according to manual. */
+#define portSTACK_GROWTH            -1
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portNOP()                   __no_operation()
+
+/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;"
+where portITU_SWINTR is the location of the software interrupt register
+(0x000872E0).  Don't rely on the assembler to select a register, so instead
+save and restore clobbered registers manually. */
+#define portYIELD()                         \
+    __asm volatile                          \
+    (                                       \
+        "PUSH.L R10                 \n"     \
+        "MOV.L  #0x872E0, R10       \n"     \
+        "MOV.B  #0x1, [R10]         \n"     \
+        "MOV.L  [R10], R10          \n"     \
+        "POP    R10                 \n"     \
+    )
+
+#define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) portYIELD(); } while( 0 )
+
+/* These macros should not be called directly, but through the
+taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros.  An extra check is
+performed if configASSERT() is defined to ensure an assertion handler does not
+inadvertently attempt to lower the IPL when the call to assert was triggered
+because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY
+when an ISR safe FreeRTOS API function was executed.  ISR safe FreeRTOS API
+functions are those that end in FromISR.  FreeRTOS maintains a separate
+interrupt API to ensure API function and interrupt entry is as fast and as
+simple as possible. */
+#define portENABLE_INTERRUPTS()     __set_interrupt_level( ( uint8_t ) 0 )
+#ifdef configASSERT
+    #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) )
+    #define portDISABLE_INTERRUPTS()    if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )
+#else
+    #define portDISABLE_INTERRUPTS()    __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )
+#endif
+
+/* Critical nesting counts are stored in the TCB. */
+#define portCRITICAL_NESTING_IN_TCB ( 1 )
+
+/* The critical nesting functions defined within tasks.c. */
+extern void vTaskEnterCritical( void );
+extern void vTaskExitCritical( void );
+#define portENTER_CRITICAL()    vTaskEnterCritical()
+#define portEXIT_CRITICAL()     vTaskExitCritical()
+
+/* As this port allows interrupt nesting... */
+#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS()
+#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) )
+
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/RX600/readme.txt b/portable/IAR/RX600/readme.txt
index 9e89a09..8dbc983 100644
--- a/portable/IAR/RX600/readme.txt
+++ b/portable/IAR/RX600/readme.txt
@@ -69,4 +69,3 @@
 For more information about Renesas RX MCUs, please visit the following URL:
 
 https://www.renesas.com/products/microcontrollers-microprocessors/rx.html
-
diff --git a/portable/IAR/RX700v3_DPFPU/port.c b/portable/IAR/RX700v3_DPFPU/port.c
index 961147c..a77efa7 100644
--- a/portable/IAR/RX700v3_DPFPU/port.c
+++ b/portable/IAR/RX700v3_DPFPU/port.c
@@ -316,14 +316,14 @@
         /* When starting the scheduler there is nothing that needs moving to the
          * interrupt stack because the function is not called from an interrupt.
          * Just ensure the current stack is the user stack. */
-        "SETPSW		U						\n"\
+        "SETPSW     U                       \n"\
 
 
         /* Obtain the location of the stack associated with which ever task
          * pxCurrentTCB is currently pointing to. */
-        "MOV.L		#_pxCurrentTCB, R15		\n"\
-        "MOV.L		[R15], R15				\n"\
-        "MOV.L		[R15], R0				\n"\
+        "MOV.L      #_pxCurrentTCB, R15     \n"\
+        "MOV.L      [R15], R15              \n"\
+        "MOV.L      [R15], R0               \n"\
 
 
         /* Restore the registers from the stack of the task pointed to by
@@ -333,54 +333,54 @@
 
             /* The restored ulPortTaskHasDPFPUContext is to be zero here.
              * So, it is never necessary to restore the DPFPU context here. */
-            "POP		R15									\n"\
-            "MOV.L		#_ulPortTaskHasDPFPUContext, R14	\n"\
-            "MOV.L		R15, [R14]							\n"\
+            "POP        R15                                 \n"\
+            "MOV.L      #_ulPortTaskHasDPFPUContext, R14    \n"\
+            "MOV.L      R15, [R14]                          \n"\
 
         #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 )
 
             /* Restore the DPFPU context. */
-            "DPOPM.L	DPSW-DECNT				\n"\
-            "DPOPM.D	DR0-DR15				\n"\
+            "DPOPM.L    DPSW-DECNT              \n"\
+            "DPOPM.D    DR0-DR15                \n"\
 
         #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */
 
-        "POP		R15						\n"\
+        "POP        R15                     \n"\
 
         /* Accumulator low 32 bits. */
-        "MVTACLO	R15, A0					\n"\
-        "POP		R15						\n"\
+        "MVTACLO    R15, A0                 \n"\
+        "POP        R15                     \n"\
 
         /* Accumulator high 32 bits. */
-        "MVTACHI	R15, A0					\n"\
-        "POP		R15						\n"\
+        "MVTACHI    R15, A0                 \n"\
+        "POP        R15                     \n"\
 
         /* Accumulator guard. */
-        "MVTACGU	R15, A0					\n"\
-        "POP		R15						\n"\
+        "MVTACGU    R15, A0                 \n"\
+        "POP        R15                     \n"\
 
         /* Accumulator low 32 bits. */
-        "MVTACLO	R15, A1					\n"\
-        "POP		R15						\n"\
+        "MVTACLO    R15, A1                 \n"\
+        "POP        R15                     \n"\
 
         /* Accumulator high 32 bits. */
-        "MVTACHI	R15, A1					\n"\
-        "POP		R15						\n"\
+        "MVTACHI    R15, A1                 \n"\
+        "POP        R15                     \n"\
 
         /* Accumulator guard. */
-        "MVTACGU	R15, A1					\n"\
-        "POP		R15						\n"\
+        "MVTACGU    R15, A1                 \n"\
+        "POP        R15                     \n"\
 
         /* Floating point status word. */
-        "MVTC		R15, FPSW 				\n"\
+        "MVTC       R15, FPSW               \n"\
 
         /* R1 to R15 - R0 is not included as it is the SP. */
-        "POPM		R1-R15 					\n"\
+        "POPM       R1-R15                  \n"\
 
         /* This pops the remaining registers. */
-        "RTE								\n"\
-        "NOP								\n"\
-        "NOP								\n"
+        "RTE                                \n"\
+        "NOP                                \n"\
+        "NOP                                \n"
     );
 }
 /*-----------------------------------------------------------*/
@@ -391,100 +391,100 @@
     __asm volatile
     (
         /* Re-enable interrupts. */
-        "SETPSW		I							\n"\
+        "SETPSW     I                           \n"\
 
 
         /* Move the data that was automatically pushed onto the interrupt stack when
          * the interrupt occurred from the interrupt stack to the user stack.
          *
          * R15 is saved before it is clobbered. */
-        "PUSH.L		R15							\n"\
+        "PUSH.L     R15                         \n"\
 
         /* Read the user stack pointer. */
-        "MVFC		USP, R15					\n"\
+        "MVFC       USP, R15                    \n"\
 
         /* Move the address down to the data being moved. */
-        "SUB		#12, R15					\n"\
-        "MVTC		R15, USP					\n"\
+        "SUB        #12, R15                    \n"\
+        "MVTC       R15, USP                    \n"\
 
         /* Copy the data across, R15, then PC, then PSW. */
-        "MOV.L		[ R0 ], [ R15 ]				\n"\
-        "MOV.L 		4[ R0 ], 4[ R15 ]			\n"\
-        "MOV.L		8[ R0 ], 8[ R15 ]			\n"\
+        "MOV.L      [ R0 ], [ R15 ]             \n"\
+        "MOV.L      4[ R0 ], 4[ R15 ]           \n"\
+        "MOV.L      8[ R0 ], 8[ R15 ]           \n"\
 
         /* Move the interrupt stack pointer to its new correct position. */
-        "ADD		#12, R0						\n"\
+        "ADD        #12, R0                     \n"\
 
         /* All the rest of the registers are saved directly to the user stack. */
-        "SETPSW		U							\n"\
+        "SETPSW     U                           \n"\
 
         /* Save the rest of the general registers (R15 has been saved already). */
-        "PUSHM		R1-R14						\n"\
+        "PUSHM      R1-R14                      \n"\
 
         /* Save the FPSW and accumulators. */
-        "MVFC		FPSW, R15					\n"\
-        "PUSH.L		R15							\n"\
-        "MVFACGU	#0, A1, R15					\n"\
-        "PUSH.L		R15							\n"\
-        "MVFACHI	#0, A1, R15					\n"\
-        "PUSH.L		R15							\n"\
-        "MVFACLO	#0, A1, R15					\n" /* Low order word. */ \
-        "PUSH.L		R15							\n"\
-        "MVFACGU	#0, A0, R15					\n"\
-        "PUSH.L		R15							\n"\
-        "MVFACHI	#0, A0, R15					\n"\
-        "PUSH.L		R15							\n"\
-        "MVFACLO	#0, A0, R15					\n" /* Low order word. */ \
-        "PUSH.L		R15							\n"\
+        "MVFC       FPSW, R15                   \n"\
+        "PUSH.L     R15                         \n"\
+        "MVFACGU    #0, A1, R15                 \n"\
+        "PUSH.L     R15                         \n"\
+        "MVFACHI    #0, A1, R15                 \n"\
+        "PUSH.L     R15                         \n"\
+        "MVFACLO    #0, A1, R15                 \n" /* Low order word. */ \
+        "PUSH.L     R15                         \n"\
+        "MVFACGU    #0, A0, R15                 \n"\
+        "PUSH.L     R15                         \n"\
+        "MVFACHI    #0, A0, R15                 \n"\
+        "PUSH.L     R15                         \n"\
+        "MVFACLO    #0, A0, R15                 \n" /* Low order word. */ \
+        "PUSH.L     R15                         \n"\
 
         #if ( configUSE_TASK_DPFPU_SUPPORT == 1 )
 
             /* Does the task have a DPFPU context that needs saving?  If
              * ulPortTaskHasDPFPUContext is 0 then no. */
-            "MOV.L		#_ulPortTaskHasDPFPUContext, R15	\n"\
-            "MOV.L		[R15], R15							\n"\
-            "CMP		#0, R15								\n"\
+            "MOV.L      #_ulPortTaskHasDPFPUContext, R15    \n"\
+            "MOV.L      [R15], R15                          \n"\
+            "CMP        #0, R15                             \n"\
 
             /* Save the DPFPU context, if any. */
-            "BEQ.B		__lab1						\n"\
-            "DPUSHM.D	DR0-DR15					\n"\
-            "DPUSHM.L	DPSW-DECNT					\n"\
-            "__lab1:								\n"\
+            "BEQ.B      __lab1                      \n"\
+            "DPUSHM.D   DR0-DR15                    \n"\
+            "DPUSHM.L   DPSW-DECNT                  \n"\
+            "__lab1:                                \n"\
 
             /* Save ulPortTaskHasDPFPUContext itself. */
-            "PUSH.L		R15							\n"\
+            "PUSH.L     R15                         \n"\
 
         #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 )
 
             /* Save the DPFPU context, always. */
-            "DPUSHM.D	DR0-DR15					\n"\
-            "DPUSHM.L	DPSW-DECNT					\n"\
+            "DPUSHM.D   DR0-DR15                    \n"\
+            "DPUSHM.L   DPSW-DECNT                  \n"\
 
         #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */
 
 
         /* Save the stack pointer to the TCB. */
-        "MOV.L		#_pxCurrentTCB, R15			\n"\
-        "MOV.L		[ R15 ], R15				\n"\
-        "MOV.L		R0, [ R15 ]					\n"\
+        "MOV.L      #_pxCurrentTCB, R15         \n"\
+        "MOV.L      [ R15 ], R15                \n"\
+        "MOV.L      R0, [ R15 ]                 \n"\
 
 
         /* Ensure the interrupt mask is set to the syscall priority while the kernel
          * structures are being accessed. */
-        "MVTIPL		%0 							\n"\
+        "MVTIPL     %0                          \n"\
 
         /* Select the next task to run. */
-        "BSR.A		_vTaskSwitchContext			\n"\
+        "BSR.A      _vTaskSwitchContext         \n"\
 
         /* Reset the interrupt mask as no more data structure access is required. */
-        "MVTIPL		%1							\n"\
+        "MVTIPL     %1                          \n"\
 
 
         /* Load the stack pointer of the task that is now selected as the Running
          * state task from its TCB. */
-        "MOV.L		#_pxCurrentTCB,R15			\n"\
-        "MOV.L		[ R15 ], R15				\n"\
-        "MOV.L		[ R15 ], R0					\n"\
+        "MOV.L      #_pxCurrentTCB,R15          \n"\
+        "MOV.L      [ R15 ], R15                \n"\
+        "MOV.L      [ R15 ], R0                 \n"\
 
 
         /* Restore the context of the new task.  The PSW (Program Status Word) and
@@ -494,55 +494,55 @@
 
             /* Is there a DPFPU context to restore?  If the restored
              * ulPortTaskHasDPFPUContext is zero then no. */
-            "POP		R15									\n"\
-            "MOV.L		#_ulPortTaskHasDPFPUContext, R14	\n"\
-            "MOV.L		R15, [R14]							\n"\
-            "CMP		#0, R15								\n"\
+            "POP        R15                                 \n"\
+            "MOV.L      #_ulPortTaskHasDPFPUContext, R14    \n"\
+            "MOV.L      R15, [R14]                          \n"\
+            "CMP        #0, R15                             \n"\
 
             /* Restore the DPFPU context, if any. */
-            "BEQ.B		__lab2						\n"\
-            "DPOPM.L	DPSW-DECNT					\n"\
-            "DPOPM.D	DR0-DR15					\n"\
-            "__lab2:								\n"\
+            "BEQ.B      __lab2                      \n"\
+            "DPOPM.L    DPSW-DECNT                  \n"\
+            "DPOPM.D    DR0-DR15                    \n"\
+            "__lab2:                                \n"\
 
         #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 )
 
             /* Restore the DPFPU context, always. */
-            "DPOPM.L	DPSW-DECNT					\n"\
-            "DPOPM.D	DR0-DR15					\n"\
+            "DPOPM.L    DPSW-DECNT                  \n"\
+            "DPOPM.D    DR0-DR15                    \n"\
 
         #endif /* if( configUSE_TASK_DPFPU_SUPPORT == 1 ) */
 
-        "POP		R15							\n"\
+        "POP        R15                         \n"\
 
         /* Accumulator low 32 bits. */
-        "MVTACLO	R15, A0						\n"\
-        "POP		R15							\n"\
+        "MVTACLO    R15, A0                     \n"\
+        "POP        R15                         \n"\
 
         /* Accumulator high 32 bits. */
-        "MVTACHI	R15, A0						\n"\
-        "POP		R15							\n"\
+        "MVTACHI    R15, A0                     \n"\
+        "POP        R15                         \n"\
 
         /* Accumulator guard. */
-        "MVTACGU	R15, A0						\n"\
-        "POP		R15							\n"\
+        "MVTACGU    R15, A0                     \n"\
+        "POP        R15                         \n"\
 
         /* Accumulator low 32 bits. */
-        "MVTACLO	R15, A1						\n"\
-        "POP		R15							\n"\
+        "MVTACLO    R15, A1                     \n"\
+        "POP        R15                         \n"\
 
         /* Accumulator high 32 bits. */
-        "MVTACHI	R15, A1						\n"\
-        "POP		R15							\n"\
+        "MVTACHI    R15, A1                     \n"\
+        "POP        R15                         \n"\
 
         /* Accumulator guard. */
-        "MVTACGU	R15, A1						\n"\
-        "POP		R15							\n"\
-        "MVTC		R15, FPSW					\n"\
-        "POPM		R1-R15						\n"\
-        "RTE									\n"\
-        "NOP									\n"\
-        "NOP									  "
+        "MVTACGU    R15, A1                     \n"\
+        "POP        R15                         \n"\
+        "MVTC       R15, FPSW                   \n"\
+        "POPM       R1-R15                      \n"\
+        "RTE                                    \n"\
+        "NOP                                    \n"\
+        "NOP                                      "
         portCDT_NO_PARSE( :: ) "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ), "i" ( configKERNEL_INTERRUPT_PRIORITY )
     );
 }
diff --git a/portable/IAR/RX700v3_DPFPU/portmacro.h b/portable/IAR/RX700v3_DPFPU/portmacro.h
index dfee9a8..8538b15 100644
--- a/portable/IAR/RX700v3_DPFPU/portmacro.h
+++ b/portable/IAR/RX700v3_DPFPU/portmacro.h
@@ -47,7 +47,7 @@
  *-----------------------------------------------------------
  */
 
-/* When the FIT configurator or the Smart Configurator is used, platform.h has to be 
+/* When the FIT configurator or the Smart Configurator is used, platform.h has to be
  * used. */
     #ifndef configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H
         #define configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H 0
@@ -106,11 +106,11 @@
     #define portYIELD()           \
     __asm volatile                \
     (                             \
-        "PUSH.L	R10					\n"\
-        "MOV.L	#0x872E0, R10		\n"\
-        "MOV.B	#0x1, [R10]			\n"\
-        "CMP	[R10].UB, R10		\n"\
-        "POP    R10					\n"\
+        "PUSH.L R10                 \n"\
+        "MOV.L  #0x872E0, R10       \n"\
+        "MOV.B  #0x1, [R10]         \n"\
+        "CMP    [R10].UB, R10       \n"\
+        "POP    R10                 \n"\
         portCDT_NO_PARSE( ::: ) "cc"\
     )
 
@@ -133,7 +133,7 @@
  * taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros.  An extra check is
  * performed if configASSERT() is defined to ensure an assertion handler does not
  * inadvertently attempt to lower the IPL when the call to assert was triggered
- * because the IPL value was found to be above	configMAX_SYSCALL_INTERRUPT_PRIORITY
+ * because the IPL value was found to be above  configMAX_SYSCALL_INTERRUPT_PRIORITY
  * when an ISR safe FreeRTOS API function was executed.  ISR safe FreeRTOS API
  * functions are those that end in FromISR.  FreeRTOS maintains a separate
  * interrupt API to ensure API function and interrupt entry is as fast and as
diff --git a/portable/IAR/RX700v3_DPFPU/readme.txt b/portable/IAR/RX700v3_DPFPU/readme.txt
index 9e89a09..8dbc983 100644
--- a/portable/IAR/RX700v3_DPFPU/readme.txt
+++ b/portable/IAR/RX700v3_DPFPU/readme.txt
@@ -69,4 +69,3 @@
 For more information about Renesas RX MCUs, please visit the following URL:
 
 https://www.renesas.com/products/microcontrollers-microprocessors/rx.html
-
diff --git a/portable/IAR/RXv2/port.c b/portable/IAR/RXv2/port.c
index aa9e797..f791f44 100644
--- a/portable/IAR/RXv2/port.c
+++ b/portable/IAR/RXv2/port.c
@@ -1,202 +1,199 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the SH2A port.

- *----------------------------------------------------------*/

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Library includes. */

-#include "string.h"

-

-/* Hardware specifics. */

-#include <machine.h>

-

-/*-----------------------------------------------------------*/

-

-/* Tasks should start with interrupts enabled and in Supervisor mode, therefore

-PSW is set with U and I set, and PM and IPL clear. */

-#define portINITIAL_PSW	 ( ( StackType_t ) 0x00030000 )

-#define portINITIAL_FPSW	( ( StackType_t ) 0x00000100 )

-

-/*-----------------------------------------------------------*/

-

-/*

- * Function to start the first task executing - written in asm code as direct

- * access to registers is required.

- */

-extern void prvStartFirstTask( void );

-

-/*

- * The tick ISR handler.  The peripheral used is configured by the application

- * via a hook/callback function.

- */

-__interrupt void vTickISR( void );

-

-/*-----------------------------------------------------------*/

-

-extern void *pxCurrentTCB;

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-	/* R0 is not included as it is the stack pointer. */

-

-	*pxTopOfStack = 0x00;

-	pxTopOfStack--;

- 	*pxTopOfStack = portINITIAL_PSW;

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) pxCode;

-

-	/* When debugging it can be useful if every register is set to a known

-	value.  Otherwise code space can be saved by just setting the registers

-	that need to be set. */

-	#ifdef USE_FULL_REGISTER_INITIALISATION

-	{

-		pxTopOfStack--;

-		*pxTopOfStack = 0xffffffff;	/* r15. */

-		pxTopOfStack--;

-		*pxTopOfStack = 0xeeeeeeee;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xdddddddd;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xcccccccc;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xbbbbbbbb;

-		pxTopOfStack--;

-		*pxTopOfStack = 0xaaaaaaaa;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x99999999;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x88888888;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x77777777;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x66666666;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x55555555;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x44444444;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x33333333;

-		pxTopOfStack--;

-		*pxTopOfStack = 0x22222222;

-		pxTopOfStack--;

-	}

-	#else

-	{

-		pxTopOfStack -= 15;

-	}

-	#endif

-

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */

-	pxTopOfStack--;

-	*pxTopOfStack = portINITIAL_FPSW;

-	pxTopOfStack--;

-	*pxTopOfStack = 0x11111111; /* Accumulator 0. */

-	pxTopOfStack--;

-	*pxTopOfStack = 0x22222222; /* Accumulator 0. */

-	pxTopOfStack--;

-	*pxTopOfStack = 0x33333333; /* Accumulator 0. */

-	pxTopOfStack--;

-	*pxTopOfStack = 0x44444444; /* Accumulator 1. */

-	pxTopOfStack--;

-	*pxTopOfStack = 0x55555555; /* Accumulator 1. */

-	pxTopOfStack--;

-	*pxTopOfStack = 0x66666666; /* Accumulator 1. */

-

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-extern void vApplicationSetupTimerInterrupt( void );

-

-	/* Use pxCurrentTCB just so it does not get optimised away. */

-	if( pxCurrentTCB != NULL )

-	{

-		/* Call an application function to set up the timer that will generate the

-		tick interrupt.  This way the application can decide which peripheral to

-		use.  A demo application is provided to show a suitable example. */

-		vApplicationSetupTimerInterrupt();

-

-		/* Enable the software interrupt. */

-		_IEN( _ICU_SWINT ) = 1;

-

-		/* Ensure the software interrupt is clear. */

-		_IR( _ICU_SWINT ) = 0;

-

-		/* Ensure the software interrupt is set to the kernel priority. */

-		_IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY;

-

-		/* Start the first task. */

-		prvStartFirstTask();

-	}

-

-	/* Should not get here. */

-	return pdFAIL;

-}

-/*-----------------------------------------------------------*/

-

-#pragma vector = configTICK_VECTOR

-__interrupt void vTickISR( void )

-{

-	/* Re-enable interrupts. */

-	__enable_interrupt();

-

-	/* Increment the tick, and perform any processing the new tick value

-	necessitates. */

-	__set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY );

-	{

-		if( xTaskIncrementTick() != pdFALSE )

-		{

-			taskYIELD();

-		}

-	}

-	__set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY );

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* Not implemented in ports where there is nothing to return to.

-	Artificially force an assert. */

-	configASSERT( pxCurrentTCB == NULL );

-}

-/*-----------------------------------------------------------*/

-

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the SH2A port.
+ *----------------------------------------------------------*/
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Library includes. */
+#include "string.h"
+
+/* Hardware specifics. */
+#include <machine.h>
+
+/*-----------------------------------------------------------*/
+
+/* Tasks should start with interrupts enabled and in Supervisor mode, therefore
+PSW is set with U and I set, and PM and IPL clear. */
+#define portINITIAL_PSW  ( ( StackType_t ) 0x00030000 )
+#define portINITIAL_FPSW    ( ( StackType_t ) 0x00000100 )
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Function to start the first task executing - written in asm code as direct
+ * access to registers is required.
+ */
+extern void prvStartFirstTask( void );
+
+/*
+ * The tick ISR handler.  The peripheral used is configured by the application
+ * via a hook/callback function.
+ */
+__interrupt void vTickISR( void );
+
+/*-----------------------------------------------------------*/
+
+extern void *pxCurrentTCB;
+
+/*-----------------------------------------------------------*/
+
+/*
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+    /* R0 is not included as it is the stack pointer. */
+
+    *pxTopOfStack = 0x00;
+    pxTopOfStack--;
+    *pxTopOfStack = portINITIAL_PSW;
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxCode;
+
+    /* When debugging it can be useful if every register is set to a known
+    value.  Otherwise code space can be saved by just setting the registers
+    that need to be set. */
+    #ifdef USE_FULL_REGISTER_INITIALISATION
+    {
+        pxTopOfStack--;
+        *pxTopOfStack = 0xffffffff; /* r15. */
+        pxTopOfStack--;
+        *pxTopOfStack = 0xeeeeeeee;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xdddddddd;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xcccccccc;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xbbbbbbbb;
+        pxTopOfStack--;
+        *pxTopOfStack = 0xaaaaaaaa;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x99999999;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x88888888;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x77777777;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x66666666;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x55555555;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x44444444;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x33333333;
+        pxTopOfStack--;
+        *pxTopOfStack = 0x22222222;
+        pxTopOfStack--;
+    }
+    #else
+    {
+        pxTopOfStack -= 15;
+    }
+    #endif
+
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */
+    pxTopOfStack--;
+    *pxTopOfStack = portINITIAL_FPSW;
+    pxTopOfStack--;
+    *pxTopOfStack = 0x11111111; /* Accumulator 0. */
+    pxTopOfStack--;
+    *pxTopOfStack = 0x22222222; /* Accumulator 0. */
+    pxTopOfStack--;
+    *pxTopOfStack = 0x33333333; /* Accumulator 0. */
+    pxTopOfStack--;
+    *pxTopOfStack = 0x44444444; /* Accumulator 1. */
+    pxTopOfStack--;
+    *pxTopOfStack = 0x55555555; /* Accumulator 1. */
+    pxTopOfStack--;
+    *pxTopOfStack = 0x66666666; /* Accumulator 1. */
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+extern void vApplicationSetupTimerInterrupt( void );
+
+    /* Use pxCurrentTCB just so it does not get optimised away. */
+    if( pxCurrentTCB != NULL )
+    {
+        /* Call an application function to set up the timer that will generate the
+        tick interrupt.  This way the application can decide which peripheral to
+        use.  A demo application is provided to show a suitable example. */
+        vApplicationSetupTimerInterrupt();
+
+        /* Enable the software interrupt. */
+        _IEN( _ICU_SWINT ) = 1;
+
+        /* Ensure the software interrupt is clear. */
+        _IR( _ICU_SWINT ) = 0;
+
+        /* Ensure the software interrupt is set to the kernel priority. */
+        _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY;
+
+        /* Start the first task. */
+        prvStartFirstTask();
+    }
+
+    /* Should not get here. */
+    return pdFAIL;
+}
+/*-----------------------------------------------------------*/
+
+#pragma vector = configTICK_VECTOR
+__interrupt void vTickISR( void )
+{
+    /* Re-enable interrupts. */
+    __enable_interrupt();
+
+    /* Increment the tick, and perform any processing the new tick value
+    necessitates. */
+    __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY );
+    {
+        if( xTaskIncrementTick() != pdFALSE )
+        {
+            taskYIELD();
+        }
+    }
+    __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY );
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* Not implemented in ports where there is nothing to return to.
+    Artificially force an assert. */
+    configASSERT( pxCurrentTCB == NULL );
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/RXv2/port_asm.s b/portable/IAR/RXv2/port_asm.s
index c614fa7..6fe6c1d 100644
--- a/portable/IAR/RXv2/port_asm.s
+++ b/portable/IAR/RXv2/port_asm.s
@@ -1,201 +1,200 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#include "PriorityDefinitions.h"

-

-	PUBLIC _prvStartFirstTask

-	PUBLIC ___interrupt_27

-

-	EXTERN _pxCurrentTCB

-	EXTERN _vTaskSwitchContext

-

-	RSEG CODE:CODE(4)

-

-_prvStartFirstTask:

-

-		/* When starting the scheduler there is nothing that needs moving to the

-		interrupt stack because the function is not called from an interrupt.

-		Just ensure the current stack is the user stack. */

-		SETPSW		U

-

-		/* Obtain the location of the stack associated with which ever task

-		pxCurrentTCB is currently pointing to. */

-		MOV.L		#_pxCurrentTCB, R15

-		MOV.L		[R15], R15

-		MOV.L		[R15], R0

-

-		/* Restore the registers from the stack of the task pointed to by

-		pxCurrentTCB. */

-		POP			R15

-

-		/* Accumulator low 32 bits. */

-		MVTACLO		R15, A0

-		POP			R15

-

-		/* Accumulator high 32 bits. */

-		MVTACHI		R15, A0

-		POP			R15

-

-		/* Accumulator guard. */

-		MVTACGU		R15, A0

-		POP			R15

-

-		/* Accumulator low 32 bits. */

-		MVTACLO		R15, A1

-		POP			R15

-

-		/* Accumulator high 32 bits. */

-		MVTACHI		R15, A1

-		POP			R15

-

-		/* Accumulator guard. */

-		MVTACGU		R15, A1

-		POP			R15

-

-		/* Floating point status word. */

-		MVTC		R15, FPSW

-

-		/* R1 to R15 - R0 is not included as it is the SP. */

-		POPM		R1-R15

-

-		/* This pops the remaining registers. */

-		RTE

-		NOP

-		NOP

-

-/*-----------------------------------------------------------*/

-

-/* The software interrupt - overwrite the default 'weak' definition. */

-___interrupt_27:

-

-		/* Re-enable interrupts. */

-		SETPSW		I

-

-		/* Move the data that was automatically pushed onto the interrupt stack when

-		the interrupt occurred from the interrupt stack to the user stack.

-

-		R15 is saved before it is clobbered. */

-		PUSH.L		R15

-

-		/* Read the user stack pointer. */

-		MVFC		USP, R15

-

-		/* Move the address down to the data being moved. */

-		SUB		#12, R15

-		MVTC		R15, USP

-

-		/* Copy the data across, R15, then PC, then PSW. */

-		MOV.L		[ R0 ], [ R15 ]

-		MOV.L 		4[ R0 ], 4[ R15 ]

-		MOV.L		8[ R0 ], 8[ R15 ]

-

-		/* Move the interrupt stack pointer to its new correct position. */

-		ADD		#12, R0

-

-		/* All the rest of the registers are saved directly to the user stack. */

-		SETPSW		U

-

-		/* Save the rest of the general registers (R15 has been saved already). */

-		PUSHM		R1-R14

-

-		/* Save the FPSW and accumulator. */

-		MVFC		FPSW, R15

-		PUSH.L		R15

-		MVFACGU		#0, A1, R15

-		PUSH.L		R15

-		MVFACHI		#0, A1, R15

-		PUSH.L		R15

-		/* Low order word. */

-		MVFACLO		#0, A1, R15

-		PUSH.L		R15

-		MVFACGU		#0, A0, R15

-		PUSH.L		R15

-		MVFACHI		#0, A0, R15

-		PUSH.L		R15

-		/* Low order word. */

-		MVFACLO		#0, A0, R15

-		PUSH.L		R15

-

-		/* Save the stack pointer to the TCB. */

-		MOV.L		#_pxCurrentTCB, R15

-		MOV.L		[ R15 ], R15

-		MOV.L		R0, [ R15 ]

-

-		/* Ensure the interrupt mask is set to the syscall priority while the kernel

-		structures are being accessed. */

-		MVTIPL		#configMAX_SYSCALL_INTERRUPT_PRIORITY

-

-		/* Select the next task to run. */

-		BSR.A		_vTaskSwitchContext

-

-		/* Reset the interrupt mask as no more data structure access is required. */

-		MVTIPL		#configKERNEL_INTERRUPT_PRIORITY

-

-		/* Load the stack pointer of the task that is now selected as the Running

-		state task from its TCB. */

-		MOV.L		#_pxCurrentTCB,R15

-		MOV.L		[ R15 ], R15

-		MOV.L		[ R15 ], R0

-

-		/* Restore the context of the new task.  The PSW (Program Status Word) and

-		PC will be popped by the RTE instruction. */

-		POP		R15

-

-		/* Accumulator low 32 bits. */

-		MVTACLO	R15, A0

-		POP		R15

-

-		/* Accumulator high 32 bits. */

-		MVTACHI	R15, A0

-		POP		R15

-

-		/* Accumulator guard. */

-		MVTACGU	R15, A0

-		POP		R15

-

-		/* Accumulator low 32 bits. */

-		MVTACLO	R15, A1

-		POP		R15

-

-		/* Accumulator high 32 bits. */

-		MVTACHI	R15, A1

-		POP		R15

-

-		/* Accumulator guard. */

-		MVTACGU	R15, A1

-		POP		R15

-		MVTC		R15, FPSW

-		POPM		R1-R15

-		RTE

-		NOP

-		NOP

-

-/*-----------------------------------------------------------*/

-

-		END

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#include "PriorityDefinitions.h"
+
+    PUBLIC _prvStartFirstTask
+    PUBLIC ___interrupt_27
+
+    EXTERN _pxCurrentTCB
+    EXTERN _vTaskSwitchContext
+
+    RSEG CODE:CODE(4)
+
+_prvStartFirstTask:
+
+        /* When starting the scheduler there is nothing that needs moving to the
+        interrupt stack because the function is not called from an interrupt.
+        Just ensure the current stack is the user stack. */
+        SETPSW      U
+
+        /* Obtain the location of the stack associated with which ever task
+        pxCurrentTCB is currently pointing to. */
+        MOV.L       #_pxCurrentTCB, R15
+        MOV.L       [R15], R15
+        MOV.L       [R15], R0
+
+        /* Restore the registers from the stack of the task pointed to by
+        pxCurrentTCB. */
+        POP         R15
+
+        /* Accumulator low 32 bits. */
+        MVTACLO     R15, A0
+        POP         R15
+
+        /* Accumulator high 32 bits. */
+        MVTACHI     R15, A0
+        POP         R15
+
+        /* Accumulator guard. */
+        MVTACGU     R15, A0
+        POP         R15
+
+        /* Accumulator low 32 bits. */
+        MVTACLO     R15, A1
+        POP         R15
+
+        /* Accumulator high 32 bits. */
+        MVTACHI     R15, A1
+        POP         R15
+
+        /* Accumulator guard. */
+        MVTACGU     R15, A1
+        POP         R15
+
+        /* Floating point status word. */
+        MVTC        R15, FPSW
+
+        /* R1 to R15 - R0 is not included as it is the SP. */
+        POPM        R1-R15
+
+        /* This pops the remaining registers. */
+        RTE
+        NOP
+        NOP
+
+/*-----------------------------------------------------------*/
+
+/* The software interrupt - overwrite the default 'weak' definition. */
+___interrupt_27:
+
+        /* Re-enable interrupts. */
+        SETPSW      I
+
+        /* Move the data that was automatically pushed onto the interrupt stack when
+        the interrupt occurred from the interrupt stack to the user stack.
+
+        R15 is saved before it is clobbered. */
+        PUSH.L      R15
+
+        /* Read the user stack pointer. */
+        MVFC        USP, R15
+
+        /* Move the address down to the data being moved. */
+        SUB     #12, R15
+        MVTC        R15, USP
+
+        /* Copy the data across, R15, then PC, then PSW. */
+        MOV.L       [ R0 ], [ R15 ]
+        MOV.L       4[ R0 ], 4[ R15 ]
+        MOV.L       8[ R0 ], 8[ R15 ]
+
+        /* Move the interrupt stack pointer to its new correct position. */
+        ADD     #12, R0
+
+        /* All the rest of the registers are saved directly to the user stack. */
+        SETPSW      U
+
+        /* Save the rest of the general registers (R15 has been saved already). */
+        PUSHM       R1-R14
+
+        /* Save the FPSW and accumulator. */
+        MVFC        FPSW, R15
+        PUSH.L      R15
+        MVFACGU     #0, A1, R15
+        PUSH.L      R15
+        MVFACHI     #0, A1, R15
+        PUSH.L      R15
+        /* Low order word. */
+        MVFACLO     #0, A1, R15
+        PUSH.L      R15
+        MVFACGU     #0, A0, R15
+        PUSH.L      R15
+        MVFACHI     #0, A0, R15
+        PUSH.L      R15
+        /* Low order word. */
+        MVFACLO     #0, A0, R15
+        PUSH.L      R15
+
+        /* Save the stack pointer to the TCB. */
+        MOV.L       #_pxCurrentTCB, R15
+        MOV.L       [ R15 ], R15
+        MOV.L       R0, [ R15 ]
+
+        /* Ensure the interrupt mask is set to the syscall priority while the kernel
+        structures are being accessed. */
+        MVTIPL      #configMAX_SYSCALL_INTERRUPT_PRIORITY
+
+        /* Select the next task to run. */
+        BSR.A       _vTaskSwitchContext
+
+        /* Reset the interrupt mask as no more data structure access is required. */
+        MVTIPL      #configKERNEL_INTERRUPT_PRIORITY
+
+        /* Load the stack pointer of the task that is now selected as the Running
+        state task from its TCB. */
+        MOV.L       #_pxCurrentTCB,R15
+        MOV.L       [ R15 ], R15
+        MOV.L       [ R15 ], R0
+
+        /* Restore the context of the new task.  The PSW (Program Status Word) and
+        PC will be popped by the RTE instruction. */
+        POP     R15
+
+        /* Accumulator low 32 bits. */
+        MVTACLO R15, A0
+        POP     R15
+
+        /* Accumulator high 32 bits. */
+        MVTACHI R15, A0
+        POP     R15
+
+        /* Accumulator guard. */
+        MVTACGU R15, A0
+        POP     R15
+
+        /* Accumulator low 32 bits. */
+        MVTACLO R15, A1
+        POP     R15
+
+        /* Accumulator high 32 bits. */
+        MVTACHI R15, A1
+        POP     R15
+
+        /* Accumulator guard. */
+        MVTACGU R15, A1
+        POP     R15
+        MVTC        R15, FPSW
+        POPM        R1-R15
+        RTE
+        NOP
+        NOP
+
+/*-----------------------------------------------------------*/
+
+        END
diff --git a/portable/IAR/RXv2/portmacro.h b/portable/IAR/RXv2/portmacro.h
index f9c851f..07444eb 100644
--- a/portable/IAR/RXv2/portmacro.h
+++ b/portable/IAR/RXv2/portmacro.h
@@ -1,145 +1,144 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#include <intrinsics.h>

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions - these are a bit legacy and not really used now, other than

-portSTACK_TYPE and portBASE_TYPE. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		short

-#define portSTACK_TYPE	uint32_t

-#define portBASE_TYPE	long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-

-	/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

-	not need to be guarded with a critical section. */

-	#define portTICK_TYPE_IS_ATOMIC 1

-#endif

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portBYTE_ALIGNMENT			8	/* Could make four, according to manual. */

-#define portSTACK_GROWTH			-1

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portNOP()					__no_operation()

-

-/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;"

-where portITU_SWINTR is the location of the software interrupt register

-(0x000872E0).  Don't rely on the assembler to select a register, so instead

-save and restore clobbered registers manually. */

-#define portYIELD()							\

-	__asm volatile 							\

-	(										\

-		"PUSH.L	R10					\n"		\

-		"MOV.L	#0x872E0, R10		\n"		\

-		"MOV.B	#0x1, [R10]			\n"		\

-		"MOV.L	[R10], R10			\n"		\

-		"POP	R10					\n"		\

-	)

-

-#define portYIELD_FROM_ISR( x )	do { if( ( x ) != pdFALSE ) portYIELD(); } while( 0 )

-

-/* These macros should not be called directly, but through the

-taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros.  An extra check is

-performed if configASSERT() is defined to ensure an assertion handler does not

-inadvertently attempt to lower the IPL when the call to assert was triggered

-because the IPL value was found to be above	configMAX_SYSCALL_INTERRUPT_PRIORITY

-when an ISR safe FreeRTOS API function was executed.  ISR safe FreeRTOS API

-functions are those that end in FromISR.  FreeRTOS maintains a separate

-interrupt API to ensure API function and interrupt entry is as fast and as

-simple as possible. */

-#define portENABLE_INTERRUPTS() 	__set_interrupt_level( ( uint8_t ) 0 )

-#ifdef configASSERT

-	#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) )

-	#define portDISABLE_INTERRUPTS() 	if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )

-#else

-	#define portDISABLE_INTERRUPTS() 	__set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )

-#endif

-

-/* Critical nesting counts are stored in the TCB. */

-#define portCRITICAL_NESTING_IN_TCB ( 1 )

-

-/* The critical nesting functions defined within tasks.c. */

-extern void vTaskEnterCritical( void );

-extern void vTaskExitCritical( void );

-#define portENTER_CRITICAL()	vTaskEnterCritical()

-#define portEXIT_CRITICAL()		vTaskExitCritical()

-

-/* As this port allows interrupt nesting... */

-#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS()

-#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) )

-

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-/* Prevent warnings of undefined behaviour: the order of volatile accesses is

-undefined - all warnings have been manually checked and are not an issue, and

-the warnings cannot be prevent by code changes without undesirable effects. */

-#pragma diag_suppress=Pa082

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#include <intrinsics.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions - these are a bit legacy and not really used now, other than
+portSTACK_TYPE and portBASE_TYPE. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint32_t
+#define portBASE_TYPE   long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+
+    /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
+    not need to be guarded with a critical section. */
+    #define portTICK_TYPE_IS_ATOMIC 1
+#endif
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portBYTE_ALIGNMENT          8   /* Could make four, according to manual. */
+#define portSTACK_GROWTH            -1
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portNOP()                   __no_operation()
+
+/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;"
+where portITU_SWINTR is the location of the software interrupt register
+(0x000872E0).  Don't rely on the assembler to select a register, so instead
+save and restore clobbered registers manually. */
+#define portYIELD()                         \
+    __asm volatile                          \
+    (                                       \
+        "PUSH.L R10                 \n"     \
+        "MOV.L  #0x872E0, R10       \n"     \
+        "MOV.B  #0x1, [R10]         \n"     \
+        "MOV.L  [R10], R10          \n"     \
+        "POP    R10                 \n"     \
+    )
+
+#define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) portYIELD(); } while( 0 )
+
+/* These macros should not be called directly, but through the
+taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros.  An extra check is
+performed if configASSERT() is defined to ensure an assertion handler does not
+inadvertently attempt to lower the IPL when the call to assert was triggered
+because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY
+when an ISR safe FreeRTOS API function was executed.  ISR safe FreeRTOS API
+functions are those that end in FromISR.  FreeRTOS maintains a separate
+interrupt API to ensure API function and interrupt entry is as fast and as
+simple as possible. */
+#define portENABLE_INTERRUPTS()     __set_interrupt_level( ( uint8_t ) 0 )
+#ifdef configASSERT
+    #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) )
+    #define portDISABLE_INTERRUPTS()    if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )
+#else
+    #define portDISABLE_INTERRUPTS()    __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY )
+#endif
+
+/* Critical nesting counts are stored in the TCB. */
+#define portCRITICAL_NESTING_IN_TCB ( 1 )
+
+/* The critical nesting functions defined within tasks.c. */
+extern void vTaskEnterCritical( void );
+extern void vTaskExitCritical( void );
+#define portENTER_CRITICAL()    vTaskEnterCritical()
+#define portEXIT_CRITICAL()     vTaskExitCritical()
+
+/* As this port allows interrupt nesting... */
+#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS()
+#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) )
+
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+/* Prevent warnings of undefined behaviour: the order of volatile accesses is
+undefined - all warnings have been manually checked and are not an issue, and
+the warnings cannot be prevent by code changes without undesirable effects. */
+#pragma diag_suppress=Pa082
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/RXv2/readme.txt b/portable/IAR/RXv2/readme.txt
index 9e89a09..8dbc983 100644
--- a/portable/IAR/RXv2/readme.txt
+++ b/portable/IAR/RXv2/readme.txt
@@ -69,4 +69,3 @@
 For more information about Renesas RX MCUs, please visit the following URL:
 
 https://www.renesas.com/products/microcontrollers-microprocessors/rx.html
-
diff --git a/portable/IAR/STR71x/ISR_Support.h b/portable/IAR/STR71x/ISR_Support.h
index 27287d2..4651c2d 100644
--- a/portable/IAR/STR71x/ISR_Support.h
+++ b/portable/IAR/STR71x/ISR_Support.h
@@ -1,106 +1,105 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-	EXTERN pxCurrentTCB

-	EXTERN ulCriticalNesting

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Context save and restore macro definitions

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-

-portSAVE_CONTEXT MACRO

-

-	; Push R0 as we are going to use the register.

-	STMDB	SP!, {R0}

-

-	; Set R0 to point to the task stack pointer.

-	STMDB	SP, {SP}^

-	NOP

-	SUB		SP, SP, #4

-	LDMIA	SP!, {R0}

-

-	; Push the return address onto the stack.

-	STMDB	R0!, {LR}

-

-	; Now we have saved LR we can use it instead of R0.

-	MOV		LR, R0

-

-	; Pop R0 so we can save it onto the system mode stack.

-	LDMIA	SP!, {R0}

-

-	; Push all the system mode registers onto the task stack.

-	STMDB	LR, {R0-LR}^

-	NOP

-	SUB		LR, LR, #60

-

-	; Push the SPSR onto the task stack.

-	MRS		R0, SPSR

-	STMDB	LR!, {R0}

-

-	LDR		R0, =ulCriticalNesting

-	LDR		R0, [R0]

-	STMDB	LR!, {R0}

-

-	; Store the new top of stack for the task.

-	LDR		R1, =pxCurrentTCB

-	LDR		R0, [R1]

-	STR		LR, [R0]

-

-	ENDM

-

-

-portRESTORE_CONTEXT MACRO

-

-	; Set the LR to the task stack.

-	LDR		R1, =pxCurrentTCB

-	LDR		R0, [R1]

-	LDR		LR, [R0]

-

-	; The critical nesting depth is the first item on the stack.

-	; Load it into the ulCriticalNesting variable.

-	LDR		R0, =ulCriticalNesting

-	LDMFD	LR!, {R1}

-	STR		R1, [R0]

-

-	; Get the SPSR from the stack.

-	LDMFD	LR!, {R0}

-	MSR		SPSR_cxsf, R0

-

-	; Restore all system mode registers for the task.

-	LDMFD	LR, {R0-R14}^

-	NOP

-

-	; Restore the return address.

-	LDR		LR, [LR, #+60]

-

-	; And return - correcting the offset in the LR to obtain the

-	; correct address.

-	SUBS	PC, LR, #4

-

-	ENDM

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+    EXTERN pxCurrentTCB
+    EXTERN ulCriticalNesting
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Context save and restore macro definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+portSAVE_CONTEXT MACRO
+
+    ; Push R0 as we are going to use the register.
+    STMDB   SP!, {R0}
+
+    ; Set R0 to point to the task stack pointer.
+    STMDB   SP, {SP}^
+    NOP
+    SUB     SP, SP, #4
+    LDMIA   SP!, {R0}
+
+    ; Push the return address onto the stack.
+    STMDB   R0!, {LR}
+
+    ; Now we have saved LR we can use it instead of R0.
+    MOV     LR, R0
+
+    ; Pop R0 so we can save it onto the system mode stack.
+    LDMIA   SP!, {R0}
+
+    ; Push all the system mode registers onto the task stack.
+    STMDB   LR, {R0-LR}^
+    NOP
+    SUB     LR, LR, #60
+
+    ; Push the SPSR onto the task stack.
+    MRS     R0, SPSR
+    STMDB   LR!, {R0}
+
+    LDR     R0, =ulCriticalNesting
+    LDR     R0, [R0]
+    STMDB   LR!, {R0}
+
+    ; Store the new top of stack for the task.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    STR     LR, [R0]
+
+    ENDM
+
+
+portRESTORE_CONTEXT MACRO
+
+    ; Set the LR to the task stack.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    LDR     LR, [R0]
+
+    ; The critical nesting depth is the first item on the stack.
+    ; Load it into the ulCriticalNesting variable.
+    LDR     R0, =ulCriticalNesting
+    LDMFD   LR!, {R1}
+    STR     R1, [R0]
+
+    ; Get the SPSR from the stack.
+    LDMFD   LR!, {R0}
+    MSR     SPSR_cxsf, R0
+
+    ; Restore all system mode registers for the task.
+    LDMFD   LR, {R0-R14}^
+    NOP
+
+    ; Restore the return address.
+    LDR     LR, [LR, #+60]
+
+    ; And return - correcting the offset in the LR to obtain the
+    ; correct address.
+    SUBS    PC, LR, #4
+
+    ENDM
diff --git a/portable/IAR/STR71x/port.c b/portable/IAR/STR71x/port.c
index 2737353..a7530e8 100644
--- a/portable/IAR/STR71x/port.c
+++ b/portable/IAR/STR71x/port.c
@@ -1,259 +1,253 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the ST STR71x ARM7

- * port.

- *----------------------------------------------------------*/

-

-/* Library includes. */

-#include "wdg.h"

-#include "eic.h"

-

-/* Standard includes. */

-#include <stdlib.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Constants required to setup the initial stack. */

-#define portINITIAL_SPSR				( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */

-#define portTHUMB_MODE_BIT				( ( StackType_t ) 0x20 )

-#define portINSTRUCTION_SIZE			( ( StackType_t ) 4 )

-

-/* Constants required to handle critical sections. */

-#define portNO_CRITICAL_NESTING 		( ( uint32_t ) 0 )

-

-#define portMICROS_PER_SECOND 1000000

-

-/*-----------------------------------------------------------*/

-

-/* Setup the watchdog to generate the tick interrupts. */

-static void prvSetupTimerInterrupt( void );

-

-/* ulCriticalNesting will get set to zero when the first task starts.  It

-cannot be initialised to 0 as this will cause interrupts to be enabled

-during the kernel initialisation process. */

-uint32_t ulCriticalNesting = ( uint32_t ) 9999;

-

-/* Tick interrupt routines for cooperative and preemptive operation

-respectively.  The preemptive version is not defined as __irq as it is called

-from an asm wrapper function. */

-__arm __irq void vPortNonPreemptiveTick( void );

-void vPortPreemptiveTick( void );

-

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-StackType_t *pxOriginalTOS;

-

-	pxOriginalTOS = pxTopOfStack;

-

-	/* To ensure asserts in tasks.c don't fail, although in this case the assert

-	is not really required. */

-	pxTopOfStack--;

-

-	/* Setup the initial stack of the task.  The stack is set exactly as

-	expected by the portRESTORE_CONTEXT() macro. */

-

-	/* First on the stack is the return address - which in this case is the

-	start of the task.  The offset is added to make the return address appear

-	as it would within an IRQ ISR. */

-	*pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;		

-	pxTopOfStack--;

-

-	*pxTopOfStack = ( StackType_t ) 0xaaaaaaaa;	/* R14 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12121212;	/* R12 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x11111111;	/* R11 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x10101010;	/* R10 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x09090909;	/* R9 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x08080808;	/* R8 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x07070707;	/* R7 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x06060606;	/* R6 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x05050505;	/* R5 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x04040404;	/* R4 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x03030303;	/* R3 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x02020202;	/* R2 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x01010101;	/* R1 */

-	pxTopOfStack--;	

-

-	/* When the task starts is will expect to find the function parameter in

-	R0. */

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-	pxTopOfStack--;

-

-	/* The status register is set for system mode, with interrupts enabled. */

-	*pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;

-	

-	if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL )

-	{

-		/* We want the task to start in thumb mode. */

-		*pxTopOfStack |= portTHUMB_MODE_BIT;

-	}		

-	

-	pxTopOfStack--;

-

-	/* Interrupt flags cannot always be stored on the stack and will

-	instead be stored in a variable, which is then saved as part of the

-	tasks context. */

-	*pxTopOfStack = portNO_CRITICAL_NESTING;

-

-	return pxTopOfStack;	

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-extern void vPortStartFirstTask( void );

-

-	/* Start the timer that generates the tick ISR.  Interrupts are disabled

-	here already. */

-	prvSetupTimerInterrupt();

-

-	/* Start the first task. */

-	vPortStartFirstTask();	

-

-	/* Should not get here! */

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the ARM port will require this function as there

-	is nothing to return to.  */

-}

-/*-----------------------------------------------------------*/

-

-/* The cooperative scheduler requires a normal IRQ service routine to

-simply increment the system tick. */

-__arm __irq void vPortNonPreemptiveTick( void )

-{

-	/* Increment the tick count - which may wake some tasks but as the

-	preemptive scheduler is not being used any woken task is not given

-	processor time no matter what its priority. */

-	xTaskIncrementTick();

-

-	/* Clear the interrupt in the watchdog and EIC. */

-	WDG->SR = 0x0000;

-	portCLEAR_EIC();		

-}

-/*-----------------------------------------------------------*/

-

-/* This function is called from an asm wrapper, so does not require the __irq

-keyword. */

-void vPortPreemptiveTick( void )

-{

-	/* Increment the tick counter. */

-	if( xTaskIncrementTick() != pdFALSE )

-	{

-		/* Select a new task to execute. */

-		vTaskSwitchContext();

-	}

-

-	/* Clear the interrupt in the watchdog and EIC. */

-	WDG->SR = 0x0000;

-	portCLEAR_EIC();			

-}

-/*-----------------------------------------------------------*/

-

-static void prvSetupTimerInterrupt( void )

-{

-	/* Set the watchdog up to generate a periodic tick. */

-	WDG_ECITConfig( DISABLE );

-	WDG_CntOnOffConfig( DISABLE );

-	WDG_PeriodValueConfig( portMICROS_PER_SECOND / configTICK_RATE_HZ );

-

-	/* Setup the tick interrupt in the EIC. */

-	EIC_IRQChannelPriorityConfig( WDG_IRQChannel, 1 );

-	EIC_IRQChannelConfig( WDG_IRQChannel, ENABLE );

-	EIC_IRQConfig( ENABLE );

-	WDG_ECITConfig( ENABLE );

-

-	/* Start the timer - interrupts are actually disabled at this point so

-	it is safe to do this here. */

-	WDG_CntOnOffConfig( ENABLE );

-}

-/*-----------------------------------------------------------*/

-

-__arm __interwork void vPortEnterCritical( void )

-{

-	/* Disable interrupts first! */

-	__disable_interrupt();

-

-	/* Now interrupts are disabled ulCriticalNesting can be accessed

-	directly.  Increment ulCriticalNesting to keep a count of how many times

-	portENTER_CRITICAL() has been called. */

-	ulCriticalNesting++;

-}

-/*-----------------------------------------------------------*/

-

-__arm __interwork void vPortExitCritical( void )

-{

-	if( ulCriticalNesting > portNO_CRITICAL_NESTING )

-	{

-		/* Decrement the nesting count as we are leaving a critical section. */

-		ulCriticalNesting--;

-

-		/* If the nesting level has reached zero then interrupts should be

-		re-enabled. */

-		if( ulCriticalNesting == portNO_CRITICAL_NESTING )

-		{

-			__enable_interrupt();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-

-

-

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the ST STR71x ARM7
+ * port.
+ *----------------------------------------------------------*/
+
+/* Library includes. */
+#include "wdg.h"
+#include "eic.h"
+
+/* Standard includes. */
+#include <stdlib.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Constants required to setup the initial stack. */
+#define portINITIAL_SPSR                ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */
+#define portTHUMB_MODE_BIT              ( ( StackType_t ) 0x20 )
+#define portINSTRUCTION_SIZE            ( ( StackType_t ) 4 )
+
+/* Constants required to handle critical sections. */
+#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
+
+#define portMICROS_PER_SECOND 1000000
+
+/*-----------------------------------------------------------*/
+
+/* Setup the watchdog to generate the tick interrupts. */
+static void prvSetupTimerInterrupt( void );
+
+/* ulCriticalNesting will get set to zero when the first task starts.  It
+cannot be initialised to 0 as this will cause interrupts to be enabled
+during the kernel initialisation process. */
+uint32_t ulCriticalNesting = ( uint32_t ) 9999;
+
+/* Tick interrupt routines for cooperative and preemptive operation
+respectively.  The preemptive version is not defined as __irq as it is called
+from an asm wrapper function. */
+__arm __irq void vPortNonPreemptiveTick( void );
+void vPortPreemptiveTick( void );
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+StackType_t *pxOriginalTOS;
+
+    pxOriginalTOS = pxTopOfStack;
+
+    /* To ensure asserts in tasks.c don't fail, although in this case the assert
+    is not really required. */
+    pxTopOfStack--;
+
+    /* Setup the initial stack of the task.  The stack is set exactly as
+    expected by the portRESTORE_CONTEXT() macro. */
+
+    /* First on the stack is the return address - which in this case is the
+    start of the task.  The offset is added to make the return address appear
+    as it would within an IRQ ISR. */
+    *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;
+    pxTopOfStack--;
+
+    *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
+    pxTopOfStack--;
+
+    /* When the task starts is will expect to find the function parameter in
+    R0. */
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+    pxTopOfStack--;
+
+    /* The status register is set for system mode, with interrupts enabled. */
+    *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;
+
+    if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL )
+    {
+        /* We want the task to start in thumb mode. */
+        *pxTopOfStack |= portTHUMB_MODE_BIT;
+    }
+
+    pxTopOfStack--;
+
+    /* Interrupt flags cannot always be stored on the stack and will
+    instead be stored in a variable, which is then saved as part of the
+    tasks context. */
+    *pxTopOfStack = portNO_CRITICAL_NESTING;
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+extern void vPortStartFirstTask( void );
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+    here already. */
+    prvSetupTimerInterrupt();
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the ARM port will require this function as there
+    is nothing to return to.  */
+}
+/*-----------------------------------------------------------*/
+
+/* The cooperative scheduler requires a normal IRQ service routine to
+simply increment the system tick. */
+__arm __irq void vPortNonPreemptiveTick( void )
+{
+    /* Increment the tick count - which may wake some tasks but as the
+    preemptive scheduler is not being used any woken task is not given
+    processor time no matter what its priority. */
+    xTaskIncrementTick();
+
+    /* Clear the interrupt in the watchdog and EIC. */
+    WDG->SR = 0x0000;
+    portCLEAR_EIC();
+}
+/*-----------------------------------------------------------*/
+
+/* This function is called from an asm wrapper, so does not require the __irq
+keyword. */
+void vPortPreemptiveTick( void )
+{
+    /* Increment the tick counter. */
+    if( xTaskIncrementTick() != pdFALSE )
+    {
+        /* Select a new task to execute. */
+        vTaskSwitchContext();
+    }
+
+    /* Clear the interrupt in the watchdog and EIC. */
+    WDG->SR = 0x0000;
+    portCLEAR_EIC();
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupTimerInterrupt( void )
+{
+    /* Set the watchdog up to generate a periodic tick. */
+    WDG_ECITConfig( DISABLE );
+    WDG_CntOnOffConfig( DISABLE );
+    WDG_PeriodValueConfig( portMICROS_PER_SECOND / configTICK_RATE_HZ );
+
+    /* Setup the tick interrupt in the EIC. */
+    EIC_IRQChannelPriorityConfig( WDG_IRQChannel, 1 );
+    EIC_IRQChannelConfig( WDG_IRQChannel, ENABLE );
+    EIC_IRQConfig( ENABLE );
+    WDG_ECITConfig( ENABLE );
+
+    /* Start the timer - interrupts are actually disabled at this point so
+    it is safe to do this here. */
+    WDG_CntOnOffConfig( ENABLE );
+}
+/*-----------------------------------------------------------*/
+
+__arm __interwork void vPortEnterCritical( void )
+{
+    /* Disable interrupts first! */
+    __disable_interrupt();
+
+    /* Now interrupts are disabled ulCriticalNesting can be accessed
+    directly.  Increment ulCriticalNesting to keep a count of how many times
+    portENTER_CRITICAL() has been called. */
+    ulCriticalNesting++;
+}
+/*-----------------------------------------------------------*/
+
+__arm __interwork void vPortExitCritical( void )
+{
+    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
+    {
+        /* Decrement the nesting count as we are leaving a critical section. */
+        ulCriticalNesting--;
+
+        /* If the nesting level has reached zero then interrupts should be
+        re-enabled. */
+        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
+        {
+            __enable_interrupt();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/STR71x/portasm.s79 b/portable/IAR/STR71x/portasm.s79
index a4e7ad1..88acc68 100644
--- a/portable/IAR/STR71x/portasm.s79
+++ b/portable/IAR/STR71x/portasm.s79
@@ -1,77 +1,76 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-		RSEG ICODE:CODE

-		CODE32

-

-	EXTERN vPortPreemptiveTick

-	EXTERN vTaskSwitchContext

-

-	PUBLIC vPortYieldProcessor

-	PUBLIC vPortStartFirstTask

-	PUBLIC vPortPreemptiveTickISR

-

-#include "ISR_Support.h"

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Starting the first task is just a matter of restoring the context that

-; was created by pxPortInitialiseStack().

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortStartFirstTask:

-	portRESTORE_CONTEXT

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Manual context switch function.  This is the SWI hander.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortYieldProcessor:

-	ADD		LR, LR, #4			; Add 4 to the LR to make the LR appear exactly

-								; as if the context was saved during and IRQ

-								; handler.

-

-	portSAVE_CONTEXT			; Save the context of the current task...

-	LDR R0, =vTaskSwitchContext	; before selecting the next task to execute.

-	mov     lr, pc

-	BX R0

-	portRESTORE_CONTEXT			; Restore the context of the selected task.

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Preemptive context switch function.  This will only ever get used if

-; portUSE_PREEMPTION is set to 1 in portmacro.h.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortPreemptiveTickISR:

-	portSAVE_CONTEXT			; Save the context of the current task.

-

-	LDR R0, =vPortPreemptiveTick ; Increment the tick count - this may wake a task.

-	MOV lr, pc

-	BX R0

-

-	portRESTORE_CONTEXT			; Restore the context of the selected task.

-

-

-	END

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+        RSEG ICODE:CODE
+        CODE32
+
+    EXTERN vPortPreemptiveTick
+    EXTERN vTaskSwitchContext
+
+    PUBLIC vPortYieldProcessor
+    PUBLIC vPortStartFirstTask
+    PUBLIC vPortPreemptiveTickISR
+
+#include "ISR_Support.h"
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Starting the first task is just a matter of restoring the context that
+; was created by pxPortInitialiseStack().
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortStartFirstTask:
+    portRESTORE_CONTEXT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Manual context switch function.  This is the SWI hander.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortYieldProcessor:
+    ADD     LR, LR, #4          ; Add 4 to the LR to make the LR appear exactly
+                                ; as if the context was saved during and IRQ
+                                ; handler.
+
+    portSAVE_CONTEXT            ; Save the context of the current task...
+    LDR R0, =vTaskSwitchContext ; before selecting the next task to execute.
+    mov     lr, pc
+    BX R0
+    portRESTORE_CONTEXT         ; Restore the context of the selected task.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Preemptive context switch function.  This will only ever get used if
+; portUSE_PREEMPTION is set to 1 in portmacro.h.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortPreemptiveTickISR:
+    portSAVE_CONTEXT            ; Save the context of the current task.
+
+    LDR R0, =vPortPreemptiveTick ; Increment the tick count - this may wake a task.
+    MOV lr, pc
+    BX R0
+
+    portRESTORE_CONTEXT         ; Restore the context of the selected task.
+
+
+    END
diff --git a/portable/IAR/STR71x/portmacro.h b/portable/IAR/STR71x/portmacro.h
index 2dd893d..492bfb2 100644
--- a/portable/IAR/STR71x/portmacro.h
+++ b/portable/IAR/STR71x/portmacro.h
@@ -1,122 +1,120 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-#include <intrinsics.h>

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-

-/* Type definitions. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		short

-#define portSTACK_TYPE	uint32_t

-#define portBASE_TYPE	long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portBYTE_ALIGNMENT			8

-#define portYIELD()					asm ( "SWI 0" )

-#define portNOP()					asm ( "NOP" )

-/*-----------------------------------------------------------*/

-

-/* Critical section handling. */

-__arm __interwork void vPortDisableInterruptsFromThumb( void );

-__arm __interwork void vPortEnableInterruptsFromThumb( void );

-__arm __interwork void vPortEnterCritical( void );

-__arm __interwork void vPortExitCritical( void );

-

-#define portDISABLE_INTERRUPTS()	__disable_interrupt()

-#define portENABLE_INTERRUPTS()		__enable_interrupt()

-#define portENTER_CRITICAL()		vPortEnterCritical()

-#define portEXIT_CRITICAL()			vPortExitCritical()

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-#define portEND_SWITCHING_ISR( xSwitchRequired ) 	\

-{													\

-extern void vTaskSwitchContext( void );				\

-													\

-	if( xSwitchRequired ) 							\

-	{												\

-		vTaskSwitchContext();						\

-	}												\

-}

-/*-----------------------------------------------------------*/

-

-/* EIC utilities. */

-#define portEIC_CICR_ADDR		*( ( uint32_t * ) 0xFFFFF804 )

-#define portEIC_IPR_ADDR		*( ( uint32_t * ) 0xFFFFF840 )

-#define portCLEAR_EIC()			portEIC_IPR_ADDR = 0x01 << portEIC_CICR_ADDR

-

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+#include <intrinsics.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint32_t
+#define portBASE_TYPE   long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT          8
+#define portYIELD()                 asm ( "SWI 0" )
+#define portNOP()                   asm ( "NOP" )
+/*-----------------------------------------------------------*/
+
+/* Critical section handling. */
+__arm __interwork void vPortDisableInterruptsFromThumb( void );
+__arm __interwork void vPortEnableInterruptsFromThumb( void );
+__arm __interwork void vPortEnterCritical( void );
+__arm __interwork void vPortExitCritical( void );
+
+#define portDISABLE_INTERRUPTS()    __disable_interrupt()
+#define portENABLE_INTERRUPTS()     __enable_interrupt()
+#define portENTER_CRITICAL()        vPortEnterCritical()
+#define portEXIT_CRITICAL()         vPortExitCritical()
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+#define portEND_SWITCHING_ISR( xSwitchRequired )    \
+{                                                   \
+extern void vTaskSwitchContext( void );             \
+                                                    \
+    if( xSwitchRequired )                           \
+    {                                               \
+        vTaskSwitchContext();                       \
+    }                                               \
+}
+/*-----------------------------------------------------------*/
+
+/* EIC utilities. */
+#define portEIC_CICR_ADDR       *( ( uint32_t * ) 0xFFFFF804 )
+#define portEIC_IPR_ADDR        *( ( uint32_t * ) 0xFFFFF840 )
+#define portCLEAR_EIC()         portEIC_IPR_ADDR = 0x01 << portEIC_CICR_ADDR
+
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/STR75x/ISR_Support.h b/portable/IAR/STR75x/ISR_Support.h
index 27287d2..4651c2d 100644
--- a/portable/IAR/STR75x/ISR_Support.h
+++ b/portable/IAR/STR75x/ISR_Support.h
@@ -1,106 +1,105 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-	EXTERN pxCurrentTCB

-	EXTERN ulCriticalNesting

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Context save and restore macro definitions

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-

-portSAVE_CONTEXT MACRO

-

-	; Push R0 as we are going to use the register.

-	STMDB	SP!, {R0}

-

-	; Set R0 to point to the task stack pointer.

-	STMDB	SP, {SP}^

-	NOP

-	SUB		SP, SP, #4

-	LDMIA	SP!, {R0}

-

-	; Push the return address onto the stack.

-	STMDB	R0!, {LR}

-

-	; Now we have saved LR we can use it instead of R0.

-	MOV		LR, R0

-

-	; Pop R0 so we can save it onto the system mode stack.

-	LDMIA	SP!, {R0}

-

-	; Push all the system mode registers onto the task stack.

-	STMDB	LR, {R0-LR}^

-	NOP

-	SUB		LR, LR, #60

-

-	; Push the SPSR onto the task stack.

-	MRS		R0, SPSR

-	STMDB	LR!, {R0}

-

-	LDR		R0, =ulCriticalNesting

-	LDR		R0, [R0]

-	STMDB	LR!, {R0}

-

-	; Store the new top of stack for the task.

-	LDR		R1, =pxCurrentTCB

-	LDR		R0, [R1]

-	STR		LR, [R0]

-

-	ENDM

-

-

-portRESTORE_CONTEXT MACRO

-

-	; Set the LR to the task stack.

-	LDR		R1, =pxCurrentTCB

-	LDR		R0, [R1]

-	LDR		LR, [R0]

-

-	; The critical nesting depth is the first item on the stack.

-	; Load it into the ulCriticalNesting variable.

-	LDR		R0, =ulCriticalNesting

-	LDMFD	LR!, {R1}

-	STR		R1, [R0]

-

-	; Get the SPSR from the stack.

-	LDMFD	LR!, {R0}

-	MSR		SPSR_cxsf, R0

-

-	; Restore all system mode registers for the task.

-	LDMFD	LR, {R0-R14}^

-	NOP

-

-	; Restore the return address.

-	LDR		LR, [LR, #+60]

-

-	; And return - correcting the offset in the LR to obtain the

-	; correct address.

-	SUBS	PC, LR, #4

-

-	ENDM

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+    EXTERN pxCurrentTCB
+    EXTERN ulCriticalNesting
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Context save and restore macro definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+portSAVE_CONTEXT MACRO
+
+    ; Push R0 as we are going to use the register.
+    STMDB   SP!, {R0}
+
+    ; Set R0 to point to the task stack pointer.
+    STMDB   SP, {SP}^
+    NOP
+    SUB     SP, SP, #4
+    LDMIA   SP!, {R0}
+
+    ; Push the return address onto the stack.
+    STMDB   R0!, {LR}
+
+    ; Now we have saved LR we can use it instead of R0.
+    MOV     LR, R0
+
+    ; Pop R0 so we can save it onto the system mode stack.
+    LDMIA   SP!, {R0}
+
+    ; Push all the system mode registers onto the task stack.
+    STMDB   LR, {R0-LR}^
+    NOP
+    SUB     LR, LR, #60
+
+    ; Push the SPSR onto the task stack.
+    MRS     R0, SPSR
+    STMDB   LR!, {R0}
+
+    LDR     R0, =ulCriticalNesting
+    LDR     R0, [R0]
+    STMDB   LR!, {R0}
+
+    ; Store the new top of stack for the task.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    STR     LR, [R0]
+
+    ENDM
+
+
+portRESTORE_CONTEXT MACRO
+
+    ; Set the LR to the task stack.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    LDR     LR, [R0]
+
+    ; The critical nesting depth is the first item on the stack.
+    ; Load it into the ulCriticalNesting variable.
+    LDR     R0, =ulCriticalNesting
+    LDMFD   LR!, {R1}
+    STR     R1, [R0]
+
+    ; Get the SPSR from the stack.
+    LDMFD   LR!, {R0}
+    MSR     SPSR_cxsf, R0
+
+    ; Restore all system mode registers for the task.
+    LDMFD   LR, {R0-R14}^
+    NOP
+
+    ; Restore the return address.
+    LDR     LR, [LR, #+60]
+
+    ; And return - correcting the offset in the LR to obtain the
+    ; correct address.
+    SUBS    PC, LR, #4
+
+    ENDM
diff --git a/portable/IAR/STR75x/port.c b/portable/IAR/STR75x/port.c
index 7c72abf..4286a32 100644
--- a/portable/IAR/STR75x/port.c
+++ b/portable/IAR/STR75x/port.c
@@ -1,238 +1,232 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the ST STR75x ARM7

- * port.

- *----------------------------------------------------------*/

-

-/* Library includes. */

-#include "75x_tb.h"

-#include "75x_eic.h"

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Constants required to setup the initial stack. */

-#define portINITIAL_SPSR				( ( StackType_t ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */

-#define portINSTRUCTION_SIZE			( ( StackType_t ) 4 )

-

-/* Constants required to handle critical sections. */

-#define portNO_CRITICAL_NESTING 		( ( uint32_t ) 0 )

-

-/* Prescale used on the timer clock when calculating the tick period. */

-#define portPRESCALE 20

-

-

-/*-----------------------------------------------------------*/

-

-/* Setup the TB to generate the tick interrupts. */

-static void prvSetupTimerInterrupt( void );

-

-/* ulCriticalNesting will get set to zero when the first task starts.  It

-cannot be initialised to 0 as this will cause interrupts to be enabled

-during the kernel initialisation process. */

-uint32_t ulCriticalNesting = ( uint32_t ) 9999;

-

-/* Tick interrupt routines for preemptive operation. */

-__arm void vPortPreemptiveTick( void );

-

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-StackType_t *pxOriginalTOS;

-

-	pxOriginalTOS = pxTopOfStack;

-

-	/* To ensure asserts in tasks.c don't fail, although in this case the assert

-	is not really required. */

-	pxTopOfStack--;

-

-	/* Setup the initial stack of the task.  The stack is set exactly as

-	expected by the portRESTORE_CONTEXT() macro. */

-

-	/* First on the stack is the return address - which in this case is the

-	start of the task.  The offset is added to make the return address appear

-	as it would within an IRQ ISR. */

-	*pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;		

-	pxTopOfStack--;

-

-	*pxTopOfStack = ( StackType_t ) 0xaaaaaaaa;	/* R14 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12121212;	/* R12 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x11111111;	/* R11 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x10101010;	/* R10 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x09090909;	/* R9 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x08080808;	/* R8 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x07070707;	/* R7 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x06060606;	/* R6 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x05050505;	/* R5 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x04040404;	/* R4 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x03030303;	/* R3 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x02020202;	/* R2 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x01010101;	/* R1 */

-	pxTopOfStack--;	

-

-	/* When the task starts is will expect to find the function parameter in

-	R0. */

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-	pxTopOfStack--;

-

-	/* The status register is set for system mode, with interrupts enabled. */

-	*pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;

-	pxTopOfStack--;

-

-	/* Interrupt flags cannot always be stored on the stack and will

-	instead be stored in a variable, which is then saved as part of the

-	tasks context. */

-	*pxTopOfStack = portNO_CRITICAL_NESTING;

-

-	return pxTopOfStack;	

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-extern void vPortStartFirstTask( void );

-

-	/* Start the timer that generates the tick ISR.  Interrupts are disabled

-	here already. */

-	prvSetupTimerInterrupt();

-

-	/* Start the first task. */

-	vPortStartFirstTask();	

-

-	/* Should not get here! */

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the ARM port will require this function as there

-	is nothing to return to.  */

-}

-/*-----------------------------------------------------------*/

-

-__arm void vPortPreemptiveTick( void )

-{

-	/* Increment the tick counter. */

-	if( xTaskIncrementTick() != pdFALSE )

-	{

-		/* Select a new task to execute. */

-		vTaskSwitchContext();

-	}

-		

-	TB_ClearITPendingBit( TB_IT_Update );

-}

-/*-----------------------------------------------------------*/

-

-static void prvSetupTimerInterrupt( void )

-{

-EIC_IRQInitTypeDef  EIC_IRQInitStructure;	

-TB_InitTypeDef      TB_InitStructure;

-

-	/* Setup the EIC for the TB. */

-	EIC_IRQInitStructure.EIC_IRQChannelCmd = ENABLE;

-	EIC_IRQInitStructure.EIC_IRQChannel = TB_IRQChannel;

-	EIC_IRQInitStructure.EIC_IRQChannelPriority = 1;

-	EIC_IRQInit(&EIC_IRQInitStructure);

-	

-	/* Setup the TB for the generation of the tick interrupt. */

-	TB_InitStructure.TB_Mode = TB_Mode_Timing;

-	TB_InitStructure.TB_CounterMode = TB_CounterMode_Down;

-	TB_InitStructure.TB_Prescaler = portPRESCALE - 1;

-	TB_InitStructure.TB_AutoReload = ( ( configCPU_CLOCK_HZ / portPRESCALE ) / configTICK_RATE_HZ );

-	TB_Init(&TB_InitStructure);

-	

-	/* Enable TB Update interrupt */

-	TB_ITConfig(TB_IT_Update, ENABLE);

-

-	/* Clear TB Update interrupt pending bit */

-	TB_ClearITPendingBit(TB_IT_Update);

-

-	/* Enable TB */

-	TB_Cmd(ENABLE);

-}

-/*-----------------------------------------------------------*/

-

-__arm __interwork void vPortEnterCritical( void )

-{

-	/* Disable interrupts first! */

-	__disable_interrupt();

-

-	/* Now interrupts are disabled ulCriticalNesting can be accessed

-	directly.  Increment ulCriticalNesting to keep a count of how many times

-	portENTER_CRITICAL() has been called. */

-	ulCriticalNesting++;

-}

-/*-----------------------------------------------------------*/

-

-__arm __interwork void vPortExitCritical( void )

-{

-	if( ulCriticalNesting > portNO_CRITICAL_NESTING )

-	{

-		/* Decrement the nesting count as we are leaving a critical section. */

-		ulCriticalNesting--;

-

-		/* If the nesting level has reached zero then interrupts should be

-		re-enabled. */

-		if( ulCriticalNesting == portNO_CRITICAL_NESTING )

-		{

-			__enable_interrupt();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-

-

-

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the ST STR75x ARM7
+ * port.
+ *----------------------------------------------------------*/
+
+/* Library includes. */
+#include "75x_tb.h"
+#include "75x_eic.h"
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Constants required to setup the initial stack. */
+#define portINITIAL_SPSR                ( ( StackType_t ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */
+#define portINSTRUCTION_SIZE            ( ( StackType_t ) 4 )
+
+/* Constants required to handle critical sections. */
+#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
+
+/* Prescale used on the timer clock when calculating the tick period. */
+#define portPRESCALE 20
+
+
+/*-----------------------------------------------------------*/
+
+/* Setup the TB to generate the tick interrupts. */
+static void prvSetupTimerInterrupt( void );
+
+/* ulCriticalNesting will get set to zero when the first task starts.  It
+cannot be initialised to 0 as this will cause interrupts to be enabled
+during the kernel initialisation process. */
+uint32_t ulCriticalNesting = ( uint32_t ) 9999;
+
+/* Tick interrupt routines for preemptive operation. */
+__arm void vPortPreemptiveTick( void );
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+StackType_t *pxOriginalTOS;
+
+    pxOriginalTOS = pxTopOfStack;
+
+    /* To ensure asserts in tasks.c don't fail, although in this case the assert
+    is not really required. */
+    pxTopOfStack--;
+
+    /* Setup the initial stack of the task.  The stack is set exactly as
+    expected by the portRESTORE_CONTEXT() macro. */
+
+    /* First on the stack is the return address - which in this case is the
+    start of the task.  The offset is added to make the return address appear
+    as it would within an IRQ ISR. */
+    *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;
+    pxTopOfStack--;
+
+    *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
+    pxTopOfStack--;
+
+    /* When the task starts is will expect to find the function parameter in
+    R0. */
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+    pxTopOfStack--;
+
+    /* The status register is set for system mode, with interrupts enabled. */
+    *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;
+    pxTopOfStack--;
+
+    /* Interrupt flags cannot always be stored on the stack and will
+    instead be stored in a variable, which is then saved as part of the
+    tasks context. */
+    *pxTopOfStack = portNO_CRITICAL_NESTING;
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+extern void vPortStartFirstTask( void );
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+    here already. */
+    prvSetupTimerInterrupt();
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the ARM port will require this function as there
+    is nothing to return to.  */
+}
+/*-----------------------------------------------------------*/
+
+__arm void vPortPreemptiveTick( void )
+{
+    /* Increment the tick counter. */
+    if( xTaskIncrementTick() != pdFALSE )
+    {
+        /* Select a new task to execute. */
+        vTaskSwitchContext();
+    }
+
+    TB_ClearITPendingBit( TB_IT_Update );
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupTimerInterrupt( void )
+{
+EIC_IRQInitTypeDef  EIC_IRQInitStructure;
+TB_InitTypeDef      TB_InitStructure;
+
+    /* Setup the EIC for the TB. */
+    EIC_IRQInitStructure.EIC_IRQChannelCmd = ENABLE;
+    EIC_IRQInitStructure.EIC_IRQChannel = TB_IRQChannel;
+    EIC_IRQInitStructure.EIC_IRQChannelPriority = 1;
+    EIC_IRQInit(&EIC_IRQInitStructure);
+
+    /* Setup the TB for the generation of the tick interrupt. */
+    TB_InitStructure.TB_Mode = TB_Mode_Timing;
+    TB_InitStructure.TB_CounterMode = TB_CounterMode_Down;
+    TB_InitStructure.TB_Prescaler = portPRESCALE - 1;
+    TB_InitStructure.TB_AutoReload = ( ( configCPU_CLOCK_HZ / portPRESCALE ) / configTICK_RATE_HZ );
+    TB_Init(&TB_InitStructure);
+
+    /* Enable TB Update interrupt */
+    TB_ITConfig(TB_IT_Update, ENABLE);
+
+    /* Clear TB Update interrupt pending bit */
+    TB_ClearITPendingBit(TB_IT_Update);
+
+    /* Enable TB */
+    TB_Cmd(ENABLE);
+}
+/*-----------------------------------------------------------*/
+
+__arm __interwork void vPortEnterCritical( void )
+{
+    /* Disable interrupts first! */
+    __disable_interrupt();
+
+    /* Now interrupts are disabled ulCriticalNesting can be accessed
+    directly.  Increment ulCriticalNesting to keep a count of how many times
+    portENTER_CRITICAL() has been called. */
+    ulCriticalNesting++;
+}
+/*-----------------------------------------------------------*/
+
+__arm __interwork void vPortExitCritical( void )
+{
+    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
+    {
+        /* Decrement the nesting count as we are leaving a critical section. */
+        ulCriticalNesting--;
+
+        /* If the nesting level has reached zero then interrupts should be
+        re-enabled. */
+        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
+        {
+            __enable_interrupt();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/STR75x/portasm.s79 b/portable/IAR/STR75x/portasm.s79
index c4751f9..9427da1 100644
--- a/portable/IAR/STR75x/portasm.s79
+++ b/portable/IAR/STR75x/portasm.s79
@@ -1,64 +1,63 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-

-	RSEG ICODE:CODE

-	CODE32

-

-	EXTERN vPortPreemptiveTick

-	EXTERN vTaskSwitchContext

-

-	PUBLIC vPortYieldProcessor

-	PUBLIC vPortStartFirstTask

-

-#include "ISR_Support.h"

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Starting the first task is just a matter of restoring the context that

-; was created by pxPortInitialiseStack().

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortStartFirstTask:

-	portRESTORE_CONTEXT

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Manual context switch function.  This is the SWI hander.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortYieldProcessor:

-	ADD		LR, LR, #4			; Add 4 to the LR to make the LR appear exactly

-								; as if the context was saved during and IRQ

-								; handler.

-

-	portSAVE_CONTEXT			; Save the context of the current task...

-	LDR R0, =vTaskSwitchContext	; before selecting the next task to execute.

-	mov     lr, pc

-	BX R0

-	portRESTORE_CONTEXT			; Restore the context of the selected task.

-

-

-

-	END

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+
+    RSEG ICODE:CODE
+    CODE32
+
+    EXTERN vPortPreemptiveTick
+    EXTERN vTaskSwitchContext
+
+    PUBLIC vPortYieldProcessor
+    PUBLIC vPortStartFirstTask
+
+#include "ISR_Support.h"
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Starting the first task is just a matter of restoring the context that
+; was created by pxPortInitialiseStack().
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortStartFirstTask:
+    portRESTORE_CONTEXT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Manual context switch function.  This is the SWI hander.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortYieldProcessor:
+    ADD     LR, LR, #4          ; Add 4 to the LR to make the LR appear exactly
+                                ; as if the context was saved during and IRQ
+                                ; handler.
+
+    portSAVE_CONTEXT            ; Save the context of the current task...
+    LDR R0, =vTaskSwitchContext ; before selecting the next task to execute.
+    mov     lr, pc
+    BX R0
+    portRESTORE_CONTEXT         ; Restore the context of the selected task.
+
+
+
+    END
diff --git a/portable/IAR/STR75x/portmacro.h b/portable/IAR/STR75x/portmacro.h
index 5b45dd8..b852c64 100644
--- a/portable/IAR/STR75x/portmacro.h
+++ b/portable/IAR/STR75x/portmacro.h
@@ -1,113 +1,111 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-#include <intrinsics.h>

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/* Type definitions. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		short

-#define portSTACK_TYPE	uint32_t

-#define portBASE_TYPE	long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portBYTE_ALIGNMENT			8

-#define portYIELD()					asm ( "SWI 0" )

-#define portNOP()					asm ( "NOP" )

-/*-----------------------------------------------------------*/

-

-/* Critical section handling. */

-__arm __interwork void vPortEnterCritical( void );

-__arm __interwork void vPortExitCritical( void );

-

-#define portDISABLE_INTERRUPTS()	__disable_interrupt()

-#define portENABLE_INTERRUPTS()		__enable_interrupt()

-#define portENTER_CRITICAL()		vPortEnterCritical()

-#define portEXIT_CRITICAL()			vPortExitCritical()

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-#define portEND_SWITCHING_ISR( xSwitchRequired ) 	\

-{													\

-extern void vTaskSwitchContext( void );				\

-													\

-	if( xSwitchRequired ) 							\

-	{												\

-		vTaskSwitchContext();						\

-	}												\

-}

-/*-----------------------------------------------------------*/

-

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+#include <intrinsics.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  uint32_t
+#define portBASE_TYPE   long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT          8
+#define portYIELD()                 asm ( "SWI 0" )
+#define portNOP()                   asm ( "NOP" )
+/*-----------------------------------------------------------*/
+
+/* Critical section handling. */
+__arm __interwork void vPortEnterCritical( void );
+__arm __interwork void vPortExitCritical( void );
+
+#define portDISABLE_INTERRUPTS()    __disable_interrupt()
+#define portENABLE_INTERRUPTS()     __enable_interrupt()
+#define portENTER_CRITICAL()        vPortEnterCritical()
+#define portEXIT_CRITICAL()         vPortExitCritical()
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+#define portEND_SWITCHING_ISR( xSwitchRequired )    \
+{                                                   \
+extern void vTaskSwitchContext( void );             \
+                                                    \
+    if( xSwitchRequired )                           \
+    {                                               \
+        vTaskSwitchContext();                       \
+    }                                               \
+}
+/*-----------------------------------------------------------*/
+
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/STR91x/ISR_Support.h b/portable/IAR/STR91x/ISR_Support.h
index 06019c0..5142c7c 100644
--- a/portable/IAR/STR91x/ISR_Support.h
+++ b/portable/IAR/STR91x/ISR_Support.h
@@ -1,106 +1,105 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-	EXTERN pxCurrentTCB

-	EXTERN ulCriticalNesting

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Context save and restore macro definitions

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-

-portSAVE_CONTEXT MACRO

-

-	; Push R0 as we are going to use the register. 					

-	STMDB	SP!, {R0}

-

-	; Set R0 to point to the task stack pointer. 					

-	STMDB	SP, {SP}^

-	NOP

-	SUB		SP, SP, #4

-	LDMIA	SP!, {R0}

-

-	; Push the return address onto the stack. 						

-	STMDB	R0!, {LR}

-

-	; Now we have saved LR we can use it instead of R0. 				

-	MOV		LR, R0

-

-	; Pop R0 so we can save it onto the system mode stack. 			

-	LDMIA	SP!, {R0}

-

-	; Push all the system mode registers onto the task stack. 		

-	STMDB	LR, {R0-LR}^

-	NOP

-	SUB		LR, LR, #60

-

-	; Push the SPSR onto the task stack. 							

-	MRS		R0, SPSR

-	STMDB	LR!, {R0}

-

-	LDR		R0, =ulCriticalNesting 

-	LDR		R0, [R0]

-	STMDB	LR!, {R0}

-

-	; Store the new top of stack for the task. 						

-	LDR		R1, =pxCurrentTCB

-	LDR		R0, [R1]

-	STR		LR, [R0]

-

-	ENDM

-

-

-portRESTORE_CONTEXT MACRO

-

-	; Set the LR to the task stack. 									

-	LDR		R1, =pxCurrentTCB

-	LDR		R0, [R1]

-	LDR		LR, [R0]

-

-	; The critical nesting depth is the first item on the stack. 	

-	; Load it into the ulCriticalNesting variable. 					

-	LDR		R0, =ulCriticalNesting

-	LDMFD	LR!, {R1}

-	STR		R1, [R0]

-

-	; Get the SPSR from the stack. 									

-	LDMFD	LR!, {R0}

-	MSR		SPSR_cxsf, R0

-

-	; Restore all system mode registers for the task. 				

-	LDMFD	LR, {R0-R14}^

-	NOP

-

-	; Restore the return address. 									

-	LDR		LR, [LR, #+60]

-

-	; And return - correcting the offset in the LR to obtain the 	

-	; correct address. 												

-	SUBS	PC, LR, #4

-

-	ENDM

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+    EXTERN pxCurrentTCB
+    EXTERN ulCriticalNesting
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Context save and restore macro definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+portSAVE_CONTEXT MACRO
+
+    ; Push R0 as we are going to use the register.
+    STMDB   SP!, {R0}
+
+    ; Set R0 to point to the task stack pointer.
+    STMDB   SP, {SP}^
+    NOP
+    SUB     SP, SP, #4
+    LDMIA   SP!, {R0}
+
+    ; Push the return address onto the stack.
+    STMDB   R0!, {LR}
+
+    ; Now we have saved LR we can use it instead of R0.
+    MOV     LR, R0
+
+    ; Pop R0 so we can save it onto the system mode stack.
+    LDMIA   SP!, {R0}
+
+    ; Push all the system mode registers onto the task stack.
+    STMDB   LR, {R0-LR}^
+    NOP
+    SUB     LR, LR, #60
+
+    ; Push the SPSR onto the task stack.
+    MRS     R0, SPSR
+    STMDB   LR!, {R0}
+
+    LDR     R0, =ulCriticalNesting
+    LDR     R0, [R0]
+    STMDB   LR!, {R0}
+
+    ; Store the new top of stack for the task.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    STR     LR, [R0]
+
+    ENDM
+
+
+portRESTORE_CONTEXT MACRO
+
+    ; Set the LR to the task stack.
+    LDR     R1, =pxCurrentTCB
+    LDR     R0, [R1]
+    LDR     LR, [R0]
+
+    ; The critical nesting depth is the first item on the stack.
+    ; Load it into the ulCriticalNesting variable.
+    LDR     R0, =ulCriticalNesting
+    LDMFD   LR!, {R1}
+    STR     R1, [R0]
+
+    ; Get the SPSR from the stack.
+    LDMFD   LR!, {R0}
+    MSR     SPSR_cxsf, R0
+
+    ; Restore all system mode registers for the task.
+    LDMFD   LR, {R0-R14}^
+    NOP
+
+    ; Restore the return address.
+    LDR     LR, [LR, #+60]
+
+    ; And return - correcting the offset in the LR to obtain the
+    ; correct address.
+    SUBS    PC, LR, #4
+
+    ENDM
diff --git a/portable/IAR/STR91x/port.c b/portable/IAR/STR91x/port.c
index bc7d6c8..8a089e2 100644
--- a/portable/IAR/STR91x/port.c
+++ b/portable/IAR/STR91x/port.c
@@ -1,422 +1,417 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the ST STR91x ARM9

- * port.

- *----------------------------------------------------------*/

-

-/* Library includes. */

-#include "91x_lib.h"

-

-/* Standard includes. */

-#include <stdlib.h>

-#include <assert.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-#ifndef configUSE_WATCHDOG_TICK

-	#error configUSE_WATCHDOG_TICK must be set to either 1 or 0 in FreeRTOSConfig.h to use either the Watchdog or timer 2 to generate the tick interrupt respectively.

-#endif

-

-/* Constants required to setup the initial stack. */

-#ifndef _RUN_TASK_IN_ARM_MODE_

-	#define portINITIAL_SPSR			( ( StackType_t ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */

-#else

-	#define portINITIAL_SPSR 			( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */

-#endif

-

-#define portINSTRUCTION_SIZE			( ( StackType_t ) 4 )

-

-/* Constants required to handle critical sections. */

-#define portNO_CRITICAL_NESTING 		( ( uint32_t ) 0 )

-

-#ifndef abs

-	#define abs(x) ((x)>0 ? (x) : -(x))

-#endif

-

-/**

- * Toggle a led using the following algorithm:

- * if ( GPIO_ReadBit(GPIO9, GPIO_Pin_2) )

- * {

- *   GPIO_WriteBit( GPIO9, GPIO_Pin_2, Bit_RESET );

- * }

- * else

- * {

- *   GPIO_WriteBit( GPIO9, GPIO_Pin_2, Bit_RESET );

- * }

- *

- */

-#define TOGGLE_LED(port,pin) 									\

-	if ( ((((port)->DR[(pin)<<2])) & (pin)) != Bit_RESET ) 		\

-	{															\

-    	(port)->DR[(pin) <<2] = 0x00;							\

-  	}															\

-  	else														\

-	{															\

-    	(port)->DR[(pin) <<2] = (pin);							\

-  	}

-

-

-/*-----------------------------------------------------------*/

-

-/* Setup the watchdog to generate the tick interrupts. */

-static void prvSetupTimerInterrupt( void );

-

-/* ulCriticalNesting will get set to zero when the first task starts.  It

-cannot be initialised to 0 as this will cause interrupts to be enabled

-during the kernel initialisation process. */

-uint32_t ulCriticalNesting = ( uint32_t ) 9999;

-

-/* Tick interrupt routines for cooperative and preemptive operation

-respectively.  The preemptive version is not defined as __irq as it is called

-from an asm wrapper function. */

-void WDG_IRQHandler( void );

-

-/* VIC interrupt default handler. */

-static void prvDefaultHandler( void );

-

-#if configUSE_WATCHDOG_TICK == 0

-	/* Used to update the OCR timer register */

-	static u16 s_nPulseLength;

-#endif

-

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the stack of a task to look exactly as if a call to

- * portSAVE_CONTEXT had been called.

- *

- * See header file for description.

- */

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-	StackType_t *pxOriginalTOS;

-

-	pxOriginalTOS = pxTopOfStack;

-

-	/* To ensure asserts in tasks.c don't fail, although in this case the assert

-	is not really required. */

-	pxTopOfStack--;

-

-	/* Setup the initial stack of the task.  The stack is set exactly as

-	expected by the portRESTORE_CONTEXT() macro. */

-

-	/* First on the stack is the return address - which in this case is the

-	start of the task.  The offset is added to make the return address appear

-	as it would within an IRQ ISR. */

-	*pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;		

-	pxTopOfStack--;

-

-	*pxTopOfStack = ( StackType_t ) 0xaaaaaaaa;	/* R14 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12121212;	/* R12 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x11111111;	/* R11 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x10101010;	/* R10 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x09090909;	/* R9 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x08080808;	/* R8 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x07070707;	/* R7 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x06060606;	/* R6 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x05050505;	/* R5 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x04040404;	/* R4 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x03030303;	/* R3 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x02020202;	/* R2 */

-	pxTopOfStack--;	

-	*pxTopOfStack = ( StackType_t ) 0x01010101;	/* R1 */

-	pxTopOfStack--;	

-

-	/* When the task starts is will expect to find the function parameter in

-	R0. */

-	*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

-	pxTopOfStack--;

-

-	/* The status register is set for system mode, with interrupts enabled. */

-	*pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;

-	pxTopOfStack--;

-

-	/* Interrupt flags cannot always be stored on the stack and will

-	instead be stored in a variable, which is then saved as part of the

-	tasks context. */

-	*pxTopOfStack = portNO_CRITICAL_NESTING;

-

-	return pxTopOfStack;	

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-extern void vPortStartFirstTask( void );

-

-	/* Start the timer that generates the tick ISR.  Interrupts are disabled

-	here already. */

-	prvSetupTimerInterrupt();

-

-	/* Start the first task. */

-	vPortStartFirstTask();	

-

-	/* Should not get here! */

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the ARM port will require this function as there

-	is nothing to return to.  */

-}

-/*-----------------------------------------------------------*/

-

-/* This function is called from an asm wrapper, so does not require the __irq

-keyword. */

-#if configUSE_WATCHDOG_TICK == 1

-

-	static void prvFindFactors(u32 n, u16 *a, u32 *b)

-	{

-		/* This function is copied from the ST STR7 library and is

-		copyright STMicroelectronics.  Reproduced with permission. */

-	

-		u32 b0;

-		u16 a0;

-		int32_t err, err_min=n;

-	

-		*a = a0 = ((n-1)/65536ul) + 1;

-		*b = b0 = n / *a;

-	

-		for (; *a <= 256; (*a)++)

-		{

-			*b = n / *a;

-			err = (int32_t)*a * (int32_t)*b - (int32_t)n;

-			if (abs(err) > (*a / 2))

-			{

-				(*b)++;

-				err = (int32_t)*a * (int32_t)*b - (int32_t)n;

-			}

-			if (abs(err) < abs(err_min))

-			{

-				err_min = err;

-				a0 = *a;

-				b0 = *b;

-				if (err == 0) break;

-			}

-		}

-	

-		*a = a0;

-		*b = b0;

-	}

-	/*-----------------------------------------------------------*/

-

-	static void prvSetupTimerInterrupt( void )

-	{

-	WDG_InitTypeDef xWdg;

-	uint16_t a;

-	uint32_t n = configCPU_PERIPH_HZ / configTICK_RATE_HZ, b;

-	

-		/* Configure the watchdog as a free running timer that generates a

-		periodic interrupt. */

-	

-		SCU_APBPeriphClockConfig( __WDG, ENABLE );

-		WDG_DeInit();

-		WDG_StructInit(&xWdg);

-		prvFindFactors( n, &a, &b );

-		xWdg.WDG_Prescaler = a - 1;

-		xWdg.WDG_Preload = b - 1;

-		WDG_Init( &xWdg );

-		WDG_ITConfig(ENABLE);

-		

-		/* Configure the VIC for the WDG interrupt. */

-		VIC_Config( WDG_ITLine, VIC_IRQ, 10 );

-		VIC_ITCmd( WDG_ITLine, ENABLE );

-		

-		/* Install the default handlers for both VIC's. */

-		VIC0->DVAR = ( uint32_t ) prvDefaultHandler;

-		VIC1->DVAR = ( uint32_t ) prvDefaultHandler;

-		

-		WDG_Cmd(ENABLE);

-	}

-	/*-----------------------------------------------------------*/

-

-	void WDG_IRQHandler( void )

-	{

-		{

-			/* Increment the tick counter. */

-			if( xTaskIncrementTick() != pdFALSE )

-			{		

-				/* Select a new task to execute. */

-				vTaskSwitchContext();

-			}

-		

-			/* Clear the interrupt in the watchdog. */

-			WDG->SR &= ~0x0001;

-		}

-	}

-

-#else

-

-	static void prvFindFactors(u32 n, u8 *a, u16 *b)

-	{

-		/* This function is copied from the ST STR7 library and is

-		copyright STMicroelectronics.  Reproduced with permission. */

-	

-		u16 b0;

-		u8 a0;

-		int32_t err, err_min=n;

-	

-	

-		*a = a0 = ((n-1)/256) + 1;

-		*b = b0 = n / *a;

-	

-		for (; *a <= 256; (*a)++)

-		{

-			*b = n / *a;

-			err = (int32_t)*a * (int32_t)*b - (int32_t)n;

-			if (abs(err) > (*a / 2))

-			{

-				(*b)++;

-				err = (int32_t)*a * (int32_t)*b - (int32_t)n;

-			}

-			if (abs(err) < abs(err_min))

-			{

-				err_min = err;

-				a0 = *a;

-				b0 = *b;

-				if (err == 0) break;

-			}

-		}

-	

-		*a = a0;

-		*b = b0;

-	}

-	/*-----------------------------------------------------------*/

-

-	static void prvSetupTimerInterrupt( void )

-	{

-		uint8_t a;

-		uint16_t b;

-		uint32_t n = configCPU_PERIPH_HZ / configTICK_RATE_HZ;

-		

-		TIM_InitTypeDef timer;

-		

-		SCU_APBPeriphClockConfig( __TIM23, ENABLE );

-		TIM_DeInit(TIM2);

-		TIM_StructInit(&timer);

-		prvFindFactors( n, &a, &b );

-		

-		timer.TIM_Mode           = TIM_OCM_CHANNEL_1;

-		timer.TIM_OC1_Modes      = TIM_TIMING;

-		timer.TIM_Clock_Source   = TIM_CLK_APB;

-		timer.TIM_Clock_Edge     = TIM_CLK_EDGE_RISING;

-		timer.TIM_Prescaler      = a-1;

-		timer.TIM_Pulse_Level_1  = TIM_HIGH;

-		timer.TIM_Pulse_Length_1 = s_nPulseLength  = b-1;

-		

-		TIM_Init (TIM2, &timer);

-		TIM_ITConfig(TIM2, TIM_IT_OC1, ENABLE);

-		/* Configure the VIC for the WDG interrupt. */

-		VIC_Config( TIM2_ITLine, VIC_IRQ, 10 );

-		VIC_ITCmd( TIM2_ITLine, ENABLE );

-		

-		/* Install the default handlers for both VIC's. */

-		VIC0->DVAR = ( uint32_t ) prvDefaultHandler;

-		VIC1->DVAR = ( uint32_t ) prvDefaultHandler;

-		

-		TIM_CounterCmd(TIM2, TIM_CLEAR);

-		TIM_CounterCmd(TIM2, TIM_START);

-	}

-	/*-----------------------------------------------------------*/

-

-	void TIM2_IRQHandler( void )

-	{

-		/* Reset the timer counter to avioid overflow. */

-		TIM2->OC1R += s_nPulseLength;

-		

-		/* Increment the tick counter. */

-		if( xTaskIncrementTick() != pdFALSE )

-		{

-			/* Select a new task to run. */

-			vTaskSwitchContext();

-		}

-		

-		/* Clear the interrupt in the watchdog. */

-		TIM2->SR &= ~TIM_FLAG_OC1;

-	}

-

-#endif /* USE_WATCHDOG_TICK */

-

-/*-----------------------------------------------------------*/

-

-__arm __interwork void vPortEnterCritical( void )

-{

-	/* Disable interrupts first! */

-	portDISABLE_INTERRUPTS();

-

-	/* Now interrupts are disabled ulCriticalNesting can be accessed

-	directly.  Increment ulCriticalNesting to keep a count of how many times

-	portENTER_CRITICAL() has been called. */

-	ulCriticalNesting++;

-}

-/*-----------------------------------------------------------*/

-

-__arm __interwork void vPortExitCritical( void )

-{

-	if( ulCriticalNesting > portNO_CRITICAL_NESTING )

-	{

-		/* Decrement the nesting count as we are leaving a critical section. */

-		ulCriticalNesting--;

-

-		/* If the nesting level has reached zero then interrupts should be

-		re-enabled. */

-		if( ulCriticalNesting == portNO_CRITICAL_NESTING )

-		{

-			portENABLE_INTERRUPTS();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvDefaultHandler( void )

-{

-}

-

-

-

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+ * Implementation of functions defined in portable.h for the ST STR91x ARM9
+ * port.
+ *----------------------------------------------------------*/
+
+/* Library includes. */
+#include "91x_lib.h"
+
+/* Standard includes. */
+#include <stdlib.h>
+#include <assert.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+#ifndef configUSE_WATCHDOG_TICK
+    #error configUSE_WATCHDOG_TICK must be set to either 1 or 0 in FreeRTOSConfig.h to use either the Watchdog or timer 2 to generate the tick interrupt respectively.
+#endif
+
+/* Constants required to setup the initial stack. */
+#ifndef _RUN_TASK_IN_ARM_MODE_
+    #define portINITIAL_SPSR            ( ( StackType_t ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */
+#else
+    #define portINITIAL_SPSR            ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */
+#endif
+
+#define portINSTRUCTION_SIZE            ( ( StackType_t ) 4 )
+
+/* Constants required to handle critical sections. */
+#define portNO_CRITICAL_NESTING         ( ( uint32_t ) 0 )
+
+#ifndef abs
+    #define abs(x) ((x)>0 ? (x) : -(x))
+#endif
+
+/**
+ * Toggle a led using the following algorithm:
+ * if ( GPIO_ReadBit(GPIO9, GPIO_Pin_2) )
+ * {
+ *   GPIO_WriteBit( GPIO9, GPIO_Pin_2, Bit_RESET );
+ * }
+ * else
+ * {
+ *   GPIO_WriteBit( GPIO9, GPIO_Pin_2, Bit_RESET );
+ * }
+ *
+ */
+#define TOGGLE_LED(port,pin)                                    \
+    if ( ((((port)->DR[(pin)<<2])) & (pin)) != Bit_RESET )      \
+    {                                                           \
+        (port)->DR[(pin) <<2] = 0x00;                           \
+    }                                                           \
+    else                                                        \
+    {                                                           \
+        (port)->DR[(pin) <<2] = (pin);                          \
+    }
+
+
+/*-----------------------------------------------------------*/
+
+/* Setup the watchdog to generate the tick interrupts. */
+static void prvSetupTimerInterrupt( void );
+
+/* ulCriticalNesting will get set to zero when the first task starts.  It
+cannot be initialised to 0 as this will cause interrupts to be enabled
+during the kernel initialisation process. */
+uint32_t ulCriticalNesting = ( uint32_t ) 9999;
+
+/* Tick interrupt routines for cooperative and preemptive operation
+respectively.  The preemptive version is not defined as __irq as it is called
+from an asm wrapper function. */
+void WDG_IRQHandler( void );
+
+/* VIC interrupt default handler. */
+static void prvDefaultHandler( void );
+
+#if configUSE_WATCHDOG_TICK == 0
+    /* Used to update the OCR timer register */
+    static u16 s_nPulseLength;
+#endif
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Initialise the stack of a task to look exactly as if a call to
+ * portSAVE_CONTEXT had been called.
+ *
+ * See header file for description.
+ */
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+    StackType_t *pxOriginalTOS;
+
+    pxOriginalTOS = pxTopOfStack;
+
+    /* To ensure asserts in tasks.c don't fail, although in this case the assert
+    is not really required. */
+    pxTopOfStack--;
+
+    /* Setup the initial stack of the task.  The stack is set exactly as
+    expected by the portRESTORE_CONTEXT() macro. */
+
+    /* First on the stack is the return address - which in this case is the
+    start of the task.  The offset is added to make the return address appear
+    as it would within an IRQ ISR. */
+    *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;
+    pxTopOfStack--;
+
+    *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
+    pxTopOfStack--;
+
+    /* When the task starts is will expect to find the function parameter in
+    R0. */
+    *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
+    pxTopOfStack--;
+
+    /* The status register is set for system mode, with interrupts enabled. */
+    *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR;
+    pxTopOfStack--;
+
+    /* Interrupt flags cannot always be stored on the stack and will
+    instead be stored in a variable, which is then saved as part of the
+    tasks context. */
+    *pxTopOfStack = portNO_CRITICAL_NESTING;
+
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+extern void vPortStartFirstTask( void );
+
+    /* Start the timer that generates the tick ISR.  Interrupts are disabled
+    here already. */
+    prvSetupTimerInterrupt();
+
+    /* Start the first task. */
+    vPortStartFirstTask();
+
+    /* Should not get here! */
+    return 0;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the ARM port will require this function as there
+    is nothing to return to.  */
+}
+/*-----------------------------------------------------------*/
+
+/* This function is called from an asm wrapper, so does not require the __irq
+keyword. */
+#if configUSE_WATCHDOG_TICK == 1
+
+    static void prvFindFactors(u32 n, u16 *a, u32 *b)
+    {
+        /* This function is copied from the ST STR7 library and is
+        copyright STMicroelectronics.  Reproduced with permission. */
+
+        u32 b0;
+        u16 a0;
+        int32_t err, err_min=n;
+
+        *a = a0 = ((n-1)/65536ul) + 1;
+        *b = b0 = n / *a;
+
+        for (; *a <= 256; (*a)++)
+        {
+            *b = n / *a;
+            err = (int32_t)*a * (int32_t)*b - (int32_t)n;
+            if (abs(err) > (*a / 2))
+            {
+                (*b)++;
+                err = (int32_t)*a * (int32_t)*b - (int32_t)n;
+            }
+            if (abs(err) < abs(err_min))
+            {
+                err_min = err;
+                a0 = *a;
+                b0 = *b;
+                if (err == 0) break;
+            }
+        }
+
+        *a = a0;
+        *b = b0;
+    }
+    /*-----------------------------------------------------------*/
+
+    static void prvSetupTimerInterrupt( void )
+    {
+    WDG_InitTypeDef xWdg;
+    uint16_t a;
+    uint32_t n = configCPU_PERIPH_HZ / configTICK_RATE_HZ, b;
+
+        /* Configure the watchdog as a free running timer that generates a
+        periodic interrupt. */
+
+        SCU_APBPeriphClockConfig( __WDG, ENABLE );
+        WDG_DeInit();
+        WDG_StructInit(&xWdg);
+        prvFindFactors( n, &a, &b );
+        xWdg.WDG_Prescaler = a - 1;
+        xWdg.WDG_Preload = b - 1;
+        WDG_Init( &xWdg );
+        WDG_ITConfig(ENABLE);
+
+        /* Configure the VIC for the WDG interrupt. */
+        VIC_Config( WDG_ITLine, VIC_IRQ, 10 );
+        VIC_ITCmd( WDG_ITLine, ENABLE );
+
+        /* Install the default handlers for both VIC's. */
+        VIC0->DVAR = ( uint32_t ) prvDefaultHandler;
+        VIC1->DVAR = ( uint32_t ) prvDefaultHandler;
+
+        WDG_Cmd(ENABLE);
+    }
+    /*-----------------------------------------------------------*/
+
+    void WDG_IRQHandler( void )
+    {
+        {
+            /* Increment the tick counter. */
+            if( xTaskIncrementTick() != pdFALSE )
+            {
+                /* Select a new task to execute. */
+                vTaskSwitchContext();
+            }
+
+            /* Clear the interrupt in the watchdog. */
+            WDG->SR &= ~0x0001;
+        }
+    }
+
+#else
+
+    static void prvFindFactors(u32 n, u8 *a, u16 *b)
+    {
+        /* This function is copied from the ST STR7 library and is
+        copyright STMicroelectronics.  Reproduced with permission. */
+
+        u16 b0;
+        u8 a0;
+        int32_t err, err_min=n;
+
+
+        *a = a0 = ((n-1)/256) + 1;
+        *b = b0 = n / *a;
+
+        for (; *a <= 256; (*a)++)
+        {
+            *b = n / *a;
+            err = (int32_t)*a * (int32_t)*b - (int32_t)n;
+            if (abs(err) > (*a / 2))
+            {
+                (*b)++;
+                err = (int32_t)*a * (int32_t)*b - (int32_t)n;
+            }
+            if (abs(err) < abs(err_min))
+            {
+                err_min = err;
+                a0 = *a;
+                b0 = *b;
+                if (err == 0) break;
+            }
+        }
+
+        *a = a0;
+        *b = b0;
+    }
+    /*-----------------------------------------------------------*/
+
+    static void prvSetupTimerInterrupt( void )
+    {
+        uint8_t a;
+        uint16_t b;
+        uint32_t n = configCPU_PERIPH_HZ / configTICK_RATE_HZ;
+
+        TIM_InitTypeDef timer;
+
+        SCU_APBPeriphClockConfig( __TIM23, ENABLE );
+        TIM_DeInit(TIM2);
+        TIM_StructInit(&timer);
+        prvFindFactors( n, &a, &b );
+
+        timer.TIM_Mode           = TIM_OCM_CHANNEL_1;
+        timer.TIM_OC1_Modes      = TIM_TIMING;
+        timer.TIM_Clock_Source   = TIM_CLK_APB;
+        timer.TIM_Clock_Edge     = TIM_CLK_EDGE_RISING;
+        timer.TIM_Prescaler      = a-1;
+        timer.TIM_Pulse_Level_1  = TIM_HIGH;
+        timer.TIM_Pulse_Length_1 = s_nPulseLength  = b-1;
+
+        TIM_Init (TIM2, &timer);
+        TIM_ITConfig(TIM2, TIM_IT_OC1, ENABLE);
+        /* Configure the VIC for the WDG interrupt. */
+        VIC_Config( TIM2_ITLine, VIC_IRQ, 10 );
+        VIC_ITCmd( TIM2_ITLine, ENABLE );
+
+        /* Install the default handlers for both VIC's. */
+        VIC0->DVAR = ( uint32_t ) prvDefaultHandler;
+        VIC1->DVAR = ( uint32_t ) prvDefaultHandler;
+
+        TIM_CounterCmd(TIM2, TIM_CLEAR);
+        TIM_CounterCmd(TIM2, TIM_START);
+    }
+    /*-----------------------------------------------------------*/
+
+    void TIM2_IRQHandler( void )
+    {
+        /* Reset the timer counter to avioid overflow. */
+        TIM2->OC1R += s_nPulseLength;
+
+        /* Increment the tick counter. */
+        if( xTaskIncrementTick() != pdFALSE )
+        {
+            /* Select a new task to run. */
+            vTaskSwitchContext();
+        }
+
+        /* Clear the interrupt in the watchdog. */
+        TIM2->SR &= ~TIM_FLAG_OC1;
+    }
+
+#endif /* USE_WATCHDOG_TICK */
+
+/*-----------------------------------------------------------*/
+
+__arm __interwork void vPortEnterCritical( void )
+{
+    /* Disable interrupts first! */
+    portDISABLE_INTERRUPTS();
+
+    /* Now interrupts are disabled ulCriticalNesting can be accessed
+    directly.  Increment ulCriticalNesting to keep a count of how many times
+    portENTER_CRITICAL() has been called. */
+    ulCriticalNesting++;
+}
+/*-----------------------------------------------------------*/
+
+__arm __interwork void vPortExitCritical( void )
+{
+    if( ulCriticalNesting > portNO_CRITICAL_NESTING )
+    {
+        /* Decrement the nesting count as we are leaving a critical section. */
+        ulCriticalNesting--;
+
+        /* If the nesting level has reached zero then interrupts should be
+        re-enabled. */
+        if( ulCriticalNesting == portNO_CRITICAL_NESTING )
+        {
+            portENABLE_INTERRUPTS();
+        }
+    }
+}
+/*-----------------------------------------------------------*/
+
+static void prvDefaultHandler( void )
+{
+}
diff --git a/portable/IAR/STR91x/portasm.s79 b/portable/IAR/STR91x/portasm.s79
index f44fe4e..575c35f 100644
--- a/portable/IAR/STR91x/portasm.s79
+++ b/portable/IAR/STR91x/portasm.s79
@@ -1,61 +1,60 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-		RSEG ICODE:CODE

-		CODE32

-

-	EXTERN vTaskSwitchContext

-

-	PUBLIC vPortYieldProcessor

-	PUBLIC vPortStartFirstTask

-

-#include "ISR_Support.h"

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Starting the first task is just a matter of restoring the context that

-; was created by pxPortInitialiseStack().

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortStartFirstTask:

-	portRESTORE_CONTEXT

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Manual context switch function.  This is the SWI hander.

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-vPortYieldProcessor:

-	ADD		LR, LR, #4			; Add 4 to the LR to make the LR appear exactly

-								; as if the context was saved during and IRQ

-								; handler.

-								

-	portSAVE_CONTEXT			; Save the context of the current task...

-	LDR R0, =vTaskSwitchContext	; before selecting the next task to execute.

-	MOV     lr, pc

-	BX R0

-	portRESTORE_CONTEXT			; Restore the context of the selected task.

-

-	END

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+        RSEG ICODE:CODE
+        CODE32
+
+    EXTERN vTaskSwitchContext
+
+    PUBLIC vPortYieldProcessor
+    PUBLIC vPortStartFirstTask
+
+#include "ISR_Support.h"
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Starting the first task is just a matter of restoring the context that
+; was created by pxPortInitialiseStack().
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortStartFirstTask:
+    portRESTORE_CONTEXT
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Manual context switch function.  This is the SWI hander.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+vPortYieldProcessor:
+    ADD     LR, LR, #4          ; Add 4 to the LR to make the LR appear exactly
+                                ; as if the context was saved during and IRQ
+                                ; handler.
+
+    portSAVE_CONTEXT            ; Save the context of the current task...
+    LDR R0, =vTaskSwitchContext ; before selecting the next task to execute.
+    MOV     lr, pc
+    BX R0
+    portRESTORE_CONTEXT         ; Restore the context of the selected task.
+
+    END
diff --git a/portable/IAR/STR91x/portmacro.h b/portable/IAR/STR91x/portmacro.h
index 5b04315..a8b24da 100644
--- a/portable/IAR/STR91x/portmacro.h
+++ b/portable/IAR/STR91x/portmacro.h
@@ -1,115 +1,113 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-#include <intrinsics.h>

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/* Type definitions. */

-#define portCHAR			char

-#define portFLOAT			float

-#define portDOUBLE			double

-#define portLONG			long

-#define portSHORT			short

-#define portSTACK_TYPE		uint32_t

-#define portBASE_TYPE		long

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-/*-----------------------------------------------------------*/

-

-/* Hardware specifics. */

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-#define portBYTE_ALIGNMENT			8

-#define portYIELD()					asm ( "SWI 0" )

-#define portNOP()					asm ( "NOP" )

-/*-----------------------------------------------------------*/

-

-/* Critical section handling. */

-__arm __interwork void vPortEnterCritical( void );

-__arm __interwork void vPortExitCritical( void );

-#define portENTER_CRITICAL()		vPortEnterCritical()

-#define portEXIT_CRITICAL()			vPortExitCritical()

-

-#define portDISABLE_INTERRUPTS()	__disable_interrupt()

-#define portENABLE_INTERRUPTS()		__enable_interrupt()

-

-

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-#define portEND_SWITCHING_ISR( xSwitchRequired ) 	\

-{													\

-extern void vTaskSwitchContext( void );				\

-													\

-	if( xSwitchRequired ) 							\

-	{												\

-		vTaskSwitchContext();						\

-	}												\

-}

-/*-----------------------------------------------------------*/

-

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+#include <intrinsics.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Type definitions. */
+#define portCHAR            char
+#define portFLOAT           float
+#define portDOUBLE          double
+#define portLONG            long
+#define portSHORT           short
+#define portSTACK_TYPE      uint32_t
+#define portBASE_TYPE       long
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+
+#if( configUSE_16_BIT_TICKS == 1 )
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+/*-----------------------------------------------------------*/
+
+/* Hardware specifics. */
+#define portSTACK_GROWTH            ( -1 )
+#define portTICK_PERIOD_MS          ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT          8
+#define portYIELD()                 asm ( "SWI 0" )
+#define portNOP()                   asm ( "NOP" )
+/*-----------------------------------------------------------*/
+
+/* Critical section handling. */
+__arm __interwork void vPortEnterCritical( void );
+__arm __interwork void vPortExitCritical( void );
+#define portENTER_CRITICAL()        vPortEnterCritical()
+#define portEXIT_CRITICAL()         vPortExitCritical()
+
+#define portDISABLE_INTERRUPTS()    __disable_interrupt()
+#define portENABLE_INTERRUPTS()     __enable_interrupt()
+
+
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+#define portEND_SWITCHING_ISR( xSwitchRequired )    \
+{                                                   \
+extern void vTaskSwitchContext( void );             \
+                                                    \
+    if( xSwitchRequired )                           \
+    {                                               \
+        vTaskSwitchContext();                       \
+    }                                               \
+}
+/*-----------------------------------------------------------*/
+
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */
diff --git a/portable/IAR/V850ES/ISR_Support.h b/portable/IAR/V850ES/ISR_Support.h
index 2426c53..28c5691 100644
--- a/portable/IAR/V850ES/ISR_Support.h
+++ b/portable/IAR/V850ES/ISR_Support.h
@@ -1,150 +1,150 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-	EXTERN pxCurrentTCB

-	EXTERN usCriticalNesting

-

-#include "FreeRTOSConfig.h"

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-; Context save and restore macro definitions

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-

-portSAVE_CONTEXT MACRO

-

-    add     -0x0C,sp			; prepare stack to save necessary values

-    st.w    lp,8[sp]			; store LP to stack

-    stsr    0,r31

-    st.w    lp,4[sp]			; store EIPC to stack

-    stsr    1,lp

-    st.w    lp,0[sp]			; store EIPSW to stack

-#if configDATA_MODE == 1                                        ; Using the Tiny data model

-    prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers

-    sst.w   r19,72[ep]

-    sst.w   r18,68[ep]

-    sst.w   r17,64[ep]

-    sst.w   r16,60[ep]

-    sst.w   r15,56[ep]

-    sst.w   r14,52[ep]

-    sst.w   r13,48[ep]

-    sst.w   r12,44[ep]

-    sst.w   r11,40[ep]

-    sst.w   r10,36[ep]

-    sst.w   r9,32[ep]

-    sst.w   r8,28[ep]

-    sst.w   r7,24[ep]

-    sst.w   r6,20[ep]

-    sst.w   r5,16[ep]

-    sst.w   r4,12[ep]

-#else                                                           ; Using the Small/Large data model

-    prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers

-    sst.w   r19,68[ep]

-    sst.w   r18,64[ep]

-    sst.w   r17,60[ep]

-    sst.w   r16,56[ep]

-    sst.w   r15,52[ep]

-    sst.w   r14,48[ep]

-    sst.w   r13,44[ep]

-    sst.w   r12,40[ep]

-    sst.w   r11,36[ep]

-    sst.w   r10,32[ep]

-    sst.w   r9,28[ep]

-    sst.w   r8,24[ep]

-    sst.w   r7,20[ep]

-    sst.w   r6,16[ep]

-    sst.w   r5,12[ep]

-#endif /* configDATA_MODE */

-    sst.w   r2,8[ep]

-    sst.w   r1,4[ep]

-    MOVHI   hi1(usCriticalNesting),r0,r1	; save usCriticalNesting value to stack

-    ld.w    lw1(usCriticalNesting)[r1],r2

-    sst.w   r2,0[ep]

-    MOVHI   hi1(pxCurrentTCB),r0,r1			; save SP to top of current TCB

-    ld.w    lw1(pxCurrentTCB)[r1],r2

-    st.w    sp,0[r2]

-    ENDM

-

-

-portRESTORE_CONTEXT MACRO

-

-    MOVHI   hi1(pxCurrentTCB),r0,r1			; get Stackpointer address

-    ld.w    lw1(pxCurrentTCB)[r1],sp

-    MOV     sp,r1

-    ld.w    0[r1],sp						; load stackpointer

-    MOV     sp,ep							; set stack pointer to element pointer

-    sld.w   0[ep],r1						; load usCriticalNesting value from stack

-    MOVHI   hi1(usCriticalNesting),r0,r2

-    st.w    r1,lw1(usCriticalNesting)[r2]

-    sld.w   4[ep],r1						; restore general purpose registers

-    sld.w   8[ep],r2

-#if configDATA_MODE == 1					; Using Tiny data model

-    sld.w   12[ep],r4

-    sld.w   16[ep],r5

-    sld.w   20[ep],r6

-    sld.w   24[ep],r7

-    sld.w   28[ep],r8

-    sld.w   32[ep],r9

-    sld.w   36[ep],r10

-    sld.w   40[ep],r11

-    sld.w   44[ep],r12

-    sld.w   48[ep],r13

-    sld.w   52[ep],r14

-    sld.w   56[ep],r15

-    sld.w   60[ep],r16

-    sld.w   64[ep],r17

-    sld.w   68[ep],r18

-    sld.w   72[ep],r19

-    dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}

-#else										; Using Small/Large data model

-    sld.w   12[ep],r5

-    sld.w   16[ep],r6

-    sld.w   20[ep],r7

-    sld.w   24[ep],r8

-    sld.w   28[ep],r9

-    sld.w   32[ep],r10

-    sld.w   36[ep],r11

-    sld.w   40[ep],r12

-    sld.w   44[ep],r13

-    sld.w   48[ep],r14

-    sld.w   52[ep],r15

-    sld.w   56[ep],r16

-    sld.w   60[ep],r17

-    sld.w   64[ep],r18

-    sld.w   68[ep],r19

-    dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}

-#endif /* configDATA_MODE */

-    ld.w    0[sp],lp						; restore EIPSW from stack

-    ldsr    lp,1

-    ld.w    4[sp],lp						; restore EIPC from stack

-    ldsr    lp,0

-    ld.w    8[sp],lp						; restore LP from stack

-    add     0x0C,sp							; set SP to right position

-

-    RETI

-

-    ENDM

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+    EXTERN pxCurrentTCB
+    EXTERN usCriticalNesting
+
+#include "FreeRTOSConfig.h"
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Context save and restore macro definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+portSAVE_CONTEXT MACRO
+
+    add     -0x0C,sp            ; prepare stack to save necessary values
+    st.w    lp,8[sp]            ; store LP to stack
+    stsr    0,r31
+    st.w    lp,4[sp]            ; store EIPC to stack
+    stsr    1,lp
+    st.w    lp,0[sp]            ; store EIPSW to stack
+#if configDATA_MODE == 1                                        ; Using the Tiny data model
+    prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers
+    sst.w   r19,72[ep]
+    sst.w   r18,68[ep]
+    sst.w   r17,64[ep]
+    sst.w   r16,60[ep]
+    sst.w   r15,56[ep]
+    sst.w   r14,52[ep]
+    sst.w   r13,48[ep]
+    sst.w   r12,44[ep]
+    sst.w   r11,40[ep]
+    sst.w   r10,36[ep]
+    sst.w   r9,32[ep]
+    sst.w   r8,28[ep]
+    sst.w   r7,24[ep]
+    sst.w   r6,20[ep]
+    sst.w   r5,16[ep]
+    sst.w   r4,12[ep]
+#else                                                           ; Using the Small/Large data model
+    prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers
+    sst.w   r19,68[ep]
+    sst.w   r18,64[ep]
+    sst.w   r17,60[ep]
+    sst.w   r16,56[ep]
+    sst.w   r15,52[ep]
+    sst.w   r14,48[ep]
+    sst.w   r13,44[ep]
+    sst.w   r12,40[ep]
+    sst.w   r11,36[ep]
+    sst.w   r10,32[ep]
+    sst.w   r9,28[ep]
+    sst.w   r8,24[ep]
+    sst.w   r7,20[ep]
+    sst.w   r6,16[ep]
+    sst.w   r5,12[ep]
+#endif /* configDATA_MODE */
+    sst.w   r2,8[ep]
+    sst.w   r1,4[ep]
+    MOVHI   hi1(usCriticalNesting),r0,r1    ; save usCriticalNesting value to stack
+    ld.w    lw1(usCriticalNesting)[r1],r2
+    sst.w   r2,0[ep]
+    MOVHI   hi1(pxCurrentTCB),r0,r1         ; save SP to top of current TCB
+    ld.w    lw1(pxCurrentTCB)[r1],r2
+    st.w    sp,0[r2]
+    ENDM
+
+
+portRESTORE_CONTEXT MACRO
+
+    MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address
+    ld.w    lw1(pxCurrentTCB)[r1],sp
+    MOV     sp,r1
+    ld.w    0[r1],sp                        ; load stackpointer
+    MOV     sp,ep                           ; set stack pointer to element pointer
+    sld.w   0[ep],r1                        ; load usCriticalNesting value from stack
+    MOVHI   hi1(usCriticalNesting),r0,r2
+    st.w    r1,lw1(usCriticalNesting)[r2]
+    sld.w   4[ep],r1                        ; restore general purpose registers
+    sld.w   8[ep],r2
+#if configDATA_MODE == 1                    ; Using Tiny data model
+    sld.w   12[ep],r4
+    sld.w   16[ep],r5
+    sld.w   20[ep],r6
+    sld.w   24[ep],r7
+    sld.w   28[ep],r8
+    sld.w   32[ep],r9
+    sld.w   36[ep],r10
+    sld.w   40[ep],r11
+    sld.w   44[ep],r12
+    sld.w   48[ep],r13
+    sld.w   52[ep],r14
+    sld.w   56[ep],r15
+    sld.w   60[ep],r16
+    sld.w   64[ep],r17
+    sld.w   68[ep],r18
+    sld.w   72[ep],r19
+    dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}
+#else                                       ; Using Small/Large data model
+    sld.w   12[ep],r5
+    sld.w   16[ep],r6
+    sld.w   20[ep],r7
+    sld.w   24[ep],r8
+    sld.w   28[ep],r9
+    sld.w   32[ep],r10
+    sld.w   36[ep],r11
+    sld.w   40[ep],r12
+    sld.w   44[ep],r13
+    sld.w   48[ep],r14
+    sld.w   52[ep],r15
+    sld.w   56[ep],r16
+    sld.w   60[ep],r17
+    sld.w   64[ep],r18
+    sld.w   68[ep],r19
+    dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}
+#endif /* configDATA_MODE */
+    ld.w    0[sp],lp                        ; restore EIPSW from stack
+    ldsr    lp,1
+    ld.w    4[sp],lp                        ; restore EIPC from stack
+    ldsr    lp,0
+    ld.w    8[sp],lp                        ; restore LP from stack
+    add     0x0C,sp                         ; set SP to right position
+
+    RETI
+
+    ENDM
diff --git a/portable/IAR/V850ES/port.c b/portable/IAR/V850ES/port.c
index 871061a..10e5c45 100644
--- a/portable/IAR/V850ES/port.c
+++ b/portable/IAR/V850ES/port.c
@@ -1,184 +1,182 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/* Standard includes. */

-#include <stdlib.h>

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Critical nesting should be initialised to a non zero value so interrupts don't

-accidentally get enabled before the scheduler is started. */

-#define portINITIAL_CRITICAL_NESTING  (( StackType_t ) 10)

-

-/* The PSW value assigned to tasks when they start to run for the first time. */

-#define portPSW		  (( StackType_t ) 0x00000000)

-

-/* We require the address of the pxCurrentTCB variable, but don't want to know

-any details of its type. */

-typedef void TCB_t;

-extern volatile TCB_t * volatile pxCurrentTCB;

-

-/* Keeps track of the nesting level of critical sections. */

-volatile StackType_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;

-/*-----------------------------------------------------------*/

-

-/* Sets up the timer to generate the tick interrupt. */

-static void prvSetupTimerInterrupt( void );

-

-/*-----------------------------------------------------------*/

-StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

-{

-	*pxTopOfStack = ( StackType_t ) pxCode;          /* Task function start address */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) pxCode;          /* Task function start address */

-	pxTopOfStack--;

-	*pxTopOfStack = portPSW;                            /* Initial PSW value */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x20202020;      /* Initial Value of R20 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x21212121;      /* Initial Value of R21 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x22222222;      /* Initial Value of R22 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x23232323;      /* Initial Value of R23 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x24242424;      /* Initial Value of R24 */

-	pxTopOfStack--;

-#if (__DATA_MODEL__ == 0) || (__DATA_MODEL__ == 1)

-	*pxTopOfStack = ( StackType_t ) 0x25252525;      /* Initial Value of R25 */

-	pxTopOfStack--;

-#endif /* configDATA_MODE */

-	*pxTopOfStack = ( StackType_t ) 0x26262626;      /* Initial Value of R26 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x27272727;      /* Initial Value of R27 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x28282828;      /* Initial Value of R28 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x29292929;      /* Initial Value of R29 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x30303030;      /* Initial Value of R30 */

-	pxTopOfStack--; 	

-	*pxTopOfStack = ( StackType_t ) 0x19191919;      /* Initial Value of R19 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x18181818;      /* Initial Value of R18 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x17171717;      /* Initial Value of R17 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x16161616;      /* Initial Value of R16 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x15151515;      /* Initial Value of R15 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x14141414;      /* Initial Value of R14 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x13131313;      /* Initial Value of R13 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x12121212;      /* Initial Value of R12 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x11111111;      /* Initial Value of R11 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x10101010;      /* Initial Value of R10 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x99999999;      /* Initial Value of R09 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x88888888;      /* Initial Value of R08 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x77777777;      /* Initial Value of R07 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x66666666;      /* Initial Value of R06 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) 0x55555555;      /* Initial Value of R05 */

-	pxTopOfStack--;

-#if __DATA_MODEL__ == 0 || __DATA_MODEL__ == 1

-	*pxTopOfStack = ( StackType_t ) 0x44444444;      /* Initial Value of R04 */

-	pxTopOfStack--;

-#endif /* configDATA_MODE */

-	*pxTopOfStack = ( StackType_t ) 0x22222222;      /* Initial Value of R02 */

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) pvParameters;    /* R1 is expected to hold the function parameter*/

-	pxTopOfStack--;

-	*pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;	

-

-	/*

-	 * Return a pointer to the top of the stack we have generated so this can

-	 * be stored in the task control block for the task.

-	 */

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-BaseType_t xPortStartScheduler( void )

-{

-	/* Setup the hardware to generate the tick.  Interrupts are disabled when

-	this function is called. */

-	prvSetupTimerInterrupt();

-

-	/* Restore the context of the first task that is going to run. */

-	vPortStart();

-

-	/* Should not get here as the tasks are now running! */

-	return pdTRUE;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the V850ES/Fx3 port will get stopped.  If required simply

-	disable the tick interrupt here. */

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Hardware initialisation to generate the RTOS tick.  This uses

- */

-static void prvSetupTimerInterrupt( void )

-{

-	TM0CE     = 0;	/* TMM0 operation disable */

-	TM0EQMK0  = 1;	/* INTTM0EQ0 interrupt disable */

-	TM0EQIF0  = 0;	/* clear INTTM0EQ0 interrupt flag */

-

-	#ifdef __IAR_V850ES_Fx3__

-	{

-		TM0CMP0   = (((configCPU_CLOCK_HZ / configTICK_RATE_HZ) / 2)-1);    /* divided by 2 because peripherals only run at CPU_CLOCK/2 */

-	}

-	#else

-	{

-		TM0CMP0   = (configCPU_CLOCK_HZ / configTICK_RATE_HZ);	

-	}

-	#endif

-

-	TM0EQIC0 &= 0xF8;

-	TM0CTL0   = 0x00;

-	TM0EQIF0 =  0;	/* clear INTTM0EQ0 interrupt flag */

-	TM0EQMK0 =  0;	/* INTTM0EQ0 interrupt enable */

-	TM0CE =     1;	/* TMM0 operation enable */

-}

-/*-----------------------------------------------------------*/

-

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/* Standard includes. */
+#include <stdlib.h>
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Critical nesting should be initialised to a non zero value so interrupts don't
+accidentally get enabled before the scheduler is started. */
+#define portINITIAL_CRITICAL_NESTING  (( StackType_t ) 10)
+
+/* The PSW value assigned to tasks when they start to run for the first time. */
+#define portPSW       (( StackType_t ) 0x00000000)
+
+/* We require the address of the pxCurrentTCB variable, but don't want to know
+any details of its type. */
+typedef void TCB_t;
+extern volatile TCB_t * volatile pxCurrentTCB;
+
+/* Keeps track of the nesting level of critical sections. */
+volatile StackType_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;
+/*-----------------------------------------------------------*/
+
+/* Sets up the timer to generate the tick interrupt. */
+static void prvSetupTimerInterrupt( void );
+
+/*-----------------------------------------------------------*/
+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
+{
+    *pxTopOfStack = ( StackType_t ) pxCode;          /* Task function start address */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pxCode;          /* Task function start address */
+    pxTopOfStack--;
+    *pxTopOfStack = portPSW;                            /* Initial PSW value */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x20202020;      /* Initial Value of R20 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x21212121;      /* Initial Value of R21 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x22222222;      /* Initial Value of R22 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x23232323;      /* Initial Value of R23 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x24242424;      /* Initial Value of R24 */
+    pxTopOfStack--;
+#if (__DATA_MODEL__ == 0) || (__DATA_MODEL__ == 1)
+    *pxTopOfStack = ( StackType_t ) 0x25252525;      /* Initial Value of R25 */
+    pxTopOfStack--;
+#endif /* configDATA_MODE */
+    *pxTopOfStack = ( StackType_t ) 0x26262626;      /* Initial Value of R26 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x27272727;      /* Initial Value of R27 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x28282828;      /* Initial Value of R28 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x29292929;      /* Initial Value of R29 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x30303030;      /* Initial Value of R30 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x19191919;      /* Initial Value of R19 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x18181818;      /* Initial Value of R18 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x17171717;      /* Initial Value of R17 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x16161616;      /* Initial Value of R16 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x15151515;      /* Initial Value of R15 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x14141414;      /* Initial Value of R14 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x13131313;      /* Initial Value of R13 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x12121212;      /* Initial Value of R12 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x11111111;      /* Initial Value of R11 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x10101010;      /* Initial Value of R10 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x99999999;      /* Initial Value of R09 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x88888888;      /* Initial Value of R08 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x77777777;      /* Initial Value of R07 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x66666666;      /* Initial Value of R06 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) 0x55555555;      /* Initial Value of R05 */
+    pxTopOfStack--;
+#if __DATA_MODEL__ == 0 || __DATA_MODEL__ == 1
+    *pxTopOfStack = ( StackType_t ) 0x44444444;      /* Initial Value of R04 */
+    pxTopOfStack--;
+#endif /* configDATA_MODE */
+    *pxTopOfStack = ( StackType_t ) 0x22222222;      /* Initial Value of R02 */
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) pvParameters;    /* R1 is expected to hold the function parameter*/
+    pxTopOfStack--;
+    *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;
+
+    /*
+     * Return a pointer to the top of the stack we have generated so this can
+     * be stored in the task control block for the task.
+     */
+    return pxTopOfStack;
+}
+/*-----------------------------------------------------------*/
+
+BaseType_t xPortStartScheduler( void )
+{
+    /* Setup the hardware to generate the tick.  Interrupts are disabled when
+    this function is called. */
+    prvSetupTimerInterrupt();
+
+    /* Restore the context of the first task that is going to run. */
+    vPortStart();
+
+    /* Should not get here as the tasks are now running! */
+    return pdTRUE;
+}
+/*-----------------------------------------------------------*/
+
+void vPortEndScheduler( void )
+{
+    /* It is unlikely that the V850ES/Fx3 port will get stopped.  If required simply
+    disable the tick interrupt here. */
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * Hardware initialisation to generate the RTOS tick.  This uses
+ */
+static void prvSetupTimerInterrupt( void )
+{
+    TM0CE     = 0;  /* TMM0 operation disable */
+    TM0EQMK0  = 1;  /* INTTM0EQ0 interrupt disable */
+    TM0EQIF0  = 0;  /* clear INTTM0EQ0 interrupt flag */
+
+    #ifdef __IAR_V850ES_Fx3__
+    {
+        TM0CMP0   = (((configCPU_CLOCK_HZ / configTICK_RATE_HZ) / 2)-1);    /* divided by 2 because peripherals only run at CPU_CLOCK/2 */
+    }
+    #else
+    {
+        TM0CMP0   = (configCPU_CLOCK_HZ / configTICK_RATE_HZ);
+    }
+    #endif
+
+    TM0EQIC0 &= 0xF8;
+    TM0CTL0   = 0x00;
+    TM0EQIF0 =  0;  /* clear INTTM0EQ0 interrupt flag */
+    TM0EQMK0 =  0;  /* INTTM0EQ0 interrupt enable */
+    TM0CE =     1;  /* TMM0 operation enable */
+}
+/*-----------------------------------------------------------*/
diff --git a/portable/IAR/V850ES/portasm.s85 b/portable/IAR/V850ES/portasm.s85
index 5cbe71a..6f795ac 100644
--- a/portable/IAR/V850ES/portasm.s85
+++ b/portable/IAR/V850ES/portasm.s85
@@ -1,316 +1,315 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-; Note: Select the correct include files for the device used by the application.

-#include "FreeRTOSConfig.h"

-;------------------------------------------------------------------------------

-

-; Functions used by scheduler

-;------------------------------------------------------------------------------

-    EXTERN    vTaskSwitchContext

-    EXTERN    xTaskIncrementTick

-

-; Variables used by scheduler

-;------------------------------------------------------------------------------

-    EXTERN    pxCurrentTCB

-    EXTERN    usCriticalNesting

-

-; Functions implemented in this file

-;------------------------------------------------------------------------------

-    PUBLIC    vPortYield

-    PUBLIC    vPortStart

-

-; Security ID definition

-;------------------------------------------------------------------------------

-#define	CG_SECURITY0	0FFH

-#define	CG_SECURITY1	0FFH

-#define	CG_SECURITY2	0FFH

-#define	CG_SECURITY3	0FFH

-#define	CG_SECURITY4	0FFH

-#define	CG_SECURITY5	0FFH

-#define	CG_SECURITY6	0FFH

-#define	CG_SECURITY7	0FFH

-#define	CG_SECURITY8	0FFH

-#define	CG_SECURITY9	0FFH

-

-; Tick ISR Prototype

-;------------------------------------------------------------------------------

-        PUBWEAK `??MD_INTTM0EQ0??INTVEC 640`

-        PUBLIC MD_INTTM0EQ0

-

-MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"

-`??MD_INTTM0EQ0??INTVEC 640` SYMBOL "??INTVEC 640", MD_INTTM0EQ0

-

-;------------------------------------------------------------------------------

-;   portSAVE_CONTEXT MACRO

-;   Saves the context of the remaining general purpose registers

-;   and the usCriticalNesting Value of the active Task onto the task stack

-;   saves stack pointer to the TCB

-;------------------------------------------------------------------------------

-portSAVE_CONTEXT MACRO

-#if configDATA_MODE == 1                                        ; Using the Tiny data model

-    prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers

-    sst.w   r19,72[ep]

-    sst.w   r18,68[ep]

-    sst.w   r17,64[ep]

-    sst.w   r16,60[ep]

-    sst.w   r15,56[ep]

-    sst.w   r14,52[ep]

-    sst.w   r13,48[ep]

-    sst.w   r12,44[ep]

-    sst.w   r11,40[ep]

-    sst.w   r10,36[ep]

-    sst.w   r9,32[ep]

-    sst.w   r8,28[ep]

-    sst.w   r7,24[ep]

-    sst.w   r6,20[ep]

-    sst.w   r5,16[ep]

-    sst.w   r4,12[ep]

-#else                                                           ; Using the Small/Large data model

-    prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers

-    sst.w   r19,68[ep]

-    sst.w   r18,64[ep]

-    sst.w   r17,60[ep]

-    sst.w   r16,56[ep]

-    sst.w   r15,52[ep]

-    sst.w   r14,48[ep]

-    sst.w   r13,44[ep]

-    sst.w   r12,40[ep]

-    sst.w   r11,36[ep]

-    sst.w   r10,32[ep]

-    sst.w   r9,28[ep]

-    sst.w   r8,24[ep]

-    sst.w   r7,20[ep]

-    sst.w   r6,16[ep]

-    sst.w   r5,12[ep]

-#endif /* configDATA_MODE */

-    sst.w   r2,8[ep]

-    sst.w   r1,4[ep]

-    MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack

-    ld.w    lw1(usCriticalNesting)[r1],r2

-    sst.w   r2,0[ep]

-    MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB

-    ld.w    lw1(pxCurrentTCB)[r1],r2

-    st.w    sp,0[r2]

-    ENDM

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   portRESTORE_CONTEXT MACRO

-;   Gets stack pointer from the current TCB

-;   Restores the context of the usCriticalNesting value and general purpose

-;   registers of the selected task from the task stack

-;------------------------------------------------------------------------------

-portRESTORE_CONTEXT MACRO

-    MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address

-    ld.w    lw1(pxCurrentTCB)[r1],sp

-    MOV     sp,r1

-    ld.w    0[r1],sp                        ; load stackpointer

-    MOV     sp,ep                           ; set stack pointer to element pointer

-    sld.w   0[ep],r1                        ; load usCriticalNesting value from stack

-    MOVHI   hi1(usCriticalNesting),r0,r2

-    st.w    r1,lw1(usCriticalNesting)[r2]

-    sld.w   4[ep],r1                        ; restore general purpose registers

-    sld.w   8[ep],r2

-#if configDATA_MODE == 1                    ; Using Tiny data model

-    sld.w   12[ep],r4

-    sld.w   16[ep],r5

-    sld.w   20[ep],r6

-    sld.w   24[ep],r7

-    sld.w   28[ep],r8

-    sld.w   32[ep],r9

-    sld.w   36[ep],r10

-    sld.w   40[ep],r11

-    sld.w   44[ep],r12

-    sld.w   48[ep],r13

-    sld.w   52[ep],r14

-    sld.w   56[ep],r15

-    sld.w   60[ep],r16

-    sld.w   64[ep],r17

-    sld.w   68[ep],r18

-    sld.w   72[ep],r19

-    dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}

-#else                                       ; Using Small/Large data model

-    sld.w   12[ep],r5

-    sld.w   16[ep],r6

-    sld.w   20[ep],r7

-    sld.w   24[ep],r8

-    sld.w   28[ep],r9

-    sld.w   32[ep],r10

-    sld.w   36[ep],r11

-    sld.w   40[ep],r12

-    sld.w   44[ep],r13

-    sld.w   48[ep],r14

-    sld.w   52[ep],r15

-    sld.w   56[ep],r16

-    sld.w   60[ep],r17

-    sld.w   64[ep],r18

-    sld.w   68[ep],r19

-    dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}

-#endif /* configDATA_MODE */

-    ENDM

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   Restore the context of the first task that is going to run.

-;

-;   Input:  NONE

-;

-;   Call:   CALL    vPortStart

-;

-;   Output: NONE

-;------------------------------------------------------------------------------

-    RSEG CODE:CODE

-vPortStart:

-    portRESTORE_CONTEXT	                    ; Restore the context of whichever task the ...

-    ld.w    0[sp],lp

-    ldsr    lp,5                            ; restore PSW

-    DI

-    ld.w    4[sp],lp                        ; restore LP

-    ld.w    8[sp],lp                        ; restore LP

-    ADD     0x0C,sp                         ; set SP to right position

-    EI

-    jmp     [lp]

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   Port Yield function to check for a Task switch in the cooperative and

-;   preemptive mode

-;

-;   Input:  NONE

-;

-;   Call:   CALL    vPortYield

-;

-;   Output: NONE

-;------------------------------------------------------------------------------

-

-	RSEG CODE:CODE

-vPortYield:

-

-    add     -0x0C,sp                          ; prepare stack to save necessary values

-    st.w    lp,8[sp]                        ; store LP to stack

-    stsr    0,r31

-    st.w    lp,4[sp]                        ; store EIPC to stack

-    stsr    1,lp

-    st.w    lp,0[sp]                        ; store EIPSW to stack

-    portSAVE_CONTEXT		            ; Save the context of the current task.

-    jarl    vTaskSwitchContext,lp           ; Call the scheduler.

-    portRESTORE_CONTEXT		            ; Restore the context of whichever task the ...

-                		            ; ... scheduler decided should run.

-	ld.w    0[sp],lp                        ; restore EIPSW from stack

-    ldsr    lp,1

-    ld.w    4[sp],lp                        ; restore EIPC from stack

-    ldsr    lp,0

-    ld.w    8[sp],lp                        ; restore LP from stack

-    add     0x0C,sp                         ; set SP to right position

-

-    RETI

-

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   Perform the necessary steps of the Tick Count Increment and Task Switch

-;   depending on the chosen kernel configuration

-;

-;   Input:  NONE

-;

-;   Call:   ISR

-;

-;   Output: NONE

-;------------------------------------------------------------------------------

-#if configUSE_PREEMPTION == 1               ; use preemptive kernel mode

-

-MD_INTTM0EQ0:

-

-    add     -0x0C,sp                          ; prepare stack to save necessary values

-    st.w    lp,8[sp]                        ; store LP to stack

-    stsr    0,r31

-    st.w    lp,4[sp]                        ; store EIPC to stack

-    stsr    1,lp

-    st.w    lp,0[sp]                        ; store EIPSW to stack

-    portSAVE_CONTEXT		            ; Save the context of the current task.

-    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.

-    jarl    vTaskSwitchContext,lp           ; Call the scheduler.

-    portRESTORE_CONTEXT		            ; Restore the context of whichever task the ...

-                		            ; ... scheduler decided should run.

-    ld.w    0[sp],lp                        ; restore EIPSW from stack

-    ldsr    lp,1

-    ld.w    4[sp],lp                        ; restore EIPC from stack

-    ldsr    lp,0

-    ld.w    8[sp],lp                        ; restore LP from stack

-    add     0x0C,sp                         ; set SP to right position

-

-    RETI

-;------------------------------------------------------------------------------

-#else                                       ; use cooperative kernel mode

-

-MD_INTTM0EQ0:

-    prepare {lp,ep},8,sp

-    sst.w   r1,4[ep]

-    sst.w   r5,0[ep]

-    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.

-    sld.w   0[ep],r5

-    sld.w   4[ep],r1

-    dispose 8,{lp,ep}

-    RETI

-#endif /* configUSE_PREEMPTION */

-

-;------------------------------------------------------------------------------

-        COMMON INTVEC:CODE:ROOT(2)

-        ORG 640

-`??MD_INTTM0EQ0??INTVEC 640`:

-        JR MD_INTTM0EQ0

-

-        RSEG NEAR_ID:CONST:SORT:NOROOT(2)

-`?<Initializer for usCriticalNesting>`:

-        DW 10

-

-      COMMON INTVEC:CODE:ROOT(2)

-      ORG 40H

-`??vPortYield??INTVEC 40`:

-        JR vPortYield

-

-;------------------------------------------------------------------------------

-; set microcontroller security ID

-

-      COMMON INTVEC:CODE:ROOT(2)

-      ORG 70H

-`SECUID`:

-      DB CG_SECURITY0

-      DB CG_SECURITY1

-      DB CG_SECURITY2

-      DB CG_SECURITY3

-      DB CG_SECURITY4

-      DB CG_SECURITY5

-      DB CG_SECURITY6

-      DB CG_SECURITY7

-      DB CG_SECURITY8

-      DB CG_SECURITY9

-

-

-      END

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+; Note: Select the correct include files for the device used by the application.
+#include "FreeRTOSConfig.h"
+;------------------------------------------------------------------------------
+
+; Functions used by scheduler
+;------------------------------------------------------------------------------
+    EXTERN    vTaskSwitchContext
+    EXTERN    xTaskIncrementTick
+
+; Variables used by scheduler
+;------------------------------------------------------------------------------
+    EXTERN    pxCurrentTCB
+    EXTERN    usCriticalNesting
+
+; Functions implemented in this file
+;------------------------------------------------------------------------------
+    PUBLIC    vPortYield
+    PUBLIC    vPortStart
+
+; Security ID definition
+;------------------------------------------------------------------------------
+#define CG_SECURITY0    0FFH
+#define CG_SECURITY1    0FFH
+#define CG_SECURITY2    0FFH
+#define CG_SECURITY3    0FFH
+#define CG_SECURITY4    0FFH
+#define CG_SECURITY5    0FFH
+#define CG_SECURITY6    0FFH
+#define CG_SECURITY7    0FFH
+#define CG_SECURITY8    0FFH
+#define CG_SECURITY9    0FFH
+
+; Tick ISR Prototype
+;------------------------------------------------------------------------------
+        PUBWEAK `??MD_INTTM0EQ0??INTVEC 640`
+        PUBLIC MD_INTTM0EQ0
+
+MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"
+`??MD_INTTM0EQ0??INTVEC 640` SYMBOL "??INTVEC 640", MD_INTTM0EQ0
+
+;------------------------------------------------------------------------------
+;   portSAVE_CONTEXT MACRO
+;   Saves the context of the remaining general purpose registers
+;   and the usCriticalNesting Value of the active Task onto the task stack
+;   saves stack pointer to the TCB
+;------------------------------------------------------------------------------
+portSAVE_CONTEXT MACRO
+#if configDATA_MODE == 1                                        ; Using the Tiny data model
+    prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers
+    sst.w   r19,72[ep]
+    sst.w   r18,68[ep]
+    sst.w   r17,64[ep]
+    sst.w   r16,60[ep]
+    sst.w   r15,56[ep]
+    sst.w   r14,52[ep]
+    sst.w   r13,48[ep]
+    sst.w   r12,44[ep]
+    sst.w   r11,40[ep]
+    sst.w   r10,36[ep]
+    sst.w   r9,32[ep]
+    sst.w   r8,28[ep]
+    sst.w   r7,24[ep]
+    sst.w   r6,20[ep]
+    sst.w   r5,16[ep]
+    sst.w   r4,12[ep]
+#else                                                           ; Using the Small/Large data model
+    prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers
+    sst.w   r19,68[ep]
+    sst.w   r18,64[ep]
+    sst.w   r17,60[ep]
+    sst.w   r16,56[ep]
+    sst.w   r15,52[ep]
+    sst.w   r14,48[ep]
+    sst.w   r13,44[ep]
+    sst.w   r12,40[ep]
+    sst.w   r11,36[ep]
+    sst.w   r10,32[ep]
+    sst.w   r9,28[ep]
+    sst.w   r8,24[ep]
+    sst.w   r7,20[ep]
+    sst.w   r6,16[ep]
+    sst.w   r5,12[ep]
+#endif /* configDATA_MODE */
+    sst.w   r2,8[ep]
+    sst.w   r1,4[ep]
+    MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack
+    ld.w    lw1(usCriticalNesting)[r1],r2
+    sst.w   r2,0[ep]
+    MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB
+    ld.w    lw1(pxCurrentTCB)[r1],r2
+    st.w    sp,0[r2]
+    ENDM
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   portRESTORE_CONTEXT MACRO
+;   Gets stack pointer from the current TCB
+;   Restores the context of the usCriticalNesting value and general purpose
+;   registers of the selected task from the task stack
+;------------------------------------------------------------------------------
+portRESTORE_CONTEXT MACRO
+    MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address
+    ld.w    lw1(pxCurrentTCB)[r1],sp
+    MOV     sp,r1
+    ld.w    0[r1],sp                        ; load stackpointer
+    MOV     sp,ep                           ; set stack pointer to element pointer
+    sld.w   0[ep],r1                        ; load usCriticalNesting value from stack
+    MOVHI   hi1(usCriticalNesting),r0,r2
+    st.w    r1,lw1(usCriticalNesting)[r2]
+    sld.w   4[ep],r1                        ; restore general purpose registers
+    sld.w   8[ep],r2
+#if configDATA_MODE == 1                    ; Using Tiny data model
+    sld.w   12[ep],r4
+    sld.w   16[ep],r5
+    sld.w   20[ep],r6
+    sld.w   24[ep],r7
+    sld.w   28[ep],r8
+    sld.w   32[ep],r9
+    sld.w   36[ep],r10
+    sld.w   40[ep],r11
+    sld.w   44[ep],r12
+    sld.w   48[ep],r13
+    sld.w   52[ep],r14
+    sld.w   56[ep],r15
+    sld.w   60[ep],r16
+    sld.w   64[ep],r17
+    sld.w   68[ep],r18
+    sld.w   72[ep],r19
+    dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}
+#else                                       ; Using Small/Large data model
+    sld.w   12[ep],r5
+    sld.w   16[ep],r6
+    sld.w   20[ep],r7
+    sld.w   24[ep],r8
+    sld.w   28[ep],r9
+    sld.w   32[ep],r10
+    sld.w   36[ep],r11
+    sld.w   40[ep],r12
+    sld.w   44[ep],r13
+    sld.w   48[ep],r14
+    sld.w   52[ep],r15
+    sld.w   56[ep],r16
+    sld.w   60[ep],r17
+    sld.w   64[ep],r18
+    sld.w   68[ep],r19
+    dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}
+#endif /* configDATA_MODE */
+    ENDM
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   Restore the context of the first task that is going to run.
+;
+;   Input:  NONE
+;
+;   Call:   CALL    vPortStart
+;
+;   Output: NONE
+;------------------------------------------------------------------------------
+    RSEG CODE:CODE
+vPortStart:
+    portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...
+    ld.w    0[sp],lp
+    ldsr    lp,5                            ; restore PSW
+    DI
+    ld.w    4[sp],lp                        ; restore LP
+    ld.w    8[sp],lp                        ; restore LP
+    ADD     0x0C,sp                         ; set SP to right position
+    EI
+    jmp     [lp]
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   Port Yield function to check for a Task switch in the cooperative and
+;   preemptive mode
+;
+;   Input:  NONE
+;
+;   Call:   CALL    vPortYield
+;
+;   Output: NONE
+;------------------------------------------------------------------------------
+
+    RSEG CODE:CODE
+vPortYield:
+
+    add     -0x0C,sp                          ; prepare stack to save necessary values
+    st.w    lp,8[sp]                        ; store LP to stack
+    stsr    0,r31
+    st.w    lp,4[sp]                        ; store EIPC to stack
+    stsr    1,lp
+    st.w    lp,0[sp]                        ; store EIPSW to stack
+    portSAVE_CONTEXT                    ; Save the context of the current task.
+    jarl    vTaskSwitchContext,lp           ; Call the scheduler.
+    portRESTORE_CONTEXT                 ; Restore the context of whichever task the ...
+                                    ; ... scheduler decided should run.
+    ld.w    0[sp],lp                        ; restore EIPSW from stack
+    ldsr    lp,1
+    ld.w    4[sp],lp                        ; restore EIPC from stack
+    ldsr    lp,0
+    ld.w    8[sp],lp                        ; restore LP from stack
+    add     0x0C,sp                         ; set SP to right position
+
+    RETI
+
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   Perform the necessary steps of the Tick Count Increment and Task Switch
+;   depending on the chosen kernel configuration
+;
+;   Input:  NONE
+;
+;   Call:   ISR
+;
+;   Output: NONE
+;------------------------------------------------------------------------------
+#if configUSE_PREEMPTION == 1               ; use preemptive kernel mode
+
+MD_INTTM0EQ0:
+
+    add     -0x0C,sp                          ; prepare stack to save necessary values
+    st.w    lp,8[sp]                        ; store LP to stack
+    stsr    0,r31
+    st.w    lp,4[sp]                        ; store EIPC to stack
+    stsr    1,lp
+    st.w    lp,0[sp]                        ; store EIPSW to stack
+    portSAVE_CONTEXT                    ; Save the context of the current task.
+    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.
+    jarl    vTaskSwitchContext,lp           ; Call the scheduler.
+    portRESTORE_CONTEXT                 ; Restore the context of whichever task the ...
+                                    ; ... scheduler decided should run.
+    ld.w    0[sp],lp                        ; restore EIPSW from stack
+    ldsr    lp,1
+    ld.w    4[sp],lp                        ; restore EIPC from stack
+    ldsr    lp,0
+    ld.w    8[sp],lp                        ; restore LP from stack
+    add     0x0C,sp                         ; set SP to right position
+
+    RETI
+;------------------------------------------------------------------------------
+#else                                       ; use cooperative kernel mode
+
+MD_INTTM0EQ0:
+    prepare {lp,ep},8,sp
+    sst.w   r1,4[ep]
+    sst.w   r5,0[ep]
+    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.
+    sld.w   0[ep],r5
+    sld.w   4[ep],r1
+    dispose 8,{lp,ep}
+    RETI
+#endif /* configUSE_PREEMPTION */
+
+;------------------------------------------------------------------------------
+        COMMON INTVEC:CODE:ROOT(2)
+        ORG 640
+`??MD_INTTM0EQ0??INTVEC 640`:
+        JR MD_INTTM0EQ0
+
+        RSEG NEAR_ID:CONST:SORT:NOROOT(2)
+`?<Initializer for usCriticalNesting>`:
+        DW 10
+
+      COMMON INTVEC:CODE:ROOT(2)
+      ORG 40H
+`??vPortYield??INTVEC 40`:
+        JR vPortYield
+
+;------------------------------------------------------------------------------
+; set microcontroller security ID
+
+      COMMON INTVEC:CODE:ROOT(2)
+      ORG 70H
+`SECUID`:
+      DB CG_SECURITY0
+      DB CG_SECURITY1
+      DB CG_SECURITY2
+      DB CG_SECURITY3
+      DB CG_SECURITY4
+      DB CG_SECURITY5
+      DB CG_SECURITY6
+      DB CG_SECURITY7
+      DB CG_SECURITY8
+      DB CG_SECURITY9
+
+
+      END
diff --git a/portable/IAR/V850ES/portasm_Fx3.s85 b/portable/IAR/V850ES/portasm_Fx3.s85
index 82be8fd..412077a 100644
--- a/portable/IAR/V850ES/portasm_Fx3.s85
+++ b/portable/IAR/V850ES/portasm_Fx3.s85
@@ -1,336 +1,336 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-; Note: Select the correct include files for the device used by the application.

-#include "FreeRTOSConfig.h"

-;------------------------------------------------------------------------------

-

-; Functions used by scheduler

-;------------------------------------------------------------------------------

-    EXTERN    vTaskSwitchContext

-    EXTERN    xTaskIncrementTick

-

-; Variables used by scheduler

-;------------------------------------------------------------------------------

-    EXTERN    pxCurrentTCB

-    EXTERN    usCriticalNesting

-

-; Functions implemented in this file

-;------------------------------------------------------------------------------

-    PUBLIC    vPortYield

-    PUBLIC    vPortStart

-

-; Security ID definition

-;------------------------------------------------------------------------------

-#define	CG_SECURITY0	0FFH

-#define	CG_SECURITY1	0FFH

-#define	CG_SECURITY2	0FFH

-#define	CG_SECURITY3	0FFH

-#define	CG_SECURITY4	0FFH

-#define	CG_SECURITY5	0FFH

-#define	CG_SECURITY6	0FFH

-#define	CG_SECURITY7	0FFH

-#define	CG_SECURITY8	0FFH

-#define	CG_SECURITY9	0FFH

-

-; Option Byte definitions

-;------------------------------------------------------------------------------

-#define	CG_OPTION7A	0x00

-#define	CG_OPTION7B	0x04

-#define	OPT7C		0x00

-#define	OPT7D		0x00

-#define	OPT7E		0x00

-#define	OPT7F		0x00

-

-; Tick ISR Prototype

-;------------------------------------------------------------------------------

-        PUBWEAK `??MD_INTTM0EQ0??INTVEC 608`

-        PUBLIC MD_INTTM0EQ0

-

-MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"

-`??MD_INTTM0EQ0??INTVEC 608` SYMBOL "??INTVEC 608", MD_INTTM0EQ0

-

-;------------------------------------------------------------------------------

-;   portSAVE_CONTEXT MACRO

-;   Saves the context of the remaining general purpose registers

-;   and the usCriticalNesting Value of the active Task onto the task stack

-;   saves stack pointer to the TCB

-;------------------------------------------------------------------------------

-portSAVE_CONTEXT MACRO

-#if configDATA_MODE == 1                                        ; Using the Tiny data model

-    prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers

-    sst.w   r19,72[ep]

-    sst.w   r18,68[ep]

-    sst.w   r17,64[ep]

-    sst.w   r16,60[ep]

-    sst.w   r15,56[ep]

-    sst.w   r14,52[ep]

-    sst.w   r13,48[ep]

-    sst.w   r12,44[ep]

-    sst.w   r11,40[ep]

-    sst.w   r10,36[ep]

-    sst.w   r9,32[ep]

-    sst.w   r8,28[ep]

-    sst.w   r7,24[ep]

-    sst.w   r6,20[ep]

-    sst.w   r5,16[ep]

-    sst.w   r4,12[ep]

-#else                                                           ; Using the Small/Large data model

-    prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers

-    sst.w   r19,68[ep]

-    sst.w   r18,64[ep]

-    sst.w   r17,60[ep]

-    sst.w   r16,56[ep]

-    sst.w   r15,52[ep]

-    sst.w   r14,48[ep]

-    sst.w   r13,44[ep]

-    sst.w   r12,40[ep]

-    sst.w   r11,36[ep]

-    sst.w   r10,32[ep]

-    sst.w   r9,28[ep]

-    sst.w   r8,24[ep]

-    sst.w   r7,20[ep]

-    sst.w   r6,16[ep]

-    sst.w   r5,12[ep]

-#endif /* configDATA_MODE */

-    sst.w   r2,8[ep]

-    sst.w   r1,4[ep]

-    MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack

-    ld.w    lw1(usCriticalNesting)[r1],r2

-    sst.w   r2,0[ep]

-    MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB

-    ld.w    lw1(pxCurrentTCB)[r1],r2

-    st.w    sp,0[r2]

-    ENDM

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   portRESTORE_CONTEXT MACRO

-;   Gets stack pointer from the current TCB

-;   Restores the context of the usCriticalNesting value and general purpose

-;   registers of the selected task from the task stack

-;------------------------------------------------------------------------------

-portRESTORE_CONTEXT MACRO

-    MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address

-    ld.w    lw1(pxCurrentTCB)[r1],sp

-    MOV     sp,r1

-    ld.w    0[r1],sp                        ; load stackpointer

-    MOV     sp,ep                           ; set stack pointer to element pointer

-    sld.w   0[ep],r1                        ; load usCriticalNesting value from stack

-    MOVHI   hi1(usCriticalNesting),r0,r2

-    st.w    r1,lw1(usCriticalNesting)[r2]

-    sld.w   4[ep],r1                        ; restore general purpose registers

-    sld.w   8[ep],r2

-#if configDATA_MODE == 1                    ; Using Tiny data model

-    sld.w   12[ep],r4

-    sld.w   16[ep],r5

-    sld.w   20[ep],r6

-    sld.w   24[ep],r7

-    sld.w   28[ep],r8

-    sld.w   32[ep],r9

-    sld.w   36[ep],r10

-    sld.w   40[ep],r11

-    sld.w   44[ep],r12

-    sld.w   48[ep],r13

-    sld.w   52[ep],r14

-    sld.w   56[ep],r15

-    sld.w   60[ep],r16

-    sld.w   64[ep],r17

-    sld.w   68[ep],r18

-    sld.w   72[ep],r19

-    dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}

-#else                                       ; Using Small/Large data model

-    sld.w   12[ep],r5

-    sld.w   16[ep],r6

-    sld.w   20[ep],r7

-    sld.w   24[ep],r8

-    sld.w   28[ep],r9

-    sld.w   32[ep],r10

-    sld.w   36[ep],r11

-    sld.w   40[ep],r12

-    sld.w   44[ep],r13

-    sld.w   48[ep],r14

-    sld.w   52[ep],r15

-    sld.w   56[ep],r16

-    sld.w   60[ep],r17

-    sld.w   64[ep],r18

-    sld.w   68[ep],r19

-    dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}

-#endif /* configDATA_MODE */

-    ENDM

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   Restore the context of the first task that is going to run.

-;

-;   Input:  NONE

-;

-;   Call:   CALL    vPortStart

-;

-;   Output: NONE

-;------------------------------------------------------------------------------

-    RSEG CODE:CODE

-vPortStart:

-    portRESTORE_CONTEXT	                    ; Restore the context of whichever task the ...

-    ld.w    0[sp],lp

-    ldsr    lp,5                            ; restore PSW

-    DI

-    ld.w    4[sp],lp                        ; restore LP

-    ld.w    8[sp],lp                        ; restore LP

-    ADD     0x0C,sp                         ; set SP to right position

-    EI

-    jmp     [lp]

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   Port Yield function to check for a Task switch in the cooperative and

-;   preemptive mode

-;

-;   Input:  NONE

-;

-;   Call:   CALL    vPortYield

-;

-;   Output: NONE

-;------------------------------------------------------------------------------

-

-	RSEG CODE:CODE

-vPortYield:

-

-    add     -0x0C,sp                          ; prepare stack to save necessary values

-    st.w    lp,8[sp]                        ; store LP to stack

-    stsr    0,r31

-    st.w    lp,4[sp]                        ; store EIPC to stack

-    stsr    1,lp

-    st.w    lp,0[sp]                        ; store EIPSW to stack

-    portSAVE_CONTEXT		            ; Save the context of the current task.

-    jarl    vTaskSwitchContext,lp           ; Call the scheduler.

-    portRESTORE_CONTEXT		            ; Restore the context of whichever task the ...

-                		            ; ... scheduler decided should run.

-	ld.w    0[sp],lp                        ; restore EIPSW from stack

-    ldsr    lp,1

-    ld.w    4[sp],lp                        ; restore EIPC from stack

-    ldsr    lp,0

-    ld.w    8[sp],lp                        ; restore LP from stack

-    add     0x0C,sp                         ; set SP to right position

-

-    RETI

-

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   Perform the necessary steps of the Tick Count Increment and Task Switch

-;   depending on the chosen kernel configuration

-;

-;   Input:  NONE

-;

-;   Call:   ISR

-;

-;   Output: NONE

-;------------------------------------------------------------------------------

-#if configUSE_PREEMPTION == 1               ; use preemptive kernel mode

-

-MD_INTTM0EQ0:

-

-    add     -0x0C,sp                          ; prepare stack to save necessary values

-    st.w    lp,8[sp]                        ; store LP to stack

-    stsr    0,r31

-    st.w    lp,4[sp]                        ; store EIPC to stack

-    stsr    1,lp

-    st.w    lp,0[sp]                        ; store EIPSW to stack

-    portSAVE_CONTEXT		            ; Save the context of the current task.

-    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.

-    jarl    vTaskSwitchContext,lp           ; Call the scheduler.

-    portRESTORE_CONTEXT		            ; Restore the context of whichever task the ...

-                		            ; ... scheduler decided should run.

-    ld.w    0[sp],lp                        ; restore EIPSW from stack

-    ldsr    lp,1

-    ld.w    4[sp],lp                        ; restore EIPC from stack

-    ldsr    lp,0

-    ld.w    8[sp],lp                        ; restore LP from stack

-    add     0x0C,sp                         ; set SP to right position

-

-    RETI

-;------------------------------------------------------------------------------

-#else                                       ; use cooperative kernel mode

-

-MD_INTTM0EQ0:

-    prepare {lp,ep},8,sp

-    sst.w   r1,4[ep]

-    sst.w   r5,0[ep]

-    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.

-    sld.w   0[ep],r5

-    sld.w   4[ep],r1

-    dispose 8,{lp,ep}

-    RETI

-#endif /* configUSE_PREEMPTION */

-

-;------------------------------------------------------------------------------

-        COMMON INTVEC:CODE:ROOT(2)

-        ORG 608

-`??MD_INTTM0EQ0??INTVEC 608`:

-        JR MD_INTTM0EQ0

-

-        RSEG NEAR_ID:CONST:SORT:NOROOT(2)

-`?<Initializer for usCriticalNesting>`:

-        DW 10

-

-      COMMON INTVEC:CODE:ROOT(2)

-      ORG 40H

-`??vPortYield??INTVEC 40`:

-        JR vPortYield

-

-;------------------------------------------------------------------------------

-; set microcontroller security ID

-

-      COMMON INTVEC:CODE:ROOT(2)

-      ORG 70H

-`SECUID`:

-      DB CG_SECURITY0

-      DB CG_SECURITY1

-      DB CG_SECURITY2

-      DB CG_SECURITY3

-      DB CG_SECURITY4

-      DB CG_SECURITY5

-      DB CG_SECURITY6

-      DB CG_SECURITY7

-      DB CG_SECURITY8

-      DB CG_SECURITY9

-

-;------------------------------------------------------------------------------

-; set microcontroller option bytes

-

-      COMMON INTVEC:CODE:ROOT(2)

-      ORG 7AH

-`OPTBYTES`:

-      DB CG_OPTION7A

-      DB CG_OPTION7B

-      DB OPT7C

-      DB OPT7D

-      DB OPT7E

-      DB OPT7F

-

-      END

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+; Note: Select the correct include files for the device used by the application.
+#include "FreeRTOSConfig.h"
+;------------------------------------------------------------------------------
+
+; Functions used by scheduler
+;------------------------------------------------------------------------------
+    EXTERN    vTaskSwitchContext
+    EXTERN    xTaskIncrementTick
+
+; Variables used by scheduler
+;------------------------------------------------------------------------------
+    EXTERN    pxCurrentTCB
+    EXTERN    usCriticalNesting
+
+; Functions implemented in this file
+;------------------------------------------------------------------------------
+    PUBLIC    vPortYield
+    PUBLIC    vPortStart
+
+; Security ID definition
+;------------------------------------------------------------------------------
+#define CG_SECURITY0    0FFH
+#define CG_SECURITY1    0FFH
+#define CG_SECURITY2    0FFH
+#define CG_SECURITY3    0FFH
+#define CG_SECURITY4    0FFH
+#define CG_SECURITY5    0FFH
+#define CG_SECURITY6    0FFH
+#define CG_SECURITY7    0FFH
+#define CG_SECURITY8    0FFH
+#define CG_SECURITY9    0FFH
+
+; Option Byte definitions
+;------------------------------------------------------------------------------
+#define CG_OPTION7A 0x00
+#define CG_OPTION7B 0x04
+#define OPT7C       0x00
+#define OPT7D       0x00
+#define OPT7E       0x00
+#define OPT7F       0x00
+
+; Tick ISR Prototype
+;------------------------------------------------------------------------------
+        PUBWEAK `??MD_INTTM0EQ0??INTVEC 608`
+        PUBLIC MD_INTTM0EQ0
+
+MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"
+`??MD_INTTM0EQ0??INTVEC 608` SYMBOL "??INTVEC 608", MD_INTTM0EQ0
+
+;------------------------------------------------------------------------------
+;   portSAVE_CONTEXT MACRO
+;   Saves the context of the remaining general purpose registers
+;   and the usCriticalNesting Value of the active Task onto the task stack
+;   saves stack pointer to the TCB
+;------------------------------------------------------------------------------
+portSAVE_CONTEXT MACRO
+#if configDATA_MODE == 1                                        ; Using the Tiny data model
+    prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers
+    sst.w   r19,72[ep]
+    sst.w   r18,68[ep]
+    sst.w   r17,64[ep]
+    sst.w   r16,60[ep]
+    sst.w   r15,56[ep]
+    sst.w   r14,52[ep]
+    sst.w   r13,48[ep]
+    sst.w   r12,44[ep]
+    sst.w   r11,40[ep]
+    sst.w   r10,36[ep]
+    sst.w   r9,32[ep]
+    sst.w   r8,28[ep]
+    sst.w   r7,24[ep]
+    sst.w   r6,20[ep]
+    sst.w   r5,16[ep]
+    sst.w   r4,12[ep]
+#else                                                           ; Using the Small/Large data model
+    prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers
+    sst.w   r19,68[ep]
+    sst.w   r18,64[ep]
+    sst.w   r17,60[ep]
+    sst.w   r16,56[ep]
+    sst.w   r15,52[ep]
+    sst.w   r14,48[ep]
+    sst.w   r13,44[ep]
+    sst.w   r12,40[ep]
+    sst.w   r11,36[ep]
+    sst.w   r10,32[ep]
+    sst.w   r9,28[ep]
+    sst.w   r8,24[ep]
+    sst.w   r7,20[ep]
+    sst.w   r6,16[ep]
+    sst.w   r5,12[ep]
+#endif /* configDATA_MODE */
+    sst.w   r2,8[ep]
+    sst.w   r1,4[ep]
+    MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack
+    ld.w    lw1(usCriticalNesting)[r1],r2
+    sst.w   r2,0[ep]
+    MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB
+    ld.w    lw1(pxCurrentTCB)[r1],r2
+    st.w    sp,0[r2]
+    ENDM
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   portRESTORE_CONTEXT MACRO
+;   Gets stack pointer from the current TCB
+;   Restores the context of the usCriticalNesting value and general purpose
+;   registers of the selected task from the task stack
+;------------------------------------------------------------------------------
+portRESTORE_CONTEXT MACRO
+    MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address
+    ld.w    lw1(pxCurrentTCB)[r1],sp
+    MOV     sp,r1
+    ld.w    0[r1],sp                        ; load stackpointer
+    MOV     sp,ep                           ; set stack pointer to element pointer
+    sld.w   0[ep],r1                        ; load usCriticalNesting value from stack
+    MOVHI   hi1(usCriticalNesting),r0,r2
+    st.w    r1,lw1(usCriticalNesting)[r2]
+    sld.w   4[ep],r1                        ; restore general purpose registers
+    sld.w   8[ep],r2
+#if configDATA_MODE == 1                    ; Using Tiny data model
+    sld.w   12[ep],r4
+    sld.w   16[ep],r5
+    sld.w   20[ep],r6
+    sld.w   24[ep],r7
+    sld.w   28[ep],r8
+    sld.w   32[ep],r9
+    sld.w   36[ep],r10
+    sld.w   40[ep],r11
+    sld.w   44[ep],r12
+    sld.w   48[ep],r13
+    sld.w   52[ep],r14
+    sld.w   56[ep],r15
+    sld.w   60[ep],r16
+    sld.w   64[ep],r17
+    sld.w   68[ep],r18
+    sld.w   72[ep],r19
+    dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}
+#else                                       ; Using Small/Large data model
+    sld.w   12[ep],r5
+    sld.w   16[ep],r6
+    sld.w   20[ep],r7
+    sld.w   24[ep],r8
+    sld.w   28[ep],r9
+    sld.w   32[ep],r10
+    sld.w   36[ep],r11
+    sld.w   40[ep],r12
+    sld.w   44[ep],r13
+    sld.w   48[ep],r14
+    sld.w   52[ep],r15
+    sld.w   56[ep],r16
+    sld.w   60[ep],r17
+    sld.w   64[ep],r18
+    sld.w   68[ep],r19
+    dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}
+#endif /* configDATA_MODE */
+    ENDM
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   Restore the context of the first task that is going to run.
+;
+;   Input:  NONE
+;
+;   Call:   CALL    vPortStart
+;
+;   Output: NONE
+;------------------------------------------------------------------------------
+    RSEG CODE:CODE
+vPortStart:
+    portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...
+    ld.w    0[sp],lp
+    ldsr    lp,5                            ; restore PSW
+    DI
+    ld.w    4[sp],lp                        ; restore LP
+    ld.w    8[sp],lp                        ; restore LP
+    ADD     0x0C,sp                         ; set SP to right position
+    EI
+    jmp     [lp]
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   Port Yield function to check for a Task switch in the cooperative and
+;   preemptive mode
+;
+;   Input:  NONE
+;
+;   Call:   CALL    vPortYield
+;
+;   Output: NONE
+;------------------------------------------------------------------------------
+
+    RSEG CODE:CODE
+vPortYield:
+
+    add     -0x0C,sp                          ; prepare stack to save necessary values
+    st.w    lp,8[sp]                        ; store LP to stack
+    stsr    0,r31
+    st.w    lp,4[sp]                        ; store EIPC to stack
+    stsr    1,lp
+    st.w    lp,0[sp]                        ; store EIPSW to stack
+    portSAVE_CONTEXT                    ; Save the context of the current task.
+    jarl    vTaskSwitchContext,lp           ; Call the scheduler.
+    portRESTORE_CONTEXT                 ; Restore the context of whichever task the ...
+                                    ; ... scheduler decided should run.
+    ld.w    0[sp],lp                        ; restore EIPSW from stack
+    ldsr    lp,1
+    ld.w    4[sp],lp                        ; restore EIPC from stack
+    ldsr    lp,0
+    ld.w    8[sp],lp                        ; restore LP from stack
+    add     0x0C,sp                         ; set SP to right position
+
+    RETI
+
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   Perform the necessary steps of the Tick Count Increment and Task Switch
+;   depending on the chosen kernel configuration
+;
+;   Input:  NONE
+;
+;   Call:   ISR
+;
+;   Output: NONE
+;------------------------------------------------------------------------------
+#if configUSE_PREEMPTION == 1               ; use preemptive kernel mode
+
+MD_INTTM0EQ0:
+
+    add     -0x0C,sp                          ; prepare stack to save necessary values
+    st.w    lp,8[sp]                        ; store LP to stack
+    stsr    0,r31
+    st.w    lp,4[sp]                        ; store EIPC to stack
+    stsr    1,lp
+    st.w    lp,0[sp]                        ; store EIPSW to stack
+    portSAVE_CONTEXT                    ; Save the context of the current task.
+    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.
+    jarl    vTaskSwitchContext,lp           ; Call the scheduler.
+    portRESTORE_CONTEXT                 ; Restore the context of whichever task the ...
+                                    ; ... scheduler decided should run.
+    ld.w    0[sp],lp                        ; restore EIPSW from stack
+    ldsr    lp,1
+    ld.w    4[sp],lp                        ; restore EIPC from stack
+    ldsr    lp,0
+    ld.w    8[sp],lp                        ; restore LP from stack
+    add     0x0C,sp                         ; set SP to right position
+
+    RETI
+;------------------------------------------------------------------------------
+#else                                       ; use cooperative kernel mode
+
+MD_INTTM0EQ0:
+    prepare {lp,ep},8,sp
+    sst.w   r1,4[ep]
+    sst.w   r5,0[ep]
+    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.
+    sld.w   0[ep],r5
+    sld.w   4[ep],r1
+    dispose 8,{lp,ep}
+    RETI
+#endif /* configUSE_PREEMPTION */
+
+;------------------------------------------------------------------------------
+        COMMON INTVEC:CODE:ROOT(2)
+        ORG 608
+`??MD_INTTM0EQ0??INTVEC 608`:
+        JR MD_INTTM0EQ0
+
+        RSEG NEAR_ID:CONST:SORT:NOROOT(2)
+`?<Initializer for usCriticalNesting>`:
+        DW 10
+
+      COMMON INTVEC:CODE:ROOT(2)
+      ORG 40H
+`??vPortYield??INTVEC 40`:
+        JR vPortYield
+
+;------------------------------------------------------------------------------
+; set microcontroller security ID
+
+      COMMON INTVEC:CODE:ROOT(2)
+      ORG 70H
+`SECUID`:
+      DB CG_SECURITY0
+      DB CG_SECURITY1
+      DB CG_SECURITY2
+      DB CG_SECURITY3
+      DB CG_SECURITY4
+      DB CG_SECURITY5
+      DB CG_SECURITY6
+      DB CG_SECURITY7
+      DB CG_SECURITY8
+      DB CG_SECURITY9
+
+;------------------------------------------------------------------------------
+; set microcontroller option bytes
+
+      COMMON INTVEC:CODE:ROOT(2)
+      ORG 7AH
+`OPTBYTES`:
+      DB CG_OPTION7A
+      DB CG_OPTION7B
+      DB OPT7C
+      DB OPT7D
+      DB OPT7E
+      DB OPT7F
+
+      END
diff --git a/portable/IAR/V850ES/portasm_Hx2.s85 b/portable/IAR/V850ES/portasm_Hx2.s85
index 0550952..373431f 100644
--- a/portable/IAR/V850ES/portasm_Hx2.s85
+++ b/portable/IAR/V850ES/portasm_Hx2.s85
@@ -1,351 +1,350 @@
-;/*

-; * FreeRTOS Kernel <DEVELOPMENT BRANCH>

-; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

-; *

-; * SPDX-License-Identifier: MIT

-; *

-; * Permission is hereby granted, free of charge, to any person obtaining a copy of

-; * this software and associated documentation files (the "Software"), to deal in

-; * the Software without restriction, including without limitation the rights to

-; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

-; * the Software, and to permit persons to whom the Software is furnished to do so,

-; * subject to the following conditions:

-; *

-; * The above copyright notice and this permission notice shall be included in all

-; * copies or substantial portions of the Software.

-; *

-; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

-; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

-; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

-; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

-; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

-; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-; *

-; * https://www.FreeRTOS.org

-; * https://github.com/FreeRTOS

-; *

-; */

-; Note: Select the correct include files for the device used by the application.

-#include "FreeRTOSConfig.h"

-;------------------------------------------------------------------------------

-

-; Functions used by scheduler

-;------------------------------------------------------------------------------

-    EXTERN    vTaskSwitchContext

-    EXTERN    xTaskIncrementTick

-

-; Variables used by scheduler

-;------------------------------------------------------------------------------

-    EXTERN    pxCurrentTCB

-    EXTERN    usCriticalNesting

-

-; Functions implemented in this file

-;------------------------------------------------------------------------------

-    PUBLIC    vPortYield

-    PUBLIC    vPortStart

-

-; Security ID definition

-;------------------------------------------------------------------------------

-#define	CG_SECURITY0	0FFH

-#define	CG_SECURITY1	0FFH

-#define	CG_SECURITY2	0FFH

-#define	CG_SECURITY3	0FFH

-#define	CG_SECURITY4	0FFH

-#define	CG_SECURITY5	0FFH

-#define	CG_SECURITY6	0FFH

-#define	CG_SECURITY7	0FFH

-#define	CG_SECURITY8	0FFH

-#define	CG_SECURITY9	0FFH

-

-; Tick ISR Prototype

-;------------------------------------------------------------------------------

-        PUBWEAK `??MD_INTTM0EQ0??INTVEC 544`

-        PUBLIC MD_INTTM0EQ0

-

-MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"

-`??MD_INTTM0EQ0??INTVEC 544` SYMBOL "??INTVEC 544", MD_INTTM0EQ0

-

-;------------------------------------------------------------------------------

-;   portSAVE_CONTEXT MACRO

-;   Saves the context of the remaining general purpose registers

-;   and the usCriticalNesting Value of the active Task onto the task stack

-;   saves stack pointer to the TCB

-;------------------------------------------------------------------------------

-portSAVE_CONTEXT MACRO

-#if configDATA_MODE == 1                                        ; Using the Tiny data model

-    prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers

-    sst.w   r19,72[ep]

-    sst.w   r18,68[ep]

-    sst.w   r17,64[ep]

-    sst.w   r16,60[ep]

-    sst.w   r15,56[ep]

-    sst.w   r14,52[ep]

-    sst.w   r13,48[ep]

-    sst.w   r12,44[ep]

-    sst.w   r11,40[ep]

-    sst.w   r10,36[ep]

-    sst.w   r9,32[ep]

-    sst.w   r8,28[ep]

-    sst.w   r7,24[ep]

-    sst.w   r6,20[ep]

-    sst.w   r5,16[ep]

-    sst.w   r4,12[ep]

-#else                                                           ; Using the Small/Large data model

-    prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers

-    sst.w   r19,68[ep]

-    sst.w   r18,64[ep]

-    sst.w   r17,60[ep]

-    sst.w   r16,56[ep]

-    sst.w   r15,52[ep]

-    sst.w   r14,48[ep]

-    sst.w   r13,44[ep]

-    sst.w   r12,40[ep]

-    sst.w   r11,36[ep]

-    sst.w   r10,32[ep]

-    sst.w   r9,28[ep]

-    sst.w   r8,24[ep]

-    sst.w   r7,20[ep]

-    sst.w   r6,16[ep]

-    sst.w   r5,12[ep]

-#endif /* configDATA_MODE */

-    sst.w   r2,8[ep]

-    sst.w   r1,4[ep]

-    MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack

-    ld.w    lw1(usCriticalNesting)[r1],r2

-    sst.w   r2,0[ep]

-    MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB

-    ld.w    lw1(pxCurrentTCB)[r1],r2

-    st.w    sp,0[r2]

-    ENDM

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   portRESTORE_CONTEXT MACRO

-;   Gets stack pointer from the current TCB

-;   Restores the context of the usCriticalNesting value and general purpose

-;   registers of the selected task from the task stack

-;------------------------------------------------------------------------------

-portRESTORE_CONTEXT MACRO

-    MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address

-    ld.w    lw1(pxCurrentTCB)[r1],sp

-    MOV     sp,r1

-    ld.w    0[r1],sp                        ; load stackpointer

-    MOV     sp,ep                           ; set stack pointer to element pointer

-    sld.w   0[ep],r1                        ; load usCriticalNesting value from stack

-    MOVHI   hi1(usCriticalNesting),r0,r2

-    st.w    r1,lw1(usCriticalNesting)[r2]

-    sld.w   4[ep],r1                        ; restore general purpose registers

-    sld.w   8[ep],r2

-#if configDATA_MODE == 1                    ; Using Tiny data model

-    sld.w   12[ep],r4

-    sld.w   16[ep],r5

-    sld.w   20[ep],r6

-    sld.w   24[ep],r7

-    sld.w   28[ep],r8

-    sld.w   32[ep],r9

-    sld.w   36[ep],r10

-    sld.w   40[ep],r11

-    sld.w   44[ep],r12

-    sld.w   48[ep],r13

-    sld.w   52[ep],r14

-    sld.w   56[ep],r15

-    sld.w   60[ep],r16

-    sld.w   64[ep],r17

-    sld.w   68[ep],r18

-    sld.w   72[ep],r19

-    dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}

-#else                                       ; Using Small/Large data model

-    sld.w   12[ep],r5

-    sld.w   16[ep],r6

-    sld.w   20[ep],r7

-    sld.w   24[ep],r8

-    sld.w   28[ep],r9

-    sld.w   32[ep],r10

-    sld.w   36[ep],r11

-    sld.w   40[ep],r12

-    sld.w   44[ep],r13

-    sld.w   48[ep],r14

-    sld.w   52[ep],r15

-    sld.w   56[ep],r16

-    sld.w   60[ep],r17

-    sld.w   64[ep],r18

-    sld.w   68[ep],r19

-    dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}

-#endif /* configDATA_MODE */

-    ENDM

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   Restore the context of the first task that is going to run.

-;

-;   Input:  NONE

-;

-;   Call:   CALL    vPortStart

-;

-;   Output: NONE

-;------------------------------------------------------------------------------

-    RSEG CODE:CODE

-vPortStart:

-    portRESTORE_CONTEXT	                    ; Restore the context of whichever task the ...

-    ld.w    0[sp],lp

-    ldsr    lp,5                            ; restore PSW

-    DI

-    ld.w    4[sp],lp                        ; restore LP

-    ld.w    8[sp],lp                        ; restore LP

-    ADD     0x0C,sp                         ; set SP to right position

-    EI

-    jmp     [lp]

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   Port Yield function to check for a Task switch in the cooperative and

-;   preemptive mode

-;

-;   Input:  NONE

-;

-;   Call:   CALL    vPortYield

-;

-;   Output: NONE

-;------------------------------------------------------------------------------

-

-	RSEG CODE:CODE

-vPortYield:

-

-    add     -0x0C,sp                          ; prepare stack to save necessary values

-    st.w    lp,8[sp]                        ; store LP to stack

-    stsr    0,r31

-    st.w    lp,4[sp]                        ; store EIPC to stack

-    stsr    1,lp

-    st.w    lp,0[sp]                        ; store EIPSW to stack

-    portSAVE_CONTEXT		            ; Save the context of the current task.

-    jarl    vTaskSwitchContext,lp           ; Call the scheduler.

-    portRESTORE_CONTEXT		            ; Restore the context of whichever task the ...

-                		            ; ... scheduler decided should run.

-	ld.w    0[sp],lp                        ; restore EIPSW from stack

-    ldsr    lp,1

-    ld.w    4[sp],lp                        ; restore EIPC from stack

-    ldsr    lp,0

-    ld.w    8[sp],lp                        ; restore LP from stack

-    add     0x0C,sp                         ; set SP to right position

-

-    RETI

-

-;------------------------------------------------------------------------------

-

-;------------------------------------------------------------------------------

-;   Perform the necessary steps of the Tick Count Increment and Task Switch

-;   depending on the chosen kernel configuration

-;

-;   Input:  NONE

-;

-;   Call:   ISR

-;

-;   Output: NONE

-;------------------------------------------------------------------------------

-#if configUSE_PREEMPTION == 1               ; use preemptive kernel mode

-

-MD_INTTM0EQ0:

-

-    add     -0x0C,sp                          ; prepare stack to save necessary values

-    st.w    lp,8[sp]                        ; store LP to stack

-    stsr    0,r31

-    st.w    lp,4[sp]                        ; store EIPC to stack

-    stsr    1,lp

-    st.w    lp,0[sp]                        ; store EIPSW to stack

-    portSAVE_CONTEXT		            ; Save the context of the current task.

-    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.

-    jarl    vTaskSwitchContext,lp           ; Call the scheduler.

-    portRESTORE_CONTEXT		            ; Restore the context of whichever task the ...

-                		            ; ... scheduler decided should run.

-    ld.w    0[sp],lp                        ; restore EIPSW from stack

-    ldsr    lp,1

-    ld.w    4[sp],lp                        ; restore EIPC from stack

-    ldsr    lp,0

-    ld.w    8[sp],lp                        ; restore LP from stack

-    add     0x0C,sp                         ; set SP to right position

-

-    RETI

-;------------------------------------------------------------------------------

-#else                                       ; use cooperative kernel mode

-

-MD_INTTM0EQ0:

-    prepare {lp,ep},8,sp

-    sst.w   r1,4[ep]

-    sst.w   r5,0[ep]

-    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.

-    sld.w   0[ep],r5

-    sld.w   4[ep],r1

-    dispose 8,{lp,ep}

-    RETI

-#endif /* configUSE_PREEMPTION */

-

-;------------------------------------------------------------------------------

-        COMMON INTVEC:CODE:ROOT(2)

-        ORG 544

-`??MD_INTTM0EQ0??INTVEC 544`:

-        JR MD_INTTM0EQ0

-

-        RSEG NEAR_ID:CONST:SORT:NOROOT(2)

-`?<Initializer for usCriticalNesting>`:

-        DW 10

-

-      COMMON INTVEC:CODE:ROOT(2)

-      ORG 40H

-`??vPortYield??INTVEC 40`:

-        JR vPortYield

-

-;------------------------------------------------------------------------------

-; set microcontroller security ID

-

-      COMMON INTVEC:CODE:ROOT(2)

-      ORG 70H

-`SECUID`:

-      DB CG_SECURITY0

-      DB CG_SECURITY1

-      DB CG_SECURITY2

-      DB CG_SECURITY3

-      DB CG_SECURITY4

-      DB CG_SECURITY5

-      DB CG_SECURITY6

-      DB CG_SECURITY7

-      DB CG_SECURITY8

-      DB CG_SECURITY9

-

-

-; set microcontroller Option bytes

-

-      COMMON INTVEC:CODE:ROOT(2)

-      ORG 122

-`OPTBYTES`:

-      DB 0xFD

-      DB 0xFF

-      DB 0xFF

-      DB 0xFF

-      DB 0xFF

-      DB 0xFF

-

-#if configOCD_USAGE == 1

-

-      COMMON   INTVEC:CODE:ROOT(4)

-      ORG      0x230

-      PUBLIC ROM_INT2

-ROM_INT2:

-      DB 0xff, 0xff, 0xff, 0xff

-      DB 0xff, 0xff, 0xff, 0xff

-      DB 0xff, 0xff, 0xff, 0xff

-      DB 0xff, 0xff, 0xff, 0xff

-

-

-      COMMON   INTVEC:CODE:ROOT(4)

-      ORG      0x60

-      PUBLIC   ROM_INT

-ROM_INT:

-      DB 0xff, 0xff, 0xff, 0xff

-      DB 0xff, 0xff, 0xff, 0xff

-      DB 0xff, 0xff, 0xff, 0xff

-      DB 0xff, 0xff, 0xff, 0xff

-

-#endif /* configOCD_USAGE */

-

-      END

-

+;/*
+; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+; *
+; * SPDX-License-Identifier: MIT
+; *
+; * Permission is hereby granted, free of charge, to any person obtaining a copy of
+; * this software and associated documentation files (the "Software"), to deal in
+; * the Software without restriction, including without limitation the rights to
+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+; * the Software, and to permit persons to whom the Software is furnished to do so,
+; * subject to the following conditions:
+; *
+; * The above copyright notice and this permission notice shall be included in all
+; * copies or substantial portions of the Software.
+; *
+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+; *
+; * https://www.FreeRTOS.org
+; * https://github.com/FreeRTOS
+; *
+; */
+; Note: Select the correct include files for the device used by the application.
+#include "FreeRTOSConfig.h"
+;------------------------------------------------------------------------------
+
+; Functions used by scheduler
+;------------------------------------------------------------------------------
+    EXTERN    vTaskSwitchContext
+    EXTERN    xTaskIncrementTick
+
+; Variables used by scheduler
+;------------------------------------------------------------------------------
+    EXTERN    pxCurrentTCB
+    EXTERN    usCriticalNesting
+
+; Functions implemented in this file
+;------------------------------------------------------------------------------
+    PUBLIC    vPortYield
+    PUBLIC    vPortStart
+
+; Security ID definition
+;------------------------------------------------------------------------------
+#define CG_SECURITY0    0FFH
+#define CG_SECURITY1    0FFH
+#define CG_SECURITY2    0FFH
+#define CG_SECURITY3    0FFH
+#define CG_SECURITY4    0FFH
+#define CG_SECURITY5    0FFH
+#define CG_SECURITY6    0FFH
+#define CG_SECURITY7    0FFH
+#define CG_SECURITY8    0FFH
+#define CG_SECURITY9    0FFH
+
+; Tick ISR Prototype
+;------------------------------------------------------------------------------
+        PUBWEAK `??MD_INTTM0EQ0??INTVEC 544`
+        PUBLIC MD_INTTM0EQ0
+
+MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"
+`??MD_INTTM0EQ0??INTVEC 544` SYMBOL "??INTVEC 544", MD_INTTM0EQ0
+
+;------------------------------------------------------------------------------
+;   portSAVE_CONTEXT MACRO
+;   Saves the context of the remaining general purpose registers
+;   and the usCriticalNesting Value of the active Task onto the task stack
+;   saves stack pointer to the TCB
+;------------------------------------------------------------------------------
+portSAVE_CONTEXT MACRO
+#if configDATA_MODE == 1                                        ; Using the Tiny data model
+    prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers
+    sst.w   r19,72[ep]
+    sst.w   r18,68[ep]
+    sst.w   r17,64[ep]
+    sst.w   r16,60[ep]
+    sst.w   r15,56[ep]
+    sst.w   r14,52[ep]
+    sst.w   r13,48[ep]
+    sst.w   r12,44[ep]
+    sst.w   r11,40[ep]
+    sst.w   r10,36[ep]
+    sst.w   r9,32[ep]
+    sst.w   r8,28[ep]
+    sst.w   r7,24[ep]
+    sst.w   r6,20[ep]
+    sst.w   r5,16[ep]
+    sst.w   r4,12[ep]
+#else                                                           ; Using the Small/Large data model
+    prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers
+    sst.w   r19,68[ep]
+    sst.w   r18,64[ep]
+    sst.w   r17,60[ep]
+    sst.w   r16,56[ep]
+    sst.w   r15,52[ep]
+    sst.w   r14,48[ep]
+    sst.w   r13,44[ep]
+    sst.w   r12,40[ep]
+    sst.w   r11,36[ep]
+    sst.w   r10,32[ep]
+    sst.w   r9,28[ep]
+    sst.w   r8,24[ep]
+    sst.w   r7,20[ep]
+    sst.w   r6,16[ep]
+    sst.w   r5,12[ep]
+#endif /* configDATA_MODE */
+    sst.w   r2,8[ep]
+    sst.w   r1,4[ep]
+    MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack
+    ld.w    lw1(usCriticalNesting)[r1],r2
+    sst.w   r2,0[ep]
+    MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB
+    ld.w    lw1(pxCurrentTCB)[r1],r2
+    st.w    sp,0[r2]
+    ENDM
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   portRESTORE_CONTEXT MACRO
+;   Gets stack pointer from the current TCB
+;   Restores the context of the usCriticalNesting value and general purpose
+;   registers of the selected task from the task stack
+;------------------------------------------------------------------------------
+portRESTORE_CONTEXT MACRO
+    MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address
+    ld.w    lw1(pxCurrentTCB)[r1],sp
+    MOV     sp,r1
+    ld.w    0[r1],sp                        ; load stackpointer
+    MOV     sp,ep                           ; set stack pointer to element pointer
+    sld.w   0[ep],r1                        ; load usCriticalNesting value from stack
+    MOVHI   hi1(usCriticalNesting),r0,r2
+    st.w    r1,lw1(usCriticalNesting)[r2]
+    sld.w   4[ep],r1                        ; restore general purpose registers
+    sld.w   8[ep],r2
+#if configDATA_MODE == 1                    ; Using Tiny data model
+    sld.w   12[ep],r4
+    sld.w   16[ep],r5
+    sld.w   20[ep],r6
+    sld.w   24[ep],r7
+    sld.w   28[ep],r8
+    sld.w   32[ep],r9
+    sld.w   36[ep],r10
+    sld.w   40[ep],r11
+    sld.w   44[ep],r12
+    sld.w   48[ep],r13
+    sld.w   52[ep],r14
+    sld.w   56[ep],r15
+    sld.w   60[ep],r16
+    sld.w   64[ep],r17
+    sld.w   68[ep],r18
+    sld.w   72[ep],r19
+    dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}
+#else                                       ; Using Small/Large data model
+    sld.w   12[ep],r5
+    sld.w   16[ep],r6
+    sld.w   20[ep],r7
+    sld.w   24[ep],r8
+    sld.w   28[ep],r9
+    sld.w   32[ep],r10
+    sld.w   36[ep],r11
+    sld.w   40[ep],r12
+    sld.w   44[ep],r13
+    sld.w   48[ep],r14
+    sld.w   52[ep],r15
+    sld.w   56[ep],r16
+    sld.w   60[ep],r17
+    sld.w   64[ep],r18
+    sld.w   68[ep],r19
+    dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}
+#endif /* configDATA_MODE */
+    ENDM
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   Restore the context of the first task that is going to run.
+;
+;   Input:  NONE
+;
+;   Call:   CALL    vPortStart
+;
+;   Output: NONE
+;------------------------------------------------------------------------------
+    RSEG CODE:CODE
+vPortStart:
+    portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...
+    ld.w    0[sp],lp
+    ldsr    lp,5                            ; restore PSW
+    DI
+    ld.w    4[sp],lp                        ; restore LP
+    ld.w    8[sp],lp                        ; restore LP
+    ADD     0x0C,sp                         ; set SP to right position
+    EI
+    jmp     [lp]
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   Port Yield function to check for a Task switch in the cooperative and
+;   preemptive mode
+;
+;   Input:  NONE
+;
+;   Call:   CALL    vPortYield
+;
+;   Output: NONE
+;------------------------------------------------------------------------------
+
+    RSEG CODE:CODE
+vPortYield:
+
+    add     -0x0C,sp                          ; prepare stack to save necessary values
+    st.w    lp,8[sp]                        ; store LP to stack
+    stsr    0,r31
+    st.w    lp,4[sp]                        ; store EIPC to stack
+    stsr    1,lp
+    st.w    lp,0[sp]                        ; store EIPSW to stack
+    portSAVE_CONTEXT                    ; Save the context of the current task.
+    jarl    vTaskSwitchContext,lp           ; Call the scheduler.
+    portRESTORE_CONTEXT                 ; Restore the context of whichever task the ...
+                                    ; ... scheduler decided should run.
+    ld.w    0[sp],lp                        ; restore EIPSW from stack
+    ldsr    lp,1
+    ld.w    4[sp],lp                        ; restore EIPC from stack
+    ldsr    lp,0
+    ld.w    8[sp],lp                        ; restore LP from stack
+    add     0x0C,sp                         ; set SP to right position
+
+    RETI
+
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;   Perform the necessary steps of the Tick Count Increment and Task Switch
+;   depending on the chosen kernel configuration
+;
+;   Input:  NONE
+;
+;   Call:   ISR
+;
+;   Output: NONE
+;------------------------------------------------------------------------------
+#if configUSE_PREEMPTION == 1               ; use preemptive kernel mode
+
+MD_INTTM0EQ0:
+
+    add     -0x0C,sp                          ; prepare stack to save necessary values
+    st.w    lp,8[sp]                        ; store LP to stack
+    stsr    0,r31
+    st.w    lp,4[sp]                        ; store EIPC to stack
+    stsr    1,lp
+    st.w    lp,0[sp]                        ; store EIPSW to stack
+    portSAVE_CONTEXT                    ; Save the context of the current task.
+    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.
+    jarl    vTaskSwitchContext,lp           ; Call the scheduler.
+    portRESTORE_CONTEXT                 ; Restore the context of whichever task the ...
+                                    ; ... scheduler decided should run.
+    ld.w    0[sp],lp                        ; restore EIPSW from stack
+    ldsr    lp,1
+    ld.w    4[sp],lp                        ; restore EIPC from stack
+    ldsr    lp,0
+    ld.w    8[sp],lp                        ; restore LP from stack
+    add     0x0C,sp                         ; set SP to right position
+
+    RETI
+;------------------------------------------------------------------------------
+#else                                       ; use cooperative kernel mode
+
+MD_INTTM0EQ0:
+    prepare {lp,ep},8,sp
+    sst.w   r1,4[ep]
+    sst.w   r5,0[ep]
+    jarl    xTaskIncrementTick,lp           ; Call the timer tick function.
+    sld.w   0[ep],r5
+    sld.w   4[ep],r1
+    dispose 8,{lp,ep}
+    RETI
+#endif /* configUSE_PREEMPTION */
+
+;------------------------------------------------------------------------------
+        COMMON INTVEC:CODE:ROOT(2)
+        ORG 544
+`??MD_INTTM0EQ0??INTVEC 544`:
+        JR MD_INTTM0EQ0
+
+        RSEG NEAR_ID:CONST:SORT:NOROOT(2)
+`?<Initializer for usCriticalNesting>`:
+        DW 10
+
+      COMMON INTVEC:CODE:ROOT(2)
+      ORG 40H
+`??vPortYield??INTVEC 40`:
+        JR vPortYield
+
+;------------------------------------------------------------------------------
+; set microcontroller security ID
+
+      COMMON INTVEC:CODE:ROOT(2)
+      ORG 70H
+`SECUID`:
+      DB CG_SECURITY0
+      DB CG_SECURITY1
+      DB CG_SECURITY2
+      DB CG_SECURITY3
+      DB CG_SECURITY4
+      DB CG_SECURITY5
+      DB CG_SECURITY6
+      DB CG_SECURITY7
+      DB CG_SECURITY8
+      DB CG_SECURITY9
+
+
+; set microcontroller Option bytes
+
+      COMMON INTVEC:CODE:ROOT(2)
+      ORG 122
+`OPTBYTES`:
+      DB 0xFD
+      DB 0xFF
+      DB 0xFF
+      DB 0xFF
+      DB 0xFF
+      DB 0xFF
+
+#if configOCD_USAGE == 1
+
+      COMMON   INTVEC:CODE:ROOT(4)
+      ORG      0x230
+      PUBLIC ROM_INT2
+ROM_INT2:
+      DB 0xff, 0xff, 0xff, 0xff
+      DB 0xff, 0xff, 0xff, 0xff
+      DB 0xff, 0xff, 0xff, 0xff
+      DB 0xff, 0xff, 0xff, 0xff
+
+
+      COMMON   INTVEC:CODE:ROOT(4)
+      ORG      0x60
+      PUBLIC   ROM_INT
+ROM_INT:
+      DB 0xff, 0xff, 0xff, 0xff
+      DB 0xff, 0xff, 0xff, 0xff
+      DB 0xff, 0xff, 0xff, 0xff
+      DB 0xff, 0xff, 0xff, 0xff
+
+#endif /* configOCD_USAGE */
+
+      END
diff --git a/portable/IAR/V850ES/portmacro.h b/portable/IAR/V850ES/portmacro.h
index 4d07aae..0381f02 100644
--- a/portable/IAR/V850ES/portmacro.h
+++ b/portable/IAR/V850ES/portmacro.h
@@ -1,136 +1,135 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * Permission is hereby granted, free of charge, to any person obtaining a copy of

- * this software and associated documentation files (the "Software"), to deal in

- * the Software without restriction, including without limitation the rights to

- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

- * the Software, and to permit persons to whom the Software is furnished to do so,

- * subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in all

- * copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-#define portCHAR        char

-#define portFLOAT       float

-#define portDOUBLE      double

-#define portLONG        long

-#define portSHORT       short

-#define portSTACK_TYPE  unsigned int

-#define portBASE_TYPE   int

-

-typedef portSTACK_TYPE StackType_t;

-typedef long BaseType_t;

-typedef unsigned long UBaseType_t;

-

-

-#if (configUSE_16_BIT_TICKS==1)

-	typedef uint16_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffff

-#else

-	typedef uint32_t TickType_t;

-	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

-#endif

-/*-----------------------------------------------------------*/

-

-/* Interrupt control macros. */

-#define portDISABLE_INTERRUPTS() __asm ( "DI" )

-#define portENABLE_INTERRUPTS()	 __asm ( "EI" )

-/*-----------------------------------------------------------*/

-

-/* Critical section control macros. */

-#define portNO_CRITICAL_SECTION_NESTING		( ( UBaseType_t ) 0 )

-

-#define portENTER_CRITICAL()														\

-{																					\

-extern volatile /*uint16_t*/ portSTACK_TYPE usCriticalNesting;						\

-																					\

-	portDISABLE_INTERRUPTS();														\

-																					\

-	/* Now interrupts are disabled ulCriticalNesting can be accessed */				\

-	/* directly.  Increment ulCriticalNesting to keep a count of how many */		\

-	/* times portENTER_CRITICAL() has been called. */								\

-	usCriticalNesting++;															\

-}

-

-#define portEXIT_CRITICAL()															\

-{																					\

-extern volatile /*uint16_t*/ portSTACK_TYPE usCriticalNesting;						\

-																					\

-	if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )						\

-	{																				\

-		/* Decrement the nesting count as we are leaving a critical section. */		\

-		usCriticalNesting--;														\

-																					\

-		/* If the nesting level has reached zero then interrupts should be */		\

-		/* re-enabled. */															\

-		if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )					\

-		{																			\

-			portENABLE_INTERRUPTS();												\

-		}																			\

-	}																				\

-}

-/*-----------------------------------------------------------*/

-

-/* Task utilities. */

-extern void vPortYield( void );

-extern void vPortStart( void );

-extern void portSAVE_CONTEXT( void );

-extern void portRESTORE_CONTEXT( void );

-#define portYIELD()	__asm ( "trap 0" )

-#define portNOP()	__asm ( "NOP" )

-extern void vTaskSwitchContext( void );

-#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 )

-

-/*-----------------------------------------------------------*/

-

-/* Hardwware specifics. */

-#define portBYTE_ALIGNMENT	4

-#define portSTACK_GROWTH	( -1 )

-#define portTICK_PERIOD_MS	( ( TickType_t ) 1000 / configTICK_RATE_HZ )

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef PORTMACRO_H
+#define PORTMACRO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------
+ * Port specific definitions.
+ *
+ * The settings in this file configure FreeRTOS correctly for the
+ * given hardware and compiler.
+ *
+ * These settings should not be altered.
+ *-----------------------------------------------------------
+ */
+
+/* Type definitions. */
+#define portCHAR        char
+#define portFLOAT       float
+#define portDOUBLE      double
+#define portLONG        long
+#define portSHORT       short
+#define portSTACK_TYPE  unsigned int
+#define portBASE_TYPE   int
+
+typedef portSTACK_TYPE StackType_t;
+typedef long BaseType_t;
+typedef unsigned long UBaseType_t;
+
+
+#if (configUSE_16_BIT_TICKS==1)
+    typedef uint16_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffff
+#else
+    typedef uint32_t TickType_t;
+    #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+#endif
+/*-----------------------------------------------------------*/
+
+/* Interrupt control macros. */
+#define portDISABLE_INTERRUPTS() __asm ( "DI" )
+#define portENABLE_INTERRUPTS()  __asm ( "EI" )
+/*-----------------------------------------------------------*/
+
+/* Critical section control macros. */
+#define portNO_CRITICAL_SECTION_NESTING     ( ( UBaseType_t ) 0 )
+
+#define portENTER_CRITICAL()                                                        \
+{                                                                                   \
+extern volatile /*uint16_t*/ portSTACK_TYPE usCriticalNesting;                      \
+                                                                                    \
+    portDISABLE_INTERRUPTS();                                                       \
+                                                                                    \
+    /* Now interrupts are disabled ulCriticalNesting can be accessed */             \
+    /* directly.  Increment ulCriticalNesting to keep a count of how many */        \
+    /* times portENTER_CRITICAL() has been called. */                               \
+    usCriticalNesting++;                                                            \
+}
+
+#define portEXIT_CRITICAL()                                                         \
+{                                                                                   \
+extern volatile /*uint16_t*/ portSTACK_TYPE usCriticalNesting;                      \
+                                                                                    \
+    if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )                       \
+    {                                                                               \
+        /* Decrement the nesting count as we are leaving a critical section. */     \
+        usCriticalNesting--;                                                        \
+                                                                                    \
+        /* If the nesting level has reached zero then interrupts should be */       \
+        /* re-enabled. */                                                           \
+        if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )                  \
+        {                                                                           \
+            portENABLE_INTERRUPTS();                                                \
+        }                                                                           \
+    }                                                                               \
+}
+/*-----------------------------------------------------------*/
+
+/* Task utilities. */
+extern void vPortYield( void );
+extern void vPortStart( void );
+extern void portSAVE_CONTEXT( void );
+extern void portRESTORE_CONTEXT( void );
+#define portYIELD() __asm ( "trap 0" )
+#define portNOP()   __asm ( "NOP" )
+extern void vTaskSwitchContext( void );
+#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 )
+
+/*-----------------------------------------------------------*/
+
+/* Hardwware specifics. */
+#define portBYTE_ALIGNMENT  4
+#define portSTACK_GROWTH    ( -1 )
+#define portTICK_PERIOD_MS  ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+/*-----------------------------------------------------------*/
+
+/* Task function macros as described on the FreeRTOS.org WEB site. */
+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PORTMACRO_H */