📄 bldbgprc.c
字号:
/**************************(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 + -