您的位置:首页 > Web前端

STM32 USB Host Library 学习笔记 (2) USBH_InterruptSendData() USBH_ClrFeature()

2012-09-01 23:32 651 查看
/**
* @brief  USBH_InterruptSendData
*         Sends the data on Interrupt OUT Endpoint
* @param  pdev: Selected device
* @param  buff: Buffer pointer from where the data needs to be copied
* @param  length: Length of the data to be sent
* @param  hc_num: Host channel Number
* @retval Status.
*/
USBH_Status USBH_InterruptSendData( USB_OTG_CORE_HANDLE *pdev,
uint8_t *buff,
uint8_t length,
uint8_t hc_num)
{

pdev->host.hc[hc_num].ep_is_in = 0;
pdev->host.hc[hc_num].xfer_buff = buff;
pdev->host.hc[hc_num].xfer_len = length;

if(pdev->host.hc[hc_num].toggle_in == 0)
{
pdev->host.hc[hc_num].data_pid = HC_PID_DATA0;
}
else
{
pdev->host.hc[hc_num].data_pid = HC_PID_DATA1;
}

pdev->host.hc[hc_num].toggle_in ^= 1;

HCD_SubmitRequest (pdev , hc_num);

return USBH_OK;
}


toggle_in or toggle_out ?

/**
* @brief  USBH_BulkSendData
*         Sends the Bulk Packet to the device
* @param  pdev: Selected device
* @param  buff: Buffer pointer from which the Data will be sent to Device
* @param  length: Length of the data to be sent
* @param  hc_num: Host channel Number
* @retval Status
*/
USBH_Status USBH_BulkSendData ( USB_OTG_CORE_HANDLE *pdev,
uint8_t *buff,
uint16_t length,
uint8_t hc_num)
{
pdev->host.hc[hc_num].ep_is_in = 0;
pdev->host.hc[hc_num].xfer_buff = buff;
pdev->host.hc[hc_num].xfer_len = length;

/* Set the Data Toggle bit as per the Flag */
if ( pdev->host.hc[hc_num].toggle_out == 0)
{ /* Put the PID 0 */
pdev->host.hc[hc_num].data_pid = HC_PID_DATA0;
}
else
{ /* Put the PID 1 */
pdev->host.hc[hc_num].data_pid = HC_PID_DATA1 ;
}

HCD_SubmitRequest (pdev , hc_num);
return USBH_OK;
}


else if (hcint.b.chhltd) // usb_hcd_int.c
{
MASK_HOST_INT_CHH (num);

if(pdev->host.HC_Status[num] == HC_XFRC)
{
pdev->host.URB_State[num] = URB_DONE;

if (hcchar.b.eptype == EP_TYPE_BULK)
{
 pdev->host.hc[num].toggle_out ^= 1; 
}
}
}


/**
* @brief  USBH_ClrFeature
*         This request is used to clear or disable a specific feature.

* @param  pdev: Selected device
* @param  ep_num: endpoint number
* @param  hc_num: Host channel number
* @retval Status
*/
USBH_Status USBH_ClrFeature(USB_OTG_CORE_HANDLE *pdev,
USBH_HOST *phost,
uint8_t ep_num,
uint8_t hc_num)
{

phost->Control.setup.b.bmRequestType = USB_H2D |
USB_REQ_RECIPIENT_ENDPOINT |
USB_REQ_TYPE_STANDARD;

phost->Control.setup.b.bRequest = USB_REQ_CLEAR_FEATURE;
phost->Control.setup.b.wValue.w = FEATURE_SELECTOR_ENDPOINT;
phost->Control.setup.b.wIndex.w = ep_num;
phost->Control.setup.b.wLength.w = 0;

if ((ep_num & USB_REQ_DIR_MASK ) == USB_D2H)
{ /* EP Type is IN */
pdev->host.hc[hc_num].toggle_in = 0;
   }
else
{/* EP Type is OUT */
pdev->host.hc[hc_num].toggle_out = 0;
   }

return USBH_CtlReq(pdev, phost, 0 , 0 );
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: