opticon.c 15.6 KB
Newer Older
1 2 3
/*
 * Opticon USB barcode to serial driver
 *
4
 * Copyright (C) 2011 Martin Jansen <martin.jansen@opticon.com>
5 6
 * Copyright (C) 2008 - 2009 Greg Kroah-Hartman <gregkh@suse.de>
 * Copyright (C) 2008 - 2009 Novell Inc.
7 8 9 10 11 12 13 14 15 16
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License version
 *	2 as published by the Free Software Foundation.
 */

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/tty.h>
#include <linux/tty_driver.h>
17
#include <linux/slab.h>
18
#include <linux/tty_flip.h>
19
#include <linux/serial.h>
20 21 22 23 24
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/usb/serial.h>
#include <linux/uaccess.h>

25 26 27 28 29 30 31 32 33 34
#define CONTROL_RTS			0x02
#define RESEND_CTS_STATE	0x03

/* max number of write urbs in flight */
#define URB_UPPER_LIMIT	8

/* This driver works for the Opticon 1D barcode reader
 * an examples of 1D barcode types are EAN, UPC, Code39, IATA etc.. */
#define DRIVER_DESC	"Opticon USB barcode to serial driver (1D)"

35
static const struct usb_device_id id_table[] = {
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
	{ USB_DEVICE(0x065a, 0x0009) },
	{ },
};
MODULE_DEVICE_TABLE(usb, id_table);

/* This structure holds all of the individual device information */
struct opticon_private {
	struct usb_device *udev;
	struct usb_serial *serial;
	struct usb_serial_port *port;
	unsigned char *bulk_in_buffer;
	struct urb *bulk_read_urb;
	int buffer_size;
	u8 bulk_address;
	spinlock_t lock;	/* protects the following flags */
	bool throttled;
	bool actually_throttled;
	bool rts;
54
	bool cts;
55
	int outstanding_urbs;
56 57
};

58

59 60

static void opticon_read_bulk_callback(struct urb *urb)
61 62 63 64 65 66 67 68
{
	struct opticon_private *priv = urb->context;
	unsigned char *data = urb->transfer_buffer;
	struct usb_serial_port *port = priv->port;
	int status = urb->status;
	struct tty_struct *tty;
	int result;
	int data_length;
69
	unsigned long flags;
70 71 72 73 74 75 76 77 78

	switch (status) {
	case 0:
		/* success */
		break;
	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		/* this urb is terminated, clean up */
79 80
		dev_dbg(&priv->udev->dev, "%s - urb shutting down with status: %d\n",
			__func__, status);
81 82
		return;
	default:
83 84
		dev_dbg(&priv->udev->dev, "%s - nonzero urb status received: %d\n",
			__func__, status);
85 86 87
		goto exit;
	}

88
	usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
89 90 91 92 93 94 95 96

	if (urb->actual_length > 2) {
		data_length = urb->actual_length - 2;

		/*
		 * Data from the device comes with a 2 byte header:
		 *
		 * <0x00><0x00>data...
97
		 *	This is real data to be sent to the tty layer
98
		 * <0x00><0x01)level
99 100
		 *	This is a CTS level change, the third byte is the CTS
		 *	value (0 for low, 1 for high).
101 102 103 104 105
		 */
		if ((data[0] == 0x00) && (data[1] == 0x00)) {
			/* real data, send it to the tty layer */
			tty = tty_port_tty_get(&port->port);
			if (tty) {
106 107
				tty_insert_flip_string(tty, data + 2,
						       data_length);
108
				tty_flip_buffer_push(tty);
109 110 111 112
				tty_kref_put(tty);
			}
		} else {
			if ((data[0] == 0x00) && (data[1] == 0x01)) {
113
				spin_lock_irqsave(&priv->lock, flags);
L
Lucas De Marchi 已提交
114
				/* CTS status information package */
115
				if (data[2] == 0x00)
116
					priv->cts = false;
117
				else
118 119
					priv->cts = true;
				spin_unlock_irqrestore(&priv->lock, flags);
120
			} else {
121 122 123 124
				dev_dbg(&priv->udev->dev,
					"Unknown data packet received from the device:"
					" %2x %2x\n",
					data[0], data[1]);
125 126 127 128
			}
		}
	} else {
		dev_dbg(&priv->udev->dev,
129
			"Improper amount of data received from the device, "
130 131 132 133 134 135 136 137 138 139 140 141
			"%d bytes", urb->actual_length);
	}

exit:
	spin_lock(&priv->lock);

	/* Continue trying to always read if we should */
	if (!priv->throttled) {
		usb_fill_bulk_urb(priv->bulk_read_urb, priv->udev,
				  usb_rcvbulkpipe(priv->udev,
						  priv->bulk_address),
				  priv->bulk_in_buffer, priv->buffer_size,
142
				  opticon_read_bulk_callback, priv);
143
		result = usb_submit_urb(priv->bulk_read_urb, GFP_ATOMIC);
144 145 146 147 148 149 150 151 152
		if (result)
			dev_err(&port->dev,
			    "%s - failed resubmitting read urb, error %d\n",
							__func__, result);
	} else
		priv->actually_throttled = true;
	spin_unlock(&priv->lock);
}

153 154 155 156 157
static int send_control_msg(struct usb_serial_port *port, u8 requesttype,
				u8 val)
{
	struct usb_serial *serial = port->serial;
	int retval;
J
Johan Hovold 已提交
158 159 160 161 162
	u8 *buffer;

	buffer = kzalloc(1, GFP_KERNEL);
	if (!buffer)
		return -ENOMEM;
163 164 165 166 167 168 169 170

	buffer[0] = val;
	/* Send the message to the vendor control endpoint
	 * of the connected device */
	retval = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
				requesttype,
				USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
				0, 0, buffer, 1, 0);
J
Johan Hovold 已提交
171
	kfree(buffer);
172 173 174 175

	return retval;
}

176
static int opticon_open(struct tty_struct *tty, struct usb_serial_port *port)
177 178 179 180 181 182 183 184 185
{
	struct opticon_private *priv = usb_get_serial_data(port->serial);
	unsigned long flags;
	int result = 0;

	spin_lock_irqsave(&priv->lock, flags);
	priv->throttled = false;
	priv->actually_throttled = false;
	priv->port = port;
186
	priv->rts = false;
187 188
	spin_unlock_irqrestore(&priv->lock, flags);

189 190 191 192
	/* Clear RTS line */
	send_control_msg(port, CONTROL_RTS, 0);

	/* Setup the read URB and start reading from the device */
193 194 195 196
	usb_fill_bulk_urb(priv->bulk_read_urb, priv->udev,
			  usb_rcvbulkpipe(priv->udev,
					  priv->bulk_address),
			  priv->bulk_in_buffer, priv->buffer_size,
197 198 199 200 201
			  opticon_read_bulk_callback, priv);

	/* clear the halt status of the enpoint */
	usb_clear_halt(priv->udev, priv->bulk_read_urb->pipe);

202 203 204 205 206
	result = usb_submit_urb(priv->bulk_read_urb, GFP_KERNEL);
	if (result)
		dev_err(&port->dev,
			"%s - failed resubmitting read urb, error %d\n",
			__func__, result);
207 208 209
	/* Request CTS line state, sometimes during opening the current
	 * CTS state can be missed. */
	send_control_msg(port, RESEND_CTS_STATE, 1);
210 211 212
	return result;
}

213
static void opticon_close(struct usb_serial_port *port)
214 215 216 217 218 219 220
{
	struct opticon_private *priv = usb_get_serial_data(port->serial);

	/* shutdown our urbs */
	usb_kill_urb(priv->bulk_read_urb);
}

221
static void opticon_write_control_callback(struct urb *urb)
222 223 224 225 226 227 228 229
{
	struct opticon_private *priv = urb->context;
	int status = urb->status;
	unsigned long flags;

	/* free up the transfer buffer, as usb_free_urb() does not do this */
	kfree(urb->transfer_buffer);

230 231 232
	/* setup packet may be set if we're using it for writing */
	kfree(urb->setup_packet);

233
	if (status)
234 235
		dev_dbg(&priv->udev->dev, "%s - nonzero write bulk status received: %d\n",
			__func__, status);
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252

	spin_lock_irqsave(&priv->lock, flags);
	--priv->outstanding_urbs;
	spin_unlock_irqrestore(&priv->lock, flags);

	usb_serial_port_softint(priv->port);
}

static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port,
			 const unsigned char *buf, int count)
{
	struct opticon_private *priv = usb_get_serial_data(port->serial);
	struct usb_serial *serial = port->serial;
	struct urb *urb;
	unsigned char *buffer;
	unsigned long flags;
	int status;
253
	struct usb_ctrlrequest *dr;
254 255 256 257

	spin_lock_irqsave(&priv->lock, flags);
	if (priv->outstanding_urbs > URB_UPPER_LIMIT) {
		spin_unlock_irqrestore(&priv->lock, flags);
258
		dev_dbg(&port->dev, "%s - write limit hit\n", __func__);
259 260 261 262 263 264 265 266 267
		return 0;
	}
	priv->outstanding_urbs++;
	spin_unlock_irqrestore(&priv->lock, flags);

	buffer = kmalloc(count, GFP_ATOMIC);
	if (!buffer) {
		dev_err(&port->dev, "out of memory\n");
		count = -ENOMEM;
268

269 270 271 272 273 274 275 276 277 278 279 280
		goto error_no_buffer;
	}

	urb = usb_alloc_urb(0, GFP_ATOMIC);
	if (!urb) {
		dev_err(&port->dev, "no more free urbs\n");
		count = -ENOMEM;
		goto error_no_urb;
	}

	memcpy(buffer, buf, count);

281
	usb_serial_debug_data(&port->dev, __func__, count, buffer);
282

283 284 285
	/* The conncected devices do not have a bulk write endpoint,
	 * to transmit data to de barcode device the control endpoint is used */
	dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO);
286 287 288 289 290
	if (!dr) {
		dev_err(&port->dev, "out of memory\n");
		count = -ENOMEM;
		goto error;
	}
291 292 293 294 295 296 297 298 299 300 301

	dr->bRequestType = USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT;
	dr->bRequest = 0x01;
	dr->wValue = 0;
	dr->wIndex = 0;
	dr->wLength = cpu_to_le16(count);

	usb_fill_control_urb(urb, serial->dev,
		usb_sndctrlpipe(serial->dev, 0),
		(unsigned char *)dr, buffer, count,
		opticon_write_control_callback, priv);
302 303 304 305 306

	/* send it down the pipe */
	status = usb_submit_urb(urb, GFP_ATOMIC);
	if (status) {
		dev_err(&port->dev,
307
		"%s - usb_submit_urb(write endpoint) failed status = %d\n",
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
							__func__, status);
		count = status;
		goto error;
	}

	/* we are done with this urb, so let the host driver
	 * really free it when it is finished with it */
	usb_free_urb(urb);

	return count;
error:
	usb_free_urb(urb);
error_no_urb:
	kfree(buffer);
error_no_buffer:
	spin_lock_irqsave(&priv->lock, flags);
	--priv->outstanding_urbs;
	spin_unlock_irqrestore(&priv->lock, flags);
	return count;
}

static int opticon_write_room(struct tty_struct *tty)
{
	struct usb_serial_port *port = tty->driver_data;
	struct opticon_private *priv = usb_get_serial_data(port->serial);
	unsigned long flags;

	/*
	 * We really can take almost anything the user throws at us
	 * but let's pick a nice big number to tell the tty
	 * layer that we have lots of free space, unless we don't.
	 */
	spin_lock_irqsave(&priv->lock, flags);
	if (priv->outstanding_urbs > URB_UPPER_LIMIT * 2 / 3) {
		spin_unlock_irqrestore(&priv->lock, flags);
343
		dev_dbg(&port->dev, "%s - write limit hit\n", __func__);
344 345 346 347 348 349 350
		return 0;
	}
	spin_unlock_irqrestore(&priv->lock, flags);

	return 2048;
}

351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
static void opticon_throttle(struct tty_struct *tty)
{
	struct usb_serial_port *port = tty->driver_data;
	struct opticon_private *priv = usb_get_serial_data(port->serial);
	unsigned long flags;

	spin_lock_irqsave(&priv->lock, flags);
	priv->throttled = true;
	spin_unlock_irqrestore(&priv->lock, flags);
}


static void opticon_unthrottle(struct tty_struct *tty)
{
	struct usb_serial_port *port = tty->driver_data;
	struct opticon_private *priv = usb_get_serial_data(port->serial);
	unsigned long flags;
368
	int result, was_throttled;
369 370 371

	spin_lock_irqsave(&priv->lock, flags);
	priv->throttled = false;
372
	was_throttled = priv->actually_throttled;
373 374 375
	priv->actually_throttled = false;
	spin_unlock_irqrestore(&priv->lock, flags);

376 377 378 379 380
	if (was_throttled) {
		result = usb_submit_urb(priv->bulk_read_urb, GFP_ATOMIC);
		if (result)
			dev_err(&port->dev,
				"%s - failed submitting read urb, error %d\n",
381
							__func__, result);
382
	}
383 384
}

385
static int opticon_tiocmget(struct tty_struct *tty)
386 387 388 389 390 391 392 393
{
	struct usb_serial_port *port = tty->driver_data;
	struct opticon_private *priv = usb_get_serial_data(port->serial);
	unsigned long flags;
	int result = 0;

	spin_lock_irqsave(&priv->lock, flags);
	if (priv->rts)
394 395 396
		result |= TIOCM_RTS;
	if (priv->cts)
		result |= TIOCM_CTS;
397 398
	spin_unlock_irqrestore(&priv->lock, flags);

399
	dev_dbg(&port->dev, "%s - %x\n", __func__, result);
400 401 402
	return result;
}

403
static int opticon_tiocmset(struct tty_struct *tty,
404 405 406
			   unsigned int set, unsigned int clear)
{
	struct usb_serial_port *port = tty->driver_data;
407
	struct usb_serial *serial = port->serial;
408 409 410 411
	struct opticon_private *priv = usb_get_serial_data(port->serial);
	unsigned long flags;
	bool rts;
	bool changed = false;
412
	int ret;
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428

	/* We only support RTS so we only handle that */
	spin_lock_irqsave(&priv->lock, flags);

	rts = priv->rts;
	if (set & TIOCM_RTS)
		priv->rts = true;
	if (clear & TIOCM_RTS)
		priv->rts = false;
	changed = rts ^ priv->rts;
	spin_unlock_irqrestore(&priv->lock, flags);

	if (!changed)
		return 0;

	/* Send the new RTS state to the connected device */
429 430 431 432 433 434 435 436
	mutex_lock(&serial->disc_mutex);
	if (!serial->disconnected)
		ret = send_control_msg(port, CONTROL_RTS, !rts);
	else
		ret = -ENODEV;
	mutex_unlock(&serial->disc_mutex);

	return ret;
437 438
}

439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
static int get_serial_info(struct opticon_private *priv,
			   struct serial_struct __user *serial)
{
	struct serial_struct tmp;

	if (!serial)
		return -EFAULT;

	memset(&tmp, 0x00, sizeof(tmp));

	/* fake emulate a 16550 uart to make userspace code happy */
	tmp.type		= PORT_16550A;
	tmp.line		= priv->serial->minor;
	tmp.port		= 0;
	tmp.irq			= 0;
	tmp.flags		= ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
	tmp.xmit_fifo_size	= 1024;
	tmp.baud_base		= 9600;
	tmp.close_delay		= 5*HZ;
	tmp.closing_wait	= 30*HZ;

	if (copy_to_user(serial, &tmp, sizeof(*serial)))
		return -EFAULT;
	return 0;
}

465
static int opticon_ioctl(struct tty_struct *tty,
466 467 468 469 470
			 unsigned int cmd, unsigned long arg)
{
	struct usb_serial_port *port = tty->driver_data;
	struct opticon_private *priv = usb_get_serial_data(port->serial);

471
	dev_dbg(&port->dev, "%s - port %d, cmd = 0x%x\n", __func__, port->number, cmd);
472 473 474 475 476 477 478 479 480 481

	switch (cmd) {
	case TIOCGSERIAL:
		return get_serial_info(priv,
				       (struct serial_struct __user *)arg);
	}

	return -ENOIOCTLCMD;
}

482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
static int opticon_startup(struct usb_serial *serial)
{
	struct opticon_private *priv;
	struct usb_host_interface *intf;
	int i;
	int retval = -ENOMEM;
	bool bulk_in_found = false;

	/* create our private serial structure */
	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
	if (priv == NULL) {
		dev_err(&serial->dev->dev, "%s - Out of memory\n", __func__);
		return -ENOMEM;
	}
	spin_lock_init(&priv->lock);
	priv->serial = serial;
	priv->port = serial->port[0];
	priv->udev = serial->dev;
500
	priv->outstanding_urbs = 0;	/* Init the outstanding urbs */
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516

	/* find our bulk endpoint */
	intf = serial->interface->altsetting;
	for (i = 0; i < intf->desc.bNumEndpoints; ++i) {
		struct usb_endpoint_descriptor *endpoint;

		endpoint = &intf->endpoint[i].desc;
		if (!usb_endpoint_is_bulk_in(endpoint))
			continue;

		priv->bulk_read_urb = usb_alloc_urb(0, GFP_KERNEL);
		if (!priv->bulk_read_urb) {
			dev_err(&priv->udev->dev, "out of memory\n");
			goto error;
		}

517
		priv->buffer_size = usb_endpoint_maxp(endpoint) * 2;
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545
		priv->bulk_in_buffer = kmalloc(priv->buffer_size, GFP_KERNEL);
		if (!priv->bulk_in_buffer) {
			dev_err(&priv->udev->dev, "out of memory\n");
			goto error;
		}

		priv->bulk_address = endpoint->bEndpointAddress;

		bulk_in_found = true;
		break;
		}

	if (!bulk_in_found) {
		dev_err(&priv->udev->dev,
			"Error - the proper endpoints were not found!\n");
		goto error;
	}

	usb_set_serial_data(serial, priv);
	return 0;

error:
	usb_free_urb(priv->bulk_read_urb);
	kfree(priv->bulk_in_buffer);
	kfree(priv);
	return retval;
}

546
static void opticon_disconnect(struct usb_serial *serial)
547 548 549 550 551
{
	struct opticon_private *priv = usb_get_serial_data(serial);

	usb_kill_urb(priv->bulk_read_urb);
	usb_free_urb(priv->bulk_read_urb);
552 553 554 555 556 557
}

static void opticon_release(struct usb_serial *serial)
{
	struct opticon_private *priv = usb_get_serial_data(serial);

558 559 560 561
	kfree(priv->bulk_in_buffer);
	kfree(priv);
}

562
static int opticon_suspend(struct usb_serial *serial, pm_message_t message)
563 564 565 566 567 568 569
{
	struct opticon_private *priv = usb_get_serial_data(serial);

	usb_kill_urb(priv->bulk_read_urb);
	return 0;
}

570
static int opticon_resume(struct usb_serial *serial)
571 572 573 574 575
{
	struct opticon_private *priv = usb_get_serial_data(serial);
	struct usb_serial_port *port = serial->port[0];
	int result;

A
Alan Cox 已提交
576
	mutex_lock(&port->port.mutex);
A
Alan Cox 已提交
577 578
	/* This is protected by the port mutex against close/open */
	if (test_bit(ASYNCB_INITIALIZED, &port->port.flags))
579 580 581
		result = usb_submit_urb(priv->bulk_read_urb, GFP_NOIO);
	else
		result = 0;
A
Alan Cox 已提交
582
	mutex_unlock(&port->port.mutex);
583 584
	return result;
}
585 586 587 588 589 590 591 592 593 594 595

static struct usb_serial_driver opticon_device = {
	.driver = {
		.owner =	THIS_MODULE,
		.name =		"opticon",
	},
	.id_table =		id_table,
	.num_ports =		1,
	.attach =		opticon_startup,
	.open =			opticon_open,
	.close =		opticon_close,
596 597
	.write =		opticon_write,
	.write_room = 		opticon_write_room,
598 599
	.disconnect =		opticon_disconnect,
	.release =		opticon_release,
600 601
	.throttle = 		opticon_throttle,
	.unthrottle =		opticon_unthrottle,
602 603
	.ioctl =		opticon_ioctl,
	.tiocmget =		opticon_tiocmget,
604
	.tiocmset =		opticon_tiocmset,
605 606
	.suspend = 		opticon_suspend,
	.resume =		opticon_resume,
607 608
};

609 610 611 612
static struct usb_serial_driver * const serial_drivers[] = {
	&opticon_device, NULL
};

613
module_usb_serial_driver(serial_drivers, id_table);
614

615
MODULE_DESCRIPTION(DRIVER_DESC);
616
MODULE_LICENSE("GPL");