broken things buuuu
This commit is contained in:
@@ -70,12 +70,24 @@
|
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include <utils/hexdump.h>
|
||||
#include "stm32f0xx_hal.h"
|
||||
#include "stdbool.h"
|
||||
|
||||
/** @addtogroup STM32F0xx_HAL_Driver
|
||||
* @{
|
||||
*/
|
||||
|
||||
static inline void dbgShowTog(PCD_HandleTypeDef *hpcd, bool strobe)
|
||||
{
|
||||
PCD_EPTypeDef *ep = &hpcd->IN_ep[2];
|
||||
|
||||
uint32_t v = (GPIOB->ODR & ~0b111);
|
||||
if ((PCD_GET_ENDPOINT(hpcd->Instance, ep->num)& USB_EP_DTOG_TX) == USB_EP_DTOG_TX) v |= 1;
|
||||
if ((PCD_GET_ENDPOINT(hpcd->Instance, ep->num)& USB_EP_DTOG_RX) == USB_EP_DTOG_RX) v |= 2;
|
||||
GPIOB->ODR = v;
|
||||
}
|
||||
|
||||
#ifdef HAL_PCD_MODULE_ENABLED
|
||||
|
||||
#if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB)|| defined(STM32F070x6)
|
||||
@@ -738,12 +750,16 @@ HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint
|
||||
/* Clear the data toggle bits for the endpoint IN/OUT*/
|
||||
PCD_CLEAR_RX_DTOG(hpcd->Instance, ep->num)
|
||||
PCD_CLEAR_TX_DTOG(hpcd->Instance, ep->num)
|
||||
|
||||
PCD_RX_DTOG(hpcd->Instance, ep->num);
|
||||
|
||||
/* Configure DISABLE status for the Endpoint*/
|
||||
PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_DIS)
|
||||
PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_DIS)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dbgShowTog(hpcd, false);
|
||||
|
||||
__HAL_UNLOCK(hpcd);
|
||||
return ret;
|
||||
@@ -903,7 +919,7 @@ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,
|
||||
ep->xfer_count = 0U;
|
||||
ep->is_in = 1U;
|
||||
ep->num = ep_addr & 0x7FU;
|
||||
|
||||
|
||||
/*Multi packet transfer*/
|
||||
if (ep->xfer_len > ep->maxpacket)
|
||||
{
|
||||
@@ -925,23 +941,25 @@ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,
|
||||
else
|
||||
{
|
||||
/*Write the data to the USB endpoint*/
|
||||
if ((PCD_GET_ENDPOINT(hpcd->Instance, ep->num)& USB_EP_DTOG_TX) == USB_EP_DTOG_TX)
|
||||
if ((PCD_GET_ENDPOINT(hpcd->Instance, ep->num)& USB_EP_DTOG_RX) == USB_EP_DTOG_RX)
|
||||
{
|
||||
/*Set the Double buffer counter for pmabuffer1*/
|
||||
PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, len)
|
||||
pmabuffer = ep->pmaaddr1;
|
||||
/*Set the Double buffer counter for pmabuffer0*/
|
||||
PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, len)
|
||||
pmabuffer = ep->pmaaddr0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*Set the Double buffer counter for pmabuffer0*/
|
||||
PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, len)
|
||||
pmabuffer = ep->pmaaddr0;
|
||||
/*Set the Double buffer counter for pmabuffer1*/
|
||||
PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, len)
|
||||
pmabuffer = ep->pmaaddr1;
|
||||
}
|
||||
|
||||
PCD_WritePMA(hpcd->Instance, ep->xfer_buff, pmabuffer, (uint16_t) len);
|
||||
PCD_FreeUserBuffer(hpcd->Instance, ep->num, ep->is_in)
|
||||
}
|
||||
|
||||
dbgShowTog(hpcd, false);
|
||||
|
||||
PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_VALID)
|
||||
|
||||
return HAL_OK;
|
||||
@@ -1192,10 +1210,14 @@ static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd)
|
||||
uint8_t EPindex;
|
||||
__IO uint16_t wIstr;
|
||||
__IO uint16_t wEPVal = 0U;
|
||||
|
||||
|
||||
GPIOB->ODR |= 4;
|
||||
for(volatile i=0;i<20;i++);
|
||||
GPIOB->ODR &= ~4;
|
||||
/* stay in loop while pending interrupts */
|
||||
while (((wIstr = hpcd->Instance->ISTR) & USB_ISTR_CTR) != 0U)
|
||||
{
|
||||
|
||||
/* extract highest priority endpoint number */
|
||||
EPindex = (uint8_t)(wIstr & USB_ISTR_EP_ID);
|
||||
|
||||
@@ -1376,6 +1398,7 @@ static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd)
|
||||
ep->xfer_count = PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);
|
||||
|
||||
#else
|
||||
uint8_t tmpbuf[64];
|
||||
/* IN double Buffering*/
|
||||
if (ep->doublebuffer == 0U)
|
||||
{
|
||||
@@ -1383,21 +1406,34 @@ static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd)
|
||||
}
|
||||
else
|
||||
{
|
||||
// NOTE: DTOG is inverted by the device at the end of a transaction
|
||||
|
||||
if ((PCD_GET_ENDPOINT(hpcd->Instance, ep->num)& USB_EP_DTOG_TX) == USB_EP_DTOG_TX)
|
||||
{
|
||||
/*read from endpoint BUF0Addr buffer*/
|
||||
ep->xfer_count = PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num);
|
||||
|
||||
// PCD_ReadPMA(hpcd->Instance, tmpbuf, ep->pmaaddr0, ep->xfer_count);
|
||||
// hexDump("buf0", tmpbuf, ep->xfer_count);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*read from endpoint BUF1Addr buffer*/
|
||||
ep->xfer_count = PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num);
|
||||
|
||||
// PCD_ReadPMA(hpcd->Instance, tmpbuf, ep->pmaaddr1, ep->xfer_count);
|
||||
// hexDump("buf1", tmpbuf, ep->xfer_count);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// dbg("ISR: ep %02x Xferd %db, remain %d", ep->num, ep->xfer_count, ep->xfer_len);
|
||||
|
||||
ep->xfer_buff+=ep->xfer_count;
|
||||
|
||||
|
||||
if(ep->num==2) dbgShowTog(hpcd, true);
|
||||
|
||||
/* Zero Length Packet? <- what? */
|
||||
if (ep->xfer_len == 0U)
|
||||
{
|
||||
@@ -1406,6 +1442,7 @@ static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd)
|
||||
}
|
||||
else
|
||||
{
|
||||
trap("multipart!");
|
||||
HAL_PCD_EP_Transmit(hpcd, ep->num, ep->xfer_buff, ep->xfer_len);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user