X-Git-Url: https://hackdaworld.org/gitweb/?p=rfid%2Flibrfid.git;a=blobdiff_plain;f=gemtag%2Fgemtag.c;h=db4823e52f32baf31b80a5dad240937115445998;hp=28538c77098921f5a93d911ccb95852cb76159b8;hb=3ca43b53eb696fea7ea7f6a14ed4e1bfa7b01ac7;hpb=c8c92a9a0bb6354e1740a838b3f51000b59f4e97 diff --git a/gemtag/gemtag.c b/gemtag/gemtag.c index 28538c7..db4823e 100644 --- a/gemtag/gemtag.c +++ b/gemtag/gemtag.c @@ -1,5 +1,5 @@ /* - * (C) 2006 by Frank Zirkelbach + * (C) 2006 by Frank Zirkelbach * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 @@ -24,15 +24,16 @@ #include #include "gemtag.h" -/* variables */ +int hexdump(unsigned char *data,int len) { + int i; -struct gemtag_handle { - struct usb_dev_handle *handle; -}; + 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; + unsigned char buf[32]; + u_int16_t crc,*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=(tx_len>>8)|(tx_len<<8); + size=sizeof(struct gemtag_cmd_hdr); + memcpy(txbuf+size,tx,tx_len); + size+=tx_len; + + /* crc check */ + if(gh->capabilities&GEMTAG_CAP_CRC) { + crcptr=(u_int16_t *)(txbuf+size); + crc=gemtag_calc_crc(txbuf,size); + *crcptr=(crc>>8)|(crc<<8); + size+=2; + } + + /* usb write */ + printf("(%02d) -> ",size); + hexdump(txbuf,size); + ret=usb_interrupt_write(gh->handle,0x02,txbuf,size,0); + if(ret<=0) { + perror("usb interrupt write"); + return ret; + } + + /* usb read */ + ret=usb_interrupt_read(gh->handle,0x81,buf,32,0); + if(ret<=0) { + perror("usb interrupt read"); + return ret; + } + memcpy(rxbuf,buf,ret); + printf("(%02d) <- ",ret); + hexdump(rxbuf,ret); + + *rx_len=buf[3]|(buf[4]<<8); + printf("debug: length according to header -> %d 0x%04x\n", + *rx_len,*rx_len); + size=*rx_len+5; + + /* crc check */ + if(gh->capabilities&GEMTAG_CAP_CRC) { + size=ret-2; + crcptr=(u_int16_t *)(rxbuf+size); + crc=gemtag_calc_crc(rxbuf,size); + if(((crc>>8)!=rxbuf[size+1])||((crc&0xff)!=rxbuf[size])) { + printf("bad crc! (%04x)\n",crc); + //return -BAD_CRC; + } + } + + /* check sequence number */ + if(rxhdr->seq!=txhdr->seq) { + puts("transmitted/recieved sequence number do not match"); + //return -SEQ_MISMATCH; + } + + memcpy(rx,rxbuf+sizeof(struct gemtag_cmd_hdr),*rx_len); + + return 0; +} + struct gemtag_handle *gemtag_open(void) { struct usb_device *gemtag; - unsigned char rbuf[16]; - unsigned int rlen; - unsigned int i,numconf; - unsigned int j,numint; + unsigned char rbuf[256]; + unsigned int i,rlen; struct gemtag_handle *gh; + char info[64]; rlen=sizeof(rbuf); @@ -65,7 +165,7 @@ struct gemtag_handle *gemtag_open(void) { usb_find_busses(); usb_find_devices(); - gemtag=find_device(USB_VENDOR_GEMTAG, USB_DEVICE_X501); + gemtag=find_device(USB_VENDOR_GEMTAG,USB_DEVICE_X501); if(!gemtag) return NULL; gh=malloc(sizeof(struct gemtag_handle)); @@ -73,23 +173,42 @@ struct gemtag_handle *gemtag_open(void) { memset(gh,0,sizeof(struct gemtag_handle)); - numconf=gemtag->descriptor.bNumConfigurations; - printf("found gemtag, %u configurations\n",numconf); - for(i=0;iconfig[i].bNumInterfaces; - printf("config %u [nr %u] has %u interfaces\n", - i,gemtag->config[i].bConfigurationValue, - numint); - for(j=0;jconfig[i].interface[j].num_altsetting); - } - } - gh->handle=usb_open(gemtag); if(!gh->handle) goto out_free; + for(i=1;i<4;i++) { + memset(info,0,sizeof(info)); + usb_get_string_simple(gh->handle,i,info,sizeof(info)); + printf("%s ",info); + } + printf("opened successfully\n"); + + if(usb_set_configuration(gh->handle,1)) { + perror("set config"); + goto out_free; + } + printf("set configuration 1, "); + + if(usb_claim_interface(gh->handle,0)) { + perror("claim interface"); + goto out_free; + } + printf("claimed interface 0, "); + + // while(usb_set_altinterface(gh->handle,0)) + // printf("trying to set alt interface\n"); + // printf("activated alt setting 0\n"); + + gh->capabilities|=GEMTAG_CAP_CRC; + + gemtag_transcieve(gh,GEMTAG_CMD_GET_FW_VERSION, + NULL,0,rbuf,&rlen); + gemtag_transcieve(gh,GEMTAG_CMD_GET_SERIAL_NUMBER, + NULL,0,rbuf,&rlen); + + return gh; + out_free: free(gh); return NULL;