1 /** \file 2 * 3 * \author Copyright 2001 Lutz Mueller <lutz@users.sf.net> 4 * 5 * \par License 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * \par 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * \par 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with this library; if not, write to the 20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 21 * Boston, MA 02110-1301 USA 22 */ 23 24 #ifndef __GPHOTO2_PORT_H__ 25 #define __GPHOTO2_PORT_H__ 26 27 #include <gphoto2/gphoto2-port-info-list.h> 28 29 /* For portability */ 30 #include <gphoto2/gphoto2-port-portability.h> 31 #ifdef OS2 32 #include <gphoto2/gphoto2-port-portability-os2.h> 33 #include <os2.h> 34 #endif 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif /* __cplusplus */ 39 40 #ifndef TRUE 41 #define TRUE (0==0) 42 #endif 43 44 #ifndef FALSE 45 #define FALSE (1==0) 46 #endif 47 48 /** 49 * \brief Serial parity 50 * 51 * Parity of the serial port. 52 */ 53 typedef enum _GPPortSerialParity 54 { 55 GP_PORT_SERIAL_PARITY_OFF = 0, /**< \brief Parity is off (disabled) */ 56 GP_PORT_SERIAL_PARITY_EVEN, /**< \brief Parity is even. */ 57 GP_PORT_SERIAL_PARITY_ODD /**< \brief Parity is odd. */ 58 } GPPortSerialParity; 59 60 /** \brief Maximum length of receive buffer */ 61 #define GP_PORT_MAX_BUF_LEN 4096 62 63 /** 64 * \brief Port settings for serial ports. 65 */ 66 typedef struct _GPPortSettingsSerial { 67 char port[128]; /**< The portname (/dev/ttyX)*/ 68 int speed; /**< The baudrate of the device. */ 69 int bits; /**< How many bits data. */ 70 GPPortSerialParity parity; /**< parity data, see GP_PORT_SERIAL_PARITY_ 71 defines */ 72 int stopbits; /**< How many stop bits are used. */ 73 } GPPortSettingsSerial; 74 75 /** 76 * \brief Port settings for USB ports. 77 */ 78 typedef struct _GPPortSettingsUSB { 79 int inep; /**< \brief Bulk IN endpoint used. */ 80 int outep; /**< \brief Bulk OUT endpoint used. */ 81 int intep; /**< \brief Interrupt endpoint used. */ 82 int config; /**< \brief USB bConfigurationValue used. */ 83 int interface; /**< \brief USB Interface number used. */ 84 int altsetting; /**< \brief USB Alternative Setting used. */ 85 86 int maxpacketsize; /**< \brief Maximum USB packetsize of the IN endpoint. (r/o) */ 87 88 /* must be last to avoid binary incompatibility. 89 * luckily we just need to make sure this struct does not 90 * get larger than _GPPortSettingsSerial. */ 91 char port[64]; /**< \brief USB Portname. Specific to lowlevel USB. */ 92 } GPPortSettingsUSB; 93 94 /** 95 * \brief Port settings for USB mass storage direct IO ports. 96 */ 97 typedef struct _GPPortSettingsUsbDiskDirect { 98 char path[128]; /**< /brief The ports device node path (/dev/sdX)*/ 99 } GPPortSettingsUsbDiskDirect; 100 101 /** 102 * \brief Port settings for USB Mass Storage raw SCSI ports. 103 */ 104 typedef struct _GPPortSettingsUsbScsi { 105 char path[128]; /**< /brief The ports device node path (/dev/sg#)*/ 106 } GPPortSettingsUsbScsi; 107 108 /** 109 * \brief Union of port settings. 110 * 111 * This contains a shared union of possible settings for ports needing 112 * them. 113 */ 114 typedef union _GPPortSettings { 115 GPPortSettingsSerial serial; /**< \brief Serial specific settings */ 116 GPPortSettingsUSB usb; /**< \brief USB specific settings */ 117 GPPortSettingsUsbDiskDirect usbdiskdirect; /**< \brief usb disk direct port specific settings */ 118 GPPortSettingsUsbScsi usbscsi; /**< \brief usb scsi port specific settings */ 119 } GPPortSettings; 120 121 enum { 122 GP_PORT_USB_ENDPOINT_IN, /**< \brief USB bulk IN ep */ 123 GP_PORT_USB_ENDPOINT_OUT, /**< \brief USB bulk OUT ep */ 124 GP_PORT_USB_ENDPOINT_INT /**< \brief USB Interrupt ep */ 125 }; 126 127 typedef struct _GPPortPrivateLibrary GPPortPrivateLibrary; 128 typedef struct _GPPortPrivateCore GPPortPrivateCore; 129 130 /** 131 * \brief The GPhoto port structure. 132 * 133 * This structure tracks the physical connection of the device. 134 * It can correspond the various methods of lowlevel access, serial 135 * usb and others and abstracts them as much as possible. 136 * 137 * Frontends should consider this structure opaque and only use accessor 138 * functions. 139 * 140 * Camera drivers should only access the type and pl members directly, 141 * and use accessor functions for the rest. 142 */ 143 typedef struct _GPPort { 144 /* For your convenience */ 145 GPPortType type; /**< \brief Actual type of this port */ 146 147 GPPortSettings settings; /**< \brief Current port settings. */ 148 GPPortSettings settings_pending;/**< \brief Settings to be committed. */ 149 150 int timeout; /**< \brief Port timeout in milliseconds. */ 151 152 GPPortPrivateLibrary *pl; /**< \brief Camera driver private data pointer. */ 153 GPPortPrivateCore *pc; /**< \brief Port library private data pointer. */ 154 } GPPort; 155 156 int gp_port_new (GPPort **port); 157 int gp_port_free (GPPort *port); 158 159 int gp_port_set_info (GPPort *port, GPPortInfo info); 160 int gp_port_get_info (GPPort *port, GPPortInfo *info); 161 162 int gp_port_open (GPPort *port); 163 int gp_port_close (GPPort *port); 164 165 int gp_port_reset (GPPort *port); 166 167 int gp_port_write (GPPort *port, const char *data, int size); 168 int gp_port_read (GPPort *port, char *data, int size); 169 int gp_port_check_int (GPPort *port, char *data, int size); 170 int gp_port_check_int_fast (GPPort *port, char *data, int size); 171 172 int gp_port_get_timeout (GPPort *port, int *timeout); 173 int gp_port_set_timeout (GPPort *port, int timeout); 174 175 int gp_port_set_settings (GPPort *port, GPPortSettings settings); 176 int gp_port_get_settings (GPPort *port, GPPortSettings *settings); 177 178 /** 179 * \brief Serial pins. 180 * 181 * A number of serial pins to trigger and pull. This is necessary 182 * for some devices that have more than just the regular 3 or 4 wires. 183 */ 184 typedef enum _GPPin { 185 GP_PIN_RTS, /**< \brief RTS line */ 186 GP_PIN_DTR, /**< \brief DTR line */ 187 GP_PIN_CTS, /**< \brief CTS line */ 188 GP_PIN_DSR, /**< \brief DSR line */ 189 GP_PIN_CD, /**< \brief Carrier Detect line */ 190 GP_PIN_RING /**< \brief RING (Modem) line */ 191 } GPPin; 192 193 /** 194 * \brief Level to pull specific lines. 195 * 196 * The level on which to pull some of the serial lines. 197 */ 198 typedef enum _GPLevel { 199 GP_LEVEL_LOW = 0, /**< \brief Pull to low (0V) */ 200 GP_LEVEL_HIGH = 1 /**< \brief Pull to high (nV) */ 201 } GPLevel; 202 203 int gp_port_get_pin (GPPort *port, GPPin pin, GPLevel *level); 204 int gp_port_set_pin (GPPort *port, GPPin pin, GPLevel level); 205 206 int gp_port_send_break (GPPort *port, int duration); 207 int gp_port_flush (GPPort *port, int direction); 208 209 int gp_port_usb_find_device (GPPort *port, int idvendor, int idproduct); 210 int gp_port_usb_find_device_by_class (GPPort *port, int mainclass, int subclass, int protocol); 211 int gp_port_usb_clear_halt (GPPort *port, int ep); 212 int gp_port_usb_msg_write (GPPort *port, int request, int value, 213 int index, char *bytes, int size); 214 int gp_port_usb_msg_read (GPPort *port, int request, int value, 215 int index, char *bytes, int size); 216 int gp_port_usb_msg_interface_write (GPPort *port, int request, 217 int value, int index, char *bytes, int size); 218 int gp_port_usb_msg_interface_read (GPPort *port, int request, 219 int value, int index, char *bytes, int size); 220 int gp_port_usb_msg_class_write (GPPort *port, int request, 221 int value, int index, char *bytes, int size); 222 int gp_port_usb_msg_class_read (GPPort *port, int request, 223 int value, int index, char *bytes, int size); 224 225 int gp_port_seek (GPPort *port, int offset, int whence); 226 227 int gp_port_send_scsi_cmd (GPPort *port, int to_dev, 228 char *cmd, int cmd_size, 229 char *sense, int sense_size, 230 char *data, int data_size); 231 232 /* Error reporting */ 233 int gp_port_set_error (GPPort *port, const char *format, ...) 234 #ifdef __GNUC__ 235 __attribute__((__format__(printf,2,3))) 236 #endif 237 ; 238 const char *gp_port_get_error (GPPort *port); 239 240 /* DEPRECATED */ 241 /** \deprecated internal typedef */ 242 typedef GPPort gp_port; 243 /** \deprecated internal typedef */ 244 typedef GPPortSettings gp_port_settings; 245 /** \deprecated internal define */ 246 #define PIN_CTS GP_PIN_CTS 247 248 #ifdef __cplusplus 249 } 250 #endif /* __cplusplus */ 251 252 #endif /* __GPHOTO2_PORT_H__ */ 253