Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6cf160c authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: (128 commits)
  USB: fix codingstyle issues in drivers/usb/core/*.c
  USB: fix codingstyle issues in drivers/usb/core/message.c
  USB: fix codingstyle issues in drivers/usb/core/hcd-pci.c
  USB: fix codingstyle issues in drivers/usb/core/devio.c
  USB: fix codingstyle issues in drivers/usb/core/devices.c
  USB: fix codingstyle issues in drivers/usb/core/*.h
  USB: fix codingstyle issues in include/linux/usb/
  USB: fix codingstyle issues in include/linux/usb.h
  USB: mark USB drivers as being GPL only
  USB: use a real vendor and product id for root hubs
  USB: mount options: fix usbfs
  USB: Fix usb_serial_driver structure for Kobil cardreader driver.
  usb: ehci should use u16 for isochronous intervals
  usb: ehci, remove false clear-reset path
  USB: Use menuconfig objects
  usb: ohci-sm501 driver
  usb: dma bounce buffer support
  USB: last abuses of intfdata in close for usb-serial drivers
  USB: kl5kusb105 don't flush to logically disconnected devices
  USB: oti6858: cleanup
  ...
parents ed50d6cb 2c044a48
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -52,3 +52,36 @@ Description:
		facility is inherently dangerous, it is disabled by default
		for all devices except hubs.  For more information, see
		Documentation/usb/persist.txt.

What:		/sys/bus/usb/device/.../power/connected_duration
Date:		January 2008
KernelVersion:	2.6.25
Contact:	Sarah Sharp <sarah.a.sharp@intel.com>
Description:
		If CONFIG_PM and CONFIG_USB_SUSPEND are enabled, then this file
		is present.  When read, it returns the total time (in msec)
		that the USB device has been connected to the machine.  This
		file is read-only.
Users:
		PowerTOP <power@bughost.org>
		http://www.lesswatts.org/projects/powertop/

What:		/sys/bus/usb/device/.../power/active_duration
Date:		January 2008
KernelVersion:	2.6.25
Contact:	Sarah Sharp <sarah.a.sharp@intel.com>
Description:
		If CONFIG_PM and CONFIG_USB_SUSPEND are enabled, then this file
		is present.  When read, it returns the total time (in msec)
		that the USB device has been active, i.e. not in a suspended
		state.  This file is read-only.

		Tools can use this file and the connected_duration file to
		compute the percentage of time that a device has been active.
		For example,
		echo $((100 * `cat active_duration` / `cat connected_duration`))
		will give an integer percentage.  Note that this does not
		account for counter wrap.
Users:
		PowerTOP <power@bughost.org>
		http://www.lesswatts.org/projects/powertop/
+0 −16
Original line number Diff line number Diff line
@@ -156,22 +156,6 @@ Who: Arjan van de Ven <arjan@linux.intel.com>

---------------------------

What:	USB driver API moves to EXPORT_SYMBOL_GPL
When:	February 2008
Files:	include/linux/usb.h, drivers/usb/core/driver.c
Why:	The USB subsystem has changed a lot over time, and it has been
	possible to create userspace USB drivers using usbfs/libusb/gadgetfs
	that operate as fast as the USB bus allows.  Because of this, the USB
	subsystem will not be allowing closed source kernel drivers to
	register with it, after this grace period is over.  If anyone needs
	any help in converting their closed source drivers over to use the
	userspace filesystems, please contact the
	linux-usb-devel@lists.sourceforge.net mailing list, and the developers
	there will be glad to help you out.
Who:	Greg Kroah-Hartman <gregkh@suse.de>

---------------------------

What:	vm_ops.nopage
When:	Soon, provided in-kernel callers have been converted
Why:	This interface is replaced by vm_ops.fault, but it has been around
+510 −0
Original line number Diff line number Diff line

                       Linux USB Printer Gadget Driver
                                 06/04/2007

              Copyright (C) 2007 Craig W. Nadler <craig@nadler.us>



GENERAL
=======

This driver may be used if you are writing printer firmware using Linux as
the embedded OS. This driver has nothing to do with using a printer with
your Linux host system.

You will need a USB device controller and a Linux driver for it that accepts
a gadget / "device class" driver using the Linux USB Gadget API. After the
USB device controller driver is loaded then load the printer gadget driver.
This will present a printer interface to the USB Host that your USB Device
port is connected to.

This driver is structured for printer firmware that runs in user mode. The
user mode printer firmware will read and write data from the kernel mode
printer gadget driver using a device file. The printer returns a printer status
byte when the USB HOST sends a device request to get the printer status.  The
user space firmware can read or write this status byte using a device file
/dev/g_printer . Both blocking and non-blocking read/write calls are supported.




HOWTO USE THIS DRIVER
=====================

To load the USB device controller driver and the printer gadget driver. The
following example uses the Netchip 2280 USB device controller driver:

modprobe net2280
modprobe g_printer


The follow command line parameter can be used when loading the printer gadget
(ex: modprobe g_printer idVendor=0x0525 idProduct=0xa4a8 ):

idVendor - This is the Vendor ID used in the device descriptor. The default is
	the Netchip vendor id 0x0525. YOU MUST CHANGE TO YOUR OWN VENDOR ID
	BEFORE RELEASING A PRODUCT. If you plan to release a product and don't
	already have a Vendor ID please see www.usb.org for details on how to
	get one.

idProduct - This is the Product ID used in the device descriptor. The default
	is 0xa4a8, you should change this to an ID that's not used by any of
	your other USB products if you have any. It would be a good idea to
	start numbering your products starting with say 0x0001.

bcdDevice - This is the version number of your product. It would be a good idea
	to put your firmware version here.

iManufacturer - A string containing the name of the Vendor.

iProduct - A string containing the Product Name.

iSerialNum - A string containing the Serial Number. This should be changed for
	each unit of your product.

iPNPstring -  The PNP ID string used for this printer. You will want to set
	either on the command line or hard code the PNP ID string used for
	your printer product.

qlen - The number of 8k buffers to use per endpoint. The default is 10, you
	should tune this for your product. You may also want to tune the
	size of each buffer for your product.




USING THE EXAMPLE CODE
======================

This example code talks to stdout, instead of a print engine.

To compile the test code below:

1) save it to a file called prn_example.c
2) compile the code with the follow command:
	 gcc prn_example.c -o prn_example



To read printer data from the host to stdout:

	# prn_example -read_data


To write printer data from a file (data_file) to the host:

	# cat data_file | prn_example -write_data


To get the current printer status for the gadget driver:

	# prn_example -get_status

	Printer status is:
	     Printer is NOT Selected
	     Paper is Out
	     Printer OK


To set printer to Selected/On-line:

	# prn_example -selected


To set printer to Not Selected/Off-line:

	# prn_example -not_selected


To set paper status to paper out:

	# prn_example -paper_out


To set paper status to paper loaded:

	# prn_example -paper_loaded


To set error status to printer OK:

	# prn_example -no_error


To set error status to ERROR:

	# prn_example -error




EXAMPLE CODE
============


#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <linux/poll.h>
#include <sys/ioctl.h>
#include <linux/usb/g_printer.h>

#define PRINTER_FILE			"/dev/g_printer"
#define BUF_SIZE			512


/*
 * 'usage()' - Show program usage.
 */

static void
usage(const char *option)		/* I - Option string or NULL */
{
	if (option) {
		fprintf(stderr,"prn_example: Unknown option \"%s\"!\n",
				option);
	}

	fputs("\n", stderr);
	fputs("Usage: prn_example -[options]\n", stderr);
	fputs("Options:\n", stderr);
	fputs("\n", stderr);
	fputs("-get_status    Get the current printer status.\n", stderr);
	fputs("-selected      Set the selected status to selected.\n", stderr);
	fputs("-not_selected  Set the selected status to NOT selected.\n",
			stderr);
	fputs("-error         Set the error status to error.\n", stderr);
	fputs("-no_error      Set the error status to NO error.\n", stderr);
	fputs("-paper_out     Set the paper status to paper out.\n", stderr);
	fputs("-paper_loaded  Set the paper status to paper loaded.\n",
			stderr);
	fputs("-read_data     Read printer data from driver.\n", stderr);
	fputs("-write_data    Write printer sata to driver.\n", stderr);
	fputs("-NB_read_data  (Non-Blocking) Read printer data from driver.\n",
			stderr);
	fputs("\n\n", stderr);

	exit(1);
}


static int
read_printer_data()
{
	struct pollfd	fd[1];

	/* Open device file for printer gadget. */
	fd[0].fd = open(PRINTER_FILE, O_RDWR);
	if (fd[0].fd < 0) {
		printf("Error %d opening %s\n", fd[0].fd, PRINTER_FILE);
		close(fd[0].fd);
		return(-1);
	}

	fd[0].events = POLLIN | POLLRDNORM;

	while (1) {
		static char buf[BUF_SIZE];
		int bytes_read;
		int retval;

		/* Wait for up to 1 second for data. */
		retval = poll(fd, 1, 1000);

		if (retval && (fd[0].revents & POLLRDNORM)) {

			/* Read data from printer gadget driver. */
			bytes_read = read(fd[0].fd, buf, BUF_SIZE);

			if (bytes_read < 0) {
				printf("Error %d reading from %s\n",
						fd[0].fd, PRINTER_FILE);
				close(fd[0].fd);
				return(-1);
			} else if (bytes_read > 0) {
				/* Write data to standard OUTPUT (stdout). */
				fwrite(buf, 1, bytes_read, stdout);
				fflush(stdout);
			}

		}

	}

	/* Close the device file. */
	close(fd[0].fd);

	return 0;
}


static int
write_printer_data()
{
	struct pollfd	fd[1];

	/* Open device file for printer gadget. */
	fd[0].fd = open (PRINTER_FILE, O_RDWR);
	if (fd[0].fd < 0) {
		printf("Error %d opening %s\n", fd[0].fd, PRINTER_FILE);
		close(fd[0].fd);
		return(-1);
	}

	fd[0].events = POLLOUT | POLLWRNORM;

	while (1) {
		int retval;
		static char buf[BUF_SIZE];
		/* Read data from standard INPUT (stdin). */
		int bytes_read = fread(buf, 1, BUF_SIZE, stdin);

		if (!bytes_read) {
			break;
		}

		while (bytes_read) {

			/* Wait for up to 1 second to sent data. */
			retval = poll(fd, 1, 1000);

			/* Write data to printer gadget driver. */
			if (retval && (fd[0].revents & POLLWRNORM)) {
				retval = write(fd[0].fd, buf, bytes_read);
				if (retval < 0) {
					printf("Error %d writing to %s\n",
							fd[0].fd,
							PRINTER_FILE);
					close(fd[0].fd);
					return(-1);
				} else {
					bytes_read -= retval;
				}

			}

		}

	}

	/* Wait until the data has been sent. */
	fsync(fd[0].fd);

	/* Close the device file. */
	close(fd[0].fd);

	return 0;
}


static int
read_NB_printer_data()
{
	int		fd;
	static char	buf[BUF_SIZE];
	int		bytes_read;

	/* Open device file for printer gadget. */
	fd = open(PRINTER_FILE, O_RDWR|O_NONBLOCK);
	if (fd < 0) {
		printf("Error %d opening %s\n", fd, PRINTER_FILE);
		close(fd);
		return(-1);
	}

	while (1) {
		/* Read data from printer gadget driver. */
		bytes_read = read(fd, buf, BUF_SIZE);
		if (bytes_read <= 0) {
			break;
		}

		/* Write data to standard OUTPUT (stdout). */
		fwrite(buf, 1, bytes_read, stdout);
		fflush(stdout);
	}

	/* Close the device file. */
	close(fd);

	return 0;
}


static int
get_printer_status()
{
	int	retval;
	int	fd;

	/* Open device file for printer gadget. */
	fd = open(PRINTER_FILE, O_RDWR);
	if (fd < 0) {
		printf("Error %d opening %s\n", fd, PRINTER_FILE);
		close(fd);
		return(-1);
	}

	/* Make the IOCTL call. */
	retval = ioctl(fd, GADGET_GET_PRINTER_STATUS);
	if (retval < 0) {
		fprintf(stderr, "ERROR: Failed to set printer status\n");
		return(-1);
	}

	/* Close the device file. */
	close(fd);

	return(retval);
}


static int
set_printer_status(unsigned char buf, int clear_printer_status_bit)
{
	int	retval;
	int	fd;

	retval = get_printer_status();
	if (retval < 0) {
		fprintf(stderr, "ERROR: Failed to get printer status\n");
		return(-1);
	}

	/* Open device file for printer gadget. */
	fd = open(PRINTER_FILE, O_RDWR);

	if (fd < 0) {
		printf("Error %d opening %s\n", fd, PRINTER_FILE);
		close(fd);
		return(-1);
	}

	if (clear_printer_status_bit) {
		retval &= ~buf;
	} else {
		retval |= buf;
	}

	/* Make the IOCTL call. */
	if (ioctl(fd, GADGET_SET_PRINTER_STATUS, (unsigned char)retval)) {
		fprintf(stderr, "ERROR: Failed to set printer status\n");
		return(-1);
	}

	/* Close the device file. */
	close(fd);

	return 0;
}


static int
display_printer_status()
{
	char	printer_status;

	printer_status = get_printer_status();
	if (printer_status < 0) {
		fprintf(stderr, "ERROR: Failed to get printer status\n");
		return(-1);
	}

	printf("Printer status is:\n");
	if (printer_status & PRINTER_SELECTED) {
		printf("     Printer is Selected\n");
	} else {
		printf("     Printer is NOT Selected\n");
	}
	if (printer_status & PRINTER_PAPER_EMPTY) {
		printf("     Paper is Out\n");
	} else {
		printf("     Paper is Loaded\n");
	}
	if (printer_status & PRINTER_NOT_ERROR) {
		printf("     Printer OK\n");
	} else {
		printf("     Printer ERROR\n");
	}

	return(0);
}


int
main(int  argc, char *argv[])
{
	int	i;		/* Looping var */
	int	retval = 0;

	/* No Args */
	if (argc == 1) {
		usage(0);
		exit(0);
	}

	for (i = 1; i < argc && !retval; i ++) {

		if (argv[i][0] != '-') {
			continue;
		}

		if (!strcmp(argv[i], "-get_status")) {
			if (display_printer_status()) {
				retval = 1;
			}

		} else if (!strcmp(argv[i], "-paper_loaded")) {
			if (set_printer_status(PRINTER_PAPER_EMPTY, 1)) {
				retval = 1;
			}

		} else if (!strcmp(argv[i], "-paper_out")) {
			if (set_printer_status(PRINTER_PAPER_EMPTY, 0)) {
				retval = 1;
			}

		} else if (!strcmp(argv[i], "-selected")) {
			if (set_printer_status(PRINTER_SELECTED, 0)) {
				retval = 1;
			}

		} else if (!strcmp(argv[i], "-not_selected")) {
			if (set_printer_status(PRINTER_SELECTED, 1)) {
				retval = 1;
			}

		} else if (!strcmp(argv[i], "-error")) {
			if (set_printer_status(PRINTER_NOT_ERROR, 1)) {
				retval = 1;
			}

		} else if (!strcmp(argv[i], "-no_error")) {
			if (set_printer_status(PRINTER_NOT_ERROR, 0)) {
				retval = 1;
			}

		} else if (!strcmp(argv[i], "-read_data")) {
			if (read_printer_data()) {
				retval = 1;
			}

		} else if (!strcmp(argv[i], "-write_data")) {
			if (write_printer_data()) {
				retval = 1;
			}

		} else if (!strcmp(argv[i], "-NB_read_data")) {
			if (read_NB_printer_data()) {
				retval = 1;
			}

		} else {
			usage(argv[i]);
			retval = 1;
		}
	}

	exit(retval);
}
+84 −0
Original line number Diff line number Diff line
Infinity Usb Unlimited Readme
-----------------------------

Hi all,


This module provide a serial interface to use your
IUU unit in phoenix mode. Loading this module will
bring a ttyUSB[0-x] interface. This driver must be
used by your favorite application to pilot the IUU

This driver is still in beta stage, so bugs can
occur and your system may freeze. As far I now,
I never had any problem with it, but I'm not a real
guru, so don't blame me if your system is unstable

You can plug more than one IUU. Every unit will
have his own device file(/dev/ttyUSB0,/dev/ttyUSB1,...)



How to tune the reader speed ?

 A few parameters can be used at load time
 To use parameters, just unload the module if it is
 already loaded and use modprobe iuu_phoenix param=value.
 In case of prebuilt module, use the command
 insmod iuu_phoenix param=value.

 Example:

 modprobe iuu_phoenix clockmode=3

 The parameters are:

 parm:           clockmode:1=3Mhz579,2=3Mhz680,3=6Mhz (int)
 parm:           boost:overclock boost percent 100 to 500 (int)
 parm:           cdmode:Card detect mode 0=none, 1=CD, 2=!CD, 3=DSR, 4=!DSR, 5=CTS, 6=!CTS, 7=RING, 8=!RING (int)
 parm:           xmas:xmas color enabled or not (bool)
 parm:           debug:Debug enabled or not (bool)

-  clockmode will provide 3 different base settings commonly adopted by
   different software:
 	1. 3Mhz579
	2. 3Mhz680
	3. 6Mhz

-  boost provide a way to overclock the reader ( my favorite :-)  )
   For example to have best performance than a simple clockmode=3, try this:

      modprobe boost=195

   This will put the reader in a base of 3Mhz579 but boosted a 195 % !
   the real clock will be now : 6979050 Hz ( 6Mhz979 ) and will increase
   the speed to a score 10 to 20% better than the simple clockmode=3 !!!


-  cdmode permit to setup the signal used to inform the userland ( ioctl answer )
   if the card is present or not. Eight signals are possible.

-  xmas is completely useless except for your eyes. This is one of my friend who was
   so sad to have a nice device like the iuu without seeing all color range available.
   So I have added this option to permit him to see a lot of color ( each activity change the color
   and the frequency randomly )

-  debug will produce a lot of debugging messages...


 Last notes:

 Don't worry about the serial settings, the serial emulation
 is an abstraction, so use any speed or parity setting will
 work. ( This will not change anything ).Later I will perhaps
 use this settings to deduce de boost but is that feature
 really necessary ?
 The autodetect feature used is the serial CD. If that doesn't
 work for your software, disable detection mechanism in it.


 Have fun !

 Alain Degreffe

 eczema(at)ecze.com
+2 −7
Original line number Diff line number Diff line
@@ -157,15 +157,10 @@ static void tosa_udc_command(int cmd)
	}
}

static int tosa_udc_is_connected(void)
{
	return ((GPLR(TOSA_GPIO_USB_IN) & GPIO_bit(TOSA_GPIO_USB_IN)) == 0);
}


static struct pxa2xx_udc_mach_info udc_info __initdata = {
	.udc_command		= tosa_udc_command,
	.udc_is_connected	= tosa_udc_is_connected,
	.gpio_vbus		= TOSA_GPIO_USB_IN,
	.gpio_vbus_inverted	= 1,
};

/*
Loading