bool USBTester::setup_iterface(uint8_t ep_in, uint8_t ep_out, uint32_t ep_size, usb_ep_type_t ep_type, uint8_t *buf, uint32_t buf_size, void (USBTester::*callback)()) { bool success = false; success = endpoint_add(ep_in, ep_size, ep_type); success &= endpoint_add(ep_out, ep_size, ep_type, callback); success &= read_start(ep_out, buf, buf_size); return success; }
// Get an endpoint from the list by its metainformation struct endpoint_handle *endpoint_get(unsigned int domain, unsigned int node, unsigned int port) { struct endpoint_handle *eph = 0; // Try to find endpoint in local database struct endpoint_handle_listelem *lit; for (lit=eplist_first;lit!=0;lit=lit->next) { if ((lit->handle->domain == domain) && (lit->handle->node == node) && (lit->handle->port == port)) { eph = lit->handle; break; } } if (eph == 0 && (domain != optimsoc_get_tileid())) { // Endpoint is not locally known struct endpoint *ep = control_get_endpoint(domain, node, port); // Create the respective handle eph = malloc(sizeof(struct endpoint_handle)); eph->domain = domain; eph->node = node; eph->port = port; eph->ep = ep; eph->type = REMOTE; endpoint_add(eph); } return eph; }
struct endpoint_handle *endpoint_create(uint32_t node, uint32_t port, endpoint_buffer_type buffer_type, uint32_t buffer_size, int overwrite_max_size) { struct endpoint *ep = malloc(sizeof(struct endpoint)); assert(ep!=0); ep->buffer = calloc(1, sizeof(struct endpoint_buffer)); assert(ep->buffer != 0); ep->buffer->data = malloc(buffer_size * sizeof(uint32_t*)); assert(ep->buffer->data != 0); ep->buffer->data_size = malloc(buffer_size * sizeof(uint32_t*)); assert(ep->buffer->data_size != 0); uint32_t max_element_size_bytes; uint32_t max_element_size_words; if (overwrite_max_size > 0) { max_element_size_bytes = overwrite_max_size; } else { if (buffer_type == MESSAGE) { max_element_size_bytes = MAX_MESSAGE_SIZE; } else { max_element_size_bytes = MAX_PACKET_SIZE; } } max_element_size_words = (max_element_size_bytes + 3) >> 2; uint32_t *datafield = malloc(max_element_size_bytes * buffer_size); assert(datafield); int i; for (i = 0; i < buffer_size; i++) { ep->buffer->data[i] = &datafield[i*max_element_size_words]; } ep->buffer->size = buffer_size; ep->buffer->write_ptr = 0; ep->buffer->read_ptr = 0; #ifdef RUNTIME ep->waiting = 0; #endif struct endpoint_handle *eph = malloc(sizeof(struct endpoint_handle)); assert(eph!=0); eph->ep = ep; eph->domain = optimsoc_get_tileid(); eph->node = node; eph->port = port; trace_ep_create(ep); endpoint_add(eph); return eph; }