예제 #1
0
파일: vcd_api.c 프로젝트: Sikyou/s7_kernel
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;

}
예제 #2
0
파일: vcd_api.c 프로젝트: Sikyou/s7_kernel
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;

}
예제 #3
0
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;

}
예제 #4
0
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;

}