This is a program for testing the 8255 interface on protocoltool. It implements a software emulation of the bidirectional mode 2 of a 8255 chip.
Fork of parallel_port_tester by
main.cpp@0:a5957f25b150, 2013-07-26 (annotated)
- Committer:
- jpelletier
- Date:
- Fri Jul 26 04:51:00 2013 +0000
- Revision:
- 0:a5957f25b150
- Child:
- 1:51bc46468482
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jpelletier | 0:a5957f25b150 | 1 | #include "mbed.h" |
jpelletier | 0:a5957f25b150 | 2 | |
jpelletier | 0:a5957f25b150 | 3 | //#include <stdarg.h> |
jpelletier | 0:a5957f25b150 | 4 | #include <stdio.h> |
jpelletier | 0:a5957f25b150 | 5 | #include <stdlib.h> |
jpelletier | 0:a5957f25b150 | 6 | #include <string.h> |
jpelletier | 0:a5957f25b150 | 7 | |
jpelletier | 0:a5957f25b150 | 8 | #define PAR_NEGOTIATE_EXTENSIBILITY_LINK 0x80 |
jpelletier | 0:a5957f25b150 | 9 | #define PAR_NEGOTIATE_REQ_EPP_MODE 0x40 |
jpelletier | 0:a5957f25b150 | 10 | #define PAR_NEGOTIATE_REQ_ECP_MODE 0x10 |
jpelletier | 0:a5957f25b150 | 11 | #define PAR_NEGOTIATE_REQ_ECP_RLE_MODE 0x30 |
jpelletier | 0:a5957f25b150 | 12 | #define PAR_NEGOTIATE_REQ_DEV_ID_NIBBLE_MODE 0x04 |
jpelletier | 0:a5957f25b150 | 13 | #define PAR_NEGOTIATE_REQ_DEV_ID_BYTE_MODE 0x05 |
jpelletier | 0:a5957f25b150 | 14 | #define PAR_NEGOTIATE_REQ_DEV_ID_ECP_MODE 0x14 |
jpelletier | 0:a5957f25b150 | 15 | #define PAR_NEGOTIATE_REQ_DEV_ID_ECP_RLE_MODE 0x34 |
jpelletier | 0:a5957f25b150 | 16 | #define PAR_NEGOTIATE_NIBBLE_MODE 0x00 |
jpelletier | 0:a5957f25b150 | 17 | #define PAR_NEGOTIATE_BYTE_MODE 0x01 |
jpelletier | 0:a5957f25b150 | 18 | |
jpelletier | 0:a5957f25b150 | 19 | /* |
jpelletier | 0:a5957f25b150 | 20 | Instructions for use: connect the mbed to a parallel port using these connexions. |
jpelletier | 0:a5957f25b150 | 21 | use a terminal program to connect via USB to the mbed side. |
jpelletier | 0:a5957f25b150 | 22 | |
jpelletier | 0:a5957f25b150 | 23 | This program uses CR to rewrite over the status previously printed. Setup the terminal |
jpelletier | 0:a5957f25b150 | 24 | program so that CR = CR without line feed. |
jpelletier | 0:a5957f25b150 | 25 | |
jpelletier | 0:a5957f25b150 | 26 | 15 nError -> p9 |
jpelletier | 0:a5957f25b150 | 27 | 13 Select -> p10 |
jpelletier | 0:a5957f25b150 | 28 | 12 PE -> p11 |
jpelletier | 0:a5957f25b150 | 29 | 11 Busy -> p12 |
jpelletier | 0:a5957f25b150 | 30 | 10 nAck -> p13 |
jpelletier | 0:a5957f25b150 | 31 | |
jpelletier | 0:a5957f25b150 | 32 | 1 nStrobe -> p14 |
jpelletier | 0:a5957f25b150 | 33 | 14 nAutoFeed -> p15 |
jpelletier | 0:a5957f25b150 | 34 | 16 nInit -> p16 |
jpelletier | 0:a5957f25b150 | 35 | 17 nSelectIn -> p17 |
jpelletier | 0:a5957f25b150 | 36 | */ |
jpelletier | 0:a5957f25b150 | 37 | |
jpelletier | 0:a5957f25b150 | 38 | DigitalOut nError(p9); |
jpelletier | 0:a5957f25b150 | 39 | DigitalOut Select(p10); |
jpelletier | 0:a5957f25b150 | 40 | DigitalOut PaperOut(p11); |
jpelletier | 0:a5957f25b150 | 41 | DigitalOut Busy(p12); |
jpelletier | 0:a5957f25b150 | 42 | DigitalOut nAck(p13); |
jpelletier | 0:a5957f25b150 | 43 | |
jpelletier | 0:a5957f25b150 | 44 | DigitalIn nStrobe(p14); |
jpelletier | 0:a5957f25b150 | 45 | DigitalIn nAutoFeed(p15); |
jpelletier | 0:a5957f25b150 | 46 | DigitalIn nInit(p16); |
jpelletier | 0:a5957f25b150 | 47 | DigitalIn nSelectIn(p17); |
jpelletier | 0:a5957f25b150 | 48 | |
jpelletier | 0:a5957f25b150 | 49 | /* |
jpelletier | 0:a5957f25b150 | 50 | D0 p30 p0.4 |
jpelletier | 0:a5957f25b150 | 51 | D1 p29 p0.5 |
jpelletier | 0:a5957f25b150 | 52 | D2 p8 p0.6 |
jpelletier | 0:a5957f25b150 | 53 | D3 p7 p0.7 |
jpelletier | 0:a5957f25b150 | 54 | D4 p6 p0.8 |
jpelletier | 0:a5957f25b150 | 55 | D5 p5 p0.9 |
jpelletier | 0:a5957f25b150 | 56 | D6 p28 p0.10 |
jpelletier | 0:a5957f25b150 | 57 | D7 p27 p0.11 |
jpelletier | 0:a5957f25b150 | 58 | */ |
jpelletier | 0:a5957f25b150 | 59 | BusInOut PtrData(p30,p29,p8,p7,p6,p5,p28,p27); |
jpelletier | 0:a5957f25b150 | 60 | |
jpelletier | 0:a5957f25b150 | 61 | #define __DOUTBUFSIZE 256 |
jpelletier | 0:a5957f25b150 | 62 | #define __DINBUFSIZE 256 |
jpelletier | 0:a5957f25b150 | 63 | char __outstr[__DOUTBUFSIZE]; |
jpelletier | 0:a5957f25b150 | 64 | char __instr[__DINBUFSIZE]; |
jpelletier | 0:a5957f25b150 | 65 | |
jpelletier | 0:a5957f25b150 | 66 | Serial pc(USBTX, USBRX); // tx, rx |
jpelletier | 0:a5957f25b150 | 67 | |
jpelletier | 0:a5957f25b150 | 68 | int main() { |
jpelletier | 0:a5957f25b150 | 69 | |
jpelletier | 0:a5957f25b150 | 70 | char key; |
jpelletier | 0:a5957f25b150 | 71 | bool PortIsInput = false; |
jpelletier | 0:a5957f25b150 | 72 | |
jpelletier | 0:a5957f25b150 | 73 | PtrData.input(); |
jpelletier | 0:a5957f25b150 | 74 | |
jpelletier | 0:a5957f25b150 | 75 | pc.printf("Parallel port tester on mbed\r\n\n"); |
jpelletier | 0:a5957f25b150 | 76 | pc.printf("Press keys 0-7,G,H,J,K and L to toggle output bits (inputs on PC)\r\n"); |
jpelletier | 0:a5957f25b150 | 77 | pc.printf("Press keys I and O to toggle data direction for bits 0-7\r\n"); |
jpelletier | 0:a5957f25b150 | 78 | pc.printf(" (be sure your PC and mbed don't output at the same time)\r\n\n"); |
jpelletier | 0:a5957f25b150 | 79 | pc.printf("PINS 9-2 1 14 16 17 ------ 15 13 12 11 10\r\n"); |
jpelletier | 0:a5957f25b150 | 80 | pc.printf("DATA 7-0 /STB /AF /INIT /SEL_IN ------/ERR SEL PO BUSY /ACK\r\n"); |
jpelletier | 0:a5957f25b150 | 81 | pc.printf("Keys ------ G H J K L\r\n"); |
jpelletier | 0:a5957f25b150 | 82 | // XX B B B B ------ B B B B B |
jpelletier | 0:a5957f25b150 | 83 | while(1) { |
jpelletier | 0:a5957f25b150 | 84 | pc.printf(" %02X %c %c %c %c %c %c %c %c %c \r", |
jpelletier | 0:a5957f25b150 | 85 | PtrData & 0xff, |
jpelletier | 0:a5957f25b150 | 86 | '0'| nStrobe, |
jpelletier | 0:a5957f25b150 | 87 | '0'| nAutoFeed, |
jpelletier | 0:a5957f25b150 | 88 | '0'| nInit, |
jpelletier | 0:a5957f25b150 | 89 | '0'| nSelectIn, |
jpelletier | 0:a5957f25b150 | 90 | '0'| nError, |
jpelletier | 0:a5957f25b150 | 91 | '0'| Select, |
jpelletier | 0:a5957f25b150 | 92 | '0'| PaperOut, |
jpelletier | 0:a5957f25b150 | 93 | '0'| Busy, |
jpelletier | 0:a5957f25b150 | 94 | '0'| nAck |
jpelletier | 0:a5957f25b150 | 95 | ); |
jpelletier | 0:a5957f25b150 | 96 | |
jpelletier | 0:a5957f25b150 | 97 | if (pc.readable()) |
jpelletier | 0:a5957f25b150 | 98 | { |
jpelletier | 0:a5957f25b150 | 99 | key = pc.getc(); |
jpelletier | 0:a5957f25b150 | 100 | switch(key) |
jpelletier | 0:a5957f25b150 | 101 | { |
jpelletier | 0:a5957f25b150 | 102 | case 'I': |
jpelletier | 0:a5957f25b150 | 103 | PtrData.input(); |
jpelletier | 0:a5957f25b150 | 104 | PortIsInput = true; |
jpelletier | 0:a5957f25b150 | 105 | break; |
jpelletier | 0:a5957f25b150 | 106 | case 'O': |
jpelletier | 0:a5957f25b150 | 107 | PtrData.output(); |
jpelletier | 0:a5957f25b150 | 108 | PortIsInput = false; |
jpelletier | 0:a5957f25b150 | 109 | break; |
jpelletier | 0:a5957f25b150 | 110 | case '0': |
jpelletier | 0:a5957f25b150 | 111 | if (!PortIsInput) |
jpelletier | 0:a5957f25b150 | 112 | PtrData = PtrData ^ 0x01; |
jpelletier | 0:a5957f25b150 | 113 | break; |
jpelletier | 0:a5957f25b150 | 114 | case '1': |
jpelletier | 0:a5957f25b150 | 115 | if (!PortIsInput) |
jpelletier | 0:a5957f25b150 | 116 | PtrData = PtrData ^ 0x02; |
jpelletier | 0:a5957f25b150 | 117 | break; |
jpelletier | 0:a5957f25b150 | 118 | case '2': |
jpelletier | 0:a5957f25b150 | 119 | if (!PortIsInput) |
jpelletier | 0:a5957f25b150 | 120 | PtrData = PtrData ^ 0x04; |
jpelletier | 0:a5957f25b150 | 121 | break; |
jpelletier | 0:a5957f25b150 | 122 | case '3': |
jpelletier | 0:a5957f25b150 | 123 | if (!PortIsInput) |
jpelletier | 0:a5957f25b150 | 124 | PtrData = PtrData ^ 0x08; |
jpelletier | 0:a5957f25b150 | 125 | break; |
jpelletier | 0:a5957f25b150 | 126 | case '4': |
jpelletier | 0:a5957f25b150 | 127 | if (!PortIsInput) |
jpelletier | 0:a5957f25b150 | 128 | PtrData = PtrData ^ 0x10; |
jpelletier | 0:a5957f25b150 | 129 | break; |
jpelletier | 0:a5957f25b150 | 130 | case '5': |
jpelletier | 0:a5957f25b150 | 131 | if (!PortIsInput) |
jpelletier | 0:a5957f25b150 | 132 | PtrData = PtrData ^ 0x20; |
jpelletier | 0:a5957f25b150 | 133 | break; |
jpelletier | 0:a5957f25b150 | 134 | case '6': |
jpelletier | 0:a5957f25b150 | 135 | if (!PortIsInput) |
jpelletier | 0:a5957f25b150 | 136 | PtrData = PtrData ^ 0x40; |
jpelletier | 0:a5957f25b150 | 137 | break; |
jpelletier | 0:a5957f25b150 | 138 | case '7': |
jpelletier | 0:a5957f25b150 | 139 | if (!PortIsInput) |
jpelletier | 0:a5957f25b150 | 140 | PtrData = PtrData ^ 0x80; |
jpelletier | 0:a5957f25b150 | 141 | break; |
jpelletier | 0:a5957f25b150 | 142 | case 'G': |
jpelletier | 0:a5957f25b150 | 143 | nError = !nError; |
jpelletier | 0:a5957f25b150 | 144 | break; |
jpelletier | 0:a5957f25b150 | 145 | case 'H': |
jpelletier | 0:a5957f25b150 | 146 | Select = !Select; |
jpelletier | 0:a5957f25b150 | 147 | break; |
jpelletier | 0:a5957f25b150 | 148 | case 'J': |
jpelletier | 0:a5957f25b150 | 149 | PaperOut = !PaperOut; |
jpelletier | 0:a5957f25b150 | 150 | break; |
jpelletier | 0:a5957f25b150 | 151 | case 'K': |
jpelletier | 0:a5957f25b150 | 152 | Busy = !Busy; |
jpelletier | 0:a5957f25b150 | 153 | break; |
jpelletier | 0:a5957f25b150 | 154 | case 'L': |
jpelletier | 0:a5957f25b150 | 155 | nAck = !nAck; |
jpelletier | 0:a5957f25b150 | 156 | break; |
jpelletier | 0:a5957f25b150 | 157 | default: |
jpelletier | 0:a5957f25b150 | 158 | ; |
jpelletier | 0:a5957f25b150 | 159 | } |
jpelletier | 0:a5957f25b150 | 160 | } |
jpelletier | 0:a5957f25b150 | 161 | } |
jpelletier | 0:a5957f25b150 | 162 | } |