SPC music playback tools for real snes apu

Dependencies:   mbed

Committer:
akkera102
Date:
Thu Jan 19 04:51:28 2017 +0000
Revision:
8:072621697467
Parent:
2:62e6e22f8be2
fifth

Who changed what in which revision?

UserRevisionLine numberNew 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 }