X-Git-Url: https://hackdaworld.org/gitweb/?p=rfid%2Flibrfid.git;a=blobdiff_plain;f=gemtag%2Fgemtag.c;fp=gemtag%2Fgemtag.c;h=9656f019614340014e29fde2c4ad931a744cb8f5;hp=28538c77098921f5a93d911ccb95852cb76159b8;hb=52d5cce98a304aff9e9e1f98e345432d7bf62a8d;hpb=c8c92a9a0bb6354e1740a838b3f51000b59f4e97 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);