diff src/cs/system/main/mem_load.c @ 0:92470e5d0b9e

src: partial import from FC Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 15 May 2020 01:28:16 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cs/system/main/mem_load.c	Fri May 15 01:28:16 2020 +0000
@@ -0,0 +1,290 @@
+/************* Revision Controle System Header *************
+ *                  GSM Layer 1 software 
+ * MEM_LOAD.C
+ *
+ *        Filename mem_load.c
+ *        Version  1.6
+ *        Date     06/20/01
+ *
+ ************* Revision Controle System Header *************/
+
+#ifndef _WINDOWS
+  #include "chipset.cfg"
+  #include "board.cfg"
+  #include "swconfig.cfg"
+#endif
+
+#include "l1sw.cfg"    /* OP_L1_STANDALONE definition */
+                 
+#if ((((CHIPSET == 3) || (CHIPSET == 4) || (CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || \
+       (CHIPSET == 8) || (CHIPSET == 9) || (CHIPSET == 10) || (CHIPSET  ==  11)) && (LONG_JUMP != 0)) || \
+       (CHIPSET == 12) ||(CHIPSET == 15))
+  /* 
+   * USE_GZIP flag is used by modem binaries compression feature on P2. 
+   * For P2 build variants it is defined globally - either in master.cfg (HBB)
+   * or P2's configdef *.xml files (UBB). 
+   * The following definition is for all other platforms - just to 
+   * suppress compilation warnings.
+   */
+  #ifndef USE_GZIP
+    #define USE_GZIP       0
+  #endif
+
+  #if (OP_L1_STANDALONE == 1)
+    #define D_LOAD_START   _470_INT_MEM_out_call_load_start
+    #define D_RUN_START    _470_INT_MEM_out_call_run_start
+    #define D_RUN_END      _470_INT_MEM_out_call_run_end
+  #else
+    #define D_LOAD_START   _470_S_MEM_out_call_load_start
+    #define D_RUN_START    _470_S_MEM_out_call_run_start
+    #define D_RUN_END      _470_S_MEM_out_call_run_end
+  #endif
+
+  typedef unsigned char UWORD8;
+  typedef unsigned short int UWORD16;
+  typedef unsigned long int UWORD32;
+
+  
+  UWORD16 d_checksum1;
+  UWORD16 d_checksum2;
+
+  /* NEW COMPILER MANAGEMENT
+   * INT_memset and INT_memcpy, respectively identical to memset and 
+   * memcpy from the rts library of compiler V2.51, are defined in int.s.
+   * They are used to make the initialization of the .bss section and the load 
+   * of the internal ram code not dependent to the 32-bit alignment.
+   * The old code used for the initialization and the load used a loop with
+   * 4-byte increment, assuming the 32-bit alignment of the .bss section.
+   * This alignment is not true with compiler V2.51.
+   * This change applies whatever the compiler version.
+   * INT_memset replaces f_zero
+   * INT_memcpy replaces f_download
+   */
+  extern void INT_memset(void *s, int c, UWORD32 n);
+  extern void INT_memcpy(void *s1, void *s2, UWORD32 n);
+  
+  #if (OP_L1_STANDALONE == 0) && (BOARD == 35) && (USE_GZIP == 1)
+    extern void decompress(unsigned long input_start,
+                           unsigned long input_length,
+                           unsigned long output_start);
+  #else
+
+    UWORD16 f_checksum(UWORD8 *p_begin,
+                       UWORD32 d_length) {
+      UWORD16 d_checksum = 0x0000;
+
+      while(d_length > 0) {
+        d_checksum += *(p_begin++);
+        d_length --;
+      }
+
+      return(d_checksum);
+    }
+
+  #endif
+
+  #if (CHIPSET == 12) || (CHIPSET == 15)
+    /* 
+     *  Load start address of the interrupt vector table from FLASH into Internal SRAM
+     */
+    #define C_NUMBER_OF_INTERRUPT_VECTOR  7
+    #pragma DATA_SECTION(d_interrupt_load_start,".intload")
+    const UWORD32 d_interrupt_load_start=0L;
+    extern const UWORD32 IndirectVectorTable[C_NUMBER_OF_INTERRUPT_VECTOR * 2];
+
+    #define C_INTERRUPT_VECTOR_LOAD_START  (UWORD32)((UWORD32)(&d_interrupt_load_start) + 4)
+    #define C_INTERRUPT_VECTOR_RUN_START   (UWORD32)((UWORD32)&IndirectVectorTable[0])
+    #define C_INTERRUPT_VECTOR_LENGTH      (UWORD32)(C_NUMBER_OF_INTERRUPT_VECTOR * 2 * sizeof(UWORD32))
+  #endif   /* (CHIPSET == 12) || (CHIPSET == 15)*/
+  
+
+  #if ((LONG_JUMP == 3) || (((CHIPSET==15)||(CHIPSET == 12)) && (LONG_JUMP == 0)))
+    /* 
+     *  Load start address of the code downloaded from FLASH into Internal SRAM
+     */
+    #pragma DATA_SECTION(d_application_load_start,".ldfl")
+    const UWORD32 d_application_load_start=0L;
+    #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1))
+	    #if (TOOL_CHOICE == 0)
+	    /* NEW COMPILER MANAGEMENT 
+	     * If use of VISUAL LINKER, needs to manage trampoline download.
+	     * Case of:
+	     *     - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902
+	     */
+	      #if !(((CHIPSET == 12) || (CHIPSET==15)) && (LONG_JUMP == 0))
+            extern UWORD8 D_LOAD_START;
+	      #endif    /* (((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) */
+	    #endif   /* (TOOL_CHOICE == 0) */
+    #endif   /* (OP_WCP == 0) */
+
+    /* 
+     *  Run start address of the code downloaded from FLASH into Internal SRAM
+     */
+    #pragma DATA_SECTION(d_application_run_start,"S_P_Mem")
+    const UWORD32 d_application_run_start = 0L;
+    #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1))
+	    #if (TOOL_CHOICE == 0)
+	    /* NEW COMPILER MANAGEMENT  
+	     * If use of VISUAL LINKER, needs to manage trampoline download.
+	     * Case of:
+	     *     - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902
+	     */
+	      #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0))
+            extern UWORD8 D_RUN_START;
+	      #endif    /* (((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) */
+	    #endif   /* (TOOL_CHOICE == 0) */
+    #endif   /* (OP_WCP == 0) */
+
+    /* 
+     *  Run end address of the code downloaded from FLASH into Internal SRAM
+     */
+    #pragma DATA_SECTION(d_application_run_end,"E_P_Mem")
+    const UWORD32 d_application_run_end = 0L;
+    #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1))
+	    #if (TOOL_CHOICE == 0)
+	    /* NEW COMPILER MANAGEMENT  
+	     * If use of VISUAL LINKER, needs to manage trampoline download.
+	     * Case of:
+	     *     - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902
+	     */
+	      #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0))
+	        extern UWORD8 D_RUN_END;
+	      #endif    /* (((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) */
+	    #endif   /* (TOOL_CHOICE == 0) */
+    #endif   /* (OP_WCP == 0) */
+
+    /*
+     *  Application download
+     */
+    #define C_APPLICATION_LOAD_START  (UWORD32)((UWORD32 *)(&d_application_load_start) + 2)
+    #define C_APPLICATION_RUN_START   (UWORD32)((UWORD32)(&d_application_run_start) + sizeof(UWORD32))
+    #define C_APPLICATION_RUN_END     (UWORD32)((UWORD32)(&d_application_run_end) + sizeof(UWORD32))
+    #define C_APPLICATION_LENGTH      (UWORD32)(C_APPLICATION_RUN_END - C_APPLICATION_RUN_START - sizeof(UWORD32))
+
+    #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1))
+	    #if (TOOL_CHOICE == 0)
+	    /* NEW COMPILER MANAGEMENT  
+	     * If use of VISUAL LINKER, needs to manage trampoline download.
+	     * Case of:
+	     *     - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902
+	     */
+	      #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0))
+	      /*
+	       *  Trampoline download
+	       */
+            #define C_TRAMPOLINE_LOAD_START  (UWORD32)(&D_LOAD_START)
+            #define C_TRAMPOLINE_RUN_START   (UWORD32)(&D_RUN_START)
+            #define C_TRAMPOLINE_RUN_END     (UWORD32)(&D_RUN_END)
+            #define C_TRAMPOLINE_LENGTH      (UWORD32)(&D_RUN_END - &D_RUN_START)
+	      #endif    /* (((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) */
+	    #endif   /* (TOOL_CHOICE == 0) */
+    #endif      /* (OP_WCP == 0) */
+
+    void f_load_int_mem(void) {
+      /* 
+       *  Reset checksum of code downloaded
+       */
+      d_checksum1 = 0;  /* Load checksum */
+      d_checksum2 = 0;  /* Run checksum */
+
+      /*
+       *  Reset the Internal memory where the code must be downloaded
+       */
+      INT_memset((void *)(C_APPLICATION_RUN_START),0,C_APPLICATION_LENGTH);
+      #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1))
+	      #if (TOOL_CHOICE == 0)
+		    /* NEW COMPILER MANAGEMENT  
+		     * If use of VISUAL LINKER, needs to manage trampoline download.
+		     * Case of:
+		     *     - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902
+		     */
+	        #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0))
+	          INT_memset((void *)(C_TRAMPOLINE_RUN_START),0,C_TRAMPOLINE_LENGTH);
+	        #endif
+  	    #endif   /* (TOOL_CHOICE == 0) */
+
+        #if ((CHIPSET == 12)||(CHIPSET==15))
+          INT_memset((void *)(C_INTERRUPT_VECTOR_RUN_START),0,C_INTERRUPT_VECTOR_LENGTH);
+        #endif
+      #endif   /* (OP_WCP == 0) */
+
+      #if (OP_L1_STANDALONE == 0) && (BOARD == 35) && (USE_GZIP == 1)
+        #define C_GZIP_START                  (C_APPLICATION_LOAD_START)
+        #define C_GZIP_LENGTH                 (*(UWORD32*)C_APPLICATION_LOAD_START)
+        #define C_GZIP_OUT                    (C_APPLICATION_RUN_START - sizeof(UWORD32))
+
+        /* De-compress on-the-fly and load to internal RAM */
+        decompress(C_GZIP_START,              /* load start (compressed) */
+                   C_GZIP_LENGTH,             /* compressed length */
+                   C_GZIP_OUT);               /* run start */ 
+      #else
+        /*
+         *  Compute checksum on code in FLASH (code and trampoline functions)
+         */
+        d_checksum1 =  f_checksum((UWORD8 *)(C_APPLICATION_LOAD_START), C_APPLICATION_LENGTH);
+        #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1))
+		#if (TOOL_CHOICE == 0)
+	        /* NEW COMPILER MANAGEMENT  
+	         * If use of VISUAL LINKER, needs to manage trampoline download.
+	         * Case of:
+	         *     - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902
+	         */
+	          #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0))
+	            d_checksum1 += f_checksum((UWORD8 *)(C_TRAMPOLINE_LOAD_START),  C_TRAMPOLINE_LENGTH);
+	          #endif
+		#endif   /* (TOOL_CHOICE == 0) */
+
+          	#if ((CHIPSET == 12)||(CHIPSET==15))
+            	   d_checksum1 += f_checksum((UWORD8 *)(C_INTERRUPT_VECTOR_LOAD_START), C_INTERRUPT_VECTOR_LENGTH);
+          	#endif
+        #endif   /* (OP_WCP == 0) */
+
+
+        /*
+         *  Download code from FLASH into Internal RAM (both code and trampoline functions)
+         */
+        INT_memcpy((void *)(C_APPLICATION_RUN_START),(void *)(C_APPLICATION_LOAD_START),C_APPLICATION_LENGTH);
+        #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1))
+	        #if (TOOL_CHOICE == 0)
+	        /* NEW COMPILER MANAGEMENT  
+	         * If use of VISUAL LINKER, needs to manage trampoline download.
+	         * Case of:
+	         *     - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902
+	         */
+	          #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0))
+	            INT_memcpy((void *)(C_TRAMPOLINE_RUN_START),(void *)(C_TRAMPOLINE_LOAD_START),C_TRAMPOLINE_LENGTH);
+	          #endif
+		 #endif   /* (TOOL_CHOICE == 0) */
+
+          	#if ((CHIPSET == 12)||(CHIPSET==15))
+		    INT_memcpy((void *)(C_INTERRUPT_VECTOR_RUN_START),(void *)(C_INTERRUPT_VECTOR_LOAD_START),C_INTERRUPT_VECTOR_LENGTH);
+		#endif
+        #endif   /* (OP_WCP == 0) */
+
+
+        /*
+         *  Compute checksum on code in FLASH (code and trampoline functions)
+         */
+        d_checksum2 =  f_checksum((UWORD8 *)(C_APPLICATION_RUN_START), C_APPLICATION_LENGTH);
+        #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1))
+	        #if (TOOL_CHOICE == 0)
+	        /* NEW COMPILER MANAGEMENT  
+	         * If use of VISUAL LINKER, needs to manage trampoline download.
+	         * Case of:
+	         *     - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902
+	         */
+	          #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0))
+	            d_checksum2 += f_checksum((UWORD8 *)(C_TRAMPOLINE_RUN_START),  C_TRAMPOLINE_LENGTH);
+	          #endif
+		 #endif   /* (TOOL_CHOICE == 0) */
+
+          	#if ((CHIPSET == 12)||(CHIPSET==15))
+		    d_checksum2 += f_checksum((UWORD8 *)(C_INTERRUPT_VECTOR_RUN_START),  C_INTERRUPT_VECTOR_LENGTH);
+                #endif
+        #endif   /* (OP_WCP == 0) */
+
+      #endif /* (OP_L1_STANDALONE == 0) && (BOARD == 35) && (USE_GZIP == 1) */
+
+    } /* f_load_int_mem() */
+  #endif   /* ((LONG_JUMP == 3) || (((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0))) */
+#endif     /* ((((CHIPSET == 3) || (CHIPSET == 4) ||   ...    (CHIPSET == 12) || (CHIPSET == 15)) */