/*
- * (C) 2006 by Frank Zirkelbach <hackbard@hackdaworld.org>
+ * (C) 2006 by Frank Zirkelbach <hackbard@hackdaworld.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
int hexdump(unsigned char *data,int len) {
int i;
- printf("dump: ");
for(i=0;i<len;i++) printf("%02x ",data[i]);
printf("\n");
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;
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 */
- 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);
+ crc=gemtag_calc_crc(txbuf,size);
+ *crcptr=(crc>>8)|(crc<<8);
size+=2;
}
/* usb write */
+ printf("(%02d) -> ",size);
hexdump(txbuf,size);
- ret=usb_bulk_write(gh->handle,0x02,txbuf,size,0);
- if(ret<0) {
- perror("usb bulk write");
+ ret=usb_interrupt_write(gh->handle,0x02,txbuf,size,0);
+ if(ret<=0) {
+ perror("usb interrupt 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");
+ ret=usb_interrupt_read(gh->handle,0x81,buf,32,0);
+ if(ret<=0) {
+ perror("usb interrupt read");
return ret;
}
- printf("received %d bytes\n",ret);
-
- if(rxhdr->seq!=txhdr->seq)
- puts("transmitted/recieved header are not equal");
+ 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;
+ }
- *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 char rbuf[256];
+ unsigned int i,rlen;
struct gemtag_handle *gh;
+ char info[64];
rlen=sizeof(rbuf);
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));
memset(gh,0,sizeof(struct gemtag_handle));
- numconf=gemtag->descriptor.bNumConfigurations;
- printf("found gemtag, %u configuration(s)\n",numconf);
- for(i=0;i<numconf;i++) {
- numint=gemtag->config[i].bNumInterfaces;
- printf("config %u [nr %u] has %u interface(s)\n",
- i,gemtag->config[i].bConfigurationValue,
- numint);
- for(j=0;j<numint;j++) {
- printf("config %u interface %u has %u altsetting(s)\n",
- i,j,gemtag->config[i].interface[j].num_altsetting);
- }
- }
-
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, ");
-/* if(usb_set_altinterface(gh->handle,1)) {
+ if(usb_set_altinterface(gh->handle,0))
perror("set alt interface");
- goto out_free;
- }
- puts("alt setting 1 selected");
-*/
+ printf("activated alt setting 0\n");
gh->capabilities|=GEMTAG_CAP_CRC;
- gemtag_transcieve(gh,0x22,NULL,0,rbuf,&rlen);
+ 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;