From: hackbard Date: Sat, 25 Feb 2006 21:25:09 +0000 (+0000) Subject: basic functions added, problem: altsetting ... X-Git-Url: https://hackdaworld.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=52d5cce98a304aff9e9e1f98e345432d7bf62a8d;p=rfid%2Flibrfid.git basic functions added, problem: altsetting ... --- diff --git a/gemtag/gemtag.c b/gemtag/gemtag.c index 28538c7..9656f01 100644 --- a/gemtag/gemtag.c +++ b/gemtag/gemtag.c @@ -24,15 +24,17 @@ #include #include "gemtag.h" -/* variables */ +int hexdump(unsigned char *data,int len) { + int i; -struct gemtag_handle { - struct usb_dev_handle *handle; -}; + printf("dump: "); + for(i=0;i>1)^crc_polynom; + else + crc=(crc>>1); + } + } + return crc; +} + +int gemtag_transcieve(struct gemtag_handle *gh,unsigned char cmd, + unsigned char *tx,unsigned int tx_len, + unsigned char *rx,unsigned int *rx_len) { + + unsigned char txbuf[256]; + unsigned char rxbuf[256]; + struct gemtag_cmd_hdr *txhdr; + struct gemtag_cmd_hdr *rxhdr; + u_int16_t *crcptr; + int ret,size; + + txhdr=(struct gemtag_cmd_hdr *)txbuf; + rxhdr=(struct gemtag_cmd_hdr *)rxbuf; + + txhdr->start=0xa5; + txhdr->seq=++(gh->seq); + txhdr->cmd=cmd; + txhdr->len=htons(tx_len); + size=sizeof(struct gemtag_cmd_hdr); + memcpy(txbuf+size,tx,tx_len); + + /* crc check */ + gh->capabilities=GEMTAG_CAP_CRC; + if(gh->capabilities&GEMTAG_CAP_CRC) { + size+=tx_len; + crcptr=(u_int16_t *)(txbuf+size); + *crcptr=gemtag_calc_crc(txbuf,size); + size+=2; + } + + /* usb write */ + hexdump(txbuf,size); + ret=usb_bulk_write(gh->handle,0x02,txbuf,size,0); + if(ret<0) { + perror("usb bulk write"); + return ret; + } + printf("write of %d bytes successfull\n",ret); + + /* usb read */ + ret=usb_bulk_read(gh->handle,0x81,rxbuf,sizeof(rxbuf),0); + size=ret; + if(ret<0) { + perror("usb bulk read"); + return ret; + } + printf("received %d bytes\n",ret); + + if(rxhdr->seq!=txhdr->seq) + puts("transmitted/recieved header are not equal"); + + /* crc check */ + + + *rx_len=ntohs(rxhdr->len); + memcpy(rx,rxbuf+sizeof(struct gemtag_cmd_hdr), + ret-sizeof(struct gemtag_cmd_hdr)+2); + hexdump(rxbuf,ret+2); + + return 0; +} + struct gemtag_handle *gemtag_open(void) { struct usb_device *gemtag; unsigned char rbuf[16]; @@ -74,14 +161,14 @@ struct gemtag_handle *gemtag_open(void) { memset(gh,0,sizeof(struct gemtag_handle)); numconf=gemtag->descriptor.bNumConfigurations; - printf("found gemtag, %u configurations\n",numconf); + printf("found gemtag, %u configuration(s)\n",numconf); for(i=0;iconfig[i].bNumInterfaces; - printf("config %u [nr %u] has %u interfaces\n", + printf("config %u [nr %u] has %u interface(s)\n", i,gemtag->config[i].bConfigurationValue, numint); for(j=0;jconfig[i].interface[j].num_altsetting); } } @@ -89,6 +176,32 @@ struct gemtag_handle *gemtag_open(void) { gh->handle=usb_open(gemtag); if(!gh->handle) goto out_free; + puts("usb_open successfull"); + + if(usb_set_configuration(gh->handle,1)) { + perror("set config"); + goto out_free; + } + puts("configuration 1 successfully set"); + + if(usb_claim_interface(gh->handle,0)) { + perror("claim interface"); + goto out_free; + } + puts("interface 0 claimed"); + +/* if(usb_set_altinterface(gh->handle,1)) { + perror("set alt interface"); + goto out_free; + } + puts("alt setting 1 selected"); +*/ + + gh->capabilities|=GEMTAG_CAP_CRC; + + gemtag_transcieve(gh,0x22,NULL,0,rbuf,&rlen); + + return gh; out_free: free(gh); diff --git a/gemtag/gemtag.h b/gemtag/gemtag.h index 6e01bd2..f832100 100644 --- a/gemtag/gemtag.h +++ b/gemtag/gemtag.h @@ -21,4 +21,26 @@ #define USB_VENDOR_GEMTAG 0x1394 #define USB_DEVICE_X501 0x0501 +struct gemtag_handle { + struct usb_dev_handle *handle; + unsigned char seq; + unsigned char capabilities; + unsigned char snr[4]; +}; + +#define GEMTAG_CAP_CRC 0x01 + +struct gemtag_cmd_hdr { + unsigned char start; + unsigned char seq; + unsigned char cmd; + u_int16_t len; +} __attribute__ ((packed)); + +#define GEMTAG_CMD_GET_FW_VERSION 0x63 +#define GEMTAG_CMD_GET_SERIAL_NUMBER 0x22 +#define GEMTAG_CMD_GET_RIC_VERSION 0x64 +#define GEMTAG_CMD_PCD_SET_TMO 0x27 +#define GEMTAG_CMD_SET_CPU_TIMEOUT 0x88 + #endif