summaryrefslogtreecommitdiff
path: root/src/serial.h
blob: 740bed7662976abecfd3f5077559a4e67561c2d8 (plain)
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 */