home *** CD-ROM | disk | FTP | other *** search
-
- /*
- serio.c -- serial I/O support
- ___ _______
- /__)(_ /_ Genesis : Sat Oct 12 22:48:22 1991
- / \____)(___ Last Change : Mon Jan 27 18:00:58 1992
- / Class : Amiga dependend
-
- Copyright (c) Ralf S. Engelschall, All Rights Reserved.
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <proto/exec.h>
- #include <devices/serial.h>
- #include <exec/execbase.h>
- #include "serio.h"
- #include "cus.h"
-
- extern struct ExecBase *SysBase;
-
-
- struct SerialHandle *CreateSerialHandle(LONG Unit, UBYTE Flags)
- {
- struct SerialHandle *Handle;
- struct Serialhandle *rc;
-
- if ((Handle = (struct SerialHandle *)malloc(sizeof(struct SerialHandle))) == NULL) {
- DeleteSerialHandle(Handle);
- CU(NULL);
- }
- if((Handle->sh_Port = (struct MsgPort *)CreatePort(NULL, 0)) == NULL) {
- DeleteSerialHandle(Handle);
- CU(NULL);
- }
- if((Handle->sh_SerialIO = (struct IOExtSer *)CreateExtIO(Handle->sh_Port, sizeof(struct IOExtSer))) == NULL) {
- DeleteSerialHandle(Handle);
- CU(NULL);
- }
- Handle->sh_SerialIO->io_SerFlags = Flags;
- Handle->sh_Status = 0L;
-
- if(OpenDevice(SERIALNAME, Unit, Handle->sh_SerialIO, 0L) != 0)
- CU(NULL);
- rc = Handle;
-
- CUS:
- return rc;
- }
-
-
- void DeleteSerialHandle(struct SerialHandle *Handle)
- {
- if(Handle) {
- if(Handle->sh_SerialIO) {
- if(Handle->sh_SerialIO->IOSer.io_Device) {
- AbortIO(Handle->sh_SerialIO);
- WaitIO(Handle->sh_SerialIO);
- CloseDevice(Handle->sh_SerialIO);
- }
- DeleteExtIO(Handle->sh_SerialIO);
- }
- if(Handle->sh_Port)
- DeletePort(Handle->sh_Port);
- free(Handle);
- }
- return;
- }
-
-
- ULONG GetSerialStatus(struct SerialHandle *Handle)
- {
- ULONG rc;
-
- if(Handle) {
- Handle->sh_SerialIO->IOSer.io_Command = SDCMD_QUERY;
- DoIO(Handle->sh_SerialIO);
- Handle->sh_Status = Handle->sh_SerialIO->io_Status;
- CU(Handle->sh_SerialIO->IOSer.io_Actual);
- }
- rc = 0L;
-
- CUS:
- return rc;
- }
-
-
- int SetSerialParameters(struct SerialHandle *Handle, ULONG Baud, UBYTE Flags)
- {
- if(Handle) {
- Handle->sh_SerialIO->IOSer.io_Command = SDCMD_SETPARAMS;
- Handle->sh_SerialIO->io_Baud = Baud;
- Handle->sh_SerialIO->io_SerFlags = Flags;
- if(!DoIO(Handle->sh_SerialIO))
- return(TRUE);
- }
- return(FALSE);
- }
-
-
- ULONG ReadSerial(struct SerialHandle *Handle, unsigned char *Buffer, ULONG Size)
- {
- if(Handle) {
- Handle->sh_SerialIO->IOSer.io_Command = CMD_READ;
- Handle->sh_SerialIO->IOSer.io_Length = Size;
- Handle->sh_SerialIO->IOSer.io_Data = (APTR)Buffer;
- DoIO(Handle->sh_SerialIO);
- return(Handle->sh_SerialIO->IOSer.io_Actual);
- }
- return(0L);
- }
-
-
- ULONG WriteSerial(struct SerialHandle *Handle, unsigned char *Buffer, ULONG Size)
- {
- if(Handle) {
- Handle->sh_SerialIO->IOSer.io_Command = CMD_WRITE;
- Handle->sh_SerialIO->IOSer.io_Length = Size;
- Handle->sh_SerialIO->IOSer.io_Data = (APTR)Buffer;
- DoIO(Handle->sh_SerialIO);
- return(Handle->sh_SerialIO->IOSer.io_Actual);
- }
- return(0);
- }
-
-
- ULONG GetSerial(struct SerialHandle *Handle)
- {
- unsigned char Data;
-
- if(Handle) {
- if(GetSerialStatus(Handle)) {
- if(ReadSerial(Handle, &Data, 1) == 1)
- return((ULONG)Data);
- }
- }
- return(-1);
- }
-
-
- ULONG PutSerial(unsigned char c, struct SerialHandle *Handle)
- {
- unsigned char Data = c;
-
- if(Handle) {
- if(WriteSerial(Handle, &Data, 1) == 1)
- return((ULONG)Data);
- }
- return(-1);
- }
-
-
-