fix some stuff, but still not good enough
This commit is contained in:
parent
53d514f247
commit
b97e026d9a
|
@ -153,6 +153,17 @@ static bool uart_poll_ch(uint8_t* ch) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void flush_pio_fifo(void) {
|
||||||
|
PIO pio = PIO_UNIT;
|
||||||
|
const uint sm = PIOSM_TRIG;
|
||||||
|
pio_sm_set_enabled(pio, sm, false);
|
||||||
|
pio_sm_clear_fifos(pio, sm);
|
||||||
|
pio_sm_restart(pio, sm);
|
||||||
|
pio_sm_clkdiv_restart(pio, sm);
|
||||||
|
pio_sm_exec(pio, sm, pio_encode_jmp(off_trig));
|
||||||
|
pio_sm_set_enabled(pio, sm, true);
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
stdio_init_all();
|
stdio_init_all();
|
||||||
|
|
||||||
|
@ -182,7 +193,10 @@ int main() {
|
||||||
if (uart_poll_ch(&ch)) {
|
if (uart_poll_ch(&ch)) {
|
||||||
//printf("got cmd: %c\n", ch);
|
//printf("got cmd: %c\n", ch);
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case '0': delay = 1; break;
|
case '0':
|
||||||
|
delay = 1;
|
||||||
|
flush_pio_fifo();
|
||||||
|
break;
|
||||||
case '+': ++delay; break;
|
case '+': ++delay; break;
|
||||||
case '-': --delay; break;
|
case '-': --delay; break;
|
||||||
default: goto noack;
|
default: goto noack;
|
||||||
|
|
108
src/main.c
108
src/main.c
|
@ -163,7 +163,7 @@ void do_trace(void) {
|
||||||
"mov.w #0xaaaa, r9\n"
|
"mov.w #0xaaaa, r9\n"
|
||||||
"mov.w #0xaaaa, r10\n"
|
"mov.w #0xaaaa, r10\n"
|
||||||
"mov.w #0xaaaa, r11\n"
|
"mov.w #0xaaaa, r11\n"
|
||||||
"mov.w #0x0002, r12\n"
|
"mov.w #0x0000, r12\n"
|
||||||
"mov.w #0xdead, r13\n"
|
"mov.w #0xdead, r13\n"
|
||||||
"mov.w #0xbeef, r14\n"
|
"mov.w #0xbeef, r14\n"
|
||||||
"mov.w #0xaaaa, r15\n"
|
"mov.w #0xaaaa, r15\n"
|
||||||
|
@ -187,7 +187,7 @@ void do_trace(void) {
|
||||||
"nop\n"
|
"nop\n"
|
||||||
"nop\n"
|
"nop\n"
|
||||||
"mov.w #0x1337, r8\n"
|
"mov.w #0x1337, r8\n"
|
||||||
"dint\nnop\n"
|
//"dint\nnop\n"
|
||||||
"add.w #-1, r4\n"
|
"add.w #-1, r4\n"
|
||||||
"add.w #1, r5\n"
|
"add.w #1, r5\n"
|
||||||
"add.w #2, r6\n"
|
"add.w #2, r6\n"
|
||||||
|
@ -212,10 +212,8 @@ void do_trace(void) {
|
||||||
"pushx.a #1f\n"
|
"pushx.a #1f\n"
|
||||||
"push.w r12\n"
|
"push.w r12\n"
|
||||||
"push.w r13\n"
|
"push.w r13\n"
|
||||||
"mov.w #0, r12\n"
|
"mov.w #2, r12\n"
|
||||||
"mov.w #0xdead, r13\n"
|
"br #0x1b02\n" // CHANGEME (address to trace insn flow of)
|
||||||
"mov.w #0xbeef, r14\n"
|
|
||||||
"br #0x1002\n" // CHANGEME (address to trace insn flow of)
|
|
||||||
//#if !USE_NMI
|
//#if !USE_NMI
|
||||||
"1: jmp 1b\n"
|
"1: jmp 1b\n"
|
||||||
//#endif
|
//#endif
|
||||||
|
@ -377,7 +375,11 @@ void Timer_A1_ISR(void) {
|
||||||
|
|
||||||
//extern const uint8_t TRAM_PAYLOAD_START[], TRAM_PAYLOAD_END[];
|
//extern const uint8_t TRAM_PAYLOAD_START[], TRAM_PAYLOAD_END[];
|
||||||
|
|
||||||
__attribute__((__interrupt__(UNMI_VECTOR), __naked__))
|
__attribute__((__interrupt__(UNMI_VECTOR), __naked__
|
||||||
|
#if USE_NMI
|
||||||
|
, __section__(".lower.data")
|
||||||
|
#endif
|
||||||
|
))
|
||||||
void NMI_ISR(void) {
|
void NMI_ISR(void) {
|
||||||
asm volatile(
|
asm volatile(
|
||||||
".extern Timer_A1_ISR\n"
|
".extern Timer_A1_ISR\n"
|
||||||
|
@ -400,6 +402,54 @@ void NMI_ISR(void) {
|
||||||
P1OUT = ((P1OUT+1) & 15) | (P1OUT & 0xF0);*/
|
P1OUT = ((P1OUT+1) & 15) | (P1OUT & 0xF0);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CODESP static void dma_init(void) {
|
||||||
|
STORAGE static uint16_t dmabak[(0x570-0x508)>>1];
|
||||||
|
STORAGE static uint16_t nmiie_val = NMIIE;
|
||||||
|
STORAGE static uint16_t rpcr_val = SYSRSTRE__ENABLE | SYSRSTUP__PULLUP | SYSNMIIES__FALLING | SYSNMI__NMI;
|
||||||
|
|
||||||
|
__data20_write_long((uintptr_t)&DMA0SA, (uintptr_t)dmabak);
|
||||||
|
__data20_write_long((uintptr_t)&DMA0DA, (uintptr_t)0x0508);
|
||||||
|
__data20_write_long((uintptr_t)&DMA1SA, (uintptr_t)&nmiie_val);
|
||||||
|
__data20_write_long((uintptr_t)&DMA1DA, (uintptr_t)&SFRIE1);
|
||||||
|
__data20_write_long((uintptr_t)&DMA2SA, (uintptr_t)&rpcr_val);
|
||||||
|
__data20_write_long((uintptr_t)&DMA2DA, (uintptr_t)&SFRRPCR);
|
||||||
|
__data20_write_long((uintptr_t)&DMA3SA, (uintptr_t)dmabak);
|
||||||
|
__data20_write_long((uintptr_t)&DMA3DA, (uintptr_t)0x0508);
|
||||||
|
__data20_write_long((uintptr_t)&DMA4SA, (uintptr_t)dmabak);
|
||||||
|
__data20_write_long((uintptr_t)&DMA4DA, (uintptr_t)0x0508);
|
||||||
|
__data20_write_long((uintptr_t)&DMA5SA, (uintptr_t)dmabak);
|
||||||
|
__data20_write_long((uintptr_t)&DMA5DA, (uintptr_t)0x0508);
|
||||||
|
DMA0SZ = (0x570-0x508)>>1;
|
||||||
|
DMA1SZ = 1;
|
||||||
|
DMA2SZ = 1;
|
||||||
|
DMA3SZ = (0x570-0x508)>>1;
|
||||||
|
DMA4SZ = (0x570-0x508)>>1;
|
||||||
|
DMA5SZ = (0x570-0x508)>>1;
|
||||||
|
DMA0CTL = DMADT_7 | DMASRCINCR_3 | DMADSTINCR_3;
|
||||||
|
DMA1CTL = DMADT_7 | DMASRCINCR_0 | DMADSTINCR_0;
|
||||||
|
DMA2CTL = DMADT_7 | DMASRCINCR_0 | DMADSTINCR_0;
|
||||||
|
DMA3CTL = DMADT_7 | DMASRCINCR_3 | DMADSTINCR_3;
|
||||||
|
DMA4CTL = DMADT_7 | DMASRCINCR_3 | DMADSTINCR_3;
|
||||||
|
DMA5CTL = DMADT_7 | DMASRCINCR_3 | DMADSTINCR_3;
|
||||||
|
DMACTL4 = ROUNDROBIN;
|
||||||
|
|
||||||
|
memcpy(dmabak, (void*)0x0508, sizeof dmabak);
|
||||||
|
for (int i = 0; i < 6; ++i) dmabak[0x08 + i*0x10 + 0] |= DMAREQ|DMAEN;
|
||||||
|
|
||||||
|
DMA0CTL |= DMAEN;
|
||||||
|
DMA1CTL |= DMAEN;
|
||||||
|
DMA2CTL |= DMAEN;
|
||||||
|
DMA3CTL |= DMAEN;
|
||||||
|
DMA4CTL |= DMAEN;
|
||||||
|
DMA5CTL |= DMAEN;
|
||||||
|
DMA0CTL |= DMAREQ;
|
||||||
|
DMA1CTL |= DMAREQ;
|
||||||
|
DMA2CTL |= DMAREQ;
|
||||||
|
DMA3CTL |= DMAREQ;
|
||||||
|
DMA4CTL |= DMAREQ;
|
||||||
|
DMA5CTL |= DMAREQ;
|
||||||
|
}
|
||||||
|
|
||||||
CODESP int main(void) {
|
CODESP int main(void) {
|
||||||
setup_io();
|
setup_io();
|
||||||
setup_clocks();
|
setup_clocks();
|
||||||
|
@ -436,11 +486,23 @@ CODESP int main(void) {
|
||||||
|
|
||||||
puts("hello world!\r\n");
|
puts("hello world!\r\n");
|
||||||
|
|
||||||
|
/*uint16_t vs[4];
|
||||||
|
__data20_write_long((uintptr_t)&DMA0SA, (uintptr_t)0x1000);
|
||||||
|
__data20_write_long((uintptr_t)&DMA0DA, (uintptr_t)vs);
|
||||||
|
DMA0SZ = 4;
|
||||||
|
DMA0CTL = DMADT_7 | DMASRCINCR_3 | DMADSTINCR_3;
|
||||||
|
DMA0CTL |= DMAEN;
|
||||||
|
DMA0CTL |= DMAREQ;
|
||||||
|
__delay_cycles(100);
|
||||||
|
iprintf("dmares: %04x %04x %04x %04x\r\n",
|
||||||
|
vs[0], vs[1], vs[2], vs[3]);*/
|
||||||
|
|
||||||
done_irq = 0;
|
done_irq = 0;
|
||||||
#if USE_NMI
|
#if USE_NMI
|
||||||
pico_send_cmd('0');
|
pico_send_cmd('0');
|
||||||
pico_wait_ack();
|
pico_wait_ack();
|
||||||
#endif
|
#endif
|
||||||
|
dma_init();
|
||||||
do_trace();
|
do_trace();
|
||||||
/*while(1);*/__builtin_unreachable();
|
/*while(1);*/__builtin_unreachable();
|
||||||
|
|
||||||
|
@ -455,33 +517,7 @@ CODESP int main(void) {
|
||||||
__delay_cycles(10000);
|
__delay_cycles(10000);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/*__data20_write_long((uintptr_t)&DMA0SA, (uintptr_t)TRAM_PAYLOAD_START);
|
/*for (int i = 0; i < 100; ++i) asm volatile("nop");
|
||||||
__data20_write_long((uintptr_t)&DMA0DA, (uintptr_t)0x0000+10);
|
|
||||||
__data20_write_long((uintptr_t)&DMA1SA, (uintptr_t)(TRAM_PAYLOAD_START+2));
|
|
||||||
__data20_write_long((uintptr_t)&DMA1DA, (uintptr_t)0x0002+10);
|
|
||||||
__data20_write_long((uintptr_t)&DMA2SA, (uintptr_t)(TRAM_PAYLOAD_START+4));
|
|
||||||
__data20_write_long((uintptr_t)&DMA2DA, (uintptr_t)0x0004+10);
|
|
||||||
__data20_write_long((uintptr_t)&DMA3SA, (uintptr_t)(TRAM_PAYLOAD_START+6));
|
|
||||||
__data20_write_long((uintptr_t)&DMA3DA, (uintptr_t)0x0006+10);
|
|
||||||
DMA0SZ = 1;
|
|
||||||
DMA1SZ = 1;
|
|
||||||
DMA2SZ = 1;
|
|
||||||
DMA3SZ = 1;
|
|
||||||
DMA0CTL = DMADT_7 | DMASRCINCR_0 | DMADSTINCR_0;
|
|
||||||
DMA1CTL = DMADT_7 | DMASRCINCR_0 | DMADSTINCR_0;
|
|
||||||
DMA2CTL = DMADT_7 | DMASRCINCR_0 | DMADSTINCR_0;
|
|
||||||
DMA3CTL = DMADT_7 | DMASRCINCR_0 | DMADSTINCR_0;
|
|
||||||
DMACTL4 = ROUNDROBIN;
|
|
||||||
DMA0CTL |= DMAEN;
|
|
||||||
DMA1CTL |= DMAEN;
|
|
||||||
DMA2CTL |= DMAEN;
|
|
||||||
DMA3CTL |= DMAEN;
|
|
||||||
DMA0CTL |= DMAREQ;
|
|
||||||
DMA1CTL |= DMAREQ;
|
|
||||||
DMA2CTL |= DMAREQ;
|
|
||||||
DMA3CTL |= DMAREQ;
|
|
||||||
|
|
||||||
for (int i = 0; i < 100; ++i) asm volatile("nop");
|
|
||||||
//asm volatile("br #0\n");
|
//asm volatile("br #0\n");
|
||||||
asm volatile("1: jmp 1b\n");
|
asm volatile("1: jmp 1b\n");
|
||||||
|
|
||||||
|
@ -492,8 +528,8 @@ CODESP int main(void) {
|
||||||
"1: bis.w #3, 0x0202\n"
|
"1: bis.w #3, 0x0202\n"
|
||||||
"jmp 1b\n"
|
"jmp 1b\n"
|
||||||
"TRAM_PAYLOAD_END:\n"
|
"TRAM_PAYLOAD_END:\n"
|
||||||
);*/
|
);
|
||||||
|
|
||||||
while(1);
|
while(1);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import serial
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
TIMEOUT = 60*60*8
|
||||||
|
with serial.Serial(sys.argv[1] if len(sys.argv) > 1 else "/dev/ttyACM1", 9600, timeout=TIMEOUT) as ser:
|
||||||
|
while True:
|
||||||
|
w = ser.read(1)
|
||||||
|
sys.stdout.buffer.write(w)
|
||||||
|
sys.stdout.buffer.flush()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue