]> rtime.felk.cvut.cz Git - CanFestival-3.git/commitdiff
V0.8
authorpeter <peter>
Wed, 22 Oct 2008 19:17:38 +0000 (19:17 +0000)
committerpeter <peter>
Wed, 22 Oct 2008 19:17:38 +0000 (19:17 +0000)
15 files changed:
examples/AT91/Master/AT91SAM7X-EK.h [new file with mode: 0644]
examples/AT91/Master/Makefile [new file with mode: 0644]
examples/AT91/Master/ObjDict.c [new file with mode: 0644]
examples/AT91/Master/ObjDict.h [new file with mode: 0644]
examples/AT91/Master/ObjDict.od [new file with mode: 0644]
examples/AT91/Master/interrupt_timer.c [new file with mode: 0644]
examples/AT91/Master/io_macro.h [new file with mode: 0644]
examples/AT91/Master/main.c [new file with mode: 0644]
include/AT91/Atmel/lib_AT91SAM7X256.h [new file with mode: 0644]
include/AT91/applicfg.h [new file with mode: 0644]
include/AT91/can_AT91.h [new file with mode: 0644]
include/AT91/canfestival.h [new file with mode: 0644]
include/AT91/config.h [new file with mode: 0644]
include/AT91/iar.h [new file with mode: 0644]
include/AT91/timerscfg.h [new file with mode: 0644]

diff --git a/examples/AT91/Master/AT91SAM7X-EK.h b/examples/AT91/Master/AT91SAM7X-EK.h
new file mode 100644 (file)
index 0000000..9834675
--- /dev/null
@@ -0,0 +1,61 @@
+// ----------------------------------------------------------------------------
+//         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           : AT91SAM7X-EK.h
+// Object              : AT91SAM7X-EK Evaluation Board Features Definition File
+//
+//  ----------------------------------------------------------------------------
+
+#ifndef AT91SAM7X_EK_H
+#define AT91SAM7X_EK_H
+
+/*-----------------*/
+/* LEDs Definition */
+/*-----------------*/
+#define AT91B_LED1            (1<<19)       // AT91C_PIO_PB19 AT91C_PB19_PWM0 AT91C_PB19_TCLK1
+#define AT91B_LED2            (1<<20)       // AT91C_PIO_PB20 AT91C_PB20_PWM1 AT91C_PB20_PWM1
+#define AT91B_LED3            (AT91C_PIO_PB21)       // AT91C_PIO_PB21 AT91C_PB21_PWM2 AT91C_PB21_PCK1
+#define AT91B_LED4            (AT91C_PIO_PB22)       // AT91C_PIO_PB22 AT91C_PB22_PWM3 AT91C_PB22_PCK2
+#define AT91B_NB_LEB          4
+#define AT91B_LED_MASK        (AT91B_LED1|AT91B_LED2|AT91B_LED3|AT91B_LED4)
+#define AT91D_BASE_PIO_LED       (AT91C_BASE_PIOB)
+
+#define AT91B_POWERLED        (1<<25)       // PB25
+
+
+/*-------------------------------*/
+/* JOYSTICK Position Definition  */
+/*-------------------------------*/
+#define AT91B_SW1           (1<<21)  // PA21 Up Button   AT91C_PA21_TF  AT91C_PA21_NPCS10
+#define AT91B_SW2           (1<<22)  // PA22 Down Button  AT91C_PA22_TK         AT91C_PA22_SPCK1
+#define AT91B_SW3           (1<<23)  // PA23 Left Button  AT91C_PA23_TD  AT91C_PA23_MOSI1
+#define AT91B_SW4           (1<<24)  // PA24 Right Button AT91C_PA24_RD         AT91C_PA24_MISO1
+#define AT91B_SW5           (1<<25)  // PA25 Push Button  AT91C_PA25_RK         AT91C_PA25_NPCS11
+#define AT91B_SW_MASK       (AT91B_SW1|AT91B_SW2|AT91B_SW3|AT91B_SW4|AT91B_SW5)
+
+
+#define AT91D_BASE_PIO_SW   (AT91C_BASE_PIOA)
+
+/*------------------*/
+/* CAN Definition   */
+/*------------------*/
+#define AT91B_CAN_TRANSCEIVER_RS  (1<<2)    // PA2
+
+/*--------------*/
+/* Clocks       */
+/*--------------*/
+#define AT91B_MAIN_OSC        18432000               // Main Oscillator MAINCK
+#define AT91B_MCK             ((18432000*73/14)/2)   // Output PLL Clock
+
+#endif /* AT91SAM7X-EK_H */
diff --git a/examples/AT91/Master/Makefile b/examples/AT91/Master/Makefile
new file mode 100644 (file)
index 0000000..4fbbe2e
--- /dev/null
@@ -0,0 +1,102 @@
+###############################################################################
+# Makefile for the project MasterAT91
+###############################################################################
+
+## General Flags
+PROJECT = MasterAT91
+MCU = arm7tdmi
+TARGET = AT91
+CC = arm-gcc.exe
+SRC = ../../../src
+DRV = ../../../drivers/AT91
+INC = ../../../include
+
+## Options common to compile, link and assembly rules
+COMMON = -mmcu=$(MCU)
+
+## Compile options common for all C compilation units.
+CFLAGS = $(COMMON)
+CFLAGS += -Wall -gdwarf-2 -Os -fsigned-char -fpack-struct
+#CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d 
+
+## Assembly specific flags
+ASMFLAGS = $(COMMON)
+ASMFLAGS += $(CFLAGS)
+ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2
+
+## Linker flags
+LDFLAGS = $(COMMON)
+LDFLAGS +=  -Wl,-Map=$(PROJECT).map
+
+## Intel Hex file production flags
+HEX_FLASH_FLAGS = -R .eeprom
+
+HEX_EEPROM_FLAGS = -j .eeprom
+HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
+HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings
+
+## Include Directories
+INCLUDES = -I$(INC) -I$(INC)/AT91
+
+## Objects that must be built in order to link
+OBJECTS =      $(DRV)/can_AT91.o\
+               $(DRV)/timer_AT91.o\
+               $(SRC)/dcf.o\
+               $(SRC)/timer.o\
+               $(SRC)/emcy.o\
+               $(SRC)/lifegrd.o\
+               $(SRC)/lss.o\
+               $(SRC)/nmtMaster.o\
+               $(SRC)/nmtSlave.o\
+               $(SRC)/objacces.o\
+               $(SRC)/pdo.o\
+               $(SRC)/sdo.o\
+               $(SRC)/states.o\
+               $(SRC)/sync.o\
+               ObjDict.o\
+               interrupt_timer.o\
+               main.o
+
+## Build
+all: $(PROJECT).elf $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss size
+
+## Compile
+%.o: %.c
+#      @echo " "
+       @echo "---------------------------------------------------------------------------"
+       @echo "**Compiling $< -> $@"
+#      @echo "*********************************************"
+       $(CC) $(INCLUDES) $(CFLAGS) -c $<
+#      $(CC) $(INCLUDES) $(CFLAGS) -c -o $@ $< 
+
+
+##Link
+$(PROJECT).elf: $(OBJECTS)
+#      @echo " "
+       @echo "---------------------------------------------------------------------------"
+       @echo "**Linking :  $@"
+#      @echo "*********************************************"
+       $(CC) $(LDFLAGS) $(LIBDIRS) $(LIBS) $(^F) -o $@
+
+%.hex: $(PROJECT).elf
+       arm-elf-objcopy.exe -O ihex $(HEX_FLASH_FLAGS)  $< $@
+
+%.eep: $(PROJECT).elf
+       -arm-elf-objcopy.exe $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0
+
+%.lss: $(PROJECT).elf
+       arm-elf-objdump.exe -h -S $< > $@
+
+size: $(PROJECT).elf
+       @echo
+       @arm-elf-size -C --mcu=${MCU} $(PROJECT).elf
+
+## Clean target
+.PHONY: clean
+clean:
+       -rm -rf *.o $(PROJECT).elf dep/* $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss $(PROJECT).map
+
+
+## Other dependencies
+-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
+
diff --git a/examples/AT91/Master/ObjDict.c b/examples/AT91/Master/ObjDict.c
new file mode 100644 (file)
index 0000000..d098108
--- /dev/null
@@ -0,0 +1,328 @@
+
+/* File generated by gen_cfile.py. Should not be modified. */
+
+#include "ObjDict.h"
+
+/**************************************************************************/
+/* Declaration of the mapped variables                                    */
+/**************************************************************************/
+UNS8 DI1 = 0x0;                /* Mapped at index 0x2000, subindex 0x00 */
+UNS8 DI2 = 0x0;                /* Mapped at index 0x2001, subindex 0x00 */
+UNS8 DO1 = 0x0;                /* Mapped at index 0x2100, subindex 0x00 */
+UNS8 DO2 = 0x0;                /* Mapped at index 0x2101, subindex 0x00 */
+
+/**************************************************************************/
+/* Declaration of the value range types                                   */
+/**************************************************************************/
+
+#define valueRange_EMC 0x9F /* Type for index 0x1003 subindex 0x00 (only set of value 0 is possible) */
+UNS32 ObjDict_valueRangeTest (UNS8 typeValue, void * value)
+{
+  switch (typeValue) {
+    case valueRange_EMC:
+      if (*(UNS8*)value != (UNS8)0) return OD_VALUE_RANGE_EXCEEDED;
+      break;
+  }
+  return 0;
+}
+
+/**************************************************************************/
+/* The node id                                                            */
+/**************************************************************************/
+/* node_id default value.*/
+UNS8 ObjDict_bDeviceNodeId = 0x00;
+
+/**************************************************************************/
+/* Array of message processing information */
+
+const UNS8 ObjDict_iam_a_slave = 0;
+
+TIMER_HANDLE ObjDict_heartBeatTimers[1] = {TIMER_NONE};
+
+/*
+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
+
+                               OBJECT DICTIONARY
+
+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
+*/
+
+/* index 0x1000 :   Device Type. */
+                    UNS32 ObjDict_obj1000 = 0x30191;   /* 197009 */
+                    subindex ObjDict_Index1000[] = 
+                     {
+                       { RO, uint32, sizeof (UNS32), (void*)&ObjDict_obj1000 }
+                     };
+
+/* index 0x1001 :   Error Register. */
+                    UNS8 ObjDict_obj1001 = 0x0;        /* 0 */
+                    subindex ObjDict_Index1001[] = 
+                     {
+                       { RO, uint8, sizeof (UNS8), (void*)&ObjDict_obj1001 }
+                     };
+
+/* index 0x1003 :   Pre-defined Error Field */
+                    UNS8 ObjDict_highestSubIndex_obj1003 = 0; /* number of subindex - 1*/
+                    UNS32 ObjDict_obj1003[] = 
+                    {
+                      0x0      /* 0 */
+                    };
+                    ODCallback_t ObjDict_Index1003_callbacks[] = 
+                     {
+                       NULL,
+                       NULL,
+                     };
+                    subindex ObjDict_Index1003[] = 
+                     {
+                       { RW, valueRange_EMC, sizeof (UNS8), (void*)&ObjDict_highestSubIndex_obj1003 },
+                       { RO, uint32, sizeof (UNS32), (void*)&ObjDict_obj1003[0] }
+                     };
+
+/* index 0x1005 :   SYNC COB ID. */
+                    UNS32 ObjDict_obj1005 = 0x40000080;        /* 1073741952 */
+                    ODCallback_t ObjDict_Index1005_callbacks[] = 
+                     {
+                       NULL,
+                     };
+                    subindex ObjDict_Index1005[] = 
+                     {
+                       { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1005 }
+                     };
+
+/* index 0x1006 :   Communication / Cycle Period. */
+                    UNS32 ObjDict_obj1006 = 0xF4240;   /* 1000000 */
+                    ODCallback_t ObjDict_Index1006_callbacks[] = 
+                     {
+                       NULL,
+                     };
+                    subindex ObjDict_Index1006[] = 
+                     {
+                       { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1006 }
+                     };
+
+/* index 0x1014 :   Emergency COB ID */
+                    UNS32 ObjDict_obj1014 = 0x0;   /* 0 */
+
+/* index 0x1016 :   Consumer Heartbeat Time. */
+                    UNS8 ObjDict_highestSubIndex_obj1016 = 1; /* number of subindex - 1*/
+                    UNS32 ObjDict_obj1016[] = 
+                    {
+                      0x4005DC /* 4195804 */
+                    };
+                    subindex ObjDict_Index1016[] = 
+                     {
+                       { RO, uint8, sizeof (UNS8), (void*)&ObjDict_highestSubIndex_obj1016 },
+                       { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1016[0] }
+                     };
+
+/* index 0x1017 :   Producer Heartbeat Time */ 
+                    UNS16 ObjDict_obj1017 = 0x0;   /* 0 */
+
+/* index 0x1018 :   Identity. */
+                    UNS8 ObjDict_highestSubIndex_obj1018 = 4; /* number of subindex - 1*/
+                    UNS32 ObjDict_obj1018_Vendor_ID = 0x0;     /* 0 */
+                    UNS32 ObjDict_obj1018_Product_Code = 0x0;  /* 0 */
+                    UNS32 ObjDict_obj1018_Revision_Number = 0x0;       /* 0 */
+                    UNS32 ObjDict_obj1018_Serial_Number = 0x0; /* 0 */
+                    subindex ObjDict_Index1018[] = 
+                     {
+                       { RO, uint8, sizeof (UNS8), (void*)&ObjDict_highestSubIndex_obj1018 },
+                       { RO, uint32, sizeof (UNS32), (void*)&ObjDict_obj1018_Vendor_ID },
+                       { RO, uint32, sizeof (UNS32), (void*)&ObjDict_obj1018_Product_Code },
+                       { RO, uint32, sizeof (UNS32), (void*)&ObjDict_obj1018_Revision_Number },
+                       { RO, uint32, sizeof (UNS32), (void*)&ObjDict_obj1018_Serial_Number }
+                     };
+
+/* index 0x1200 :   Server SDO Parameter. */
+                    UNS8 ObjDict_highestSubIndex_obj1200 = 2; /* number of subindex - 1*/
+                    UNS32 ObjDict_obj1200_COB_ID_Client_to_Server_Receive_SDO = 0x600; /* 1536 */
+                    UNS32 ObjDict_obj1200_COB_ID_Server_to_Client_Transmit_SDO = 0x580;        /* 1408 */
+                    subindex ObjDict_Index1200[] = 
+                     {
+                       { RO, uint8, sizeof (UNS8), (void*)&ObjDict_highestSubIndex_obj1200 },
+                       { RO, uint32, sizeof (UNS32), (void*)&ObjDict_obj1200_COB_ID_Client_to_Server_Receive_SDO },
+                       { RO, uint32, sizeof (UNS32), (void*)&ObjDict_obj1200_COB_ID_Server_to_Client_Transmit_SDO }
+                     };
+
+/* index 0x1280 :   Client SDO 1 Parameter. */
+                    UNS8 ObjDict_highestSubIndex_obj1280 = 3; /* number of subindex - 1*/
+                    UNS32 ObjDict_obj1280_COB_ID_Client_to_Server_Transmit_SDO = 0x640;        /* 1600 */
+                    UNS32 ObjDict_obj1280_COB_ID_Server_to_Client_Receive_SDO = 0x5C0; /* 1472 */
+                    UNS8 ObjDict_obj1280_Node_ID_of_the_SDO_Server = 0x40;     /* 64 */
+                    subindex ObjDict_Index1280[] = 
+                     {
+                       { RO, uint8, sizeof (UNS8), (void*)&ObjDict_highestSubIndex_obj1280 },
+                       { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1280_COB_ID_Client_to_Server_Transmit_SDO },
+                       { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1280_COB_ID_Server_to_Client_Receive_SDO },
+                       { RW, uint8, sizeof (UNS8), (void*)&ObjDict_obj1280_Node_ID_of_the_SDO_Server }
+                     };
+
+/* index 0x1400 :   Receive PDO 1 Parameter. */
+                    UNS8 ObjDict_highestSubIndex_obj1400 = 5; /* number of subindex - 1*/
+                    UNS32 ObjDict_obj1400_COB_ID_used_by_PDO = 0x181;  /* 385 */
+                    UNS8 ObjDict_obj1400_Transmission_Type = 0x1;      /* 1 */
+                    UNS16 ObjDict_obj1400_Inhibit_Time = 0x0;  /* 0 */
+                    UNS8 ObjDict_obj1400_Compatibility_Entry = 0x0;    /* 0 */
+                    UNS16 ObjDict_obj1400_Event_Timer = 0x0;   /* 0 */
+                    subindex ObjDict_Index1400[] = 
+                     {
+                       { RO, uint8, sizeof (UNS8), (void*)&ObjDict_highestSubIndex_obj1400 },
+                       { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1400_COB_ID_used_by_PDO },
+                       { RW, uint8, sizeof (UNS8), (void*)&ObjDict_obj1400_Transmission_Type },
+                       { RW, uint16, sizeof (UNS16), (void*)&ObjDict_obj1400_Inhibit_Time },
+                       { RW, uint8, sizeof (UNS8), (void*)&ObjDict_obj1400_Compatibility_Entry },
+                       { RW, uint16, sizeof (UNS16), (void*)&ObjDict_obj1400_Event_Timer }
+                     };
+
+/* index 0x1600 :   Receive PDO 1 Mapping. */
+                    UNS8 ObjDict_highestSubIndex_obj1600 = 1; /* number of subindex - 1*/
+                    UNS32 ObjDict_obj1600[] = 
+                    {
+                      0x20000008       /* 536870920 */
+                    };
+                    subindex ObjDict_Index1600[] = 
+                     {
+                       { RW, uint8, sizeof (UNS8), (void*)&ObjDict_highestSubIndex_obj1600 },
+                       { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1600[0] }
+                     };
+
+/* index 0x1800 :   Transmit PDO 1 Parameter. */
+                    UNS8 ObjDict_highestSubIndex_obj1800 = 5; /* number of subindex - 1*/
+                    UNS32 ObjDict_obj1800_COB_ID_used_by_PDO = 0x201;  /* 513 */
+                    UNS8 ObjDict_obj1800_Transmission_Type = 0xFF;     /* 255 */
+                    UNS16 ObjDict_obj1800_Inhibit_Time = 0x0;  /* 0 */
+                    UNS8 ObjDict_obj1800_Compatibility_Entry = 0x0;    /* 0 */
+                    UNS16 ObjDict_obj1800_Event_Timer = 0x0;   /* 0 */
+                    ODCallback_t ObjDict_Index1800_callbacks[] = 
+                     {
+                       NULL,
+                       NULL,
+                       NULL,
+                       NULL,
+                       NULL,
+                       NULL,
+                     };
+                    subindex ObjDict_Index1800[] = 
+                     {
+                       { RO, uint8, sizeof (UNS8), (void*)&ObjDict_highestSubIndex_obj1800 },
+                       { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1800_COB_ID_used_by_PDO },
+                       { RW, uint8, sizeof (UNS8), (void*)&ObjDict_obj1800_Transmission_Type },
+                       { RW, uint16, sizeof (UNS16), (void*)&ObjDict_obj1800_Inhibit_Time },
+                       { RW, uint8, sizeof (UNS8), (void*)&ObjDict_obj1800_Compatibility_Entry },
+                       { RW, uint16, sizeof (UNS16), (void*)&ObjDict_obj1800_Event_Timer }
+                     };
+
+/* index 0x1A00 :   Transmit PDO 1 Mapping. */
+                    UNS8 ObjDict_highestSubIndex_obj1A00 = 1; /* number of subindex - 1*/
+                    UNS32 ObjDict_obj1A00[] = 
+                    {
+                      0x21000008       /* 553648136 */
+                    };
+                    subindex ObjDict_Index1A00[] = 
+                     {
+                       { RW, uint8, sizeof (UNS8), (void*)&ObjDict_highestSubIndex_obj1A00 },
+                       { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1A00[0] }
+                     };
+
+/* index 0x2000 :   Mapped variable DI1 */
+                    subindex ObjDict_Index2000[] = 
+                     {
+                       { RW, uint8, sizeof (UNS8), (void*)&DI1 }
+                     };
+
+/* index 0x2001 :   Mapped variable DI2 */
+                    subindex ObjDict_Index2001[] = 
+                     {
+                       { RW, uint8, sizeof (UNS8), (void*)&DI2 }
+                     };
+
+/* index 0x2100 :   Mapped variable DO1 */
+                    subindex ObjDict_Index2100[] = 
+                     {
+                       { RW, uint8, sizeof (UNS8), (void*)&DO1 }
+                     };
+
+/* index 0x2101 :   Mapped variable DO2 */
+                    subindex ObjDict_Index2101[] = 
+                     {
+                       { RW, uint8, sizeof (UNS8), (void*)&DO2 }
+                     };
+
+const indextable ObjDict_objdict[] = 
+{
+  { (subindex*)ObjDict_Index1000,sizeof(ObjDict_Index1000)/sizeof(ObjDict_Index1000[0]), 0x1000},
+  { (subindex*)ObjDict_Index1001,sizeof(ObjDict_Index1001)/sizeof(ObjDict_Index1001[0]), 0x1001},
+  { (subindex*)ObjDict_Index1005,sizeof(ObjDict_Index1005)/sizeof(ObjDict_Index1005[0]), 0x1005},
+  { (subindex*)ObjDict_Index1006,sizeof(ObjDict_Index1006)/sizeof(ObjDict_Index1006[0]), 0x1006},
+  { (subindex*)ObjDict_Index1016,sizeof(ObjDict_Index1016)/sizeof(ObjDict_Index1016[0]), 0x1016},
+  { (subindex*)ObjDict_Index1018,sizeof(ObjDict_Index1018)/sizeof(ObjDict_Index1018[0]), 0x1018},
+  { (subindex*)ObjDict_Index1200,sizeof(ObjDict_Index1200)/sizeof(ObjDict_Index1200[0]), 0x1200},
+  { (subindex*)ObjDict_Index1280,sizeof(ObjDict_Index1280)/sizeof(ObjDict_Index1280[0]), 0x1280},
+  { (subindex*)ObjDict_Index1400,sizeof(ObjDict_Index1400)/sizeof(ObjDict_Index1400[0]), 0x1400},
+  { (subindex*)ObjDict_Index1600,sizeof(ObjDict_Index1600)/sizeof(ObjDict_Index1600[0]), 0x1600},
+  { (subindex*)ObjDict_Index1800,sizeof(ObjDict_Index1800)/sizeof(ObjDict_Index1800[0]), 0x1800},
+  { (subindex*)ObjDict_Index1A00,sizeof(ObjDict_Index1A00)/sizeof(ObjDict_Index1A00[0]), 0x1A00},
+  { (subindex*)ObjDict_Index2000,sizeof(ObjDict_Index2000)/sizeof(ObjDict_Index2000[0]), 0x2000},
+  { (subindex*)ObjDict_Index2001,sizeof(ObjDict_Index2001)/sizeof(ObjDict_Index2001[0]), 0x2001},
+  { (subindex*)ObjDict_Index2100,sizeof(ObjDict_Index2100)/sizeof(ObjDict_Index2100[0]), 0x2100},
+  { (subindex*)ObjDict_Index2101,sizeof(ObjDict_Index2101)/sizeof(ObjDict_Index2101[0]), 0x2101},
+};
+
+const indextable * ObjDict_scanIndexOD (UNS16 wIndex, UNS32 * errorCode, ODCallback_t **callbacks)
+{
+       int i;
+       *callbacks = NULL;
+       switch(wIndex){
+               case 0x1000: i = 0;break;
+               case 0x1001: i = 1;break;
+               case 0x1005: i = 2;*callbacks = ObjDict_Index1005_callbacks; break;
+               case 0x1006: i = 3;*callbacks = ObjDict_Index1006_callbacks; break;
+               case 0x1016: i = 4;break;
+               case 0x1018: i = 5;break;
+               case 0x1200: i = 6;break;
+               case 0x1280: i = 7;break;
+               case 0x1400: i = 8;break;
+               case 0x1600: i = 9;break;
+               case 0x1800: i = 10;*callbacks = ObjDict_Index1800_callbacks; break;
+               case 0x1A00: i = 11;break;
+               case 0x2000: i = 12;break;
+               case 0x2001: i = 13;break;
+               case 0x2100: i = 14;break;
+               case 0x2101: i = 15;break;
+               default:
+                       *errorCode = OD_NO_SUCH_OBJECT;
+                       return NULL;
+       }
+       *errorCode = OD_SUCCESSFUL;
+       return &ObjDict_objdict[i];
+}
+
+/* 
+ * To count at which received SYNC a PDO must be sent.
+ * Even if no pdoTransmit are defined, at least one entry is computed
+ * for compilations issues.
+ */
+s_PDO_status ObjDict_PDO_status[1] = {s_PDO_status_Initializer};
+
+quick_index ObjDict_firstIndex = {
+  6, /* SDO_SVR */
+  7, /* SDO_CLT */
+  8, /* PDO_RCV */
+  9, /* PDO_RCV_MAP */
+  10, /* PDO_TRS */
+  11 /* PDO_TRS_MAP */
+};
+
+quick_index ObjDict_lastIndex = {
+  6, /* SDO_SVR */
+  7, /* SDO_CLT */
+  8, /* PDO_RCV */
+  9, /* PDO_RCV_MAP */
+  10, /* PDO_TRS */
+  11 /* PDO_TRS_MAP */
+};
+
+UNS16 ObjDict_ObjdictSize = sizeof(ObjDict_objdict)/sizeof(ObjDict_objdict[0]); 
+
+CO_Data ObjDict_Data = CANOPEN_NODE_DATA_INITIALIZER(ObjDict);
+
diff --git a/examples/AT91/Master/ObjDict.h b/examples/AT91/Master/ObjDict.h
new file mode 100644 (file)
index 0000000..0c75b66
--- /dev/null
@@ -0,0 +1,20 @@
+
+/* File generated by gen_cfile.py. Should not be modified. */
+
+#ifndef OBJDICT_H
+#define OBJDICT_H
+
+#include "data.h"
+
+/* Prototypes of function provided by object dictionnary */
+UNS32 ObjDict_valueRangeTest (UNS8 typeValue, void * value);
+const indextable * ObjDict_scanIndexOD (UNS16 wIndex, UNS32 * errorCode, ODCallback_t **callbacks);
+
+/* Master node data struct */
+extern CO_Data ObjDict_Data;
+extern UNS8 DI1;               /* Mapped at index 0x2000, subindex 0x00*/
+extern UNS8 DI2;               /* Mapped at index 0x2001, subindex 0x00*/
+extern UNS8 DO1;               /* Mapped at index 0x2100, subindex 0x00*/
+extern UNS8 DO2;               /* Mapped at index 0x2101, subindex 0x00*/
+
+#endif // OBJDICT_H
diff --git a/examples/AT91/Master/ObjDict.od b/examples/AT91/Master/ObjDict.od
new file mode 100644 (file)
index 0000000..83c3ce7
--- /dev/null
@@ -0,0 +1,276 @@
+<?xml version="1.0"?>
+<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
+<PyObject module="node" class="Node" id="31701392">
+<attr name="Profile" type="dict" id="31656672" >
+</attr>
+<attr name="Name" type="string">ObjDict</attr>
+<attr name="Dictionary" type="dict" id="31716240" >
+  <entry>
+    <key type="numeric" value="4096" />
+    <val type="numeric" value="197009" />
+  </entry>
+  <entry>
+    <key type="numeric" value="4097" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="8193" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="4101" />
+    <val type="numeric" value="1073741952" />
+  </entry>
+  <entry>
+    <key type="numeric" value="8192" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="4102" />
+    <val type="numeric" value="1000000" />
+  </entry>
+  <entry>
+    <key type="numeric" value="8449" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="4608" />
+    <val type="list" id="31720872" >
+      <item type="string" value="&quot;$NODEID+0x600&quot;" />
+      <item type="string" value="&quot;$NODEID+0x580&quot;" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="8448" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="4736" />
+    <val type="list" id="31721312" >
+      <item type="numeric" value="1600" />
+      <item type="numeric" value="1472" />
+      <item type="numeric" value="64" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="5120" />
+    <val type="list" id="31721192" >
+      <item type="numeric" value="385" />
+      <item type="numeric" value="1" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="5632" />
+    <val type="list" id="31721272" >
+      <item type="numeric" value="536870920" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="4120" />
+    <val type="list" id="31721352" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="6144" />
+    <val type="list" id="31635936" >
+      <item type="numeric" value="513" />
+      <item type="numeric" value="255" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="4118" />
+    <val type="list" id="31721512" >
+      <item type="numeric" value="4195804" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="6656" />
+    <val type="list" id="31721472" >
+      <item type="numeric" value="553648136" />
+    </val>
+  </entry>
+</attr>
+<attr name="SpecificMenu" type="list" id="31721552" >
+</attr>
+<attr name="DefaultStringSize" type="numeric" value="10" />
+<attr name="ParamsDictionary" type="dict" id="31712000" >
+</attr>
+<attr name="UserMapping" type="dict" id="31662992" >
+  <entry>
+    <key type="numeric" value="8192" />
+    <val type="dict" id="31652864" >
+      <entry>
+        <key type="string" value="need" />
+        <val type="False" value="" />
+      </entry>
+      <entry>
+        <key type="string" value="values" />
+        <val type="list" id="31721712" >
+          <item type="dict" id="31651136" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="rw" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="True" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="5" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string">DI1</val>
+            </entry>
+          </item>
+        </val>
+      </entry>
+      <entry>
+        <key type="string" value="name" />
+        <val type="string">DI1</val>
+      </entry>
+      <entry>
+        <key type="string" value="struct" />
+        <val type="numeric" value="1" />
+      </entry>
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="8193" />
+    <val type="dict" id="31653296" >
+      <entry>
+        <key type="string" value="need" />
+        <val type="False" value="" />
+      </entry>
+      <entry>
+        <key type="string" value="values" />
+        <val type="list" id="31721752" >
+          <item type="dict" id="30016400" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="rw" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="True" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="5" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string">DI2</val>
+            </entry>
+          </item>
+        </val>
+      </entry>
+      <entry>
+        <key type="string" value="name" />
+        <val type="string">DI2</val>
+      </entry>
+      <entry>
+        <key type="string" value="struct" />
+        <val type="numeric" value="1" />
+      </entry>
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="8448" />
+    <val type="dict" id="31662128" >
+      <entry>
+        <key type="string" value="need" />
+        <val type="False" value="" />
+      </entry>
+      <entry>
+        <key type="string" value="values" />
+        <val type="list" id="31721792" >
+          <item type="dict" id="31652576" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="rw" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="True" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="5" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string">DO1</val>
+            </entry>
+          </item>
+        </val>
+      </entry>
+      <entry>
+        <key type="string" value="name" />
+        <val type="string">DO1</val>
+      </entry>
+      <entry>
+        <key type="string" value="struct" />
+        <val type="numeric" value="1" />
+      </entry>
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="8449" />
+    <val type="dict" id="31650704" >
+      <entry>
+        <key type="string" value="need" />
+        <val type="False" value="" />
+      </entry>
+      <entry>
+        <key type="string" value="values" />
+        <val type="list" id="31721832" >
+          <item type="dict" id="31652000" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="rw" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="True" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="5" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string">DO2</val>
+            </entry>
+          </item>
+        </val>
+      </entry>
+      <entry>
+        <key type="string" value="name" />
+        <val type="string">DO2</val>
+      </entry>
+      <entry>
+        <key type="string" value="struct" />
+        <val type="numeric" value="1" />
+      </entry>
+    </val>
+  </entry>
+</attr>
+<attr name="DS302" type="dict" id="31652432" >
+</attr>
+<attr name="ProfileName" type="string" value="DS-301" />
+<attr name="Type" type="string">master</attr>
+<attr name="ID" type="numeric" value="0" />
+<attr name="Description" type="string">Test Master AT91</attr>
+</PyObject>
diff --git a/examples/AT91/Master/interrupt_timer.c b/examples/AT91/Master/interrupt_timer.c
new file mode 100644 (file)
index 0000000..96a572d
--- /dev/null
@@ -0,0 +1,110 @@
+// ----------------------------------------------------------------------------
+//         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           : interrupt_timer.c
+// Object              : Timer interrupt management
+//                     : Use AT91B_LED7 & AT91B_LED8 for status interrupt
+// Creation            : JPP   08-Sep-2005
+// ----------------------------------------------------------------------------
+
+// Include Standard LIB  files
+#include "config.h"
+
+//* Global variable
+int timer0_interrupt = 0;
+
+#define TIMER0_INTERRUPT_LEVEL         1
+
+/*-----------------*/
+/* Clock Selection */
+/*-----------------*/
+#define TC_CLKS                  0x7
+#define TC_CLKS_MCK2             0x0
+#define TC_CLKS_MCK8             0x1
+#define TC_CLKS_MCK32            0x2
+#define TC_CLKS_MCK128           0x3
+#define TC_CLKS_MCK1024          0x4
+
+//*------------------------- Internal Function --------------------------------
+//*----------------------------------------------------------------------------
+//* Function Name       : AT91F_TC_Open
+//* Object              : Initialize Timer Counter Channel and enable is clock
+//* Input Parameters    : <tc_pt> = TC Channel Descriptor Pointer
+//*                       <mode> = Timer Counter Mode
+//*                     : <TimerId> = Timer peripheral ID definitions
+//* Output Parameters   : None
+//*----------------------------------------------------------------------------
+void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId)
+{
+  unsigned int dummy;
+
+  //* First, enable the clock of the TIMER
+  AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId ) ;
+
+  //* Disable the clock and the interrupts
+  TC_pt->TC_CCR = AT91C_TC_CLKDIS ;
+  TC_pt->TC_IDR = 0xFFFFFFFF ;
+
+  //* Clear status bit
+  dummy = TC_pt->TC_SR;
+  //* Suppress warning variable "dummy" was set but never used
+  dummy = dummy;
+  //* Set the Mode of the Timer Counter
+  TC_pt->TC_CMR = Mode ;
+
+  //* Enable the clock
+  TC_pt->TC_CCR = AT91C_TC_CLKEN ;
+}
+//*------------------------- Interrupt Function -------------------------------
+
+//*----------------------------------------------------------------------------
+//* Function Name       : timer0_c_irq_handler
+//* Object              : C handler interrupt function calAT91B_LED by the interrupts
+//*                       assembling routine
+//* Output Parameters   : increment count_timer0_interrupt
+//*----------------------------------------------------------------------------
+void timer0_c_irq_handler(void)
+{
+  AT91PS_TC TC_pt = AT91C_BASE_TC0;
+  unsigned int dummy;
+  //* AcknowAT91B_LEDge interrupt status
+  dummy = TC_pt->TC_SR;
+  //* Suppress warning variable "dummy" was set but never used
+  dummy = dummy;
+  timer0_interrupt = TRUE;
+}
+
+//*-------------------------- External Function -------------------------------
+
+//*----------------------------------------------------------------------------
+//* Function Name       : timer_init
+//* Object              : Init timer counter
+//* Input Parameters    : none
+//* Output Parameters   : TRUE
+//*----------------------------------------------------------------------------
+void timer_init (unsigned int time)
+{
+  //* Open timer0
+  AT91F_TC_Open(AT91C_BASE_TC0,TC_CLKS_MCK8 | AT91C_TC_WAVESEL_UP_AUTO,AT91C_ID_TC0);
+
+  //* Open Timer 0 interrupt
+  AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC0, TIMER0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer0_c_irq_handler);
+  AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;  //  IRQ enable CPC
+  AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC0);
+
+  AT91C_BASE_TC0->TC_RC = (unsigned int)(AT91C_MASTER_CLOCK / 8 * time / 1000);
+
+  //* Start timer0
+  AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG ;
+}
diff --git a/examples/AT91/Master/io_macro.h b/examples/AT91/Master/io_macro.h
new file mode 100644 (file)
index 0000000..3c60fad
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+This file is part of CanFestival, a library implementing CanOpen Stack.
+
+Copyright (C): Edouard TISSERANT and Francis DUPIN
+ARM Port: Peter CHRISTEN
+
+See COPYING file for copyrights details.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef _IO_MACRO
+#define _IO_MACRO
+
+// Macros for set and clear bits in I/O registers
+#define setbit(address,bit) (address |= (1<<bit))
+#define clearbit(address,bit) (address &= ~(1<<bit))
+#define togglebit(address,bit) (address ^= (1<<bit))
+
+// Macro for testing of a single bit in an I/O location
+#define checkbit(address,bit) (address & (1<<bit))
+
+#endif
diff --git a/examples/AT91/Master/main.c b/examples/AT91/Master/main.c
new file mode 100644 (file)
index 0000000..cac0849
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+This file is part of CanFestival, a library implementing CanOpen Stack.
+
+Copyright (C): Edouard TISSERANT and Francis DUPIN
+ARM Port: Peter CHRISTEN
+
+See COPYING file for copyrights details.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+// Include Standard LIB  files
+#include "AT91SAM7X-EK.h"
+#include <string.h>
+#include "config.h"
+#include "io_macro.h"
+/************************* CANopen includes **********************************/
+#include "canfestival.h"
+#include "objdict.h"
+#include "can_AT91.h"
+
+//   Waiting time between AT91B_LED1 and AT91B_LED2
+#define     WAIT_TIME       AT91B_MCK
+
+#define PIO_INTERRUPT_LEVEL     6
+#define SOFT_INTERRUPT_LEVEL   2
+#define FIQ_INTERRUPT_LEVEL     7  // Always high
+
+// External Function Prototype
+extern void timer_init (unsigned int time);
+void sys_init();
+
+// Global variable
+extern int timer0_interrupt;
+
+unsigned int leds = 0;
+unsigned int keys,keys_old,keys_edge;
+
+unsigned char string_down[] = "1234567890x";
+unsigned char string_up[20];
+unsigned char val_down = 1;
+unsigned char val_up;
+unsigned char val_pdo = 1;
+
+// nodes
+#define MEMORY_MODULE          0
+#define OUTPUT_MODULE          1
+#define IO_MODULE              2
+
+// node ids
+#define ID_MEMORY_MODULE       0x20
+#define ID_OUTPUT_MODULE       0x21
+#define ID_IO_MODULE           0x22
+
+//----------------------------------------------------------------------------
+// Function Name       : main
+// Object              : Main interrupt function
+// Input Parameters    : none
+// Output Parameters   : TRUE
+//----------------------------------------------------------------------------
+int main(void)
+// Begin
+{
+  sys_init();                                   // Initialize system
+  timer_init(10);
+  canInit(CAN_BAUDRATE);                       // Initialize the CANopen bus
+  initTimer();                                         // Start timer for the CANopen stack
+  __enable_interrupt();
+  setState(&ObjDict_Data, Initialisation);     // Init the state
+  setNodeId (&ObjDict_Data, 0x7F);
+  setState(&ObjDict_Data, Operational);                // Put the master in operational mode
+       
+
+  for (;;)
+  {
+    if (timer0_interrupt)
+    {
+      timer0_interrupt = 0;
+      AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x01);
+
+      keys = ~AT91F_PIO_GetInput(AT91D_BASE_PIO_SW)>>21 & 0x1F;
+
+      keys_edge = keys & ~keys_old;    // edge detection
+      keys_old = keys;
+
+//      static Message m = Message_Initializer;                // contain a CAN message
+
+//      if (canReceive(&m))                    // a message received
+//        canDispatch(&ObjDict_Data, &m);         // process it
+
+      if (checkbit(keys_edge,0))       // edge on key 0
+      {
+       masterSendNMTstateChange (&ObjDict_Data, 0x00, NMT_Start_Node);
+//     startSYNC(&ObjDict_Data);
+      }
+
+      if (checkbit(keys_edge,1))       // edge on key 1
+      {
+       masterSendNMTstateChange (&ObjDict_Data, 0x00, NMT_Reset_Node);
+//     stopSYNC(&ObjDict_Data);
+      }
+
+      if (checkbit(keys,2))    // edge on key 2
+      {
+       if (!(DO1 <<= 1))                                       // generate running light
+         DO1 = 1;
+       sendPDOevent (&ObjDict_Data);
+      }
+
+      if (checkbit(keys_edge,3))       // edge on key 3
+      {
+      }
+
+
+      leds = DI1;
+
+      AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, (leds << 19));
+      AT91F_PIO_SetOutput(AT91C_BASE_PIOB, ~(leds << 19) & AT91B_LED_MASK);
+
+      AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, 0x01);
+    }
+  }
+}
+
+void sys_init()
+/******************************************************************************
+Initialize the relays, the main states and the modbus protocol stack.
+INPUT  LOCK_STATES *lock_states
+OUTPUT void
+******************************************************************************/
+{
+  // Enable User Reset and set its minimal assertion to 960 us
+  AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);
+
+  // First, enable the clock of the PIOs
+  AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, 1 << AT91C_ID_PIOA) ;
+  AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, 1 << AT91C_ID_PIOB) ;
+
+  // then, we configure the PIO Lines corresponding to switches
+  // to be inputs.
+  AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91B_SW_MASK) ;
+  // then, we configure the PIO Lines corresponding to AT91B_LEDx
+  // to be outputs. No need to set these pins to be driven by the PIO because it is GPIO pins only.
+  AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91B_LED_MASK | 0xFF) ;
+  // Clear the AT91B_LED's. On the EK we must apply a "1" to turn off AT91B_LEDs
+  AT91F_PIO_SetOutput(AT91C_BASE_PIOB, AT91B_LED_MASK) ;
+
+  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ;
+  // Clear PA2 <=> Enable Transceiver Normal Mode (versus Standby mode)
+  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ;
+
+}
diff --git a/include/AT91/Atmel/lib_AT91SAM7X256.h b/include/AT91/Atmel/lib_AT91SAM7X256.h
new file mode 100644 (file)
index 0000000..666a121
--- /dev/null
@@ -0,0 +1,4211 @@
+//* ----------------------------------------------------------------------------
+//*         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  11/02/2005 (15:17:24)
+//*
+//* CVS Reference       : /lib_dbgu.h/1.1/Thu Aug 25 12:56:22 2005//
+//* CVS Reference       : /lib_pmc_SAM7X.h/1.4/Tue Aug 30 13:00:36 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.2/Tue Aug 23 15:37:28 2005//
+//* CVS Reference       : /lib_pitc_6079A.h/1.2/Tue Nov  9 14:43:56 2004//
+//* CVS Reference       : /lib_aic_6075b.h/1.2/Thu Jul  7 07:48:22 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.5/Tue Aug 30 12:13:47 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.5/Tue Aug 23 15:37:07 2005//
+//* 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) () ) // \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);
+}
+
+// ----------------------------------------------------------------------------
+//  \fn    AT91F_CKGR_CfgPLLReg
+//  \brief Cfg the PLL Register
+// ----------------------------------------------------------------------------
+__inline void AT91F_CKGR_CfgPLLReg (
+       AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller
+       unsigned int mode)
+{
+       pCKGR->CKGR_PLLR = mode;
+}
+
+// ----------------------------------------------------------------------------
+//  \fn    AT91F_CKGR_GetPLLReg
+//  \brief Get the PLL Register
+// ----------------------------------------------------------------------------
+__inline unsigned int AT91F_CKGR_GetPLLReg (
+       AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller
+{
+       return pCKGR->CKGR_PLLR;
+}
+
+
+/* *****************************************************************************
+                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_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(
+  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);
+}
+
+// ----------------------------------------------------------------------------
+//  \fn    AT91F_UDP_InterruptStatusRegister
+//  \brief Return the Interrupt Status Register
+// ----------------------------------------------------------------------------
+__inline unsigned int AT91F_UDP_InterruptStatusRegister(
+  AT91PS_UDP pUDP )      // \arg  pointer to a UDP controller
+{
+  return pUDP->UDP_ISR;
+}
+
+// ----------------------------------------------------------------------------
+//  \fn    AT91F_UDP_InterruptClearRegister
+//  \brief Clear Interrupt Register
+// ----------------------------------------------------------------------------
+__inline void AT91F_UDP_InterruptClearRegister (
+  AT91PS_UDP pUDP,       // \arg pointer to UDP controller
+  unsigned int flag)     // \arg IT to be cleat
+{
+  pUDP->UDP_ICR = flag;
+}
+
+// ----------------------------------------------------------------------------
+//  \fn    AT91F_UDP_EnableTransceiver
+//  \brief Enable transceiver
+// ----------------------------------------------------------------------------
+__inline void AT91F_UDP_EnableTransceiver(
+  AT91PS_UDP pUDP )      // \arg  pointer to a UDP controller
+{
+    pUDP->UDP_TXVC &= ~AT91C_UDP_TXVDIS;
+}
+
+// ----------------------------------------------------------------------------
+//  \fn    AT91F_UDP_DisableTransceiver
+//  \brief Disable transceiver
+// ----------------------------------------------------------------------------
+__inline void AT91F_UDP_DisableTransceiver(
+  AT91PS_UDP pUDP )      // \arg  pointer to a UDP controller
+{
+    pUDP->UDP_TXVC = AT91C_UDP_TXVDIS;
+}
+
+/* *****************************************************************************
+                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_CfgMessageCtrlReg
+//* \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; 
+}
+
+/* *****************************************************************************
+                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;  
+}
+
+//*----------------------------------------------------------------------------
+//* \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_PB11_SPI1_NPCS2) |
+               ((unsigned int) AT91C_PB10_SPI1_NPCS1) |
+               ((unsigned int) AT91C_PB16_SPI1_NPCS3)); // Peripheral B
+       // Configure PIO controllers to periph mode
+       AT91F_PIO_CfgPeriph(
+               AT91C_BASE_PIOA, // PIO controller base address
+               0, // Peripheral A
+               ((unsigned int) AT91C_PA22_SPI1_SPCK) |
+               ((unsigned int) AT91C_PA3_SPI1_NPCS2) |
+               ((unsigned int) AT91C_PA26_SPI1_NPCS2) |
+               ((unsigned int) AT91C_PA25_SPI1_NPCS1) |
+               ((unsigned int) AT91C_PA2_SPI1_NPCS1) |
+               ((unsigned int) AT91C_PA24_SPI1_MISO) |
+               ((unsigned int) AT91C_PA4_SPI1_NPCS3) |
+               ((unsigned int) AT91C_PA29_SPI1_NPCS3) |
+               ((unsigned int) AT91C_PA21_SPI1_NPCS0) |
+               ((unsigned int) AT91C_PA23_SPI1_MOSI)); // 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_SPI0_NPCS1) |
+               ((unsigned int) AT91C_PB14_SPI0_NPCS2) |
+               ((unsigned int) AT91C_PB17_SPI0_NPCS3)); // Peripheral B
+       // Configure PIO controllers to periph mode
+       AT91F_PIO_CfgPeriph(
+               AT91C_BASE_PIOA, // PIO controller base address
+               ((unsigned int) AT91C_PA16_SPI0_MISO) |
+               ((unsigned int) AT91C_PA13_SPI0_NPCS1) |
+               ((unsigned int) AT91C_PA14_SPI0_NPCS2) |
+               ((unsigned int) AT91C_PA12_SPI0_NPCS0) |
+               ((unsigned int) AT91C_PA17_SPI0_MOSI) |
+               ((unsigned int) AT91C_PA15_SPI0_NPCS3) |
+               ((unsigned int) AT91C_PA18_SPI0_SPCK), // Peripheral A
+               ((unsigned int) AT91C_PA7_SPI0_NPCS1) |
+               ((unsigned int) AT91C_PA8_SPI0_NPCS2) |
+               ((unsigned int) AT91C_PA9_SPI0_NPCS3)); // 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_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_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_PB15_ERXDV_ECRSDV) |
+               ((unsigned int) AT91C_PB11_ETX3    ) |
+               ((unsigned int) AT91C_PB6_ERX1    ) |
+               ((unsigned int) AT91C_PB13_ERX2    ) |
+               ((unsigned int) AT91C_PB3_ETX1    ) |
+               ((unsigned int) AT91C_PB4_ECRS    ) |
+               ((unsigned int) AT91C_PB8_EMDC    ) |
+               ((unsigned int) AT91C_PB5_ERX0    ) |
+               ((unsigned int) AT91C_PB18_EF100   ) |
+               ((unsigned int) AT91C_PB14_ERX3    ) |
+               ((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
diff --git a/include/AT91/applicfg.h b/include/AT91/applicfg.h
new file mode 100644 (file)
index 0000000..60ca16e
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+This file is part of CanFestival, a library implementing CanOpen Stack.
+
+Copyright (C): Edouard TISSERANT and Francis DUPIN
+AT91 Port: Peter CHRISTEN
+
+See COPYING file for copyrights details.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef __APPLICFG_AVR__
+#define __APPLICFG_AVR__
+
+#include <string.h>
+#include <stdio.h>
+
+
+/// Convert an integer to a string in hexadecimal format
+/// If you do not wants to use a lastCar, put lastCar = '\0' (end of string)
+/// ex : value = 0XABCDEF and lastCar = '\n'
+/// buf[0] = '0'
+/// buf[1] = 'X'
+/// buf[2] = 'A'
+/// ....
+/// buf[7] = 'F'
+/// buf[8] = '\n'
+/// buf[9] = '\0'
+extern char *
+hex_convert (char *buf, unsigned long value, char lastCar);
+
+/// Print the string to the serial port sci
+/// (sci takes the values SCI0 or SCI1)
+extern void printSCI_str (char sci, const char * str);
+
+/// Print the number in hexadecimal  to the serial port sci
+/// (sci takes the values SCI0 or SCI1)
+extern void printSCI_nbr (char sci, unsigned long nbr, char lastCar);
+
+// Integers
+#define INTEGER8 signed char
+#define INTEGER16 short
+#define INTEGER24 long
+#define INTEGER32 long
+#define INTEGER40 long long
+#define INTEGER48 long long
+#define INTEGER56 long long
+#define INTEGER64 long long
+
+// Unsigned integers
+#define UNS8   unsigned char
+#define UNS16  unsigned short
+#define UNS32  unsigned long
+#define UNS24  unsigned long
+#define UNS40  unsigned long long
+#define UNS48  unsigned long long
+#define UNS56  unsigned long long
+#define UNS64  unsigned long long
+
+// Reals
+#define REAL32 float
+#define REAL64 double
+
+// Reals
+#define REAL32 float
+#define REAL64 double
+
+#include "can.h"
+
+
+/// Definition of MSG_ERR
+// ---------------------
+#ifdef DEBUG_ERR_CONSOLE_ON
+#    define MSG_ERR(num, str, val)            \
+          initSCI_0();                        \
+          printSCI_nbr(SCI0, num, ' ');       \
+          /* large printing on console  */    \
+          printSCI_str(SCI0, str);            \
+          printSCI_nbr(SCI0, val, '\n');
+#else
+#    define MSG_ERR(num, str, val)
+#endif
+
+/// Definition of MSG_WAR
+// ---------------------
+#ifdef DEBUG_WAR_CONSOLE_ON
+#    define MSG_WAR(num, str, val)          \
+        initSCI_0();                        \
+        printSCI_nbr(SCI0, num, ' ');       \
+        /* large printing on console  */    \
+        printSCI_str(SCI0, str);            \
+        printSCI_nbr(SCI0, val, '\n');
+#else
+#    define MSG_WAR(num, str, val)
+#endif
+
+typedef void* CAN_HANDLE;
+
+typedef void* CAN_PORT;
+
+#endif
+
+
diff --git a/include/AT91/can_AT91.h b/include/AT91/can_AT91.h
new file mode 100644 (file)
index 0000000..15f131c
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+This file is part of CanFestival, a library implementing CanOpen Stack.
+
+Copyright (C): Edouard TISSERANT and Francis DUPIN
+AT91 Port: Peter CHRISTEN
+
+See COPYING file for copyrights details.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef __CAN_AT91__
+#define __CAN_AT91__
+
+#include "config.h"
+
+// Canfestivals includes
+#include "can.h"
+
+// Number of receive MB
+#define NB_MB                          8
+#define NB_RX_MB                       4
+// Number of transmit MB
+#define NB_TX_MB                       (NB_MB - NB_RX_MB)
+
+#if (NB_TX_MB < 1)
+#error define less RX MBs, you must have at least 1 TX MB!
+#elif (NB_RX_MB < 1)
+#error define at least 1 RX MBs!
+#endif
+
+#define START_TX_MB                    NB_RX_MB
+#define TX_INT_MSK                     ((0xFF << (NB_MB - NB_TX_MB)) & 0xFF)
+#define RX_INT_MSK                     (0xFF >> (NB_MB - NB_RX_MB))
+
+/************************* To be called by user app ***************************/
+
+unsigned char canInit(unsigned int bitrate);
+unsigned char canSend(CAN_PORT notused, Message *m);
+unsigned char canReceive(Message *m);
+#endif
diff --git a/include/AT91/canfestival.h b/include/AT91/canfestival.h
new file mode 100644 (file)
index 0000000..503a9ef
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+This file is part of CanFestival, a library implementing CanOpen Stack.
+
+Copyright (C): Edouard TISSERANT and Francis DUPIN
+AT91 Port: Peter CHRISTEN
+
+See COPYING file for copyrights details.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+
+#ifndef __CAN_CANFESTIVAL__
+#define __CAN_CANFESTIVAL__
+
+#include "applicfg.h"
+#include "data.h"
+#include "objdict.h"
+
+// ---------  to be called by user app ---------
+void initTimer(void);
+UNS8 canSend(CAN_PORT notused, Message *m);
+
+#endif
diff --git a/include/AT91/config.h b/include/AT91/config.h
new file mode 100644 (file)
index 0000000..ad5416d
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+This file is part of CanFestival, a library implementing CanOpen Stack.
+
+Copyright (C): Edouard TISSERANT and Francis DUPIN
+AT91 Port: Peter CHRISTEN
+
+See COPYING file for copyrights details.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef _CONFIG_H_
+#define _CONFIG_H_
+
+//#include "compiler.h"
+
+#ifdef  __IAR_SYSTEMS_ICC__
+#include <intrinsics.h>
+#include <atmel/ioat91sam7x256.h>
+#define __inline inline
+#include "atmel/lib_AT91SAM7X256.h"
+//#include "iar.h"
+#else  // GCC
+#include <avr\io.h>
+#include <avr\interrupt.h>
+#include <inttypes.h>
+#include <avr\sleep.h>
+#include <avr\wdt.h>
+#endif // GCC
+
+#define WD_SLEEP
+
+#define        FALSE                                   0
+#define        TRUE                                    1
+
+// Needed defines by Atmel lib
+#define AT91C_MASTER_CLOCK      48000000UL    // Master Clock
+#define CAN_BAUDRATE 125
+
+// Needed defines by Canfestival lib
+#define MAX_CAN_BUS_ID 1
+#define SDO_MAX_LENGTH_TRANSFERT 32
+#define SDO_MAX_SIMULTANEOUS_TRANSFERTS 1
+#define NMT_MAX_NODE_ID 128
+#define SDO_TIMEOUT_MS 3000U
+#define MAX_NB_TIMER 8
+
+// CANOPEN_BIG_ENDIAN is not defined
+#define CANOPEN_LITTLE_ENDIAN 1
+
+#define US_TO_TIMEVAL_FACTOR 8
+
+#define REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERTS_TIMES(repeat)\
+repeat
+#define REPEAT_NMT_MAX_NODE_ID_TIMES(repeat)\
+repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat
+
+#define EMCY_MAX_ERRORS 8
+#define REPEAT_EMCY_MAX_ERRORS_TIMES(repeat)\
+repeat repeat repeat repeat repeat repeat repeat repeat
+
+
+#endif /* _CONFIG_H_ */
diff --git a/include/AT91/iar.h b/include/AT91/iar.h
new file mode 100644 (file)
index 0000000..17fe9c1
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+This file is part of CanFestival, a library implementing CanOpen Stack.
+
+Copyright (C): Edouard TISSERANT and Francis DUPIN
+Copyright (C): AVR Port Andreas GLAUSER and Peter CHRISTEN
+
+See COPYING file for copyrights details.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef _IAR_H_
+#define _IAR_H_
+
+#ifdef  __IAR_SYSTEMS_ICC__    // IAR Compiler
+
+/*
+#define ISR(vect)      \
+       _Pragma("vector="vect) \
+       __interrupt void Interrupt_##vect (void)
+*/
+#define sei()          __enable_interrupt()
+#define cli()          __disable_interrupt()
+#define sleep_enable() SMCR = 1 << SE
+#define sleep_cpu()    __sleep()
+#define wdt_reset()    __watchdog_reset()
+#define wdt_enable(val)        {WDTCSR = 1 << WDCE  | 1 << WDE;        \
+                       WDTCSR = 1 << WDE | (val);}
+
+#else
+#error Not an IAR Compiler!
+#endif                         // IAR Compiler
+
+#endif // _IAR_H_
diff --git a/include/AT91/timerscfg.h b/include/AT91/timerscfg.h
new file mode 100644 (file)
index 0000000..206d1b8
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+This file is part of CanFestival, a library implementing CanOpen Stack.
+
+Copyright (C): Edouard TISSERANT and Francis DUPIN
+AT91 Port: Peter CHRISTEN
+
+See COPYING file for copyrights details.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef __TIMERSCFG_H__
+#define __TIMERSCFG_H__
+
+// Whatever your microcontroller, the timer wont work if
+// TIMEVAL is not at least on 32 bits
+#define TIMEVAL UNS32
+
+// The timer of the AT91 counts from 0000 to 0xFFFF
+#define TIMEVAL_MAX 0xFFFF
+
+// The timer is incrementing every 2.66 us.
+#define MS_TO_TIMEVAL(ms) ((ms) * 375)
+#define US_TO_TIMEVAL(us) ((us) * 3 / 8)
+
+#endif