Add serial port bitbanging code

This adds the pony_spi driver which supports the SI_Prog adapter, which
is commonly used for SPI chips with PonyProg 2000, and a custom adapter
called "SERBANG" which differs in the logic of two pins.

Corresponding to flashrom svn r1525.

Signed-off-by: Virgil-Adrian Teaca <darkstarlinux@gmail.com>
Acked-by: Michael Karcher <flashrom@mkarcher.dialup.fu-berlin.de>
diff --git a/serial.c b/serial.c
index b504974..0a56568 100644
--- a/serial.c
+++ b/serial.c
@@ -32,6 +32,9 @@
 #include <conio.h>
 #else
 #include <termios.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
 #endif
 #include "flash.h"
 #include "programmer.h"
@@ -172,6 +175,58 @@
 #endif
 }
 
+void sp_set_pin(enum SP_PIN pin, int val) {
+#ifdef _WIN32
+	DWORD ctl;
+
+	if(pin == PIN_TXD) {
+		ctl = val ? SETBREAK: CLRBREAK;
+	}
+	else if(pin == PIN_DTR) {
+		ctl = val ? SETDTR: CLRDTR;
+	}
+	else {
+		ctl = val ? SETRTS: CLRRTS;
+	}
+	EscapeCommFunction(sp_fd, ctl);
+#else
+	int ctl, s;
+
+	if(pin == PIN_TXD) {
+		ioctl(sp_fd, val ? TIOCSBRK : TIOCCBRK, 0);
+	}
+	else {
+		s = (pin == PIN_DTR) ? TIOCM_DTR : TIOCM_RTS;
+		ioctl(sp_fd, TIOCMGET, &ctl);
+
+		if (val) {
+			ctl |= s;
+		}
+		else {
+			ctl &= ~s;
+		}
+		ioctl(sp_fd, TIOCMSET, &ctl);
+	}
+#endif
+}
+
+int sp_get_pin(enum SP_PIN pin) {
+	int s;
+#ifdef _WIN32
+	DWORD ctl;
+
+	s = (pin == PIN_CTS) ? MS_CTS_ON : MS_DSR_ON;
+	GetCommModemStatus(sp_fd, &ctl);
+#else
+	int ctl;
+	s = (pin == PIN_CTS) ? TIOCM_CTS : TIOCM_DSR;
+	ioctl(sp_fd, TIOCMGET, &ctl);
+#endif
+
+	return ((ctl & s) ? 1 : 0);
+
+}
+
 void sp_flush_incoming(void)
 {
 #ifdef _WIN32