u32 vcd_decode_frame(void *handle, struct vcd_frame_data_type *p_input_frame) { struct vcd_clnt_ctxt_type_t *p_cctxt = (struct vcd_clnt_ctxt_type_t *)handle; struct vcd_drv_ctxt_type_t *p_drv_ctxt; u32 rc; VCD_MSG_MED("vcd_decode_frame:"); if (NULL == p_cctxt || p_cctxt->n_signature != VCD_SIGNATURE) { VCD_MSG_ERROR("Bad client handle"); return VCD_ERR_BAD_HANDLE; } if (NULL == p_input_frame) { VCD_MSG_ERROR("Bad parameters"); return VCD_ERR_BAD_POINTER; } p_drv_ctxt = vcd_get_drv_context(); vcd_critical_section_enter(p_drv_ctxt->dev_cs); if (p_cctxt->clnt_state.p_state_table->ev_hdlr.pf_decode_frame) { rc = p_cctxt->clnt_state.p_state_table->ev_hdlr. pf_decode_frame(p_cctxt, p_input_frame); } else { VCD_MSG_ERROR("Unsupported API in client state %d", p_cctxt->clnt_state.e_state); rc = VCD_ERR_BAD_STATE; } vcd_critical_section_leave(p_drv_ctxt->dev_cs); return rc; }
u32 vcd_term(s32 driver_handle) { u32 rc = VCD_S_SUCCESS; struct vcd_drv_ctxt_type_t *p_drv_ctxt; VCD_MSG_MED("vcd_term:"); p_drv_ctxt = vcd_get_drv_context(); if (NULL == p_drv_ctxt->dev_cs) { VCD_MSG_ERROR("No critical section object"); return VCD_ERR_BAD_STATE; } vcd_critical_section_enter(p_drv_ctxt->dev_cs); if (p_drv_ctxt->dev_state.p_state_table->ev_hdlr.pf_term) { rc = p_drv_ctxt->dev_state.p_state_table->ev_hdlr. pf_term(p_drv_ctxt, driver_handle); } else { VCD_MSG_ERROR("Unsupported API in device state %d", p_drv_ctxt->dev_state.e_state); rc = VCD_ERR_BAD_STATE; } vcd_critical_section_leave(p_drv_ctxt->dev_cs); if (VCD_DEVICE_STATE_NULL == p_drv_ctxt->dev_state.e_state) { VCD_MSG_HIGH ("Device in NULL state. Releasing critical section"); vcd_critical_section_release(p_drv_ctxt->dev_cs); p_drv_ctxt->dev_cs = NULL; } return rc; }
u32 vcd_stop(void *handle) { struct vcd_clnt_ctxt_type_t *p_cctxt = (struct vcd_clnt_ctxt_type_t *)handle; struct vcd_drv_ctxt_type_t *p_drv_ctxt; u32 rc; VCD_MSG_MED("vcd_stop:"); if (!p_cctxt || p_cctxt->n_signature != VCD_SIGNATURE) { VCD_MSG_ERROR("Bad client handle"); return VCD_ERR_BAD_HANDLE; } p_drv_ctxt = vcd_get_drv_context(); vcd_critical_section_enter(p_drv_ctxt->dev_cs); if (p_cctxt->clnt_state.p_state_table->ev_hdlr.pf_stop && p_drv_ctxt->dev_ctxt.e_pwr_state != VCD_PWR_STATE_SLEEP) { rc = p_cctxt->clnt_state.p_state_table->ev_hdlr. pf_stop(p_cctxt); } else { VCD_MSG_ERROR ("Unsupported API in dev power state %d OR client state %d", p_drv_ctxt->dev_ctxt.e_pwr_state, p_cctxt->clnt_state.e_state); rc = VCD_ERR_BAD_STATE; } vcd_critical_section_leave(p_drv_ctxt->dev_cs); return rc; }
u32 vcd_init(struct vcd_init_config_type *p_config, s32 *p_driver_handle) { u32 rc = VCD_S_SUCCESS; struct vcd_drv_ctxt_type_t *p_drv_ctxt; VCD_MSG_MED("vcd_init:"); if (!p_config || !p_driver_handle || !p_config->pf_map_dev_base_addr) { VCD_MSG_ERROR("Bad parameters"); return VCD_ERR_ILLEGAL_PARM; } p_drv_ctxt = vcd_get_drv_context(); if (!p_drv_ctxt->dev_cs) vcd_critical_section_create(&p_drv_ctxt->dev_cs); vcd_critical_section_enter(p_drv_ctxt->dev_cs); if (p_drv_ctxt->dev_state.p_state_table->ev_hdlr.pf_init) { rc = p_drv_ctxt->dev_state.p_state_table->ev_hdlr. pf_init(p_drv_ctxt, p_config, p_driver_handle); } else { VCD_MSG_ERROR("Unsupported API in device state %d", p_drv_ctxt->dev_state.e_state); rc = VCD_ERR_BAD_STATE; } vcd_critical_section_leave(p_drv_ctxt->dev_cs); return rc; }