/* Receive a Topfield protocol packet. * Returns a negative number if the packet read failed for some reason. */ ssize_t get_tf_packet(int fd, struct tf_packet * packet) { __u8 *buf = (__u8 *) packet; int r; trace(3, fprintf(stderr, "get_tf_packet\n")); r = usb_bulk_read(fd, 0x82, buf, MAXIMUM_PACKET_SIZE, TF_PROTOCOL_TIMEOUT); if(r < 0) { fprintf(stderr, "USB read error: %s\n", strerror(errno)); return -1; } if(r < PACKET_HEAD_SIZE) { fprintf(stderr, "Short read. %d bytes\n", r); return -1; } /* Send SUCCESS as soon as we see a data transfer packet */ if(DATA_HDD_FILE_DATA == get_u32_raw(&packet->cmd)) { send_success(fd); } swap_in_packet(packet); { __u16 crc; __u16 calc_crc; __u16 len = get_u16(&packet->length); if(len < PACKET_HEAD_SIZE) { fprintf(stderr, "Invalid packet length %04x\n", len); return -1; } crc = get_u16(&packet->crc); calc_crc = get_crc(packet); /* Complain about CRC mismatch */ if(crc != calc_crc) { fprintf(stderr, "WARNING: Packet CRC %04x, expected %04x\n", crc, calc_crc); } } print_packet(packet, " IN<"); return r; }
/* Receive a Topfield protocol packet. * Returns a negative number if the packet read failed for some reason. */ int get_tf_packet2(libusb_device_handle* fd, struct tf_packet * packet, int timeout, int no_reply) { __u8 *buf = (__u8 *) packet; int r; trace(3, fprintf(stdout, "get_tf_packet\n")); r = usb_bulk_read(fd, 0x82, buf, MAXIMUM_PACKET_SIZE, timeout, no_reply); if(r < 0) { int e = errno; if (e!=0) { //fprintf(stdout, "USB read error: %s\n", strerror(e)); } return -1; } if(r < PACKET_HEAD_SIZE) { fprintf(stdout, "Short read. %d bytes\n", r); return -1; } /* Send SUCCESS as soon as we see a data transfer packet */ /* if(!no_reply && DATA_HDD_FILE_DATA == get_u32_raw(&packet->cmd)) { send_success(fd); } */ swap_in_packet(packet); { __u16 crc; __u16 calc_crc; __u16 len = get_u16(&packet->length); if(len < PACKET_HEAD_SIZE) { fprintf(stdout, "Invalid packet length %04x\n", len); return -1; } //crc = get_u16(&packet->crc); //calc_crc = get_crc(packet); /* Complain about CRC mismatch */ //if(crc != calc_crc) //{ // fprintf(stderr, "WARNING: Packet CRC %04x, expected %04x\n", crc, // calc_crc); //} } if (r>4) last_successful_communication=time(NULL); if (verbose>2) print_packet(packet, " IN<"); return r; }