clean up dcd_edpt_stall/clear_statll
This commit is contained in:
@@ -375,7 +375,7 @@ static void dcd_ep_ctr_rx_handler(uint32_t ep_id) {
|
|||||||
} else {
|
} else {
|
||||||
ep_reg &= USB_EPRX_STAT | USB_EPREG_MASK; // reversed all toggle except RX Status
|
ep_reg &= USB_EPRX_STAT | USB_EPREG_MASK; // reversed all toggle except RX Status
|
||||||
|
|
||||||
bool const is_iso = (ep_reg & USB_EP_TYPE_MASK) == USB_EP_ISOCHRONOUS;
|
bool const is_iso = ep_is_iso(ep_reg);
|
||||||
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
||||||
|
|
||||||
uint8_t buf_id;
|
uint8_t buf_id;
|
||||||
@@ -748,9 +748,8 @@ static void dcd_transmit_packet(xfer_ctl_t *xfer, uint16_t ep_ix) {
|
|||||||
dcd_int_enable(0);
|
dcd_int_enable(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool edpt_xfer(uint8_t rhport, uint8_t ep_addr)
|
static bool edpt_xfer(uint8_t rhport, uint8_t ep_addr) {
|
||||||
{
|
(void) rhport;
|
||||||
(void)rhport;
|
|
||||||
|
|
||||||
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
||||||
uint8_t const ep_idx = xfer->ep_idx;
|
uint8_t const ep_idx = xfer->ep_idx;
|
||||||
@@ -762,7 +761,7 @@ static bool edpt_xfer(uint8_t rhport, uint8_t ep_addr)
|
|||||||
uint32_t cnt = (uint32_t) tu_min16(xfer->total_len, xfer->max_packet_size);
|
uint32_t cnt = (uint32_t) tu_min16(xfer->total_len, xfer->max_packet_size);
|
||||||
uint16_t ep_reg = pcd_get_endpoint(USB, ep_idx);
|
uint16_t ep_reg = pcd_get_endpoint(USB, ep_idx);
|
||||||
|
|
||||||
if ((ep_reg & USB_EP_TYPE_MASK) == USB_EP_ISOCHRONOUS) {
|
if (ep_is_iso(ep_reg)) {
|
||||||
btable_set_rx_bufsize(ep_idx, 0, cnt);
|
btable_set_rx_bufsize(ep_idx, 0, cnt);
|
||||||
btable_set_rx_bufsize(ep_idx, 1, cnt);
|
btable_set_rx_bufsize(ep_idx, 1, cnt);
|
||||||
} else {
|
} else {
|
||||||
@@ -775,10 +774,8 @@ static bool edpt_xfer(uint8_t rhport, uint8_t ep_addr)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
|
bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes) {
|
||||||
{
|
|
||||||
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
||||||
|
|
||||||
xfer->buffer = buffer;
|
xfer->buffer = buffer;
|
||||||
xfer->ff = NULL;
|
xfer->ff = NULL;
|
||||||
xfer->total_len = total_bytes;
|
xfer->total_len = total_bytes;
|
||||||
@@ -787,8 +784,7 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t to
|
|||||||
return edpt_xfer(rhport, ep_addr);
|
return edpt_xfer(rhport, ep_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes)
|
bool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes) {
|
||||||
{
|
|
||||||
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
||||||
xfer->buffer = NULL;
|
xfer->buffer = NULL;
|
||||||
xfer->ff = ff;
|
xfer->ff = ff;
|
||||||
@@ -798,19 +794,19 @@ bool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t
|
|||||||
return edpt_xfer(rhport, ep_addr);
|
return edpt_xfer(rhport, ep_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)
|
void dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {
|
||||||
{
|
|
||||||
(void)rhport;
|
(void)rhport;
|
||||||
|
|
||||||
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
||||||
uint8_t const ep_idx = xfer->ep_idx;
|
uint8_t const ep_idx = xfer->ep_idx;
|
||||||
uint8_t const dir = tu_edpt_dir(ep_addr);
|
uint8_t const dir = tu_edpt_dir(ep_addr);
|
||||||
|
|
||||||
if (dir == TUSB_DIR_IN) {
|
uint32_t ep_reg = pcd_get_endpoint(USB, ep_idx);
|
||||||
pcd_set_ep_tx_status(USB, ep_idx, USB_EP_TX_STALL);
|
ep_reg |= USB_EP_CTR_RX | USB_EP_CTR_TX; // reserve CTR bits
|
||||||
} else {
|
ep_reg &= USB_EPREG_MASK | EP_STAT_MASK(dir);
|
||||||
pcd_set_ep_rx_status(USB, ep_idx, USB_EP_RX_STALL);
|
ep_reg = ep_add_status(ep_reg, dir, EP_STAT_STALL);
|
||||||
}
|
|
||||||
|
pcd_set_endpoint(USB, ep_idx, ep_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {
|
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {
|
||||||
@@ -819,23 +815,16 @@ void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {
|
|||||||
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
xfer_ctl_t *xfer = xfer_ctl_ptr(ep_addr);
|
||||||
uint8_t const ep_idx = xfer->ep_idx;
|
uint8_t const ep_idx = xfer->ep_idx;
|
||||||
uint8_t const dir = tu_edpt_dir(ep_addr);
|
uint8_t const dir = tu_edpt_dir(ep_addr);
|
||||||
|
uint32_t ep_reg = pcd_get_endpoint(USB, ep_idx);
|
||||||
|
ep_reg |= USB_EP_CTR_RX | USB_EP_CTR_TX; // reserve CTR bits
|
||||||
|
ep_reg &= USB_EPREG_MASK | EP_STAT_MASK(dir) | EP_DTOG_MASK(dir);
|
||||||
|
|
||||||
// uint32_t ep_reg = pcd_get_endpoint(USB, ep_idx);
|
if (!ep_is_iso(ep_reg)) {
|
||||||
|
ep_reg = ep_add_status(ep_reg, dir, EP_STAT_NAK);
|
||||||
if (dir == TUSB_DIR_IN) { // IN
|
|
||||||
if (pcd_get_eptype(USB, ep_idx) != USB_EP_ISOCHRONOUS) {
|
|
||||||
pcd_set_ep_tx_status(USB, ep_idx, USB_EP_TX_NAK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reset to DATA0 if clearing stall condition. */
|
|
||||||
pcd_clear_tx_dtog(USB, ep_idx);
|
|
||||||
} else { // OUT
|
|
||||||
if (pcd_get_eptype(USB, ep_idx) != USB_EP_ISOCHRONOUS) {
|
|
||||||
pcd_set_ep_rx_status(USB, ep_idx, USB_EP_RX_NAK);
|
|
||||||
}
|
|
||||||
/* Reset to DATA0 if clearing stall condition. */
|
|
||||||
pcd_clear_rx_dtog(USB, ep_idx);
|
|
||||||
}
|
}
|
||||||
|
ep_reg = ep_add_dtog(ep_reg, dir, 0); // Reset to DATA0
|
||||||
|
|
||||||
|
pcd_set_endpoint(USB, ep_idx, ep_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FSDEV_BUS_32BIT
|
#ifdef FSDEV_BUS_32BIT
|
||||||
|
@@ -159,6 +159,9 @@ typedef enum {
|
|||||||
EP_STAT_VALID = 3
|
EP_STAT_VALID = 3
|
||||||
}ep_stat_t;
|
}ep_stat_t;
|
||||||
|
|
||||||
|
#define EP_STAT_MASK(_dir) (3u << (USB_EPTX_STAT_Pos + ((_dir) == TUSB_DIR_IN ? 0 : 8)))
|
||||||
|
#define EP_DTOG_MASK(_dir) (1u << (USB_EP_DTOG_TX_Pos + ((_dir) == TUSB_DIR_IN ? 0 : 8)))
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// BTable
|
// BTable
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
@@ -274,26 +277,6 @@ TU_ATTR_ALWAYS_INLINE static inline void pcd_set_eptype(USB_TypeDef * USBx, uint
|
|||||||
pcd_set_endpoint(USBx, bEpIdx, regVal);
|
pcd_set_endpoint(USBx, bEpIdx, regVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
TU_ATTR_ALWAYS_INLINE static inline uint32_t pcd_get_eptype(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
|
||||||
uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
|
||||||
regVal &= USB_EP_T_FIELD;
|
|
||||||
return regVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Clears bit CTR_RX / CTR_TX in the endpoint register.
|
|
||||||
* @param USBx USB peripheral instance register address.
|
|
||||||
* @param bEpIdx Endpoint Number.
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
TU_ATTR_ALWAYS_INLINE static inline void pcd_clear_rx_ep_ctr(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
|
||||||
uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
|
||||||
regVal &= USB_EPREG_MASK;
|
|
||||||
regVal &= ~USB_EP_CTR_RX;
|
|
||||||
regVal |= USB_EP_CTR_TX; // preserve CTR_TX (clears on writing 0)
|
|
||||||
pcd_set_endpoint(USBx, bEpIdx, regVal);
|
|
||||||
}
|
|
||||||
|
|
||||||
TU_ATTR_ALWAYS_INLINE static inline void pcd_clear_tx_ep_ctr(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
TU_ATTR_ALWAYS_INLINE static inline void pcd_clear_tx_ep_ctr(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
||||||
uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
||||||
regVal &= USB_EPREG_MASK;
|
regVal &= USB_EPREG_MASK;
|
||||||
@@ -310,6 +293,10 @@ TU_ATTR_ALWAYS_INLINE static inline uint32_t ep_add_dtog(uint32_t reg, tusb_dir_
|
|||||||
return reg ^ (state << (USB_EP_DTOG_TX_Pos + (dir == TUSB_DIR_IN ? 0 : 8)));
|
return reg ^ (state << (USB_EP_DTOG_TX_Pos + (dir == TUSB_DIR_IN ? 0 : 8)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TU_ATTR_ALWAYS_INLINE static inline bool ep_is_iso(uint32_t reg) {
|
||||||
|
return (reg & USB_EP_TYPE_MASK) == USB_EP_ISOCHRONOUS;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief sets the status for tx transfer (bits STAT_TX[1:0]).
|
* @brief sets the status for tx transfer (bits STAT_TX[1:0]).
|
||||||
* @param USBx USB peripheral instance register address.
|
* @param USBx USB peripheral instance register address.
|
||||||
@@ -341,54 +328,6 @@ TU_ATTR_ALWAYS_INLINE static inline void pcd_set_ep_rx_status(USB_TypeDef * USBx
|
|||||||
pcd_set_endpoint(USBx, bEpIdx, regVal);
|
pcd_set_endpoint(USBx, bEpIdx, regVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TU_ATTR_ALWAYS_INLINE static inline uint32_t pcd_get_ep_rx_status(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
|
||||||
// uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
|
||||||
// return (regVal & USB_EPRX_STAT) >> (12u);
|
|
||||||
//}
|
|
||||||
|
|
||||||
TU_ATTR_ALWAYS_INLINE static inline void pcd_rx_dtog(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
|
||||||
uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
|
||||||
regVal &= USB_EPREG_MASK;
|
|
||||||
regVal |= USB_EP_CTR_RX|USB_EP_CTR_TX|USB_EP_DTOG_RX;
|
|
||||||
pcd_set_endpoint(USBx, bEpIdx, regVal);
|
|
||||||
}
|
|
||||||
|
|
||||||
TU_ATTR_ALWAYS_INLINE static inline void pcd_tx_dtog(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
|
||||||
uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
|
||||||
regVal &= USB_EPREG_MASK;
|
|
||||||
regVal |= USB_EP_CTR_RX|USB_EP_CTR_TX|USB_EP_DTOG_TX;
|
|
||||||
pcd_set_endpoint(USBx, bEpIdx, regVal);
|
|
||||||
}
|
|
||||||
|
|
||||||
TU_ATTR_ALWAYS_INLINE static inline void pcd_clear_rx_dtog(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
|
||||||
uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
|
||||||
if((regVal & USB_EP_DTOG_RX) != 0) {
|
|
||||||
pcd_rx_dtog(USBx,bEpIdx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TU_ATTR_ALWAYS_INLINE static inline void pcd_clear_tx_dtog(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
|
||||||
uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
|
||||||
if((regVal & USB_EP_DTOG_TX) != 0) {
|
|
||||||
pcd_tx_dtog(USBx,bEpIdx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//TU_ATTR_ALWAYS_INLINE static inline void pcd_set_ep_kind(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
|
||||||
// uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
|
||||||
// regVal |= USB_EP_KIND;
|
|
||||||
// regVal &= USB_EPREG_MASK;
|
|
||||||
// regVal |= USB_EP_CTR_RX|USB_EP_CTR_TX;
|
|
||||||
// pcd_set_endpoint(USBx, bEpIdx, regVal);
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//TU_ATTR_ALWAYS_INLINE static inline void pcd_clear_ep_kind(USB_TypeDef * USBx, uint32_t bEpIdx) {
|
|
||||||
// uint32_t regVal = pcd_get_endpoint(USBx, bEpIdx);
|
|
||||||
// regVal &= USB_EPKIND_MASK;
|
|
||||||
// regVal |= USB_EP_CTR_RX|USB_EP_CTR_TX;
|
|
||||||
// pcd_set_endpoint(USBx, bEpIdx, regVal);
|
|
||||||
//}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user