Example #1
0
File: usb_io.c Project: nben/puppy
/* 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;
}
Example #2
0
/* 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;
}