1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
/*
atarisio - A UNIX backend for an Atari SIO2PC lead.
Copyright (C) 2004 Ian Cowburn (ianc@noddybox.demon.co.uk)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-------------------------------------------------------------------------
Serial wrappers.
*/
#ifndef ATARISIO_SERIAL_H
#define ATARISIO_SERIAL_H "$Id$"
#include <stdlib.h>
#include "util.h"
/* ---------------------------------------- TYPES
*/
/* Private callbacks furnished to registered devices to read/write serial
data. On errors these will not return. Note that SWrite appends the sent
data with its checksum. SRead reads len+1, the last byte being the checksum.
It returns TRUE if the checksum matches.
*/
typedef void (*SPutchar)(uchar c);
typedef void (*SWrite)(const uchar *p, size_t len);
typedef int (*SRead)(uchar *p, size_t len);
/* Constants (usable with SWrite) for Atari ACK, COMPLETE and ERROR repsonses
*/
extern const uchar SIO_ACK;
extern const uchar SIO_NACK;
extern const uchar SIO_COMPLETE;
extern const uchar SIO_ERROR;
/* Microsecond timings
*/
#define TIME_ACK 85
#define TIME_ACK_TO_COMPLETE 255
#define TIME_COMPLETE_TO_DATA 425
/* A command from the Atari
*/
typedef enum
{
eRead = 0x52,
eWrite = 0x57,
eStatus = 0x53,
ePut = 0x50,
eFormat = 0x21,
eDownload = 0x20,
eReadAddr = 0x54,
eReadSpin = 0x51,
eMotorOn = 0x55,
eVerifySec = 0x56
} ESIOCmdType;
typedef struct
{
uchar device; /* The device ID */
ESIOCmdType cmd; /* The command frame type */
uchar aux1; /* Data */
uchar aux2; /* Data */
SPutchar putchar; /* To write a char to the serial port */
SWrite write; /* To write to the serial port */
SRead read; /* To read from the serial port */
} SIOCommand;
/* Interface for recieving SIO commands. Note that this interface is expected
to all serial IO responses, including the initial ACK (in case the device
wants to NACK instead).
*/
typedef void (*SIOCallback)(const SIOCommand* cmd);
/* ---------------------------------------- INTERFACES
*/
/* Initialise the serial routines. Must be called first.
*/
void SerialInit(void);
/* Opens the passed serial device and configures it for SIO2PC usage.
*/
void SerialOpen(const char *path);
/* Registers a command handler
*/
void SerialRegister(int device, SIOCallback func);
/* Deregisters a command handler
*/
void SerialDeregister(int device);
/* Switch debug mode on/off
*/
void SerialDebug(int mode);
/* Close the serial device
*/
void SerialClose(void);
#endif
/* END OF FILE */
|