void usb_restart(void) { const struct usbd_device *identity = usb.identity; /* XXX reset existing functions? */ memset(&usb, 0, sizeof(usb)); usb.functions.function = &usb.control_function; usb.identity = identity; usb_init_ep(&usb.functions, 0, USB_EP_RX, EP0_BUFSIZE); usb_init_ep(&usb.functions, 0, USB_EP_TX, EP0_BUFSIZE); usb_setup_control(); }
void cdc_init(void (*data_ready_cb)(uint8_t *, size_t), void (*data_sent_cb)(size_t), struct cdc_ctx *ctx) { usb_attach_function(&cdc_function, &ctx->header); ctx->data_ready_cb = data_ready_cb; ctx->data_sent_cb = data_sent_cb; ctx->out_queued = 0; ctx->notice_pipe = usb_init_ep(&ctx->header, CDC_NOTICE_EP, USB_EP_TX, CDC_NOTICE_SIZE); ctx->tx_pipe = usb_init_ep(&ctx->header, CDC_TX_EP, USB_EP_TX, CDC_TX_SIZE); ctx->rx_pipe = usb_init_ep(&ctx->header, CDC_RX_EP, USB_EP_RX, CDC_RX_SIZE); cdc_read_more(ctx); cdc_tx_done(ctx->outbuf, -1, ctx); }
void usb_restart(void) { const struct usbd_device *identity = usb.identity; /* XXX reset existing functions? */ memset(&usb, 0, sizeof(usb)); usb.functions.function = &usb.control_function; usb.identity = identity; usb_init_ep(&usb.functions, 0, USB_EP_RX, EP0_BUFSIZE); usb_init_ep(&usb.functions, 0, USB_EP_TX, EP0_BUFSIZE); usb_setup_control(); for (const struct usbd_global *g = usb.identity->global; g != NULL; g = g->next) { if (g->init) g->init(g, 1); } }
void hid_init(const struct usbd_function *f, int enable) { const struct hid_function *hidf = (void *)f; struct hid_ctx *ctx = hidf->ctx; if (enable) { ctx->hidf = hidf; usb_attach_function(&hidf->usb_func, &ctx->header); if (hidf->report_max_size > 0) ctx->tx_pipe = usb_init_ep(&ctx->header, HID_TX_EP, USB_EP_TX, hidf->report_max_size); } }