FreeCalypso > hg > fc-tourmaline
view src/cs/drivers/drv_app/fchg/fchg_api.c @ 304:58c7961bd0b0 default tip
TCH tap: extend DL sniffing feature to support CSD modes
Our debug feature for TCH DL sniffing reads the content of the DSP's
a_dd_0 buffer (or a_dd_1 for TCH/H subchannel 1) at appropriate times
and forwards captured bits to the host. This feature was originally
implemented for TCH/FS, TCH/EFS and TCH/HS - now extend it to cover
TCH/F data modes too.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 25 Nov 2024 23:33:27 +0000 |
parents | 769cf6273fe4 |
children |
line wrap: on
line source
/* * The implementation of our external API functions lives here. */ #include "fchg/fchg_api.h" #include "fchg/fchg_env.h" #include "fchg/fchg_messages.h" #include "rv/rv_general.h" #include "rvf/rvf_api.h" #include "rvm/rvm_use_id_list.h" T_RV_RET fchg_get_current_state(struct fchg_user_state *rstruct) { UINT16 curr_disch_thresh; INT16 ichg_temp; if (!pwr_ctrl) return RV_NOT_READY; rstruct->chg_state = pwr_ctrl->state; rstruct->batt_mv = pwr_ctrl->batt_mv; curr_disch_thresh = pwr_ctrl->curr_disch_thresh; rstruct->batt_percent = pwr_ctrl->batt.percent_thresh[curr_disch_thresh].remain_capa; switch (rstruct->chg_state) { case FCHG_STATE_CI_CHARGING: ichg_temp = pwr_ctrl->ci_ichg - pwr_ctrl->i2v_offset; if (ichg_temp < 0) ichg_temp = 0; rstruct->ichg = ichg_temp; rstruct->batt_bars = FCHG_BATT_BARS_CHARGING; break; case FCHG_STATE_CV_CHARGING: ichg_temp = pwr_ctrl->ichg_average - pwr_ctrl->i2v_offset; if (ichg_temp < 0) ichg_temp = 0; rstruct->ichg = ichg_temp; rstruct->batt_bars = FCHG_BATT_BARS_CHARGING; break; default: rstruct->ichg = 0; if (curr_disch_thresh <= pwr_ctrl->batt.bars_thresh[0]) rstruct->batt_bars = 4; else if (curr_disch_thresh <= pwr_ctrl->batt.bars_thresh[1]) rstruct->batt_bars = 3; else if (curr_disch_thresh <= pwr_ctrl->batt.bars_thresh[2]) rstruct->batt_bars = 2; else if (curr_disch_thresh <= pwr_ctrl->batt.bars_thresh[3]) rstruct->batt_bars = 1; else rstruct->batt_bars = 0; } return RV_OK; } T_RV_RET fchg_user_charge_control(enum fchg_user_charge_ctrl arg) { enum pwr_msg_id msg_id; struct pwr_req_s *msg; if (!pwr_ctrl) return RV_NOT_READY; switch (arg) { case FCHG_CHARGE_START: if (!pwr_ctrl->config_present && !pwr_ctrl->bsim_mode) return RV_NOT_READY; msg_id = USER_START_CHARGE_REQ; break; case FCHG_CHARGE_STOP: msg_id = USER_STOP_CHARGE_REQ; break; default: return RV_INVALID_PARAMETER; } if (rvf_get_buf(pwr_ctrl->prim_id, sizeof(struct pwr_req_s), (T_RVF_BUFFER **)&msg) == RVF_RED) { rvf_send_trace( "rvf_get_buf() failed in fchg_user_charge_control()", 50, NULL_PARAM, RV_TRACE_LEVEL_ERROR, FCHG_USE_ID); return RV_MEMORY_ERR; } msg->header.msg_id = msg_id; msg->header.src_addr_id = pwr_ctrl->addr_id; msg->header.dest_addr_id = pwr_ctrl->addr_id; msg->header.callback_func = NULL; if (rvf_send_msg(pwr_ctrl->addr_id, msg) != RV_OK) { rvf_send_trace("fchg_user_charge_control(): Send failed!", 40, NULL_PARAM, RV_TRACE_LEVEL_ERROR, FCHG_USE_ID); rvf_free_buf(msg); return RV_INTERNAL_ERR; } return RV_OK; } T_RV_RET fchg_register_event_handler(T_FCHG_EVENT_HANDLER handler) { if (!pwr_ctrl) return RV_NOT_READY; pwr_ctrl->event_handler = handler; return RV_OK; }