FreeCalypso > hg > fc-selenite
diff src/cs/layer1/cfile/l1_small.c @ 0:b6a5e36de839
src/cs: initial import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 15 Jul 2018 04:39:26 +0000 |
parents | |
children | c56f1d6202f5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/layer1/cfile/l1_small.c Sun Jul 15 04:39:26 2018 +0000 @@ -0,0 +1,356 @@ + + +#include "l1sw.cfg" +#if (OP_L1_STANDALONE == 0) + #include "debug.cfg" + #include "rv_swe.h" +#endif +#if (OP_L1_STANDALONE == 1) +#include "general.h" +#endif +#include "l1_macro.h" +#include "l1_confg.h" + +#if (CODE_VERSION == SIMULATION) + #include <string.h> + #include "l1_types.h" + #include "sys_types.h" + #include "l1_const.h" + #include "l1_time.h" + #if TESTMODE + #include "l1tm_defty.h" + #endif + #if (AUDIO_TASK == 1) + #include "l1audio_const.h" + #include "l1audio_cust.h" + #include "l1audio_defty.h" + #endif + #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 + #if (L1_AAC == 1) + #include "l1aac_defty.h" + #endif + #include "l1_defty.h" + #include "l1_varex.h" + #include "cust_os.h" + #include "l1_msgty.h" + + #include <stdio.h> + #include "sim_cfg.h" + #include "sim_cons.h" + #include "sim_def.h" + #include "sim_var.h" + +#else + #include <string.h> + + #include "l1_types.h" + #include "sys_types.h" + #include "l1_const.h" + #include "l1_time.h" + + #if TESTMODE + #include "l1tm_defty.h" + #endif + #if (AUDIO_TASK == 1) + #include "l1audio_const.h" + #include "l1audio_cust.h" + #include "l1audio_defty.h" + #endif + #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 + #if (L1_AAC == 1) + #include "l1aac_defty.h" + #endif + #include "l1_defty.h" + #include "l1_varex.h" + #include "cust_os.h" + #include "l1_msgty.h" + #include "tpudrv.h" + +#endif + +#if (W_A_CALYPSO_PLUS_SPR_19599 == 1) + #include "sys_memif.h" +#endif + +#if (CHIPSET == 15) +#include "sys_inth.h" +#include "bspI2c.h" +#include "clkm.h" + +// This could be removed if i2c_pwr_interface is functional +extern volatile Bool bspI2c_busLocked[BSP_I2C_NUM_DEVICES] ; +#endif + +/* NEW COMPILER MANAGEMENT + * With compiler V3.00, the .text section must be explicitely + * defined. + * Else the following code will be put in the .cinit section. + * The change is applied to all compilers. + */ + asm(" .sect \".text\" "); + + +UWORD8 *mode_authorized = &(l1s.pw_mgr.mode_authorized); +UWORD8 *switch_PWR_MNGT = &(l1_config.pwr_mngt); + +#if (W_A_CALYPSO_BUG_01435 == 1) + + asm("SMALL_SLEEP .equ 01h"); + asm("BIG_SLEEP .equ 02h"); + asm("DEEP_SLEEP .equ 03h"); + + void f_arm_sleep_cmd(UWORD8 d_sleep_mode) + { + asm(" LDR R3, MPU_FREE_REG"); + + // here below the C code: + // if ((d_sleep_mode == SMALL_SLEEP) || (d_sleep_mode == BIG_SLEEP)) + // * (volatile UWORD16 *) 0xfffffd00 &= 0xfffe; + // else + // if (d_sleep_mode == DEEP_SLEEP) + // * (volatile UWORD16 *) 0xfffffd00 &= 0xefff; + + asm(" CMP R0, #SMALL_SLEEP"); + asm(" BEQ Small_or_Big_Sleep"); + asm(" CMP R0, #BIG_SLEEP"); + asm(" BEQ Small_or_Big_Sleep"); + asm(" CMP R0, #DEEP_SLEEP"); + asm(" BXNE LR"); + + asm("Deep_Sleep: "); + asm(" LDR R0, CLKM_CNTL_ARM_CLK_REG"); + asm(" LDRH R12, [R0, #0]"); + asm(" AND R1, R12, #255"); + asm(" AND R12, R12, #61184"); + asm(" ORR R12, R1, R12"); + asm(" STRH R12, [R0, #0]"); + asm(" STMIA R3!, {R4-R7}"); + asm(" B End_Sleep"); + + asm("Small_or_Big_Sleep: "); + asm(" LDR R12, CLKM_CNTL_ARM_CLK_REG"); + asm(" LDRH R0, [R12, #0]"); + asm(" MOV R0, R0, LSL #16"); + asm(" MOV R0, R0, LSR #17"); + asm(" MOV R0, R0, LSL #1"); + asm(" STRH R0, [R12, #0]"); + asm(" STMIA R3!, {R4-R7}"); + + asm("End_Sleep: "); + + } /* f_arm_sleep_cmd() */ + + asm("MPU_FREE_REG .word 0xffffff20"); + asm("CLKM_CNTL_ARM_CLK_REG .word 0xfffffd00"); +#endif + +#if (CHIPSET == 15) +void init_small_sleep() +{ + + /* Should not disable bridge_clk during small sleep when an I2C transaction is pending + + In Locosto without BRIDGE_CLK, I2C interrupt is not generated */ + + // This could be removed if i2c_pwr_interface is functional + + Uint8 sts=0, camera_sts = 0; + + sts=i2c_pwr_interface(0); +#ifdef RVM_CAMD_SWE +#if(LOCOSTO_LITE == 0) +#if (OP_L1_STANDALONE == 0) + camera_sts = camera_pwr_interface(0); +#endif +#endif +#endif + + if (sts != 0 +#if(LOCOSTO_LITE == 0) + || camera_sts != 0 +#endif + ) + { + sts=i2c_pwr_interface(2);//enable + *((volatile UINT16 *) CLKM_CNTL_CLK) &= ~CLKM_BRIDGE_DIS; + } + else + { + sts=i2c_pwr_interface(1);//disable + *((volatile UINT16 *) CLKM_CNTL_CLK) |= CLKM_BRIDGE_DIS; + F_INTH_ENABLE_ONE_IT(C_INTH_UART_WAKEUP_IT); + } +} + + + +void exit_small_sleep() + +{ + i2c_pwr_interface(2); + return; +} + + +#endif + +/*-------------------------------------------------------*/ +/* INT_Small_Sleep() */ +/*-------------------------------------------------------*/ +/* */ +/* Description: small sleep */ +/* ------------ */ +/* Called by TCT_Schedule main loop of Nucleus */ +/*-------------------------------------------------------*/ + + +asm(" .def INT_Small_Sleep "); +asm("INT_Small_Sleep "); + +/* NEW COMPILER MANAGEMENT + * _switch_PWR_MNGT and _mode_authorized must be .def and not .ref + * as they are both defined in this file. + */ +asm(" .def _switch_PWR_MNGT "); +asm(" .def _mode_authorized "); +asm("SMALL_SLEEP .equ 01h "); +asm("ALL_SLEEP .equ 04h "); +asm("PWR_MNGT .equ 01h "); +#if (OP_L1_STANDALONE == 0) + // This code log the number of time the Small sleep + // function has been invoked +#if (TI_PROFILER == 1) +asm(" ldr r0, profiler_counter "); // pick counter +asm(" mov r1,#0 "); +asm(" str r1,[r0] "); +#endif + +#if (TI_NUC_MONITOR == 1) +// Push registers on statck because R3 and R4 must not be modified +asm(" STMFD sp!,{r0-r5}"); +asm(" .global _ti_nuc_monitor_sleep "); +asm(" BL _ti_nuc_monitor_sleep"); +asm(" LDMFD sp!,{r0-r5}"); +#endif + // End log call +#endif // OP_L1_STANDALONE +//asm(" .ref TCT_Schedule_Loop "); +//asm(" B TCT_Schedule_Loop "); + +asm(" ldr r0,Switch "); // pick up sleep mode +asm(" ldr r0,[r0] "); // take the current value of the register +asm(" ldrb r1,[r0] "); // take the current value of the register +asm(" cmp r1,#PWR_MNGT "); // take the current value of the register +asm(" bne End_small_sleep "); + +asm(" ldr r0,Mode "); // pick up sleep mode +asm(" ldr r0,[r0] "); // take the current value of the register +asm(" ldrb r1,[r0] "); // take the current value of the register +asm(" cmp r1,#SMALL_SLEEP "); // take the current value of the register +asm(" beq Small_sleep_ok "); +asm(" cmp r1,#ALL_SLEEP "); // take the current value of the register +asm(" bne End_small_sleep "); + +asm("Small_sleep_ok "); + +// ***************************************************** +// CQ19599: For Calypso+ chipset, extended page mode +// shall be disabled before entering deep sleep and +// restored at wake up +// ***************************************************** +#if (W_A_CALYPSO_PLUS_SPR_19599 == 1) + asm(" .ref _f_memif_extended_page_mode_read_bit "); + asm(" .ref _f_memif_extended_page_mode_disable "); + + asm(" BL _f_memif_extended_page_mode_read_bit"); //read state of extended page mode + asm(" STMFD sp!,{r2}"); //save r2 in stack in case it was used before + asm(" MOV r2,r0"); //store the state in r2 + asm(" BL _f_memif_extended_page_mode_disable"); //disable extended page mode +#endif + +#if (CHIPSET == 15) +//// Disable IRQs +asm(" MRS r1, CPSR "); +// asm(" MOV r2,r1"); // Copy the contents on CPSR register to r2 +asm(" STMFD sp!,{r1}"); // Push r2 in the stack +asm(" ORR r1,r1,#00c0h "); // Disable IRQs +asm(" MSR CPSR,r1 "); + +asm(" .ref _init_small_sleep"); +asm(" BL _init_small_sleep"); +#endif + +// ***************************************************** +//reset the DEEP_SLEEP bit 12 of CNTL_ARM_CLK register +// (Cf BUG_1278) +asm(" ldr r0,addrCLKM "); // pick up CNTL_ARM_CLK register address +asm(" ldrh r1,[r0] "); // take the current value of the register +asm(" orr r1,r1,#1000h "); // reset the bit +asm(" strh r1,[r0] "); //store the result + +asm(" ldr r0,addrCLKM "); // pick up CLKM clock register address +asm(" ldrh r1,[r0] "); // take the current value of the register +asm(" bic r1,r1,#1 "); // disable ARM clock +asm(" strh r1,[r0] "); +// ***************************************************** + +#if (CHIPSET == 15) + asm(" .ref _exit_small_sleep"); + asm(" BL _exit_small_sleep"); +//Enable IRQs +asm(" LDMFD sp!,{r1}"); //restore r2 from stack +//asm(" MOV r1,r2"); // Move r2 to r1 +asm(" MSR CPSR,r1 "); // Copy the contents of r1 to CPSR register +#endif + +#if (W_A_CALYPSO_BUG_01435 == 1) + asm(" MOV R0, #SMALL_SLEEP"); + asm(" BL _f_arm_sleep_cmd"); +#endif + +// ***************************************************** +// CQ19599: For Calypso+ chipset, restore the extended +// page mode if it was enabled before entering sleep +// ***************************************************** +#if (W_A_CALYPSO_PLUS_SPR_19599 == 1) + asm(" .ref _f_memif_extended_page_mode_enable "); + asm(" CMP r2,#0"); //check if extended page mode was enabled + asm(" BEQ extended_page_mode_restored "); //if not, do nothing + asm(" BL _f_memif_extended_page_mode_enable"); //else restore it + asm("extended_page_mode_restored "); + asm(" LDMFD sp!,{r2}"); //restore r2 +#endif + +asm(" .ref TCT_Schedule_Loop "); +asm("End_small_sleep "); +asm(" B TCT_Schedule_Loop "); // Return to TCT_Schedule main loop + +asm("addrCLKM .word 0xfffffd00 ");//CLKM clock register address + +asm("Mode .word _mode_authorized "); +asm("Switch .word _switch_PWR_MNGT "); +#if (OP_L1_STANDALONE == 0) +#if (TI_PROFILER == 1) +asm(" .ref _ti_profiler_nb_sleep_call "); +asm("profiler_counter .word _ti_profiler_nb_sleep_call "); +#endif +#endif // OP_L1_STANDALONE +