/[rdesktop]/jpeg/rdesktop/trunk/serial.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /jpeg/rdesktop/trunk/serial.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 588 by n-ki, Thu Jan 29 11:47:14 2004 UTC revision 686 by stargo, Thu Apr 29 19:41:49 2004 UTC
# Line 53  Line 53 
53  #define ODD_PARITY                      1  #define ODD_PARITY                      1
54  #define EVEN_PARITY                     2  #define EVEN_PARITY                     2
55    
56    #define SERIAL_PURGE_TXABORT 0x00000001
57    #define SERIAL_PURGE_RXABORT 0x00000002
58    #define SERIAL_PURGE_TXCLEAR 0x00000004
59    #define SERIAL_PURGE_RXCLEAR 0x00000008
60    
61    /* SERIAL_WAIT_ON_MASK */
62    #define SERIAL_EV_RXCHAR           0x0001       // Any Character received
63    #define SERIAL_EV_RXFLAG           0x0002       // Received certain character
64    #define SERIAL_EV_TXEMPTY          0x0004       // Transmitt Queue Empty
65    #define SERIAL_EV_CTS              0x0008       // CTS changed state
66    #define SERIAL_EV_DSR              0x0010       // DSR changed state
67    #define SERIAL_EV_RLSD             0x0020       // RLSD changed state
68    #define SERIAL_EV_BREAK            0x0040       // BREAK received
69    #define SERIAL_EV_ERR              0x0080       // Line status error occurred
70    #define SERIAL_EV_RING             0x0100       // Ring signal detected
71    #define SERIAL_EV_PERR             0x0200       // Printer error occured
72    #define SERIAL_EV_RX80FULL         0x0400       // Receive buffer is 80 percent full
73    #define SERIAL_EV_EVENT1           0x0800       // Provider specific event 1
74    #define SERIAL_EV_EVENT2           0x1000       // Provider specific event 2
75    
76    #ifndef CRTSCTS
77    #define CRTSCTS 0
78    #endif
79    
80    
81  extern RDPDR_DEVICE g_rdpdr_device[];  extern RDPDR_DEVICE g_rdpdr_device[];
82    
83  SERIAL_DEVICE *  static SERIAL_DEVICE *
84  get_serial_info(HANDLE handle)  get_serial_info(HANDLE handle)
85  {  {
86          int index;          int index;
# Line 68  get_serial_info(HANDLE handle) Line 93  get_serial_info(HANDLE handle)
93          return NULL;          return NULL;
94  }  }
95    
96  BOOL  static BOOL
97  get_termios(SERIAL_DEVICE * pser_inf, HANDLE serial_fd)  get_termios(SERIAL_DEVICE * pser_inf, HANDLE serial_fd)
98  {  {
99          speed_t speed;          speed_t speed;
# Line 186  get_termios(SERIAL_DEVICE * pser_inf, HA Line 211  get_termios(SERIAL_DEVICE * pser_inf, HA
211                          break;                          break;
212          }          }
213    
214            pser_inf->rts = (ptermios->c_cflag & CRTSCTS) ? 1 : 0;
215    
216          return True;          return True;
217  }  }
218    
# Line 286  set_termios(SERIAL_DEVICE * pser_inf, HA Line 313  set_termios(SERIAL_DEVICE * pser_inf, HA
313          cfsetispeed(pser_inf->ptermios, speed);          cfsetispeed(pser_inf->ptermios, speed);
314          cfsetospeed(pser_inf->ptermios, pser_inf->dtr ? speed : 0);          cfsetospeed(pser_inf->ptermios, pser_inf->dtr ? speed : 0);
315    
316          ptermios->c_cflag &= ~(CSTOPB | PARENB | PARODD | CSIZE);          ptermios->c_cflag &= ~(CSTOPB | PARENB | PARODD | CSIZE | CRTSCTS);
317          switch (pser_inf->stop_bits)          switch (pser_inf->stop_bits)
318          {          {
319                  case STOP_BITS_2:                  case STOP_BITS_2:
320                          ptermios->c_cflag |= CSTOPB;                          ptermios->c_cflag |= CSTOPB;
321                          break;                          break;
322          }          }
323    
324          switch (pser_inf->parity)          switch (pser_inf->parity)
325          {          {
326                  case EVEN_PARITY:                  case EVEN_PARITY:
# Line 302  set_termios(SERIAL_DEVICE * pser_inf, HA Line 330  set_termios(SERIAL_DEVICE * pser_inf, HA
330                          ptermios->c_cflag |= PARENB | PARODD;                          ptermios->c_cflag |= PARENB | PARODD;
331                          break;                          break;
332          }          }
333    
334          switch (pser_inf->word_length)          switch (pser_inf->word_length)
335          {          {
336                  case 5:                  case 5:
# Line 318  set_termios(SERIAL_DEVICE * pser_inf, HA Line 347  set_termios(SERIAL_DEVICE * pser_inf, HA
347                          break;                          break;
348          }          }
349    
350            if (pser_inf->rts)
351                    ptermios->c_cflag |= CRTSCTS;
352    
353          tcsetattr(serial_fd, TCSANOW, ptermios);          tcsetattr(serial_fd, TCSANOW, ptermios);
354  }  }
355    
# Line 327  set_termios(SERIAL_DEVICE * pser_inf, HA Line 359  set_termios(SERIAL_DEVICE * pser_inf, HA
359  /* when it arrives to this function.              */  /* when it arrives to this function.              */
360  /* :com1=/dev/ttyS0,com2=/dev/ttyS1 */  /* :com1=/dev/ttyS0,com2=/dev/ttyS1 */
361  int  int
362  serial_enum_devices(int *id, char *optarg)  serial_enum_devices(uint32 * id, char *optarg)
363  {  {
364          SERIAL_DEVICE *pser_inf;          SERIAL_DEVICE *pser_inf;
365    
# Line 364  serial_enum_devices(int *id, char *optar Line 396  serial_enum_devices(int *id, char *optar
396          return count;          return count;
397  }  }
398    
399  NTSTATUS  static NTSTATUS
400  serial_create(uint32 device_id, uint32 access, uint32 share_mode, uint32 disposition,  serial_create(uint32 device_id, uint32 access, uint32 share_mode, uint32 disposition,
401                uint32 flags_and_attributes, char *filename, HANDLE * handle)                uint32 flags_and_attributes, char *filename, HANDLE * handle)
402  {  {
# Line 383  serial_create(uint32 device_id, uint32 a Line 415  serial_create(uint32 device_id, uint32 a
415          }          }
416    
417          if (!get_termios(pser_inf, serial_fd))          if (!get_termios(pser_inf, serial_fd))
418            {
419                    printf("INFO: SERIAL %s access denied\n", g_rdpdr_device[device_id].name);
420                    fflush(stdout);
421                  return STATUS_ACCESS_DENIED;                  return STATUS_ACCESS_DENIED;
422            }
423    
424          // Store handle for later use          // Store handle for later use
425          g_rdpdr_device[device_id].handle = serial_fd;          g_rdpdr_device[device_id].handle = serial_fd;
426    
427          /* some sane information */          /* some sane information */
428          printf("INFO: SERIAL %s to %s\nINFO: speed %u baud, stop bits %u, parity %u, word length %u bits, dtr %u\n", g_rdpdr_device[device_id].name, g_rdpdr_device[device_id].local_path, pser_inf->baud_rate, pser_inf->stop_bits, pser_inf->parity, pser_inf->word_length, pser_inf->dtr);          printf("INFO: SERIAL %s to %s\nINFO: speed %u baud, stop bits %u, parity %u, word length %u bits, dtr %u, rts %u\n", g_rdpdr_device[device_id].name, g_rdpdr_device[device_id].local_path, pser_inf->baud_rate, pser_inf->stop_bits, pser_inf->parity, pser_inf->word_length, pser_inf->dtr, pser_inf->rts);
429    
430          printf("INFO: use stty to change settings\n");          printf("INFO: use stty to change settings\n");
431    
432  /*      ptermios->c_cflag = B115200 | CRTSCTS | CS8 | CLOCAL | CREAD;  /*      ptermios->c_cflag = B115200 | CRTSCTS | CS8 | CLOCAL | CREAD;
# Line 399  serial_create(uint32 device_id, uint32 a Line 436  serial_create(uint32 device_id, uint32 a
436    
437          tcsetattr(serial_fd, TCSANOW, ptermios);          tcsetattr(serial_fd, TCSANOW, ptermios);
438  */  */
439    
440          *handle = serial_fd;          *handle = serial_fd;
441    
442            /* all read and writes should be non blocking */
443            if (fcntl(*handle, F_SETFL, O_NONBLOCK) == -1)
444                    perror("fcntl");
445    
446          return STATUS_SUCCESS;          return STATUS_SUCCESS;
447  }  }
448    
449  static NTSTATUS  static NTSTATUS
450  serial_close(HANDLE handle)  serial_close(HANDLE handle)
451  {  {
452          g_rdpdr_device[get_device_index(handle)].handle = 0;          int i = get_device_index(handle);
453            if (i >= 0)
454                    g_rdpdr_device[i].handle = 0;
455          close(handle);          close(handle);
456          return STATUS_SUCCESS;          return STATUS_SUCCESS;
457  }  }
458    
459  NTSTATUS  static NTSTATUS
460  serial_read(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)  serial_read(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
461  {  {
462          long timeout;          long timeout;
463          SERIAL_DEVICE *pser_inf;          SERIAL_DEVICE *pser_inf;
464          struct termios *ptermios;          struct termios *ptermios;
465    
466  //      timeout = 90;          timeout = 90;
467          pser_inf = get_serial_info(handle);          pser_inf = get_serial_info(handle);
468          ptermios = pser_inf->ptermios;          ptermios = pser_inf->ptermios;
469    
 #if 0  
470          // Set timeouts kind of like the windows serial timeout parameters. Multiply timeout          // Set timeouts kind of like the windows serial timeout parameters. Multiply timeout
471          // with requested read size          // with requested read size
472          if (pser_inf->read_total_timeout_multiplier | pser_inf->read_total_timeout_constant)          if (pser_inf->read_total_timeout_multiplier | pser_inf->read_total_timeout_constant)
# Line 450  serial_read(HANDLE handle, uint8 * data, Line 494  serial_read(HANDLE handle, uint8 * data,
494                  ptermios->c_cc[VMIN] = 1;                  ptermios->c_cc[VMIN] = 1;
495          }          }
496          tcsetattr(handle, TCSANOW, ptermios);          tcsetattr(handle, TCSANOW, ptermios);
497  #endif  
498    
499          *result = read(handle, data, length);          *result = read(handle, data, length);
500    
501            //hexdump(data, *read);
502    
503          return STATUS_SUCCESS;          return STATUS_SUCCESS;
504  }  }
505    
506  NTSTATUS  static NTSTATUS
507  serial_write(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)  serial_write(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
508  {  {
509          *result = write(handle, data, length);          *result = write(handle, data, length);
# Line 465  serial_write(HANDLE handle, uint8 * data Line 513  serial_write(HANDLE handle, uint8 * data
513  static NTSTATUS  static NTSTATUS
514  serial_device_control(HANDLE handle, uint32 request, STREAM in, STREAM out)  serial_device_control(HANDLE handle, uint32 request, STREAM in, STREAM out)
515  {  {
516    #if 0
517            int flush_mask, purge_mask;
518    #endif
519          uint32 result;          uint32 result;
520          uint8 immediate;          uint8 immediate;
521          SERIAL_DEVICE *pser_inf;          SERIAL_DEVICE *pser_inf;
# Line 548  serial_device_control(HANDLE handle, uin Line 599  serial_device_control(HANDLE handle, uin
599                          pser_inf->dtr = 0;                          pser_inf->dtr = 0;
600                          set_termios(pser_inf, handle);                          set_termios(pser_inf, handle);
601                          break;                          break;
602  #if 0                  case SERIAL_SET_RTS:
603                  case SERIAL_WAIT_ON_MASK:                          pser_inf->rts = 1;
604                          /* XXX implement me */                          set_termios(pser_inf, handle);
605                          break;                          break;
606                  case SERIAL_SET_BREAK_ON:                  case SERIAL_CLR_RTS:
607                          tcsendbreak(serial_fd, 0);                          pser_inf->rts = 0;
608                            set_termios(pser_inf, handle);
609                            break;
610                    case SERIAL_GET_MODEMSTATUS:
611                            out_uint32_le(out, 0);  /* Errors */
612                            break;
613                    case SERIAL_GET_COMMSTATUS:
614                            out_uint32_le(out, 0);  /* Errors */
615                            out_uint32_le(out, 0);  /* Hold reasons */
616                            out_uint32_le(out, 0);  /* Amount in in queue */
617                            out_uint32_le(out, 0);  /* Amount in out queue */
618                            out_uint8(out, 0);      /* EofReceived */
619                            out_uint8(out, 0);      /* WaitForImmediate */
620                          break;                          break;
621    #if 0
622                  case SERIAL_PURGE:                  case SERIAL_PURGE:
   
623                          printf("SERIAL_PURGE\n");                          printf("SERIAL_PURGE\n");
624                          in_uint32(in, purge_mask);                          in_uint32(in, purge_mask);
625                          if (purge_mask & 0x04)                          if (purge_mask & 0x04)
# Line 570  serial_device_control(HANDLE handle, uin Line 633  serial_device_control(HANDLE handle, uin
633                          if (purge_mask & 0x02)                          if (purge_mask & 0x02)
634                                  rdpdr_abort_io(handle, 3, STATUS_CANCELLED);                                  rdpdr_abort_io(handle, 3, STATUS_CANCELLED);
635                          break;                          break;
636                    case SERIAL_WAIT_ON_MASK:
637                            /* XXX implement me */
638                            out_uint32_le(out, pser_inf->wait_mask);
639                            break;
640                    case SERIAL_SET_BREAK_ON:
641                            tcsendbreak(serial_fd, 0);
642                            break;
643                  case SERIAL_RESET_DEVICE:                  case SERIAL_RESET_DEVICE:
644                  case SERIAL_SET_BREAK_OFF:                  case SERIAL_SET_BREAK_OFF:
                 case SERIAL_SET_RTS:  
                 case SERIAL_CLR_RTS:  
645                  case SERIAL_SET_XOFF:                  case SERIAL_SET_XOFF:
646                  case SERIAL_SET_XON:                  case SERIAL_SET_XON:
647                          /* ignore */                          /* ignore */
648                          break;                          break;
649  #endif  #endif
   
650                  default:                  default:
651                          unimpl("SERIAL IOCTL %d\n", request);                          unimpl("SERIAL IOCTL %d\n", request);
652                          return STATUS_INVALID_PARAMETER;                          return STATUS_INVALID_PARAMETER;
# Line 597  serial_get_timeout(HANDLE handle, uint32 Line 663  serial_get_timeout(HANDLE handle, uint32
663          SERIAL_DEVICE *pser_inf;          SERIAL_DEVICE *pser_inf;
664    
665          index = get_device_index(handle);          index = get_device_index(handle);
666            if (index < 0)
667                    return True;
668    
669          if (g_rdpdr_device[index].device_type != DEVICE_TYPE_SERIAL)          if (g_rdpdr_device[index].device_type != DEVICE_TYPE_SERIAL)
670          {          {

Legend:
Removed from v.588  
changed lines
  Added in v.686

  ViewVC Help
Powered by ViewVC 1.1.26