akkera 102
/
apuplay
SPC music playback tools for real snes apu
gpio.cpp@8:072621697467, 2017-01-19 (annotated)
- Committer:
- akkera102
- Date:
- Thu Jan 19 04:51:28 2017 +0000
- Revision:
- 8:072621697467
- Parent:
- 2:62e6e22f8be2
fifth
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
akkera102 | 0:5bd52e196edb | 1 | #include "gpio.h" |
akkera102 | 0:5bd52e196edb | 2 | #include "mbed.h" |
akkera102 | 0:5bd52e196edb | 3 | |
akkera102 | 2:62e6e22f8be2 | 4 | // mbed LPC1768 |
akkera102 | 0:5bd52e196edb | 5 | DigitalInOut d[] = { |
akkera102 | 0:5bd52e196edb | 6 | p5, // A7 |
akkera102 | 0:5bd52e196edb | 7 | p6, // A6 |
akkera102 | 0:5bd52e196edb | 8 | p7, // A0 |
akkera102 | 0:5bd52e196edb | 9 | p8, // A1 |
akkera102 | 0:5bd52e196edb | 10 | p9, // WR |
akkera102 | 0:5bd52e196edb | 11 | p10, // RD |
akkera102 | 0:5bd52e196edb | 12 | |
akkera102 | 0:5bd52e196edb | 13 | p11, // D0 |
akkera102 | 0:5bd52e196edb | 14 | p12, |
akkera102 | 0:5bd52e196edb | 15 | p13, |
akkera102 | 0:5bd52e196edb | 16 | p14, |
akkera102 | 0:5bd52e196edb | 17 | p15, |
akkera102 | 0:5bd52e196edb | 18 | p16, |
akkera102 | 0:5bd52e196edb | 19 | p17, |
akkera102 | 0:5bd52e196edb | 20 | p18, // D7 |
akkera102 | 0:5bd52e196edb | 21 | |
akkera102 | 0:5bd52e196edb | 22 | p19, // ICL |
akkera102 | 0:5bd52e196edb | 23 | }; |
akkera102 | 0:5bd52e196edb | 24 | |
akkera102 | 2:62e6e22f8be2 | 25 | static void gpio_set_pin(int pin, bool high); |
akkera102 | 2:62e6e22f8be2 | 26 | static void gpio_set_dir(int pin, bool write); |
akkera102 | 2:62e6e22f8be2 | 27 | static unsigned char gpio_swap_bits(unsigned char c); |
akkera102 | 0:5bd52e196edb | 28 | |
akkera102 | 2:62e6e22f8be2 | 29 | void gpio_init(void) |
akkera102 | 2:62e6e22f8be2 | 30 | { |
akkera102 | 2:62e6e22f8be2 | 31 | gpio_set_pin(GPIO_A0, false); |
akkera102 | 2:62e6e22f8be2 | 32 | gpio_set_pin(GPIO_A1, false); |
akkera102 | 2:62e6e22f8be2 | 33 | gpio_set_pin(GPIO_A6, true); |
akkera102 | 2:62e6e22f8be2 | 34 | gpio_set_pin(GPIO_A7, false); |
akkera102 | 2:62e6e22f8be2 | 35 | gpio_set_pin(GPIO_WR, true); |
akkera102 | 2:62e6e22f8be2 | 36 | gpio_set_pin(GPIO_RD, true); |
akkera102 | 2:62e6e22f8be2 | 37 | gpio_set_pin(GPIO_ICL, true); |
akkera102 | 2:62e6e22f8be2 | 38 | |
akkera102 | 2:62e6e22f8be2 | 39 | gpio_set_dir(GPIO_A0, true); |
akkera102 | 2:62e6e22f8be2 | 40 | gpio_set_dir(GPIO_A1, true); |
akkera102 | 2:62e6e22f8be2 | 41 | gpio_set_dir(GPIO_A6, true); |
akkera102 | 2:62e6e22f8be2 | 42 | gpio_set_dir(GPIO_A7, true); |
akkera102 | 2:62e6e22f8be2 | 43 | gpio_set_dir(GPIO_WR, true); |
akkera102 | 2:62e6e22f8be2 | 44 | gpio_set_dir(GPIO_RD, true); |
akkera102 | 2:62e6e22f8be2 | 45 | gpio_set_dir(GPIO_ICL, true); |
akkera102 | 0:5bd52e196edb | 46 | |
akkera102 | 2:62e6e22f8be2 | 47 | gpio_set_pin(GPIO_A0, false); |
akkera102 | 2:62e6e22f8be2 | 48 | gpio_set_pin(GPIO_A1, false); |
akkera102 | 2:62e6e22f8be2 | 49 | gpio_set_pin(GPIO_A6, true); |
akkera102 | 2:62e6e22f8be2 | 50 | gpio_set_pin(GPIO_A7, false); |
akkera102 | 2:62e6e22f8be2 | 51 | gpio_set_pin(GPIO_WR, true); |
akkera102 | 2:62e6e22f8be2 | 52 | gpio_set_pin(GPIO_RD, true); |
akkera102 | 2:62e6e22f8be2 | 53 | gpio_set_pin(GPIO_ICL, true); |
akkera102 | 2:62e6e22f8be2 | 54 | } |
akkera102 | 2:62e6e22f8be2 | 55 | |
akkera102 | 2:62e6e22f8be2 | 56 | void gpio_reset(void) |
akkera102 | 0:5bd52e196edb | 57 | { |
akkera102 | 2:62e6e22f8be2 | 58 | gpio_set_pin(GPIO_A0, false); |
akkera102 | 2:62e6e22f8be2 | 59 | gpio_set_pin(GPIO_A1, false); |
akkera102 | 2:62e6e22f8be2 | 60 | gpio_set_pin(GPIO_A6, true); |
akkera102 | 2:62e6e22f8be2 | 61 | gpio_set_pin(GPIO_A7, false); |
akkera102 | 2:62e6e22f8be2 | 62 | gpio_set_pin(GPIO_WR, true); |
akkera102 | 2:62e6e22f8be2 | 63 | gpio_set_pin(GPIO_RD, true); |
akkera102 | 2:62e6e22f8be2 | 64 | gpio_set_pin(GPIO_ICL, false); |
akkera102 | 2:62e6e22f8be2 | 65 | wait_us(50 * 1000); |
akkera102 | 2:62e6e22f8be2 | 66 | |
akkera102 | 2:62e6e22f8be2 | 67 | gpio_set_pin(GPIO_ICL, true); |
akkera102 | 2:62e6e22f8be2 | 68 | wait_us(50 * 1000); |
akkera102 | 0:5bd52e196edb | 69 | } |
akkera102 | 0:5bd52e196edb | 70 | |
akkera102 | 2:62e6e22f8be2 | 71 | void gpio_write(int address, unsigned char data) |
akkera102 | 2:62e6e22f8be2 | 72 | { |
akkera102 | 2:62e6e22f8be2 | 73 | gpio_set_pin(GPIO_A0, ((address & 1) != 0)); |
akkera102 | 2:62e6e22f8be2 | 74 | gpio_set_pin(GPIO_A1, ((address & 2) != 0)); |
akkera102 | 2:62e6e22f8be2 | 75 | gpio_set_pin(GPIO_RD, true); |
akkera102 | 2:62e6e22f8be2 | 76 | gpio_set_pin(GPIO_WR, false); |
akkera102 | 2:62e6e22f8be2 | 77 | |
akkera102 | 2:62e6e22f8be2 | 78 | for(int i=6; i<6+8; i++) |
akkera102 | 2:62e6e22f8be2 | 79 | { |
akkera102 | 2:62e6e22f8be2 | 80 | d[i].output(); |
akkera102 | 2:62e6e22f8be2 | 81 | d[i] = data & 0x1; |
akkera102 | 2:62e6e22f8be2 | 82 | data >>= 1; |
akkera102 | 2:62e6e22f8be2 | 83 | } |
akkera102 | 2:62e6e22f8be2 | 84 | wait_us(1); |
akkera102 | 2:62e6e22f8be2 | 85 | |
akkera102 | 2:62e6e22f8be2 | 86 | gpio_set_pin(GPIO_WR, true); |
akkera102 | 2:62e6e22f8be2 | 87 | } |
akkera102 | 2:62e6e22f8be2 | 88 | |
akkera102 | 2:62e6e22f8be2 | 89 | unsigned char gpio_read(int address) |
akkera102 | 0:5bd52e196edb | 90 | { |
akkera102 | 2:62e6e22f8be2 | 91 | gpio_set_pin(GPIO_A0, ((address & 1) != 0)); |
akkera102 | 2:62e6e22f8be2 | 92 | gpio_set_pin(GPIO_A1, ((address & 2) != 0)); |
akkera102 | 2:62e6e22f8be2 | 93 | gpio_set_pin(GPIO_WR, true); |
akkera102 | 2:62e6e22f8be2 | 94 | gpio_set_pin(GPIO_RD, false); |
akkera102 | 2:62e6e22f8be2 | 95 | |
akkera102 | 2:62e6e22f8be2 | 96 | unsigned char ret = 0; |
akkera102 | 2:62e6e22f8be2 | 97 | |
akkera102 | 2:62e6e22f8be2 | 98 | wait_us(1); |
akkera102 | 2:62e6e22f8be2 | 99 | for(int i=6; i<6+8; i++) |
akkera102 | 2:62e6e22f8be2 | 100 | { |
akkera102 | 2:62e6e22f8be2 | 101 | d[i].input(); |
akkera102 | 2:62e6e22f8be2 | 102 | ret <<= 1; |
akkera102 | 2:62e6e22f8be2 | 103 | ret |= d[i]; |
akkera102 | 2:62e6e22f8be2 | 104 | } |
akkera102 | 2:62e6e22f8be2 | 105 | |
akkera102 | 2:62e6e22f8be2 | 106 | gpio_set_pin(GPIO_RD, true); |
akkera102 | 2:62e6e22f8be2 | 107 | |
akkera102 | 2:62e6e22f8be2 | 108 | return gpio_swap_bits(ret); |
akkera102 | 2:62e6e22f8be2 | 109 | } |
akkera102 | 2:62e6e22f8be2 | 110 | |
akkera102 | 2:62e6e22f8be2 | 111 | static void gpio_set_pin(int pin, bool high) |
akkera102 | 2:62e6e22f8be2 | 112 | { |
akkera102 | 2:62e6e22f8be2 | 113 | d[pin] = high ? 1 : 0; |
akkera102 | 2:62e6e22f8be2 | 114 | } |
akkera102 | 2:62e6e22f8be2 | 115 | |
akkera102 | 2:62e6e22f8be2 | 116 | static void gpio_set_dir(int pin, bool write) |
akkera102 | 2:62e6e22f8be2 | 117 | { |
akkera102 | 0:5bd52e196edb | 118 | if(write) |
akkera102 | 0:5bd52e196edb | 119 | { |
akkera102 | 0:5bd52e196edb | 120 | d[pin].output(); |
akkera102 | 0:5bd52e196edb | 121 | } |
akkera102 | 0:5bd52e196edb | 122 | else |
akkera102 | 0:5bd52e196edb | 123 | { |
akkera102 | 0:5bd52e196edb | 124 | d[pin].input(); |
akkera102 | 0:5bd52e196edb | 125 | } |
akkera102 | 0:5bd52e196edb | 126 | } |
akkera102 | 0:5bd52e196edb | 127 | |
akkera102 | 2:62e6e22f8be2 | 128 | static unsigned char gpio_swap_bits(unsigned char c) |
akkera102 | 0:5bd52e196edb | 129 | { |
akkera102 | 2:62e6e22f8be2 | 130 | unsigned char r = 0; |
akkera102 | 0:5bd52e196edb | 131 | |
akkera102 | 2:62e6e22f8be2 | 132 | if(c & 0x01) r |= 0x80; |
akkera102 | 2:62e6e22f8be2 | 133 | if(c & 0x02) r |= 0x40; |
akkera102 | 2:62e6e22f8be2 | 134 | if(c & 0x04) r |= 0x20; |
akkera102 | 2:62e6e22f8be2 | 135 | if(c & 0x08) r |= 0x10; |
akkera102 | 2:62e6e22f8be2 | 136 | if(c & 0x10) r |= 0x08; |
akkera102 | 2:62e6e22f8be2 | 137 | if(c & 0x20) r |= 0x04; |
akkera102 | 2:62e6e22f8be2 | 138 | if(c & 0x40) r |= 0x02; |
akkera102 | 2:62e6e22f8be2 | 139 | if(c & 0x80) r |= 0x01; |
akkera102 | 2:62e6e22f8be2 | 140 | |
akkera102 | 2:62e6e22f8be2 | 141 | return r; |
akkera102 | 0:5bd52e196edb | 142 | } |