mirror of
https://github.com/oopuuu/zTC1.git
synced 2025-12-14 05:58:13 +08:00
133 lines
3.9 KiB
C
133 lines
3.9 KiB
C
/*
|
|
* Routines to access hardware
|
|
*
|
|
* Copyright (c) 2015 Realtek Semiconductor Corp.
|
|
*
|
|
* This module is a confidential and proprietary property of RealTek and
|
|
* possession or use of this module requires written permission of RealTek.
|
|
*/
|
|
|
|
#include "rtl8195a.h"
|
|
#include "build_info.h"
|
|
#include "PinNames.h"
|
|
#include "serial_api.h"
|
|
|
|
extern void serial_init (serial_t *obj, PinName tx, PinName rx);
|
|
extern void serial_free (serial_t *obj);
|
|
extern void serial_baud (serial_t *obj, int baudrate);
|
|
extern void serial_format (serial_t *obj, int data_bits, SerialParity parity, int stop_bits);
|
|
extern int main(void);
|
|
|
|
void iar_data_init_fw_loader(void);
|
|
void fw_loader_main(void);// __attribute__ ((weak));
|
|
|
|
#pragma section=".image2.start.table1"
|
|
#pragma section=".fwloader_ram.bss"
|
|
|
|
FW_LOADER_START_RAM_FUN_SECTION
|
|
RAM_START_FUNCTION gFWLoaderEntryFun0 = {fw_loader_main};
|
|
|
|
u8* __image4_entry_func__;
|
|
u8* __image4_validate_code__;
|
|
u8* __fwloader_bss_start__;
|
|
u8* __fwloader_bss_end__;
|
|
|
|
FW_LOADER_VALID_PATTEN_SECTION const u8 RAM_FW_LOADER_VALID_PATTEN[20] = {
|
|
'R', 'T', 'K', 'W', 'i', 'n', 0x0, 0xff,
|
|
(FW_VERSION&0xff), ((FW_VERSION >> 8)&0xff),
|
|
(FW_SUBVERSION&0xff), ((FW_SUBVERSION >> 8)&0xff),
|
|
(FW_CHIP_ID&0xff), ((FW_CHIP_ID >> 8)&0xff),
|
|
(FW_CHIP_VER),
|
|
(FW_BUS_TYPE),
|
|
(FW_INFO_RSV1),
|
|
(FW_INFO_RSV2),
|
|
(FW_INFO_RSV3),
|
|
(FW_INFO_RSV4)
|
|
};
|
|
/**
|
|
* @brief Main program.
|
|
* @param None
|
|
* @retval None
|
|
*/
|
|
void fw_loader_main(void)
|
|
{
|
|
#if CONFIG_SPIC_EN && SPIC_CALIBRATION_IN_NVM
|
|
SpicNVMCalLoadAll();
|
|
#endif
|
|
#if defined ( __ICCARM__ )
|
|
iar_data_init_fw_loader();
|
|
#endif
|
|
u32 Image2Len, Image2Addr, ImageIndex, SpicBitMode, SpicImageIndex;
|
|
u32 Image2LoadAddr = 0x13000;
|
|
DBG_8195A("===== Enter FW Loader Image ====\n");
|
|
|
|
|
|
#ifdef BOOTLOADER
|
|
main();
|
|
#endif
|
|
|
|
IGMAE4:
|
|
PRAM_START_FUNCTION Image4EntryFun=(PRAM_START_FUNCTION)__image4_entry_func__;
|
|
|
|
Image2Len = HAL_READ32(SPI_FLASH_BASE, Image2LoadAddr);
|
|
Image2Addr = HAL_READ32(SPI_FLASH_BASE, (Image2LoadAddr+0x4));
|
|
|
|
DBG_8195A("Flash FW Loader:Addr 0x%x, Len %d, Load to SRAM 0x%x\n", Image2LoadAddr, Image2Len, Image2Addr);
|
|
|
|
SpicImageIndex = 0;
|
|
for (ImageIndex = 0x10 + Image2LoadAddr; ImageIndex < (Image2Len + Image2LoadAddr + 0x10); ImageIndex = ImageIndex + 4) {
|
|
HAL_WRITE32(Image2Addr, SpicImageIndex,
|
|
HAL_READ32(SPI_FLASH_BASE, ImageIndex));
|
|
|
|
SpicImageIndex += 4;
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SDR_EN
|
|
u32 Image3LoadAddr;
|
|
u32 Image3Len;
|
|
u32 Image3Addr;
|
|
|
|
Image3LoadAddr = Image2LoadAddr + Image2Len+0x10;
|
|
Image3Len = HAL_READ32(SPI_FLASH_BASE, Image3LoadAddr);
|
|
Image3Addr = HAL_READ32(SPI_FLASH_BASE, Image3LoadAddr + 0x4);
|
|
|
|
if( (Image3Len==0xFFFFFFFF) || (Image3Len==0) || (Image3Addr!=0x30000000)){
|
|
DBG_8195A("No Image3\n\r");
|
|
}else{
|
|
DBG_8195A("Image3 length: 0x%x, Image3 Addr: 0x%x\n",Image3Len, Image3Addr);
|
|
SpicImageIndex = 0;
|
|
|
|
for (ImageIndex = 0x10 + Image3LoadAddr;
|
|
ImageIndex < (Image3Len + Image3LoadAddr + 0x10);
|
|
ImageIndex = ImageIndex + 4) {
|
|
HAL_WRITE32(Image3Addr, SpicImageIndex,
|
|
HAL_READ32(SPI_FLASH_BASE, ImageIndex));
|
|
|
|
SpicImageIndex += 4;
|
|
}
|
|
}
|
|
#endif
|
|
//3 3) Jump to image 4
|
|
DBG_8195A("InfraStart: %p, Img2 Sign %s \n", __image4_entry_func__, (char*)__image4_validate_code__);
|
|
if (_strcmp((char *)__image4_validate_code__, "RTKWin")) {
|
|
while (1) {
|
|
DBG_8195A("Invalid Image4 Signature\n");
|
|
RtlConsolRom(1000);//each delay is 100us
|
|
}
|
|
}
|
|
|
|
#ifdef BOOTLOADER
|
|
deinit_platform_bootloader();
|
|
#endif
|
|
Image4EntryFun->RamStartFun();
|
|
}
|
|
|
|
void iar_data_init_fw_loader(void)
|
|
{
|
|
__image4_entry_func__ = (u8*)__section_begin(".image2.start.table1");
|
|
__image4_validate_code__ = __image4_entry_func__+4;//(u8*)__section_begin(".image2.start.table2");
|
|
__fwloader_bss_start__ = (u8*)__section_begin(".fwloader_ram.bss");
|
|
__fwloader_bss_end__ = (u8*)__section_end(".fwloader_ram.bss");
|
|
}
|