6
#define FILE_DEVICE_SERIAL_PORT 0x1b
8
#define SERIAL_SET_BAUD_RATE 1
9
#define SERIAL_SET_QUEUE_SIZE 2
10
#define SERIAL_SET_LINE_CONTROL 3
11
#define SERIAL_SET_BREAK_ON 4
12
#define SERIAL_SET_BREAK_OFF 5
13
#define SERIAL_IMMEDIATE_CHAR 6
14
#define SERIAL_SET_TIMEOUTS 7
15
#define SERIAL_GET_TIMEOUTS 8
16
#define SERIAL_SET_DTR 9
17
#define SERIAL_CLR_DTR 10
18
#define SERIAL_RESET_DEVICE 11
19
#define SERIAL_SET_RTS 12
20
#define SERIAL_CLR_RTS 13
21
#define SERIAL_SET_XOFF 14
22
#define SERIAL_SET_XON 15
23
#define SERIAL_GET_WAIT_MASK 16
24
#define SERIAL_SET_WAIT_MASK 17
25
#define SERIAL_WAIT_ON_MASK 18
26
#define SERIAL_PURGE 19
27
#define SERIAL_GET_BAUD_RATE 20
28
#define SERIAL_GET_LINE_CONTROL 21
29
#define SERIAL_GET_CHARS 22
30
#define SERIAL_SET_CHARS 23
31
#define SERIAL_GET_HANDFLOW 24
32
#define SERIAL_SET_HANDFLOW 25
33
#define SERIAL_GET_MODEMSTATUS 26
34
#define SERIAL_GET_COMMSTATUS 27
35
#define SERIAL_XOFF_COUNTER 28
36
#define SERIAL_GET_PROPERTIES 29
37
#define SERIAL_GET_DTRRTS 30
38
#define SERIAL_LSRMST_INSERT 31
39
#define SERIAL_CONFIG_SIZE 32
40
#define SERIAL_GET_COMMCONFIG 33
41
#define SERIAL_SET_COMMCONFIG 34
42
#define SERIAL_GET_STATS 35
43
#define SERIAL_CLEAR_STATS 36
44
#define SERIAL_GET_MODEM_CONTROL 37
45
#define SERIAL_SET_MODEM_CONTROL 38
46
#define SERIAL_SET_FIFO_CONTROL 39
56
struct termios termios;
60
uint32 queue_in_size, queue_out_size;
62
uint8 stop_bits, parity, word_length;
69
if (tcgetattr(serial_fd, &termios) == -1)
72
speed = cfgetispeed(&termios);
155
speed = cfgetospeed(&termios);
156
dtr = (speed == B0) ? 0 : 1;
158
stop_bits = (termios.c_cflag & CSTOPB) ? STOP_BITS_2 : STOP_BITS_1;
160
c_cflag & PARENB) ? ((termios.
161
c_cflag & PARODD) ? ODD_PARITY : EVEN_PARITY) : NO_PARITY;
162
switch (termios.c_cflag & CSIZE)
268
/* on systems with separate ispeed and ospeed, we can remember the speed
269
in ispeed while changing DTR with ospeed */
270
cfsetispeed(&termios, speed);
271
cfsetospeed(&termios, dtr ? speed : 0);
273
termios.c_cflag &= ~(CSTOPB | PARENB | PARODD | CSIZE);
277
termios.c_cflag |= CSTOPB;
283
termios.c_cflag |= PARENB;
286
termios.c_cflag |= PARENB | PARODD;
292
termios.c_cflag |= CS5;
295
termios.c_cflag |= CS6;
298
termios.c_cflag |= CS7;
301
termios.c_cflag |= CS8;
305
tcsetattr(serial_fd, TCSANOW, &termios);
309
serial_create(HANDLE * handle)
311
/* XXX do we have to handle concurrent open attempts? */
312
serial_fd = open("/dev/ttyS0", O_RDWR);
314
return STATUS_ACCESS_DENIED;
317
return STATUS_ACCESS_DENIED;
320
return STATUS_SUCCESS;
324
serial_close(HANDLE handle)
327
return STATUS_SUCCESS;
331
serial_read(HANDLE handle, uint8 * data, uint32 length, uint32 * result)
333
*result = read(serial_fd, data, length);
334
return STATUS_SUCCESS;
338
serial_write(HANDLE handle, uint8 * data, uint32 length, uint32 * result)
340
*result = write(serial_fd, data, length);
341
return STATUS_SUCCESS;
345
serial_device_control(HANDLE handle, uint32 request, STREAM in, STREAM out)
350
if ((request >> 16) != FILE_DEVICE_SERIAL_PORT)
351
return STATUS_INVALID_PARAMETER;
353
/* extract operation */
357
printf("SERIAL IOCTL %d\n", request);
361
case SERIAL_SET_BAUD_RATE:
362
in_uint32_le(in, baud_rate);
365
case SERIAL_GET_BAUD_RATE:
366
out_uint32_le(out, baud_rate);
368
case SERIAL_SET_QUEUE_SIZE:
369
in_uint32_le(in, queue_in_size);
370
in_uint32_le(in, queue_out_size);
372
case SERIAL_SET_LINE_CONTROL:
373
in_uint8(in, stop_bits);
374
in_uint8(in, parity);
375
in_uint8(in, word_length);
378
case SERIAL_GET_LINE_CONTROL:
379
out_uint8(out, stop_bits);
380
out_uint8(out, parity);
381
out_uint8(out, word_length);
383
case SERIAL_IMMEDIATE_CHAR:
384
in_uint8(in, immediate);
385
serial_write(handle, &immediate, 1, &result);
387
case SERIAL_CONFIG_SIZE:
388
out_uint32_le(out, 0);
390
case SERIAL_GET_CHARS:
393
case SERIAL_SET_CHARS:
396
case SERIAL_GET_HANDFLOW:
397
out_uint32_le(out, 0);
398
out_uint32_le(out, 3); /* Xon/Xoff */
399
out_uint32_le(out, 0);
400
out_uint32_le(out, 0);
402
case SERIAL_SET_HANDFLOW:
405
case SERIAL_SET_TIMEOUTS:
408
case SERIAL_GET_TIMEOUTS:
411
case SERIAL_GET_WAIT_MASK:
412
out_uint32(out, wait_mask);
414
case SERIAL_SET_WAIT_MASK:
415
in_uint32(in, wait_mask);
426
case SERIAL_WAIT_ON_MASK:
427
/* XXX implement me */
429
case SERIAL_SET_BREAK_ON:
430
tcsendbreak(serial_fd, 0);
433
in_uint32(purge_mask);
436
case SERIAL_RESET_DEVICE:
437
case SERIAL_SET_BREAK_OFF:
440
case SERIAL_SET_XOFF:
447
unimpl("SERIAL IOCTL %d\n", request);
448
return STATUS_INVALID_PARAMETER;
451
return STATUS_SUCCESS;
454
DEVICE_FNS serial_fns = {
459
serial_device_control