[sane-devel] genesys841 progress? can i help?

Stéphane VOLTZ stefdev@modulonet.fr
Wed, 22 Jun 2005 07:08:06 +0200


--Boundary-00=_3IPuC0nLnOSvIuL
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Le Mardi 21 Juin 2005 02:58, Joe Lovick a =E9crit=A0:
> Hi just wondering what was happening about this particular chipset (i have
> a canon LIDE 35) and if their is anything i can do to help? i am a happy c
> coder but am new to SANE.
> if thier is something i can do to help even if it is just testing then
> please give me a shout.
> cheers
> 	joe

	Hello,

	I think that the first thing to do, is to have your scanner working under=
=20
windows and install usbsniff. So you'll be able to get logs from scanning=20
sessions. Then you have to analyze data to understand what's going on, and=
=20
try to make the backend do the same. At first, it may be hard, but once you=
=20
gained enough momentum, it is much easier.
	The raw logs can be simplified with awk scripts such as the one attached.=
=20
Once you identify things in log, you can write another awk script  that tur=
ns=20
data in a readable form. The motor.awk is a sample of what can be done. It=
=20
works on the file produced by parse1.awk. In the end, you have a script tha=
t=20
process logs through a bunch of awk files and produce a high level=20
representation of what is going on. The gl841_r17.pdf documents register us=
e=20
and values, and will help you in the process.
	Next, you have to write code that tries to do the same. When testing it, y=
ou=20
compare backend logs with decoded usb log, and fix differences until it=20
works.

Regards,
	Stef

--Boundary-00=_3IPuC0nLnOSvIuL
Content-Type: text/plain;
  charset="iso-8859-1";
  name="parse1.awk"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="parse1.awk"

# Hi! this script is a awk program script.
# Usage is: time awk -f parse1.awk usbsnoop.log > log1
#
# What does it do ?
# Extract usefull infos from sniffusb logs
#
# It works with sniffusb 1.8
# modified from Franck ZAGO's parse1.awk script which was
# loosely based on a script by Thomas SOUMARMON (soumarmt@hotmail.com).
#


BEGIN {

	action = ""; 

	buffer[0] = 0;

	rtype = 0;
	request = 0;
	value = 0;
	rindex = 0;

	ignore_urb = 0;

	last_int_urb = -1;
}

{
	if(NR==1)
		urb = strtonum($5)-1;

	if ($4 == "URB") {

# New URB
		this_urb = strtonum($5);

		if (this_urb == last_int_urb) {
# this interrupt URB is coming back
			ignore_urb = 1;
			next;
		}

		if (way == "down" && $7 == "down") {
# This URB is also an interrupt URB
			printf "URB %5d  skip\n", this_urb;
			ignore_urb = 1;
			last_int_urb = this_urb;
			next;
		}
		
		old_way = way;
		way = $7;

		if (way == "back") {
			if (urb != this_urb) {
				printf "got URB back %d instead of %d at line %d\n", this_urb, urb, NR;
				exit;
			}
		}
		else if (way == "down") {
			
			ignore_urb = 0;

			if (this_urb != urb+1 && this_urb != urb+2) {
				printf "expected URB down %d instead of %d at line %d\n", urb+1, this_urb, NR;
				exit;
			}

			if (last_int_urb != urb) {

				if (endpoint == "CONTROL") {
					printf "URB %5d  control  0x%02x 0x%02x 0x%02x 0x%02x len %5d", urb, rtype, request, value, rindex, buflen;
					if (direction == "OUT") {
						printf(" wrote ");
					} else {
						printf(" read  ");
					}

					for (i=0; i<buflen; i++)
						printf("0x%02x ", buffer[i]);
					printf("\n");
				}
				else if (endpoint == "BULK_IN") {
					printf "URB %5d  bulk_in  len %5d  read  ", urb, buflen;

					for (i=0; i<buflen; i++)
						printf("0x%02x ", buffer[i]);
					printf("\n");
				}
				else if (endpoint == "BULK_OUT") {
					printf "URB %5d  bulk_out len %5d  wrote ", urb, buflen;
				
					for (i=0; i<buflen; i++)
						printf("0x%02x ", buffer[i]);
					printf("\n");
				}
			}
		}
		else {
			printf("BAD line %d", NR);
			exit;
		}


		/* Next urb */
			 urb = strtonum($5);
	}

	if (ignore_urb) {
		next;
	}

	if ($1 == "PipeHandle") {
		if ($5 == "0x00000002]") endpoint = "BULK_OUT";
		else if ($5 == "0x00000081]") endpoint = "BULK_IN";
		else if ($5 == "0x00000083]") {
			printf "URB %5d  skip\n", urb;
			ignore_urb = 1;
			way = "back";		# do as if we got the answer
			last_int_urb = urb;
			next;
		}
		else endpoint = "CONTROL";
	}

	if ($1 == "TransferBufferLength") buflen=strtonum("0x"$3);
	if ($1 == "RequestTypeReservedBits") rtype=strtonum("0x"$3);
	if ($1 == "Request") request=strtonum("0x"$3);
	if ($1 == "Value") value=strtonum("0x"$3);
	if ($1 == "Index") {
		rindex=strtonum("0x"$3);
		get_data = 0;
	}

	if ($4 == "(USBD_TRANSFER_DIRECTION_IN,") direction="IN";
	if ($4 == "(USBD_TRANSFER_DIRECTION_OUT,") direction="OUT";

	if ($2 == "URB_FUNCTION_VENDOR_DEVICE:") action="vendor";
	if ($2 == "URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:") action="bulk";
	if ($2 == "URB_FUNCTION_CONTROL_TRANSFER:") action="control";

# Take care of the data
	if ($1 == "UrbLink") {
		get_data = 0;
		if (data_left != 0) {
			printf("error line %d (data left)\n", NR);
			exit;
		}
	}

	if (get_data) {
		if (data_left > 16)
			data_len = 16;
		else
			data_len = data_left;

		if (NF == (data_len+1)) {
			data_left = data_left - data_len;

			for (i=0; i<data_len; i++) {
				buffer[data_index] = strtonum("0x"$(i+2));
				data_index ++;
			}
		} else {
			printf("error line %d (invalid data)\n", NR);
			exit;
		}
	}

# We don't want to get data all the time.
	if ($1 == "TransferBufferMDL") {
		if ((direction == "OUT" && way == "down") ||
			(direction == "IN" && way == "back")) {
			
			get_data = 1;
			data_left = buflen;
			data_index = 0;
		}
	}
}



--Boundary-00=_3IPuC0nLnOSvIuL
Content-Type: text/plain;
  charset="iso-8859-1";
  name="motor.awk"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="motor.awk"

#URB   251  bulk_out len     2  wrote 0x0f 0x01 
BEGIN {
	ex=""
}
{
	if(($6=="wrote")&&($7=="0x0f")&&($8=="0x01")&&($5=="2")) 
	{
		print "startMotor()"
		getline
	}
	else
	{
		if(($6=="wrote")&&($7=="0x0f")&&($8=="0x00")&&($5=="2")) 
		{
			print "stopMotor()"
			getline
		}
		else
			print ex
	}
	ex=$0
}
END {
	print ex
}

--Boundary-00=_3IPuC0nLnOSvIuL--