This is the mail archive of the ecos-devel@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

hal_platform_setup.h - Approach to a new platform port


Hi

I am preparing to add new platform port, so I consider placing common variant setup code in a common header hal_variant_setup.h

Since this is not a common practice i would like to hear your opinion. Advantage of such organization is avoiding multiple copies of the code that is going to be same for all platforms:

- PLL clock initialization (all parameters are set by cdl so no changes in code are needed)
- Memory re-mapping (This may need additional code for system,s with external memory, but it can then be added in hal_platform_setup_h when needed.


Attached diff file wou'd give you a breif picture (current port only). Pliease give your comments so I could proceed on.

Regards
Ilija


diff -r -U 5 -N -x CVS -x '*~' -x '.#*' clean/ecos/packages/hal/arm/mac7100/mace1/current/include/hal_platform_setup.h devo/ecos/packages/hal/arm/mac7100/mace1/current/include/hal_platform_setup.h
--- clean/ecos/packages/hal/arm/mac7100/mace1/current/include/hal_platform_setup.h	2006-05-31 21:17:20.000000000 +0200
+++ devo/ecos/packages/hal/arm/mac7100/mace1/current/include/hal_platform_setup.h	2006-06-06 09:13:58.626788960 +0200
@@ -52,11 +52,11 @@
 //####DESCRIPTIONEND####
 //
 //===========================================================================
 
 #include <cyg/hal/var_io.h>
-
+#include <cyg/hal/hal_variant_setup.h>
 //===========================================================================
 
    .macro _led y
         ldr r0,=MAC7100_PIM_PORTDATA(MAC7100_PORT_A_OFFSET)
         ldrh r1,[r0]
@@ -80,89 +80,26 @@
         strh r1,[r0],#2
         strh r1,[r0],#2 // LED: MSB ...
       _led    0         // Set initial LED state. 
     .endm
 
-// Initialize PLL
-#if defined(CYGNUM_HAL_ARM_MAC7100_FDIV)  // Divider set by user.
-#   define MAC7100_CRG_REFDV_VAL (CYGNUM_HAL_ARM_MAC7100_FDIV-1)
-#else                                     //  Divider calculated. 
-      //NOTE: works for f_osc <= 8MHz
-#   define MAC7100_CRG_REFDV_VAL (((CYGNUM_HAL_ARM_MAC7100_F_OSC/500000) - 1) & 0x0F) // 15 (1)
-#endif
-#define MAC7100_CRG_SYNR_VAL (CYGNUM_HAL_ARM_MAC7100_CLOCK_SPEED / 2 / \
-        (CYGNUM_HAL_ARM_MAC7100_F_OSC / (MAC7100_CRG_REFDV_VAL+1))-1) // 47 (5)
 
-#define MAC7100_CRG_PLLCTL_VAL                                          \
-      (MAC7100_CRG_CME|MAC7100_CRG_PLLON|MAC7100_CRG_AUTO|              \
-       MAC7100_CRG_ACQ|MAC7100_CRG_SCME)
-#define MAC7100_CRG_CLKSEL_VAL (MAC7100_CRG_PLLSEL)
-
-.macro  _pclock_init
-        ldr r2,=MAC7100_CRG_BASE
-        mov r3,#0
-        // Disable clock interrupts
-        strb r3,[r2,#(MAC7100_CRG_CRGINT-MAC7100_CRG_BASE)]  
-        // DeSelect PLL clock
-        mov r3,#MAC7100_CRG_REFDV_VAL
-        // Reference Divider reg.
-        strb r3,[r2,#(MAC7100_CRG_REFDV-MAC7100_CRG_BASE)]   
-        mov r3,#MAC7100_CRG_SYNR_VAL
-        // Synthesizer register
-        strb r3,[r2,#(MAC7100_CRG_SYNR-MAC7100_CRG_BASE)]   
-        mov r3,#MAC7100_CRG_PLLCTL_VAL
-        // PLL control register
-        strb r3,[r2,#(MAC7100_CRG_PLLCTL-MAC7100_CRG_BASE)]   
-        // Wait PLL lock  <---
-1:      ldrb r3,[r2,#(MAC7100_CRG_CRGFLG-MAC7100_CRG_BASE)] 
-        tst r3,#MAC7100_CRG_LOCK
-        bne 2f      // PLL locked, GO ON  ----->>
-        _led 0x55   
-        b 1b        // Still waiting for PLL lock  -------------------------->
-2:      mov r3,#MAC7100_CRG_CLKSEL_VAL  // <<----
-        // Select PLL clock
-        strb r3,[r2,#(MAC7100_CRG_CLKSEL-MAC7100_CRG_BASE)]  
-        mov r3,#0
-        strb r3,[r2,#(MAC7100_CRG_BDMCTL-MAC7100_CRG_BASE)]  // Set CRG BDMCTL 
-        mov r3,r3
+// Clock initilalization
+	.macro  _pclock_init
+		_MAC7100_setPLL
     .endm
 
-    .macro  _pio_init
-    .endm
-                
 // Memory re-mapping
-    .macro _TelePort
-        _led    1
-        ldr     r1, TelePort    //AAMR_REG
-        ldr     r0, [r1]
-
-        mvn     r4, #0xf0000000      // 1. Copy telepoter to RAM
-        ldr     r2, TelePort+4       // TelePorter
-        ldr     r3, TelePort+8       // TelePort (TelePorter end)
-        and     r2,r2,r4
-        and     r3,r3,r4
-        mov     r4, #0x40000000      // RAM address
-1: //CopyTelePorter:                 // copying teleporter                 
-            ldr     r5,[r2],#4       // <---
-            str     r5,[r4],#4
-            cmp     r2,r3
-            bne     1b               //CopyTelePorter  // --->
-        ldr     r3,TelePort+12
-        mov     pc,#0x40000000      // 2. Jump to TelePorter in RAM
-TelePorter:
-        bic     r0,r0,#0x000000ff   // 3. Re-map memory
-        orr     r0,r0,#0x8b         //    Flash -> 0x20000000
-        str     r0,[r1]             //    RAM   -> 0x00000000 and 0x40000000
-        mov     pc,r3               // 4. Teleport back to Flash
-TelePort:
-        .long MAC7100_MCM_AAMR
-        .long TelePorter
-        .long TelePort
-        .long TelePortReturn
-TelePortReturn:
+	.macro _remap_memory
+		_TelePort
     .endm
-// End memory re-mapping
+
+
+// Initialize paralel port
+    .macro  _pio_init
+    .endm
+
 
 #define CYGHWR_LED_MACRO _led \x
 
 //===========================================================================
                         
diff -r -U 5 -N -x CVS -x '*~' -x '.#*' clean/ecos/packages/hal/arm/mac7100/var/current/include/hal_variant_setup.h devo/ecos/packages/hal/arm/mac7100/var/current/include/hal_variant_setup.h
--- clean/ecos/packages/hal/arm/mac7100/var/current/include/hal_variant_setup.h	1970-01-01 01:00:00.000000000 +0100
+++ devo/ecos/packages/hal/arm/mac7100/var/current/include/hal_variant_setup.h	2006-06-06 08:47:46.000000000 +0200
@@ -0,0 +1,139 @@
+#ifndef CYGONCE_HAL_VARIANT_SETUP_H
+#define CYGONCE_HAL_VARIANT_SETUP_H
+
+//=============================================================================
+//
+//      hal_variant_setup.h
+//
+//      Variant specific support for HAL (assembly code)
+//
+//=============================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+// Copyright (C) 2003 Nick Garnett <nickg@calivar.com>
+// Copyright (C) 2006 eCosCentric Ltd
+//
+// 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.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 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.
+//
+// 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):   Ilija Koco <ilijak@siva.com.mk>
+// Contributors:
+// Date:        2006-06-05
+// Purpose:     MAC7100 variant specific support routines
+// Description:
+// Usage:       in <cyg/hal/hal_platform_serup.h> include following:
+//              #include <cyg/hal/hal_variant_setup.h>
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================
+
+// Clock initilalization
+// Initialize PLL
+#if defined(CYGNUM_HAL_ARM_MAC7100_FDIV)  // Divider set by user.
+#   define MAC7100_CRG_REFDV_VAL (CYGNUM_HAL_ARM_MAC7100_FDIV-1)
+#else                                     //  Divider calculated. 
+      //NOTE: works for f_osc <= 8MHz
+#   define MAC7100_CRG_REFDV_VAL (((CYGNUM_HAL_ARM_MAC7100_F_OSC/500000) - 1) & 0x0F) // 15 (1)
+#endif
+#define MAC7100_CRG_SYNR_VAL (CYGNUM_HAL_ARM_MAC7100_CLOCK_SPEED / 2 / \
+        (CYGNUM_HAL_ARM_MAC7100_F_OSC / (MAC7100_CRG_REFDV_VAL+1))-1) // 47 (5)
+
+#define MAC7100_CRG_PLLCTL_VAL                                          \
+      (MAC7100_CRG_CME|MAC7100_CRG_PLLON|MAC7100_CRG_AUTO|              \
+       MAC7100_CRG_ACQ|MAC7100_CRG_SCME)
+#define MAC7100_CRG_CLKSEL_VAL (MAC7100_CRG_PLLSEL)
+
+.macro  _MAC7100_setPLL
+        ldr r2,=MAC7100_CRG_BASE
+        mov r3,#0
+        // Disable clock interrupts
+        strb r3,[r2,#(MAC7100_CRG_CRGINT-MAC7100_CRG_BASE)]  
+        // DeSelect PLL clock
+        mov r3,#MAC7100_CRG_REFDV_VAL
+        // Reference Divider reg.
+        strb r3,[r2,#(MAC7100_CRG_REFDV-MAC7100_CRG_BASE)]   
+        mov r3,#MAC7100_CRG_SYNR_VAL
+        // Synthesizer register
+        strb r3,[r2,#(MAC7100_CRG_SYNR-MAC7100_CRG_BASE)]   
+        mov r3,#MAC7100_CRG_PLLCTL_VAL
+        // PLL control register
+        strb r3,[r2,#(MAC7100_CRG_PLLCTL-MAC7100_CRG_BASE)]   
+        // Wait PLL lock  <---
+1:      ldrb r3,[r2,#(MAC7100_CRG_CRGFLG-MAC7100_CRG_BASE)] 
+        tst r3,#MAC7100_CRG_LOCK
+        bne 2f      // PLL locked, GO ON  ----->>
+        b 1b        // Still waiting for PLL lock  -------------------------->
+2:      mov r3,#MAC7100_CRG_CLKSEL_VAL  // <<----
+        // Select PLL clock
+        strb r3,[r2,#(MAC7100_CRG_CLKSEL-MAC7100_CRG_BASE)]  
+        mov r3,#0
+        strb r3,[r2,#(MAC7100_CRG_BDMCTL-MAC7100_CRG_BASE)]  // Set CRG BDMCTL 
+        mov r3,r3
+    .endm
+
+// Memory re-mapping
+// Re-map internal memory so that vectors can reside in RAM.
+//     RAM base   0x00000000 (as well as 0x40000000)
+//     Flash base 0x20000000
+
+    .macro _TelePort
+        ldr     r1, TelePort    //AAMR_REG
+        ldr     r0, [r1]
+
+        mvn     r4, #0xf0000000      // 1. Copy telepoter to RAM
+        ldr     r2, TelePort+4       // TelePorter
+        ldr     r3, TelePort+8       // TelePort (TelePorter end)
+        and     r2,r2,r4
+        and     r3,r3,r4
+        mov     r4, #0x40000000      // RAM address
+1: //CopyTelePorter:                 // copying teleporter                 
+            ldr     r5,[r2],#4       // <---
+            str     r5,[r4],#4
+            cmp     r2,r3
+            bne     1b               //CopyTelePorter  // --->
+        ldr     r3,TelePort+12
+        mov     pc,#0x40000000      // 2. Jump to TelePorter in RAM
+TelePorter:
+        bic     r0,r0,#0x000000ff   // 3. Re-map memory
+        orr     r0,r0,#0x8b         //    Flash -> 0x20000000
+        str     r0,[r1]             //    RAM   -> 0x00000000 and 0x40000000
+        mov     pc,r3               // 4. Teleport back to Flash
+TelePort:
+        .long MAC7100_MCM_AAMR
+        .long TelePorter
+        .long TelePort
+        .long TelePortReturn
+TelePortReturn:
+    .endm
+// End memory re-mapping
+
+//-----------------------------------------------------------------------------
+// end of hal_variant_setup.h
+#endif // CYGONCE_HAL_VARIANT_SETUP_H

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]