akkera 102
/
apuplay
SPC music playback tools for real snes apu
gpio.cpp@0:5bd52e196edb, 2017-01-09 (annotated)
- Committer:
- akkera102
- Date:
- Mon Jan 09 13:54:39 2017 +0000
- Revision:
- 0:5bd52e196edb
- Child:
- 2:62e6e22f8be2
first
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
akkera102 | 0:5bd52e196edb | 1 | /** |
akkera102 | 0:5bd52e196edb | 2 | * @file gpio.cpp |
akkera102 | 0:5bd52e196edb | 3 | * @brief GPIO クラスの動作の定義を行います |
akkera102 | 0:5bd52e196edb | 4 | */ |
akkera102 | 0:5bd52e196edb | 5 | |
akkera102 | 0:5bd52e196edb | 6 | #include "stdafx.h" |
akkera102 | 0:5bd52e196edb | 7 | #include "gpio.h" |
akkera102 | 0:5bd52e196edb | 8 | // #include <wiringPi.h> |
akkera102 | 0:5bd52e196edb | 9 | #include "mbed.h" |
akkera102 | 0:5bd52e196edb | 10 | |
akkera102 | 0:5bd52e196edb | 11 | DigitalInOut d[] = { |
akkera102 | 0:5bd52e196edb | 12 | p5, // A7 |
akkera102 | 0:5bd52e196edb | 13 | p6, // A6 |
akkera102 | 0:5bd52e196edb | 14 | p7, // A0 |
akkera102 | 0:5bd52e196edb | 15 | p8, // A1 |
akkera102 | 0:5bd52e196edb | 16 | p9, // WR |
akkera102 | 0:5bd52e196edb | 17 | p10, // RD |
akkera102 | 0:5bd52e196edb | 18 | |
akkera102 | 0:5bd52e196edb | 19 | p11, // D0 |
akkera102 | 0:5bd52e196edb | 20 | p12, |
akkera102 | 0:5bd52e196edb | 21 | p13, |
akkera102 | 0:5bd52e196edb | 22 | p14, |
akkera102 | 0:5bd52e196edb | 23 | p15, |
akkera102 | 0:5bd52e196edb | 24 | p16, |
akkera102 | 0:5bd52e196edb | 25 | p17, |
akkera102 | 0:5bd52e196edb | 26 | p18, // D7 |
akkera102 | 0:5bd52e196edb | 27 | |
akkera102 | 0:5bd52e196edb | 28 | p19, // ICL |
akkera102 | 0:5bd52e196edb | 29 | }; |
akkera102 | 0:5bd52e196edb | 30 | |
akkera102 | 0:5bd52e196edb | 31 | |
akkera102 | 0:5bd52e196edb | 32 | /*! 唯一のインスタンスです */ |
akkera102 | 0:5bd52e196edb | 33 | CGpio CGpio::sm_instance; |
akkera102 | 0:5bd52e196edb | 34 | |
akkera102 | 0:5bd52e196edb | 35 | /** |
akkera102 | 0:5bd52e196edb | 36 | * 初期化 |
akkera102 | 0:5bd52e196edb | 37 | */ |
akkera102 | 0:5bd52e196edb | 38 | void CGpio::Initialize() |
akkera102 | 0:5bd52e196edb | 39 | { |
akkera102 | 0:5bd52e196edb | 40 | // ::wiringPiSetup(); |
akkera102 | 0:5bd52e196edb | 41 | } |
akkera102 | 0:5bd52e196edb | 42 | |
akkera102 | 0:5bd52e196edb | 43 | /** |
akkera102 | 0:5bd52e196edb | 44 | * I/Oの方向を設定する |
akkera102 | 0:5bd52e196edb | 45 | * @param[in] pin ピン番号 |
akkera102 | 0:5bd52e196edb | 46 | * @param[in] write 方向 |
akkera102 | 0:5bd52e196edb | 47 | */ |
akkera102 | 0:5bd52e196edb | 48 | void CGpio::PinDir(int pin, bool write) |
akkera102 | 0:5bd52e196edb | 49 | { |
akkera102 | 0:5bd52e196edb | 50 | // ::pinMode(pin, (write ? OUTPUT : INPUT)); |
akkera102 | 0:5bd52e196edb | 51 | if(write) |
akkera102 | 0:5bd52e196edb | 52 | { |
akkera102 | 0:5bd52e196edb | 53 | d[pin].output(); |
akkera102 | 0:5bd52e196edb | 54 | } |
akkera102 | 0:5bd52e196edb | 55 | else |
akkera102 | 0:5bd52e196edb | 56 | { |
akkera102 | 0:5bd52e196edb | 57 | d[pin].input(); |
akkera102 | 0:5bd52e196edb | 58 | } |
akkera102 | 0:5bd52e196edb | 59 | } |
akkera102 | 0:5bd52e196edb | 60 | |
akkera102 | 0:5bd52e196edb | 61 | /** |
akkera102 | 0:5bd52e196edb | 62 | * Output |
akkera102 | 0:5bd52e196edb | 63 | * @param[in] pin ピン番号 |
akkera102 | 0:5bd52e196edb | 64 | * @param[in] high ON/OFF |
akkera102 | 0:5bd52e196edb | 65 | */ |
akkera102 | 0:5bd52e196edb | 66 | void CGpio::SetPin(int pin, bool high) |
akkera102 | 0:5bd52e196edb | 67 | { |
akkera102 | 0:5bd52e196edb | 68 | // ::digitalWrite(pin, (high ? HIGH : LOW)); |
akkera102 | 0:5bd52e196edb | 69 | d[pin] = high ? 1 : 0; |
akkera102 | 0:5bd52e196edb | 70 | } |
akkera102 | 0:5bd52e196edb | 71 | |
akkera102 | 0:5bd52e196edb | 72 | /** |
akkera102 | 0:5bd52e196edb | 73 | * Input |
akkera102 | 0:5bd52e196edb | 74 | * @param[in] pin ピン番号 |
akkera102 | 0:5bd52e196edb | 75 | * @return ON/OFF |
akkera102 | 0:5bd52e196edb | 76 | */ |
akkera102 | 0:5bd52e196edb | 77 | bool CGpio::GetPin(int pin) |
akkera102 | 0:5bd52e196edb | 78 | { |
akkera102 | 0:5bd52e196edb | 79 | // return (::digitalRead(pin) != LOW); |
akkera102 | 0:5bd52e196edb | 80 | d[pin].input(); |
akkera102 | 0:5bd52e196edb | 81 | return d[pin] != 0; |
akkera102 | 0:5bd52e196edb | 82 | } |
akkera102 | 0:5bd52e196edb | 83 | |
akkera102 | 0:5bd52e196edb | 84 | /** |
akkera102 | 0:5bd52e196edb | 85 | * コンストラクタ |
akkera102 | 0:5bd52e196edb | 86 | */ |
akkera102 | 0:5bd52e196edb | 87 | CGpio::CGpio() |
akkera102 | 0:5bd52e196edb | 88 | : m_dir(kUninitialize) |
akkera102 | 0:5bd52e196edb | 89 | { |
akkera102 | 0:5bd52e196edb | 90 | } |
akkera102 | 0:5bd52e196edb | 91 | |
akkera102 | 0:5bd52e196edb | 92 | /** |
akkera102 | 0:5bd52e196edb | 93 | * バイト書き込み |
akkera102 | 0:5bd52e196edb | 94 | * @param[in] c データ |
akkera102 | 0:5bd52e196edb | 95 | */ |
akkera102 | 0:5bd52e196edb | 96 | void CGpio::WriteByte(unsigned char c) |
akkera102 | 0:5bd52e196edb | 97 | { |
akkera102 | 0:5bd52e196edb | 98 | // ByteMode(kWrite); |
akkera102 | 0:5bd52e196edb | 99 | // ::digitalWriteByte(c); |
akkera102 | 0:5bd52e196edb | 100 | int i; |
akkera102 | 0:5bd52e196edb | 101 | |
akkera102 | 0:5bd52e196edb | 102 | for(i=6; i<6+8; i++) |
akkera102 | 0:5bd52e196edb | 103 | { |
akkera102 | 0:5bd52e196edb | 104 | d[i].output(); |
akkera102 | 0:5bd52e196edb | 105 | d[i] = c & 0x1; |
akkera102 | 0:5bd52e196edb | 106 | c >>= 1; |
akkera102 | 0:5bd52e196edb | 107 | } |
akkera102 | 0:5bd52e196edb | 108 | } |
akkera102 | 0:5bd52e196edb | 109 | |
akkera102 | 0:5bd52e196edb | 110 | /** |
akkera102 | 0:5bd52e196edb | 111 | * バイト読み込み |
akkera102 | 0:5bd52e196edb | 112 | * @return データ |
akkera102 | 0:5bd52e196edb | 113 | */ |
akkera102 | 0:5bd52e196edb | 114 | unsigned char CGpio::ReadByte() |
akkera102 | 0:5bd52e196edb | 115 | { |
akkera102 | 0:5bd52e196edb | 116 | // ByteMode(kRead); |
akkera102 | 0:5bd52e196edb | 117 | // return SwapBits(::digitalReadByte()); |
akkera102 | 0:5bd52e196edb | 118 | |
akkera102 | 0:5bd52e196edb | 119 | unsigned char ret = 0; |
akkera102 | 0:5bd52e196edb | 120 | int i; |
akkera102 | 0:5bd52e196edb | 121 | |
akkera102 | 0:5bd52e196edb | 122 | for(i=6; i<6+8; i++) |
akkera102 | 0:5bd52e196edb | 123 | { |
akkera102 | 0:5bd52e196edb | 124 | d[i].input(); |
akkera102 | 0:5bd52e196edb | 125 | ret <<= 1; |
akkera102 | 0:5bd52e196edb | 126 | ret |= d[i]; |
akkera102 | 0:5bd52e196edb | 127 | } |
akkera102 | 0:5bd52e196edb | 128 | |
akkera102 | 0:5bd52e196edb | 129 | return SwapBits(ret); |
akkera102 | 0:5bd52e196edb | 130 | } |
akkera102 | 0:5bd52e196edb | 131 | |
akkera102 | 0:5bd52e196edb | 132 | /** |
akkera102 | 0:5bd52e196edb | 133 | * バイト モード |
akkera102 | 0:5bd52e196edb | 134 | * @param[in] dir I/O |
akkera102 | 0:5bd52e196edb | 135 | */ |
akkera102 | 0:5bd52e196edb | 136 | /* |
akkera102 | 0:5bd52e196edb | 137 | void CGpio::ByteMode(ByteDir dir) |
akkera102 | 0:5bd52e196edb | 138 | { |
akkera102 | 0:5bd52e196edb | 139 | if (m_dir != dir) |
akkera102 | 0:5bd52e196edb | 140 | { |
akkera102 | 0:5bd52e196edb | 141 | m_dir = dir; |
akkera102 | 0:5bd52e196edb | 142 | const int mode = (dir != kRead) ? OUTPUT : INPUT; |
akkera102 | 0:5bd52e196edb | 143 | for (int i = 0; i < 8; i++) |
akkera102 | 0:5bd52e196edb | 144 | { |
akkera102 | 0:5bd52e196edb | 145 | ::pinMode(i, mode); |
akkera102 | 0:5bd52e196edb | 146 | } |
akkera102 | 0:5bd52e196edb | 147 | } |
akkera102 | 0:5bd52e196edb | 148 | } |
akkera102 | 0:5bd52e196edb | 149 | */ |
akkera102 | 0:5bd52e196edb | 150 | |
akkera102 | 0:5bd52e196edb | 151 | /** |
akkera102 | 0:5bd52e196edb | 152 | * ビット スワップ |
akkera102 | 0:5bd52e196edb | 153 | * @param[in] c データ |
akkera102 | 0:5bd52e196edb | 154 | * @return データ |
akkera102 | 0:5bd52e196edb | 155 | */ |
akkera102 | 0:5bd52e196edb | 156 | unsigned char CGpio::SwapBits(unsigned char c) |
akkera102 | 0:5bd52e196edb | 157 | { |
akkera102 | 0:5bd52e196edb | 158 | unsigned char s = 0; |
akkera102 | 0:5bd52e196edb | 159 | if (c & 0x01) |
akkera102 | 0:5bd52e196edb | 160 | { |
akkera102 | 0:5bd52e196edb | 161 | s |= 0x80; |
akkera102 | 0:5bd52e196edb | 162 | } |
akkera102 | 0:5bd52e196edb | 163 | if (c & 0x02) |
akkera102 | 0:5bd52e196edb | 164 | { |
akkera102 | 0:5bd52e196edb | 165 | s |= 0x40; |
akkera102 | 0:5bd52e196edb | 166 | } |
akkera102 | 0:5bd52e196edb | 167 | if (c & 0x04) |
akkera102 | 0:5bd52e196edb | 168 | { |
akkera102 | 0:5bd52e196edb | 169 | s |= 0x20; |
akkera102 | 0:5bd52e196edb | 170 | } |
akkera102 | 0:5bd52e196edb | 171 | if (c & 0x08) |
akkera102 | 0:5bd52e196edb | 172 | { |
akkera102 | 0:5bd52e196edb | 173 | s |= 0x10; |
akkera102 | 0:5bd52e196edb | 174 | } |
akkera102 | 0:5bd52e196edb | 175 | if (c & 0x10) |
akkera102 | 0:5bd52e196edb | 176 | { |
akkera102 | 0:5bd52e196edb | 177 | s |= 0x08; |
akkera102 | 0:5bd52e196edb | 178 | } |
akkera102 | 0:5bd52e196edb | 179 | if (c & 0x20) |
akkera102 | 0:5bd52e196edb | 180 | { |
akkera102 | 0:5bd52e196edb | 181 | s |= 0x04; |
akkera102 | 0:5bd52e196edb | 182 | } |
akkera102 | 0:5bd52e196edb | 183 | if (c & 0x40) |
akkera102 | 0:5bd52e196edb | 184 | { |
akkera102 | 0:5bd52e196edb | 185 | s |= 0x02; |
akkera102 | 0:5bd52e196edb | 186 | } |
akkera102 | 0:5bd52e196edb | 187 | if (c & 0x80) |
akkera102 | 0:5bd52e196edb | 188 | { |
akkera102 | 0:5bd52e196edb | 189 | s |= 0x01; |
akkera102 | 0:5bd52e196edb | 190 | } |
akkera102 | 0:5bd52e196edb | 191 | return s; |
akkera102 | 0:5bd52e196edb | 192 | } |