Changeset 606 for trunk/src/ifd/sys-bsd.c
- Timestamp:
- 03/22/05 08:11:42 (7 years ago)
- File:
-
- 1 edited
-
trunk/src/ifd/sys-bsd.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ifd/sys-bsd.c
r516 r606 5 5 * Copyright (C) 2003 Andreas Jellinghaus <aj@dungeon.inka.de> 6 6 * Copyright (C) 2003 Markus Friedl <markus@openbsd.org> 7 * Copyright (C) 2004-2005 William Wanders <william@wanders.org> 7 8 * 8 9 * These functions need to be re-implemented for every … … 25 26 #include <openct/driver.h> 26 27 28 #include "usb-descriptors.h" 29 27 30 int 28 31 ifd_sysdep_device_type(const char *name) … … 36 39 if (!strncmp(name, "/dev/ugen", 9)) { 37 40 ifd_debug(1, "BSD: returning IFD_DEVICE_TYPE_USB"); 41 if (stat(name, &stb) < 0) 42 return -1; 38 43 return IFD_DEVICE_TYPE_USB; 39 44 } 40 45 41 if (stat(name, &stb) < 0)42 return -1;43 #if 044 if (S_ISCHR(stb.st_mode)) {45 int major = major(stb.st_rdev);46 int minor = minor(stb.st_rdev);47 48 if (major == TTY_MAJOR49 || major == PTY_SLAVE_MAJOR50 || (UNIX98_PTY_SLAVE_MAJOR <= major51 && major < UNIX98_PTY_SLAVE_MAJOR + UNIX98_PTY_MAJOR_COUNT))52 return IFD_DEVICE_TYPE_SERIAL;53 54 if (major == MISC_MAJOR && minor == 1)55 return IFD_DEVICE_TYPE_PS2;56 }57 #endif58 46 return -1; 59 47 } … … 65 53 ifd_sysdep_usb_poll_presence(ifd_device_t *dev, struct pollfd *pfd) 66 54 { 67 #if 068 55 if (pfd->revents & POLLHUP) 69 56 return 0; … … 71 58 pfd->events = POLLHUP; 72 59 return 1; 73 #else 60 } 61 62 typedef struct ep { 63 int ep_fd; 64 } ep_t; 65 66 typedef ep_t interface_t[128]; 67 68 static interface_t interfaces[1]; 69 70 #define USB_REQUEST_SIZE 8 71 72 /* 73 * Open interface endpoint 74 */ 75 int 76 open_ep(char *name, int interface, int endpoint, int flags) 77 { 78 char filename[256]; 79 80 if(interfaces[interface][endpoint].ep_fd) { 81 ifd_debug(6, "open_ep: endpoint already opened"); 82 return 0; 83 } 84 85 sprintf((char *)&filename,"%s.%d", name, endpoint); 86 87 if((interfaces[interface][endpoint].ep_fd=open( 88 filename, flags)) < 0) { 89 ifd_debug(6, "open_ep: error opening \"%s\": %s", filename, strerror(errno)); 90 interfaces[interface][endpoint].ep_fd=0; 74 91 return -1; 75 #endif 92 } 93 return 0; 94 } 95 96 close_ep(int interface, int endpoint) 97 { 98 if(interfaces[interface][endpoint].ep_fd) { 99 close(interfaces[interface][endpoint].ep_fd); 100 interfaces[interface][endpoint].ep_fd=0; 101 } 102 } 103 104 int 105 ifd_sysdep_usb_bulk(ifd_device_t *dev, int ep, void *buffer, size_t len, long timeout) 106 { 107 int bytes_to_process; 108 int bytes_processed; 109 int direction = (ep & IFD_USB_ENDPOINT_DIR_MASK) == IFD_USB_ENDPOINT_IN ? 1 : 0; 110 int endpoint = (ep & ~IFD_USB_ENDPOINT_DIR_MASK); 111 112 ct_debug("ifd_sysdep_usb_bulk: endpoint=%d direction=%d", endpoint, direction); 113 if(open_ep(dev->name,0,endpoint,O_RDWR|O_NONBLOCK)) { 114 ct_debug("ifd_sysdep_usb_bulk: opening endpoint failed"); 115 return -1; 116 } 117 if(direction) { 118 if((bytes_to_process=read(interfaces[0][endpoint].ep_fd,buffer,len))<0) { 119 ifd_debug(6, "ifd_sysdep_usb_bulk: read failed: %s", strerror(errno)); 120 ct_error("usb_bulk read failed: %s", strerror(errno)); 121 return IFD_ERROR_COMM_ERROR; 122 } 123 ct_debug("ifd_sysdep_usb_bulk: read %d bytes", bytes_to_process); 124 return bytes_to_process; 125 } else { 126 bytes_to_process=len; 127 if((bytes_processed=write(interfaces[0][endpoint].ep_fd,buffer,bytes_to_process))!=bytes_to_process) { 128 ifd_debug(6, "ifd_sysdep_usb_bulk: write failed: %s", strerror(errno)); 129 ct_error("usb_bulk write failed: %s", strerror(errno)); 130 return IFD_ERROR_COMM_ERROR; 131 } 132 ct_debug("ifd_sysdep_usb_bulk: wrote buffer[%d]=%s", bytes_processed, ct_hexdump(buffer,len)); 133 return bytes_processed; 134 } 135 } 136 137 /* 138 * USB URB capture 139 */ 140 struct ifd_usb_capture { 141 int type; 142 int endpoint; 143 size_t maxpacket; 144 unsigned int interface; 145 }; 146 147 int 148 ifd_sysdep_usb_begin_capture(ifd_device_t *dev, 149 int type, int ep, size_t maxpacket, 150 ifd_usb_capture_t **capret) 151 { 152 ifd_usb_capture_t *cap; 153 int direction = (ep & IFD_USB_ENDPOINT_DIR_MASK) == IFD_USB_ENDPOINT_IN ? 1 : 0; 154 int endpoint = (ep & ~IFD_USB_ENDPOINT_DIR_MASK); 155 156 if(!(cap = (ifd_usb_capture_t *) calloc(1, sizeof(*cap) + maxpacket))) { 157 ct_debug("ifd_sysdep_usb_begin_capture: calloc failed"); 158 return -1; 159 } 160 cap->type = type; 161 cap->endpoint = ep; 162 cap->maxpacket = maxpacket; 163 164 if(!interfaces[0][endpoint].ep_fd) { 165 if(open_ep(dev->name,0,endpoint,O_RDONLY|O_NONBLOCK)) { 166 ct_debug("ifd_sysdep_usb_begin_capture: opening endpoint failed"); 167 return -1; 168 } 169 } 170 *capret = cap; 171 return 0; 172 } 173 174 int 175 ifd_sysdep_usb_capture(ifd_device_t *dev, 176 ifd_usb_capture_t *cap, 177 void *buffer, size_t len, 178 long timeout) 179 { 180 struct timeval begin; 181 int bytes_to_process=0; 182 int direction = (cap->endpoint & IFD_USB_ENDPOINT_DIR_MASK) == IFD_USB_ENDPOINT_IN ? 1 : 0; 183 int endpoint = (cap->endpoint & ~IFD_USB_ENDPOINT_DIR_MASK); 184 185 gettimeofday(&begin,NULL); 186 do { 187 struct pollfd pfd; 188 long wait; 189 190 if ((wait = (timeout - ifd_time_elapsed(&begin))) <= 0) 191 return IFD_ERROR_TIMEOUT; 192 193 pfd.fd = interfaces[0][endpoint].ep_fd; 194 pfd.events = POLLIN; 195 if(poll(&pfd,1,wait)!=1) 196 continue; 197 198 if((bytes_to_process=read(interfaces[0][endpoint].ep_fd,buffer,len))<0) { 199 ifd_debug(6, "ifd_sysdep_usb_bulk: read failed: %s", strerror(errno)); 200 ct_error("usb_bulk read failed: %s", strerror(errno)); 201 return IFD_ERROR_COMM_ERROR; 202 } 203 } while (!bytes_to_process); 204 ct_debug("ifd_sysdep_usb_capture: read buffer[%d]=%s", bytes_to_process, ct_hexdump(buffer,bytes_to_process)); 205 return bytes_to_process; 206 } 207 208 int 209 ifd_sysdep_usb_end_capture(ifd_device_t *dev, ifd_usb_capture_t *cap) 210 { 211 int direction = (cap->endpoint & IFD_USB_ENDPOINT_DIR_MASK) == IFD_USB_ENDPOINT_IN ? 1 : 0; 212 int endpoint = (cap->endpoint & ~IFD_USB_ENDPOINT_DIR_MASK); 213 close_ep(0,endpoint); 214 if(cap) free(cap); 215 return 0; 76 216 } 77 217 … … 134 274 ifd_sysdep_usb_set_configuration(ifd_device_t *dev, int config) 135 275 { 136 return -1; 137 } 276 int value, rc; 277 value = config; 278 if ((rc = ioctl(dev->fd, USB_SET_CONFIG, &value)) < 0) { 279 ifd_debug(1,"USB_SET_CONFIG failed: %d", rc); 280 ct_error("usb_set_configuration failed: %s(%d)", 281 strerror(errno), errno); 282 return IFD_ERROR_COMM_ERROR; 283 } 284 return 0; 285 } 286 138 287 139 288 int 140 289 ifd_sysdep_usb_set_interface(ifd_device_t *dev, int ifc, int alt) 141 290 { 142 return -1; 291 int rc; 292 struct usb_alt_interface { 293 int uai_config_index; 294 int uai_interface_index; 295 int uai_alt_no; 296 } value; 297 298 value.uai_config_index=ifc; 299 value.uai_interface_index=0; 300 value.uai_alt_no=alt; 301 if ((rc = ioctl(dev->fd, USB_SET_ALTINTERFACE, &value)) < 0) { 302 ifd_debug(1,"USB_SET_ALTINTERFACE failed: %d", rc); 303 ct_error("usb_set_interface failed: %s(%d)", 304 strerror(errno), errno); 305 return IFD_ERROR_COMM_ERROR; 306 } 307 return 0; 143 308 } 144 309 … … 146 311 ifd_sysdep_usb_claim_interface(ifd_device_t *dev, int interface) 147 312 { 148 return -1; 313 ct_debug("ifd_sysdep_usb_claim_interface: interface=%d (not yet implemented)", interface); 314 return 0; 149 315 } 150 316 … … 152 318 ifd_sysdep_usb_release_interface(ifd_device_t *dev, int interface) 153 319 { 154 return -1; 155 } 156 157 /* 158 * USB bulk transfer 159 */ 160 int 161 ifd_sysdep_usb_bulk(ifd_device_t *dev, int ep, void *buffer, size_t len, 162 long timeout) 163 { 164 return -1; 165 } 166 167 int 168 ifd_sysdep_usb_begin_capture(ifd_device_t *dev, 169 int type, int endpoint, size_t maxpacket, 170 ifd_usb_capture_t **capret) 171 { 172 return -1; 173 } 174 175 int 176 ifd_sysdep_usb_capture(ifd_device_t *dev, 177 ifd_usb_capture_t *cap, 178 void *buffer, size_t len, 179 long timeout) 180 { 181 return -1; 182 } 183 184 int 185 ifd_sysdep_usb_end_capture(ifd_device_t *dev, ifd_usb_capture_t *cap) 186 { 187 return -1; 320 ct_debug("ifd_sysdep_usb_release_interface: interface=%d (not yet implemented)", interface); 321 return 0; 188 322 } 189 323
Note: See TracChangeset
for help on using the changeset viewer.
