From ebe951a445b5d774542731d6165a9c5cd56beb2b Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 9 Feb 2014 02:42:17 +0900 Subject: Add Initial files of 4704_usb --- protocol/ibm4704.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 protocol/ibm4704.c (limited to 'protocol/ibm4704.c') diff --git a/protocol/ibm4704.c b/protocol/ibm4704.c new file mode 100644 index 0000000000..26441ed52f --- /dev/null +++ b/protocol/ibm4704.c @@ -0,0 +1,150 @@ +/* +Copyright 2010,2011,2012,2013 Jun WAKO +*/ +#include +#include +#include "debug.h" +#include "ibm4704.h" + + +#define WAIT(stat, us, err) do { \ + if (!wait_##stat(us)) { \ + ibm4704_error = err; \ + goto ERROR; \ + } \ +} while (0) + + +uint8_t ibm4704_error = 0; + + +void ibm4704_init(void) +{ + // POR + //_delay_ms(2500); + //while ( 0xA3 != ibm4704_recv() ) ; + + inhibit(); + DDRD |= 1<<3; + PORTD &= ~(1<<3); +} + +uint8_t ibm4704_send(uint8_t data) +{ + bool parity = true; // odd parity + ibm4704_error = 0; + + /* Request to send */ + idle(); + clock_lo(); +PIND |= 1<<3; + + /* wait for Start bit(Clock:lo/Data:hi) */ + WAIT(data_hi, 300, 0x30); + + /* Data bit */ + for (uint8_t i = 0; i < 8; i++) { + WAIT(clock_hi, 100, 0x31); + //_delay_us(5); +PIND |= 1<<3; + if (data&(1< 2) { + xprintf("x%02X ", ibm4704_error); + } + inhibit(); + _delay_us(200); // wait to recover clock to hi + return -1; +} -- cgit v1.2.3 From 54a06c2520f6de4b33558b2203d6706a988d291c Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 10 Feb 2014 06:43:43 +0900 Subject: Change error no and clean debug code --- protocol/ibm4704.c | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) (limited to 'protocol/ibm4704.c') diff --git a/protocol/ibm4704.c b/protocol/ibm4704.c index 26441ed52f..d3fbcc541d 100644 --- a/protocol/ibm4704.c +++ b/protocol/ibm4704.c @@ -20,13 +20,7 @@ uint8_t ibm4704_error = 0; void ibm4704_init(void) { - // POR - //_delay_ms(2500); - //while ( 0xA3 != ibm4704_recv() ) ; - inhibit(); - DDRD |= 1<<3; - PORTD &= ~(1<<3); } uint8_t ibm4704_send(uint8_t data) @@ -37,44 +31,43 @@ uint8_t ibm4704_send(uint8_t data) /* Request to send */ idle(); clock_lo(); -PIND |= 1<<3; /* wait for Start bit(Clock:lo/Data:hi) */ WAIT(data_hi, 300, 0x30); /* Data bit */ for (uint8_t i = 0; i < 8; i++) { - WAIT(clock_hi, 100, 0x31); + WAIT(clock_hi, 100, 0x40+i); //_delay_us(5); -PIND |= 1<<3; if (data&(1<= 0x30) { + xprintf("x%02X ", ibm4704_error); + } _delay_us(200); // wait to recover clock to hi return -1; } @@ -110,10 +103,10 @@ uint8_t ibm4704_recv(void) _delay_us(5); // wait for line settles /* start bit */ - WAIT(clock_lo, 100, 1); // wait for keyboard to send - WAIT(data_hi, 100, 2); // can be delayed that long + WAIT(clock_lo, 100, 0x11); // wait for keyboard to send + WAIT(data_hi, 100, 0x12); // can be delayed that long - WAIT(clock_hi, 100, 3); // first rising edge which can take longer + WAIT(clock_hi, 100, 0x13); // first rising edge which can take longer /* data */ for (uint8_t i = 0; i < 8; i++) { WAIT(clock_hi, 100, 0x20+i); @@ -126,22 +119,22 @@ uint8_t ibm4704_recv(void) } /* parity */ - WAIT(clock_hi, 100, 7); + WAIT(clock_hi, 100, 0x17); if (data_in() != parity) { ibm4704_error = IBM4704_ERR_PARITY; goto ERROR; } - WAIT(clock_lo, 150, 8); + WAIT(clock_lo, 150, 0x18); /* stop bit */ - WAIT(clock_hi, 100, 9); - WAIT(data_lo, 1, 9); + WAIT(clock_hi, 100, 0x19); + WAIT(data_lo, 1, 0x19); inhibit(); _delay_us(200); // wait to recover clock to hi return data; ERROR: - if (ibm4704_error > 2) { + if (ibm4704_error > 0x12) { xprintf("x%02X ", ibm4704_error); } inhibit(); -- cgit v1.2.3 From 902afcc509cf5d84b24f71297591cb7cb3d7493d Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 10 Feb 2014 11:05:18 +0900 Subject: Add doc 4704.txt and protocol comment --- protocol/ibm4704.c | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'protocol/ibm4704.c') diff --git a/protocol/ibm4704.c b/protocol/ibm4704.c index d3fbcc541d..10e229fd15 100644 --- a/protocol/ibm4704.c +++ b/protocol/ibm4704.c @@ -23,6 +23,25 @@ void ibm4704_init(void) inhibit(); } +/* +Host to Keyboard +---------------- +Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part. + + ____ __ __ __ __ __ __ __ __ __ ________ +Clock \______/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + ^ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___ +Data ____|__/ X____X____X____X____X____X____X____X____X____X \___ + | Start 0 1 2 3 4 5 6 7 P Stop + Request by host + +Start bit: can be long as 300-350us. +Request: Host pulls Clock line down to request to send a command. +Timing: After Request keyboard pull up Data and down Clock line to low for start bit. + After request host release Clock line once Data line becomes hi. + Host writes a bit while Clock is hi and Keyboard reads while low. +Stop bit: Host releases or pulls up Data line to hi after 9th clock and waits for keyboard pull down the line to lo. +*/ uint8_t ibm4704_send(uint8_t data) { bool parity = true; // odd parity @@ -85,13 +104,20 @@ uint8_t ibm4704_recv_response(void) } /* -Keyboard to Host: -Clock ~~~~___~~_~~_~~_~~_~~_~~_~~_~~_~~_~~~~~~~~ H:60us/L:30us - -Data ____~~X==X==X==X==X==X==X==X==X==X________ - | 0 1 2 3 4 5 6 7 P(odd) - | LSB MSB - Start bit(80us) +Keyboard to Host +---------------- +Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part. + + ____ __ __ __ __ __ __ __ __ __ ________ +Clock \____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ +Data ____/ X____X____X____X____X____X____X____X____X____X________ + Start 0 1 2 3 4 5 6 7 P Stop + +Start bit: can be long as 300-350us. +Inhibit: Pull Data line down to inhibit keyboard to send. +Timing: Host reads bit while Clock is hi. +Stop bit: Keyboard pulls down Data line to lo after 9th clock. */ uint8_t ibm4704_recv(void) { -- cgit v1.2.3