0c1e003e |
1 | #include <stdint.h> |
2 | #include <stdio.h> |
3 | #include <string.h> |
4 | #include "teensy3/core_pins.h" |
5 | #include "teensy3/usb_seremu.h" |
6 | #include "teensy3/usb_rawhid.h" |
7 | |
9c4f55f4 |
8 | /* ?0SA 00DU, ?1CB RLDU */ |
9 | static uint8_t fixed_state[4] = { 0x33, 0x3f }; |
10 | |
0c1e003e |
11 | ssize_t _write(int fd, const void *buf, size_t nbyte) |
12 | { |
13 | char tbuf[64]; |
14 | int ret; |
15 | |
16 | if (fd != 1 && fd != 2) { |
17 | snprintf(tbuf, sizeof(tbuf), "write to fd %d\n", fd); |
18 | usb_seremu_write(tbuf, strlen(tbuf)); |
19 | } |
20 | |
21 | ret = usb_seremu_write(buf, nbyte); |
22 | return ret < 0 ? ret : nbyte; |
23 | } |
24 | |
25 | void yield(void) |
26 | { |
27 | } |
28 | |
a773ac06 |
29 | static void my_portb_isr(void) |
9c4f55f4 |
30 | { |
31 | uint32_t isfr; |
32 | |
33 | //printf("irq, GPIOB_PDIR: %08x\n", GPIOB_PDIR); |
34 | |
35 | GPIOD_PDOR = fixed_state[(GPIOB_PDIR >> CORE_PIN0_BIT) & 1]; |
36 | |
37 | isfr = PORTB_ISFR; |
38 | PORTB_ISFR = isfr; |
39 | } |
40 | |
0c1e003e |
41 | int main(void) |
42 | { |
1cb2822f |
43 | char buf[64]; |
44 | int timeout; |
45 | int ret; |
0c1e003e |
46 | |
47 | delay(1000); // wait for usb.. |
48 | |
49 | printf("starting, rawhid: %d\n", usb_rawhid_available()); |
50 | |
9c4f55f4 |
51 | // md pin th tr tl r l d u |
52 | // md bit* 6 5 4 3 2 1 0 |
53 | // t bit b16 d5 d4 d3 d2 d1 d0 |
54 | // t pin 0 20 6 8 7 14 2 |
55 | // * - note: tl/tr mixed in most docs |
56 | pinMode(0, INPUT); |
a773ac06 |
57 | attachInterrupt(0, my_portb_isr, CHANGE); |
58 | attachInterruptVector(IRQ_PORTB, my_portb_isr); |
9c4f55f4 |
59 | |
60 | pinMode( 2, OUTPUT); |
61 | pinMode(14, OUTPUT); |
62 | pinMode( 7, OUTPUT); |
63 | pinMode( 8, OUTPUT); |
64 | pinMode( 6, OUTPUT); |
65 | pinMode(20, OUTPUT); |
66 | |
67 | // led |
68 | pinMode(13, OUTPUT); |
69 | // CORE_PIN13_PORTSET = CORE_PIN13_BITMASK; |
70 | // CORE_PIN13_PORTCLEAR = CORE_PIN13_BITMASK; |
71 | |
72 | // CORE_PIN0_PORTSET CORE_PIN0_BITMASK PORTB_PCR16 |
73 | printf("GPIOC PDDR, PDIR: %08x %08x\n", GPIOC_PDIR, GPIOC_PDDR); |
74 | printf("GPIOD PDDR, PDIR: %08x %08x\n", GPIOD_PDIR, GPIOD_PDDR); |
75 | printf("PORTB_PCR16: %08x\n", PORTB_PCR16); |
76 | |
0c1e003e |
77 | // ret = usb_rawhid_send(buf, 2000); |
78 | |
1cb2822f |
79 | timeout = 1000; |
9c4f55f4 |
80 | |
1cb2822f |
81 | while (1) { |
82 | ret = usb_rawhid_recv(buf, timeout); |
83 | if (ret == 64) { |
84 | CORE_PIN13_PORTSET = CORE_PIN13_BITMASK; |
85 | |
86 | memcpy(fixed_state, buf, sizeof(fixed_state)); |
87 | timeout = 20; |
88 | } |
89 | else if (ret == 0) { |
90 | CORE_PIN13_PORTCLEAR = CORE_PIN13_BITMASK; |
91 | timeout = 1000; |
92 | } |
93 | else { |
94 | printf("usb_rawhid_recv: %d\n", ret); |
95 | timeout = 1000; |
96 | } |
0c1e003e |
97 | } |
1cb2822f |
98 | |
99 | return 0; |
0c1e003e |
100 | } |