merge mappers from FCEU-mm
[fceu.git] / boards / __serial.c
CommitLineData
43725da7 1\r
2#include "__serial.h"\r
3\r
4HANDLE SerialPort = NULL; // Handle of SerialPort itself.\r
5\r
6BOOL SerialOpen(int port, int baud)\r
7{\r
8 HANDLE Comport;\r
9 DCB myDCB;\r
10 COMMTIMEOUTS CTout;\r
11 char str[100];\r
12\r
13 if (port > 9)\r
14 sprintf(str, "\\\\.\\COM%d", port);\r
15 else\r
16 sprintf(str, "COM%d", port);\r
17\r
18 // Open the serial port\r
19 if ((Comport = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)\r
20 return FALSE;\r
21\r
22 // Configure Serial port (Setup Comm)\r
23\r
24 // Buffer sizes\r
25 if (!SetupComm(Comport, 128, 128))\r
26 return FALSE;\r
27\r
28 // Setup DCB using current values\r
29 if (!GetCommState(Comport, &myDCB))\r
30 return FALSE;\r
31\r
32 myDCB.fInX = FALSE; // Turn off xon/xoff handler\r
33 myDCB.fOutX = FALSE;\r
34 myDCB.fOutxDsrFlow = FALSE;\r
35 myDCB.fOutxCtsFlow = FALSE; // no hardware flow control.\r
36 myDCB.BaudRate = baud;\r
37 myDCB.DCBlength = sizeof(DCB);\r
38 myDCB.fBinary = 1;\r
39 myDCB.fParity = 0;\r
40 myDCB.fDtrControl = DTR_CONTROL_DISABLE;\r
41 myDCB.fDsrSensitivity = 0;\r
42 myDCB.fTXContinueOnXoff = 1;\r
43 myDCB.fNull = 0;\r
44 myDCB.fRtsControl = RTS_CONTROL_DISABLE;\r
45 myDCB.fDummy2 = 0;\r
46 myDCB.wReserved = 0;\r
47 myDCB.Parity = NOPARITY;\r
48 myDCB.StopBits = ONESTOPBIT;\r
49 myDCB.wReserved1 = 0;\r
50 myDCB.ByteSize = 8;\r
51\r
52 if (!SetCommState(Comport, &myDCB))\r
53 return FALSE;\r
54\r
55 // Set timeouts\r
56 CTout.ReadIntervalTimeout = 0xffffffff;\r
57 CTout.ReadTotalTimeoutMultiplier = 0;\r
58 CTout.ReadTotalTimeoutConstant = 0;\r
59 CTout.WriteTotalTimeoutMultiplier = 0;\r
60 CTout.WriteTotalTimeoutConstant = 5000; // don't hang if CTS is locked, for example\r
61\r
62 SetCommTimeouts(Comport, &CTout);\r
63 EscapeCommFunction(Comport, SETDTR);\r
64 PurgeComm(Comport, PURGE_TXCLEAR | PURGE_RXCLEAR);\r
65\r
66 SerialPort = Comport;\r
67\r
68 return TRUE;\r
69}\r
70\r
71void SerialClose(void)\r
72{\r
73 if (SerialPort == NULL) return;\r
74\r
75 PurgeComm(SerialPort, PURGE_TXCLEAR | PURGE_RXCLEAR);\r
76 CloseHandle(SerialPort);\r
77\r
78 SerialPort = NULL;\r
79}\r
80\r
81BOOL SerialSendChar(int c)\r
82{\r
83 DWORD cr;\r
84 if(WriteFile(SerialPort, &c, 1, (LPDWORD)&cr, NULL) && cr)\r
85 return TRUE;\r
86 else\r
87 return FALSE;\r
88}\r
89\r
90int SerialIsOpen(void)\r
91{\r
92 return (SerialPort != NULL);\r
93}\r
94\r
95int SerialGetChar(void)\r
96{\r
97 uint8 ch;\r
98 DWORD cr;\r
99 if (SerialPort != NULL) {\r
100 if (ReadFile(SerialPort, &ch, 1, (LPDWORD)&cr, NULL) && cr)\r
101 return (int)ch;\r
102 }\r
103 return EOF;\r
104}\r
105\r
106void SendCmd(uint8 *cmd, int size)\r
107{\r
108 int i;\r
109 for(i=0; i<size; i++) {\r
110 SerialSendChar(cmd[i]);\r
111 }\r
112}\r
113\r
114int ReadResp(uint8 *resp, int size)\r
115{\r
116 int i = 0, sum = 0, data;\r
117 while(i < size) {\r
118 while ((data = SerialGetChar()) == EOF) {}\r
119 resp[i] = data & 0xff;\r
120 sum += (data & 0xff);\r
121 i++;\r
122 }\r
123 return sum;\r
124}\r