FreeCalypso > hg > freecalypso-sw
diff gsm-fw/bsp/abb+spi/abb_inth.c @ 148:63750f70796d
gsm-fw/bsp/abb+spi: initial import from the Leonardo TCS211 version
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sat, 16 Nov 2013 19:03:37 +0000 |
parents | |
children | 1c0033c2fe33 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/bsp/abb+spi/abb_inth.c Sat Nov 16 19:03:37 2013 +0000 @@ -0,0 +1,274 @@ +/**********************************************************************************/ +/* TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION */ +/* */ +/* Property of Texas Instruments -- For Unrestricted Internal Use Only */ +/* Unauthorized reproduction and/or distribution is strictly prohibited. This */ +/* product is protected under copyright law and trade secret law as an */ +/* unpublished work. Created 1987, (C) Copyright 1997 Texas Instruments. All */ +/* rights reserved. */ +/* */ +/* */ +/* Filename : abb_inth.c */ +/* */ +/* Description : Functions to manage the ABB device interrupt. */ +/* The Serial Port Interface is used to connect the TI */ +/* Analog BaseBand (ABB). */ +/* It is assumed that the ABB is connected as the SPI */ +/* device 0, and ABB interrupt is mapped as external IT. */ +/* */ +/* Author : Pascal PUEL */ +/* */ +/* Version number : 1.2 */ +/* */ +/* Date and time : 07/02/03 */ +/* */ +/* Previous delta : Creation */ +/* */ +/**********************************************************************************/ +/* */ +/* 17/12/03 */ +/* The original abb_inth.c has been splitted between the actual abb_inth.c */ +/* located in drv_apps directory and abb_inth_core.c located in drv_core */ +/* directory. */ +/* */ +/**********************************************************************************/ + +#include "l1sw.cfg" +#include "chipset.cfg" +#include "swconfig.cfg" +#include "sys.cfg" + + +#include "l1_macro.h" +#include "l1_confg.h" +#include <string.h> +#include "abb/abb_inth.h" +#include "nucleus.h" + +#include "rv/rv_defined_swe.h" // for RVM_PWR_SWE + +#if (CHIPSET == 12) + #include "sys_inth.h" +#else + #include "inth/iq.h" +#endif + +#include "cust_os.h" +#include "l1_signa.h" +#include "abb/abb.h" + +#if defined (OP_WCP) + #include "ffs/ffs.h" + #include "ffs/board/ffspcm.h" +#endif + +#include "rvm/rvm_use_id_list.h" // for SPI_USE_ID +#include "spi/spi_env.h" +#include "spi/spi_process.h" // for ABB_EXT_IRQ_EVT +#include "kpd/kpd_power_api.h" // for kpd_power_key_pressed() +#include "power/power.h" + + +#ifdef RVM_LCC_SWE + #include "lcc/lcc_api.h" + #include "lcc/lcc_cfg_i.h" + #include "lcc/lcc.h" + #include "lcc/lcc_env.h" +#endif +/********************************************************************************/ +/* */ +/* Function Name: spi_abb_read_int_reg_callback */ +/* */ +/* Purpose: Callback function */ +/* Called when an external interrupt has occured and the */ +/* ABB interrupt register has been read. */ +/* */ +/********************************************************************************/ +void spi_abb_read_int_reg_callback(SYS_UWORD16 *read_value) +{ + SYS_UWORD16 loop_count; + SYS_UWORD16 status_value; + xSignalHeaderRec *adc_msg; + volatile SYS_UWORD8 i; + +#ifdef RVM_LCC_SWE + struct pwr_adc_ind_s *addr; + extern T_PWR_CTRL_BLOCK *pwr_ctrl; +#endif + + + // check all the possible causes of the ABB IT + if (*read_value & PUSHOFF_IT_STS) + { + /* Push Button from ON to OFF */ + if (SPI_GBL_INFO_PTR->is_gsm_on == TRUE) + { + NU_Sleep(SHORT_OFF_KEY_PRESSED); + + // WCP Patch + #if (OP_WCP == 1) + // Backup of GSM FFS is remotely handled by MPU-S + // we trigger the backup upon each ON->OFF transition + ffs_backup (); + #else + /* Since this callback function is called from the SPI task + it can't be interrupted by another task + so we can directly access the SPI through the low-level driver */ + + #if ((ANLG_FAM == 1) || (ANLG_FAM == 2)) + status_value = (ABB_Read_Status() & ONREFLT); + #elif (ANLG_FAM == 3) + status_value = (ABB_Read_Register_on_page(PAGE1, VRPCCFG) & PWOND); + #endif + + if (status_value == PWR_OFF_KEY_PRESSED) + { + /* Inform keypad that key ON/OFF has been pressed */ + kpd_power_key_pressed(); + + loop_count = 0; + /* Wait loop for Power-OFF */ + while ((loop_count < OFF_LOOP_COUNT) && + (status_value == PWR_OFF_KEY_PRESSED)) + { + NU_Sleep(SHORT_OFF_KEY_PRESSED); + #if ((ANLG_FAM == 1) || (ANLG_FAM == 2)) + status_value = (ABB_Read_Status() & ONREFLT); + #elif (ANLG_FAM == 3) + status_value = (ABB_Read_Register_on_page(PAGE1, VRPCCFG) & PWOND); + #endif + loop_count++; + } + + if (status_value == PWR_OFF_KEY_PRESSED) /* Power-OFF request detected */ + { + rvf_send_trace("IQ EXT: Power Off request",25, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, SPI_USE_ID); + + Power_OFF_Button(); + } + } + #endif //WCP + } + else /* GSM OFF */ + { + rvf_send_trace("IQ EXT: Power On request",24, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, SPI_USE_ID); + + Power_ON_Button(); + } + } + + else if (*read_value & REMOT_IT_STS) + { + rvf_send_trace("IQ EXT: Power Off remote request",32, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, SPI_USE_ID); + + /* 'Remote Power' from ON to OFF */ + Power_OFF_Remote(); + } + + else if (*read_value & ADCEND_IT_STS) + { + rvf_send_trace("IQ EXT: ADC End",15, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, SPI_USE_ID); + + /* ADC end of conversion */ + ABB_Read_ADC(&SPI_GBL_INFO_PTR->adc_result[0]); + adc_msg = os_alloc_sig(sizeof(T_CST_ADC_RESULT)); + if(adc_msg != NULL) + { + adc_msg->SignalCode = CST_ADC_RESULT; + + for(i=0;i<MADC_NUMBER_OF_MEAS;i++) + { + ((T_CST_ADC_RESULT *)(adc_msg->SigP))->adc_result[i] = SPI_GBL_INFO_PTR->adc_result[i]; + } + os_send_sig(adc_msg, RRM1_QUEUE); +#ifdef RVM_LCC_SWE + // Send ADC measurement to PWR (LCC) task + // NOTE that memory is allocated externally in the PWR task + if (rvf_get_buf(pwr_ctrl->prim_id, sizeof(struct pwr_adc_ind_s), (void *)&addr) == RVF_RED) { + rvf_send_trace("rvf_get_buf failed",18, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID); + /* Unmask External interrupt */ + IQ_Unmask(IQ_EXT); +// rvf_dump_mem(); + return; + } + addr->header.msg_id = PWR_ADC_IND; + addr->header.src_addr_id = SPI_GBL_INFO_PTR->addr_id; + addr->header.dest_addr_id = pwr_ctrl->addr_id; + addr->header.callback_func = NULL; + // FIXME: memcpy from SPI_GBL_INFO_PTR->adc_result - make sure it has not been de-allocated + memcpy(addr->data, SPI_GBL_INFO_PTR->adc_result, 8*2); + addr->data[9] = ABB_Read_Status();; // Read & assign ITSTATREG status so we save the polling in PWR task!! + if (rvf_send_msg(pwr_ctrl->addr_id, addr) != RV_OK) { + rvf_send_trace("SPI FATAL: Send failed!",23, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID); + } +#endif + } + } + +#if (defined(RVM_PWR_SWE) || defined(RVM_LCC_SWE)) + else if (*read_value & CHARGER_IT_STS) + { + /* Charger plug IN or OUT */ +#if ((ANLG_FAM == 1) || (ANLG_FAM == 2)) + status_value = ABB_Read_Status(); +#elif (ANLG_FAM == 3) + status_value = ABB_Read_Register_on_page(PAGE1, VRPCCFG); +#endif + if (status_value & CHGPRES) + { + rvf_send_trace("IQ EXT: Charger Plug",20, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, SPI_USE_ID); +#ifdef RVM_PWR_SWE + PWR_Charger_Plug(); /* charger plugged IN */ +#endif +#ifdef RVM_LCC_SWE + // Forward charger plug indication to PWR (LCC) task + // NOTE that memory is allocated externally in the PWR task + if (rvf_get_buf(pwr_ctrl->prim_id, sizeof(struct pwr_req_s), (void *)&addr) == RVF_RED) { + rvf_send_trace("rvf_get_buf failed#1",20, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID); + rvf_dump_mem(); + } + addr->header.msg_id = PWR_CHARGER_PLUGGED_IND; + addr->header.src_addr_id = SPI_GBL_INFO_PTR->addr_id; + addr->header.dest_addr_id = pwr_ctrl->addr_id; + addr->header.callback_func = NULL; + if (rvf_send_msg(pwr_ctrl->addr_id, addr) != RV_OK) { + rvf_send_trace("SPI FATAL: Send failed!",23, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID); + } +#endif + } + else + { + rvf_send_trace("IQ EXT: Charger Unplug",22, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, SPI_USE_ID); + +#ifdef RVM_PWR_SWE + PWR_Charger_Unplug(); /* charger plugged OUT */ +#endif +#ifdef RVM_LCC_SWE + // Forward charger unplug indication to PWR (LCC) task + // NOTE that memory is allocated externally in the PWR task + if (rvf_get_buf(pwr_ctrl->prim_id, sizeof(struct pwr_req_s), (void *)&addr) == RVF_RED) { + rvf_send_trace("rvf_get_buf failed#2",20, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID); + rvf_dump_mem(); + } + addr->header.msg_id = PWR_CHARGER_UNPLUGGED_IND; + addr->header.src_addr_id = SPI_GBL_INFO_PTR->addr_id; + addr->header.dest_addr_id = pwr_ctrl->addr_id; + addr->header.callback_func = NULL; + if (rvf_send_msg(pwr_ctrl->addr_id, addr) != RV_OK) { + rvf_send_trace("SPI FATAL: Send failed!",23, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID); + } +#endif + } + } + +#endif /* RVM_PWR_SWE || RVM_LCC_SWE */ + + /* Unmask External interrupt */ + #if (CHIPSET == 12) + // Unmask ABB ext interrupt + F_INTH_ENABLE_ONE_IT(C_INTH_ABB_IRQ_IT); + #else + // Unmask external (ABB) interrupt + IQ_Unmask(IQ_EXT); + #endif +}