/* 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 #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 */