2024-07-22 22:08:17 +00:00
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
2024-07-23 21:50:40 +00:00
|
|
|
rbuf = get_endpoint_buffer(endpoint);
|
2024-07-22 22:08:17 +00:00
|
|
|
for(int i= 0; i < len; i++){
|
|
|
|
*(char *)dest_buf = *(char *)(void *)((int)rbuf + i);
|
|
|
|
}
|
2024-07-23 21:50:40 +00:00
|
|
|
*(uint8_t *)dref = 1; // Mark as ready
|
2024-07-22 22:08:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
2024-07-23 21:50:40 +00:00
|
|
|
maybe_usb_setup_read(2, recv_data_cb, 0x200);
|
|
|
|
void *rbuf = get_endpoint_buffer(2);
|
|
|
|
dwc3_ep0_start_trans(2, (uint32_t)rbuf, 0x200);
|
2024-07-22 22:08:17 +00:00
|
|
|
while(1){
|
|
|
|
usb_event_handler();
|
2024-07-23 21:50:40 +00:00
|
|
|
if(*(uint8_t *)dref == 1){
|
2024-07-22 22:08:17 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-07-31 19:12:10 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2024-07-23 21:50:40 +00:00
|
|
|
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");
|
|
|
|
}
|
|
|
|
|
2024-07-22 22:08:17 +00:00
|
|
|
int main() {
|
2024-07-23 21:50:40 +00:00
|
|
|
while(1){
|
|
|
|
recv_data();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-07-22 22:08:17 +00:00
|
|
|
// recv_data();
|
|
|
|
// sleep(1, 5000);
|
|
|
|
asm("mov x0, #0x0");
|
|
|
|
asm("br x0");
|
|
|
|
}
|