root/src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.h
/*
 * Copyright (c) 2007-2008 by Michael Lotz
 * Heavily based on the original usb_serial driver which is:
 *
 * Copyright (c) 2003 by Siarzhuk Zharski <imker@gmx.li>
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Alexander von Gluck IV, kallisti5@unixzen.com
 */
#ifndef _USB_DEVICE_H_
#define _USB_DEVICE_H_


#include "Driver.h"


struct usb_serial_device {
        uint32      vendorID;
        uint32      productID;
        const char* deviceName;
};


class SerialDevice {
public:
                                                                SerialDevice(usb_device device,
                                                                        uint16 vendorID, uint16 productID,
                                                                        const char *description);
virtual                                                 ~SerialDevice();

static  SerialDevice *                  MakeDevice(usb_device device, uint16 vendorID,
                                                                        uint16 productID);

                status_t                                Init();

                usb_device                              Device() { return fDevice; };
                uint16                                  ProductID() { return fProductID; };
                uint16                                  VendorID() { return fVendorID; };
                const char *                    Description() { return fDescription; };

                void                                    SetControlPipe(usb_pipe handle);
                usb_pipe                                ControlPipe() { return fControlPipe; };

                void                                    SetReadPipe(usb_pipe handle);
                usb_pipe                                ReadPipe() { return fReadPipe; };

                void                                    SetWritePipe(usb_pipe handle);
                usb_pipe                                WritePipe() { return fWritePipe; }

                char *                                  ReadBuffer() { return fReadBuffer; };
                size_t                                  ReadBufferSize() { return fReadBufferSize; };

                char *                                  WriteBuffer() { return fWriteBuffer; };
                size_t                                  WriteBufferSize() { return fWriteBufferSize; };

                void                                    SetModes(struct termios *tios);
                bool                                    Service(struct tty *tty, uint32 op,
                                                                        void *buffer, size_t length);

                status_t                                Open(uint32 flags);
                status_t                                Read(char *buffer, size_t *numBytes);
                status_t                                Write(const char *buffer, size_t *numBytes);
                status_t                                Control(uint32 op, void *arg, size_t length);
                status_t                                Select(uint8 event, uint32 ref, selectsync *sync);
                status_t                                DeSelect(uint8 event, selectsync *sync);
                status_t                                Close();
                status_t                                Free();

                bool                                    IsOpen() { return fDeviceOpen; };
                void                                    Removed();
                bool                                    IsRemoved() { return fDeviceRemoved; };

                /* virtual interface to be overriden as necessary */
virtual status_t                                AddDevice(const usb_configuration_info *config);

virtual status_t                                ResetDevice();

virtual status_t                                SetLineCoding(usb_cdc_line_coding *coding);
virtual status_t                                SetControlLineState(uint16 state);
virtual status_t                                SetHardwareFlowControl(bool enable);

virtual void                                    OnRead(char **buffer, size_t *numBytes);
virtual void                                    OnWrite(const char *buffer, size_t *numBytes,
                                                                        size_t *packetBytes);
virtual void                                    OnClose();

protected:
                void                                    SetReadBufferSize(size_t size) { fReadBufferSize = size; };
                void                                    SetWriteBufferSize(size_t size) { fWriteBufferSize = size; };
                void                                    SetInterruptBufferSize(size_t size) { fInterruptBufferSize = size; };

private:
static  int32                                   _InputThread(void *data);
                status_t                                _WriteToDevice();

static  void                                    _ReadCallbackFunction(void *cookie,
                                                                        int32 status, void *data,
                                                                        size_t actualLength);
static  void                                    _WriteCallbackFunction(void *cookie,
                                                                        int32 status, void *data,
                                                                        size_t actualLength);
static  void                                    _InterruptCallbackFunction(void *cookie,
                                                                        int32 status, void *data,
                                                                        size_t actualLength);

                usb_device                              fDevice;                // USB device handle
                uint16                                  fVendorID;
                uint16                                  fProductID;
                const char *                    fDescription;   // informational description
                bool                                    fDeviceOpen;
                bool                                    fDeviceRemoved;

                /* communication pipes */
                usb_pipe                                fControlPipe;
                usb_pipe                                fReadPipe;
                usb_pipe                                fWritePipe;

                /* line coding */
                usb_cdc_line_coding             fLineCoding;

                /* data buffers */
                area_id                                 fBufferArea;
                char *                                  fReadBuffer;
                size_t                                  fReadBufferSize;
                char *                                  fOutputBuffer;
                size_t                                  fOutputBufferSize;
                char *                                  fWriteBuffer;
                size_t                                  fWriteBufferSize;
                char *                                  fInterruptBuffer;
                size_t                                  fInterruptBufferSize;

                /* variables used in callback functionality */
                size_t                                  fActualLengthRead;
                status_t                                fStatusRead;
                size_t                                  fActualLengthWrite;
                status_t                                fStatusWrite;
                size_t                                  fActualLengthInterrupt;
                status_t                                fStatusInterrupt;

                /* semaphores used in callbacks */
                sem_id                                  fDoneRead;
                sem_id                                  fDoneWrite;

                uint16                                  fControlOut;
                bool                                    fInputStopped;
                struct tty *                    fMasterTTY;
                struct tty *                    fSlaveTTY;
                struct tty_cookie *             fSystemTTYCookie;
                struct tty_cookie *             fDeviceTTYCookie;
                struct termios                  fTTYConfig;

                /* input thread management */
                thread_id                               fInputThread;
                bool                                    fStopThreads;
};

#endif // _USB_DEVICE_H_