changeset 3122:ac6418ab8bfa

New package -- Actel SmartFusion Cortex-M3 variant HAL. [Bugzilla 1001291]
author vae
date Mon, 12 Mar 2012 21:01:31 +0000
parents 70cc85a5623a
children 8f8ee8d9ba87
files packages/hal/cortexm/a2fxxx/var/current/ChangeLog packages/hal/cortexm/a2fxxx/var/current/cdl/hal_cortexm_a2fxxx.cdl packages/hal/cortexm/a2fxxx/var/current/cdl/hal_cortexm_a2fxxx_irq.cdl packages/hal/cortexm/a2fxxx/var/current/include/hal_cache.h packages/hal/cortexm/a2fxxx/var/current/include/hal_diag.h packages/hal/cortexm/a2fxxx/var/current/include/plf_stub.h packages/hal/cortexm/a2fxxx/var/current/include/var_arch.h packages/hal/cortexm/a2fxxx/var/current/include/var_intr.h packages/hal/cortexm/a2fxxx/var/current/include/var_io.h packages/hal/cortexm/a2fxxx/var/current/include/variant.inc packages/hal/cortexm/a2fxxx/var/current/src/a2fxxx_misc.c packages/hal/cortexm/a2fxxx/var/current/src/hal_diag.c packages/hal/cortexm/a2fxxx/var/current/src/hal_dma.c packages/hal/cortexm/a2fxxx/var/current/tests/timers.c
diffstat 14 files changed, 5142 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/ChangeLog
@@ -0,0 +1,42 @@
+2011-06-26  Christophe Coutand  <ecos@hotmail.co.uk>
+
+	* cdl/hal_cortexm_a2fxxx.cdl:
+	* cdl/hal_cortexm_a2fxxx_irq.cdl:
+	* include/hal_cache.h:
+	* include/hal_diag.h:
+	* include/plf_stub.h:
+	* include/var_arch.h:
+	* include/variant.inc:
+	* include/var_intr.h:
+	* include/var_io.h:
+	* src/hal_diag.c:
+	* src/hal_dma.c:
+	* src/a2fxxx_misc.c:
+	* tests/timers.c:
+	New package -- Actel SmartFusion Cortex-M3 variant HAL.
+	[Bugzilla 1001291]
+
+//===========================================================================
+// ####GPLCOPYRIGHTBEGIN####                                                
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2011 Free Software Foundation, Inc.                        
+//
+// This program is free software; you can redistribute it and/or modify     
+// it under the terms of the GNU General Public License as published by     
+// the Free Software Foundation; either version 2 or (at your option) any   
+// later version.                                                           
+//
+// This program 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        
+// General Public License for more details.                                 
+//
+// You should have received a copy of the GNU General Public License        
+// along with this program; if not, write to the                            
+// Free Software Foundation, Inc., 51 Franklin Street,                      
+// Fifth Floor, Boston, MA  02110-1301, USA.                                
+// -------------------------------------------                              
+// ####GPLCOPYRIGHTEND####                                                  
+//===========================================================================
+
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/cdl/hal_cortexm_a2fxxx.cdl
@@ -0,0 +1,732 @@
+##==========================================================================
+##
+##      hal_cortexm_a2f.cdl
+##
+##      Cortex-M A2F variant HAL configuration data
+##
+##==========================================================================
+## ####ECOSGPLCOPYRIGHTBEGIN####                                            
+## -------------------------------------------                              
+## This file is part of eCos, the Embedded Configurable Operating System.   
+## Copyright (C) 2011 Free Software Foundation, Inc.                        
+##
+## eCos is free software; you can redistribute it and/or modify it under    
+## the terms of the GNU General Public License as published by the Free     
+## Software Foundation; either version 2 or (at your option) any later      
+## version.                                                                 
+##
+## eCos 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 General Public License    
+## for more details.                                                        
+##
+## You should have received a copy of the GNU General Public License        
+## along with eCos; if not, write to the Free Software Foundation, Inc.,    
+## 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+##
+## As a special exception, if other files instantiate templates or use      
+## macros or inline functions from this file, or you compile this file      
+## and link it with other works to produce a work based on this file,       
+## this file does not by itself cause the resulting work to be covered by   
+## the GNU General Public License. However the source code for this file    
+## must still be made available in accordance with section (3) of the GNU   
+## General Public License v2.                                               
+##
+## This exception does not invalidate any other reasons why a work based    
+## on this file might be covered by the GNU General Public License.         
+## -------------------------------------------                              
+## ####ECOSGPLCOPYRIGHTEND####                                              
+##==========================================================================
+#######DESCRIPTIONBEGIN####
+##
+## Author(s):    ccoutand
+## Contributors: 
+## Date:         2011-02-03
+##
+######DESCRIPTIONEND####
+##
+##==========================================================================
+
+cdl_package CYGPKG_HAL_CORTEXM_A2FXXX {
+    display       "Actel Smartfusion A2Fxxx Variant (Cortex-M3)"
+    parent        CYGPKG_HAL_CORTEXM
+    hardware
+    include_dir   cyg/hal
+    define_header hal_cortexm_a2fxxx.h
+    description   "
+        This package provides generic support for the Actel Smarfusiom Cortex-M3 
+        based microcontroller family. It is also necessary to select a platform 
+        HAL package."
+
+    compile       hal_diag.c a2fxxx_misc.c hal_dma.c
+
+    implements    CYGINT_HAL_DEBUG_GDB_STUBS
+    implements    CYGINT_HAL_DEBUG_GDB_STUBS_BREAK
+    implements    CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT
+    implements    CYGINT_HAL_VIRTUAL_VECTOR_COMM_BAUD_SUPPORT
+
+    requires      { CYGHWR_HAL_CORTEXM == "M3" }
+    requires      { CYGHWR_HAL_CORTEXM_SYSTICK_CLK_SOURCE == "INTERNAL" }
+
+    cdl_option CYGHWR_HAL_CORTEXM_A2FXXX {
+        display          "Actel Smartfusion A2F variant in use"
+        flavor           data
+        default_value    { "A2F200" }
+        legal_values     { "A2F060" "A2F200" "A2F500" }
+        description      "The Smartfusion has several variants, the main differences
+                          being in the size of on-chip FLASH and SRAM and numbers of
+                          some analog peripherals. This option allows the platform HAL 
+                          to select the specific microcontroller fitted."
+    }
+
+    cdl_option CYGNUM_HAL_CORTEXM_PRIORITY_LEVEL_BITS {
+        display         "CPU priority levels"
+        flavor          data
+        calculated      5
+        description     "This option defines the number of bits used to
+                         encode the exception priority levels that this
+                         variant of the Cortex-M CPU implements."
+    }
+
+    cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK {
+        display       "Clocking"
+        description   "Select this option to configure the internal 
+                 clock network of the device. Due to large amount of possible combination of 
+                 clock configuration, it is recommended to use the Actel MSS configuration tool
+                 and let the system boot handle the clock settings. Some of the requirement for
+                 setting the clock network of the device are : The On-chip Oscillator 
+                 clock frequency is fixed to 100 MHz and cannot be changed. The Main Crystal
+                 Oscillator clock frequency must be between 1.5 MHz and 20 MHz when the PLL is
+                 used or between 32 KHz and 20 MHz when the PLL is bypassed. The Main Crystal 
+                 Oscillator (RC network configuration) clock frequency must be between 1.5MHz 
+                 and 4 MHz when the PLL is used or between 32 KHz and 4 MHz when the PLL is 
+                 bypassed. For all other sources, the source clock frequency must be between 
+                 1.5 MHz and 176MHz when the PLL is used or between 32 KHz and 250 MHz when the 
+                 PLL is bypassed."
+        flavor         bool
+        default_value  0
+
+        cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_CLKIN {
+            display       "Input clock selection"
+            flavor         none
+            description   "Configure the input clocks of the device."
+
+            cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_CLKA {
+                display       "Clock A configuration"
+                flavor         bool
+                default_value { CYGHWR_HAL_CORTEXM_A2FXXX_PLL }
+                description   "Configure the clock A input of the device."
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC {
+                    display        "Clock A source"
+                    flavor          data
+                    legal_values    { "AUIN" "AUIP" "ADIP" "GLAINT" "RCOSC" "MOSC" }
+                    default_value   { "RCOSC" }
+                    description   "
+                        Select the clock A source. Valid choices are the main oscillator,
+                        the RC oscillator, the FPGA fabric or the dedicated single-ended or 
+                        differential IOs."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_FREQ {
+                    display         "Clock A frequency in Hz"
+                    flavor           data
+                    legal_values     { 1500000 to 176000000 }
+                    default_value    { CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC == "RCOSC" ? 100000000 : 20000000 }
+                    description   "
+                        Select the clock A source frequency in Hz. Additional restrictions 
+                        of the frequency range apply giving the clock source. It is left to 
+                        the user to take care of not exceeding the limits provided by the 
+                        device user manual."
+                }
+            }
+
+            cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_CLKB {
+                display       "Clock B configuration"
+                flavor         bool
+                description   "Configure the clock B input of the device."
+                default_value  0
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC {
+                    display       "Clock B source"
+                    flavor         data
+                    legal_values   { "BUIN" "BUIP" "BDIP" "GLBINT" "RCOSC" "MOSC" }
+                    default_value  { "MOSC" }
+                    description   "
+                        Select the clock B source. Valid choices are the main oscillator,
+                        the RC oscillator, the FPGA fabric or the dedicated single-ended or 
+                        differential IOs."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_FREQ {
+                    display         "Clock B frequency in Hz"
+                    flavor           data
+                    legal_values     { 32000 to 350000000 }
+                    default_value    { CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC == "RCOSC" ? 100000000 : 20000000 }
+                    description   "
+                        Select the clock B source frequency in Hz. Additional restrictions 
+                        of the frequency range apply giving the clock source. It is left to 
+                        the user to take care of not exceeding the limits provided by the 
+                        device user manual."
+                }
+            }
+
+            cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_CLKC {
+                display       "Clock C configuration"
+                flavor         bool
+                description   "Configure the clock C input of the device."
+                default_value  0
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC {
+                    display       "Clock C source"
+                    flavor        data
+                    legal_values  { "CUIN" "CUIP" "CDIP" "GLCINT" "RCOSC" "32KOSC"}
+                    default_value { "RCOSC" }
+                    description   "
+                        Select the clock C source. Valid choices are the main oscillator,
+                        the RC oscillator, the FPGA fabric or the dedicated single-ended or 
+                        differential IOs."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_FREQ {
+                    display         "Clock C frequency in Hz"
+                    flavor          data
+                    legal_values    { 32000 to 350000000 }
+                    default_value   { CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC == "RCOSC" ? 100000000 : 20000000 }
+                    description   "
+                        Select the clock B source frequency in Hz. Additional restrictions 
+                        of the frequency range apply giving the clock source. It is left to 
+                        the user to take care of not exceeding the limits provided by the 
+                        device user manual."
+                }
+            }
+        }
+
+        cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_PLL {
+            display       "PLL configuration"
+            flavor         bool
+            requires       CYGHWR_HAL_CORTEXM_A2FXXX_CLKA
+            description   "Configure the device PLL."
+            default_value  1
+
+            cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_PLL_MULT {
+                display       "PLL Multiplier"
+                flavor         data
+                legal_values  { 1 to 128 }
+                default_value { 1 }
+                description   "
+                    Select the PLL multiplier coefficient (m)."
+            }
+
+            cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_PLL_DIV {
+                display       "PLL Divider"
+                flavor         data
+                legal_values  { 1 to 128 }
+                default_value { 1 }
+                description   "
+                    Select the PLL divider coefficient (n)."
+            }
+
+            cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FREQ {
+                display       "PLL output frequency"
+                flavor        data
+                calculated    { CYGHWR_HAL_CORTEXM_A2FXXX_PLL ? ( CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_FREQ * CYGHWR_HAL_CORTEXM_A2FXXX_PLL_MULT ) / CYGHWR_HAL_CORTEXM_A2FXXX_PLL_DIV : 0 }
+                legal_values  { 22000000 to 350000000 }
+                description   "
+                    Computed PLL output frequency."
+            }
+
+            cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FB_DELAY {
+                display       "PLL Feedback delay"
+                flavor        data
+                legal_values  { 0 to 15 }
+                default_value { 0 }
+                description   "
+                    Select the PLL Feedback loop delay. Field FBDLY from user manual. 
+                    Value from 535 to 5560ns."
+            }
+
+            cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_PLL_XDELAY {
+                display       "PLL Additional delay"
+                flavor        bool
+                default_value 0
+                description   "
+                    Add 2ns additional delay on PLL feedback loop."
+            }
+        }
+
+        cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_CLKOUT {
+            display       "Global clock output configuration"
+            flavor         none
+            description   "Configure the Global clocks of the device."
+
+            cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA {
+                display       "Global clock A configuration"
+                flavor         bool
+                default_value { CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT == "CLKGA" }
+                description   "Configure the Global clock A of the device."
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC {
+                    display         "Global clock A source"
+                    flavor           data
+                    legal_values    { "CLKA" "PLL_VCO0" "PLL_VCO90" "PLL_VCO180" "PLL_VCO270" "PLL_VCO0_DL" }
+                    default_value   { "PLL_VCO0" }
+                    requires        { CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC == "CLKA" ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKA : CYGHWR_HAL_CORTEXM_A2FXXX_PLL }
+                    description   "
+                        Select the Global clock A source. Valid choices are the PLL output (with different phases)
+                        or the clock A input."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DIV {
+                    display        "Global clock A divider"
+                    flavor          data
+                    legal_values   { 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 
+                                     10 10.5 11 11.5 12 12.5 13 13.5 14 14.5 15 16 17 18 19 
+                                     20 21 22 23 24 25 26 27 28 29 30 31 32 }
+                    default_value  { 1 }
+                    description   "
+                        Select the Global clock A divider value."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DIV10 {
+                    display        "Global clock A divider * 10"
+                    flavor          data
+                    calculated     { CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DIV * 10 }
+                    description   "
+                        Computed Global clock A divider value multiplied by 10."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DELAY {
+                    display        "Global clock A delay line"
+                    flavor          data
+                    legal_values   { 0 to 15 }
+                    default_value  { 0 }
+                    description   "
+                        Select the Global clock A delay value."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_FREQ {
+                    display        "Global clock A Frequency"
+                    flavor          data
+                    legal_values   { 1 to 100000000 }
+                    calculated     { ( CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC == "PLL_VCO0" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC == "PLL_VCO90" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC == "PLL_VCO180" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC == "PLL_VCO270" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC == "PLL_VCO0_DL" ) ? ( ( CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FREQ * 10) / CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DIV10 ) : CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC == "CLKA" ? ( (CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_FREQ * 10) / CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DIV10 ) : 0 }
+                    description   "
+                        Computed Global clock A frequency."
+                }
+            }
+
+            cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB {
+                display      "Global clock B configuration"
+                flavor        bool
+                description  "Configure the Global clock B of the device."
+                default_value { CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK && CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK_RATIO != 1 }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC {
+                    display       "Global clock B source"
+                    flavor         data
+                    legal_values  { "CLKB" "CLKGA" "PLL_VCO0" "PLL_VCO90" "PLL_VCO180" "PLL_VCO270" "PLL_VCO0_DL" }
+                    default_value { "PLL_VCO0" }
+                    requires      { CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC == "CLKB" ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKB : CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC == "CLKGA" ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA : CYGHWR_HAL_CORTEXM_A2FXXX_PLL }
+                    description   "
+                        Select the Global clock B source. Valid choices are the PLL output (with different phases),
+                        the clock B input or the global clock A output."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DIV {
+                    display       "Global clock B divider"
+                    flavor         data
+                    legal_values   { 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 
+                                     10 10.5 11 11.5 12 12.5 13 13.5 14 14.5 15 16 17 18 19 
+                                     20 21 22 23 24 25 26 27 28 29 30 31 32 }
+                    default_value { 1 }
+                    description   "
+                        Select the Global clock B divider value."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DIV10 {
+                    display        "Global clock B divider * 10"
+                    flavor          data
+                    calculated     { CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DIV * 10 }
+                    description   "
+                        Computed Global clock B divider value multiplied by 10."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DELAY {
+                    display       "Global clock B delay line"
+                    flavor         data
+                    legal_values  { 0 to 15 }
+                    default_value { 0 }
+                    description   "
+                        Select the Global clock B delay value."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_FREQ {
+                    display        "Global clock B Frequency"
+                    flavor          data
+                    calculated     { ( CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC == "PLL_VCO0" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC == "PLL_VCO90" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC == "PLL_VCO180" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC == "PLL_VCO270" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC == "PLL_VCO0_DL" ) ? ( (CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FREQ*10) / CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DIV10 ) : CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC == "CLKB" ? ( (CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_FREQ * 10) / CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DIV10 ) : CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC == "CLKGA" ? ( (CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_FREQ * 10) / CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DIV10 ) : 0 }
+                    description   "
+                        Computed Global clock B frequency."
+                }
+            }
+
+            cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC {
+                display       "Global clock C configuration"
+                flavor        bool
+                description   "Configure the Global clock C of the device."
+                default_value { CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT == "CLKGC" }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC {
+                    display       "Global clock C source"
+                    flavor         data
+                    legal_values  { "CLKC" "CLKGA" "PLL_VCO0" "PLL_VCO90" "PLL_VCO180" "PLL_VCO270" "PLL_VCO0_DL" }
+                    default_value { "PLL_VCO0" }
+                    requires      { CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC == "CLKC" ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKC : CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC == "CLKGA" ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA : CYGHWR_HAL_CORTEXM_A2FXXX_PLL }
+                    description   "
+                        Select the Global clock C source. Valid choices are the PLL output (with different phases),
+                        the clock C input or the global clock A output."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DIV {
+                    display       "Global clock C divider"
+                    flavor         data
+                    legal_values   { 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 
+                                     10 10.5 11 11.5 12 12.5 13 13.5 14 14.5 15 16 17 18 19 
+                                     20 21 22 23 24 25 26 27 28 29 30 31 32 }
+                    default_value { 1 }
+                    description   "
+                        Select the Global clock C divider value."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DIV10 {
+                    display        "Global clock C divider * 10"
+                    flavor          data
+                    calculated     { CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DIV * 10 }
+                    description    "
+                        Computed Global clock C divider value multiplied by 10."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DELAY {
+                    display       "Global clock C delay line"
+                    flavor         data
+                    legal_values  { 0 to 15 }
+                    default_value { 0 }
+                    description   "
+                        Select the Global clock C delay value."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_FREQ {
+                    display       "Global clock C Frequency"
+                    flavor         data
+                    calculated     { ( CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC == "PLL_VCO0" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC == "PLL_VCO90" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC == "PLL_VCO180" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC == "PLL_VCO270" || CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC == "PLL_VCO0_DL" ) ? ( (CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FREQ*10) / CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DIV10 ) : CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC == "CLKC" ? ( (CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_FREQ * 10) / CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DIV10 ) : CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC == "CLKGA" ? ( (CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_FREQ * 10) / CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DIV10 ) : 0 }
+                    description   "
+                        Computed Global clock C frequency."
+                }
+            }
+
+            cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_MSS_FPGA {
+                display      "MSS / FPGA Clock configuration"
+                flavor        none
+                description  "Configure the MSS and Fabric master clock."
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT {
+                    display       "NGMUX output clock"
+                    flavor         data
+                    legal_values  { "CLKGA" "CLKGC" }
+                    default_value { "CLKGA" }
+                    requires      { CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT == "CLKGA" ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA : ( CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC && CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC != "CLKGA" ) }
+                    description   "
+                        Select the NGMUX output clock. Valid choices are the Global Clock A or C."
+                }
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ {
+                    display       "NGMUX output clock frequency"
+                    flavor        data
+                    legal_values  { 1 to 100000000 }
+                    calculated    { CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT == "CLKGA" ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_FREQ : CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_FREQ }
+                    description   "
+                        Computed NGMUX output clock frequency."
+                }
+
+                cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK {
+                    display       "Fabric clock configuration"
+                    flavor         bool
+                    default_value  0
+                    description   "Set the Fabric master clock. The Fabric frequency ration
+                        specifies which clock source to be used. For a ration of 1, the fabric 
+                        and MSS clock source are the same. For a ration of 2 of 4, the fabric 
+                        clock source is CLKGB and the ration between CLKGB and the MSS clock must 
+                        be configured by the user to be equal to 2 or 4."
+
+                    cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK_RATIO {
+                        display       "Fabric to MSS clock ratio"
+                        flavor        data
+                        legal_values  { 1 2 4 }
+                        requires      { CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK_RATIO != 1 ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB : 1 }
+                        requires      { CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK_RATIO != 1 ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_FREQ == CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ / CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK_RATIO : 1 }
+                        default_value { 1 }
+                        description   "
+                            Select the Fabric to MSS clock ratio."
+                    }
+
+                    cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK_FREQ {
+                        display       "Fabric clock Frequency"
+                        flavor         data
+                        calculated    { ( CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK && CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK_RATIO != 1 ) ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_FREQ : ( CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK && CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK_RATIO == 1 ) ?  CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ  : 0 }
+                        description   "
+                            Computed Fabric clock frequency."
+                    }
+                }
+
+                cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_MSS_CLK {
+                    display       "MSS clock configuration"
+                    flavor         none
+                    description   "Configure the MSS master clock."
+
+                    cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_MSS_CLK_DELAY {
+                        display       "MSS clock delay"
+                        flavor         data
+                        legal_values  { 0 to 15 }
+                        default_value { 0 }
+                        description   "
+                            Select the MSS clock delay. Field FBDLY. Value from 535 to 5560ns."
+                    }
+
+                    cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_ACE_CLK {
+                        display       "ACE clock configuration"
+                        flavor         bool
+                        default_value  0
+                        description   "Configure the ACE master clock."
+
+                        cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_ACLK_DIV {
+                           display       "ACE clock divider"
+                            flavor        data
+                            legal_values  { 1 2 4 }
+                            default_value { 1 }
+                            description   "
+                                Select the ACE clock divider value."
+                        }
+
+                        cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_ACLK_FREQ {
+                            display       "ACE clock Frequency"
+                            flavor         data
+                            calculated    { CYGHWR_HAL_CORTEXM_A2FXXX_ACE_CLK ? CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ / CYGHWR_HAL_CORTEXM_A2FXXX_ACLK_DIV : 0 }
+                            description   "
+                                Computed ACE clock frequency."
+                        }
+                    }
+
+                    cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_PCLK0_CLK {
+                        display      "PCLK0 clock configuration"
+                        flavor        none
+                        description  "Configure the PCLK0 clock."
+
+                        cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_PCLK0_DIV {
+                            display       "PCLK0 clock divider"
+                            flavor        data
+                            legal_values  { 1 2 4 }
+                            default_value { 1 }
+                            description   "
+                                Select PCLK0 clock divider value."
+                        }
+
+                        cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_PCLK0_FREQ {
+                            display       "PCLK0 clock Frequency"
+                            flavor         data
+                            calculated    { CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ ? CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ / CYGHWR_HAL_CORTEXM_A2FXXX_PCLK0_DIV : 0 }
+                            description   "
+                                Computed PCLK0 clock frequency."
+                        }
+                    }
+
+                    cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_PCLK1_CLK {
+                        display       "PCLK1 clock configuration"
+                        flavor         none
+                        description   "Configure the PCLK1 clock."
+                        
+                        cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_PCLK1_DIV {
+                            display       "PCLK1 clock divider"
+                            flavor         data
+                            legal_values  { 1 2 4 }
+                            default_value { 1 }
+                            description   "
+                                Select PCLK1 clock divider value."
+                        }
+
+                        cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_PCLK1_FREQ {
+                            display       "PCLK1 clock Frequency"
+                            flavor         data
+                            calculated    { CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ ? CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ / CYGHWR_HAL_CORTEXM_A2FXXX_PCLK1_DIV : 0 }
+                            description   "
+                                Computed PCLK1 clock frequency."
+                        }
+                    }
+                }
+            }
+
+            cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_MAC_CLK {
+                display       "Ethernet MAC clock configuration"
+                flavor         bool
+                default_value  0
+
+                cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_MAC_SRC {
+                    display       "Ethernet MAC clock source"
+                    flavor         data
+                    legal_values  { "CLKGC" "EXTERNAL" }
+                    default_value { "CLKGC" }
+                    requires      { CYGHWR_HAL_CORTEXM_A2FXXX_MAC_SRC == "CLKGC" ? CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC  : 1 }
+                    description   "
+                        Select the Ethernet MAC clock source."
+                }
+            }
+        }
+    }
+
+    cdl_component CYGHWR_HAL_CORTEXM_A2FXXX_DMA {
+        display       "DMA"
+        flavor        none
+        description   "
+            DMA controller configuration."
+
+        cdl_option CYGDBG_HAL_CORTEXM_A2FXXX_DMA_TRACE {
+            display       "Display status messages during DMA operations"
+            flavor        bool
+            default_value 0
+            description   "
+               Selecting this option will cause the DMA driver to print status
+               messages as various DMA operations are undertaken."
+        }
+    }
+
+    cdl_option CYGSEM_HAL_CORTEXM_A2FXXX_CLOCK_CHATTER {
+        display        "Trace clock network configuration."
+        default_value   1
+        flavor          bool
+        description     "
+            Enable debug tracing of the clock configuration."
+    }
+
+    cdl_option CYGSEM_HAL_CORTEXM_A2FXXX_DEFINES_IDLE_THREAD_ACTION {
+        display        "Override IDLE thread action"
+        default_value   1
+        flavor          bool
+        description     "
+            Override IDLE thread action defined by the architectural HAL.
+            The option must be active when running the application from a
+            debugger. The 'WFI' IDLE instruction defined in the architectural
+            HAL leads to software crash when application runs from a debugger."
+    }
+
+    cdl_component  CYGPKG_HAL_CORTEXM_A2FXXX_IO {
+        display         "IO configuration"
+        flavor          bool
+        default_value   0
+        description   "
+                Overwrite the default IO configuration
+        "
+
+        cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_IO_WEST_BANK {
+            display       "IO west bank buffer type"
+            legal_values  { "LVCMOS_3V3" "LVCMOS_2V5" "LVCMOS_1V8" "LVCMOS_1V5" }
+            default_value { "LVCMOS_3V3" }
+            flavor        data
+            description   "
+                Select the device west bank IO buffer type to be used.
+            "
+        }
+        cdl_option CYGHWR_HAL_CORTEXM_A2FXXX_IO_EAST_BANK {
+            display       "IO east bank buffer type"
+            legal_values  { "LVCMOS_3V3" "LVCMOS_2V5" "LVCMOS_1V8" "LVCMOS_1V5" }
+            default_value { "LVCMOS_3V3" }
+            flavor        data
+            description   "
+                Select the device west bank IO buffer type to be used.
+            "
+        }
+    }
+
+    cdl_component CYGHWR_HAL_DEVS_IRQ_PRIO_SCHEME_VAR {
+        display    "Variant IRQ priority defaults"
+        no_define
+        flavor     none
+        parent     CYGHWR_HAL_DEVS_IRQ_PRIO_SCHEME
+        description "
+            Interrupt priorities defined by the variant HAL"
+        script     hal_cortexm_a2fxxx_irq.cdl
+    }
+
+    cdl_component CYGNUM_HAL_RTC_CONSTANTS {
+        display       "Real-time clock constants"
+        flavor        none
+        no_define
+        cdl_option CYGNUM_HAL_RTC_NUMERATOR {
+            display       "Real-time clock numerator"
+            flavor        data
+            default_value 1000000000
+        }
+        cdl_option CYGNUM_HAL_RTC_DENOMINATOR {
+            display       "Real-time clock denominator"
+            flavor        data
+            default_value 100
+        }
+        cdl_option CYGNUM_HAL_RTC_PERIOD {
+            display       "Real-time clock period"
+            flavor        data
+            default_value 1000000 / CYGNUM_HAL_RTC_DENOMINATOR
+            description   "The period defined here is something of a fake, it is expressed
+                           in terms of a notional 1MHz clock. The value actually installed
+                           in the hardware is calculated from the current settings of the
+                           clock generation hardware."
+        }
+    }
+
+    cdl_interface CYGINT_HAL_A2FXXX_UART0 {
+        display     "Platform has UART0 serial port"
+        description "The platform has a socket on UART0."
+    }
+
+    cdl_interface CYGINT_HAL_A2FXXX_UART1 {
+        display     "Platform has UART1 serial port"
+        description "The platform has a socket on UART1."
+    }
+
+    cdl_component CYGPKG_HAL_CORTEXM_A2FXXX_OPTIONS {
+        display "Build options"
+        flavor  none
+        description   "
+        Package specific build options including control over
+        compiler flags used only in building this package."
+
+        cdl_option CYGPKG_HAL_CORTEXM_A2FXXX_CFLAGS_ADD {
+            display "Additional compiler flags"
+            flavor  data
+            no_define
+            default_value { "" }
+            description   "
+                This option modifies the set of compiler flags for
+                building the A2F variant HAL package. These flags are used
+                in addition to the set of global flags."
+        }
+
+        cdl_option CYGPKG_HAL_CORTEXM_A2FXXX_CFLAGS_REMOVE {
+            display "Suppressed compiler flags"
+            flavor  data
+            no_define
+            default_value { "" }
+            description   "
+                This option modifies the set of compiler flags for
+                building the A2F variant HAL package. These flags are removed from
+                the set of global flags if present."
+        }
+    }
+
+    cdl_option CYGPKG_HAL_CORTEXM_A2FXXX_TESTS {
+        display "A2F tests"
+        active_if      CYGPKG_KERNEL
+        flavor  data
+        no_define
+        calculated { "tests/timers" }
+        description   "
+            This option specifies the set of tests for the A2F HAL."
+    }
+
+}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/cdl/hal_cortexm_a2fxxx_irq.cdl
@@ -0,0 +1,150 @@
+##==========================================================================
+##
+##      hal_cortexm_a2fxxx_irq.cdl
+##
+##      Cortex-M A2F configuration data
+##
+##==========================================================================
+## ####ECOSGPLCOPYRIGHTBEGIN####                                            
+## -------------------------------------------                              
+## This file is part of eCos, the Embedded Configurable Operating System.   
+## Copyright (C) 2012 Free Software Foundation, Inc.                  
+##
+## eCos is free software; you can redistribute it and/or modify it under    
+## the terms of the GNU General Public License as published by the Free     
+## Software Foundation; either version 2 or (at your option) any later      
+## version.                                                                 
+##
+## eCos 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 General Public License    
+## for more details.                                                        
+##
+## You should have received a copy of the GNU General Public License        
+## along with eCos; if not, write to the Free Software Foundation, Inc.,    
+## 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+##
+## As a special exception, if other files instantiate templates or use      
+## macros or inline functions from this file, or you compile this file      
+## and link it with other works to produce a work based on this file,       
+## this file does not by itself cause the resulting work to be covered by   
+## the GNU General Public License. However the source code for this file    
+## must still be made available in accordance with section (3) of the GNU   
+## General Public License v2.                                               
+##
+## This exception does not invalidate any other reasons why a work based    
+## on this file might be covered by the GNU General Public License.         
+## -------------------------------------------                              
+## ####ECOSGPLCOPYRIGHTEND####                                              
+##==========================================================================
+#######DESCRIPTIONBEGIN####
+##
+## Author(s):    ccoutand
+## Date:         2012-02-20
+##
+######DESCRIPTIONEND####
+##
+##==========================================================================
+
+
+    cdl_option CYGNUM_HAL_KERNEL_COUNTERS_CLOCK_ISR_DEFAULT_PRIORITY {
+        display       "Clock interrupt ISR priority"
+        flavor         data
+        calculated     0xF0
+        description   "Set clock ISR priority to lowest priority."
+    }
+
+
+    cdl_option CYGNUM_HAL_CORTEXM_A2FXXX_DMA_ISR_PRIORITY {
+        display       "DMA peripheral interrupt ISR priority"
+        flavor         data
+        default_value  0x70
+             legal_values { 0x00 0x08 0x10 0x18 0x20 0x28 0x30 0x38 0x40 0x48
+                0x50 0x58 0x60 0x68 0x70 0x78 0x80 0x88 0x90 0x98
+                0xA0 0xA8 0xB0 0xB8 0xC0 0xC8 0xD0 0xD8 0xE0 0xE8
+                0xF0 }
+        description   "
+          Set DMA controller ISR priority."
+     }
+
+    cdl_component CYGHWR_HAL_DEVS_IRQ_PRIO_SCHEME_I2C {
+        display "I2C IRQ priorities"
+        flavor none
+        no_define
+
+        cdl_option CYGNUM_DEVS_I2C_CORTEXM_A2FXXX_I2C0_ISR_PRIORITY {
+            display   "I2C bus 0 interrupt priority"
+            flavor     data
+            active_if  CYGPKG_DEVS_I2C_CORTEXM_A2FXXX
+            legal_values { 0x00 0x08 0x10 0x18 0x20 0x28 0x30 0x38 0x40 0x48
+                0x50 0x58 0x60 0x68 0x70 0x78 0x80 0x88 0x90 0x98
+                0xA0 0xA8 0xB0 0xB8 0xC0 0xC8 0xD0 0xD8 0xE0 0xE8
+                0xF0 }
+            default_value 0x78
+        }
+
+        cdl_option CYGNUM_DEVS_I2C_CORTEXM_A2FXXX_I2C1_ISR_PRIORITY {
+            display   "I2C bus 1 interrupt priority"
+            flavor     data
+            active_if  CYGPKG_DEVS_I2C_CORTEXM_A2FXXX
+            legal_values { 0x00 0x08 0x10 0x18 0x20 0x28 0x30 0x38 0x40 0x48
+                0x50 0x58 0x60 0x68 0x70 0x78 0x80 0x88 0x90 0x98
+                0xA0 0xA8 0xB0 0xB8 0xC0 0xC8 0xD0 0xD8 0xE0 0xE8
+                0xF0 }
+            default_value 0x78
+        }
+    }
+
+    cdl_component CYGHWR_HAL_DEVS_IRQ_PRIO_SCHEME_ETH {
+        display   "Ethernet IRQ priorities"
+        flavor     none
+        no_define
+
+        cdl_option CYGNUM_DEVS_ETH_CORTEXM_A2FXXX_ISR_SP {
+            display       "Ethernet interrupt ISR priority"
+            active_if      CYGPKG_DEVS_ETH_CORTEXM_A2FXXX
+            flavor         data
+            no_define
+            default_value  0x78
+                legal_values { 0x00 0x08 0x10 0x18 0x20 0x28 0x30 0x38 0x40 0x48
+                    0x50 0x58 0x60 0x68 0x70 0x78 0x80 0x88 0x90 0x98
+                    0xA0 0xA8 0xB0 0xB8 0xC0 0xC8 0xD0 0xD8 0xE0 0xE8
+                    0xF0 }
+            description   "
+                  Set the Ethernet controller ISR priority."
+       }
+    }
+
+    cdl_component CYGHWR_HAL_DEVS_IRQ_PRIO_SCHEME_SERIAL {
+        display   "Serial controller IRQ priorities"
+        flavor     none
+        no_define
+
+        cdl_option CYGNUM_DEVS_SERIAL_CORTEXM_A2FXXX_SERIAL0_ISR_SP {
+            display       "Serial port 0 driver ISR priority"
+            active_if      CYGPKG_IO_SERIAL_CORTEXM_A2FXXX_SERIAL0
+            flavor         data
+            no_define
+            default_value  0x78
+                legal_values { 0x00 0x08 0x10 0x18 0x20 0x28 0x30 0x38 0x40 0x48
+                    0x50 0x58 0x60 0x68 0x70 0x78 0x80 0x88 0x90 0x98
+                    0xA0 0xA8 0xB0 0xB8 0xC0 0xC8 0xD0 0xD8 0xE0 0xE8
+                    0xF0 }
+            description   "
+                  Set the serial 0 controller ISR priority."
+       }
+
+        cdl_option CYGNUM_DEVS_SERIAL_CORTEXM_A2FXXX_SERIAL1_ISR_SP {
+            display       "Serial port 1 driver ISR priority"
+            active_if      CYGPKG_IO_SERIAL_CORTEXM_A2FXXX_SERIAL1
+            flavor         data
+            no_define
+            default_value  0x80
+                legal_values { 0x00 0x08 0x10 0x18 0x20 0x28 0x30 0x38 0x40 0x48
+                    0x50 0x58 0x60 0x68 0x70 0x78 0x80 0x88 0x90 0x98
+                    0xA0 0xA8 0xB0 0xB8 0xC0 0xC8 0xD0 0xD8 0xE0 0xE8
+                    0xF0 }
+            description   "
+                  Set the serial 1 controller ISR priority."
+       }
+    }
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/include/hal_cache.h
@@ -0,0 +1,116 @@
+#ifndef CYGONCE_HAL_CACHE_H
+#define CYGONCE_HAL_CACHE_H
+
+//=============================================================================
+//
+//      hal_cache.h
+//
+//      HAL cache control API
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos 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 General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    jlarmour
+// Contributors: 
+// Date:         2011-00-03
+// Purpose:      Cache control API
+// Description:  The macros defined here provide the HAL APIs for handling
+//               cache control operations.
+//
+//               For the Atcel SmartFusion, these are empty macros as there
+//               is no cache.
+// Usage:
+//               #include <cyg/hal/hal_cache.h>
+//               ...
+//              
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <cyg/infra/cyg_type.h>
+
+//-----------------------------------------------------------------------------
+// Cache dimensions
+
+
+//-----------------------------------------------------------------------------
+// Global control of data cache
+
+// Enable the data cache
+#define HAL_DCACHE_ENABLE()
+
+// Disable the data cache
+#define HAL_DCACHE_DISABLE()
+
+// Invalidate the entire cache
+#define HAL_DCACHE_INVALIDATE_ALL()
+
+// Synchronize the contents of the cache with memory.
+#define HAL_DCACHE_SYNC()
+
+// Purge contents of data cache
+#define HAL_DCACHE_PURGE_ALL()
+
+// Query the state of the data cache (does not affect the caching)
+#define HAL_DCACHE_IS_ENABLED(_state_)          \
+    CYG_MACRO_START                             \
+    (_state_) = 0;                              \
+    CYG_MACRO_END
+
+//-----------------------------------------------------------------------------
+// Global control of Instruction cache
+
+// Enable the instruction cache
+#define HAL_ICACHE_ENABLE()
+
+// Disable the instruction cache
+#define HAL_ICACHE_DISABLE()
+
+// Invalidate the entire cache
+#define HAL_ICACHE_INVALIDATE_ALL()
+
+// Synchronize the contents of the cache with memory.
+#define HAL_ICACHE_SYNC()
+
+// Query the state of the instruction cache (does not affect the caching)
+#define HAL_ICACHE_IS_ENABLED(_state_)          \
+    CYG_MACRO_START                             \
+    (_state_) = 0;                              \
+    CYG_MACRO_END
+
+//-----------------------------------------------------------------------------
+#endif // ifndef CYGONCE_HAL_CACHE_H
+// End of hal_cache.h
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/include/hal_diag.h
@@ -0,0 +1,91 @@
+#ifndef CYGONCE_HAL_DIAG_H
+#define CYGONCE_HAL_DIAG_H
+//=============================================================================
+//
+//      hal_diag.h
+//
+//      HAL diagnostics
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2008, 2011 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos 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 General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   ccoutand
+// Original:    nickg (STM32 HAL)
+// Date:        2011-02-03
+// Purpose:     HAL diagnostics
+// Description:
+// Usage:       #include <cyg/hal/var_io.h>
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <pkgconf/hal.h>
+
+#include <cyg/infra/cyg_type.h>
+
+#include <cyg/hal/hal_if.h>
+
+//-----------------------------------------------------------------------------
+
+#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG)
+
+#define HAL_DIAG_INIT()          hal_if_diag_init()
+#define HAL_DIAG_WRITE_CHAR(_c_) hal_if_diag_write_char(_c_)
+#define HAL_DIAG_READ_CHAR(_c_)  hal_if_diag_read_char(&_c_)
+
+#else
+
+__externC void hal_a2fxxx_diag_init(void);
+__externC void hal_a2fxxx_diag_putc(char);
+__externC cyg_uint8 hal_a2fxxx_diag_getc(void);
+
+# ifndef HAL_DIAG_INIT
+#  define HAL_DIAG_INIT() hal_a2fxxx_diag_init()
+# endif
+
+# ifndef HAL_DIAG_WRITE_CHAR
+#  define HAL_DIAG_WRITE_CHAR(__c) hal_a2fxxx_diag_putc(__c)
+# endif
+
+# ifndef HAL_DIAG_READ_CHAR
+#  define HAL_DIAG_READ_CHAR(__c) (__c) = hal_a2fxxx_diag_getc()
+# endif
+
+#endif
+
+//-----------------------------------------------------------------------------
+// end of hal_diag.h
+#endif // CYGONCE_HAL_DIAG_H
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/include/plf_stub.h
@@ -0,0 +1,89 @@
+#ifndef CYGONCE_HAL_PLF_STUB_H
+#define CYGONCE_HAL_PLF_STUB_H
+
+//=============================================================================
+//
+//      plf_stub.h
+//
+//      Platform header for GDB stub support.
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2008
+// Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos 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 General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   nickg
+// Contributors:jskov, gthomas, jlarmour
+// Date:        2008-07-30
+// Purpose:     Platform HAL stub support for STM32 variant boards.
+// Usage:       #include <cyg/hal/plf_stub.h>
+//              
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <pkgconf/hal.h>
+#include CYGBLD_HAL_PLATFORM_H
+
+#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+
+#include <cyg/infra/cyg_type.h>         // CYG_UNUSED_PARAM
+
+#include <cyg/hal/cortexm_stub.h>           // architecture stub support
+
+#include <cyg/hal/hal_io.h>
+
+//----------------------------------------------------------------------------
+// Define some platform specific communication details. This is mostly
+// handled by hal_if now, but we need to make sure the comms tables are
+// properly initialized.
+
+__externC void cyg_hal_plf_comms_init(void);
+
+#define HAL_STUB_PLATFORM_INIT_SERIAL()       cyg_hal_plf_comms_init()
+
+#define HAL_STUB_PLATFORM_SET_BAUD_RATE(baud) CYG_UNUSED_PARAM(int, (baud))
+#define HAL_STUB_PLATFORM_INTERRUPTIBLE       0
+#define HAL_STUB_PLATFORM_INIT_BREAK_IRQ()    CYG_EMPTY_STATEMENT
+
+//----------------------------------------------------------------------------
+// Stub initializer.
+
+#define HAL_STUB_PLATFORM_INIT()              CYG_EMPTY_STATEMENT
+
+#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+
+//-----------------------------------------------------------------------------
+#endif // CYGONCE_HAL_PLF_STUB_H
+// End of plf_stub.h
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/include/var_arch.h
@@ -0,0 +1,66 @@
+#ifndef CYGONCE_HAL_VAR_ARCH_H
+#define CYGONCE_HAL_VAR_ARCH_H
+//=============================================================================
+//
+//      var_arch.h
+//
+//      Actel SmartFusion  Cortex-M3 variant architecture overrides
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos 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 General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    ccoutand
+// Date:         2011-01-18
+// Purpose:      Actel SmartFusion Cortex-M3 variant architecture overrides
+// Description:
+// Usage:        #include <cyg/hal/hal_arch.h>
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <pkgconf/hal.h>
+#include <cyg/hal/hal_io.h>
+
+#include <cyg/hal/plf_arch.h>
+
+#ifdef CYGSEM_HAL_CORTEXM_A2FXXX_DEFINES_IDLE_THREAD_ACTION
+externC void hal_idle_thread_action( cyg_uint32 );
+
+# define HAL_IDLE_THREAD_ACTION(_count_) hal_idle_thread_action(_count_)
+#endif
+//-----------------------------------------------------------------------------
+// end of var_arch.h
+#endif // CYGONCE_HAL_VAR_ARCH_H
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/include/var_intr.h
@@ -0,0 +1,232 @@
+#ifndef CYGONCE_HAL_VAR_INTR_H
+#define CYGONCE_HAL_VAR_INTR_H
+//==========================================================================
+//
+//      var_intr.h
+//
+//      HAL Interrupt and clock assignments for Smartfusion Cortex-M3 variants
+//
+//==========================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos 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 General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    ccoutand
+// Date:         2011-01-18
+// Purpose:      Define Interrupt support
+// Description:  The interrupt specifics for Actel Smartfusion Cortex-M3
+//               are defined here.
+//
+// Usage:        #include <cyg/hal/var_intr.h>
+//               However applications should include using <cyg/hal/hal_intr.h>
+//               instead to allow for platform overrides.
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <cyg/hal/plf_intr.h>
+
+//==========================================================================
+
+#define CYGNUM_HAL_INTERRUPT_WD               (0+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_VR_PSM_5V        (1+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_VR_PSM_3V        (2+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_RTC0_0           (3+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_RTC0_1           (4+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_MAC0             (5+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_IAP              (6+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ENVM0            (7+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ENVM1            (8+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_DMA              (9+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_UART0            (10+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_UART1            (11+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_SPI0             (12+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_SPI1             (13+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_I2C0_0           (14+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_I2C0_1           (15+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_I2C0_2           (16+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_I2C1_0           (17+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_I2C1_1           (18+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_I2C1_2           (19+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_TIM0_1           (20+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_TIM0_2           (21+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_MSS_CCC_0        (22+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_MSS_CCC_1        (23+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_AHB              (24+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_RESERVED0        (25+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_RESERVED1        (26+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_RESERVED2        (27+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_RESERVED3        (28+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_RESERVED4        (29+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_RESERVED5        (30+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_FAB              (31+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO0            (32+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO1            (33+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO2            (34+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO3            (35+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO4            (36+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO5            (37+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO6            (38+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO7            (39+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO8            (40+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO9            (41+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO10           (42+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO11           (43+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO12           (44+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO13           (45+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO14           (46+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO15           (47+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO16           (48+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO17           (49+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO18           (50+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO19           (51+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO20           (52+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO21           (53+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO22           (54+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO23           (55+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO24           (56+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO25           (57+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO26           (58+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO27           (59+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO28           (60+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO29           (61+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO30           (62+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_GPIO31           (63+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC0_FLAG0    (64+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC0_FLAG1    (65+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC0_FLAG2    (66+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC0_FLAG3    (67+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC1_FLAG0    (68+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC1_FLAG1    (69+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC1_FLAG2    (70+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC1_FLAG3    (71+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC2_FLAG0    (72+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC2_FLAG1    (73+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC2_FLAG2    (74+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PC2_FLAG3    (75+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC0_DV      (76+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC1_DV      (77+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC2_DV      (78+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC0_CD      (79+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC1_CD      (80+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC2_CD      (81+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC0_CS      (81+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC1_CS      (83+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC2_CS      (84+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP0_FALL   (85+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP1_FALL   (86+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP2_FALL   (87+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP3_FALL   (88+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP4_FALL   (89+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP5_FALL   (90+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP6_FALL   (91+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP7_FALL   (92+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP8_FALL   (93+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP9_FALL   (94+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP10_FALL  (95+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP11_FALL  (96+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP0_RISE   (97+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP1_RISE   (98+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP2_RISE   (99+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP3_RISE   (100+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP4_RISE   (101+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP5_RISE   (102+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP6_RISE   (103+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP7_RISE   (104+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP8_RISE   (105+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP9_RISE   (106+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP10_RISE  (107+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_COMP11_RISE  (108+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC0_FF      (109+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC0_FAF     (110+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC0_FE      (111+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC1_FF      (112+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC1_FAF     (113+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC1_FE      (114+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC2_FF      (115+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC2_FAF     (116+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_ADC2_FE      (117+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG0    (118+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG1    (119+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG2    (120+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG3    (121+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG4    (122+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG5    (123+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG6    (124+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG7    (125+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG8    (126+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG9    (127+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG10   (128+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG11   (129+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG12   (130+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG13   (131+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG14   (132+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG15   (133+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG16   (134+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG17   (135+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG18   (136+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG19   (137+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG20   (138+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG21   (139+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG22   (140+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG23   (141+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG24   (142+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG25   (143+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG26   (144+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG27   (145+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG28   (146+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG29   (147+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG30   (148+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG31   (149+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+
+#ifndef CYGNUM_HAL_INTERRUPT_NVIC_MAX
+#define CYGNUM_HAL_INTERRUPT_NVIC_MAX       (CYGNUM_HAL_INTERRUPT_ACE_PPE_FLAG31)
+#endif
+
+#define CYGNUM_HAL_ISR_MIN     0
+#ifndef CYGNUM_HAL_ISR_MAX
+#define CYGNUM_HAL_ISR_MAX     CYGNUM_HAL_INTERRUPT_NVIC_MAX
+#endif
+#define CYGNUM_HAL_ISR_COUNT   (CYGNUM_HAL_ISR_MAX + 1)
+
+#define CYGNUM_HAL_VSR_MIN     0
+#ifndef CYGNUM_HAL_VSR_MAX
+#define CYGNUM_HAL_VSR_MAX     (CYGNUM_HAL_VECTOR_SYS_TICK+CYGNUM_HAL_INTERRUPT_NVIC_MAX)
+#endif
+#define CYGNUM_HAL_VSR_COUNT   (CYGNUM_HAL_VSR_MAX+1)
+
+
+//----------------------------------------------------------------------------
+#endif // CYGONCE_HAL_VAR_INTR_H
+// EOF var_intr.h
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/include/var_io.h
@@ -0,0 +1,1196 @@
+#ifndef CYGONCE_HAL_VAR_IO_H
+#define CYGONCE_HAL_VAR_IO_H
+//=============================================================================
+//
+//      var_io.h
+//
+//      Variant specific registers
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos 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 General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   ccoutand
+// Date:        2011-02-03
+// Purpose:     Smartfusion Cortex-M3 variant specific registers
+// Description:
+// Usage:       #include <cyg/hal/var_io.h>
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <pkgconf/hal_cortexm_a2fxxx.h>
+
+#include <cyg/hal/plf_io.h>
+
+//=============================================================================
+// Peripherals
+
+#define CYGHWR_HAL_A2FXXX_SC                               0xE0042000
+
+// Device peripherals
+#define CYGHWR_HAL_A2FXXX_UART0                            0x40000000
+#define CYGHWR_HAL_A2FXXX_SPI0                             0x40001000
+#define CYGHWR_HAL_A2FXXX_I2C0                             0x40002000
+#define CYGHWR_HAL_A2FXXX_MAC                              0x40003000
+#define CYGHWR_HAL_A2FXXX_DMA                              0x40004000
+#define CYGHWR_HAL_A2FXXX_TIMER                            0x40005000
+#define CYGHWR_HAL_A2FXXX_WD                               0x40006000
+#define CYGHWR_HAL_A2FXXX_FABRIC_IIC                       0x40007000
+#define CYGHWR_HAL_A2FXXX_UART1                            0x40010000
+#define CYGHWR_HAL_A2FXXX_SPI1                             0x40011000
+#define CYGHWR_HAL_A2FXXX_I2C1                             0x40012000
+#define CYGHWR_HAL_A2FXXX_MSS_GPIO                         0x40013000
+#define CYGHWR_HAL_A2FXXX_RTC                              0x40014000
+#define CYGHWR_HAL_A2FXXX_EFROM                            0x40015000
+#define CYGHWR_HAL_A2FXXX_IAP                              0x40016000
+#define CYGHWR_HAL_A2FXXX_ANALOG_ENGINE                    0x40020000
+#define CYGHWR_HAL_A2FXXX_FPAG_ESRAM                       0x40040000
+#define CYGHWR_HAL_A2FXXX_FPGA                             0x40050000
+#define CYGHWR_HAL_A2FXXX_PERIPH                           0x42000000
+
+// Internal flash (Embedded Non-volatile Memory, ENVM)
+#define CYGHWR_HAL_A2FXXX_ENVM_ARRAY                       0x60000000
+#define CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES                 0x60080000
+#define CYGHWR_HAL_A2FXXX_ENVM_AUX_BLOCK_A                 0x60084000
+#define CYGHWR_HAL_A2FXXX_ENVM_AUX_BLOCK_SP                0x60088000
+#define CYGHWR_HAL_A2FXXX_ENVM                             0x60100000
+
+// External memory base address
+#define CYGHWR_HAL_A2FXXX_EMEM_TYPE0                       0x70000000
+#define CYGHWR_HAL_A2FXXX_EMEM_TYPE1                       0x74000000
+
+//=============================================================================
+// Bit-Band base address
+#define CYGHWR_HAL_A2FXXX_I2C0_BB                          ( CYGHWR_HAL_A2FXXX_PERIPH + 0x00040000 )
+#define CYGHWR_HAL_A2FXXX_I2C1_BB                          ( CYGHWR_HAL_A2FXXX_PERIPH + 0x00240000 )
+#define CYGHWR_HAL_A2FXXX_MSS_GPIO_BB                      ( CYGHWR_HAL_A2FXXX_PERIPH + 0x00260000 )
+#define CYGHWR_HAL_A2FXXX_MAC_BB                           ( CYGHWR_HAL_A2FXXX_PERIPH + 0x00060000 )
+
+//=============================================================================
+// Device signature and ID registers
+
+#define CYGHWR_HAL_A2FXXX_MCU_ID                           (CYGHWR_HAL_A2FXXX_CORTEXM3 + 0xD00)
+#define CYGHWR_HAL_A2FXXX_MCU_ID_REV(__x)                  ((__x)&0xF)
+#define CYGHWR_HAL_A2FXXX_MCU_PART_NO(__x)                 (((__x)>>4)&0x0FFF)
+#define CYGHWR_HAL_A2FXXX_MCU_VAR_NO(__x)                  (((__x)>>20)&0xF)
+
+
+//=============================================================================
+// System Control
+//
+#define CYGHWR_HAL_A2FXXX_SC_ESRAM_CR                      0x000
+#define CYGHWR_HAL_A2FXXX_SC_ENVM_CR                       0x004
+#define CYGHWR_HAL_A2FXXX_SC_ENVM_REMAP_SYS_CR             0x008
+#define CYGHWR_HAL_A2FXXX_SC_ENVM_REMAP_FAB_CR             0x00C
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_CR              0x010
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_BASE_CR              0x014
+#define CYGHWR_HAL_A2FXXX_SC_AHB_MATRIX_CR                 0x018
+#define CYGHWR_HAL_A2FXXX_SC_MSS_SR                        0x01C
+#define CYGHWR_HAL_A2FXXX_SC_CLR_MSS_SR                    0x020
+#define CYGHWR_HAL_A2FXXX_SC_EFROM_CR                      0x024
+#define CYGHWR_HAL_A2FXXX_SC_IAP_CR                        0x028
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTIRQ_CR                0x02C
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR                0x030
+#define CYGHWR_HAL_A2FXXX_SC_DEVICE_SR                     0x034
+#define CYGHWR_HAL_A2FXXX_SC_SYSTICK_CR                    0x038
+#define CYGHWR_HAL_A2FXXX_SC_EMC_MUX_CR                    0x03C
+#define CYGHWR_HAL_A2FXXX_SC_EMC_CS0_CR                    0x040
+#define CYGHWR_HAL_A2FXXX_SC_EMC_CS1_CR                    0x044
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR                    0x048
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR                0x04C
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR                0x050
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR                0x054
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR                0x058
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_SR                    0x05C
+#define CYGHWR_HAL_A2FXXX_SC_VRPSM_CR                      0x064
+#define CYGHWR_HAL_A2FXXX_SC_FAB_APB_HW_DR                 0x070
+#define CYGHWR_HAL_A2FXXX_SC_LOOPBACK_CR                   0x074
+#define CYGHWR_HAL_A2FXXX_SC_MSS_IO_BANK_CR                0x078
+#define CYGHWR_HAL_A2FXXX_SC_GPIN_SOURCE_CR                0x07C
+#define CYGHWR_HAL_A2FXXX_SC_IOMUX(_x_)                    ( 0x100 + (_x_ << 0x2) )
+
+// Reset register
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_PAD            BIT_(19)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_F2M            BIT_(18)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_FPGA           BIT_(17)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_EXT            BIT_(16)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_IAP            BIT_(15)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_GPIO           BIT_(14)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_ACE            BIT_(13)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_I2C1           BIT_(12)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_I2C0           BIT_(11)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_SPI1           BIT_(10)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_SPI0           BIT_(9)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_UART1          BIT_(8)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_UART0          BIT_(7)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_TIMER          BIT_(6)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_PDMA           BIT_(5)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_MAC            BIT_(4)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_EMC            BIT_(3)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_ESRAM1         BIT_(2)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_ESRAM0         BIT_(1)
+#define CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_ENVM           BIT_(0)
+
+#define CYGHWR_HAL_A2FXXX_PERIPH_SOFTRST(_periph)          CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR_##_periph
+
+void hal_a2fxxx_periph_reset( cyg_uint32 );
+void hal_a2fxxx_periph_release( cyg_uint32 );
+
+#define CYGHWR_HAL_A2FXXX_PERIPH_RESET           hal_a2fxxx_periph_reset
+#define CYGHWR_HAL_A2FXXX_PERIPH_RELEASE         hal_a2fxxx_periph_release
+
+#if 0
+#define CYGHWR_HAL_A2FXXX_PERIPH_START(_x)                 \
+{                                                          \
+    volatile int c = 0;                                    \
+    hal_a2fxxx_periph_reset(_x);                           \
+    while( c++ < 20 );                                     \
+    hal_a2fxxx_periph_release(_x);                         \
+}
+#endif
+
+// MSS CLK register
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_GLBDIV(_x)         VALUE_(12, ((_x)&0x3))
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_RTCIF(_x)          VALUE_( 8, ((_x)&0xf))
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_ACLKDIV(_x)        VALUE_( 6, ((_x)&0x3))
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_PCLK1DIV(_x)       VALUE_( 4, ((_x)&0x3))
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_PCLK0DIV(_x)       VALUE_( 2, ((_x)&0x3))
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_GET_PCLK0DIV(_x)   ((_x & 0x000C) >> 2)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_GET_PCLK1DIV(_x)   ((_x & 0x0030) >> 4)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_GET_GLBDIV(_x)     ((_x & 0x0C00) >> 12)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_RMIICLKSEL         BIT_(0)
+
+// MSS CCC DIV register
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIVRST       BIT_(22)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIVHALF      BIT_(21)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIV(_x)      VALUE_(16, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIVRST       BIT_(14)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIVHALF      BIT_(13)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIV(_x)      VALUE_( 8, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIVRST       BIT_(6)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIVHALF      BIT_(5)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIV(_x)      VALUE_( 0, _x)
+
+// MSS CCC MUX register
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_MAINOSCM(_x)   VALUE_(30, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_MAINOSCEN      BIT_(29)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXCFG(_x)   VALUE_(26, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXSEL(_x)   VALUE_(24, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSC        BIT_(22)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(_x)      VALUE_(19, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_DYNCSEL        BIT_(18)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_RXCSEL         BIT_(17)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_STATCSEL       BIT_(16)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSB        BIT_(14)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OBMUX(_x)      VALUE_(11, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_DYNBSEL        BIT_(10)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_RXBSEL         BIT_(9)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_STATBSEL       BIT_(8)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSA        BIT_(6)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OAMUX(_x)      VALUE_( 3, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_DYNASEL        BIT_(2)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_RXASEL         BIT_(1)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_STATASEL       BIT_(0)
+
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLA             0
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLC             1
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLINT           2
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GND             3
+
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_CLKA_SEL(_x_)  \
+({                                                         \
+   cyg_uint32 _i = _x_;                                    \
+   _i;                                                     \
+})
+
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_CLKB_SEL(_x_)  \
+({                                                         \
+   cyg_uint32 _i = _x_;                                    \
+   _i = _i << 8;                                           \
+   _i;                                                     \
+})
+
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_CLKC_SEL(_x_)  \
+({                                                         \
+   cyg_uint32 _i = _x_;                                    \
+   _i = _i << 16;                                          \
+   _i;                                                     \
+})
+
+// MSS CCC PLL register
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_PLLEN          BIT_(31)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_VCOSEL2_1(_x)  VALUE_(23, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_VCOSEL0        BIT_(22)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_XDLYSEL(_x)    VALUE_(21, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FBDLY(_x)      VALUE_(16, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FBSEL(_x)      VALUE_(14, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FBDIV(_x)      VALUE_(7, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FINDIV(_x)     VALUE_(0, _x)
+
+// Delay Configuration Register
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA1(_x)      VALUE_(20, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA0(_x)      VALUE_(15, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYC(_x)       VALUE_(10, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYB(_x)       VALUE_(5, _x)
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA(_x)       VALUE_(0, _x)
+
+// CCC Status Register
+#define CYGHWR_HAL_A2FXXX_SC_MSS_CCC_SR_PLL_LOCK_SYNC      BIT_(0)
+
+// ESRAM control register
+#define CYGHWR_HAL_A2FXXX_SC_ESRAM_CR_REMAP                BIT_(0)
+
+// ENVM control register
+#define CYGHWR_HAL_A2FXXX_SC_ENVM_CR_SIX_CYCLE             BIT_(7)
+#define CYGHWR_HAL_A2FXXX_SC_ENVM_CR_PIPE_BYPASS           BIT_(6)
+#define CYGHWR_HAL_A2FXXX_SC_ENVM_CR_REMAP_SIZE(_s_)       VALUE_(0, _s_)
+
+// ENVM re-mapping in system or fabric master space register
+#define CYGHWR_HAL_A2FXXX_SC_ENVM_REMAP_BASE(_b_)          VALUE_(1, _b_)
+#define CYGHWR_HAL_A2FXXX_SC_ENVM_REMAP_EN                 BIT_(0)
+
+// Fabric protect size
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_128B            VALUE_(0, 6)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_2KB             VALUE_(0, 10)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_16KB            VALUE_(0, 13)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_32KB            VALUE_(0, 14)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_64KB            VALUE_(0, 15)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_128KB           VALUE_(0, 16)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_256KB           VALUE_(0, 17)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_512KB           VALUE_(0, 18)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_8MB             VALUE_(0, 22)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_128MB           VALUE_(0, 26)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_SIZE_2GB             VALUE_(0, 30)
+
+// Fabric protect control register
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_BASE_CR_VAL(_x)      VALUE_( 1, _x)
+#define CYGHWR_HAL_A2FXXX_SC_FAB_PROT_BASE_CR_EN           BIT_(0)
+
+// Embedded FlashROM control register
+#define CYGHWR_HAL_A2FXXX_SC_EFROM_CR_SYS_TOPT3_1(_v_)     VALUE_(1, _v_)
+#define CYGHWR_HAL_A2FXXX_SC_EFROM_CR_SYS_TOPT0            BIT_(0)
+
+//=============================================================================
+// DMA
+//
+
+#define CYGHWR_HAL_A2FXXX_DMA_RATIO                         0x0
+#define CYGHWR_HAL_A2FXXX_DMA_BUFFER_STATUS                 0x4
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL(_x_)                (0x20 + (_x_ * 0x20))
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_STATUS(_x_)              (0x24 + (_x_ * 0x20))
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_BA_SRC(_x_)              (0x28 + (_x_ * 0x20))
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_BA_DST(_x_)              (0x2C + (_x_ * 0x20))
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_BA_COUNT(_x_)            (0x30 + (_x_ * 0x20))
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_BB_SRC(_x_)              (0x34 + (_x_ * 0x20))
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_BB_DST(_x_)              (0x38 + (_x_ * 0x20))
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_BB_COUNT(_x_)            (0x3C + (_x_ * 0x20))
+
+// Ratio
+#define CYGHWR_HAL_A2FXXX_DMA_RATIO_HILO(_x_)              VALUE_(0, _x_)
+
+// Buffer status
+#define CYGHWR_HAL_A2FXXX_DMA_BUFFER_STATUS_CHAxx(_x_)     VALUE_( (_x_ << 1), 1)
+#define CYGHWR_HAL_A2FXXX_DMA_BUFFER_STATUS_CHAx(_x_)      VALUE_(((_x_ << 1)+1), 1)
+
+// Channel control
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_PERIPH_SEL(_p_)     VALUE_(23, _p_)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_WR_ADJ(_v_)         VALUE_(14, _v_)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_DST_INCR_4B         VALUE_(12, 0x3)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_DST_INCR_2B         VALUE_(12, 0x2)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_DST_INCR_1B         VALUE_(12, 0x1)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_DST_INCR_0B         VALUE_(12, 0x0)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_DST_INCR(_x_)       VALUE_(12, ((_x_) & 0x3))
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_SRC_INCR_4B         VALUE_(10, 0x3)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_SRC_INCR_2B         VALUE_(10, 0x2)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_SRC_INCR_1B         VALUE_(10, 0x1)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_SRC_INCR_0B         VALUE_(10, 0x0)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_SRC_INCR(_x_)       VALUE_(10, ((_x_) & 0x3))
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_CLR_HI_PRI          BIT_(9)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_CLR_COMPB           BIT_(8)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_CLR_COMPA           BIT_(7)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_INTEN               BIT_(6)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_RESET               BIT_(5)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_PAUSE               BIT_(4)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_XFER_WORD           VALUE_(2, 0x2)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_XFER_HWORD          VALUE_(2, 0x1)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_XFER_BYTE           VALUE_(2, 0x0)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_DIR                 BIT_(1)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_PERIPH              BIT_(0)
+
+// DMA transfer type
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_FROM_UART0              0x0
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_TO_UART0                0x1
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_FROM_UART1              0x2
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_TO_UART1                0x3
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_FROM_SPI0               0x4
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_TO_SPI0                 0x5
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_FROM_SPI1               0x6
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_TO_SPI1                 0x7
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_FROM_FPGA               0x8
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_TO_FPGA                 0x9
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_FROM_ACE                0x10
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_TO_ACE                  0x11
+#define CYGHWR_HAL_A2FXXX_DMA_XFER_MEMORY                  0xff
+
+#define CYGHWR_HAL_A2FXXX_DMA_XFER(_x)                     CYGHWR_HAL_A2FXXX_DMA_XFER_##_x
+
+#define CYGHWR_HAL_A2FXXX_DMA_GET_SUB_ID(_x)               ((_x>>2) & 0x01)
+
+// Channel status
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_STATUS_BUF_SEL           BIT_(2)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_STATUS_COMPB             BIT_(1)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_STATUS_COMPA             BIT_(0)
+
+// Buffer count
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_BA_COUNT_FIELD(_c)       VALUE_(0, _c)
+#define CYGHWR_HAL_A2FXXX_DMA_CHx_BB_COUNT_FIELD(_c)       VALUE_(0, _c)
+
+#define CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL                  8
+#define CYGHWR_HAL_A2FXXX_DMA_MAX_SUB_CHANNEL              2
+
+// DMA access prototypes
+void             hal_dma_init ( void );
+cyg_uint32       a2fxxx_dma_xfer (cyg_uint8 , cyg_bool , cyg_uint32 len, cyg_uint8* , cyg_uint8* );
+cyg_uint32       a2fxxx_dma_ch_setup (cyg_uint8 , cyg_uint8 , cyg_bool , cyg_uint8 , cyg_uint8 , cyg_bool, cyg_uint8);
+void             a2fxxx_dma_ch_detach (cyg_uint8 );
+void             a2fxxx_dma_update_incr (cyg_uint8 , cyg_bool , cyg_uint8 );
+void             a2fxxx_dma_clear_interrupt (cyg_uint8 );
+cyg_uint8        a2fxxx_dma_get_comp_flag (cyg_uint8 );
+
+#define CYGHWR_HAL_A2FXXX_DMA_OUTBOUND                     true
+#define CYGHWR_HAL_A2FXXX_DMA_INBOUND                      false
+
+//=============================================================================
+// ENVM
+//
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS                      0x00
+#define CYGHWR_HAL_A2FXXX_ENVM_CTRL                        0x04
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ                         0x08
+#define CYGHWR_HAL_A2FXXX_ENVM0_CR                         0x10
+#define CYGHWR_HAL_A2FXXX_ENVM1_CR                         0x14
+#define CYGHWR_HAL_A2FXXX_ENVM0_PAGE_STATUS                0x18
+#define CYGHWR_HAL_A2FXXX_ENVM1_PAGE_STATUS                0x1C
+
+// Status Register
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_ILLEGAL_CMD_1        BIT_(31)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_1                    VALUE_(24, 0x3)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_OP_DONE_1            BIT_(23)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_ECC2_ERR_1           BIT_(22)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_ECC1_ERR_1           BIT_(21)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_OVER_THR_1           BIT_(20)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_ERASE_ERR_1          BIT_(19)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_PROG_ERR_1           BIT_(18)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_PROT_ERR_1           BIT_(17)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_BSY_1                BIT_(16)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_ILLEGAL_CMD_0        BIT_(15)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_0                    VALUE_( 8, 0x3)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_OP_DONE_0            BIT_(7)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_ECC2_ERR_0           BIT_(6)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_ECC1_ERR_0           BIT_(5)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_OVER_THR_0           BIT_(4)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_ERASE_ERR_0          BIT_(3)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_PROG_ERR_0           BIT_(2)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_PROT_ERR_0           BIT_(1)
+#define CYGHWR_HAL_A2FXXX_ENVM_STATUS_BSY_0                BIT_(0)
+
+// Control Register
+#define CYGHWR_HAL_A2FXXX_ENVM_CTRL_COMMAND(_x_)           VALUE_(24, _x_)
+#define CYGHWR_HAL_A2FXXX_ENVM_CTRL_PAGE_ADDR(_x_)         VALUE_( 0, _x_)
+
+// Interrupt Enable
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_ILLEGAL_CMD_1           BIT_(31)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_OP_DONE_1               BIT_(23)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_ECC2_ERR_1              BIT_(22)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_ECC1_ERR_1              BIT_(21)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_OVER_THR_1              BIT_(20)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_ERASE_ERR_1             BIT_(19)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_PROG_ERR_1              BIT_(18)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_PROT_ERR_1              BIT_(17)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_ILLEGAL_CMD_0           BIT_(15)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_OP_DONE_0               BIT_(7)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_ECC2_ERR_0              BIT_(6)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_ECC1_ERR_0              BIT_(5)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_OVER_THR_0              BIT_(4)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_ERASE_ERR_0             BIT_(3)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_PROG_ERR_0              BIT_(2)
+#define CYGHWR_HAL_A2FXXX_ENVM_IRQ_PROT_ERR_0              BIT_(1)
+
+// Configuration Register
+#define CYGHWR_HAL_A2FXXX_ENVMx_CR_LOCK                    BIT_(2)
+#define CYGHWR_HAL_A2FXXX_ENVMx_CR_PAGE_LOSS               BIT_(1)
+#define CYGHWR_HAL_A2FXXX_ENVMx_CR_READ_NEXT               BIT_(0)
+
+// Page status
+#define CYGHWR_HAL_A2FXXX_ENVMx_PAGE_STATUS_WCOUNT         VALUE_(8, 0x00ffffffff)
+#define CYGHWR_HAL_A2FXXX_ENVMx_PAGE_STATUS_OVER_THR       BIT_(3)
+#define CYGHWR_HAL_A2FXXX_ENVMx_PAGE_STATUS_RPROT          BIT_(2)
+#define CYGHWR_HAL_A2FXXX_ENVMx_PAGE_STATUS_WPROT          BIT_(1)
+#define CYGHWR_HAL_A2FXXX_ENVMx_PAGE_STATUS_OPROT          BIT_(0)
+
+
+//=============================================================================
+// eSRAM
+//
+
+#define CYGHWR_HAL_A2FXXX_ESRAM_CR                         0xE0002000
+#define CYGHWR_HAL_A2FXXX_AHB_MATRIX_CR                    0xE0002018
+
+#define CYGHWR_HAL_A2FXXX_ESRAM_CR_REMAP                   BIT_(0)
+
+
+//=============================================================================
+// SPI
+//
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL                         0x00
+#define CYGHWR_HAL_A2FXXX_SPI_TXRXDF_SIZE                  0x04
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS                       0x08
+#define CYGHWR_HAL_A2FXXX_SPI_IRQ_CLEAR                    0x0C
+#define CYGHWR_HAL_A2FXXX_SPI_RX                           0x10
+#define CYGHWR_HAL_A2FXXX_SPI_TX                           0x14
+#define CYGHWR_HAL_A2FXXX_SPI_CLK_GEN                      0x18
+#define CYGHWR_HAL_A2FXXX_SPI_SLAVE_SEL                    0x1C
+#define CYGHWR_HAL_A2FXXX_SPI_MIS                          0x20
+#define CYGHWR_HAL_A2FXXX_SPI_RIS                          0x24
+
+// Control Register
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_SPH                     BIT_(25)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_SPO                     BIT_(24)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_COUNT(_x)               VALUE_(8, _x)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_IRQ_TX_UNRRUN           BIT_(7)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_IRQ_RX_OVRFLO           BIT_(6)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_IRQ_TX                  BIT_(5)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_IRQ_RX                  BIT_(4)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_PROTO_NS                VALUE_(2, 0x2)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_PROTO_TI                VALUE_(2, 0x1)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_PROTO_MOTOROLA          VALUE_(2, 0x0)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_MASTER                  BIT_(1)
+#define CYGHWR_HAL_A2FXXX_SPI_CTRL_EN                      BIT_(0)
+
+// Status Register
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_TX_FIFO_EMPTY_N       BIT_(11)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_TX_FIFO_EMPTY         BIT_(10)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_TX_FIFO_FULL_N        BIT_(9)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_TX_FIFO_FULL          BIT_(8)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_RX_FIFO_EMPTY_N       BIT_(7)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_RX_FIFO_EMPTY         BIT_(6)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_RX_FIFO_FULL_N        BIT_(5)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_RX_FIFO_FULL          BIT_(4)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_TX_UNDERRUN           BIT_(3)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_RX_OVERFLOW           BIT_(2)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_RX_RCED               BIT_(1)
+#define CYGHWR_HAL_A2FXXX_SPI_STATUS_TX_SENT               BIT_(0)
+
+// Interrupt Clear Register
+#define CYGHWR_HAL_A2FXXX_SPI_IRQ_CLEAR_TXUNDRUN           BIT_(3)
+#define CYGHWR_HAL_A2FXXX_SPI_IRQ_CLEAR_RXOVRFLW           BIT_(2)
+#define CYGHWR_HAL_A2FXXX_SPI_IRQ_CLEAR_RXRDY              BIT_(1)
+#define CYGHWR_HAL_A2FXXX_SPI_IRQ_CLEAR_TXDONE             BIT_(0)
+
+// Masked Interrupt
+#define CYGHWR_HAL_A2FXXX_SPI_MIS_TXUNDRUN                 BIT_(3)
+#define CYGHWR_HAL_A2FXXX_SPI_MIS_RXOVRFLW                 BIT_(2)
+#define CYGHWR_HAL_A2FXXX_SPI_MIS_RXRDY                    BIT_(1)
+#define CYGHWR_HAL_A2FXXX_SPI_MIS_TXDONE                   BIT_(0)
+
+// Raw Interrupt Status
+#define CYGHWR_HAL_A2FXXX_SPI_RIS_TXUNDRUN                 BIT_(3)
+#define CYGHWR_HAL_A2FXXX_SPI_RIS_RXOVRFLW                 BIT_(2)
+#define CYGHWR_HAL_A2FXXX_SPI_RIS_RXRDY                    BIT_(1)
+#define CYGHWR_HAL_A2FXXX_SPI_RIS_TXDONE                   BIT_(0)
+
+// Chip select selection
+#define CYGHWR_HAL_A2FXXX_SPI_CS_SEL(_dev)                 (0x1 << _dev)
+
+// Peripherals IOs mapping
+#define CYGHWR_HAL_A2FXXX_SPI0_DO  CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI0_DO,   DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI0_DI  CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI0_DI,   DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI0_CLK CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI0_CLK,  DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI0_SS0 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI0_SS_0, DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI0_SS1 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI0_SS_1, DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI0_SS2 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI0_SS_2, DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI0_SS3 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI0_SS_3, DISABLE )
+
+#define CYGHWR_HAL_A2FXXX_SPI1_DO  CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_DO,   DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI1_DI  CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_DI,   DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI1_CLK CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_CLK,  DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI1_SS0 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_SS_0, DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI1_SS1 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_SS_1, DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI1_SS2 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_SS_2, DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI1_SS3 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_SS_3, DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI1_SS4 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_SS_4, DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI1_SS5 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_SS_5, DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI1_SS6 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_SS_6, DISABLE )
+#define CYGHWR_HAL_A2FXXX_SPI1_SS7 CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, SPI1_SS_7, DISABLE )
+
+// This is a special GPIO macro accommodated for SPI slave select
+#define CYGHWR_HAL_A2FXXX_CS_GPIO(                        \
+    __bit,                                                \
+    __mode,                                               \
+    __p_io,                                               \
+    __irq)                                                \
+(                                                         \
+      (__bit << 23) |                                     \
+      (CYGHWR_HAL_A2FXXX_GPIO_MODE_ ## __mode) |          \
+       CYGHWR_HAL_A2FXXX_GPIO_PERIPH_GPIO(__p_io) |       \
+      (CYGHWR_HAL_A2FXXX_GPIO_IRQ_ ## __irq)              \
+)
+
+__externC cyg_uint32 hal_a2fxxx_spi_clock( cyg_uint32 );
+
+//=============================================================================
+// I2C
+//
+#define CYGHWR_HAL_A2FXXX_I2C_CTRL                         0x00
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS                       0x04
+#define CYGHWR_HAL_A2FXXX_I2C_DATA                         0x08
+#define CYGHWR_HAL_A2FXXX_I2C_ADDR                         0x0C
+#define CYGHWR_HAL_A2FXXX_I2C_SMBUS                        0x10
+#define CYGHWR_HAL_A2FXXX_I2C_FREQ                         0x14
+#define CYGHWR_HAL_A2FXXX_I2C_GLITCH                       0x18
+
+// Control Register
+#define CYGHWR_HAL_A2FXXX_I2C_CTRL_CR2                     BIT_(7)
+#define CYGHWR_HAL_A2FXXX_I2C_CTRL_ENS1                    BIT_(6)
+#define CYGHWR_HAL_A2FXXX_I2C_CTRL_STA                     BIT_(5)
+#define CYGHWR_HAL_A2FXXX_I2C_CTRL_STO                     BIT_(4)
+#define CYGHWR_HAL_A2FXXX_I2C_CTRL_SI                      BIT_(3)
+#define CYGHWR_HAL_A2FXXX_I2C_CTRL_AA                      BIT_(2)
+#define CYGHWR_HAL_A2FXXX_I2C_CTRL_CR1                     BIT_(1)
+#define CYGHWR_HAL_A2FXXX_I2C_CTRL_CR0                     BIT_(0)
+
+// I2C clock divider
+#define CYGHWR_HAL_A2FXXX_I2C_DIV_8                        0x7
+#define CYGHWR_HAL_A2FXXX_I2C_DIV_60                       0x6
+#define CYGHWR_HAL_A2FXXX_I2C_DIV_120                      0x5
+#define CYGHWR_HAL_A2FXXX_I2C_DIV_960                      0x4
+#define CYGHWR_HAL_A2FXXX_I2C_DIV_160                      0x3
+#define CYGHWR_HAL_A2FXXX_I2C_DIV_192                      0x2
+#define CYGHWR_HAL_A2FXXX_I2C_DIV_224                      0x1
+#define CYGHWR_HAL_A2FXXX_I2C_DIV_256                      0x0
+
+// Status Registers
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MTX_START             0x08
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MTX_REPEAT_START      0x10
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MTX_ADDR_ACK          0x18
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MTX_ADDR_NACK         0x20
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MTX_DATA_ACK          0x28
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MTX_DATA_NACK         0x30
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MTX_ARBLOST           0x38
+
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MRX_START             0x08
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MRX_REPEAT_START      0x10
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MRX_ARBLOST           0x38
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MRX_ADDR_ACK          0x40
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MRX_ADDR_NACK         0x48
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MRX_DATA_ACK          0x50
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MRX_DATA_NACK         0x58
+
+#define CYGHWR_HAL_A2FXXX_I2C_STATUS_MRESET                0xD0
+
+// SMB
+#define CYGHWR_HAL_A2FXXX_I2C_SMBUS_RST                    BIT_(7)
+#define CYGHWR_HAL_A2FXXX_I2C_SMBUS_NO                     BIT_(6)
+#define CYGHWR_HAL_A2FXXX_I2C_SMBUS_NI                     BIT_(5)
+#define CYGHWR_HAL_A2FXXX_I2C_SMBALERT_NO                  BIT_(4)
+#define CYGHWR_HAL_A2FXXX_I2C_SMBALERT_NI                  BIT_(3)
+#define CYGHWR_HAL_A2FXXX_I2C_SMBUS_EN                     BIT_(2)
+#define CYGHWR_HAL_A2FXXX_I2C_SMBUS_IRQ_EN                 BIT_(1)
+#define CYGHWR_HAL_A2FXXX_I2C_SMBUS_ALERT_IRQ_EN           BIT_(0)
+
+// Peripherals IOs mapping
+#define CYGHWR_HAL_A2FXXX_I2C0_SDA CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, I2C0_SDA, DISABLE )
+#define CYGHWR_HAL_A2FXXX_I2C0_SCL CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, I2C0_SCL, DISABLE )
+
+#define CYGHWR_HAL_A2FXXX_I2C1_SDA CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, I2C1_SDA, DISABLE )
+#define CYGHWR_HAL_A2FXXX_I2C1_SCL CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, I2C1_SCL, DISABLE )
+
+__externC cyg_uint32 hal_a2fxxx_i2c_clock( cyg_uint32 );
+
+//=============================================================================
+// GPIO
+//
+#define CYGHWR_HAL_A2FXXX_MSS_GPIO_CFG(_io)                (_io << 2)
+#define CYGHWR_HAL_A2FXXX_MSS_GPIO_INT                     0x080
+#define CYGHWR_HAL_A2FXXX_MSS_GPIO_DIN                     0x084
+#define CYGHWR_HAL_A2FXXX_MSS_GPIO_DOUT                    0x088
+
+#define CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR                   0xe0042078
+#define CYGHWR_HAL_A2FXXX_GPIN_SOURCE_CR                   0xe004207c
+#define CYGHWR_HAL_A2FXXX_IOMUX_CR                         0xe0042100
+
+// CFG
+#define CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(_t)              VALUE_(5, (_t & 0x7))
+#define CYGHWR_HAL_A2FXXX_GPIO_CFG_GPINTEN                 BIT_(3)
+#define CYGHWR_HAL_A2FXXX_GPIO_CFG_OUTBUFEN                BIT_(2)
+#define CYGHWR_HAL_A2FXXX_GPIO_CFG_GPINEN                  BIT_(1)
+#define CYGHWR_HAL_A2FXXX_GPIO_CFG_GPOUTEN                 BIT_(0)
+
+// MSS GPIO
+#define CYGHWR_HAL_A2FXXX_MSS_IO_BANK_LVCMOS_3V3           0x0
+#define CYGHWR_HAL_A2FXXX_MSS_IO_BANK_LVCMOS_2V5           0x1
+#define CYGHWR_HAL_A2FXXX_MSS_IO_BANK_LVCMOS_1V8           0x2
+#define CYGHWR_HAL_A2FXXX_MSS_IO_BANK_LVCMOS_1V5           0x3
+
+#define CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTEAST(_t)        VALUE_(0, (CYGHWR_HAL_A2FXXX_MSS_IO_BANK_##_t & 0x3))
+#define CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTWEST(_t)        VALUE_(2, (CYGHWR_HAL_A2FXXX_MSS_IO_BANK_##_t & 0x3))
+
+// HAL definitions
+#define CYGHWR_HAL_A2FXXX_GPIO_MODE_IN                     VALUE_(0,0)     // Input mode
+#define CYGHWR_HAL_A2FXXX_GPIO_MODE_OUT                    VALUE_(0,1)     // Output mode
+#define CYGHWR_HAL_A2FXXX_GPIO_MODE_PERIPH                 VALUE_(0,2)     // Peripheral function mode
+
+#define CYGHWR_HAL_A2FXXX_GPIO_PERIPH_IO(_name_)           VALUE_(2, CYGHWR_HAL_A2FXXX_IOMUX_##_name_)
+#define CYGHWR_HAL_A2FXXX_GPIO_PERIPH_GPIO(_id_)           VALUE_(2, (CYGHWR_HAL_A2FXXX_IOMUX_GPIO_0+_id_))
+
+#define CYGHWR_HAL_A2FXXX_GPIO_IRQ_DISABLE                 VALUE_(10,0)     // Interrupt disable
+#define CYGHWR_HAL_A2FXXX_GPIO_IRQ_FALLING_EDGE            VALUE_(10,1)     // Interrupt on falling edge
+#define CYGHWR_HAL_A2FXXX_GPIO_IRQ_RISING_EDGE             VALUE_(10,2)     // Interrupt on rising edge
+#define CYGHWR_HAL_A2FXXX_GPIO_IRQ_BOTH_EDGES              VALUE_(10,3)     // Interrupt on both edges
+#define CYGHWR_HAL_A2FXXX_GPIO_IRQ_LOW_LEVEL               VALUE_(10,4)     // Interrupt on low level
+#define CYGHWR_HAL_A2FXXX_GPIO_IRQ_HIGH_LEVEL              VALUE_(10,5)     // Interrupt on high level
+
+typedef struct
+{
+   cyg_uint32 val;
+} default_io_mux_type;
+
+// IOMUX index setting for peripherals
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI0_DO                    0
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI0_DI                    1
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI0_CLK                   2
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI0_SS_0                  3
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART0_TX                   4
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART0_RX                   5
+#define CYGHWR_HAL_A2FXXX_IOMUX_I2C0_SDA                   6
+#define CYGHWR_HAL_A2FXXX_IOMUX_I2C0_SCL                   7
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_DO                    8
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_DI                    9
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_CLK                   10
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_SS_0                  11
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART1_TX                   12
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART1_RX                   13
+#define CYGHWR_HAL_A2FXXX_IOMUX_I2C1_SDA                   14
+#define CYGHWR_HAL_A2FXXX_IOMUX_I2C1_SCL                   15
+#define CYGHWR_HAL_A2FXXX_IOMUX_MAC0_TXD0                  16
+#define CYGHWR_HAL_A2FXXX_IOMUX_MAC0_TXD1                  17
+#define CYGHWR_HAL_A2FXXX_IOMUX_MAC0_RXD0                  18
+#define CYGHWR_HAL_A2FXXX_IOMUX_MAC0_RXD1                  19
+#define CYGHWR_HAL_A2FXXX_IOMUX_MAC0_TXEN                  20
+#define CYGHWR_HAL_A2FXXX_IOMUX_MAC0_CRSDV                 21
+#define CYGHWR_HAL_A2FXXX_IOMUX_MAC0_RXER                  22
+#define CYGHWR_HAL_A2FXXX_IOMUX_MAC0_MDIO                  23
+#define CYGHWR_HAL_A2FXXX_IOMUX_MAC0_MDC                   24
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_0                     25
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_1                     26
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_2                     27
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_3                     28
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_4                     29
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_5                     30
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_6                     31
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_7                     32
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_8                     33
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_9                     34
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_10                    35
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_11                    36
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_12                    37
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_13                    38
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_14                    39
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_15                    40
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_16                    41
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_17                    42
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_18                    43
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_19                    44
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_20                    45
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_21                    46
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_22                    47
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_23                    48
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_24                    49
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_25                    50
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_26                    51
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_27                    52
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_28                    53
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_29                    54
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_30                    55
+#define CYGHWR_HAL_A2FXXX_IOMUX_GPIO_31                    56
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI0_SS_1                  57
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI0_SS_2                  58
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI0_SS_3                  59
+// 60 to 63 not used
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART0_RTS                  64
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART0_DTR                  65
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART0_CTS                  66
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART0_DSR                  67
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART0_RI                   68
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART0_DCD                  69
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_SS_1                  70
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_SS_2                  71
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_SS_3                  72
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_SS_4                  73
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_SS_5                  74
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_SS_6                  75
+#define CYGHWR_HAL_A2FXXX_IOMUX_SPI1_SS_7                  76
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART1_RTS                  77
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART1_DTR                  78
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART1_CTS                  79
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART1_DSR                  80
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART1_RI                   81
+#define CYGHWR_HAL_A2FXXX_IOMUX_UART1_DCD                  82
+#define CYGHWR_HAL_A2FXXX_IOMUX_NONE                       83
+
+// This macro packs the port, bit number, mode, buffer and irq
+// for a GPIO pin into a single word.
+// The packing puts:
+
+#define CYGHWR_HAL_A2FXXX_GPIO(                             \
+    __bit,                                                  \
+    __mode,                                                 \
+    __name,                                                 \
+    __irq)                                                  \
+(                                                           \
+         (__bit << 23) |                                    \
+         (CYGHWR_HAL_A2FXXX_GPIO_MODE_ ## __mode) |         \
+          CYGHWR_HAL_A2FXXX_GPIO_PERIPH_IO(__name) |        \
+         (CYGHWR_HAL_A2FXXX_GPIO_IRQ_ ## __irq)             \
+)
+
+
+// Macros to extract encoded values
+#define CYGHWR_HAL_A2FXXX_GPIO_BIT(__pin)                  (((__pin)>>23) & 0x1F)
+#define CYGHWR_HAL_A2FXXX_GPIO_MODE(__pin)                 ((__pin)&0x0003)
+#define CYGHWR_HAL_A2FXXX_GPIO_IOMUX_IDX(__pin)            ((__pin>>2)  & 0xff)
+#define CYGHWR_HAL_A2FXXX_GPIO_IRQ(__pin)                  ((__pin>>10) & 0x07)
+#define CYGHWR_HAL_A2FXXX_GPIO_NONE                        (0xFFFFFFFF)
+
+__externC void hal_a2fxxx_gpio_set( cyg_uint32 pin );
+__externC void hal_a2fxxx_gpio_out( cyg_uint32 pin, int val );
+__externC void hal_a2fxxx_gpio_in ( cyg_uint32 pin, int *val );
+
+#define CYGHWR_HAL_A2FXXX_GPIO_SET(__pin )        hal_a2fxxx_gpio_set( __pin )
+#define CYGHWR_HAL_A2FXXX_GPIO_OUT(__pin, __val ) hal_a2fxxx_gpio_out( __pin, __val )
+#define CYGHWR_HAL_A2FXXX_GPIO_IN(__pin,  __val ) hal_a2fxxx_gpio_in( __pin, __val )
+
+
+//=============================================================================
+// UART
+//
+#define CYGHWR_HAL_A2FXXX_UART16550_RBR                    0x00
+#define CYGHWR_HAL_A2FXXX_UART16550_THR                    0x00
+#define CYGHWR_HAL_A2FXXX_UART16550_DLR                    0x00
+#define CYGHWR_HAL_A2FXXX_UART16550_DMR                    0x04
+#define CYGHWR_HAL_A2FXXX_UART16550_IER                    0x04
+#define CYGHWR_HAL_A2FXXX_UART16550_IIR                    0x08
+#define CYGHWR_HAL_A2FXXX_UART16550_FCR                    0x08
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR                    0x0C
+#define CYGHWR_HAL_A2FXXX_UART16550_MCR                    0x10
+#define CYGHWR_HAL_A2FXXX_UART16550_LSR                    0x14
+#define CYGHWR_HAL_A2FXXX_UART16550_MSR                    0x18
+#define CYGHWR_HAL_A2FXXX_UART16550_SR                     0x1C
+
+// IER
+#define CYGHWR_HAL_A2FXXX_UART16550_IER_EDSSI              BIT_(3)
+#define CYGHWR_HAL_A2FXXX_UART16550_IER_ELSI               BIT_(2)
+#define CYGHWR_HAL_A2FXXX_UART16550_IER_ETBEI              BIT_(1)
+#define CYGHWR_HAL_A2FXXX_UART16550_IER_ERBFI              BIT_(0)
+
+// IIR (by priority)
+#define CYGHWR_HAL_A2FXXX_UART16550_IIR_MODEM_STATUS       VALUE_(0, 0x0)
+#define CYGHWR_HAL_A2FXXX_UART16550_IIR_THRE               VALUE_(0, 0x2)
+#define CYGHWR_HAL_A2FXXX_UART16550_IIR_CTI                VALUE_(0, 0xC)
+#define CYGHWR_HAL_A2FXXX_UART16550_IIR_RXD                VALUE_(0, 0x4)
+#define CYGHWR_HAL_A2FXXX_UART16550_IIR_RLS                VALUE_(0, 0x6)
+
+// Fifo control
+#define CYGHWR_HAL_A2FXXX_UART16550_FCR_RX_TRIG_1BYTE      VALUE_(6, 0x0)
+#define CYGHWR_HAL_A2FXXX_UART16550_FCR_RX_TRIG_4BYTE      VALUE_(6, 0x1)
+#define CYGHWR_HAL_A2FXXX_UART16550_FCR_RX_TRIG_8BYTE      VALUE_(6, 0x2)
+#define CYGHWR_HAL_A2FXXX_UART16550_FCR_RX_TRIG_14BYTE     VALUE_(6, 0x3)
+#define CYGHWR_HAL_A2FXXX_UART16550_FCR_EN_TXRX_DY         BIT_(3)
+#define CYGHWR_HAL_A2FXXX_UART16550_FCR_CLEAR_TX_FIFO      BIT_(2)
+#define CYGHWR_HAL_A2FXXX_UART16550_FCR_CLEAR_RX_FIFO      BIT_(1)
+#define CYGHWR_HAL_A2FXXX_UART16550_FCR_RESERVED           BIT_(0)
+
+// Line control
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_DLAB               BIT_(7)
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_SB                 BIT_(6)
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_SP                 BIT_(5)
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_EPS                BIT_(4)
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_PEN                BIT_(3)
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_STOP_1             VALUE_(2,0)
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_STOP_2             VALUE_(2,1)
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_WLS_5BITS          VALUE_(0, 0x0)
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_WLS_6BITS          VALUE_(0, 0x1)
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_WLS_7BITS          VALUE_(0, 0x2)
+#define CYGHWR_HAL_A2FXXX_UART16550_LCR_WLS_8BITS          VALUE_(0, 0x3)
+
+// MCR register
+#define CYGHWR_HAL_A2FXXX_UART16550_MCR_LOOP               BIT_(4)
+#define CYGHWR_HAL_A2FXXX_UART16550_MCR_OUT2               BIT_(3)
+#define CYGHWR_HAL_A2FXXX_UART16550_MCR_OUT1               BIT_(2)
+#define CYGHWR_HAL_A2FXXX_UART16550_MCR_RTS                BIT_(1)
+#define CYGHWR_HAL_A2FXXX_UART16550_MCR_DTR                BIT_(0)
+
+// LSR register
+#define CYGHWR_HAL_A2FXXX_UART16550_LSR_FIER               BIT_(6)
+#define CYGHWR_HAL_A2FXXX_UART16550_LSR_TEMT               BIT_(6)
+#define CYGHWR_HAL_A2FXXX_UART16550_LSR_THRE               BIT_(5)
+#define CYGHWR_HAL_A2FXXX_UART16550_LSR_BI                 BIT_(4)
+#define CYGHWR_HAL_A2FXXX_UART16550_LSR_FE                 BIT_(3)
+#define CYGHWR_HAL_A2FXXX_UART16550_LSR_PE                 BIT_(2)
+#define CYGHWR_HAL_A2FXXX_UART16550_LSR_OE                 BIT_(1)
+#define CYGHWR_HAL_A2FXXX_UART16550_LSR_DR                 BIT_(0)
+
+// MSR
+#define CYGHWR_HAL_A2FXXX_UART16550_MSR_DCD                BIT_(7)
+#define CYGHWR_HAL_A2FXXX_UART16550_MSR_RI                 BIT_(6)
+#define CYGHWR_HAL_A2FXXX_UART16550_MSR_DSR                BIT_(5)
+#define CYGHWR_HAL_A2FXXX_UART16550_MSR_CTS                BIT_(4)
+#define CYGHWR_HAL_A2FXXX_UART16550_MSR_DDCD               BIT_(3)
+#define CYGHWR_HAL_A2FXXX_UART16550_MSR_TERI               BIT_(2)
+#define CYGHWR_HAL_A2FXXX_UART16550_MSR_DDSR               BIT_(1)
+#define CYGHWR_HAL_A2FXXX_UART16550_MSR_DCTS               BIT_(0)
+
+__externC cyg_uint32 hal_a2fxxx_pclk0;
+__externC cyg_uint32 hal_a2fxxx_pclk1;
+
+__externC void hal_a2fxxx_uart_setbaud(cyg_uint32 , cyg_uint32 );
+
+// Consider adding rounding ?
+#define CYG_HAL_CORTEXM_A2FXXX_BAUD_GENERATOR( id, baud )  \
+({                                                         \
+   cyg_uint16 _divider;                                    \
+   if( id == 0 )                                           \
+     _divider = (hal_a2fxxx_pclk0/(baud << 4));            \
+   else                                                    \
+     _divider = (hal_a2fxxx_pclk1/(baud << 4));            \
+   _divider;                                               \
+})
+
+// Peripherals IOs mapping
+#define CYGHWR_HAL_A2FXXX_UART0_TX CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, UART0_TX, DISABLE )
+#define CYGHWR_HAL_A2FXXX_UART0_RX CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, UART0_RX, DISABLE )
+
+#define CYGHWR_HAL_A2FXXX_UART1_TX CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, UART1_TX, DISABLE )
+#define CYGHWR_HAL_A2FXXX_UART1_RX CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, UART1_RX, DISABLE )
+
+
+//=============================================================================
+// Watchdog
+//
+#define CYGHWR_HAL_A2FXXX_WD_VALUE                         0x00
+#define CYGHWR_HAL_A2FXXX_WD_LOAD                          0x04
+#define CYGHWR_HAL_A2FXXX_WD_MVRP                          0x08
+#define CYGHWR_HAL_A2FXXX_WD_REFRESH                       0x0C
+#define CYGHWR_HAL_A2FXXX_WD_ENABLE                        0x10
+#define CYGHWR_HAL_A2FXXX_WD_CTRL                          0x14
+#define CYGHWR_HAL_A2FXXX_WD_STATUS                        0x18
+#define CYGHWR_HAL_A2FXXX_WD_RIS                           0x1C
+#define CYGHWR_HAL_A2FXXX_WD_MIS                           0x20
+
+// Keys
+#define CYGHWR_HAL_A2FXXX_WD_REFRESH_KEY                   0xAC15DE42
+#define CYGHWR_HAL_A2FXXX_WD_DISABLE_KEY                   0x4C6E55FA
+
+
+//=============================================================================
+// Timer
+//
+#define CYGHWR_HAL_A2FXXX_TIMER1   CYGHWR_HAL_A2FXXX_TIMER
+#define CYGHWR_HAL_A2FXXX_TIMER2   (CYGHWR_HAL_A2FXXX_TIMER + 0x18)
+
+#define CYGHWR_HAL_A2FXXX_TIMER_TIMx_VAL                   0x00
+#define CYGHWR_HAL_A2FXXX_TIMER_TIMx_LOADVAL               0x04
+#define CYGHWR_HAL_A2FXXX_TIMER_TIMx_BGLOADVAL             0x08
+#define CYGHWR_HAL_A2FXXX_TIMER_TIMx_CTRL                  0x0c
+#define CYGHWR_HAL_A2FXXX_TIMER_TIMx_RIS                   0x10
+#define CYGHWR_HAL_A2FXXX_TIMER_TIMx_MIS                   0x14
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_VAL_U                0x30
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_VAL_L                0x34
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_LOADVAL_U            0x38
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_LOADVAL_L            0x3C
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_BGLOADVAL_U          0x40
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_BGLOADVAL_L          0x44
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_CTRL                 0x48
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_RIS                  0x4C
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_MIS                  0x50
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_MODE                 0x54
+
+// Timer control
+#define CYGHWR_HAL_A2FXXX_TIMER_TIMx_CTRL_INTEN            BIT_(2)
+#define CYGHWR_HAL_A2FXXX_TIMER_TIMx_CTRL_ONESHOT          BIT_(1)
+#define CYGHWR_HAL_A2FXXX_TIMER_TIMx_CTRL_EN               BIT_(0)
+
+// Timer control 64 bits
+#define CYGHWR_HAL_A2FXXX_TIMER_TIM64_MODE_64BITS          BIT_(0)
+
+
+//=============================================================================
+// MAC
+//
+#if defined(CYGHWR_HAL_CORTEXM_A2FXXX_A2F200) || \
+           defined(CYGHWR_HAL_CORTEXM_A2FXXX_A2F500)
+
+#define CYGHWR_HAL_A2FXXX_MAC_CSR0                         0x00
+#define CYGHWR_HAL_A2FXXX_MAC_CSR1                         0x08
+#define CYGHWR_HAL_A2FXXX_MAC_CSR2                         0x10
+#define CYGHWR_HAL_A2FXXX_MAC_CSR3                         0x18
+#define CYGHWR_HAL_A2FXXX_MAC_CSR4                         0x20
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5                         0x28
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6                         0x30
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7                         0x38
+#define CYGHWR_HAL_A2FXXX_MAC_CSR8                         0x40
+#define CYGHWR_HAL_A2FXXX_MAC_CSR9                         0x48
+#define CYGHWR_HAL_A2FXXX_MAC_CSR10                        0x50
+#define CYGHWR_HAL_A2FXXX_MAC_CSR11                        0x58
+
+// Bus Mode Register (CSR0)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR0_CLEAR                   0xFE000000
+#define CYGHWR_HAL_A2FXXX_MAC_CSR0_SPD                     BIT_(21)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR0_DBO                     BIT_(20)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR0_TAP(_x)                 VALUE_(17, (_x & 0x7))
+#define CYGHWR_HAL_A2FXXX_MAC_CSR0_PBL(_x)                 VALUE_(8, (_x & 0x2f))
+#define CYGHWR_HAL_A2FXXX_MAC_CSR0_BLE                     BIT_(7)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR0_DSL(_x)                 VALUE_(2, (_x & 0x1f))
+#define CYGHWR_HAL_A2FXXX_MAC_CSR0_BAR                     BIT_(1)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR0_SWR                     BIT_(0)
+
+// Transmit Poll Demand Register (CSR1)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR1_TPD(_x)                 VALUE_(0, _x)
+
+// Receive Poll Demand Register (CSR2)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR2_RPD(_x)                 VALUE_(0, _x)
+
+// Receive Descriptor List Base Address Register (CSR3)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR3_RLA(_x)                 VALUE_(0, _x)
+
+// Transmit Descriptor List Base Address Register (CSR4)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR4_TLA(_x)                 VALUE_(0, _x)
+
+// Status and Control Register (CSR5)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TS_CLOSE_TXD            VALUE_(20, 0x7)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TS_SUSPEND              VALUE_(20, 0x6)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TS_SETUP_PACKET         VALUE_(20, 0x5)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TS_XFER                 VALUE_(20, 0x3)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TS_WAIT_EOT             VALUE_(20, 0x2)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TS_FETCH_TXD            VALUE_(20, 0x1)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TS_STOP                 VALUE_(20, 0x0)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TS_MASK                 VALUE_(20, 0x7)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RS_XFER                 VALUE_(17, 0x7)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RS_CLOSE_RXD            VALUE_(17, 0x5)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RS_SUSPEND              VALUE_(17, 0x4)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RS_WAIT_PACKET          VALUE_(17, 0x3)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RS_WAIT_EOR             VALUE_(17, 0x2)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RS_FETCH_RXD            VALUE_(17, 0x1)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RS_STOP                 VALUE_(17, 0x0)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RS_MASK                 VALUE_(17, 0x7)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_NIS                     BIT_(16)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_AIS                     BIT_(15)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_ERI                     BIT_(14)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_GTE                     BIT_(11)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_ETI                     BIT_(10)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RPS                     BIT_(8)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RU                      BIT_(7)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_RI                      BIT_(6)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_UNF                     BIT_(5)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TU                      BIT_(2)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TPS                     BIT_(1)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR5_TI                      BIT_(0)
+
+// Define MAC state
+#define A2FXXX_MAC_TX_STATE(_x_)   CYGHWR_HAL_A2FXXX_MAC_CSR5_TS_##_x_
+#define A2FXXX_MAC_RX_STATE(_x_)   CYGHWR_HAL_A2FXXX_MAC_CSR5_RS_##_x_
+#define A2FXXX_MAC_TX_STATE_MASK                           VALUE_(20, 0x7)
+#define A2FXXX_MAC_RX_STATE_MASK                           VALUE_(17, 0x7)
+
+// Operation Mode Register (CSR6)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_CLEAR                   0xBF9F1D20
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_RA                      BIT_(30)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_TTM                     BIT_(22)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_SF                      BIT_(21)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_TR(_x)                  VALUE_(14, _x)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_ST                      BIT_(13)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_FD                      BIT_(9)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_PM                      BIT_(7)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_PR                      BIT_(6)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_IF                      BIT_(4)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_PB                      BIT_(3)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_HO                      BIT_(2)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_SR                      BIT_(1)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR6_HP                      BIT_(0)
+
+// Interrupt Enable Register (CSR7)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_NIE                     BIT_(16)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_AIE                     BIT_(15)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_ERE                     BIT_(14)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_GTE                     BIT_(11)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_ETE                     BIT_(10)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_RSE                     BIT_(8)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_RUE                     BIT_(7)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_RIE                     BIT_(6)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_UNE                     BIT_(5)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_TUE                     BIT_(2)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_TSE                     BIT_(1)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR7_TIE                     BIT_(0)
+
+// Missed Frames and Overflow Counter Register (CSR8)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR8_OCO                     BIT_(28)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR8_MFO                     BIT_(16)
+
+// RMII Management Interface Register (CSR9)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR9_MDI                     BIT_(19)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR9_MDEN                    BIT_(18)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR9_MDO                     BIT_(17)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR9_MDC                     BIT_(16)
+
+// General-Purpose Timer and Interrupt Mitigation Control Register (CSR11)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR11_CS                     BIT_(31)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR11_TT(_x)                 VALUE_(27, (_x & 0xf))
+#define CYGHWR_HAL_A2FXXX_MAC_CSR11_NTP(_x)                VALUE_(24, (_x & 0x7))
+#define CYGHWR_HAL_A2FXXX_MAC_CSR11_RT(_x)                 VALUE_(20, (_x & 0xf))
+#define CYGHWR_HAL_A2FXXX_MAC_CSR11_NRP(_x)                VALUE_(17, (_x & 0x7))
+#define CYGHWR_HAL_A2FXXX_MAC_CSR11_CON                    BIT_(16)
+#define CYGHWR_HAL_A2FXXX_MAC_CSR11_TIM(_x)                VALUE_(0, _x)
+
+// Receive Descriptors (RDESx)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_OWN                    BIT_(31)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_FF                     BIT_(30)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_FL(_x)                 VALUE_(16, _x)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_ES                     BIT_(15)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_DE                     BIT_(14)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_RF                     BIT_(11)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_MF                     BIT_(10)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_FS                     BIT_(9)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_LS                     BIT_(8)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_TL                     BIT_(7)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_CS                     BIT_(6)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_FT                     BIT_(5)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_RE                     BIT_(3)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_DB                     BIT_(2)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_CE                     BIT_(1)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES0_ZERO                   BIT_(0)
+
+#define CYGHWR_HAL_A2FXXX_MAC_RDES1_RER                    BIT_(25)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES1_RCH                    BIT_(24)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES1_RBS2(_x)               VALUE_(11, _x)
+#define CYGHWR_HAL_A2FXXX_MAC_RDES1_RBS1(_x)               VALUE_(0, _x)
+
+// Receive Descriptors (TDESx)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES0_OWN                    BIT_(31)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES0_ES                     BIT_(15)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES0_LO                     BIT_(11)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES0_NC                     BIT_(10)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES0_LC                     BIT_(9)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES0_EC                     BIT_(8)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES0_CC(_x)                 VALUE_(3, _x)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES0_UF                     BIT_(1)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES0_DE                     BIT_(0)
+
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_IC                     BIT_(31)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_LS                     BIT_(30)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_FS                     BIT_(29)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_FT1                    BIT_(28)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_SET                    BIT_(27)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_AC                     BIT_(26)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_TER                    BIT_(25)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_TCH                    BIT_(24)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_DPD                    BIT_(23)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_FT0                    BIT_(22)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_TBS2(_x)               VALUE_(11, _x)
+#define CYGHWR_HAL_A2FXXX_MAC_TDES1_TBS1(_x)               VALUE_(0, _x)
+
+#define CYGHWR_HAL_A2FXXX_MAC0_MDIO   CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, MAC0_MDIO,  DISABLE )
+#define CYGHWR_HAL_A2FXXX_MAC0_MDC    CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, MAC0_MDC,   DISABLE )
+#define CYGHWR_HAL_A2FXXX_MAC0_TXD0   CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, MAC0_TXD0,  DISABLE )
+#define CYGHWR_HAL_A2FXXX_MAC0_TXD1   CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, MAC0_TXD1,  DISABLE )
+#define CYGHWR_HAL_A2FXXX_MAC0_RXD0   CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, MAC0_RXD0,  DISABLE )
+#define CYGHWR_HAL_A2FXXX_MAC0_RXD1   CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, MAC0_RXD1,  DISABLE )
+#define CYGHWR_HAL_A2FXXX_MAC0_TXEN   CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, MAC0_TXEN,  DISABLE )
+#define CYGHWR_HAL_A2FXXX_MAC0_CRSDV  CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, MAC0_CRSDV, DISABLE )
+#define CYGHWR_HAL_A2FXXX_MAC0_RXER   CYGHWR_HAL_A2FXXX_GPIO( 0, PERIPH, MAC0_RXER,  DISABLE )
+
+#endif
+
+//=============================================================================
+// Spare page
+
+#define CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_KEY       0x081C
+#define CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_VERSION   0x0840
+#define CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_1_3_FCLK  0x162C
+#define CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_2_x_FCLK  0x1EAC
+
+// System boot key value
+#define CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_KEY_VALUE 0x4C544341
+
+// System boot version
+#define CYGHWR_HAL_A2FXXX_SYSBOOT_VERSION(_x, _y, _z)        ((_x << 16) | (_y << 8) | (_z))
+
+#define CYGHWR_HAL_A2FXXX_GET_SYSBOOT_VERSION()                                      \
+({                                                                                   \
+   cyg_uint32 _i;                                                                    \
+   cyg_uint32 base = CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES;                             \
+   HAL_READ_UINT32( base + CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_VERSION, _i);  \
+   _i;                                                                               \
+})
+
+#define CYGHWR_HAL_A2FXXX_GET_SYSBOOT_KEY()                                          \
+({                                                                                   \
+   cyg_uint32 _i;                                                                    \
+   cyg_uint32 base = CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES;                             \
+   HAL_READ_UINT32( base + CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_KEY, _i);      \
+   _i;                                                                               \
+})
+
+#define CYGHWR_HAL_A2FXXX_GET_SYSBOOT_1_3_FCLK()                                     \
+({                                                                                   \
+   cyg_uint32 _i;                                                                    \
+   cyg_uint32 base = CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES;                             \
+   HAL_READ_UINT32( base + CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_1_3_FCLK, _i); \
+   _i;                                                                               \
+})
+
+#define CYGHWR_HAL_A2FXXX_GET_SYSBOOT_2_0_FCLK()                                     \
+({                                                                                   \
+   cyg_uint32 _i;                                                                    \
+   cyg_uint32 base = CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES;                             \
+   HAL_READ_UINT32( base + CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_2_x_FCLK, _i); \
+   _i;                                                                               \
+})
+
+#define CYGHWR_HAL_A2FXXX_BITSET                           0x1
+#define CYGHWR_HAL_A2FXXX_BITCLEAR                         0x0
+//
+//-----------------------------------------------------------------------------
+// end of var_io.h
+#endif // CYGONCE_HAL_VAR_IO_H
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/include/variant.inc
@@ -0,0 +1,54 @@
+/*==========================================================================
+//
+//      variant.inc
+//
+//      Variant specific asm definitions
+//
+//==========================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2008 Free Software Foundation, Inc.                        
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos 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 General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    nickg
+// Date:         2008-07-30
+// Description:  
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+#include <pkgconf/hal_cortexm_a2fxxx.h>
+
+//==========================================================================
+// EOF variant.inc
+
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/src/a2fxxx_misc.c
@@ -0,0 +1,1214 @@
+/*==========================================================================
+//
+//      a2f_misc.c
+//
+//      Cortex-M Actel A2F HAL functions
+//
+//==========================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos 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 General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    ccoutand
+// Contributors:
+// Date:         2011-02-03
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+#include <pkgconf/hal.h>
+#include <pkgconf/hal_cortexm.h>
+#include <pkgconf/hal_cortexm_a2fxxx.h>
+
+#ifdef CYGPKG_KERNEL
+#include <pkgconf/kernel.h>
+#endif
+
+#include <cyg/infra/diag.h>
+#include <cyg/infra/cyg_type.h>
+#include <cyg/infra/cyg_trac.h>         // tracing macros
+#include <cyg/infra/cyg_ass.h>          // assertion macros
+
+#include <cyg/hal/hal_arch.h>           // HAL header
+#include <cyg/hal/hal_intr.h>           // HAL header
+#include <cyg/hal/hal_if.h>             // HAL header
+
+
+//==========================================================================
+// Clock Initialization values
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
+
+#define CLKx_SRC_CLKA    0
+#define CLKx_SRC_CLKB    1
+#define CLKx_SRC_CLKC    2
+#define CLKx_SRC_CLKGA   3
+#define CLKx_SRC_CLKGB   4
+#define CLKx_SRC_CLKGC   5
+#define CLKx_SRC_CLKGINT 6
+
+#define CLKx_SRC_UIN     0
+#define CLKx_SRC_DIP     1
+#define CLKx_SRC_UIP     4
+#define CLKx_SRC_GLxINT  5
+#define CLKx_SRC_RCOSC   2
+#define CLKx_SRC_MOSC    6
+#define CLKx_SRC_32KOSC  6
+
+// Select source of CLKA
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC_AUIN
+# define CLKA_SRC_SEL CLKx_SRC_UIN
+#elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC_AUIP)
+# define CLKA_SRC_SEL CLKx_SRC_UIP
+#elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC_ADIP)
+# define CLKA_SRC_SEL CLKx_SRC_DIP
+#elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC_GLAINT)
+# define CLKA_SRC_SEL CLKx_SRC_GLxINT
+#elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKA_SRC_RCOSC)
+# define CLKA_SRC_SEL CLKx_SRC_RCOSC
+#else
+# define CLKA_SRC_SEL CLKx_SRC_MOSC
+#endif
+
+// Select source of CLKB
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKB
+# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC_BUIN
+#  define CLKB_SRC_SEL CLKx_SRC_UIN
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC_BUIP)
+#  define CLKB_SRC_SEL CLKx_SRC_UIP
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC_BDIP)
+#  define CLKB_SRC_SEL CLKx_SRC_DIP
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC_GLBINT)
+#  define CLKB_SRC_SEL CLKx_SRC_GLxINT
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKB_SRC_RCOSC)
+#  define CLKB_SRC_SEL CLKx_SRC_RCOSC
+# else
+#  define CLKB_SRC_SEL CLKx_SRC_MOSC
+# endif
+#endif
+
+// Select source of CLKC
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKC
+# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC_CUIN
+#  define CLKC_SRC_SEL CLKx_SRC_UIN
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC_CUIP)
+#  define CLKC_SRC_SEL CLKx_SRC_UIP
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC_CDIP)
+#  define CLKC_SRC_SEL CLKx_SRC_DIP
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC_GLCINT)
+#  define CLKC_SRC_SEL CLKx_SRC_GLxINT
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKC_SRC_RCOSC)
+#  define CLKC_SRC_SEL CLKx_SRC_RCOSC
+# else
+#  define CLKC_SRC_SEL CLKx_SRC_32KOSC
+# endif
+#endif
+
+// Select source of CLKGA
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA
+# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC_CLKA
+#  define CLKGA_SRC_SEL 1
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC_PLL_VCO0)
+#  define CLKGA_SRC_SEL 4
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC_PLL_VCO90)
+#  define CLKGA_SRC_SEL 5
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC_PLL_VCO180)
+#  define CLKGA_SRC_SEL 6
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_SRC_PLL_VCO270)
+#  define CLKGA_SRC_SEL 7
+# else
+#  define CLKGA_SRC_SEL 2
+# endif
+#endif
+
+// Select source of CLKGB
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB
+# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_CLKB
+#  define CLKGB_SRC_SEL 1
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_CLKGA
+#  define CLKGB_SRC_SEL 3
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_PLL_VCO0)
+#  define CLKGB_SRC_SEL 4
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_PLL_VCO90)
+#  define CLKGB_SRC_SEL 5
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_PLL_VCO180)
+#  define CLKGB_SRC_SEL 6
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_SRC_PLL_VCO270)
+#  define CLKGB_SRC_SEL 7
+# else
+#  define CLKGB_SRC_SEL 2
+# endif
+#endif
+
+// Select source of CLKGC
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC
+# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_CLKC
+#  define CLKGC_SRC_SEL 1
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_CLKGA)
+#  define CLKGC_SRC_SEL 3
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_PLL_VCO0)
+#  define CLKGC_SRC_SEL 4
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_PLL_VCO90)
+#  define CLKGC_SRC_SEL 5
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_PLL_VCO180)
+#  define CLKGC_SRC_SEL 6
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_PLL_VCO270)
+#  define CLKGC_SRC_SEL 7
+# else
+#  define CLKGC_SRC_SEL 2
+# endif
+#endif
+
+#if CYGHWR_HAL_CORTEXM_A2FXXX_PCLK0_DIV   == 1
+# define PCLK0DIV 0
+#elif CYGHWR_HAL_CORTEXM_A2FXXX_PCLK0_DIV == 2
+# define PCLK0DIV 1
+#else
+# define PCLK0DIV 2
+#endif
+
+#if CYGHWR_HAL_CORTEXM_A2FXXX_PCLK1_DIV   == 1
+# define PCLK1DIV 0
+#elif CYGHWR_HAL_CORTEXM_A2FXXX_PCLK1_DIV == 2
+# define PCLK1DIV 1
+#else
+# define PCLK1DIV 2
+#endif
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_ACE_CLK
+# if CYGHWR_HAL_CORTEXM_A2FXXX_ACLK_DIV   == 1
+#  define ACLKDIV 0
+# elif CYGHWR_HAL_CORTEXM_A2FXXX_ACLK_DIV == 2
+#  define ACLKDIV 1
+# else
+#  define ACLKDIV 2
+# endif
+#endif
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_PLL
+# if CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FREQ   < 43750000
+#  define PLL_RANGE 0
+# elif CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FREQ < 87500000
+#  define PLL_RANGE 1
+# elif CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FREQ < 175000000
+#  define PLL_RANGE 2
+# else
+#  define PLL_RANGE 3
+# endif
+#endif
+
+#define OXDIV_CLEAR 0x1F
+#define OXMUX_CLEAR 0x07
+#define DLYX_CLEAR  0x1F
+#define DIV_CLEAR   0x03
+
+#endif // CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
+
+//==========================================================================
+// IO settings
+
+#ifdef CYGPKG_HAL_CORTEXM_A2FXXX_IO
+
+# if defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_WEST_BANK_LVCMOS_3V3)
+# define IO_WEST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTWEST(LVCMOS_3V3)
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_WEST_BANK_LVCMOS_2V5)
+# define IO_WEST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTWEST(LVCMOS_2V5)
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_WEST_BANK_LVCMOS_1V8)
+# define IO_WEST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTWEST(LVCMOS_1V8)
+# else
+# define IO_WEST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTWEST(LVCMOS_1V5)
+# endif
+
+# if defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_EAST_BANK_LVCMOS_3V3)
+# define IO_EAST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTEAST(LVCMOS_3V3)
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_EAST_BANK_LVCMOS_2V5)
+# define IO_EAST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTEAST(LVCMOS_2V5)
+# elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_IO_EAST_BANK_LVCMOS_1V8)
+# define IO_EAST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTEAST(LVCMOS_1V8)
+# else
+# define IO_EAST_BANK CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR_BTEAST(LVCMOS_1V5)
+# endif
+
+#endif // CYGPKG_HAL_CORTEXM_A2FXXX_IO
+
+
+#ifdef CYGSEM_HAL_CORTEXM_A2FXXX_CLOCK_CHATTER
+# define A2FXXX_CLOCK_TRACE(args...)   diag_printf(args)
+#else
+# define A2FXXX_CLOCK_TRACE(args...)    /* NOOP */
+#endif
+
+
+//==========================================================================
+// Clock frequencies
+//
+// These are set to the frequencies of the various system clocks.
+
+cyg_uint32 hal_a2fxxx_pclk0;           // Peripheral clock (connected to APB_0)
+cyg_uint32 hal_a2fxxx_pclk1;           // Peripheral clock (connected to APB_1)
+cyg_uint32 hal_a2fxxx_aclk;            // Analog Peripheral clock (ADC /DAC etc..)
+cyg_uint32 hal_a2fxxx_pclk_fpga;       // FPGA clock
+
+cyg_uint32 hal_a2fxxx_glb;             // Global Clock B
+cyg_uint32 hal_a2fxxx_glc;             // Global Clock C
+
+cyg_uint32 hal_cortexm_systick_clock;  // NGMUx output or FCLK or SysTick clock
+cyg_uint32 hal_a2fxxx_fclk;            // FCLK
+
+
+//==========================================================================
+// Local prototypes
+
+static void hal_a2fxxx_clk_network_chatter( cyg_uint8 );
+
+static cyg_uint8 hal_start_clocks( void );
+static cyg_uint8 hal_a2fxxx_get_system_boot_clk( void );
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
+static void hal_a2fxxx_set_clk_network( void );
+static void hal_a2fxxx_set_envm_timing( void );
+static void hal_a2fxxx_set_clkx( cyg_uint8 x, cyg_uint8 src );
+static void hal_a2fxxx_set_clkgx( cyg_uint8 x );
+static void hal_a2fxxx_set_clkgx_default( cyg_uint8 x );
+static void hal_a2fxxx_set_ngmux( cyg_uint8 );
+static cyg_uint8 hal_a2fxxx_get_ngmux( void );
+
+# if defined(CYGHWR_HAL_CORTEXM_A2FXXX_PLL)
+static inline void hal_a2fxxx_set_pll( void );
+# endif
+#endif
+
+
+//==========================================================================
+
+void
+hal_variant_init( void )
+{
+#if !defined(CYG_HAL_STARTUP_RAM)
+    cyg_uint8 sysboot_miss;
+#endif
+    cyg_uint32 base = CYGHWR_HAL_A2FXXX_WD;
+
+    // Disable Watch-dog
+    HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_WD_ENABLE,
+                                           CYGHWR_HAL_A2FXXX_WD_DISABLE_KEY);
+
+#if !defined(CYG_HAL_STARTUP_RAM)
+    sysboot_miss = hal_start_clocks();
+#endif
+
+    // Release GPIO
+    CYGHWR_HAL_A2FXXX_PERIPH_RELEASE( CYGHWR_HAL_A2FXXX_PERIPH_SOFTRST(GPIO) );
+
+    // Setup IO banks
+#ifdef CYGPKG_HAL_CORTEXM_A2FXXX_IO
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_MSS_IO_BANK_CR, (IO_WEST_BANK | IO_EAST_BANK) );
+#endif
+
+    // Reset UART0
+#if CYGINT_HAL_A2FXXX_UART0>0
+    CYGHWR_HAL_A2FXXX_PERIPH_RELEASE( CYGHWR_HAL_A2FXXX_PERIPH_SOFTRST(UART0) );
+#endif
+
+    // Reset UART1
+#if CYGINT_HAL_A2FXXX_UART1>0
+    CYGHWR_HAL_A2FXXX_PERIPH_RELEASE( CYGHWR_HAL_A2FXXX_PERIPH_SOFTRST(UART1) );
+#endif
+
+#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
+    hal_if_init();
+#endif
+
+#if !defined(CYG_HAL_STARTUP_RAM)
+    hal_a2fxxx_clk_network_chatter( sysboot_miss );
+#endif
+}
+
+//==========================================================================
+// Setup up system clocks
+//
+// Set up clocks from configuration. In the future this should be extended so
+// that clock rates can be changed at runtime.
+
+static cyg_uint8
+hal_start_clocks( void )
+{
+    if( ! hal_a2fxxx_get_system_boot_clk( ) )
+        return 0;
+
+    //
+    // User has chosen to re-configure the clock network and
+    // overwrite the settings provided by the system boot
+    //
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
+    hal_a2fxxx_set_clk_network( );
+
+    // Adjust the ENVM timing according to the core clock
+    // frequency
+    hal_a2fxxx_set_envm_timing( );
+#endif
+
+    return 1;
+}
+
+
+//==========================================================================
+// Read clock configuration as setup by the system boot
+
+static cyg_uint8
+hal_a2fxxx_get_system_boot_clk( void )
+{
+    cyg_uint32 sysboot_key, sysboot_ver, clk_cr, clkga0;
+
+    sysboot_ver = CYGHWR_HAL_A2FXXX_GET_SYSBOOT_VERSION();
+    sysboot_key = CYGHWR_HAL_A2FXXX_GET_SYSBOOT_KEY();
+
+    // Verify that the system boot is present, if not we must give up?
+    if( CYGHWR_HAL_A2FXXX_ENVM_SPARE_PAGES_SYSBOOT_KEY_VALUE
+             != sysboot_key )
+       return 0;
+
+    // Read the MSS CLGA0 frequency value. Address varies with system boot
+    // version
+    if ( sysboot_ver < CYGHWR_HAL_A2FXXX_SYSBOOT_VERSION(2, 0, 0) ) {
+       clkga0 = CYGHWR_HAL_A2FXXX_GET_SYSBOOT_1_3_FCLK();
+    }
+    else {
+       clkga0 = CYGHWR_HAL_A2FXXX_GET_SYSBOOT_2_0_FCLK();
+    }
+
+    // Compute the BUS and fabric clock frequency
+    hal_cortexm_systick_clock = clkga0;
+
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR, clk_cr);
+
+    hal_a2fxxx_pclk0     =
+          clkga0 >> CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_GET_PCLK0DIV( clk_cr );
+    hal_a2fxxx_pclk1     =
+          clkga0 >> CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_GET_PCLK1DIV( clk_cr );
+    hal_a2fxxx_pclk_fpga =
+          clkga0 >> CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_GET_GLBDIV( clk_cr );
+
+    return 1;
+}
+
+
+//==========================================================================
+// Chatter function
+
+static void
+hal_a2fxxx_clk_network_chatter( cyg_uint8 hal_clk_network_chatter )
+{
+    if ( hal_clk_network_chatter == 0 )
+        diag_printf("Actel System Boot Missing\n Clock network configuration failed!!\n");
+
+    A2FXXX_CLOCK_TRACE("Device clock network configuration:\n");
+    A2FXXX_CLOCK_TRACE("Global Clock A (Systick): %d [Hz]\n",
+                                                  hal_cortexm_systick_clock);
+    A2FXXX_CLOCK_TRACE("PCLK0: %d [Hz]\n", hal_a2fxxx_pclk0);
+    A2FXXX_CLOCK_TRACE("PCLK1: %d [Hz]\n", hal_a2fxxx_pclk1);
+}
+
+
+//==========================================================================
+// Setup device clock network
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
+
+static void
+hal_a2fxxx_set_clk_network( void )
+{
+    cyg_uint32 mss_ccc_mux;
+    cyg_uint32 mss_clk_cr;
+    cyg_uint8  ngmux;
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_PLL
+    cyg_bool   pll = false;
+#endif
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKA
+    cyg_bool  clka = false;
+#endif
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKC
+    cyg_bool  clkc = false;
+#endif
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA
+    cyg_bool  clkga = false;
+#endif
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC
+    cyg_bool  clkgc = false;
+#endif
+
+    // Find out which CLKGx is currently used as FLCK
+    ngmux = hal_a2fxxx_get_ngmux( );
+
+    //
+    // Start by configuring NGMUX. In the following case, if
+    // the current NGMUX output is already CLKGA, first move
+    // to CLKGC to keep a stable ground otherwise go ahead and
+    // configure CLKGA.
+    //
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_CLKGA
+    if( ngmux == CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLA )
+    {
+        // Setup CLKGC to use the On-Chip RC oscillator and move
+        // the MSS clock to CLKGC. No division factor is applied
+        // therefore FCLK = 100MHz
+
+        // CLKC = RCOSC
+        hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKx_SRC_RCOSC );
+
+        // CLKGC = CLKC
+        hal_a2fxxx_set_clkgx_default( CLKx_SRC_CLKGC );
+
+        // FCLK = CLKGC
+        hal_a2fxxx_set_ngmux( CLKx_SRC_CLKGC );
+    }
+    else {
+        HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                         CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+        mss_ccc_mux &= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(OXMUX_CLEAR);
+        mss_ccc_mux = mss_ccc_mux >> 19;
+
+        // Make sure PLL is bypassed.
+        if ( mss_ccc_mux != 1 ){
+            hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKx_SRC_RCOSC );
+            hal_a2fxxx_set_clkgx_default( CLKx_SRC_CLKGC );
+        }
+    }
+
+    // Now we can configure CLKGA as specified by the
+    // user. Check is PLL should be configured.
+    hal_a2fxxx_set_clkx( CLKx_SRC_CLKA, CLKA_SRC_SEL );
+
+# if defined(CYGHWR_HAL_CORTEXM_A2FXXX_PLL)
+    hal_a2fxxx_set_pll( );
+    pll = true;
+# endif
+
+    // Move to CLKGA
+    hal_a2fxxx_set_clkgx( CLKx_SRC_CLKGA );
+    clka = clkga = true;
+    hal_a2fxxx_set_ngmux( CLKx_SRC_CLKGA );
+
+#endif  // CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_CLKGA
+
+
+    //
+    // In the following case, NGMUX is configured to use CLKGC.
+    // This can be tricky as CLKGC can be routed from CLKGA...
+    //
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_CLKGC
+
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                           CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+    mss_ccc_mux &= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(OXMUX_CLEAR);
+    mss_ccc_mux = mss_ccc_mux >> 19;
+
+    // If CLKGC is not routed form CLKC or if CLKGC is not used
+    // as NGMUX output, proceed to configure CLKGC = CLKC
+    if( ((ngmux == CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLC) && (mss_ccc_mux != 1)) ||
+                (ngmux == CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLA) )
+    {
+
+        // Set CLKC source, use on-chip oscillator as default
+        // value
+# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_CLKC
+        hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKC_SRC_SEL );
+        clkc = true;
+# else
+        hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKx_SRC_RCOSC );
+# endif
+
+        // Set CLKGC = CLKC
+        hal_a2fxxx_set_clkgx_default( CLKx_SRC_CLKGC );
+
+        // Set NGMUX = CLKGC
+        hal_a2fxxx_set_ngmux( CLKx_SRC_CLKGC );
+
+        // Configure PLL input if in use
+# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_PLL
+        hal_a2fxxx_set_clkx( CLKx_SRC_CLKA, CLKA_SRC_SEL );
+        clka = true;
+# endif
+
+    }
+    else {
+
+        // Set CLKA source, use on-chip oscillator as default
+        // value
+# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKA
+        hal_a2fxxx_set_clkx( CLKx_SRC_CLKA, CLKA_SRC_SEL );
+        clka = true;
+# else
+        hal_a2fxxx_set_clkx( CLKx_SRC_CLKA, CLKx_SRC_RCOSC );
+# endif
+
+# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_SRC_CLKC
+        // CLKGA = CLKA
+        hal_a2fxxx_set_clkgx_default( CLKx_SRC_CLKGA );
+
+        // Move NGMUX = CLKGA
+        hal_a2fxxx_set_ngmux( CLKx_SRC_CLKGA );
+
+        // Now we can Configure CLKC
+        hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKC_SRC_SEL );
+# endif
+
+    }
+
+# ifdef CYGHWR_HAL_CORTEXM_A2FXXX_PLL
+    hal_a2fxxx_set_pll( );
+    pll = true;
+# endif
+
+    clkgc = true;
+    hal_a2fxxx_set_clkgx( CLKx_SRC_CLKGC );
+    hal_a2fxxx_set_ngmux( CLKx_SRC_CLKGC );
+
+#endif // CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_CLKGC
+
+
+    // Configure CLKA
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKA
+    if ( clka == false ){
+       hal_a2fxxx_set_clkx( CLKx_SRC_CLKA, CLKA_SRC_SEL );
+    }
+#endif
+
+    // Configure the PLL
+#if defined(CYGHWR_HAL_CORTEXM_A2FXXX_PLL)
+    if ( pll == false ){
+        hal_a2fxxx_set_pll( );
+    }
+#endif
+
+    // Configure CLKB
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKB
+    hal_a2fxxx_set_clkx( CLKx_SRC_CLKB, CLKB_SRC_SEL );
+#endif
+
+    // Configure CLKC
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKC
+    if ( clkc == false ){
+        hal_a2fxxx_set_clkx( CLKx_SRC_CLKC, CLKC_SRC_SEL );
+    }
+#endif
+
+    // Configure CLKGA
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA
+    if ( clkga == false ){
+        hal_a2fxxx_set_clkgx( CLKx_SRC_CLKA );
+    }
+#endif
+
+    // Configure CLKGB
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB
+    hal_a2fxxx_set_clkgx( CLKx_SRC_CLKB );
+#endif
+
+    // Configure CLKGC
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC
+    if ( clkgc == false ){
+        hal_a2fxxx_set_clkgx( CLKx_SRC_CLKC );
+    }
+#endif
+
+    // Now, configure all MSS clock dividers
+    //
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                           CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                           CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR, mss_clk_cr);
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_ACE_CLK
+    mss_clk_cr &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_ACLKDIV(DIV_CLEAR) );
+    mss_clk_cr |=  ( CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_ACLKDIV(ACLKDIV) );
+#endif
+
+    mss_clk_cr &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_PCLK1DIV(DIV_CLEAR) |
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_PCLK0DIV(DIV_CLEAR) );
+
+    mss_clk_cr |=  ( CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_PCLK1DIV(PCLK1DIV) |
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_PCLK0DIV(PCLK0DIV) );
+
+    // Record the different clock frequencies
+    hal_cortexm_systick_clock = CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ;
+    hal_a2fxxx_fclk  = CYGHWR_HAL_CORTEXM_A2FXXX_NGMUX_CLKOUT_FREQ;
+    hal_a2fxxx_pclk0 = CYGHWR_HAL_CORTEXM_A2FXXX_PCLK0_FREQ;
+    hal_a2fxxx_pclk1 = CYGHWR_HAL_CORTEXM_A2FXXX_PCLK1_FREQ;
+
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK
+    hal_a2fxxx_pclk_fpga = CYGHWR_HAL_CORTEXM_A2FXXX_FAB_CLK_FREQ;
+#endif
+
+    // Configure the MAC clock
+#if defined(CYGHWR_HAL_CORTEXM_A2FXXX_MAC_CLK) && \
+          defined(CYGHWR_HAL_CORTEXM_A2FXXX_MAC_SRC_CLKGC)
+
+    mss_clk_cr |= CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_RMIICLKSEL;
+
+#elif defined(CYGHWR_HAL_CORTEXM_A2FXXX_MAC_CLK) && \
+          defined(CYGHWR_HAL_CORTEXM_A2FXXX_MAC_SRC_EXTERNAL)
+
+    mss_clk_cr &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR_RMIICLKSEL;
+
+#endif
+
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_MSS_CLK_CR,
+                      mss_clk_cr);
+
+    // PLL is disable if not in used
+#if !defined(CYGHWR_HAL_CORTEXM_A2FXXX_PLL)
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR, 0x0);
+#endif
+}
+
+
+//==========================================================================
+// Get / Set NGMUX settings
+
+static cyg_uint8
+hal_a2fxxx_get_ngmux( void )
+{
+    cyg_uint32 mss_ccc_mux;
+    cyg_uint8  ngmux_setting;
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+
+    mss_ccc_mux = mss_ccc_mux >> 24;
+    switch( mss_ccc_mux & 0xf ){
+    case  0:
+    case  2:
+    case  4:
+    case  6:
+    case 12:
+        ngmux_setting = CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLA;
+        break;
+    case  1:
+    case  3:
+    case  8:
+    case 10:
+    case 13:
+        ngmux_setting = CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLC;
+        break;
+    case  5:
+    case  7:
+    case  9:
+    case 11:
+    case 14:
+        ngmux_setting = CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GLINT;
+        break;
+    default:
+        ngmux_setting = CYGHWR_HAL_A2FXXX_SC_MSS_CCC_GLMUX_GND;
+        break;
+    }
+
+    return ngmux_setting;
+}
+
+
+static void
+hal_a2fxxx_set_ngmux( cyg_uint8 x )
+{
+    cyg_uint32 mss_ccc_mux;
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+
+    // Clear bits
+    mss_ccc_mux &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXSEL(0x3) |
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXCFG(0x3) );
+
+    if( x == CLKx_SRC_CLKGA ){
+        mss_ccc_mux |= ( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXSEL(0) |
+                         CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXCFG(0) );
+    }
+    else if (x == CLKx_SRC_CLKGC ){
+        mss_ccc_mux |= ( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXSEL(1) |
+                         CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXCFG(0) );
+    }
+    else{
+        mss_ccc_mux |= ( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXSEL(2) |
+                         CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_GLMUXCFG(3) );
+    }
+
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+}
+
+
+//==========================================================================
+// Setup PLL
+
+#if defined(CYGHWR_HAL_CORTEXM_A2FXXX_PLL)
+static inline void
+hal_a2fxxx_set_pll( void )
+{
+    cyg_uint32 x =
+    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FINDIV((CYGHWR_HAL_CORTEXM_A2FXXX_PLL_DIV-1)) |
+    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FBDIV((CYGHWR_HAL_CORTEXM_A2FXXX_PLL_MULT-1)) |
+    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FBSEL(1) |
+    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_FBDLY(CYGHWR_HAL_CORTEXM_A2FXXX_PLL_FB_DELAY) |
+    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_VCOSEL0 |
+    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_VCOSEL2_1(PLL_RANGE) |
+    CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR_PLLEN;
+
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_MSS_CCC_PLL_CR, x);
+
+    // Wait PLL lock
+    do {
+        HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_MSS_CCC_SR, x);
+    } while( (x & CYGHWR_HAL_A2FXXX_SC_MSS_CCC_SR_PLL_LOCK_SYNC) == 0);
+}
+#endif
+
+
+//==========================================================================
+// Setup CLKA, CLKB or CLKC input clock
+
+static void
+hal_a2fxxx_set_clkx( cyg_uint8 x, cyg_uint8 src )
+{
+    cyg_uint32 mss_ccc_mux;
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+    if( x == CLKx_SRC_CLKA ){
+        mss_ccc_mux &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_DYNASEL |
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_RXASEL  |
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_STATASEL );
+        mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_CLKA_SEL (src);
+    }
+    else if (x == CLKx_SRC_CLKB ){
+        mss_ccc_mux &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_DYNBSEL |
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_RXBSEL  |
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_STATBSEL );
+        mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_CLKB_SEL (src);
+    }
+    else{
+        mss_ccc_mux &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_DYNCSEL |
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_RXCSEL  |
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_STATCSEL );
+        mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_CLKC_SEL (src);
+    }
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+}
+
+
+//==========================================================================
+// Setup CLKGA, CLKGB or CLKGC output clock
+
+static void
+hal_a2fxxx_set_clkgx( cyg_uint8 x )
+{
+    cyg_uint32 mss_ccc_mux;
+    cyg_uint32 mss_ccc_dly;
+    cyg_uint32 mss_ccc_div;
+    cyg_uint8  div10;
+    cyg_uint8  div;
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR, mss_ccc_dly);
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR, mss_ccc_div);
+
+    if( x == CLKx_SRC_CLKGA ){
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA
+        // Clear bits
+        mss_ccc_div &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIV(OXDIV_CLEAR) |
+                          CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIVHALF );
+        mss_ccc_dly &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA(DLYX_CLEAR);
+        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OAMUX(OXMUX_CLEAR);
+        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSA;
+        // Compute divider
+        div10 = CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DIV10;
+        div = (cyg_uint8) CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DIV;
+        if( div10 % 10 ){
+            div += 1;
+            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIVHALF;
+        }
+        else {
+           div -= 1;
+        }
+        // CLKA = CLGA, bypass MUX
+        if (div == 0 && CLKGA_SRC_SEL == 1) {
+            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSA;
+        }
+        else {
+            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OAMUX(CLKGA_SRC_SEL);
+            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIV(div);
+        }
+        mss_ccc_dly |=
+        CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGA_DELAY);
+#endif
+    }
+    if ( x == CLKx_SRC_CLKGB ){
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB
+        // Clear bits
+        mss_ccc_div &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIV(OXDIV_CLEAR) |
+                          CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIVHALF );
+        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OBMUX(OXMUX_CLEAR);
+        mss_ccc_dly &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYB(DLYX_CLEAR);
+        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSB;
+        // Compute divider
+        div10 = CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DIV10;
+        div = (cyg_uint8) CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DIV;
+        if( div10 % 10 ){
+            div += 1;
+            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIVHALF;
+        }
+        else {
+           div -= 1;
+        }
+        // CLKB = CLGB, bypass MUX
+        if (div == 0 && CLKGB_SRC_SEL == 1) {
+            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSB;
+        }
+        else {
+            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OBMUX(CLKGB_SRC_SEL);
+            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OBDIV(div);
+            mss_ccc_dly |=
+            CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYB(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGB_DELAY);
+        }
+#endif
+    }
+    if ( x == CLKx_SRC_CLKGC ){
+#ifdef CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC
+        // Clear bits
+        mss_ccc_div &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIV(OXDIV_CLEAR) |
+                          CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIVHALF );
+        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(OXMUX_CLEAR);
+        mss_ccc_dly &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYC(DLYX_CLEAR);
+        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSC;
+        // Compute divider
+        div10 = CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DIV10;
+        div = (cyg_uint8) CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DIV;
+        if( div10 % 10 ){
+            div += 1;
+            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIVHALF;
+        }
+        else {
+           div -= 1;
+        }
+        // CLKC = CLGC, bypass MUX
+        if (div == 0 && CLKGC_SRC_SEL == 1) {
+            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSC;
+        }
+        else {
+            mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(CLKGC_SRC_SEL);
+            mss_ccc_div |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIV(div);
+        }
+        mss_ccc_dly |=
+        CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYC(CYGHWR_HAL_CORTEXM_A2FXXX_CLKGC_DELAY);
+#endif
+    }
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR, mss_ccc_div);
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR, mss_ccc_dly);
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+}
+
+//==========================================================================
+// Setup CLKGA CLKGC output clock
+
+static void
+hal_a2fxxx_set_clkgx_default( cyg_uint8 x )
+{
+    cyg_uint32 mss_ccc_mux;
+    cyg_uint32 mss_ccc_dly;
+    cyg_uint32 mss_ccc_div;
+
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR, mss_ccc_dly);
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                     CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR, mss_ccc_div);
+
+    if( x == CLKx_SRC_CLKGA ){
+        // Clear bits
+        mss_ccc_div &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIV(OXDIV_CLEAR) |
+                          CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OADIVHALF );
+        mss_ccc_dly &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA(DLYX_CLEAR);
+        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OAMUX(OXMUX_CLEAR);
+        // CLKGA = CLKA, Division factor = 1 and minimum delay of 535ps
+        mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSA;
+        mss_ccc_dly |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYA(0);
+    }
+    if ( x == CLKx_SRC_CLKGC ){
+        // Clear bits
+        mss_ccc_div &= ~( CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIV(OXDIV_CLEAR) |
+                          CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR_OCDIVHALF );
+        mss_ccc_mux &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_OCMUX(OXMUX_CLEAR);
+        mss_ccc_dly &= ~CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYC(DLYX_CLEAR);
+        // CLKGC = CLKC, Division factor = 1 and minimum delay of 535ps
+        mss_ccc_mux |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR_BYPASSC;
+        mss_ccc_dly |= CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR_DLYC(0);
+    }
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DIV_CR, mss_ccc_div);
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_DLY_CR, mss_ccc_dly);
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                      CYGHWR_HAL_A2FXXX_SC_MSS_CCC_MUX_CR, mss_ccc_mux);
+}
+
+
+//==========================================================================
+// Adjust ENVM timing
+
+static void
+hal_a2fxxx_set_envm_timing( void ) {
+    cyg_uint32 x;
+    HAL_READ_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_ENVM_CR, x);
+    x &= ~CYGHWR_HAL_A2FXXX_SC_ENVM_CR_SIX_CYCLE;
+    if( hal_a2fxxx_fclk <= 80e6 ){
+        x |= CYGHWR_HAL_A2FXXX_SC_ENVM_CR_PIPE_BYPASS;
+    } else {
+        x &= ~CYGHWR_HAL_A2FXXX_SC_ENVM_CR_PIPE_BYPASS;
+    }
+    HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC + CYGHWR_HAL_A2FXXX_SC_ENVM_CR, x);
+}
+
+#endif // CYGHWR_HAL_CORTEXM_A2FXXX_CLOCK
+
+
+//==========================================================================
+// Reset modules
+
+__externC void
+hal_a2fxxx_periph_release( cyg_uint32 bit )
+{
+    cyg_uint32 sc, base = CYGHWR_HAL_A2FXXX_SC;
+    HAL_READ_UINT32( base + CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR, sc );
+    sc &= ~( bit );
+    HAL_WRITE_UINT32( base + CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR, sc );
+}
+
+
+__externC void
+hal_a2fxxx_periph_reset( cyg_uint32 bit )
+{
+    cyg_uint32 sc, base = CYGHWR_HAL_A2FXXX_SC;
+    HAL_READ_UINT32( base + CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR , sc );
+    sc |= ( bit );
+    HAL_WRITE_UINT32( base + CYGHWR_HAL_A2FXXX_SC_CLR_SOFTRST_CR , sc );
+}
+
+
+//==========================================================================
+// GPIO support
+//
+
+const default_io_mux_type default_io_mux[] = {
+   // SPI0
+   {0x00}, {0x0a}, {0x00}, {0x00},
+   // UART0
+   {0x18}, {0x00},
+   // I2C0
+   {0x00}, {0x00},
+   // SPI1
+   {0x00}, {0x0a}, {0x00}, {0x00},
+   // UART1
+   {0x18}, {0x00},
+   // I2C1
+   {0x00}, {0x00},
+   // MAC0
+   {0x18}, {0x18}, {0x0a}, {0x0a}, {0x18}, {0x0a}, {0x0a}, {0x00}, {0x18},
+   // GPIO
+   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
+   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
+   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
+   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
+   // SPI0 CS
+   {0x00}, {0x00}, {0x00},
+   // Unused
+   {0x00}, {0x00}, {0x00}, {0x00},
+   // UART0 misc
+   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
+   // SPI1 CS
+   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
+   // UART1 misc
+   {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00},
+   {0x0}
+};
+
+// These functions provide configuration and IO for GPIO pins.
+
+__externC void
+hal_a2fxxx_gpio_set( cyg_uint32 pin )
+{
+    cyg_uint32 bit  = CYGHWR_HAL_A2FXXX_GPIO_BIT( pin );
+    cyg_uint32 mode = CYGHWR_HAL_A2FXXX_GPIO_MODE( pin );
+    cyg_uint32 mux  = CYGHWR_HAL_A2FXXX_GPIO_IOMUX_IDX( pin );
+    cyg_uint32 irq  = CYGHWR_HAL_A2FXXX_GPIO_IRQ( pin );
+    cyg_uint32 reg    = 0;
+    cyg_uint32 io_mux = 0;
+
+    if (pin == CYGHWR_HAL_A2FXXX_GPIO_NONE)
+        return;
+
+    if(mode == CYGHWR_HAL_A2FXXX_GPIO_MODE_PERIPH){
+       // Set IOMUX default value for peripheral use
+       io_mux = default_io_mux[mux].val;
+       HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                         CYGHWR_HAL_A2FXXX_SC_IOMUX( mux ), io_mux );
+    } else {
+       // Set GPIO input/ output mode
+       if (mode == CYGHWR_HAL_A2FXXX_GPIO_MODE_OUT) {
+           reg = CYGHWR_HAL_A2FXXX_GPIO_CFG_GPOUTEN |
+                 CYGHWR_HAL_A2FXXX_GPIO_CFG_OUTBUFEN;
+       }
+
+       // Configure IO as interrupt
+       if (irq != CYGHWR_HAL_A2FXXX_GPIO_IRQ_DISABLE) {
+           reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_GPINTEN;
+           if(irq & CYGHWR_HAL_A2FXXX_GPIO_IRQ_FALLING_EDGE)
+              reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(0);
+           else if(irq & CYGHWR_HAL_A2FXXX_GPIO_IRQ_RISING_EDGE)
+              reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(1);
+           else if(irq & CYGHWR_HAL_A2FXXX_GPIO_IRQ_BOTH_EDGES)
+              reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(2);
+           else if(irq & CYGHWR_HAL_A2FXXX_GPIO_IRQ_LOW_LEVEL)
+              reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(3);
+           else
+              reg |= CYGHWR_HAL_A2FXXX_GPIO_CFG_INTYPE(4);
+       }
+
+       // Write down result
+       HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_MSS_GPIO +
+                       ( CYGHWR_HAL_A2FXXX_MSS_GPIO_CFG( bit ) ), reg );
+
+       // For GPIO 16 to 31, we must setup the IOMUX
+       // TODO, this is for output only?
+       if( bit > 15 ){
+          bit = bit - 16;
+          io_mux = 0x35;
+          HAL_WRITE_UINT32( CYGHWR_HAL_A2FXXX_SC +
+                            CYGHWR_HAL_A2FXXX_SC_IOMUX( bit ), io_mux );
+       }
+
+    }
+}
+
+
+__externC void
+hal_a2fxxx_gpio_out( cyg_uint32 pin, int val )
+{
+    cyg_uint32 bit = ( CYGHWR_HAL_A2FXXX_GPIO_BIT(pin) << 2 );
+    cyg_uint32 port =  CYGHWR_HAL_A2FXXX_MSS_GPIO_BB +
+                     ( CYGHWR_HAL_A2FXXX_MSS_GPIO_DOUT << 5 );
+
+    port += bit;
+
+    HAL_WRITE_UINT32( port, val );
+}
+
+
+__externC void
+hal_a2fxxx_gpio_in ( cyg_uint32 pin, int *val )
+{
+    cyg_uint32 bit = ( CYGHWR_HAL_A2FXXX_GPIO_BIT(pin) << 2 );
+    cyg_uint32 port =  CYGHWR_HAL_A2FXXX_MSS_GPIO_BB +
+                     ( CYGHWR_HAL_A2FXXX_MSS_GPIO_DIN << 5 );
+    cyg_uint32 pd;
+
+    port += bit;
+
+    HAL_READ_UINT32( port, pd );
+    *val = 1 ? (bit & pd) : 0;
+}
+
+
+//==========================================================================
+// I2C clock rate
+//
+__externC cyg_uint32
+hal_a2fxxx_i2c_clock( cyg_uint32 base )
+{
+    return ( (base == CYGHWR_HAL_A2FXXX_I2C0) ? hal_a2fxxx_pclk0 : hal_a2fxxx_pclk1 );
+}
+
+
+//==========================================================================
+// SPI clock rate
+//
+__externC cyg_uint32
+hal_a2fxxx_spi_clock( cyg_uint32 base )
+{
+    return ( (base == CYGHWR_HAL_A2FXXX_SPI0) ? hal_a2fxxx_pclk0 : hal_a2fxxx_pclk1 );
+}
+
+
+//==========================================================================
+// UART baud rate
+//
+// Set the baud rate divider of a UART based on the requested rate and
+// the current APB clock settings.
+
+__externC void
+hal_a2fxxx_uart_setbaud(cyg_uint32 base, cyg_uint32 baud)
+{
+    cyg_uint16 divider =
+         CYG_HAL_CORTEXM_A2FXXX_BAUD_GENERATOR( ((base == CYGHWR_HAL_A2FXXX_UART0)? 0 : 1) , baud );
+
+    HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_LCR,
+                                  CYGHWR_HAL_A2FXXX_UART16550_LCR_DLAB);
+    HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_DMR, divider >> 8);
+    HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_DLR, divider & 0xFF);
+}
+
+
+//==========================================================================
+// Idle thread
+//
+#ifdef CYGSEM_HAL_CORTEXM_A2FXXX_DEFINES_IDLE_THREAD_ACTION
+__externC void
+hal_idle_thread_action( cyg_uint32 count )
+{
+    while(1);
+}
+#endif
+
+//==========================================================================
+// EOF a2fxxx_misc.c
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/src/hal_diag.c
@@ -0,0 +1,399 @@
+/*=============================================================================
+//
+//      hal_diag.c
+//
+//      HAL diagnostic output code
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2008, 2011
+// Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos 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 General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   ccoutand
+// Original:    nickg (STM32 HAL)
+// Date:        2011-04-03
+// Purpose:     HAL diagnostic output
+// Description: Implementations of HAL diagnostic output support.
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================*/
+
+#include <pkgconf/hal.h>
+#include CYGBLD_HAL_PLATFORM_H
+
+#include <cyg/infra/cyg_type.h>         // base types
+#include <cyg/infra/cyg_trac.h>         // tracing
+
+#include <cyg/hal/hal_arch.h>           // SAVE/RESTORE GP macros
+#include <cyg/hal/hal_io.h>             // IO macros
+#include <cyg/hal/hal_if.h>             // interface API
+#include <cyg/hal/hal_intr.h>           // HAL_ENABLE/MASK/UNMASK_INTERRUPTS
+#include <cyg/hal/hal_misc.h>           // Helper functions
+#include <cyg/hal/drv_api.h>            // CYG_ISR_HANDLED
+
+#include <cyg/hal/var_io.h>             // USART registers
+
+//-----------------------------------------------------------------------------
+
+typedef struct {
+    cyg_uint32          uart;
+    CYG_ADDRESS         base;
+    cyg_int32           msec_timeout;
+    int                 isr_vector;
+    cyg_uint32          rxpin;
+    cyg_uint32          txpin;
+    cyg_uint32          baud_rate;
+    int                 irq_state;
+
+} channel_data_t;
+
+
+static channel_data_t a2fxxx_ser_channels[] = {
+#if CYGINT_HAL_A2FXXX_UART0>0
+    { 0,
+      CYGHWR_HAL_A2FXXX_UART0,
+      1000,
+      CYGNUM_HAL_INTERRUPT_UART0,
+      CYGHWR_HAL_A2FXXX_UART0_RX,
+      CYGHWR_HAL_A2FXXX_UART0_TX,
+      CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD},
+#endif
+#if CYGINT_HAL_A2FXXX_UART1>0
+    { 1,
+      CYGHWR_HAL_A2FXXX_UART1,
+      1000,
+      CYGNUM_HAL_INTERRUPT_UART1,
+      CYGHWR_HAL_A2FXXX_UART1_RX,
+      CYGHWR_HAL_A2FXXX_UART1_TX,
+      CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD},
+#endif
+};
+
+//-----------------------------------------------------------------------------
+
+static void
+hal_a2fxxx_serial_init_channel(void* __ch_data)
+{
+    channel_data_t *chan = (channel_data_t*)__ch_data;
+    CYG_ADDRESS base = chan->base;
+    cyg_uint32 lcr = CYGHWR_HAL_A2FXXX_UART16550_LCR_WLS_8BITS |
+                     CYGHWR_HAL_A2FXXX_UART16550_LCR_STOP_1;
+
+    // Enable the PIO lines for the serial channel
+    CYGHWR_HAL_A2FXXX_GPIO_SET( chan->rxpin );
+    CYGHWR_HAL_A2FXXX_GPIO_SET( chan->txpin );
+
+    // Set baud rate
+    hal_a2fxxx_uart_setbaud( base, chan->baud_rate );
+
+    // 8-1-no parity
+    HAL_WRITE_UINT32( base + CYGHWR_HAL_A2FXXX_UART16550_LCR, lcr );
+
+    // Reset and clear TX/RX FIFO
+    HAL_WRITE_UINT32( base + CYGHWR_HAL_A2FXXX_UART16550_FCR,
+                     CYGHWR_HAL_A2FXXX_UART16550_FCR_CLEAR_TX_FIFO |
+                     CYGHWR_HAL_A2FXXX_UART16550_FCR_CLEAR_RX_FIFO );
+
+}
+
+void
+hal_a2fxxx_serial_putc(void *__ch_data, char c)
+{
+    CYG_ADDRESS base = ((channel_data_t*)__ch_data)->base;
+    cyg_uint32 lsr;
+    CYGARC_HAL_SAVE_GP();
+
+     do
+     {
+         HAL_READ_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_LSR, lsr );
+     } while ((lsr & CYGHWR_HAL_A2FXXX_UART16550_LSR_THRE) == 0);
+
+     HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_THR, c );
+
+    CYGARC_HAL_RESTORE_GP();
+}
+
+static cyg_bool
+hal_a2fxxx_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch)
+{
+    CYG_ADDRESS base = ((channel_data_t*)__ch_data)->base;
+    cyg_uint32 lsr;
+    cyg_uint32 c;
+    CYGARC_HAL_SAVE_GP();
+
+    HAL_READ_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_LSR, lsr );
+
+    if( (lsr & CYGHWR_HAL_A2FXXX_UART16550_LSR_DR) == 0 )
+        return false;
+
+    HAL_READ_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_RBR, c );
+
+    *ch = (cyg_uint8)c;
+
+    CYGARC_HAL_RESTORE_GP();
+
+    return true;
+}
+
+cyg_uint8
+hal_a2fxxx_serial_getc(void* __ch_data)
+{
+    cyg_uint8 ch;
+    CYGARC_HAL_SAVE_GP();
+
+    while(!hal_a2fxxx_serial_getc_nonblock(__ch_data, &ch));
+
+    CYGARC_HAL_RESTORE_GP();
+    return ch;
+}
+
+//=============================================================================
+// Virtual vector HAL diagnostics
+
+#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG)
+
+static void
+hal_a2fxxx_serial_write(void* __ch_data, const cyg_uint8* __buf,
+                         cyg_uint32 __len)
+{
+    CYGARC_HAL_SAVE_GP();
+
+    while(__len-- > 0)
+        hal_a2fxxx_serial_putc(__ch_data, *__buf++);
+
+    CYGARC_HAL_RESTORE_GP();
+}
+
+static void
+hal_a2fxxx_serial_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len)
+{
+    CYGARC_HAL_SAVE_GP();
+
+    while(__len-- > 0)
+        *__buf++ = hal_a2fxxx_serial_getc(__ch_data);
+
+    CYGARC_HAL_RESTORE_GP();
+}
+
+cyg_bool
+hal_a2fxxx_serial_getc_timeout(void* __ch_data, cyg_uint8* ch)
+{
+    int delay_count;
+    channel_data_t* chan = (channel_data_t*)__ch_data;
+    cyg_bool res;
+    CYGARC_HAL_SAVE_GP();
+
+    delay_count = chan->msec_timeout * 100; // delay in 10 us steps
+
+    for(;;) {
+        res = hal_a2fxxx_serial_getc_nonblock(__ch_data, ch);
+        if (res || 0 == delay_count--)
+            break;
+
+        CYGACC_CALL_IF_DELAY_US(10);
+    }
+
+    CYGARC_HAL_RESTORE_GP();
+    return res;
+}
+
+static int
+hal_a2fxxx_serial_control(void *__ch_data, __comm_control_cmd_t __func, ...)
+{
+    channel_data_t* chan = (channel_data_t*)__ch_data;
+    CYG_ADDRESS base = ((channel_data_t*)__ch_data)->base;
+    int ret = 0;
+    cyg_uint32 ier;
+
+    va_list ap;
+
+    CYGARC_HAL_SAVE_GP();
+
+    va_start(ap, __func);
+
+    switch (__func) {
+    case __COMMCTL_IRQ_ENABLE:
+        chan->irq_state = 1;
+        HAL_INTERRUPT_ACKNOWLEDGE( chan->isr_vector );
+        HAL_INTERRUPT_UNMASK( chan->isr_vector );
+        HAL_READ_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_IER, ier );
+        ier |= CYGHWR_HAL_A2FXXX_UART16550_IER_ERBFI;
+        HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_IER, ier );
+        break;
+    case __COMMCTL_IRQ_DISABLE:
+        ret = chan->irq_state;
+        chan->irq_state = 0;
+        HAL_INTERRUPT_MASK( chan->isr_vector );
+        HAL_READ_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_IER, ier );
+        ier &= ~CYGHWR_HAL_A2FXXX_UART16550_IER_ERBFI;
+        HAL_WRITE_UINT32(base + CYGHWR_HAL_A2FXXX_UART16550_IER, ier );
+        break;
+    case __COMMCTL_DBG_ISR_VECTOR:
+        ret = chan->isr_vector;
+        break;
+    case __COMMCTL_SET_TIMEOUT:
+    {
+        va_list ap;
+
+        va_start(ap, __func);
+
+        ret = chan->msec_timeout;
+        chan->msec_timeout = va_arg(ap, cyg_uint32);
+
+        va_end(ap);
+    }
+    case __COMMCTL_GETBAUD:
+        ret = chan->baud_rate;
+        break;
+    case __COMMCTL_SETBAUD:
+        chan->baud_rate = va_arg(ap, cyg_int32);
+        // Should we verify this value here?
+        hal_a2fxxx_uart_setbaud( base, chan->baud_rate );
+        ret = 0;
+        break;
+    default:
+        break;
+    }
+    va_end(ap);
+    CYGARC_HAL_RESTORE_GP();
+    return ret;
+}
+
+static int
+hal_a2fxxx_serial_isr(void *__ch_data, int* __ctrlc,
+                       CYG_ADDRWORD __vector, CYG_ADDRWORD __data)
+{
+    channel_data_t* chan = (channel_data_t*)__ch_data;
+    cyg_uint8 ch;
+
+    CYGARC_HAL_SAVE_GP();
+
+     *__ctrlc = 0;
+
+     if( hal_a2fxxx_serial_getc_nonblock(__ch_data, &ch) )
+     {
+         if( cyg_hal_is_break( (char *)&ch , 1 ) )
+             *__ctrlc = 1;
+     }
+
+    HAL_INTERRUPT_ACKNOWLEDGE(chan->isr_vector);
+
+    CYGARC_HAL_RESTORE_GP();
+    return 1;
+}
+
+static void
+hal_a2fxxx_serial_init(void)
+{
+    hal_virtual_comm_table_t* comm;
+    int cur;
+    int i;
+
+    cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);
+
+    for( i = 0; i < CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS ; i++ )
+    {
+        hal_a2fxxx_serial_init_channel(&a2fxxx_ser_channels[i]);
+
+        CYGACC_CALL_IF_SET_CONSOLE_COMM(i);
+        comm = CYGACC_CALL_IF_CONSOLE_PROCS();
+        CYGACC_COMM_IF_CH_DATA_SET(*comm, &a2fxxx_ser_channels[i]);
+        CYGACC_COMM_IF_WRITE_SET(*comm, hal_a2fxxx_serial_write);
+        CYGACC_COMM_IF_READ_SET(*comm, hal_a2fxxx_serial_read);
+        CYGACC_COMM_IF_PUTC_SET(*comm, hal_a2fxxx_serial_putc);
+        CYGACC_COMM_IF_GETC_SET(*comm, hal_a2fxxx_serial_getc);
+        CYGACC_COMM_IF_CONTROL_SET(*comm, hal_a2fxxx_serial_control);
+        CYGACC_COMM_IF_DBG_ISR_SET(*comm, hal_a2fxxx_serial_isr);
+        CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, hal_a2fxxx_serial_getc_timeout);
+    }
+
+    // Restore original console
+    CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);
+
+    // set debug channel baud rate if different
+#if (CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD != CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_BAUD)
+    a2fxxx_ser_channels[CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL]->baud_rate =
+        CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_BAUD;
+    update_baud_rate( &a2fxxx_ser_channels[CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL] );
+#endif
+
+}
+
+void
+cyg_hal_plf_comms_init(void)
+{
+    static int initialized = 0;
+
+    if (initialized)
+        return;
+
+    initialized = 1;
+
+    hal_a2fxxx_serial_init();
+}
+
+#endif
+
+//=============================================================================
+// Non-Virtual vector HAL diagnostics
+
+#if !defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG)
+
+void
+hal_a2fxxx_diag_init(void)
+{
+    hal_a2fxxx_serial_init(
+            &a2fxxx_ser_channels[CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL] );
+}
+
+void
+hal_a2fxxx_diag_putc(char c)
+{
+    hal_a2fxxx_serial_putc(
+            &a2fxxx_ser_channels[CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL], c);
+}
+
+cyg_uint8
+hal_a2fxxx_diag_getc(void)
+{
+    return hal_a2fxxx_serial_getc(
+            &a2fxxx_ser_channels[CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL] );
+}
+
+
+#endif
+
+//-----------------------------------------------------------------------------
+// End of hal_diag.c
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/src/hal_dma.c
@@ -0,0 +1,425 @@
+/*==========================================================================
+//
+//      hal_dma.c
+//
+//      Cortex-M Actel A2F DMA channels configuration
+//
+//==========================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later
+// version.
+//
+// eCos 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 General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with eCos; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//
+// As a special exception, if other files instantiate templates or use
+// macros or inline functions from this file, or you compile this file
+// and link it with other works to produce a work based on this file,
+// this file does not by itself cause the resulting work to be covered by
+// the GNU General Public License. However the source code for this file
+// must still be made available in accordance with section (3) of the GNU
+// General Public License v2.
+//
+// This exception does not invalidate any other reasons why a work based
+// on this file might be covered by the GNU General Public License.
+// -------------------------------------------
+// ####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    ccoutand
+// Contributors:
+// Date:         2011-02-03
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+#include <pkgconf/hal.h>
+#include <pkgconf/hal_cortexm.h>
+#include <pkgconf/hal_cortexm_a2fxxx.h>
+#ifdef CYGPKG_KERNEL
+#include <pkgconf/kernel.h>
+#endif
+
+#include <cyg/infra/diag.h>
+#include <cyg/infra/cyg_type.h>
+#include <cyg/infra/cyg_trac.h>         // tracing macros
+#include <cyg/infra/cyg_ass.h>          // assertion macros
+
+#include <cyg/hal/hal_arch.h>           // HAL header
+#include <cyg/hal/hal_intr.h>           // HAL header
+#include <cyg/hal/hal_if.h>             // HAL header
+#include <cyg/hal/drv_api.h>
+
+#ifdef CYGDBG_HAL_CORTEXM_A2FXXX_DMA_TRACE
+# define DMA_TRACE(args...) diag_printf(args)
+#else
+# define DMA_TRACE(args...)
+#endif
+
+//-----------------------------------------------------------------------------
+// DMA channel ISR/DSR handling
+
+typedef struct a2fxxx_dma_ch {
+    cyg_ISR_t*      isr;
+    cyg_DSR_t*      dsr;
+    cyg_addrword_t  data;
+} a2fxxx_dma_ch;
+
+typedef struct a2fxxx_dma_info {
+    cyg_uint32      init;
+    cyg_uint32      base;
+    cyg_handle_t    interrupt_handle;
+    cyg_interrupt   interrupt_data;
+    a2fxxx_dma_ch   ch[CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL];
+    cyg_uint32      dma_cr[CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL];
+    cyg_uint32      dma_sr;
+} a2fxxx_dma_info;
+
+static a2fxxx_dma_info a2fxxx_dma = {
+    .base = CYGHWR_HAL_A2FXXX_DMA,
+    .init =0,
+};
+
+
+//-----------------------------------------------------------------------------
+// DMA ISR handler
+
+static cyg_uint32
+a2fxxx_dma_isr (cyg_vector_t vector, cyg_addrword_t data)
+{
+    a2fxxx_dma_info *dma = (a2fxxx_dma_info *) data;
+    cyg_uint32 res = 0, sr = 0;
+    cyg_uint8 i = 0, j = 0;
+
+    HAL_READ_UINT32(dma->base + CYGHWR_HAL_A2FXXX_DMA_BUFFER_STATUS, sr);
+    dma->dma_sr |= sr;
+
+    DMA_TRACE("DMA interrupt, sr 0x%x\n", dma->dma_sr);
+
+    while(i < 16){
+        if( sr & 0x1 ){
+            j = i >> 1;
+            if(dma->ch[j].isr != NULL){
+                res = dma->ch[j].isr(i, dma->ch[j].data);
+            }
+        }
+        sr = sr >> 1; i++;
+    }
+    cyg_drv_interrupt_acknowledge (CYGNUM_HAL_INTERRUPT_DMA);
+    cyg_drv_interrupt_mask (CYGNUM_HAL_INTERRUPT_DMA);
+    return (CYG_ISR_CALL_DSR | CYG_ISR_HANDLED);
+}
+
+
+//-----------------------------------------------------------------------------
+// DMA DSR handler
+
+static void
+a2fxxx_dma_dsr (cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
+{
+    a2fxxx_dma_info *dma = (a2fxxx_dma_info *) data;
+    cyg_uint8 i = 0, j = 0;
+    cyg_uint32 sr;
+
+    cyg_drv_isr_lock ();
+    sr = dma->dma_sr;
+    dma->dma_sr = 0;
+    cyg_drv_isr_unlock ();
+
+    while(i < 16){
+        if( sr & 0x1 ){
+            j = i >> 1;
+            if(dma->ch[j].dsr != NULL){
+                dma->ch[j].dsr(i, 0, dma->ch[j].data);
+            }
+        }
+        sr = sr >> 1; i++;
+    }
+
+    cyg_drv_interrupt_unmask (CYGNUM_HAL_INTERRUPT_DMA);
+}
+
+
+//-----------------------------------------------------------------------------
+// DMA Initialization
+
+void
+hal_dma_init( void )
+{
+    cyg_uint8 i = 0;
+
+    // Avoid multiple initialization
+    if(a2fxxx_dma.init)
+        return;
+
+    a2fxxx_dma.init = 1;
+
+    // Reset DMA
+    CYGHWR_HAL_A2FXXX_PERIPH_RESET( CYGHWR_HAL_A2FXXX_PERIPH_SOFTRST(PDMA) );
+
+    // Clear channel ISR / DSR
+    while( i < CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL ) {
+        a2fxxx_dma.ch[i].isr    = NULL;
+        a2fxxx_dma.ch[i].dsr    = NULL;
+        a2fxxx_dma.dma_cr[i]    = 0;
+        a2fxxx_dma.ch[i++].data = 0;
+    }
+    a2fxxx_dma.dma_sr = 0;
+
+    // Register DMA interrupt
+    cyg_drv_interrupt_create(CYGNUM_HAL_INTERRUPT_DMA,
+                           CYGNUM_HAL_CORTEXM_A2FXXX_DMA_ISR_PRIORITY,
+                           (cyg_addrword_t)&a2fxxx_dma,
+                           &a2fxxx_dma_isr,
+                           &a2fxxx_dma_dsr,
+                           &(a2fxxx_dma.interrupt_handle),
+                           &(a2fxxx_dma.interrupt_data));
+    cyg_drv_interrupt_attach(a2fxxx_dma.interrupt_handle);
+    cyg_drv_interrupt_acknowledge (CYGNUM_HAL_INTERRUPT_DMA);
+    cyg_drv_interrupt_unmask (CYGNUM_HAL_INTERRUPT_DMA);
+
+    // Release DMA
+    CYGHWR_HAL_A2FXXX_PERIPH_RELEASE( CYGHWR_HAL_A2FXXX_PERIPH_SOFTRST(PDMA) );
+
+    // HW initialization
+    i=0;
+    while( i < CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL ) {
+        HAL_WRITE_UINT32(a2fxxx_dma.base + CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL(i++),
+                         CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_RESET);
+    }
+}
+
+
+//-----------------------------------------------------------------------------
+// Register the DMA sub-channel ISR / DSR
+
+__externC cyg_uint32
+a2fxxx_dma_ch_attach(cyg_uint8 ch, cyg_ISR_t *isr, cyg_DSR_t *dsr,
+                     cyg_addrword_t data)
+{
+    cyg_uint32 res = 1;
+
+    CYG_ASSERT (ch < CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL,
+                         "DMA : Channel number out of range (Attach).");
+
+#ifdef CYGPKG_KERNEL
+    cyg_interrupt_disable();
+#endif
+    if( a2fxxx_dma.ch[ch].isr != NULL ||
+        a2fxxx_dma.ch[ch].dsr != NULL || a2fxxx_dma.ch[ch].data != 0 ) {
+        res = 0;
+    } else {
+        a2fxxx_dma.ch[ch].isr  = isr;
+        a2fxxx_dma.ch[ch].dsr  = dsr;
+        a2fxxx_dma.ch[ch].data = data;
+    }
+#ifdef CYGPKG_KERNEL
+    cyg_interrupt_enable();
+#endif
+
+    return res;
+}
+
+
+//-----------------------------------------------------------------------------
+// Update DMA source / destination address increment
+
+__externC void
+a2fxxx_dma_update_incr(cyg_uint8 ch, cyg_bool dst, cyg_uint8 incr)
+{
+    CYG_ASSERT (ch < CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL,
+                          "DMA : Channel number out of range (Update).");
+
+    if(dst==false){
+        // Clear bits
+        a2fxxx_dma.dma_cr[ch] &= ~CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_SRC_INCR_4B;
+        a2fxxx_dma.dma_cr[ch] |= CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_SRC_INCR(incr);
+    }
+    else {
+        // Clear bits
+        a2fxxx_dma.dma_cr[ch] &= ~CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_DST_INCR_4B;
+        a2fxxx_dma.dma_cr[ch] |= CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_DST_INCR(incr);
+    }
+}
+
+
+//-----------------------------------------------------------------------------
+// Setup DMA channel
+//
+// channel      select the DMA channel ID.
+// type         select the transfer type to be performed. For valid
+//              values, check CYGHWR_HAL_A2FXXX_DMA_XFER(_x) in var_io.h.
+// outbound     set to true for transfer out of memory, false for transfer to
+//              memory
+// src_incr     select the memory address increment step for the source. Valid
+//              values are 0, 1, 2 and 4 byte(s). 0 can be used for DMA
+//              transfer from peripheral FIFO for instance.
+// dst_incr     select the memory address increment step for the destination.
+//              Valid values are 0, 1, 2 and 4 byte(s). 0 can be used for DMA
+//              transfer to peripheral FIFO for instance.
+// pri          select the DMA channel priority (true = high , false = low)
+// wr_adj       indicates the number of FCLK periods which the PDMA must wait
+//              after completion of a read or write access to a peripheral before
+//              evaluating the out-of-band status signals from that peripheral
+//              for another transfer
+
+__externC cyg_uint32
+a2fxxx_dma_ch_setup(cyg_uint8 ch, cyg_uint8 type, cyg_bool outbound,
+      cyg_uint8 src_incr, cyg_uint8 dst_incr, cyg_bool pri, cyg_uint8 wr_adj)
+{
+    cyg_uint32 res = 1;
+    cyg_uint32 xfer_type = 0, xfer_dir = 0, xfer_incr =
+                                    CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_XFER_BYTE;
+    a2fxxx_dma.dma_cr[ch] = 0;
+
+    CYG_ASSERT (ch < CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL,
+                               "DMA : Channel number out of range (Setup).");
+
+    DMA_TRACE("DMA setup channel %d, direction: %s, type %x, step %d-%d byte(s)\n", ch ,
+             ((outbound==true) ? "outbound" : "inbound"), type, src_incr, dst_incr );
+
+    if( type != CYGHWR_HAL_A2FXXX_DMA_XFER_MEMORY ){
+        xfer_type = CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_PERIPH_SEL(type) |
+                CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_PERIPH;
+    }
+
+    if( outbound == true ){
+        xfer_dir = CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_DIR;
+    }
+
+    a2fxxx_dma_update_incr(ch, true, dst_incr);
+    a2fxxx_dma_update_incr(ch, false, src_incr);
+
+    a2fxxx_dma.dma_cr[ch] |= ( xfer_type | xfer_dir |
+          ((pri == true) ? CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_CLR_HI_PRI : 0) |
+          CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_CLR_COMPA |
+          CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_CLR_COMPB |
+          CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_WR_ADJ(wr_adj) |
+          xfer_incr);
+
+    HAL_WRITE_UINT32(a2fxxx_dma.base + CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL(ch),
+                                    a2fxxx_dma.dma_cr[ch]);
+
+    return res;
+}
+
+
+//-----------------------------------------------------------------------------
+// Remove DMA channel handler
+
+__externC void
+a2fxxx_dma_ch_detach (cyg_uint8 ch)
+{
+    CYG_ASSERT (ch < CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL,
+                              "DMA : Channel number out of range (Detach).");
+
+#ifdef CYGPKG_KERNEL
+    cyg_interrupt_disable();
+#endif
+    a2fxxx_dma.ch[ch].isr  = NULL;
+    a2fxxx_dma.ch[ch].dsr  = NULL;
+    a2fxxx_dma.ch[ch].data = 0;
+#ifdef CYGPKG_KERNEL
+    cyg_interrupt_enable();
+#endif
+}
+
+
+//-----------------------------------------------------------------------------
+// Start DMA transfer
+
+__externC cyg_uint32
+a2fxxx_dma_xfer (cyg_uint8 ch, cyg_bool polled, cyg_uint32 len, cyg_uint8 *src,
+                     cyg_uint8 *dst)
+{
+    cyg_uint32 res = 1;
+    cyg_uint32 src_reg, dst_reg, cnt_reg;
+    cyg_uint32 sub = 0;
+    cyg_haladdress dma_src = (cyg_haladdress) src;
+    cyg_haladdress dma_dst = (cyg_haladdress) dst;
+
+    CYG_ASSERT (ch < CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL,
+                           "DMA : Channel number out of range (Transfer).");
+
+    if( polled == true )
+        a2fxxx_dma.dma_cr[ch] &= ~CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_INTEN;
+    else
+        a2fxxx_dma.dma_cr[ch] |= CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_INTEN;
+
+    HAL_WRITE_UINT32(a2fxxx_dma.base + CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL(ch),
+                                 a2fxxx_dma.dma_cr[ch]);
+
+    HAL_READ_UINT32(a2fxxx_dma.base + CYGHWR_HAL_A2FXXX_DMA_CHx_STATUS(ch), sub);
+    sub = CYGHWR_HAL_A2FXXX_DMA_GET_SUB_ID( sub );
+
+    src_reg = ((sub == 0) ? CYGHWR_HAL_A2FXXX_DMA_CHx_BA_SRC(ch) :
+                            CYGHWR_HAL_A2FXXX_DMA_CHx_BB_SRC(ch));
+    dst_reg = ((sub == 0) ? CYGHWR_HAL_A2FXXX_DMA_CHx_BA_DST(ch) :
+                            CYGHWR_HAL_A2FXXX_DMA_CHx_BB_DST(ch));
+    cnt_reg = ((sub == 0) ? CYGHWR_HAL_A2FXXX_DMA_CHx_BA_COUNT(ch) :
+                            CYGHWR_HAL_A2FXXX_DMA_CHx_BB_COUNT(ch));
+
+    DMA_TRACE("DMA transfer of length %d on channel %d(%s) - SRC: 0x%x / DST: 0x%x\n",
+                          len, ch, ((sub==0) ? "A" : "B"), dma_src, dma_dst);
+    DMA_TRACE("DMA register address 0x%x / 0x%x\n", src_reg , dst_reg);
+
+    HAL_WRITE_UINT32(a2fxxx_dma.base + src_reg, dma_src);
+    HAL_WRITE_UINT32(a2fxxx_dma.base + dst_reg, dma_dst);
+    HAL_WRITE_UINT32(a2fxxx_dma.base + cnt_reg, len);
+
+    return res;
+}
+
+
+//-----------------------------------------------------------------------------
+// Clear DMA interrupt
+
+void a2fxxx_dma_clear_interrupt (cyg_uint8 ch)
+{
+    cyg_uint32 reg;
+
+    CYG_ASSERT (ch < CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL,
+                           "DMA : Channel number out of range (Clear IRQ).");
+
+    DMA_TRACE("DMA status register 0x%x\n",
+                     (a2fxxx_dma.base + CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL(ch)));
+
+    HAL_READ_UINT32(a2fxxx_dma.base + CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL(ch), reg);
+    reg |= (CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_CLR_COMPA |
+            CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL_CLR_COMPB);
+    HAL_WRITE_UINT32(a2fxxx_dma.base + CYGHWR_HAL_A2FXXX_DMA_CHx_CTRL(ch), reg);
+}
+
+
+//-----------------------------------------------------------------------------
+// Clear DMA interrupt
+
+cyg_uint8 a2fxxx_dma_get_comp_flag (cyg_uint8 ch)
+{
+    cyg_uint32 reg;
+
+    CYG_ASSERT (ch < CYGHWR_HAL_A2FXXX_DMA_MAX_CHANNEL,
+                                  "DMA : Channel number out of range (Get).");
+
+    HAL_READ_UINT32(a2fxxx_dma.base + CYGHWR_HAL_A2FXXX_DMA_CHx_STATUS(ch), reg);
+
+    return (reg&0x3);
+}
+
+//-----------------------------------------------------------------------------
+// End of hal_dma.c
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/a2fxxx/var/current/tests/timers.c
@@ -0,0 +1,336 @@
+/*=============================================================================
+//
+//      timers.c
+//
+//      Test for Cortex-M3 Actel Smartfusion Timers
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos 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 General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    nickg for STM32
+//               ccoutand updated for Cortex-M3 Actel Smartfusion Devices
+// Date:         2011-03-06
+//              
+//####DESCRIPTIONEND####
+//
+//===========================================================================*/
+
+#include <pkgconf/system.h>
+#include <pkgconf/hal.h>
+
+#if defined(CYGPKG_KERNEL)
+#include <pkgconf/kernel.h>
+#endif
+
+#include <cyg/infra/testcase.h>
+
+//=============================================================================
+// Check all required packages and components are present
+
+#if !defined(CYGPKG_KERNEL) || !defined(CYGPKG_KERNEL_API)
+
+#define NA_MSG  "Configuration insufficient"
+
+#endif
+
+//=============================================================================
+// If everything is present, compile the full test.
+
+#ifndef NA_MSG
+
+#include <cyg/hal/hal_arch.h>
+#include <cyg/hal/hal_io.h>
+#include <cyg/hal/hal_if.h>
+
+#include <cyg/kernel/kapi.h>
+#include <cyg/infra/diag.h>
+#include <string.h>
+
+//=============================================================================
+
+#define LOOPS      24           // == 2 minutes
+
+#define STACK_SIZE 8000
+
+static int test_stack[(STACK_SIZE/sizeof(int))];
+static cyg_thread test_thread;
+static cyg_handle_t main_thread;
+
+//=============================================================================
+
+struct timer
+{
+    cyg_uint32          timer;
+    cyg_uint32          base;
+    cyg_uint32          vector;
+    cyg_uint32          priority;
+    cyg_uint32          interval;
+
+    cyg_uint32          ticks;
+
+    cyg_uint32          preempt[10];
+
+    cyg_uint32          preempt_dsr[10];
+    cyg_uint32          dsr_count[10];
+
+    cyg_interrupt       interrupt_object;
+    cyg_handle_t        interrupt_handle;
+};
+
+struct timer timers[] =
+{
+    { 1, CYGHWR_HAL_A2FXXX_TIMER1, CYGNUM_HAL_INTERRUPT_TIM0_1, 0x20,     127 },
+    { 2, CYGHWR_HAL_A2FXXX_TIMER2, CYGNUM_HAL_INTERRUPT_TIM0_2, 0x30,     355 },
+    { 0, 0, 0, 0 }
+};
+
+//=============================================================================
+
+volatile cyg_uint32 ticks = 0;
+volatile cyg_uint32 nesting = 0;
+volatile cyg_uint32 max_nesting = 0;
+volatile cyg_uint32 max_nesting_seen = 0;
+volatile cyg_uint32 current = 0;
+volatile cyg_uint32 in_dsr = 0;
+
+//=============================================================================
+
+__externC cyg_uint32 hal_a2fxxx_pclk0;
+
+void init_timer( cyg_uint32 base, cyg_uint32 interval )
+{
+    cyg_uint32 period = hal_a2fxxx_pclk0;
+
+    period = period / 1000000;
+    period = period * interval;
+
+    HAL_WRITE_UINT32(base+CYGHWR_HAL_A2FXXX_TIMER_TIMx_BGLOADVAL, period-1 );
+
+    HAL_WRITE_UINT32(base+CYGHWR_HAL_A2FXXX_TIMER_TIMx_CTRL, \
+            CYGHWR_HAL_A2FXXX_TIMER_TIMx_CTRL_EN | CYGHWR_HAL_A2FXXX_TIMER_TIMx_CTRL_INTEN);
+}
+
+//=============================================================================
+
+cyg_uint32 timer_isr( cyg_uint32 vector, CYG_ADDRWORD data )
+{
+    struct timer *t = (struct timer *)data;
+    cyg_uint32 preempt = current;
+    CYG_ADDRWORD base = t->base;
+    cyg_uint32 cnt;
+
+    current = t->timer;
+    t->ticks++;
+    ticks++;
+    t->preempt[preempt]++;
+    nesting++;
+
+    // Count only first ISR to preempt a DSR
+    if( preempt == 0 )
+        t->preempt_dsr[in_dsr]++;
+
+    HAL_WRITE_UINT32(t->base+CYGHWR_HAL_A2FXXX_TIMER_TIMx_RIS, 1 );
+
+    if( nesting > max_nesting )
+        max_nesting = nesting;
+
+    // Loiter here for a proportion of the timer interval to give
+    // other timers the chance to preempt us.
+    do
+    {
+        HAL_READ_UINT32( base+CYGHWR_HAL_A2FXXX_TIMER_TIMx_VAL, cnt );
+    } while( cnt < t->interval/10 );
+
+    nesting--;
+    current = preempt;
+
+    if( (t->ticks % 10) == 0 )
+        return 3;
+    else
+        return 1;
+}
+
+//=============================================================================
+
+void timer_dsr( cyg_uint32 vector, cyg_uint32 count, CYG_ADDRWORD data )
+{
+    struct timer *t = (struct timer *)data;
+    int i;
+
+    in_dsr = t->timer;
+
+    if( count >= 8 )
+        count = 8;
+
+    t->dsr_count[count]++;
+
+    // Loiter for a while
+    for( i = 0; i < t->interval/10; i++)
+        continue;
+
+    in_dsr = 0;
+}
+
+//=============================================================================
+
+void
+timers_test(cyg_addrword_t data)
+{
+    int loops = LOOPS;
+    int i;
+    CYG_INTERRUPT_STATE istate;
+
+    CYG_TEST_INIT();
+
+    CYG_TEST_INFO("Start Timers test");
+
+    CYGHWR_HAL_A2FXXX_PERIPH_RELEASE( CYGHWR_HAL_A2FXXX_PERIPH_SOFTRST(TIMER) );
+
+    for( i = 0; timers[i].timer != 0; i++ )
+    {
+        struct timer *t = &timers[i];
+
+        init_timer( t->base, t->interval );
+
+        cyg_interrupt_create( t->vector,
+                              t->priority,
+                              (cyg_addrword_t)t,
+                              timer_isr,
+                              timer_dsr,
+                              &t->interrupt_handle,
+                              &t->interrupt_object
+            );
+
+        cyg_interrupt_attach( t->interrupt_handle );
+        cyg_interrupt_unmask( t->vector );
+
+    }
+
+    while( loops-- )
+    {
+        int j;
+
+        // 5 second delay
+        cyg_thread_delay( 5*100 );
+
+        // Disable interrupts while we print details, otherwise it
+        // comes out very slowly.
+        HAL_DISABLE_INTERRUPTS( istate );
+
+        if( max_nesting > max_nesting_seen )
+            max_nesting_seen = max_nesting;
+
+        diag_printf("\nISRs max_nesting %d max_nesting_seen %d\n", max_nesting, max_nesting_seen );
+        max_nesting = 0;
+
+        diag_printf(" T      Ticks ");
+
+        for( j = 0; j < 9; j++ )
+            diag_printf("%9d ", j );
+        diag_printf("\n");
+
+        for( i = 0; timers[i].timer != 0; i++ )
+        {
+            struct timer *t = &timers[i];
+
+            diag_printf("%2d: %9d ", t->timer, t->ticks );
+
+            for( j = 0; j < 9; j++ )
+                diag_printf("%9d ", t->preempt[j] );
+            diag_printf("\n");
+
+        }
+
+        diag_printf("DSRs\n");
+
+        diag_printf(" T:           ");
+
+        for( j = 0; j < 9; j++ )
+            diag_printf("%9d ", j );
+        diag_printf("\n");
+
+        for( i = 0; timers[i].timer != 0; i++ )
+        {
+            struct timer *t = &timers[i];
+
+            diag_printf("%2d:  preempt: ", t->timer);
+
+            for( j = 0; j < 9; j++ )
+                diag_printf("%9d ", t->preempt_dsr[j] );
+            diag_printf("\n");
+
+            diag_printf("       count: ");
+
+            for( j = 0; j < 9; j++ )
+                diag_printf("%9d ", t->dsr_count[j] );
+            diag_printf("\n");
+        }
+
+        HAL_RESTORE_INTERRUPTS( istate );
+    }
+
+    CYG_TEST_PASS_FINISH("Timers test");
+}
+
+//=============================================================================
+
+void cyg_user_start(void)
+{
+    cyg_thread_create(0,                // Priority
+                      timers_test,
+                      0,
+                      "timers test",    // Name
+                      test_stack,       // Stack
+                      STACK_SIZE,       // Size
+                      &main_thread,     // Handle
+                      &test_thread // Thread data structure
+        );
+    cyg_thread_resume( main_thread);
+}
+
+//=============================================================================
+// Print a message if we cannot run
+
+#else // NA_MSG
+
+void cyg_user_start(void)
+{
+    CYG_TEST_NA(NA_MSG);
+}
+
+#endif // NA_MSG
+
+//=============================================================================
+/* EOF timers.c */