#include // Create external function at 0x00006f88 extern void maybe_usb_setup_read(char endpoint,void *fun,uint32_t target_buffer); extern void dwc3_ep0_start_trans(char endpoint,uint32_t target_buf, uint32_t len); extern int usb_event_handler(void); extern uint32_t get_endpoint_recv_buffer(char endpoint); extern void sleep(int endpoint,uint32_t timeout); extern void usb_send(uint32_t address,uint32_t size); extern void rom_send(); #define recv_buffer 0x02021800 + 0x3000 #define p_recv_buffer 0x02021800 + 0x2000 #define data_received 0x02021800 + 0x2004 void recv_data_cb(uint32_t endpoint, uint32_t len){ // Copies the data into the predetermined receive buffer and tells the event handler that the data was received volatile void *dref = (void *)data_received; char *dest_buf = (char *)recv_buffer; void *rbuf = get_endpoint_recv_buffer(endpoint); for(int i= 0; i < len; i++){ dest_buf[i] = *(char *)(void *)((int)rbuf + i); } *(uint8_t *)dref = 1; // Mark as ready } void recv_data(uint32_t address, uint32_t size){ volatile void *dref = (void *)data_received; *(uint8_t *)dref = 0; maybe_usb_setup_read(2, recv_data_cb, 0x200); uint32_t rbuf = get_endpoint_recv_buffer(2); dwc3_ep0_start_trans(2, rbuf, 0x200); while(1){ usb_event_handler(); if(*(uint8_t *)dref == 1){ break; } } } void send_data_cb(uint32_t endpoint, uint32_t len){ // Tell event handler that the data was received volatile void *dref = (void *)data_received; *(uint8_t *)dref = 1; // Mark as ready } void send_data(uint32_t address, uint32_t size){ volatile void *dref = (void *)data_received; *(uint8_t *)dref = 0; maybe_usb_setup_read(0x1, send_data_cb, 0x200); // uint32_t rbuf = get_endpoint_recv_buffer(1); dwc3_ep0_start_trans(1, address, 0x200); while(1){ usb_event_handler(); if(*(uint8_t *)dref == 1){ break; } } } int main() { uint32_t count = 0; while(1){ recv_data(recv_buffer, 0x200); send_data(recv_buffer, 0x200); } }