static vsf_err_t hub_clear_port_feature(struct vsfusbh_t *usbh, struct vsfusbh_urb_t *vsfurb, int port, int feature) { vsfurb->pipe = usb_sndctrlpipe(vsfurb->vsfdev, 0); return vsfusbh_control_msg(usbh, vsfurb, USB_RT_PORT, USB_REQ_CLEAR_FEATURE, feature, port); }
static vsf_err_t hub_get_status(struct vsfusbh_t *usbh, struct vsfusbh_urb_t *vsfurb) { vsfurb->pipe = usb_rcvctrlpipe(vsfurb->vsfdev, 0); return vsfusbh_control_msg(usbh, vsfurb, USB_DIR_IN | USB_RT_HUB, USB_REQ_GET_STATUS, 0, 0); }
static vsf_err_t hub_get_descriptor(struct vsfusbh_t *usbh, struct vsfusbh_urb_t *vsfurb) { vsfurb->pipe = usb_rcvctrlpipe(vsfurb->vsfdev, 0); return vsfusbh_control_msg(usbh, vsfurb, USB_DIR_IN | USB_RT_HUB, USB_REQ_GET_DESCRIPTOR, (USB_DT_HUB << 8), 0); }
static vsf_err_t hub_set_port_feature(struct vsfusbh_t *usbh, struct vsfusbh_urb_t *vsfurb, uint16_t port, uint16_t feature) { vsfurb->pipe = usb_sndctrlpipe(vsfurb->vsfdev, 0); return vsfusbh_control_msg(usbh, vsfurb, USB_RT_PORT, USB_REQ_SET_FEATURE, feature, port); }
vsf_err_t vsfusbh_set_configuration(struct vsfusbh_t *usbh, struct vsfusbh_urb_t *vsfurb, uint8_t configuration) { vsfurb->pipe = usb_sndctrlpipe(vsfurb->vsfdev, 0); return vsfusbh_control_msg(usbh, vsfurb, USB_DIR_OUT, USB_REQ_SET_CONFIGURATION, configuration, 0); }
vsf_err_t vsfusbh_set_interface(struct vsfusbh_t *usbh, struct vsfusbh_urb_t *vsfurb, uint16_t interface, uint16_t alternate) { vsfurb->pipe = usb_sndctrlpipe(vsfurb->vsfdev, 0); return vsfusbh_control_msg(usbh, vsfurb, USB_RECIP_INTERFACE, USB_REQ_SET_INTERFACE, alternate, interface); }
vsf_err_t vsfusbh_get_class_descriptor(struct vsfusbh_t *usbh, struct vsfusbh_urb_t *vsfurb, uint16_t ifnum, uint8_t type, uint8_t id) { vsfurb->pipe = usb_rcvctrlpipe(vsfurb->vsfdev, 0); return vsfusbh_control_msg(usbh, vsfurb, USB_RECIP_INTERFACE | USB_DIR_IN, USB_REQ_GET_DESCRIPTOR, (type << 8) + id, ifnum); }
vsf_err_t vsfusbh_get_descriptor(struct vsfusbh_t *usbh, struct vsfusbh_urb_t *vsfurb, uint8_t type, uint8_t index) { vsfurb->pipe = usb_rcvctrlpipe(vsfurb->vsfdev, 0); return vsfusbh_control_msg(usbh, vsfurb, USB_DIR_IN, USB_REQ_GET_DESCRIPTOR, (type << 8) + index, index); }
vsf_err_t vsfusbh_set_address(struct vsfusbh_t *usbh, struct vsfusbh_urb_t *vsfurb) { vsfurb->pipe = usb_snddefctrl(vsfurb->vsfdev); return vsfusbh_control_msg(usbh, vsfurb, USB_DIR_OUT, USB_REQ_SET_ADDRESS, vsfurb->vsfdev->devnum, 0); }
static vsf_err_t uvc_ctrl_thread(struct vsfsm_pt_t *pt, vsfsm_evt_t evt) { vsf_err_t err; struct vsfusbh_uvc_t *hdata = (struct vsfusbh_uvc_t *)pt->user_data; struct vsfusbh_urb_t *vsfurb = &hdata->ctrl_urb; vsfsm_pt_begin(pt); // reset interfaces 1 (video) vsfurb->transfer_buffer = NULL; vsfurb->transfer_length = 0; err = vsfusbh_set_interface(hdata->usbh, vsfurb, 1, 0); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; // reset interfaces 3 (audio) vsfurb->transfer_buffer = NULL; vsfurb->transfer_length = 0; err = vsfusbh_set_interface(hdata->usbh, vsfurb, 3, 0); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; if (hdata->set_param.connected == 0) { vsfsm_post_evt_pending(&hdata->video_sm, UAV_ISO_DISABLE); vsfsm_post_evt_pending(&hdata->audio_sm, UAV_ISO_DISABLE); return VSFERR_NONE; } if (hdata->set_param.video_enable) { // negotiate hdata->video_iso_packet_len = 800; hdata->video_iso_ep = 1; // commit param vsfurb->transfer_buffer = hdata->ctrl_urb_buf; memcpy(vsfurb->transfer_buffer, negotiate_temp, 26); vsfurb->transfer_length = 26; vsfurb->pipe = usb_sndctrlpipe(vsfurb->vsfdev, 0); err = vsfusbh_control_msg(hdata->usbh, vsfurb, USB_RECIP_INTERFACE | USB_DIR_OUT, SET_CUR, 0x0200, 0x0001); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; // set interfaces vsfurb->transfer_buffer = NULL; vsfurb->transfer_length = 0; err = vsfusbh_set_interface(hdata->usbh, vsfurb, 1, 3); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; // enable video vsfsm_post_evt_pending(&hdata->video_sm, UAV_ISO_ENABLE); } if (hdata->set_param.audio_enable) { // TODO // enable audio vsfsm_post_evt_pending(&hdata->audio_sm, UAV_ISO_ENABLE); } vsfsm_pt_end(pt); return VSFERR_NONE; }
static vsf_err_t uvc_ctrl_thread(struct vsfsm_pt_t *pt, vsfsm_evt_t evt) { vsf_err_t err; struct vsfusbh_uvc_t *hdata = (struct vsfusbh_uvc_t *)pt->user_data; struct vsfusbh_urb_t *vsfurb = &hdata->ctrl_urb; vsfsm_pt_begin(pt); if (hdata->set_param.video_enable) { // negotiate hdata->video_iso_packet_len = 1024; hdata->video_iso_ep = 1; // commit param vsfurb->transfer_buffer = hdata->ctrl_urb_buf; memcpy(vsfurb->transfer_buffer, negotiate_temp, 26); vsfurb->transfer_length = 26; vsfurb->pipe = usb_sndctrlpipe(vsfurb->vsfdev, 0); err = vsfusbh_control_msg(hdata->usbh, vsfurb, USB_TYPE_CLASS |USB_RECIP_INTERFACE | USB_DIR_OUT, SET_CUR, 0x0200, 0x0001); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; // set interfaces vsfurb->transfer_buffer = NULL; vsfurb->transfer_length = 0; err = vsfusbh_set_interface(hdata->usbh, vsfurb, 1, 4); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; // enable video vsfsm_post_evt_pending(&hdata->video_sm, UAV_ISO_ENABLE); } else { vsfurb->transfer_buffer = NULL; vsfurb->transfer_length = 0; err = vsfusbh_set_interface(hdata->usbh, vsfurb, 1, 0); if (err != VSFERR_NONE) return err; vsfsm_pt_wfe(pt, VSFSM_EVT_URB_COMPLETE); if (vsfurb->status != URB_OK) return VSFERR_FAIL; } vsf_bufmgr_free(hdata->ctrl_urb_buf); hdata->ctrl_urb_buf = NULL; memcpy(&hdata->cur_param, &hdata->set_param, sizeof(struct vsfusbh_uvc_param_t)); vsfusbh_uvc_report(hdata, &hdata->cur_param, NULL); vsfsm_pt_end(pt); return VSFERR_NONE; }