59 lines
1.3 KiB
C
59 lines
1.3 KiB
C
#include "types.h"
|
|
#include "t124.h"
|
|
#include "mem_dumper_usb_server.h"
|
|
|
|
typedef void (*ep1_x_imm_t)(void *buffer, u32 size, u32 *num_xfer);
|
|
|
|
void memcpy( void *dst, const void *src, size_t len ) {
|
|
|
|
for ( size_t i = 0; i < len; i++ ) {
|
|
( (u8 *)dst )[i] = ( (u8 *)src )[i];
|
|
}
|
|
|
|
}
|
|
|
|
static inline u32 read32(uintptr_t addr) {
|
|
return *(vu32 *)addr;
|
|
}
|
|
|
|
static inline void write32(uintptr_t addr, u32 val) {
|
|
*(vu32 *)addr = val;
|
|
}
|
|
|
|
static inline void or32(uintptr_t addr, u32 val) {
|
|
write32(addr, read32(addr) | val);
|
|
}
|
|
|
|
void enter_rcm() {
|
|
or32(PMC_BASE + PMC_SCRATCH0, PMC_SCRATCH0_MODE_RCM);
|
|
or32(PMC_BASE + PMC_CNTRL, PMC_CNTRL_MAIN_RST);
|
|
}
|
|
|
|
__attribute__((section(".init")))
|
|
void entry() {
|
|
|
|
u32 num_xfer;
|
|
u32 to_send;
|
|
struct mem_dumper_args_s args;
|
|
u8 *buffer = (u8*)0x40020000;
|
|
|
|
ep1_x_imm_t ep1_out_read_imm = (ep1_x_imm_t) ( BOOTROM_EP1_OUT_READ_IMM | 1 );
|
|
ep1_x_imm_t ep1_in_write_imm = (ep1_x_imm_t) ( BOOTROM_EP1_IN_WRITE_IMM | 1 );
|
|
|
|
ep1_out_read_imm( &args, sizeof(args), &num_xfer );
|
|
|
|
while ( args.len > 0 ) {
|
|
|
|
to_send = args.len > 0x1000? 0x1000 : args.len;
|
|
|
|
memcpy( buffer, (void*)args.start, to_send );
|
|
ep1_in_write_imm( buffer, to_send, &num_xfer );
|
|
|
|
args.start += to_send;
|
|
args.len -= to_send;
|
|
}
|
|
enter_rcm();
|
|
|
|
}
|
|
|