We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
We have bootstrap loader code as shown below:<br> <br>
void far vMainFunction(void) /******************************************************************************* Description: This the start of the code Inputs: NONE Outputs: NONE Globals: NONE *******************************************************************************/ { BYTE bLastByte; WORD uRamData; WORD *puRamPtr; // use 16 bit values BYTE idata *pbIramPtr; #pragma asm ADDRSEL1 DEFR 0FE18H DISWDT // Disable watchdog timer MOV SYSCON,#6184H // Stack size = 32 words, XRAM enabled NOP MOV DPP0,#0 // Set the data page pointer to point at 1st 4 pages MOV DPP1,#1 // which is all of internal memory MOV DPP2,#2 MOV DPP3,#3 NOP MOV ADDRSEL1,#0403H // CS1 active starting at 04'0000 (RAM) NOP MOV BUSCON0,#04AFH // CS is independent of write NOP MOV BUSCON1,#04AFH // CS is independent of write EINIT #pragma endasm // Set RS232 baudrate reload register, // Baud Rate = 20MHz / (16*2*[S0BG+1]). See (page 10-11) of Siemens C167 // Derivatives S0BG = 0x001F; // Baud Rate = 19.5264 KBaud /// Configure the serial link for: // 8-bit data asynchronous operation /// one stop bit /// divide clock by reload value + constant /// Disable receiver S0CON = 0x0011; // Setup the Rs232 output port P3 |= 0x0400; // set P3.10 output latch (TXD0) DP3 |= 0x0400; // set P3.10 direction control (TXD0 output) DP3 &= 0xF7FF; // reset P3.11 direction control (RXD0 input) // Enable the RS232 receiver S0R = 1; // Set ptr to start RAM address -> 0x40000 puRamPtr = (WORD *) RAM_START; // Check RAM -> 0x40000 - 0x40800 for ( puRamPtr = (WORD *) RAM_START, bLastByte = 0; puRamPtr <= RAM_END; puRamPtr++, bLastByte += 2 ) { // Store a pattern of n+1, n. For example; 0x01, 0x00 uRamData = bLastByte + ( (bLastByte + 1) << 8 ); // Put the WORD pattern into RAM *puRamPtr = uRamData; // See if the pattern was stored if (*puRamPtr != uRamData) { // RAM did not hold pattern, flag fault and lockup putbyte(RAM_MEMORY_ERROR); putbyte(0x5A); while(1); } } // RAM test passed, send indicator that FLASH loader download can begin putbyte(RAM_MEMORY_TEST_OK); // Load XRAM code -> continue loading FLASHLDR.SRE YES - ITSELF ! // This code loads all the code in FLASHLDR.C // The code is loaded to XRAM which is internal memory for ( pbIramPtr = (BYTE idata *)XRAM_START; pbIramPtr != (BYTE idata *)XRAM_END; pbIramPtr++ ) { // Wait for a byte to come in on the serial port while (! S0RIR); // Store the byte in XRAM bLastByte = S0RBUF; *pbIramPtr = bLastByte; // See if the byte was stored correctly if (bLastByte != *pbIramPtr) { // Store failed, send XRAM error and lockup putbyte(XRAM_WRITE_ERROR); while(1); } // Clear receive interrupt flag S0RIR = 0; } // Send the date and time through the serial port vSendDateAndTime(); // Running XRAM code, send write ready on the serial port putbyte(FLASH_MEMORY_WRITE_READY); // Erase the Flash, loaded by the code above vEraseFlash(); // Program the Flash vProgramFlash(); // Should never get here as software reset called in earlier process while(1); }/* vMainFunction() */
void vSendDateAndTime( ) /******************************************************************************* Description: This routine sends the date from the calendar chip to the serial port transmitter, waiting for the port to empty before sending the next character. Inputs: NONE Outputs: NONE Globals: NONE *******************************************************************************/ { BYTE bIndex; /* Initialize the calendar port I/O lines */ vInitCalendarPorts(); /* Read in the date from the calendar port */ vGetBcdDate( ); /* Send the date through the serial port */ for (bIndex=0; bIndex<=5; bIndex++) { vSendByte( bIndex ); } }/* vSendDateAndTime() */ void vInitCalendarPorts(void) /******************************************************************************* Description: This function initializes the EC300 port lines which interface with the calendar chip. Inputs: NONE Outputs: NONE Globals: NONE *******************************************************************************/ { /* Set the cal reset line (P3.7) as a push-pull input */ P3 &= CAL_RESET_OUT_LOW; ODP3 &= CAL_RESET_PUSH_PULL_MODE; DP3 &= CAL_RESET_INPUT; /* Set the cal io line (P3.6) as an open drain ouput, set output high */ P3 |= ~CAL_IO_OUT_LOW; P3 |= ~CAL_IO_PUSH_PULL_MODE; P3 |= ~CAL_IO_INPUT; /* Set the cal clock line (P3.5) as a push-pull output, set output low */ P3 &= CAL_CLK_OUT_LOW; ODP3 &= CAL_CLK_PUSH_PULL_MODE; DP3 |= ~CAL_CLK_INPUT; }/* vInitCalendarPorts() */