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
37extern "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 */
53typedef 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 */
66typedef 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 */
78typedef 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 */
97typedef 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 */
104typedef 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 */
114typedef 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
121enum {
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
127typedef struct _GPPortPrivateLibrary GPPortPrivateLibrary;
128typedef 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 */
143typedef 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
156int gp_port_new (GPPort **port);
157int gp_port_free (GPPort *port);
158
159int gp_port_set_info (GPPort *port, GPPortInfo info);
160int gp_port_get_info (GPPort *port, GPPortInfo *info);
161
162int gp_port_open (GPPort *port);
163int gp_port_close (GPPort *port);
164
165int gp_port_reset (GPPort *port);
166
167int gp_port_write (GPPort *port, const char *data, int size);
168int gp_port_read (GPPort *port, char *data, int size);
169int gp_port_check_int (GPPort *port, char *data, int size);
170int gp_port_check_int_fast (GPPort *port, char *data, int size);
171
172int gp_port_get_timeout (GPPort *port, int *timeout);
173int gp_port_set_timeout (GPPort *port, int timeout);
174
175int gp_port_set_settings (GPPort *port, GPPortSettings settings);
176int 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 */
184typedef 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 */
198typedef 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
203int gp_port_get_pin (GPPort *port, GPPin pin, GPLevel *level);
204int gp_port_set_pin (GPPort *port, GPPin pin, GPLevel level);
205
206int gp_port_send_break (GPPort *port, int duration);
207int gp_port_flush (GPPort *port, int direction);
208
209int gp_port_usb_find_device (GPPort *port, int idvendor, int idproduct);
210int gp_port_usb_find_device_by_class (GPPort *port, int mainclass, int subclass, int protocol);
211int gp_port_usb_clear_halt (GPPort *port, int ep);
212int gp_port_usb_msg_write (GPPort *port, int request, int value,
213 int index, char *bytes, int size);
214int gp_port_usb_msg_read (GPPort *port, int request, int value,
215 int index, char *bytes, int size);
216int gp_port_usb_msg_interface_write (GPPort *port, int request,
217 int value, int index, char *bytes, int size);
218int gp_port_usb_msg_interface_read (GPPort *port, int request,
219 int value, int index, char *bytes, int size);
220int gp_port_usb_msg_class_write (GPPort *port, int request,
221 int value, int index, char *bytes, int size);
222int gp_port_usb_msg_class_read (GPPort *port, int request,
223 int value, int index, char *bytes, int size);
224
225int gp_port_seek (GPPort *port, int offset, int whence);
226
227int 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 */
233int gp_port_set_error (GPPort *port, const char *format, ...)
234#ifdef __GNUC__
235 __attribute__((__format__(printf,2,3)))
236#endif
237;
238const char *gp_port_get_error (GPPort *port);
239
240/* DEPRECATED */
241/** \deprecated internal typedef */
242typedef GPPort gp_port;
243/** \deprecated internal typedef */
244typedef 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