cherry-embedded / CherryUSB

CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP
https://cherryusb.readthedocs.io/
Apache License 2.0
1.17k stars 249 forks source link

usbd_ep_start_read 函数问题 #159

Closed snikeguo closed 7 months ago

snikeguo commented 7 months ago

背景: 有一个STM32设备,长期电源供电,可以理解为,长时间有点的,我期望的目标:当设备的USB口插入USB数据线时和PC正常通讯,拔掉就拔掉了,再次插入USB数据线也能正常通讯。也就是说再次期间STM32设备一直没有重启。 于是我开发了如下代码:

static void notify_handler(uint8_t event, void *arg)
{
case USBD_EVENT_CONFIGURED:
        usbd_ep_start_read();
}
void ep_out(uint8_t ep, uint32_t nbytes)
{
  send sem();
}

recTask()
{
   wait sem( wait forever);
   dosth();
   usbd_ep_start_read();
}

以上代码 在第一次USB插入时工作很好,当第二次插入时,提示报错: 8ZLDT63~20RZ{ Z6IZL~ 6U 于是我将代码改成如下:

int usbd_ep_start_read(const uint8_t ep, uint8_t *data, uint32_t data_len)
{
    uint8_t ep_idx = USB_EP_GET_IDX(ep);
    uint32_t pktcnt = 0;

    if (!data && data_len) {
        return -1;
    }
    /*if (USB_OTG_OUTEP(ep_idx)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) {
        return -2;  去掉这个判断~~
    }*/

问题就解决了, 请问我的解决方案对不对,有没有更优雅的解决方案?