From 3ca43b53eb696fea7ea7f6a14ed4e1bfa7b01ac7 Mon Sep 17 00:00:00 2001 From: hackbard Date: Wed, 1 Mar 2006 17:19:58 +0000 Subject: [PATCH] some playing around ... --- gemtag/Makefile | 3 ++ gemtag/gemtag.c | 109 +++++++++++++++++++++++------------------------- gemtag/gemtag.h | 4 ++ 3 files changed, 60 insertions(+), 56 deletions(-) diff --git a/gemtag/Makefile b/gemtag/Makefile index c7866af..5e5a9d3 100644 --- a/gemtag/Makefile +++ b/gemtag/Makefile @@ -1,3 +1,6 @@ +CC=gcc +CFLAGS=-Wall + all: gemtag gemtag: gemtag.o diff --git a/gemtag/gemtag.c b/gemtag/gemtag.c index 7a2e8ce..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 @@ -83,7 +83,8 @@ int gemtag_transcieve(struct gemtag_handle *gh,unsigned char cmd, unsigned char rxbuf[256]; struct gemtag_cmd_hdr *txhdr; struct gemtag_cmd_hdr *rxhdr; - u_int16_t *crcptr; + unsigned char buf[32]; + u_int16_t crc,*crcptr; int ret,size; txhdr=(struct gemtag_cmd_hdr *)txbuf; @@ -92,63 +93,71 @@ int gemtag_transcieve(struct gemtag_handle *gh,unsigned char cmd, txhdr->start=0xa5; txhdr->seq=++(gh->seq); txhdr->cmd=cmd; - txhdr->len=htons(tx_len); + 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) { - size+=tx_len; crcptr=(u_int16_t *)(txbuf+size); - *crcptr=htons(gemtag_calc_crc(txbuf,size)); + crc=gemtag_calc_crc(txbuf,size); + *crcptr=(crc>>8)|(crc<<8); size+=2; } /* usb write */ - printf("-> "); + printf("(%02d) -> ",size); hexdump(txbuf,size); - if(usb_clear_halt(gh->handle,0x02)) - perror("clear halt (out)"); - ret=usb_bulk_write(gh->handle,0x02,txbuf,size,0); + ret=usb_interrupt_write(gh->handle,0x02,txbuf,size,0); if(ret<=0) { - perror("usb bulk write"); + perror("usb interrupt write"); return ret; } /* usb read */ - if(usb_clear_halt(gh->handle,0x81)) - perror("clear halt (in)"); - ret=usb_bulk_read(gh->handle,0x81,rxbuf,sizeof(rxbuf),0); - size=ret; + ret=usb_interrupt_read(gh->handle,0x81,buf,32,0); if(ret<=0) { - perror("usb bulk read"); + perror("usb interrupt read"); return ret; } - printf("<- "); + memcpy(rxbuf,buf,ret); + printf("(%02d) <- ",ret); hexdump(rxbuf,ret); - - if(rxhdr->seq!=txhdr->seq) - puts("transmitted/recieved sequence number do not match"); + + *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; + } - *rx_len=ntohs(rxhdr->len); - memcpy(rx,rxbuf+sizeof(struct gemtag_cmd_hdr), - ret-sizeof(struct gemtag_cmd_hdr)+2); - hexdump(rxbuf,ret+2); + 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 int k,numalt; + unsigned char rbuf[256]; + unsigned int i,rlen; struct gemtag_handle *gh; + char info[64]; rlen=sizeof(rbuf); @@ -156,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)); @@ -164,51 +173,39 @@ struct gemtag_handle *gemtag_open(void) { memset(gh,0,sizeof(struct gemtag_handle)); - numconf=gemtag->descriptor.bNumConfigurations; - printf("found gemtag (%02x/%02x), %u configuration(s)\n", - gemtag->descriptor.idVendor, - gemtag->descriptor.idProduct,numconf); - for(i=0;iconfig[i].bNumInterfaces; - 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; - printf(" interface %u has %u altsetting(s): ", - j,numalt); - for(k=0;kconfig[i].interface[j].altsetting[k].bAlternateSetting); - printf("\n"); - } - } - gh->handle=usb_open(gemtag); if(!gh->handle) goto out_free; - puts("usb_open successfull"); + + 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; } - puts("configuration 1 successfully set"); + printf("set configuration 1, "); if(usb_claim_interface(gh->handle,0)) { perror("claim interface"); goto out_free; } - puts("interface 0 claimed"); + printf("claimed interface 0, "); - while(usb_set_altinterface(gh->handle,0)) - printf("trying to set alt interface\n"); - puts("alt setting 0 selected"); + // 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; diff --git a/gemtag/gemtag.h b/gemtag/gemtag.h index f832100..93aaa60 100644 --- a/gemtag/gemtag.h +++ b/gemtag/gemtag.h @@ -42,5 +42,9 @@ struct gemtag_cmd_hdr { #define GEMTAG_CMD_GET_RIC_VERSION 0x64 #define GEMTAG_CMD_PCD_SET_TMO 0x27 #define GEMTAG_CMD_SET_CPU_TIMEOUT 0x88 +#define GEMTAG_CMD_TEST 0xfe + +#define BAD_CRC 0x01 +#define SEQ_MISMATCH 0x02 #endif -- 2.39.2