X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=main.c;h=96b895fbce352e9f293e86a17d3218f103012321;hb=60707a511ee11a8af5d64fab1cc66ca9895d00bf;hp=288f94db80c608418488c2bf503ebf88098c8cde;hpb=c28a7c811e2c4a565acfa04f57ad02d406692b7e;p=teensytas.git diff --git a/main.c b/main.c index 288f94d..96b895f 100644 --- a/main.c +++ b/main.c @@ -96,6 +96,16 @@ static void portb_isr_fixed(void) g.edge_cnt++; } +static noinline void do_to_step(void) +{ + g.frame_cnt++; + + g.t_o = (g.t_o + 1) & STREAM_BUF_MASK; + if (g.t_o == g.t_i) + // done + attachInterruptVector(IRQ_PORTB, portb_isr_fixed); +} + static void portb_isr_do_to_inc(void) { uint32_t isfr, th; @@ -105,14 +115,8 @@ static void portb_isr_do_to_inc(void) th = (GPIOB_PDIR >> CORE_PIN0_BIT) & 1; GPIOD_PDOR = g.stream_to[g.t_o][th]; - if (th) { - g.t_o = (g.t_o + 1) & STREAM_BUF_MASK; - if (g.t_o == g.t_i) - // done - attachInterruptVector(IRQ_PORTB, portb_isr_fixed); - g.frame_cnt++; - } - g.edge_cnt++; + if (th) + do_to_step(); } static void portb_isr_do_to(void) @@ -190,6 +194,33 @@ static void portc_isr_frameinc_do_from(void) g.frame_cnt++; } +static void choose_isrs(void) +{ + if (g.stream_enable_to) { + if (g.use_readinc) { + attachInterruptVector(IRQ_PORTB, portb_isr_do_to_inc); + attachInterruptVector(IRQ_PORTC, portc_isr_nop); + } + else { + attachInterruptVector(IRQ_PORTB, portb_isr_do_to); + attachInterruptVector(IRQ_PORTC, portc_isr_frameinc); + } + } + else if (g.stream_enable_from) { + g.use_pending = 1; + if (g.use_readinc) { + attachInterruptVector(IRQ_PORTB, + portb_isr_fixed_do_from); + attachInterruptVector(IRQ_PORTC, portc_isr_nop); + } + else { + attachInterruptVector(IRQ_PORTB, portb_isr_fixed); + attachInterruptVector(IRQ_PORTC, + portc_isr_frameinc_do_from); + } + } +} + static void udelay(uint32_t us) { uint32_t start = micros(); @@ -272,30 +303,8 @@ static void do_start_seq(void) } __disable_irq(); + choose_isrs(); g.stream_started = 1; - if (g.stream_enable_to) { - if (g.use_readinc) { - attachInterruptVector(IRQ_PORTB, portb_isr_do_to_inc); - attachInterruptVector(IRQ_PORTC, portc_isr_nop); - } - else { - attachInterruptVector(IRQ_PORTB, portb_isr_do_to); - attachInterruptVector(IRQ_PORTC, portc_isr_frameinc); - } - } - else if (g.stream_enable_from) { - g.use_pending = 1; - if (g.use_readinc) { - attachInterruptVector(IRQ_PORTB, - portb_isr_fixed_do_from); - attachInterruptVector(IRQ_PORTC, portc_isr_nop); - } - else { - attachInterruptVector(IRQ_PORTB, portb_isr_fixed); - attachInterruptVector(IRQ_PORTC, - portc_isr_frameinc_do_from); - } - } __enable_irq(); } @@ -346,6 +355,11 @@ static void do_usb(void *buf) g.stream_enable_to = pkt->enable.stream_to; g.stream_enable_from = pkt->enable.stream_from; g.use_readinc = pkt->enable.use_readinc; + if (pkt->enable.no_start_seq) { + GPIOD_PDOR = 0x3f; + choose_isrs(); + g.stream_started = 1; + } __enable_irq(); break; case PKT_STREAM_ABORT: @@ -409,6 +423,7 @@ int main(void) NVIC_SET_PRIORITY(IRQ_PORTB, 0); NVIC_SET_PRIORITY(IRQ_PORTC, 16); + SCB_SHPR1 = SCB_SHPR2 = SCB_SHPR3 = 0x10101010; pinMode( 2, OUTPUT); pinMode(14, OUTPUT); @@ -426,9 +441,11 @@ int main(void) printf("GPIOD PDDR, PDIR: %08x %08x\n", GPIOD_PDIR, GPIOD_PDDR); printf("PORTB_PCR16: %08x\n", PORTB_PCR16); printf("PORTC_PCR6: %08x\n", PORTC_PCR6); + printf("PORTD_PCR0: %08x\n", PORTD_PCR0); asm("mrs %0, BASEPRI" : "=r"(ret)); - printf("BASEPRI: %d\n", ret); + printf("BASEPRI: %d, SHPR: %08x %08x %08x\n", + ret, SCB_SHPR1, SCB_SHPR2, SCB_SHPR3); edge_cnt_last = g.edge_cnt;