home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / netlite / NET / c / DRIVER < prev    next >
Text File  |  1993-04-24  |  6KB  |  213 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include "werr.h"
  6. #include "global.h"
  7. #include "mbuf.h"
  8. #include "internet.h"
  9. #include "iface.h"
  10. #include "cmdparse.h"
  11. #include "misc.h"
  12. #include "driver.h"
  13. #include "slip.h"
  14. #include "arc.h"
  15. #include "os.h"
  16. #include "swis.h"
  17.  
  18. struct driver driver[DRIVER_MAX];
  19. unsigned int ndriver;
  20. extern struct interface *ifaces;
  21.  
  22. extern char nospace[];
  23.  
  24. static int driver_init(int16, struct interface *, char *, int);
  25. static int driver_stop(struct interface *);
  26. static int driver_speed(int16, int);
  27. static int driver_output(int16, char *, int);
  28. static int driver_recv(int16, char *, int);
  29.  
  30. /* Attach a serial interface to the system
  31.  * argv[0]: hardware type, must be "driver"
  32.  * argv[1]: driver name
  33.  * argv[2]: port number
  34.  * argv[3]: mode, may be:
  35.  *          "slip" (point-to-point SLIP)
  36.  * argv[4]: interface label, e.g., "sl0"
  37.  * argv[5]: maximum transmission unit, bytes
  38.  * argv[6]: interface speed, e.g, "9600"
  39.  */
  40. int driver_attach(int argc, char **argv)
  41. {
  42.         struct interface *if_driver;
  43.         struct slip *if_slip;
  44.         int16 dev;
  45.         int   mode;
  46.         char buffer[60];
  47.         FILE *fp;
  48.  
  49.         argc = argc;
  50.  
  51.         if (ndriver >= DRIVER_MAX){
  52.                 werr(1,"Too many asynch controllers\n");
  53.                 return -1;
  54.         }
  55.  
  56.         sprintf(buffer, "SerialDev:Modules.%s.Driver", argv[1]);
  57.         if ((fp = fopen(buffer, "rb")) == NULL) {
  58.                 werr(1,"Invalid block driver %s\n", argv[1]);
  59.                 return -1;
  60.         }
  61.         fclose(fp);
  62.  
  63.         if(strcmp(argv[3],"slip") == 0)
  64.                 mode = SLIP_MODE;
  65.         else
  66.                 mode = UNKNOWN;
  67.  
  68.         dev = ndriver++;
  69.  
  70.         /* Create interface structure and fill in details */
  71.         if_driver = (struct interface *)calloc(1,sizeof(struct interface));
  72.         if_driver->name = strdup(argv[4]);
  73.         if_driver->mtu  = atoi(argv[5]);
  74.         if_driver->dev  = dev;
  75.         if_driver->recv = doslip;
  76.         if_driver->stop = driver_stop;
  77.         if_driver->put  = driver_output;
  78.         if_driver->get  = driver_recv;
  79.  
  80.         switch(mode){
  81.         case SLIP_MODE:
  82.                 if_slip = (struct slip *)calloc(1,sizeof(struct slip));
  83.                 if_driver->slip   = if_slip;
  84.                 if_driver->send   = slip_send;
  85.                 if_driver->raw    = slip_raw;
  86.                 if_driver->slip->recv = slip_recv;
  87.                 break;
  88.         default:
  89.                 werr(1,"Mode %s unknown for interface %s",argv[3],argv[4]);
  90.                 free(if_driver->name);
  91.                 free(if_driver);
  92.                 ndriver--;
  93.                 return -1;
  94.         }
  95.         if_driver->next = ifaces;
  96.         ifaces = if_driver;
  97.         driver_init(dev, if_driver, argv[1], atoi(argv[2]));
  98.         driver_speed(dev, atoi(argv[6]));
  99.  
  100.         return 0;
  101. }
  102.  
  103. /* Initialize driver port "dev" */
  104. static int driver_init(int16 dev, struct interface *iface, char *name, int port)
  105. {
  106.         char buffer[60];
  107.         int Length;
  108.         char *pointer;
  109.         FILE *fp;
  110.  
  111.         sprintf(buffer, "SerialDev:Modules.%s.Driver", name);
  112.         if ((fp = fopen(buffer, "rb")) == NULL)
  113.         {
  114.                 werr(1, "Failed to open %s\n", buffer);
  115.                 return(0);
  116.         }
  117.  
  118.         fseek(fp, 0L, SEEK_END);
  119.         Length = (int)(ftell(fp) + 1L);
  120.  
  121.         if ((pointer = malloc(Length)) == NULL)
  122.         {
  123.                 werr(1,nospace);
  124.                 fclose(fp);
  125.                 return(0);
  126.         }
  127.  
  128.         fseek(fp, 0L, SEEK_SET);
  129.         fread(pointer, 1, Length, fp);
  130.         memcpy(&driver[dev].port,  pointer + 0x0C8, sizeof(int));
  131.         fclose(fp);
  132.  
  133.         driver[dev].iface  = iface;
  134.         driver[dev].speed  = 9600;
  135.         driver[dev].name   = strdup(name);
  136.         driver[dev].port   += port;
  137.         driver[dev].driver = (int (*)())pointer;
  138.  
  139.         /* Initialise port to 9600 Baud, 8 bits etc */
  140.         (*driver[dev].driver)(DRIVER_INITIALISE,   driver[dev].port);
  141.         (*driver[dev].driver)(DRIVER_TXSPEED,      driver[dev].port, 9600);
  142.         (*driver[dev].driver)(DRIVER_RXSPEED,      driver[dev].port, 9600);
  143.         (*driver[dev].driver)(DRIVER_WORDFORMAT,   driver[dev].port, 0x00);
  144.         (*driver[dev].driver)(DRIVER_CONTROLLINES, driver[dev].port, 3);
  145.  
  146.         return(1);
  147. }
  148.  
  149. static int driver_stop(struct interface *iface)
  150. {
  151.         /* Drop RTS/DSR */
  152.         (*driver[iface->dev].driver)(DRIVER_CONTROLLINES, driver[iface->dev].port,0); 
  153.  
  154.         /* Closedown */
  155.         (*driver[iface->dev].driver)(DRIVER_CLOSEDOWN, driver[iface->dev].port); 
  156.  
  157.         return(0);
  158. }
  159.  
  160. /* Set line speed */
  161. static int driver_speed(int16 dev, int speed)
  162. {
  163.         if (speed == 0 || dev >= ndriver) return(-1);
  164.  
  165.         driver[dev].speed = speed;
  166.  
  167.         /* Set speed */
  168.         (*driver[dev].driver)(DRIVER_TXSPEED, driver[dev].port, speed);
  169.         (*driver[dev].driver)(DRIVER_RXSPEED, driver[dev].port, speed);
  170.  
  171.         /* Check its been set */
  172.         if ((*driver[dev].driver)(DRIVER_RXSPEED, driver[dev].port, -1) != speed)
  173.         {
  174.                werr(0, "Invalid speed %d Baud", speed);
  175.                return(-1);
  176.         }
  177.  
  178.         return(0);
  179. }
  180.  
  181. /* Send a buffer to transmitter */
  182. static int driver_output(int16 dev, char *buf, int cnt)
  183. {
  184.         register int i;
  185.  
  186.         if (dev >= ndriver) return(0);
  187.  
  188.         for (i = 0; i < cnt && (*driver[dev].driver)(DRIVER_PUTBYTE, driver[dev].port, *buf) == 0; i++, buf++);
  189.  
  190.         return(i);
  191. }
  192.  
  193. /* Receive characters from line
  194.  * Returns count of characters read
  195.  */
  196. static int driver_recv(int16 dev, char *buf, int cnt)
  197. {
  198.         register int c;
  199.  
  200.         if (dev >= ndriver || cnt < 1) return(0);
  201.  
  202.         c = (*driver[dev].driver)(DRIVER_GETBYTE, driver[dev].port);
  203.  
  204.         if (c >= 0)
  205.         {
  206.                *buf = c;
  207.                return(1);
  208.         }
  209.  
  210.         return(0);
  211. }
  212.  
  213.