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@1:51bc46468482, 2013-10-27 (annotated)
- Committer:
- jpelletier
- Date:
- Sun Oct 27 04:32:14 2013 +0000
- Revision:
- 1:51bc46468482
- Parent:
- 0:a5957f25b150
- Child:
- 2:0cc974f03339
This program emulates the bidirectional port of the 8255 Peripheral IO chip.
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 | 1:51bc46468482 | 8 | /* |
jpelletier | 0:a5957f25b150 | 9 | #define PAR_NEGOTIATE_EXTENSIBILITY_LINK 0x80 |
jpelletier | 0:a5957f25b150 | 10 | #define PAR_NEGOTIATE_REQ_EPP_MODE 0x40 |
jpelletier | 0:a5957f25b150 | 11 | #define PAR_NEGOTIATE_REQ_ECP_MODE 0x10 |
jpelletier | 0:a5957f25b150 | 12 | #define PAR_NEGOTIATE_REQ_ECP_RLE_MODE 0x30 |
jpelletier | 0:a5957f25b150 | 13 | #define PAR_NEGOTIATE_REQ_DEV_ID_NIBBLE_MODE 0x04 |
jpelletier | 0:a5957f25b150 | 14 | #define PAR_NEGOTIATE_REQ_DEV_ID_BYTE_MODE 0x05 |
jpelletier | 0:a5957f25b150 | 15 | #define PAR_NEGOTIATE_REQ_DEV_ID_ECP_MODE 0x14 |
jpelletier | 0:a5957f25b150 | 16 | #define PAR_NEGOTIATE_REQ_DEV_ID_ECP_RLE_MODE 0x34 |
jpelletier | 0:a5957f25b150 | 17 | #define PAR_NEGOTIATE_NIBBLE_MODE 0x00 |
jpelletier | 0:a5957f25b150 | 18 | #define PAR_NEGOTIATE_BYTE_MODE 0x01 |
jpelletier | 1:51bc46468482 | 19 | */ |
jpelletier | 0:a5957f25b150 | 20 | |
jpelletier | 0:a5957f25b150 | 21 | /* |
jpelletier | 0:a5957f25b150 | 22 | Instructions for use: connect the mbed to a parallel port using these connexions. |
jpelletier | 1:51bc46468482 | 23 | use a terminal program to connect via USB to the mbed side. */ |
jpelletier | 0:a5957f25b150 | 24 | |
jpelletier | 1:51bc46468482 | 25 | #define PAR_INVERT_OBF_SIGNAL |
jpelletier | 1:51bc46468482 | 26 | |
jpelletier | 1:51bc46468482 | 27 | #define PAR_8255_SEND_MASK 0x80 |
jpelletier | 1:51bc46468482 | 28 | #define PAR_8255_RECV_MASK 0x40 |
jpelletier | 0:a5957f25b150 | 29 | |
jpelletier | 1:51bc46468482 | 30 | /* |
jpelletier | 1:51bc46468482 | 31 | 8255 Parallel Pin Bit |
jpelletier | 1:51bc46468482 | 32 | PC7 /OBF -> /ACK 10 6 |
jpelletier | 1:51bc46468482 | 33 | PC6 /ACK <- /SLCTIN 17 3 |
jpelletier | 1:51bc46468482 | 34 | PC5 IBF -> BUSY 11 7 |
jpelletier | 1:51bc46468482 | 35 | PC4 /STB <- /STB 1 0 |
jpelletier | 0:a5957f25b150 | 36 | |
jpelletier | 1:51bc46468482 | 37 | 15 nError -> p9 not used |
jpelletier | 1:51bc46468482 | 38 | 13 Select -> p10 not used |
jpelletier | 1:51bc46468482 | 39 | 12 PE -> p11 not used |
jpelletier | 1:51bc46468482 | 40 | 11 Busy -> p12 IBF |
jpelletier | 1:51bc46468482 | 41 | 10 nAck -> p13 /OBF |
jpelletier | 1:51bc46468482 | 42 | |
jpelletier | 1:51bc46468482 | 43 | 1 nStrobe -> p14 /STB |
jpelletier | 1:51bc46468482 | 44 | 14 nAutoFeed -> p15 not used |
jpelletier | 1:51bc46468482 | 45 | 16 nInit -> p16 not used |
jpelletier | 1:51bc46468482 | 46 | 17 nSelectIn -> p17 /ACK |
jpelletier | 0:a5957f25b150 | 47 | */ |
jpelletier | 0:a5957f25b150 | 48 | |
jpelletier | 1:51bc46468482 | 49 | DigitalOut IBF(p12); // IBF |
jpelletier | 1:51bc46468482 | 50 | DigitalOut nOBF(p13); // /OBF |
jpelletier | 0:a5957f25b150 | 51 | |
jpelletier | 1:51bc46468482 | 52 | InterruptIn nSTB(p14); |
jpelletier | 1:51bc46468482 | 53 | InterruptIn nACK(p17); |
jpelletier | 0:a5957f25b150 | 54 | |
jpelletier | 0:a5957f25b150 | 55 | /* |
jpelletier | 0:a5957f25b150 | 56 | D0 p30 p0.4 |
jpelletier | 0:a5957f25b150 | 57 | D1 p29 p0.5 |
jpelletier | 0:a5957f25b150 | 58 | D2 p8 p0.6 |
jpelletier | 0:a5957f25b150 | 59 | D3 p7 p0.7 |
jpelletier | 0:a5957f25b150 | 60 | D4 p6 p0.8 |
jpelletier | 0:a5957f25b150 | 61 | D5 p5 p0.9 |
jpelletier | 0:a5957f25b150 | 62 | D6 p28 p0.10 |
jpelletier | 0:a5957f25b150 | 63 | D7 p27 p0.11 |
jpelletier | 0:a5957f25b150 | 64 | */ |
jpelletier | 0:a5957f25b150 | 65 | BusInOut PtrData(p30,p29,p8,p7,p6,p5,p28,p27); |
jpelletier | 0:a5957f25b150 | 66 | |
jpelletier | 0:a5957f25b150 | 67 | #define __DOUTBUFSIZE 256 |
jpelletier | 0:a5957f25b150 | 68 | #define __DINBUFSIZE 256 |
jpelletier | 0:a5957f25b150 | 69 | char __outstr[__DOUTBUFSIZE]; |
jpelletier | 0:a5957f25b150 | 70 | char __instr[__DINBUFSIZE]; |
jpelletier | 0:a5957f25b150 | 71 | |
jpelletier | 0:a5957f25b150 | 72 | Serial pc(USBTX, USBRX); // tx, rx |
jpelletier | 0:a5957f25b150 | 73 | |
jpelletier | 1:51bc46468482 | 74 | unsigned char rx_data; |
jpelletier | 1:51bc46468482 | 75 | |
jpelletier | 1:51bc46468482 | 76 | // Peripheral should check that there is no output pending from the 8255 to the peripheral before writing to the 8255 |
jpelletier | 1:51bc46468482 | 77 | |
jpelletier | 1:51bc46468482 | 78 | // When /STB is falling |
jpelletier | 1:51bc46468482 | 79 | void perif2mbed(void) |
jpelletier | 1:51bc46468482 | 80 | { |
jpelletier | 1:51bc46468482 | 81 | // read byte from peripheral |
jpelletier | 1:51bc46468482 | 82 | rx_data = PtrData; |
jpelletier | 1:51bc46468482 | 83 | IBF = 1; |
jpelletier | 1:51bc46468482 | 84 | } |
jpelletier | 1:51bc46468482 | 85 | |
jpelletier | 1:51bc46468482 | 86 | // When /ACK is rising |
jpelletier | 1:51bc46468482 | 87 | void mbed2perif(void) |
jpelletier | 1:51bc46468482 | 88 | { |
jpelletier | 1:51bc46468482 | 89 | nOBF = 1; |
jpelletier | 1:51bc46468482 | 90 | PtrData.input(); |
jpelletier | 1:51bc46468482 | 91 | } |
jpelletier | 1:51bc46468482 | 92 | |
jpelletier | 1:51bc46468482 | 93 | void write_byte(unsigned char out) |
jpelletier | 1:51bc46468482 | 94 | { |
jpelletier | 1:51bc46468482 | 95 | // wait for /OBF = 1 and no read cycle in progress for politeness |
jpelletier | 1:51bc46468482 | 96 | while ((nOBF == 0) || (IBF == 1)); |
jpelletier | 0:a5957f25b150 | 97 | |
jpelletier | 1:51bc46468482 | 98 | PtrData = out; |
jpelletier | 1:51bc46468482 | 99 | PtrData.output(); |
jpelletier | 1:51bc46468482 | 100 | nOBF = 0; |
jpelletier | 1:51bc46468482 | 101 | } |
jpelletier | 1:51bc46468482 | 102 | |
jpelletier | 1:51bc46468482 | 103 | unsigned char read_byte(void) |
jpelletier | 1:51bc46468482 | 104 | { |
jpelletier | 1:51bc46468482 | 105 | while (IBF == 0); |
jpelletier | 1:51bc46468482 | 106 | IBF = 0; |
jpelletier | 1:51bc46468482 | 107 | return rx_data; |
jpelletier | 1:51bc46468482 | 108 | } |
jpelletier | 1:51bc46468482 | 109 | |
jpelletier | 1:51bc46468482 | 110 | int main() |
jpelletier | 1:51bc46468482 | 111 | { |
jpelletier | 1:51bc46468482 | 112 | PtrData.input(); |
jpelletier | 1:51bc46468482 | 113 | |
jpelletier | 1:51bc46468482 | 114 | /* 9600 baud serial port */ |
jpelletier | 1:51bc46468482 | 115 | pc.printf("8255 emulator on mbed\r\n\n"); |
jpelletier | 1:51bc46468482 | 116 | |
jpelletier | 1:51bc46468482 | 117 | IBF = 0; |
jpelletier | 1:51bc46468482 | 118 | nOBF = 1; |
jpelletier | 1:51bc46468482 | 119 | nSTB.fall(&perif2mbed); |
jpelletier | 1:51bc46468482 | 120 | nACK.rise(&mbed2perif); |
jpelletier | 0:a5957f25b150 | 121 | |
jpelletier | 0:a5957f25b150 | 122 | PtrData.input(); |
jpelletier | 0:a5957f25b150 | 123 | |
jpelletier | 1:51bc46468482 | 124 | while(1) |
jpelletier | 1:51bc46468482 | 125 | { |
jpelletier | 1:51bc46468482 | 126 | // bytes from peripherals to 8255 |
jpelletier | 1:51bc46468482 | 127 | if (IBF == 1) |
jpelletier | 0:a5957f25b150 | 128 | { |
jpelletier | 1:51bc46468482 | 129 | IBF = 0; |
jpelletier | 1:51bc46468482 | 130 | pc.putc(rx_data); |
jpelletier | 1:51bc46468482 | 131 | } |
jpelletier | 1:51bc46468482 | 132 | else |
jpelletier | 1:51bc46468482 | 133 | { |
jpelletier | 1:51bc46468482 | 134 | if (pc.readable()) |
jpelletier | 0:a5957f25b150 | 135 | { |
jpelletier | 1:51bc46468482 | 136 | write_byte(pc.getc()); |
jpelletier | 0:a5957f25b150 | 137 | } |
jpelletier | 1:51bc46468482 | 138 | } |
jpelletier | 0:a5957f25b150 | 139 | } |
jpelletier | 0:a5957f25b150 | 140 | } |