Files
ci-libretro-fceumm/src/boards/__serial.c
2021-11-02 17:25:04 +01:00

152 lines
2.9 KiB
C

#include <stdio.h>
#include "__serial.h"
#if defined(_WIN32) && !defined(_XBOX) && !defined(__LIBRETRO__)
HANDLE SerialPort = NULL; /* Handle of SerialPort itself. */
BOOL SerialOpen(int port, int baud) {
HANDLE Comport;
DCB myDCB;
COMMTIMEOUTS CTout;
char str[100];
if (port > 9)
sprintf(str, "\\\\.\\COM%d", port);
else
sprintf(str, "COM%d", port);
/* Open the serial port */
if ((Comport = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
return FALSE;
/* Configure Serial port (Setup Comm) */
/* Buffer sizes */
if (!SetupComm(Comport, 128, 128))
return FALSE;
/* Setup DCB using current values */
if (!GetCommState(Comport, &myDCB))
return FALSE;
myDCB.fInX = FALSE; /* Turn off xon/xoff handler */
myDCB.fOutX = FALSE;
myDCB.fOutxDsrFlow = FALSE;
myDCB.fOutxCtsFlow = FALSE; /* no hardware flow control. */
myDCB.BaudRate = baud;
myDCB.DCBlength = sizeof(DCB);
myDCB.fBinary = 1;
myDCB.fParity = 0;
myDCB.fDtrControl = DTR_CONTROL_DISABLE;
myDCB.fDsrSensitivity = 0;
myDCB.fTXContinueOnXoff = 1;
myDCB.fNull = 0;
myDCB.fRtsControl = RTS_CONTROL_DISABLE;
myDCB.fDummy2 = 0;
myDCB.wReserved = 0;
myDCB.Parity = NOPARITY;
myDCB.StopBits = ONESTOPBIT;
myDCB.wReserved1 = 0;
myDCB.ByteSize = 8;
if (!SetCommState(Comport, &myDCB))
return FALSE;
/* Set timeouts */
CTout.ReadIntervalTimeout = 0xffffffff;
CTout.ReadTotalTimeoutMultiplier = 0;
CTout.ReadTotalTimeoutConstant = 0;
CTout.WriteTotalTimeoutMultiplier = 0;
CTout.WriteTotalTimeoutConstant = 5000; /* don't hang if CTS is locked, for example */
SetCommTimeouts(Comport, &CTout);
EscapeCommFunction(Comport, SETDTR);
PurgeComm(Comport, PURGE_TXCLEAR | PURGE_RXCLEAR);
SerialPort = Comport;
return TRUE;
}
void SerialClose(void) {
if (SerialPort == NULL) return;
PurgeComm(SerialPort, PURGE_TXCLEAR | PURGE_RXCLEAR);
CloseHandle(SerialPort);
SerialPort = NULL;
}
BOOL SerialSendChar(int c) {
DWORD cr;
if (WriteFile(SerialPort, &c, 1, (LPDWORD)&cr, NULL) && cr)
return TRUE;
else
return FALSE;
}
int SerialIsOpen(void) {
return(SerialPort != NULL);
}
int SerialGetChar(void) {
uint8 ch;
DWORD cr;
if (SerialPort != NULL) {
if (ReadFile(SerialPort, &ch, 1, (LPDWORD)&cr, NULL) && cr)
return (int)ch;
}
return EOF;
}
void SendCmd(uint8 *cmd, int size) {
int i;
for (i = 0; i < size; i++) {
SerialSendChar(cmd[i]);
}
}
int ReadResp(uint8 *resp, int size) {
int i = 0, sum = 0, data;
while (i < size) {
while ((data = SerialGetChar()) == EOF) {
}
resp[i] = data & 0xff;
sum += (data & 0xff);
i++;
}
return sum;
}
#else
/* code is not portable, so make stubs for now */
BOOL SerialOpen(int port, int baud) {
return FALSE;
}
void SerialClose(void) {
}
BOOL SerialSendChar(int c) {
return FALSE;
}
int SerialIsOpen(void) {
return FALSE;
}
int SerialGetChar(void) {
return EOF;
}
void SendCmd(uint8 *cmd, int size) {
}
int ReadResp(uint8 *resp, int size) {
return 0;
}
#endif