Ignore:
Timestamp:
03/22/05 08:11:42 (7 years ago)
Author:
aj
Message:

Attached is a patch for sys-bsd.c which should add enough
bulk and interrupt endpoint support for the CCID driver.

Hotplugging doesn't really work that well. Polling the
existence of a device through thru the ugen driver doesn't
seem to have the aimed effect.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ifd/sys-bsd.c

    r516 r606  
    55 * Copyright (C) 2003 Andreas Jellinghaus <aj@dungeon.inka.de> 
    66 * Copyright (C) 2003 Markus Friedl <markus@openbsd.org> 
     7 * Copyright (C) 2004-2005 William Wanders <william@wanders.org> 
    78 * 
    89 * These functions need to be re-implemented for every 
     
    2526#include <openct/driver.h> 
    2627 
     28#include "usb-descriptors.h" 
     29 
    2730int 
    2831ifd_sysdep_device_type(const char *name) 
     
    3639        if (!strncmp(name, "/dev/ugen", 9)) { 
    3740                ifd_debug(1, "BSD: returning IFD_DEVICE_TYPE_USB"); 
     41                if (stat(name, &stb) < 0) 
     42                        return -1; 
    3843                return IFD_DEVICE_TYPE_USB; 
    3944        } 
    4045 
    41         if (stat(name, &stb) < 0) 
    42                 return -1; 
    43 #if 0 
    44         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_MAJOR 
    49                  || major == PTY_SLAVE_MAJOR 
    50                  || (UNIX98_PTY_SLAVE_MAJOR <= major 
    51                   && 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 #endif 
    5846        return -1; 
    5947} 
     
    6553ifd_sysdep_usb_poll_presence(ifd_device_t *dev, struct pollfd *pfd) 
    6654{ 
    67 #if 0 
    6855        if (pfd->revents & POLLHUP) 
    6956                return 0; 
     
    7158        pfd->events = POLLHUP; 
    7259        return 1; 
    73 #else 
     60} 
     61 
     62typedef struct ep { 
     63    int ep_fd; 
     64} ep_t; 
     65 
     66typedef ep_t interface_t[128]; 
     67 
     68static interface_t interfaces[1]; 
     69 
     70#define USB_REQUEST_SIZE        8 
     71 
     72/* 
     73 * Open interface endpoint 
     74 */ 
     75int 
     76open_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; 
    7491        return -1; 
    75 #endif 
     92    } 
     93    return 0; 
     94} 
     95 
     96close_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 
     104int 
     105ifd_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 */ 
     140struct ifd_usb_capture { 
     141    int                 type; 
     142    int                 endpoint; 
     143    size_t              maxpacket; 
     144    unsigned int        interface; 
     145}; 
     146 
     147int 
     148ifd_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 
     174int 
     175ifd_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 
     208int 
     209ifd_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; 
    76216} 
    77217 
     
    134274ifd_sysdep_usb_set_configuration(ifd_device_t *dev, int config)  
    135275{ 
    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 
    138287 
    139288int 
    140289ifd_sysdep_usb_set_interface(ifd_device_t *dev, int ifc, int alt)  
    141290{ 
    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; 
    143308} 
    144309 
     
    146311ifd_sysdep_usb_claim_interface(ifd_device_t *dev, int interface)  
    147312{ 
    148      return -1; 
     313    ct_debug("ifd_sysdep_usb_claim_interface: interface=%d (not yet implemented)", interface); 
     314    return 0; 
    149315} 
    150316 
     
    152318ifd_sysdep_usb_release_interface(ifd_device_t *dev, int interface)  
    153319{ 
    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; 
    188322} 
    189323 
Note: See TracChangeset for help on using the changeset viewer.