⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bldbgprc.c

📁 本程序为ST公司开发的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/**************************(c) STMicroelectronics *****************************/
/*! \file
 *
 * CVS ID:   $Id: bldbgprc.c,v 1.13 2007/02/15 13:09:23 marcucci Exp $
 * Author:   Maurizio Marcucci [MM] - STM
 * Date:     $Date: 2007/02/15 13:09:23 $
 * Revision: $Revision: 1.13 $
 *
 *  Project Scope:  CDM M8
 *
 *  Organisation:   Optical Media Storage B.U.
 *                  AGRATE ITALY Application Lab
 *
 *  Version Control:
 *    \source       sources/debug/dbgprc.c
 *    \version      0.1
 *    \author       ST Agrate
 *    \date         00-00-00
 *
 *******************************************************************************
 *  \brief          Definition of Debug Procedures
 *
 *  \par            Change History:
 *
 * - PH040616       Fixed service command SVC_TTM_x_HZ
 * - PH040803       Changes:
 *                  - Reorganisation service mode variables
 *                  - BER measurement
 * - BB040923a      Code rom and ram size optimisation:
 *                  - only one type of seek function are compiled (MFS or SID)
 *
 ***************************************************
 *
 * STM CVS Log:
 *
 * $Log: bldbgprc.c,v $ * Revision 1.13  2007/02/15 13:09:23  marcucci * Bootloader Optimization *
 * Revision 1.12  2006/10/23 08:59:02  marcucci
 * FIx Problem for SF programming through SDRAM
 *
 * Revision 1.11  2006/09/18 09:55:20  belardi
 * Corrected CVS keyword usage
 *
 * Revision 1.10  2006/09/18 09:22:15  belardi
 * Added Log
  CVS keyword into file header
 *
 *
 ******************************************************************************/

#include "blgendef.h"
#include "blmsgdef.h"
#include "bldbgdef.h"
//#include "osal.h"
#include "hwreg.h"
#include "blscidef.h"
#include "memutil.h"


extern void Reset_Handler(uint32 PATCH_TABLE_ADDRESS);

extern BL_STRUCT *bl;

uint32 bl_cksum_verify(uint32 bl_byte_count, uint8 *bl_msg_buf_ptr);
void bl_tx_msg(uint32 bl_msg_len,
               uint8 *bl_tx_msg_buf_ptr,
               uint32 bl_if_type);
uint32 bl_RS232_Send(void);
void bl_PrepareDram4Dwl(uint32 bl_start_addr, uint32 bl_end_addr);
uint32 bl_FillDram(uint8 *bl_rx_buffer);
uint32 bl_StoreProgramToFlash(BL_BSPI_STRUCT *bl_bspi_ptr);
void bl_bspi_send(uint32 bl_data);
uint32 bl_bspi_rdid(BL_BSPI_STRUCT * bl_bspi_ptr);
uint32 bl_bspi_rdsr(BL_BSPI_STRUCT * bl_bspi_ptr);
uint32 bl_bspi_bulk_erase(BL_BSPI_STRUCT * bl_bspi_ptr);
uint32 bl_bspi_wren(BL_BSPI_STRUCT * bl_bspi_ptr);
void bl_bspi_pp(uint32 bl_page_addr, uint32 bl_byte_no, BL_BSPI_STRUCT * bl_bspi_ptr);
uint32 bl_sf_erase(BL_BSPI_STRUCT * bl_bspi_ptr);
uint32 bl_sf_pp(uint32 bl_page_addr, uint32 bl_byte_no, BL_BSPI_STRUCT * bl_bspi_ptr);
void bl_sf_read(uint32 bl_page_addr, uint32 bl_byte_no, BL_BSPI_STRUCT * bl_bspi_ptr);
void bl_read_patch_code_info(BL_BSPI_STRUCT *bl_bspi_ptr);
void SelectSdram(uint32 sel);
uint32 bl_StoreDwlInfo(BL_BSPI_STRUCT *bl_bspi_ptr);
void bl_WakeUpBSPI(BL_BSPI_STRUCT *bl_bspi_ptr);
void bl_wr_bspi_tx_buffer(BL_BSPI_STRUCT *bl_bspi_ptr, uint32 *idx);

#if 0
const uint32 bl_BaseAddrTbl[] =
{
  0x00000000 , // # 0 Not Used
  0xE8020000 , // # 1 Block Decoder
  0xE801C000 , // # 2 OIF
  0xE0020000 , // # 3 BSPI
  0xE0068000 , // # 4 I2C
  0xE8014000 , // # 5 AFE
  0xE8018140 , // # 6 ACQUISITION
  0xE8008500 , // # 7 DSP
  0xE800C480 , // # 8 Decimatiom
  0xE8004000 , // # 9 WDT
  0xE801046C , // # A CLV
  0xE8010440 , // # B ECC
  0xE0058000 , // # C GPIOA
  0xE0060000 , // # D GPIOB
  0xE0050000 , // # E GCR
  0xE8000000 , // # F  A-BRG
  0xE0000000 , // # 10 S-BRG
  0xFF000000 , // # 11 EIC
  0xE0050000 , // # 12
  0x00000013 , // # 13
  0x00000014 , // # 14
  0xE0010000 , // # 15 DMA
  0x00000016 , // # 16
  0xD8000000 , // # 17 Sample Rate Converter
  0x00000018 , // # 18
  0xC0000000 , // # 19 Channel Interface
  0x0000001A , // # 1A
  0x0000001B , // # 1B
  0xAC000000 , // # 1C SPDIF Receiver
  0x0000001D , // # 1D
  0x0000001E , // # 1E
  0xA007FF00    //# 1F
};
#endif

/******************************************************************************/
/* Function: bl_pcintf                                                        */
/*                                                                            */
/* \brief    It handles the interface with PC                                 */
/* \param    void                                                             */
/*                                                                            */
/* \return   void                                                             */
/* \remark                                                                    */
/*                                                                            */
/******************************************************************************/


void bl_pcintf(void)
{
  volatile uint32 bl_addr;
  volatile uint32 bl_data;

  if((bl->RS232_Status & BL_RS232_NEW_MSG) == BL_RS232_NEW_MSG) //(BitMsk(status,RS232_NEW_MSG)))
  {
    switch (bl->RS232_RxBuffer[BL_OP_CODE])
    {

     case 0x82:
      if(bl_cksum_verify(bl->RS232_RxBuffer[BL_BYTE_COUNT], bl->RS232_RxBuffer))
      {
       /* The Message Has Correct length */
        switch(bl->RS232_RxBuffer[2])
        {
       	  case 1:
       	   bl->error_code = BL_NO_ERROR;
       	   bl->code_size = 0;
       	   bl->sdram_code_size = 0;
       	    
       	   bl->code_checksum = 0;
       	   bl->sdram_code_checksum = 0;
       	           	    
       	   bl->max_addr = 0;
       	   bl->max_sdram_addr = 0;
       	    
       	   if(bl->conf_pin_status == BL_MODE_PATCH_UPDATE)
       	   {
      	     // Update Serial Flash Mode
      	     // Clear Expansion RAM and SDRAM.
      	     // SDRAM could be not present

             // Clear RAM_A area devoted to patch code
       	    bl_PrepareDram4Dwl(BL_RAM_A_BASE_ADDR, BL_RAM_A_END_ADDR);

      	     // Clear SDRAM area devoted to overlay code.
      	     // TODO: find the way to understand if the SDRAM is in.
      	   }
      	   //bl->FlashDownLoadStatus = 1;
      	  break;

      	  case 2:
            if(bl->conf_pin_status == BL_MODE_PATCH_UPDATE)
            {
             bl->error_code = BL_NO_ERROR;
	         if(!bl_FillDram(bl->RS232_RxBuffer))
             {
              bl->error_code = BL_CODE_VERIFY_ERROR;
             }
             //else
             //{
	         // bl->error_code = BL_NO_ERROR;
             //}
            }
       	   
           //bl->FlashDownLoadStatus = 2;
      	  break;


      	  case 3:       	   
      	   // PATCH CODE
      	   if(bl->conf_pin_status == BL_MODE_PATCH_UPDATE)
      	   {
	        // Store Program to Serial Flash and Jump to ExpRAM
            bl->RS232_TxBuffer[BL_ERROR_CODE] = BL_NO_ERROR;
	        if(bl_StoreProgramToFlash(&bl->bspi) == 0)
	        {
	         //bl->RS232_TxBuffer[BL_ERROR_CODE] = BL_NO_ERROR;
	         bl->RS232_TxBuffer[BL_ERROR_CODE] = BL_STORING_FAILS;
	        }
	        //else
	        //{
    	    // bl->RS232_TxBuffer[BL_ERROR_CODE] = BL_STORING_FAILS;
	        //}

            bl->RS232_TxBuffer[BL_BYTE_COUNT] = 0x02;
            bl_tx_msg(BL_BER_ON_ACK_MSG_LEN, bl->RS232_TxBuffer, BL_PCIF);

            while(1)
            {
             if(bl->RS232_Status & BL_RS232_TX_READY)
             {
               break;
             }
            }

             // Disable Interrupts before jumping to ROM Code.
            //bl_disable_interrupt();
            EIC_ICR.field.irq_en = 0;

             // Map RAM_A at 0x000000000. This will enable the
             // Patch if not yet enabled.
             // The pacth Code is activated only if data to be stored in rom are received.
            if(!bl->dwn_ctrl_flags.patch_code_activated)
            {

             //if(bl->dwn_ctrl_flags.sdram_connected)
             {
               // Initilize SDRAM.
               // ROM code could have variable initialized at declaration time.
               // These variables will be initialized by the ARM code gnerated
               // automatically by the compiler.
               // For this reason the SDRAM must be accessible before Variables
               // initialization.
               sdram_init(0x40000000);
              }             
              //Reset_Handler();            
              //bl_jump_2_rom_code_executed = 1;
              //bl->dwn_ctrl_flags.patch_code_activated = 1;
             }

             // Jump to ROM Code Entry Point
             Reset_Handler(0x40000000);
            }
	        else
	        {
	          bl->RS232_TxBuffer[BL_ERROR_CODE] = BL_INV_STATUS;
              bl->RS232_TxBuffer[BL_BYTE_COUNT] = 0x02;
              bl_tx_msg(BL_BER_ON_ACK_MSG_LEN, bl->RS232_TxBuffer, BL_PCIF);
	        }
       	   
	       //bl->FlashDownLoadStatus = 3;
	      break;

      	  default:
      	  break;
         } //switch(RS232_RxBuffer[2])

         bl->RS232_TxBuffer[BL_ERROR_CODE] = bl->error_code;
         //bl->RS232_TxBuffer[BL_BYTE_COUNT] = 0x02;
         //bl_tx_msg(BL_BER_ON_ACK_MSG_LEN, bl->RS232_TxBuffer, BL_PCIF);
        }  //if(cksum_verify(RS232_RxBuffer[BYTE_COUNT], RS232_RxBuffer))
        else
        {
         bl->RS232_TxBuffer[BL_ERROR_CODE] = BL_INV_CKSUM;
         //bl->RS232_TxBuffer[BL_BYTE_COUNT] = 0x02;
         //bl_tx_msg(BL_BER_ON_ACK_MSG_LEN, bl->RS232_TxBuffer, BL_PCIF);
        }
        bl->RS232_TxBuffer[BL_BYTE_COUNT] = 0x02;
        bl_tx_msg(BL_BER_ON_ACK_MSG_LEN, bl->RS232_TxBuffer, BL_PCIF);
       break;




#if 0
       case BL_WRNM_MSG_OP_CODE:
        /* Rx Message */
        /* RS232_RxBuffer[0] -> Byte Count*/
        /* RS232_RxBuffer[1] -> Op Code   */
        /* RS232_RxBuffer[2] -> Near Memory Address MSB */
        /* RS232_RxBuffer[3] -> Near Memory Address LSB */
        /* RS232_RxBuffer[4] -> Data MSB */
        /* RS232_RxBuffer[5] -> Data     */
        /* RS232_RxBuffer[6] -> Data     */
        /* RS232_RxBuffer[7] -> Data LSB */
        /* RS232_RxBuffer[8] -> Mode (Byte/Word/Long) */
        /* RS232_RxBuffer[9] -> Checksum */

        /* Tx Message */
        /* RS232_TxBuffer[0] <- Byte Count    */
        /* RS232_TxBuffer[1] <- Error Code    */
        /* RS232_TxBuffer[2] <- Data MSB      */
        /* RS232_TxBuffer[3] <- Data          */
        /* RS232_TxBuffer[4] <- Data          */
        /* RS232_TxBuffer[5] <- Data LSB      */
        /* RS232_TxBuffer[6] <- Checksum      */

        if (bl->RS232_RxBuffer[BL_BYTE_COUNT] == BL_WRNM_MSG_LEN)
        {
         if (bl_cksum_verify(bl->RS232_RxBuffer[BL_BYTE_COUNT], bl->RS232_RxBuffer))
         {
           /* The Message Has Correct length */
           bl->RS232_TxBuffer[BL_ERROR_CODE] = BL_NO_ERROR;
           bl->RS232_TxBuffer[2] = 0x0000;
           bl->RS232_TxBuffer[3] = 0x0000;
           bl->RS232_TxBuffer[4] = 0x0000;
           switch (bl->RS232_RxBuffer[8])
           {

            case BL_LONG_WISE:
             /* Bild a word pointer */
             bl_addr = bl_BaseAddrTbl[bl->RS232_RxBuffer[2]];
             bl_addr += bl->RS232_RxBuffer[3];
             //pf_lnmp  = (volatile uint32 *)((RS232_RxBuffer[2] << BIT_8) | RS232_RxBuffer[3]);
             bl_data =  ((bl->RS232_RxBuffer[4] << 0x18) & 0xFF000000);
             bl_data += ((bl->RS232_RxBuffer[5] << 0x10) & 0x00FF0000);
             bl_data += ((bl->RS232_RxBuffer[6] << 0x8) & 0x0000FF00);
             bl_data += (bl->RS232_RxBuffer[7] & 0x000000FF);
             *((uint32 *)bl_addr) = bl_data;
             //*pf_lnmp = ldata2;
             //ldata = *pf_lnmp;
             bl_data = *((uint32 *) bl_addr);
             bl->RS232_TxBuffer[2] = (bl_data & 0xFF000000) >> 0x18;
             bl->RS232_TxBuffer[3] = (bl_data & 0x00FF0000) >> 0x10;
             bl->RS232_TxBuffer[4] = (bl_data & 0x0000FF00) >> 0x08;
             bl->RS232_TxBuffer[5] = (bl_data & 0x000000FF);
            break;

            default:
             bl->RS232_TxBuffer[BL_ERROR_CODE] = BL_ILL_CMND_ERR_CODE;
            break;
           }
          }
          else
          {
           bl->RS232_TxBuffer[BL_ERROR_CODE] = BL_INV_CKSUM;
          }

          bl->RS232_TxBuffer[BL_BYTE_COUNT] = BL_WRNM_ACK_LEN;
          bl_tx_msg(BL_WRNM_ACK_LEN, bl->RS232_TxBuffer, BL_PCIF);
         }
         else
         {
          /* Error Msg: Invalid Length */
         }
        break;
#endif
#if 0
        case BL_RDNM_MSG_OP_CODE:
         /* Rx Message */
         /* RS232_RxBuffer[0] -> Byte Count*/
         /* RS232_RxBuffer[1] -> Op Code   */
         /* RS232_RxBuffer[2] -> Near Memory Address MSB */
         /* RS232_RxBuffer[3] -> Near Memory Address LSB */
         /* RS232_RxBuffer[4] -> Mode (Byte/Word) */
         /* RS232_RxBuffer[5] -> Checksum */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -