home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 3
/
PDCD_3.iso
/
internet
/
netlite
/
NET
/
c
/
DRIVER
< prev
next >
Wrap
Text File
|
1993-04-24
|
6KB
|
213 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "werr.h"
#include "global.h"
#include "mbuf.h"
#include "internet.h"
#include "iface.h"
#include "cmdparse.h"
#include "misc.h"
#include "driver.h"
#include "slip.h"
#include "arc.h"
#include "os.h"
#include "swis.h"
struct driver driver[DRIVER_MAX];
unsigned int ndriver;
extern struct interface *ifaces;
extern char nospace[];
static int driver_init(int16, struct interface *, char *, int);
static int driver_stop(struct interface *);
static int driver_speed(int16, int);
static int driver_output(int16, char *, int);
static int driver_recv(int16, char *, int);
/* Attach a serial interface to the system
* argv[0]: hardware type, must be "driver"
* argv[1]: driver name
* argv[2]: port number
* argv[3]: mode, may be:
* "slip" (point-to-point SLIP)
* argv[4]: interface label, e.g., "sl0"
* argv[5]: maximum transmission unit, bytes
* argv[6]: interface speed, e.g, "9600"
*/
int driver_attach(int argc, char **argv)
{
struct interface *if_driver;
struct slip *if_slip;
int16 dev;
int mode;
char buffer[60];
FILE *fp;
argc = argc;
if (ndriver >= DRIVER_MAX){
werr(1,"Too many asynch controllers\n");
return -1;
}
sprintf(buffer, "SerialDev:Modules.%s.Driver", argv[1]);
if ((fp = fopen(buffer, "rb")) == NULL) {
werr(1,"Invalid block driver %s\n", argv[1]);
return -1;
}
fclose(fp);
if(strcmp(argv[3],"slip") == 0)
mode = SLIP_MODE;
else
mode = UNKNOWN;
dev = ndriver++;
/* Create interface structure and fill in details */
if_driver = (struct interface *)calloc(1,sizeof(struct interface));
if_driver->name = strdup(argv[4]);
if_driver->mtu = atoi(argv[5]);
if_driver->dev = dev;
if_driver->recv = doslip;
if_driver->stop = driver_stop;
if_driver->put = driver_output;
if_driver->get = driver_recv;
switch(mode){
case SLIP_MODE:
if_slip = (struct slip *)calloc(1,sizeof(struct slip));
if_driver->slip = if_slip;
if_driver->send = slip_send;
if_driver->raw = slip_raw;
if_driver->slip->recv = slip_recv;
break;
default:
werr(1,"Mode %s unknown for interface %s",argv[3],argv[4]);
free(if_driver->name);
free(if_driver);
ndriver--;
return -1;
}
if_driver->next = ifaces;
ifaces = if_driver;
driver_init(dev, if_driver, argv[1], atoi(argv[2]));
driver_speed(dev, atoi(argv[6]));
return 0;
}
/* Initialize driver port "dev" */
static int driver_init(int16 dev, struct interface *iface, char *name, int port)
{
char buffer[60];
int Length;
char *pointer;
FILE *fp;
sprintf(buffer, "SerialDev:Modules.%s.Driver", name);
if ((fp = fopen(buffer, "rb")) == NULL)
{
werr(1, "Failed to open %s\n", buffer);
return(0);
}
fseek(fp, 0L, SEEK_END);
Length = (int)(ftell(fp) + 1L);
if ((pointer = malloc(Length)) == NULL)
{
werr(1,nospace);
fclose(fp);
return(0);
}
fseek(fp, 0L, SEEK_SET);
fread(pointer, 1, Length, fp);
memcpy(&driver[dev].port, pointer + 0x0C8, sizeof(int));
fclose(fp);
driver[dev].iface = iface;
driver[dev].speed = 9600;
driver[dev].name = strdup(name);
driver[dev].port += port;
driver[dev].driver = (int (*)())pointer;
/* Initialise port to 9600 Baud, 8 bits etc */
(*driver[dev].driver)(DRIVER_INITIALISE, driver[dev].port);
(*driver[dev].driver)(DRIVER_TXSPEED, driver[dev].port, 9600);
(*driver[dev].driver)(DRIVER_RXSPEED, driver[dev].port, 9600);
(*driver[dev].driver)(DRIVER_WORDFORMAT, driver[dev].port, 0x00);
(*driver[dev].driver)(DRIVER_CONTROLLINES, driver[dev].port, 3);
return(1);
}
static int driver_stop(struct interface *iface)
{
/* Drop RTS/DSR */
(*driver[iface->dev].driver)(DRIVER_CONTROLLINES, driver[iface->dev].port,0);
/* Closedown */
(*driver[iface->dev].driver)(DRIVER_CLOSEDOWN, driver[iface->dev].port);
return(0);
}
/* Set line speed */
static int driver_speed(int16 dev, int speed)
{
if (speed == 0 || dev >= ndriver) return(-1);
driver[dev].speed = speed;
/* Set speed */
(*driver[dev].driver)(DRIVER_TXSPEED, driver[dev].port, speed);
(*driver[dev].driver)(DRIVER_RXSPEED, driver[dev].port, speed);
/* Check its been set */
if ((*driver[dev].driver)(DRIVER_RXSPEED, driver[dev].port, -1) != speed)
{
werr(0, "Invalid speed %d Baud", speed);
return(-1);
}
return(0);
}
/* Send a buffer to transmitter */
static int driver_output(int16 dev, char *buf, int cnt)
{
register int i;
if (dev >= ndriver) return(0);
for (i = 0; i < cnt && (*driver[dev].driver)(DRIVER_PUTBYTE, driver[dev].port, *buf) == 0; i++, buf++);
return(i);
}
/* Receive characters from line
* Returns count of characters read
*/
static int driver_recv(int16 dev, char *buf, int cnt)
{
register int c;
if (dev >= ndriver || cnt < 1) return(0);
c = (*driver[dev].driver)(DRIVER_GETBYTE, driver[dev].port);
if (c >= 0)
{
*buf = c;
return(1);
}
return(0);
}