1/* 2 * Copyright 2009-2010, Fran��ois Revol, <revol@free.fr>. 3 * Sponsored by TuneTracker Systems. 4 * Based on the Haiku usb_serial driver which is: 5 * 6 * Copyright (c) 2007-2008 by Michael Lotz 7 * Heavily based on the original usb_serial driver which is: 8 * 9 * Copyright (c) 2003 by Siarzhuk Zharski <imker@gmx.li> 10 * Distributed under the terms of the MIT License. 11 */ 12#ifndef _PC_SERIAL_DRIVER_H_ 13#define _PC_SERIAL_DRIVER_H_ 14 15#include <OS.h> 16#include <KernelExport.h> 17#include <Drivers.h> 18#include <ISA.h> 19#include <PCI.h> 20#include <string.h> 21 22#include <lock.h> 23#include <new> 24 25#include "Tracing.h" 26 27extern "C" { 28#include <tty_module.h> 29} 30 31 32// whether we should handle default COM ports 33#define HANDLE_ISA_COM 34 35#define DRIVER_NAME "pc_serial" // driver name for debug output 36#define DEVICES_COUNT 20 // max simultaneously open devices 37 38// avoid clashing with BeOS zz driver 39#define DEVFS_BASE "ports/pc_serial" 40//#define DEVFS_BASE "ports/serial" 41 42 43// no user serviceable part beyond this point 44 45// more PCI serial APIs 46#ifndef PCI_serial_16650 47#define PCI_serial_16650 0x03 /* 16650-compatible serial controller */ 48#define PCI_serial_16750 0x04 /* 16750-compatible serial controller */ 49#define PCI_serial_16850 0x05 /* 16850-compatible serial controller */ 50#define PCI_serial_16950 0x06 /* 16950-compatible serial controller */ 51#endif 52 53 54 55typedef enum { 56 B_ISA_BUS, 57 B_PCI_BUS, 58 B_PCMCIA_BUS, 59 B_UNKNOWN_BUS = 0x80 60} bus_type; 61 62 63class SerialDevice; 64 65struct port_constraints { 66 uint32 minsize; 67 uint32 maxsize; 68 uint32 split; // range to split I/O ports for each device 69 uint8 ignoremask; // bitmask of BARs to ignore when probing 70 uint8 maxports; // max number of ports on the card if > 0 71 uint32 subsystem_id_mask; // if set mask with subsys id and shift to get maxports 72}; 73 74#define PCI_INVAL 0xffff 75 76struct serial_support_descriptor { 77 const bus_type bus; // B_*_BUS 78 const char *name; 79 const uint32 *bauds; 80 // not yet used 81 SerialDevice *(*instanciator)(struct serial_support_descriptor *desc); 82 // I/O port constrains (which ranges to use, how to split them) 83 struct port_constraints constraints; 84 // bus specific stuff here... 85 struct { 86 // for both ISA & PCI 87 uchar class_base; 88 uchar class_sub; 89 uchar class_api; // or PCI_undefined 90 // for PCI: if PCI_INVAL then match class 91 ushort vendor_id; 92 ushort device_id; 93 ushort subsystem_vendor_id; 94 ushort subsystem_device_id; 95 } match; 96}; 97typedef struct serial_support_descriptor serial_support_descriptor; 98 99 100//struct serial_config_descriptor { 101// bus_type bus; // B_*_BUS 102// struct serial_support_descriptor *descriptor; 103// union { 104// struct pci_info pci; 105// } d; 106//}; 107 108 109/* This one rounds the size to integral count of segs (segments) */ 110#define ROUNDUP(size, seg) (((size) + (seg) - 1) & ~((seg) - 1)) 111/* Default device buffer size */ 112#define DEF_BUFFER_SIZE 0x200 113 114// XXX: sort up the mess in termios.h on B* ! 115#define BLAST B230400 116 117/* line coding defines ... Come from CDC USB specs? */ 118#define LC_STOP_BIT_1 0 119#define LC_STOP_BIT_2 2 120 121#define LC_PARITY_NONE 0 122#define LC_PARITY_ODD 1 123#define LC_PARITY_EVEN 2 124 125/* struct that represents line coding */ 126typedef struct pc_serial_line_coding_s { 127 uint32 speed; 128 uint8 stopbits; 129 uint8 parity; 130 uint8 databits; 131} pc_serial_line_coding; 132 133/* control line states */ 134#define CLS_LINE_DTR 0x0001 135#define CLS_LINE_RTS 0x0002 136 137 138extern isa_module_info *gISAModule; 139extern pci_module_info *gPCIModule; 140extern tty_module_info *gTTYModule; 141extern struct ddomain gSerialDomain; 142 143extern "C" { 144 145status_t init_hardware(); 146void uninit_driver(); 147 148bool pc_serial_service(struct tty *tty, uint32 op, void *buffer, 149 size_t length); 150 151int32 pc_serial_interrupt(void *arg); 152 153status_t pc_serial_open(const char *name, uint32 flags, void **cookie); 154status_t pc_serial_read(void *cookie, off_t position, void *buffer, size_t *numBytes); 155status_t pc_serial_write(void *cookie, off_t position, const void *buffer, size_t *numBytes); 156status_t pc_serial_control(void *cookie, uint32 op, void *arg, size_t length); 157status_t pc_serial_select(void *cookie, uint8 event, uint32 ref, selectsync *sync); 158status_t pc_serial_deselect(void *coookie, uint8 event, selectsync *sync); 159status_t pc_serial_close(void *cookie); 160status_t pc_serial_free(void *cookie); 161 162const char **publish_devices(); 163device_hooks *find_device(const char *name); 164 165} 166 167 168 169#endif //_PC_SERIAL_DRIVER_H_ 170