#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 void * get_endpoint_buffer(char endpoint); extern void sleep(int endpoint,uint32_t timeout); #define recv_buffer 0x02021800 + 0x2000 #define data_received 0x02021800 + 0x2004 void recv_data_cb(uint32_t endpoint, uint32_t len){ void *rbuf; void *dest_buf = (void *)recv_buffer; volatile void *dref = (void *)data_received; rbuf = get_endpoint_buffer(endpoint); for(int i= 0; i < len; i++){ *(char *)dest_buf = *(char *)(void *)((int)rbuf + i); } *(uint8_t *)dref = 1; // Mark as ready } void recv_data(){ // Set data_received to 0 // uint32_t *r = (uint32_t *) data_received; // r = 0; volatile void *dref = (void *)data_received; *(uint8_t *)dref = 0; maybe_usb_setup_read(2, recv_data_cb, 0x200); void *rbuf = get_endpoint_buffer(2); dwc3_ep0_start_trans(2, (uint32_t)rbuf, 0x200); while(1){ usb_event_handler(); if(*(uint8_t *)dref == 1){ break; } } } void send_data(void *address, uint32_t size){ maybe_usb_setup_read(0x81, NULL, 0x200); void *rbuf = get_endpoint_buffer(1); for(int i= 0; i < size; i++){ *(char *)(void *)((int)rbuf + i) = *(char *)(void *)((int)address + i); } dwc } void send_data(uint32_t *address, uint32_t size) { // asm("stp x29, x30, [sp,#-48]!");; // asm("mov w3, #0x0"); // asm("bfxil w3, w1, #0, #24"); // asm("mov w1, #0xc12"); // asm("mov x29, sp"); // asm("stp x19, x20, [sp,#16]"); // asm("mov x5, #0xc834"); // asm("mov w20, #0x1"); // asm("movk x5, #0x1540, lsl #16"); // asm("ldr x2, [x29,#40]"); // asm("mov x4, #0xc838"); // asm("orr w6, w1, w20"); // asm("movk x4, #0x1540, lsl #16"); // asm("mov x19, #0xc83c"); // asm("movk x19, #0x1540, lsl #16"); // asm("stp w3, w1, [x2,#8]"); // asm("mov w3, #0x406"); // asm("stp w0, wzr, [x2]"); // asm("mov w0, w20"); // asm("ldr x1, [x29,#40]"); // asm("strb w6, [x2,#12]"); // asm("mov x2, #0x27c8"); // asm("str w1, [x5]"); // asm("mov w1, #0x1388"); // asm("str wzr, [x4]"); // asm("str w3, [x19]"); // asm("blr x2"); // asm("mov w0, w20"); // asm("ldr w1, [x19]"); // asm("ldp x19, x20, [sp,#16]"); // asm("ldp x29, x30, [sp],#48"); // asm("ret"); } int main() { while(1){ recv_data(); } // recv_data(); // sleep(1, 5000); asm("mov x0, #0x0"); asm("br x0"); }