Pathompong Puengrostham / Mbed 2 deprecated mbedPirate

Dependencies:   mbed

Committer:
iamjay
Date:
Thu Dec 23 15:03:51 2010 +0000
Revision:
0:e0a44db7e925

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
iamjay 0:e0a44db7e925 1 #include "mbed.h"
iamjay 0:e0a44db7e925 2
iamjay 0:e0a44db7e925 3 #include "binwire.h"
iamjay 0:e0a44db7e925 4
iamjay 0:e0a44db7e925 5 #include "bitbang.h"
iamjay 0:e0a44db7e925 6 #include "main.h"
iamjay 0:e0a44db7e925 7 #include "util.h"
iamjay 0:e0a44db7e925 8
iamjay 0:e0a44db7e925 9 enum {
iamjay 0:e0a44db7e925 10 PIC614 = 0,
iamjay 0:e0a44db7e925 11 PIC416,
iamjay 0:e0a44db7e925 12 PIC424
iamjay 0:e0a44db7e925 13 };
iamjay 0:e0a44db7e925 14
iamjay 0:e0a44db7e925 15 static void bin_io_peripheral_set(unsigned char c)
iamjay 0:e0a44db7e925 16 {
iamjay 0:e0a44db7e925 17 if (c & 0x01) {
iamjay 0:e0a44db7e925 18 if (mode_config.HiZ == 0)
iamjay 0:e0a44db7e925 19 bp_cs.mode(PullNone);
iamjay 0:e0a44db7e925 20 else
iamjay 0:e0a44db7e925 21 bp_cs.mode(OpenDrain);
iamjay 0:e0a44db7e925 22 }
iamjay 0:e0a44db7e925 23 bp_cs.write(c & 0x01);
iamjay 0:e0a44db7e925 24 bp_cs.output();
iamjay 0:e0a44db7e925 25 }
iamjay 0:e0a44db7e925 26
iamjay 0:e0a44db7e925 27 static void PIC416_write(unsigned char cmd, unsigned char datl, unsigned char dath)
iamjay 0:e0a44db7e925 28 {
iamjay 0:e0a44db7e925 29 unsigned char i, delay;
iamjay 0:e0a44db7e925 30
iamjay 0:e0a44db7e925 31 delay = cmd >> 6;
iamjay 0:e0a44db7e925 32 for (i = 0; i < 4; i++) {
iamjay 0:e0a44db7e925 33 if (i == 3 && delay > 0) {
iamjay 0:e0a44db7e925 34 bb_clk(1);
iamjay 0:e0a44db7e925 35 wait_ms(delay);
iamjay 0:e0a44db7e925 36 bb_clk(0);
iamjay 0:e0a44db7e925 37 continue;
iamjay 0:e0a44db7e925 38 }
iamjay 0:e0a44db7e925 39
iamjay 0:e0a44db7e925 40 if (cmd & 1)
iamjay 0:e0a44db7e925 41 bb_write_bit(1);
iamjay 0:e0a44db7e925 42 else
iamjay 0:e0a44db7e925 43 bb_write_bit(0);
iamjay 0:e0a44db7e925 44 cmd >>= 1;
iamjay 0:e0a44db7e925 45 }
iamjay 0:e0a44db7e925 46
iamjay 0:e0a44db7e925 47 bb_write_byte(datl);
iamjay 0:e0a44db7e925 48 bb_write_byte(dath);
iamjay 0:e0a44db7e925 49 }
iamjay 0:e0a44db7e925 50
iamjay 0:e0a44db7e925 51 static void PIC24_nop()
iamjay 0:e0a44db7e925 52 {
iamjay 0:e0a44db7e925 53 bb_write_bit(0);
iamjay 0:e0a44db7e925 54 bb_write_bit(0);
iamjay 0:e0a44db7e925 55 bb_write_bit(0);
iamjay 0:e0a44db7e925 56 bb_write_bit(0);
iamjay 0:e0a44db7e925 57
iamjay 0:e0a44db7e925 58 bb_write_byte(0);
iamjay 0:e0a44db7e925 59 bb_write_byte(0);
iamjay 0:e0a44db7e925 60 bb_write_byte(0);
iamjay 0:e0a44db7e925 61 }
iamjay 0:e0a44db7e925 62
iamjay 0:e0a44db7e925 63 static void PIC424_write(unsigned long cmd, unsigned char pn)
iamjay 0:e0a44db7e925 64 {
iamjay 0:e0a44db7e925 65 unsigned char i;
iamjay 0:e0a44db7e925 66
iamjay 0:e0a44db7e925 67 bb_write_bit(0);
iamjay 0:e0a44db7e925 68 bb_write_bit(0);
iamjay 0:e0a44db7e925 69 bb_write_bit(0);
iamjay 0:e0a44db7e925 70 bb_write_bit(0);
iamjay 0:e0a44db7e925 71
iamjay 0:e0a44db7e925 72 bb_write_byte(rev_byte(cmd));
iamjay 0:e0a44db7e925 73 bb_write_byte(rev_byte(cmd >> 8));
iamjay 0:e0a44db7e925 74 bb_write_byte(rev_byte(cmd >> 16));
iamjay 0:e0a44db7e925 75
iamjay 0:e0a44db7e925 76 pn &= 0x0F;
iamjay 0:e0a44db7e925 77 for (i = 0; i < pn; i++)
iamjay 0:e0a44db7e925 78 PIC24_nop();
iamjay 0:e0a44db7e925 79 }
iamjay 0:e0a44db7e925 80
iamjay 0:e0a44db7e925 81 static void PIC424_read()
iamjay 0:e0a44db7e925 82 {
iamjay 0:e0a44db7e925 83 bb_write_bit(1);
iamjay 0:e0a44db7e925 84 bb_write_bit(0);
iamjay 0:e0a44db7e925 85 bb_write_bit(0);
iamjay 0:e0a44db7e925 86 bb_write_bit(0);
iamjay 0:e0a44db7e925 87
iamjay 0:e0a44db7e925 88 bb_write_byte(0);
iamjay 0:e0a44db7e925 89
iamjay 0:e0a44db7e925 90 bp.putc(bb_read_byte());
iamjay 0:e0a44db7e925 91 bp.putc(bb_read_byte());
iamjay 0:e0a44db7e925 92
iamjay 0:e0a44db7e925 93 PIC24_nop();
iamjay 0:e0a44db7e925 94 PIC24_nop();
iamjay 0:e0a44db7e925 95 }
iamjay 0:e0a44db7e925 96
iamjay 0:e0a44db7e925 97 void bin_wire_handler()
iamjay 0:e0a44db7e925 98 {
iamjay 0:e0a44db7e925 99 unsigned char raw_cmd, wires, i;
iamjay 0:e0a44db7e925 100 unsigned char in_byte, pic_mode = PIC614;;
iamjay 0:e0a44db7e925 101 unsigned int cmds, j;
iamjay 0:e0a44db7e925 102 bool done = false;
iamjay 0:e0a44db7e925 103 int c = 0x01;
iamjay 0:e0a44db7e925 104
iamjay 0:e0a44db7e925 105 mode_config.HiZ = 1;
iamjay 0:e0a44db7e925 106 mode_config.lsbEN = 0;
iamjay 0:e0a44db7e925 107 mode_config.speed = 1;
iamjay 0:e0a44db7e925 108 mode_config.numbits = 8;
iamjay 0:e0a44db7e925 109
iamjay 0:e0a44db7e925 110 wires = 2;
iamjay 0:e0a44db7e925 111
iamjay 0:e0a44db7e925 112 bp_mosi.write(0); bp_mosi.output();
iamjay 0:e0a44db7e925 113 bp_clk.write(0); bp_clk.output();
iamjay 0:e0a44db7e925 114 bp_miso.input();
iamjay 0:e0a44db7e925 115 bb_cs(1);
iamjay 0:e0a44db7e925 116
iamjay 0:e0a44db7e925 117 bb_setup(2, 0xff);
iamjay 0:e0a44db7e925 118
iamjay 0:e0a44db7e925 119 while (1) {
iamjay 0:e0a44db7e925 120 raw_cmd = (c>>4);
iamjay 0:e0a44db7e925 121
iamjay 0:e0a44db7e925 122 switch (raw_cmd) {
iamjay 0:e0a44db7e925 123 case 0:
iamjay 0:e0a44db7e925 124 switch (c) {
iamjay 0:e0a44db7e925 125 case 0:
iamjay 0:e0a44db7e925 126 // Exit RAW wire mode
iamjay 0:e0a44db7e925 127 mode = BITBANG_MODE;
iamjay 0:e0a44db7e925 128 done = true;
iamjay 0:e0a44db7e925 129 break;
iamjay 0:e0a44db7e925 130 case 1:
iamjay 0:e0a44db7e925 131 bp.printf("RAW1");
iamjay 0:e0a44db7e925 132 break;
iamjay 0:e0a44db7e925 133 case 2:
iamjay 0:e0a44db7e925 134 bb_i2c_start();
iamjay 0:e0a44db7e925 135 bp.putc(1);
iamjay 0:e0a44db7e925 136 break;
iamjay 0:e0a44db7e925 137 case 3:
iamjay 0:e0a44db7e925 138 bb_i2c_stop();
iamjay 0:e0a44db7e925 139 bp.putc(1);
iamjay 0:e0a44db7e925 140 break;
iamjay 0:e0a44db7e925 141 case 4:
iamjay 0:e0a44db7e925 142 bb_cs(0);
iamjay 0:e0a44db7e925 143 bp.putc(1);
iamjay 0:e0a44db7e925 144 break;
iamjay 0:e0a44db7e925 145 case 5:
iamjay 0:e0a44db7e925 146 bb_cs(1);
iamjay 0:e0a44db7e925 147 bp.putc(1);
iamjay 0:e0a44db7e925 148 break;
iamjay 0:e0a44db7e925 149 case 6:
iamjay 0:e0a44db7e925 150 if (wires == 2)
iamjay 0:e0a44db7e925 151 i = bb_read_byte();
iamjay 0:e0a44db7e925 152 else
iamjay 0:e0a44db7e925 153 i = bb_read_write_byte(0xff);
iamjay 0:e0a44db7e925 154 if (mode_config.lsbEN == 1)
iamjay 0:e0a44db7e925 155 i = rev_byte(i);
iamjay 0:e0a44db7e925 156 bp.putc(i);
iamjay 0:e0a44db7e925 157 break;
iamjay 0:e0a44db7e925 158 case 7:
iamjay 0:e0a44db7e925 159 bp.putc(bb_read_bit());
iamjay 0:e0a44db7e925 160 break;
iamjay 0:e0a44db7e925 161 case 8:
iamjay 0:e0a44db7e925 162 bp.putc(bb_miso());
iamjay 0:e0a44db7e925 163 break;
iamjay 0:e0a44db7e925 164 case 9:
iamjay 0:e0a44db7e925 165 bb_clock_ticks(1);
iamjay 0:e0a44db7e925 166 bp.putc(1);
iamjay 0:e0a44db7e925 167 break;
iamjay 0:e0a44db7e925 168 case 10:
iamjay 0:e0a44db7e925 169 bb_clk(0);
iamjay 0:e0a44db7e925 170 bp.putc(1);
iamjay 0:e0a44db7e925 171 break;
iamjay 0:e0a44db7e925 172 case 11:
iamjay 0:e0a44db7e925 173 bb_clk(1);
iamjay 0:e0a44db7e925 174 bp.putc(1);
iamjay 0:e0a44db7e925 175 break;
iamjay 0:e0a44db7e925 176 case 12:
iamjay 0:e0a44db7e925 177 bb_mosi(0);
iamjay 0:e0a44db7e925 178 bp.putc(1);
iamjay 0:e0a44db7e925 179 break;
iamjay 0:e0a44db7e925 180 case 13:
iamjay 0:e0a44db7e925 181 bb_mosi(1);
iamjay 0:e0a44db7e925 182 bp.putc(1);
iamjay 0:e0a44db7e925 183 break;
iamjay 0:e0a44db7e925 184 default:
iamjay 0:e0a44db7e925 185 bp.putc(0);
iamjay 0:e0a44db7e925 186 break;
iamjay 0:e0a44db7e925 187 }
iamjay 0:e0a44db7e925 188 break;
iamjay 0:e0a44db7e925 189
iamjay 0:e0a44db7e925 190 case 0x01:
iamjay 0:e0a44db7e925 191 in_byte = c & 0x0F;
iamjay 0:e0a44db7e925 192 in_byte++;
iamjay 0:e0a44db7e925 193 bp.putc(1);
iamjay 0:e0a44db7e925 194
iamjay 0:e0a44db7e925 195 for (i = 0; i < in_byte; i++) {
iamjay 0:e0a44db7e925 196 c = bp.getc();
iamjay 0:e0a44db7e925 197 if (mode_config.lsbEN == 1)
iamjay 0:e0a44db7e925 198 c = rev_byte(c);
iamjay 0:e0a44db7e925 199 if (wires == 2) {
iamjay 0:e0a44db7e925 200 bb_write_byte(c);
iamjay 0:e0a44db7e925 201 bp.putc(1);
iamjay 0:e0a44db7e925 202 } else {
iamjay 0:e0a44db7e925 203 c = bb_read_write_byte(c);
iamjay 0:e0a44db7e925 204 if (mode_config.lsbEN == 1)
iamjay 0:e0a44db7e925 205 c = rev_byte(c);
iamjay 0:e0a44db7e925 206 bp.putc(c);
iamjay 0:e0a44db7e925 207 }
iamjay 0:e0a44db7e925 208 }
iamjay 0:e0a44db7e925 209 break;
iamjay 0:e0a44db7e925 210
iamjay 0:e0a44db7e925 211 case 0x02:
iamjay 0:e0a44db7e925 212 in_byte = c & 0x0F;
iamjay 0:e0a44db7e925 213 in_byte++;
iamjay 0:e0a44db7e925 214 bb_clock_ticks(in_byte);
iamjay 0:e0a44db7e925 215 bp.putc(1);
iamjay 0:e0a44db7e925 216 break;
iamjay 0:e0a44db7e925 217
iamjay 0:e0a44db7e925 218 case 0x03:
iamjay 0:e0a44db7e925 219 in_byte = c & 0x0F;
iamjay 0:e0a44db7e925 220 in_byte++;
iamjay 0:e0a44db7e925 221 bp.putc(1);
iamjay 0:e0a44db7e925 222 raw_cmd = bp.getc();
iamjay 0:e0a44db7e925 223 for (i = 0; i < in_byte; i++) {
iamjay 0:e0a44db7e925 224 if (raw_cmd & 0x80)
iamjay 0:e0a44db7e925 225 bb_write_bit(1);
iamjay 0:e0a44db7e925 226 else
iamjay 0:e0a44db7e925 227 bb_write_bit(0);
iamjay 0:e0a44db7e925 228 raw_cmd = raw_cmd << 1;
iamjay 0:e0a44db7e925 229 }
iamjay 0:e0a44db7e925 230 bp.putc(1);
iamjay 0:e0a44db7e925 231 break;
iamjay 0:e0a44db7e925 232
iamjay 0:e0a44db7e925 233 case 0x0A:
iamjay 0:e0a44db7e925 234 switch (c) {
iamjay 0:e0a44db7e925 235 case 0xA0:
iamjay 0:e0a44db7e925 236 pic_mode = bp.getc();
iamjay 0:e0a44db7e925 237 bp.putc(1);
iamjay 0:e0a44db7e925 238 break;
iamjay 0:e0a44db7e925 239
iamjay 0:e0a44db7e925 240 case 0xA4:
iamjay 0:e0a44db7e925 241 switch (pic_mode) {
iamjay 0:e0a44db7e925 242 case PIC416:
iamjay 0:e0a44db7e925 243 cmds = bp.getc();
iamjay 0:e0a44db7e925 244 cmds *= 3;
iamjay 0:e0a44db7e925 245 for (j = 0; j < cmds; j++)
iamjay 0:e0a44db7e925 246 bp_config.terminal_input[j] = bp.getc();
iamjay 0:e0a44db7e925 247
iamjay 0:e0a44db7e925 248 for (j = 0; j < cmds; j += 3)
iamjay 0:e0a44db7e925 249 PIC416_write(bp_config.terminal_input[j],
iamjay 0:e0a44db7e925 250 bp_config.terminal_input[j + 1],
iamjay 0:e0a44db7e925 251 bp_config.terminal_input[j + 2]);
iamjay 0:e0a44db7e925 252 bp.putc(1);
iamjay 0:e0a44db7e925 253 break;
iamjay 0:e0a44db7e925 254 case PIC424:
iamjay 0:e0a44db7e925 255 cmds = bp.getc();
iamjay 0:e0a44db7e925 256 cmds *= 4;
iamjay 0:e0a44db7e925 257 for (j = 0; j < cmds; j++) {
iamjay 0:e0a44db7e925 258 bp_config.terminal_input[j] = bp.getc();
iamjay 0:e0a44db7e925 259 }
iamjay 0:e0a44db7e925 260 for (j = 0; j < cmds; j += 4) {
iamjay 0:e0a44db7e925 261 bb_write_bit(0);
iamjay 0:e0a44db7e925 262 bb_write_bit(0);
iamjay 0:e0a44db7e925 263 bb_write_bit(0);
iamjay 0:e0a44db7e925 264 bb_write_bit(0);
iamjay 0:e0a44db7e925 265
iamjay 0:e0a44db7e925 266 bb_write_byte(bp_config.terminal_input[j]);
iamjay 0:e0a44db7e925 267 bb_write_byte(bp_config.terminal_input[j + 1]);
iamjay 0:e0a44db7e925 268 bb_write_byte(bp_config.terminal_input[j + 2]);
iamjay 0:e0a44db7e925 269
iamjay 0:e0a44db7e925 270 bp_config.terminal_input[j + 3] &= 0x0F;
iamjay 0:e0a44db7e925 271 for (i = 0; i < bp_config.terminal_input[j + 3]; i++)
iamjay 0:e0a44db7e925 272 PIC24_nop();
iamjay 0:e0a44db7e925 273 }
iamjay 0:e0a44db7e925 274 bp.putc(1);
iamjay 0:e0a44db7e925 275 break;
iamjay 0:e0a44db7e925 276 default:
iamjay 0:e0a44db7e925 277 bp.putc(0);
iamjay 0:e0a44db7e925 278 break;
iamjay 0:e0a44db7e925 279 }
iamjay 0:e0a44db7e925 280 break;
iamjay 0:e0a44db7e925 281
iamjay 0:e0a44db7e925 282 case 0xA5:
iamjay 0:e0a44db7e925 283 switch (pic_mode) {
iamjay 0:e0a44db7e925 284 case PIC416:
iamjay 0:e0a44db7e925 285 cmds = bp.getc();
iamjay 0:e0a44db7e925 286 raw_cmd = bp.getc();
iamjay 0:e0a44db7e925 287 for ( j = 0; j < cmds; j++) {
iamjay 0:e0a44db7e925 288 c = raw_cmd;
iamjay 0:e0a44db7e925 289 for (i = 0; i < 4; i++) {
iamjay 0:e0a44db7e925 290 if (c & 1)
iamjay 0:e0a44db7e925 291 bb_write_bit(1);
iamjay 0:e0a44db7e925 292 else
iamjay 0:e0a44db7e925 293 bb_write_bit(0);
iamjay 0:e0a44db7e925 294 c >>= 1;
iamjay 0:e0a44db7e925 295 }
iamjay 0:e0a44db7e925 296 bb_read_byte();
iamjay 0:e0a44db7e925 297 bp.putc(bb_read_byte());
iamjay 0:e0a44db7e925 298 }
iamjay 0:e0a44db7e925 299 break;
iamjay 0:e0a44db7e925 300 case PIC424:
iamjay 0:e0a44db7e925 301 cmds = bp.getc();
iamjay 0:e0a44db7e925 302 for (j = 0; j < cmds; j++) {
iamjay 0:e0a44db7e925 303 PIC424_write(0xBA0B96, 2);
iamjay 0:e0a44db7e925 304 PIC424_read();
iamjay 0:e0a44db7e925 305 PIC424_write(0xBADBB6, 2);
iamjay 0:e0a44db7e925 306 PIC424_write(0xBAD3D6, 2);
iamjay 0:e0a44db7e925 307 PIC424_read();
iamjay 0:e0a44db7e925 308 PIC424_write(0xBA0BB6, 2);
iamjay 0:e0a44db7e925 309 PIC424_read();
iamjay 0:e0a44db7e925 310 }
iamjay 0:e0a44db7e925 311 break;
iamjay 0:e0a44db7e925 312 default:
iamjay 0:e0a44db7e925 313 break;
iamjay 0:e0a44db7e925 314 }
iamjay 0:e0a44db7e925 315 break;
iamjay 0:e0a44db7e925 316
iamjay 0:e0a44db7e925 317 default:
iamjay 0:e0a44db7e925 318 bp.putc(0);
iamjay 0:e0a44db7e925 319 break;
iamjay 0:e0a44db7e925 320 }
iamjay 0:e0a44db7e925 321 break;
iamjay 0:e0a44db7e925 322
iamjay 0:e0a44db7e925 323 case 0x04:
iamjay 0:e0a44db7e925 324 bin_io_peripheral_set(c);
iamjay 0:e0a44db7e925 325 bp.putc(1);
iamjay 0:e0a44db7e925 326 break;
iamjay 0:e0a44db7e925 327
iamjay 0:e0a44db7e925 328 case 0x06:
iamjay 0:e0a44db7e925 329 c &= 0x03;
iamjay 0:e0a44db7e925 330 mode_config.speed = c;
iamjay 0:e0a44db7e925 331 bb_setup(wires, mode_config.speed);
iamjay 0:e0a44db7e925 332 bb_cs(1);
iamjay 0:e0a44db7e925 333 bp.putc(1);
iamjay 0:e0a44db7e925 334 break;
iamjay 0:e0a44db7e925 335
iamjay 0:e0a44db7e925 336 case 0x08:
iamjay 0:e0a44db7e925 337 if (c & 0x08)
iamjay 0:e0a44db7e925 338 mode_config.HiZ = 0;
iamjay 0:e0a44db7e925 339 else
iamjay 0:e0a44db7e925 340 mode_config.HiZ = 1;
iamjay 0:e0a44db7e925 341
iamjay 0:e0a44db7e925 342 if (c & 0x04)
iamjay 0:e0a44db7e925 343 wires = 3;
iamjay 0:e0a44db7e925 344 else
iamjay 0:e0a44db7e925 345 wires = 2;
iamjay 0:e0a44db7e925 346
iamjay 0:e0a44db7e925 347 if (c & 0x02)
iamjay 0:e0a44db7e925 348 mode_config.lsbEN = 1;
iamjay 0:e0a44db7e925 349 else
iamjay 0:e0a44db7e925 350 mode_config.lsbEN = 0;
iamjay 0:e0a44db7e925 351
iamjay 0:e0a44db7e925 352 bb_setup(wires, mode_config.speed);
iamjay 0:e0a44db7e925 353 bb_cs(1);
iamjay 0:e0a44db7e925 354 bp.putc(1);
iamjay 0:e0a44db7e925 355 break;
iamjay 0:e0a44db7e925 356
iamjay 0:e0a44db7e925 357 default:
iamjay 0:e0a44db7e925 358 bp.putc(0);
iamjay 0:e0a44db7e925 359 break;
iamjay 0:e0a44db7e925 360 }
iamjay 0:e0a44db7e925 361
iamjay 0:e0a44db7e925 362 if (done)
iamjay 0:e0a44db7e925 363 break;
iamjay 0:e0a44db7e925 364 c = bp.getc();
iamjay 0:e0a44db7e925 365 }
iamjay 0:e0a44db7e925 366 }