📄 dynamic_clock.c
字号:
/************* Revision Controle System Header *************
* GSM Layer 1 software
* DYNAMIC_CLOCK_C
*
* Filename dynamic_clock.c
* Copyright 2003 (C) Texas Instruments
*
************* Revision Controle System Header *************/
/*
* Only SAMSON/CALYPSO families are considered for dynamic clock configuration.
*/
#include "chipset.cfg"
#include "board.cfg"
#include "../../drivers/drv_core/pin_config.h"
#define INTEL_FLASH
#if (CHIPSET == 4) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || \
(CHIPSET == 11) || (CHIPSET == 12) || (CHIPSET == 15)
#include "nucleus.h"
/* Include file for DSP latency definition */
#include "l1_macro.h"
#include "l1_confg.h"
#include "l1_types.h"
#include "sys_types.h"
#include "l1_const.h"
/* Include file for l1_config variable */
#if TESTMODE
#include "l1tm_defty.h"
#endif // TESTMODE
#if (AUDIO_TASK == 1)
#include "l1audio_const.h"
#include "l1audio_cust.h"
#include "l1audio_defty.h"
#endif // AUDIO_TASK
#if (L1_GTT == 1)
#include "l1gtt_const.h"
#include "l1gtt_defty.h"
#endif
#if (L1_MP3 == 1)
#include "l1mp3_defty.h"
#endif
#if (L1_MIDI == 1)
#include "l1midi_defty.h"
#endif
#include "l1_defty.h"
//#include "cust_os.h"
#include "l1_msgty.h"
#include "l1_varex.h"
#include "l1_proto.h"
/* Include file for H/W configuration impacted by clock update */
#include "dynamic_clock.h"
#include "clkm.h"
#include "mem.h"
#include "rhea_arm.h"
#include "ulpd.h"
#define _DYNAMIC_CLOCK_C_
#if (CHIPSET == 4)
#include "dynamic_clock_4.h"
#elif (CHIPSET == 7) || (CHIPSET == 8)
#include "dynamic_clock_7_8.h"
#elif (CHIPSET == 10) || (CHIPSET == 11)
#include "dynamic_clock_10_11.h"
#elif (CHIPSET == 12)
#include "dynamic_clock_12.h"
#elif (CHIPSET == 15)
#include "dynamic_clock_15.h"
#else
#error "This CHIPSET configuration is not supported"
#endif
extern void INT_DisableIRQ(void);
extern void INT_EnableIRQ(void);
/***********************************************************************************************
* Only SAMSON/CALYPSO families are considered for dynamic clock configuration.
***********************************************************************************************
*
* Supported clock configuration
*
*
* CHIPSET 78/78/13 78/78/39 104/104/52 156/78/52 130/130/65
* (0) (1) (2) (3) (4)
*
* HERCULES (2) NA NA NA NA NA
* ULYSSE/ULYSSE G0 (3) NA NA NA NA NA
* ULYSSE C035 (9) NA NA NA NA NA
* ULYSSE G1 (13MHz) (5) NA NA NA NA NA
* ULYSSE G1 (26MHz) (6) NA NA NA NA NA
*
* SAMSON C07 (4) X ? NA NA NA
* CALYPSO C05 Rev A (7) X X NA NA NA
* CALYPSO C05 Rev B (8) X X NA NA NA
* CALYPSO C035 (10) NA X X NA NA
* CALYPSO LITE C035 (11) NA X X NA NA
* CALYPSO PLUS c035 (12) NA X X X X
*
*
*
*
* BOARD CHIPSET Access Time (ns)
* CS0 CS1 CS2 CS3 CS4 CS5
*
* EVA4 (RAM) (6) CALYPSO PLUS 100 NA NA NA 100 100
* CALYPSO C05/C035 NA
* SAMSON NA
* C-Sample (RAM) (8) CALYPSO C05/SAMSON 100 100 NA NA (RD108, RD308) FLASH : AM29DL322T-70 (AMD) - SRAM : IC806 ????
* C-Sample (FLASH) (9) CALYPSO C05/SAMSON 100 100 NA NA (RD108, RD308) FLASH : AM29DL322T-70 (AMD) - SRAM : IC806 ????
* D-Sample (RAM) (40) CALYPSO C035/SAMSON 85 70 70 NA (RD316, RD112) FLASH/SRAM : 28F640W30B70 (Intel) - SRAM : K1S321615M-EE10 (Samsung)
* CALYPSO C05
* D-Sample (FLASH) (41) CALYPSO C035/SAMSON 70 70 85 NA (RD316, RD112) FLASH/SRAM : 28F640W30B70 (Intel) - SRAM : K1S321615M-EE10 (Samsung)
* CALYPSO C05
* E-Sample (SRAM) (42) CALYPSO PLUS NA NA NA NA 70 70
* E-Sample (FLASH) (43) CALYPSO PLUS NA NA NA NA 70 70
*
*
***********************************************************************************************/
T_DYNAMIC_CLOCK_CFG *p_dynamic_clock_cfg;
SYS_UWORD32 d_dsp_cur_clk; // Used to keep track of current DSP clock.
INT old_int_mask;
#pragma CODE_SECTION(disable_ps_ram_burst, ".emifconf")
#pragma CODE_SECTION(enable_ps_ram_burst, ".emifconf")
#pragma CODE_SECTION(disable_flash_burst, ".emifconf")
#pragma CODE_SECTION(enable_flash_burst, ".emifconf")
#pragma CODE_SECTION(enable_flash_burst_mirror, ".emifconf")
#pragma CODE_SECTION(lld_SetConfigRegCmd, ".emifconf")
//fangcj added
#pragma CODE_SECTION(read_ps_ram_bcr_reg, ".emifconf")
#pragma CODE_SECTION(read_flash_bcr_reg, ".emifconf")
void disable_ps_ram_burst ()
{
SET_EMIF_NO_DYN_WAIT(0, 1); // '1' = Dynamic wait state disabled
SET_EMIF_CFG(0, 2, 0, 1, 2, 3, 0, 1); // SET_EMIF_CFG(CS, BTWST, MEMMODE, WELEN, WRWST, RDWST, RT, FCLKDIV)
SET_EMIF_ADVANCED_CFG(0, 0, 0, 0, 0, 0, 2);// SET_EMIF_ADVANCED_CFG(CS, RC, CLKMSK, BTMODE, ADVHOLD, OEHOLD, OESETUP)
// Prefetch OFF
SET_EMIF_CONF_REG(0, 1, 0, 1, 1); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
MEM16 (PSRAM_OFFSET + 0x007FFFF0); // Unlock sequence
MEM16 (PSRAM_OFFSET + 0x007FFFFE);
MEM16 (PSRAM_OFFSET + 0x007FFFFE);
// Due to special handling of the write-strobe, it is important that this code runs undisturbed and from internal RAM
SET_EMIF_CONF_REG(0, 1, 0, 1, 1); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
// SET_EMIF_CONF_REG(0, 0, 1, 1, 1); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
// MEM16 (0xfffef1de) = 0x0001; // Set RnW = 0 to generate nCS controlled writes (special unlock requirement)
MEM16 (PSRAM_OFFSET + 0x007FFFFE) = 0x0001;
// MEM16 (0xfffef1de) = 0x0000; // Set RnW = normal
MEM16 (PSRAM_OFFSET + 0x007FFFFE) = 0x9d4f; // Default async
}
void enable_ps_ram_burst ()
{
#if 0
disable_ps_ram_burst ();
// Configure the psRAM device for burst operation:
MEM16 (PSRAM_OFFSET + 0x007FFFF0);
MEM16 (PSRAM_OFFSET + 0x007FFFFE);
MEM16 (PSRAM_OFFSET + 0x007FFFFE);
// Due to special handling of the write-strobe, it is important that this code runs undisturbed and from internal RAM
SET_EMIF_CONF_REG(0, 1, 0, 0, 0); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
// SET_EMIF_CONF_REG(0, 0, 1, 1, 1); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
// MEM16 (0xfffef1de) = 0x0001; // Set RnW = 0 to generate nCS controlled writes !!!!!!
MEM16 (PSRAM_OFFSET + 0x007FFFFE) = 0x0001;
// MEM16 (0xfffef1de) = 0x0000; // Set RnW = normal
MEM16 (PSRAM_OFFSET + 0x007FFFFE) =
(PSRAM_OPERATING_MODE << 15) |
(PSRAM_LATENCY_COUNTER << 11) |
(PSRAM_WAIT_POLARITY << 10) |
(PSRAM_WAIT_CONFIGURATION << 8) |
(PSRAM_CLOCK_CONFIGURATION << 6) |
(PSRAM_OUTPUT_IMPEDANCE << 5) |
(PSRAM_BURST_WRAP << 3) |
(PSRAM_BURST_LENGTH); // Enable psRAM Burst mode
// Configure EMIF for burst operation:
// SET_EMIF_CONF_REG(0, 0, 1, 1, 1); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
//// Modified by Ranga to check if Instruction and Data prefetch works
SET_EMIF_CONF_REG(0, 0, 0, 1, 1); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
SET_EMIF_NO_DYN_WAIT(0, 0); // '0' = Dynamic wait state enabled
SET_EMIF_ADVANCED_CFG(0, 0, 0, 0, 0, 0, 2);// SET_EMIF_ADVANCED_CFG(CS, RC, CLKMSK, BTMODE, ADVHOLD, OEHOLD, OESETUP)
SET_EMIF_CFG(0, 1, 2, 2, 0, 3, 0, 1); // SET_EMIF_CFG(CS, BTWST, MEMMODE, WELEN, WRWST, RDWST, RT, FCLKDIV)
SET_EMIF_CONF_REG(0, 0, 0, 0, 0); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
#endif
/// wangwang : get those code from intel
// 061227
// Configure the psRAM device for burst operation:
/* BCR */
CONF_GPIO_2 = MUX_CFG(0, PULLOFF);
GPIO_DIRECTION_OUT(2);
GPIO_SET_OUTPUT(2);
MEM16(PSRAM_OFFSET+(0x00081942<<1))=0xff;
GPIO_CLEAR_OUTPUT(2);
SET_EMIF_CONF_REG(0, 0, 0, 0, 1);
SET_EMIF_NO_DYN_WAIT(0 ,0);
SET_EMIF_ADVANCED_CFG(0, 0, 0, 1, 0, 0, 2);// SET_EMIF_ADVANCED_CFG(CS, RC, CLKMSK, BTMODE, ADVHOLD, OEHOLD, OESETUP)
SET_EMIF_CFG(0, 1, 2, 3, 0, 3, 0, 1); // SET_EMIF_CFG(CS, BTWST, MEMMODE, WELEN, WRWST, RDWST, RT, FCLKDIV)
//SET_EMIF_CONF_REG(0, 0, 1, 0, 0);
/* 070315 for power consuming bug, we should config this reg
in several steps. note !!!! */
SET_EMIF_CONF_REG(0, 0, 2, 0, 1);
MEM16 (0xfffffb02) = 0x00;
MEM16 (0xfffffb02) = 0x13; //pinghua check it for lenovo
}
typedef SYS_UWORD16 FLASHDATA;
#define FLASH_OFFSET(b,o) (*(( (volatile FLASHDATA*)(b) ) + (o)))
#define FLASH_WR(b,o,d) FLASH_OFFSET((b),(o)) = (d)
#define FLASH_RD(b,o) FLASH_OFFSET((b),(o))
#define LLD_DEV_MULTIPLIER 0x00000001
#define LLD_DB_READ_MASK 0x0000FFFF
#define LLD_DEV_READ_MASK 0x0000FFFF
#define LLD_UNLOCK_ADDR1 0x00000555
#define LLD_UNLOCK_ADDR2 0x000002AA
#define LLD_BYTES_PER_OP 0x00000002
#define LLD_BUFFER_SIZE 16
#define NOR_UNLOCK_DATA1 ((FLASHDATA)0xAAAAAAAA)
#define NOR_UNLOCK_DATA2 ((FLASHDATA)0x55555555)
#define WSXXX_SET_CONFIG_CMD ((FLASHDATA)0xD0D0D0D0)
#define WSXXX_SET_CONFIG_DATA ((FLASHDATA)0xC6C6C6C6)
/******************************************************************************
*
* lld_SetConfigRegCmd
*
* RETURNS: n/a
*
*/
void lld_SetConfigRegCmd
(
FLASHDATA * base_addr,
FLASHDATA value
)
{
FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, NOR_UNLOCK_DATA1);
FLASH_WR(base_addr, LLD_UNLOCK_ADDR2, NOR_UNLOCK_DATA2);
FLASH_WR(base_addr, LLD_UNLOCK_ADDR1, WSXXX_SET_CONFIG_CMD);
FLASH_WR(base_addr, 0, value);
FLASH_WR(base_addr, 0, 0xF0);//fangcj add for reset flash
}
// Switch to asynchronous mode
void disable_flash_burst ()
{
SET_EMIF_CONF_REG(0, 0, 0, 0, 0); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
SET_EMIF_NO_DYN_WAIT(3, 1); // '1' = Dynamic wait state disabled
SET_EMIF_CFG(3, 2, 0, 1, 2, 3, 0, 1); // SET_EMIF_CFG(CS, BTWST, MEMMODE, WELEN, WRWST, RDWST, RT, FCLKDIV)
SET_EMIF_ADVANCED_CFG(3, 1, 0, 0, 0, 0, 2);// SET_EMIF_ADVANCED_CFG(CS, RC, CLKMSK, BTMODE, ADVHOLD, OEHOLD, OESETUP)
}
void enable_flash_burst ()
{
#if 0
MEM16 (0xFFFEF19C) |= 0x0001; // Enable A22 muxing
MEM16 (0xFFFEF1A2) |= 0x0001; // Enable CKM pin-muxing
MEM16 (0xFFFEF19E) |= 0x0018; // Enable nRDY pull-up
disable_flash_burst ();
// Configure the FLASH device for burst operation:
MEM16 (0x800000+ FLASH_OFFSET_ADR) = 0xFFFF;
MEM16 (0x800000+ FLASH_OFFSET_ADR + 0x555 * 2) = 0xaa;
MEM16 (0x800000+ FLASH_OFFSET_ADR + 0x2AA * 2) = 0x55;
MEM16 (0x800000+ FLASH_OFFSET_ADR + 0xb555 * 2) = 0xc0; // Continous
// Configure EMIF for burst operation:
// SET_EMIF_CONF_REG(0, 0, 0, 1, 1); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
MEM16 (0xfffffb02) = 0x00;
//SET_EMIF_NO_DYN_WAIT(3, 0); // '1' = Dynamic wait state enabled
MEM16 (0xfffffb1c) &= 0x07;
//SET_EMIF_ADVANCED_CFG(3, 1, 0, 0, 0, 0, 2);// SET_EMIF_ADVANCED_CFG(CS, RC, CLKMSK, BTMODE, ADVHOLD, OEHOLD, OESETUP)
MEM16 (0xfffffb1a) = 0x0802;
//SET_EMIF_CFG(3, 2, 1, 1, 2, 3, 0, 1); // SET_EMIF_CFG(CS, BTWST, MEMMODE, WELEN, WRWST, RDWST, RT, FCLKDIV)
MEM16 (0xfffffb10) = 0x1231;
MEM16 (0xfffffb12) = 0x0081;
asm(" NOP");
asm(" NOP");
asm(" NOP");
asm(" NOP");
asm(" NOP");
asm(" NOP");
asm(" NOP");
asm(" NOP");
//SET_EMIF_CONF_REG(0, 0, 2, 1, 1); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
MEM16 (0xfffffb02) = 0x00;
MEM16 (0xfffffb02) = 0x10;
asm(" NOP");
asm(" NOP");
asm(" NOP");
asm(" NOP");
MEM16 (0xfffffb02) = 0x13;
asm(" NOP");
asm(" NOP");
asm(" NOP");
asm(" NOP");
#endif
//wangwang : get those codes from intel
// 061227
unsigned int address, RCR_value;
RCR_value = 0x000018c2;
address = FLASH_OFFSET_ADR + (RCR_value<<1);
MEM16(address) = 0x0060;
MEM16(address) = 0x0003;
SET_EMIF_NO_DYN_WAIT(3,1);
SET_EMIF_ADVANCED_CFG(3, 1, 0, 0, 0, 0, 3);
SET_EMIF_CFG(3, 2,1, 4,3,3, 0, 1);
//SET_EMIF_CONF_REG(0, 0, 2, 0, 1);
/* 070315 for power consuming bug, we should config this reg
in several steps. note !!!! */
//SET_EMIF_CONF_REG(0, 0, 2, 1, 1);
SET_EMIF_CONF_REG(0, 0, 0, 0, 0); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
SET_EMIF_CONF_REG(0, 0, 2, 0, 0); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
asm(" NOP");
asm(" NOP");
asm(" NOP");
asm(" NOP");
SET_EMIF_CONF_REG(0, 0, 2, 0, 1); // (WP, FLUSH_PREFETCH, PREFETCH_MODE, PDE, PWD_EN)
asm(" NOP");
asm(" NOP");
asm(" NOP");
asm(" NOP");
MEM16 (0xfffffb02) = 0x13; //pinghua check it for lenovo!!!
}
void enable_flash_burst_mirror ()
{
MEM16 (0xFFFEF19C) |= 0x0001; // Enable A22 muxing
MEM16 (0xFFFEF1A2) |= 0x0001; // Enable CKM pin-muxing
MEM16 (0xFFFEF19E) |= 0x0018; // Enable nRDY pull-up
disable_flash_burst ();
// Configure the FLASH device for burst operation:
// from LLD
/* write 0x1FCA -> BCR to config Flash burst */
lld_SetConfigRegCmd((FLASHDATA *) FLASH_OFFSET_ADR,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -