/**
  * @brief  USBD_CDC_DataOut
  *         Data received on non-control Out endpoint
  * @param  pdev: device instance
  * @param  epnum: endpoint number
  * @retval status
  */
uint8_t  USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev)
{
    USBD_CDC_HandleTypeDef   *hcdc = pdev->pClassData;

    if(pdev->pClassData != NULL)
    {
        if(hcdc->TxState == 0)
        {

            /* Transmit next packet */
            USBD_LL_Transmit(pdev,
                             CDC_IN_EP,
                             hcdc->TxBuffer,
                             hcdc->TxLength);

            /* Tx Transfer in progress */
            hcdc->TxState = 1;
            //printf("TxS=1; ");
            return USBD_OK;
        }
        else
        {
            return USBD_BUSY;
        }
    }
    else
    {
        return USBD_FAIL;
    }
}
Beispiel #2
0
/**
  * @brief  USBD_CDC_DataOut
  *         Data received on non-control Out endpoint
  * @param  pdev: device instance
  * @param  epnum: endpoint number
  * @retval status
  */
uint8_t  USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t cdc_num)
{      
  USBD_CDC_HandleTypeDef   *hcdc = &((USBD_CDC_HandleTypeDef*) pdev->pClassData)[cdc_num];
  
  if(pdev->pClassData != NULL)
  {
    if(hcdc->TxState == 0)
    {
      /* Tx Transfer in progress */
      hcdc->TxState = 1;
      
      /* Transmit next packet */
      USBD_LL_Transmit(pdev,
                       CDC_IN_EP + cdc_num * 2,
                       hcdc->TxBuffer,
                       hcdc->TxLength);
      
      return USBD_OK;
    }
    else
    {
      return USBD_BUSY;
    }
  }
  else
  {
    return USBD_FAIL;
  }
}
Beispiel #3
0
/**
* @brief  USBD_CtlContinueSendData
*         continue sending data on the ctl pipe
* @param  pdev: device instance
* @param  buff: pointer to data buffer
* @param  len: length of data to be sent
* @retval status
*/
USBD_StatusTypeDef  USBD_CtlContinueSendData (USBD_HandleTypeDef  *pdev, 
                                       uint8_t *pbuf,
                                       uint16_t len)
{
 /* Start the next transfer */
  USBD_LL_Transmit (pdev, 0x00, pbuf, len);   
  
  return USBD_OK;
}
Beispiel #4
0
/**
 * @brief  USBD_CtlSendData
 *         send data on the ctl pipe
 * @param  pdev: device instance
 * @param  buff: pointer to data buffer
 * @param  len: length of data to be sent
 * @retval status
 */
USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint16_t len) {
	/* Set EP0 State */
	pdev->ep0_state = USBD_EP0_DATA_IN;
	pdev->ep_in[0].total_length = len;
	pdev->ep_in[0].rem_length = len;
	/* Start the transfer */
	USBD_LL_Transmit(pdev, 0x00, pbuf, len);

	return USBD_OK;
}
Beispiel #5
0
/**
 * @brief  USBD_CtlSendStatus
 *         send zero lzngth packet on the ctl pipe
 * @param  pdev: device instance
 * @retval status
 */
USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev) {

	/* Set EP0 State */
	pdev->ep0_state = USBD_EP0_STATUS_IN;

	/* Start the transfer */
	USBD_LL_Transmit(pdev, 0x00, NULL, 0);

	return USBD_OK;
}
/**
* @brief  MSC_BOT_SendData
*         Send the requested data
* @param  pdev: device instance
* @param  buf: pointer to data buffer
* @param  len: Data Length
* @retval None
*/
static void  MSC_BOT_SendData(USBD_HandleTypeDef  *pdev,
                              uint8_t* buf, 
                              uint16_t len)
{
  USBD_MSC_BOT_HandleTypeDef  *hmsc = pdev->pClassData; 
  
  len = MIN (hmsc->cbw.dDataLength, len);
  hmsc->csw.dDataResidue -= len;
  hmsc->csw.bStatus = USBD_CSW_CMD_PASSED;
  hmsc->bot_state = USBD_BOT_SEND_DATA;
  
  USBD_LL_Transmit (pdev, MSC_EPIN_ADDR, buf, len);  
}
Beispiel #7
0
/**
  * @brief  CDC_Transmit_FS
  *         Data send over USB IN endpoint are sent over CDC interface 
  *         through this function.           
  *         @note
  *         
  *                 
  * @param  Buf: Buffer of data to be send
  * @param  Len: Number of data to be send (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
  */
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */ 
    USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
    
    if(hcdc == NULL) return USBD_FAIL;
    
    // CDC open delay
    if(CDC_Open)
    {
        if(OpenDiffTime < 200)
        {
            OpenDiffTime = HAL_GetTick() - OpenRefTime;
            return USBD_BUSY;
        }
    }
    else
    {
        OpenRefTime = HAL_GetTick();
        OpenDiffTime = 0;
        return USBD_BUSY;
    }
    
    if (hcdc->TxState != 0)
    {
        return USBD_BUSY;
    }
    
    if(Len == 0)
    {
        return USBD_OK;
    }
    
    /* Tx Transfer in progress */
    hcdc->TxState = 1;

    hcdc->TxBuffer = Buf;
    hcdc->TxLength = Len;
    
    /* Transmit next packet */
    USBD_LL_Transmit(&hUsbDeviceFS,
                   CDC_IN_EP,
                   hcdc->TxBuffer,
                   hcdc->TxLength);
    
  /* USER CODE END 7 */ 
  return result;
}
Beispiel #8
0
static uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, unsigned index, uint16_t offset, uint16_t length)
{      
  USBD_StatusTypeDef outcome;

  if (context[index].InboundTransferInProgress)
    return USBD_BUSY;

  /* Transmit next packet */
  outcome = USBD_LL_Transmit(pdev, parameters[index].data_in_ep, (uint8_t *)(context[index].InboundBuffer) + offset, length);
  
  if (USBD_OK == outcome)
  {
    /* Tx Transfer in progress */
    context[index].InboundTransferInProgress = 1;
  }

  return outcome;
}
Beispiel #9
0
/**
  * @brief  USBD_CDC_DataOut
  *         Data received on non-control Out endpoint
  * @param  pdev: device instance
  * @param  epnum: endpoint number
  * @retval status
  */
uint8_t  USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t endpoint_pair)
{      
  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;
  
  if(pdev->pClassData != NULL)
  {
    // Select Endpoint
    USBD_CDC_EP_HandleTypeDef* hEP_Tx;
    uint8_t in_ep;
    if (endpoint_pair == CDC_OUT_EP) {
      hEP_Tx = &hcdc->CDC_Tx;
      in_ep = CDC_IN_EP;
    } else if (endpoint_pair == ODRIVE_OUT_EP) {
      hEP_Tx = &hcdc->ODRIVE_Tx;
      in_ep = ODRIVE_IN_EP;
    } else {
      return USBD_FAIL;
    }

    if(hEP_Tx->State == 0)
    {
      /* Tx Transfer in progress */
      hEP_Tx->State = 1;
      
      /* Transmit next packet */
      USBD_LL_Transmit(pdev,
                      in_ep,
                      hEP_Tx->Buffer,
                      hEP_Tx->Length);

      return USBD_OK;
    }
    else
    {
      return USBD_BUSY;
    }
  }
  else
  {
    return USBD_FAIL;
  }
}
/**
* @brief  MSC_BOT_SendCSW
*         Send the Command Status Wrapper
* @param  pdev: device instance
* @param  status : CSW status
* @retval None
*/
void  MSC_BOT_SendCSW (USBD_HandleTypeDef  *pdev,
                              uint8_t CSW_Status)
{
  USBD_MSC_BOT_HandleTypeDef  *hmsc = pdev->pClassData; 
  
  hmsc->csw.dSignature = USBD_BOT_CSW_SIGNATURE;
  hmsc->csw.bStatus = CSW_Status;
  hmsc->bot_state = USBD_BOT_IDLE;
  
  USBD_LL_Transmit (pdev, 
             MSC_EPIN_ADDR, 
             (uint8_t *)&hmsc->csw, 
             USBD_BOT_CSW_LENGTH);
  
  /* Prapare EP to Receive next Cmd */
  USBD_LL_PrepareReceive (pdev,
                    MSC_EPOUT_ADDR,
                    (uint8_t *)&hmsc->cbw, 
                    USBD_BOT_CBW_LENGTH);  
  
}
Beispiel #11
0
// Handle read process
// input:
//   pdev - pointer to the USB device handle
//   lun - logical unit number
static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) {
	USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData;
	uint32_t len;

	len = MIN(hmsc->scsi_blk_len,MSC_MEDIA_PACKET);
	if (((USBD_StorageTypeDef *)pdev->pUserData)->Read(lun,hmsc->bot_data,hmsc->scsi_blk_addr / hmsc->scsi_blk_size,len / hmsc->scsi_blk_size) < 0) {
		SCSI_SenseCode(pdev,lun,HARDWARE_ERROR,UNRECOVERED_READ_ERROR);

		return -1;
	}
	USBD_LL_Transmit(pdev,MSC_EPIN_ADDR,hmsc->bot_data,len);

	hmsc->scsi_blk_addr += len;
	hmsc->scsi_blk_len  -= len;

	// case 6 : Hi = Di
	hmsc->csw.dDataResidue -= len;
	if (hmsc->scsi_blk_len == 0) hmsc->bot_state = USBD_BOT_LAST_DATA_IN;

	return 0;
}