xref: /linux/drivers/usb/serial/ch341.c (revision 66a0e2d579dbec5c676cfe446234ffebb267c564)
1 /*
2  * Copyright 2007, Frank A Kingswood <frank@kingswood-consulting.co.uk>
3  * Copyright 2007, Werner Cornelius <werner@cornelius-consult.de>
4  * Copyright 2009, Boris Hajduk <boris@hajduk.org>
5  *
6  * ch341.c implements a serial port driver for the Winchiphead CH341.
7  *
8  * The CH341 device can be used to implement an RS232 asynchronous
9  * serial port, an IEEE-1284 parallel printer port or a memory-like
10  * interface. In all cases the CH341 supports an I2C interface as well.
11  * This driver only supports the asynchronous serial interface.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License version
15  * 2 as published by the Free Software Foundation.
16  */
17 
18 #include <linux/kernel.h>
19 #include <linux/tty.h>
20 #include <linux/module.h>
21 #include <linux/slab.h>
22 #include <linux/usb.h>
23 #include <linux/usb/serial.h>
24 #include <linux/serial.h>
25 #include <asm/unaligned.h>
26 
27 #define DEFAULT_BAUD_RATE 9600
28 #define DEFAULT_TIMEOUT   1000
29 
30 /* flags for IO-Bits */
31 #define CH341_BIT_RTS (1 << 6)
32 #define CH341_BIT_DTR (1 << 5)
33 
34 /******************************/
35 /* interrupt pipe definitions */
36 /******************************/
37 /* always 4 interrupt bytes */
38 /* first irq byte normally 0x08 */
39 /* second irq byte base 0x7d + below */
40 /* third irq byte base 0x94 + below */
41 /* fourth irq byte normally 0xee */
42 
43 /* second interrupt byte */
44 #define CH341_MULT_STAT 0x04 /* multiple status since last interrupt event */
45 
46 /* status returned in third interrupt answer byte, inverted in data
47    from irq */
48 #define CH341_BIT_CTS 0x01
49 #define CH341_BIT_DSR 0x02
50 #define CH341_BIT_RI  0x04
51 #define CH341_BIT_DCD 0x08
52 #define CH341_BITS_MODEM_STAT 0x0f /* all bits */
53 
54 /*******************************/
55 /* baudrate calculation factor */
56 /*******************************/
57 #define CH341_BAUDBASE_FACTOR 1532620800
58 #define CH341_BAUDBASE_DIVMAX 3
59 
60 /* Break support - the information used to implement this was gleaned from
61  * the Net/FreeBSD uchcom.c driver by Takanori Watanabe.  Domo arigato.
62  */
63 
64 #define CH341_REQ_READ_VERSION 0x5F
65 #define CH341_REQ_WRITE_REG    0x9A
66 #define CH341_REQ_READ_REG     0x95
67 #define CH341_REQ_SERIAL_INIT  0xA1
68 #define CH341_REQ_MODEM_CTRL   0xA4
69 
70 #define CH341_REG_BREAK        0x05
71 #define CH341_REG_LCR          0x18
72 #define CH341_NBREAK_BITS      0x01
73 
74 #define CH341_LCR_ENABLE_RX    0x80
75 #define CH341_LCR_ENABLE_TX    0x40
76 #define CH341_LCR_MARK_SPACE   0x20
77 #define CH341_LCR_PAR_EVEN     0x10
78 #define CH341_LCR_ENABLE_PAR   0x08
79 #define CH341_LCR_STOP_BITS_2  0x04
80 #define CH341_LCR_CS8          0x03
81 #define CH341_LCR_CS7          0x02
82 #define CH341_LCR_CS6          0x01
83 #define CH341_LCR_CS5          0x00
84 
85 static const struct usb_device_id id_table[] = {
86 	{ USB_DEVICE(0x4348, 0x5523) },
87 	{ USB_DEVICE(0x1a86, 0x7523) },
88 	{ USB_DEVICE(0x1a86, 0x5523) },
89 	{ },
90 };
91 MODULE_DEVICE_TABLE(usb, id_table);
92 
93 struct ch341_private {
94 	spinlock_t lock; /* access lock */
95 	unsigned baud_rate; /* set baud rate */
96 	u8 line_control; /* set line control value RTS/DTR */
97 	u8 line_status; /* active status of modem control inputs */
98 	u8 lcr;
99 };
100 
101 static void ch341_set_termios(struct tty_struct *tty,
102 			      struct usb_serial_port *port,
103 			      struct ktermios *old_termios);
104 
105 static int ch341_control_out(struct usb_device *dev, u8 request,
106 			     u16 value, u16 index)
107 {
108 	int r;
109 
110 	dev_dbg(&dev->dev, "ch341_control_out(%02x,%02x,%04x,%04x)\n",
111 		USB_DIR_OUT|0x40, (int)request, (int)value, (int)index);
112 
113 	r = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request,
114 			    USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
115 			    value, index, NULL, 0, DEFAULT_TIMEOUT);
116 	if (r < 0)
117 		dev_err(&dev->dev, "failed to send control message: %d\n", r);
118 
119 	return r;
120 }
121 
122 static int ch341_control_in(struct usb_device *dev,
123 			    u8 request, u16 value, u16 index,
124 			    char *buf, unsigned bufsize)
125 {
126 	int r;
127 
128 	dev_dbg(&dev->dev, "ch341_control_in(%02x,%02x,%04x,%04x,%p,%u)\n",
129 		USB_DIR_IN|0x40, (int)request, (int)value, (int)index, buf,
130 		(int)bufsize);
131 
132 	r = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request,
133 			    USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
134 			    value, index, buf, bufsize, DEFAULT_TIMEOUT);
135 	if (r < bufsize) {
136 		if (r >= 0) {
137 			dev_err(&dev->dev,
138 				"short control message received (%d < %u)\n",
139 				r, bufsize);
140 			r = -EIO;
141 		}
142 
143 		dev_err(&dev->dev, "failed to receive control message: %d\n",
144 			r);
145 		return r;
146 	}
147 
148 	return 0;
149 }
150 
151 static int ch341_set_baudrate_lcr(struct usb_device *dev,
152 				  struct ch341_private *priv, u8 lcr)
153 {
154 	short a;
155 	int r;
156 	unsigned long factor;
157 	short divisor;
158 
159 	if (!priv->baud_rate)
160 		return -EINVAL;
161 	factor = (CH341_BAUDBASE_FACTOR / priv->baud_rate);
162 	divisor = CH341_BAUDBASE_DIVMAX;
163 
164 	while ((factor > 0xfff0) && divisor) {
165 		factor >>= 3;
166 		divisor--;
167 	}
168 
169 	if (factor > 0xfff0)
170 		return -EINVAL;
171 
172 	factor = 0x10000 - factor;
173 	a = (factor & 0xff00) | divisor;
174 
175 	/*
176 	 * CH341A buffers data until a full endpoint-size packet (32 bytes)
177 	 * has been received unless bit 7 is set.
178 	 */
179 	a |= BIT(7);
180 
181 	r = ch341_control_out(dev, CH341_REQ_WRITE_REG, 0x1312, a);
182 	if (r)
183 		return r;
184 
185 	r = ch341_control_out(dev, CH341_REQ_WRITE_REG, 0x2518, lcr);
186 	if (r)
187 		return r;
188 
189 	return r;
190 }
191 
192 static int ch341_set_handshake(struct usb_device *dev, u8 control)
193 {
194 	return ch341_control_out(dev, CH341_REQ_MODEM_CTRL, ~control, 0);
195 }
196 
197 static int ch341_get_status(struct usb_device *dev, struct ch341_private *priv)
198 {
199 	const unsigned int size = 2;
200 	char *buffer;
201 	int r;
202 	unsigned long flags;
203 
204 	buffer = kmalloc(size, GFP_KERNEL);
205 	if (!buffer)
206 		return -ENOMEM;
207 
208 	r = ch341_control_in(dev, CH341_REQ_READ_REG, 0x0706, 0, buffer, size);
209 	if (r < 0)
210 		goto out;
211 
212 	spin_lock_irqsave(&priv->lock, flags);
213 	priv->line_status = (~(*buffer)) & CH341_BITS_MODEM_STAT;
214 	spin_unlock_irqrestore(&priv->lock, flags);
215 
216 out:	kfree(buffer);
217 	return r;
218 }
219 
220 /* -------------------------------------------------------------------------- */
221 
222 static int ch341_configure(struct usb_device *dev, struct ch341_private *priv)
223 {
224 	const unsigned int size = 2;
225 	char *buffer;
226 	int r;
227 
228 	buffer = kmalloc(size, GFP_KERNEL);
229 	if (!buffer)
230 		return -ENOMEM;
231 
232 	/* expect two bytes 0x27 0x00 */
233 	r = ch341_control_in(dev, CH341_REQ_READ_VERSION, 0, 0, buffer, size);
234 	if (r < 0)
235 		goto out;
236 	dev_dbg(&dev->dev, "Chip version: 0x%02x\n", buffer[0]);
237 
238 	r = ch341_control_out(dev, CH341_REQ_SERIAL_INIT, 0, 0);
239 	if (r < 0)
240 		goto out;
241 
242 	/* expect two bytes 0x56 0x00 */
243 	r = ch341_control_in(dev, CH341_REQ_READ_REG, 0x2518, 0, buffer, size);
244 	if (r < 0)
245 		goto out;
246 
247 	r = ch341_control_out(dev, CH341_REQ_WRITE_REG, 0x2518, 0x0050);
248 	if (r < 0)
249 		goto out;
250 
251 	/* expect 0xff 0xee */
252 	r = ch341_get_status(dev, priv);
253 	if (r < 0)
254 		goto out;
255 
256 	r = ch341_set_baudrate_lcr(dev, priv, priv->lcr);
257 	if (r < 0)
258 		goto out;
259 
260 	r = ch341_set_handshake(dev, priv->line_control);
261 	if (r < 0)
262 		goto out;
263 
264 	/* expect 0x9f 0xee */
265 	r = ch341_get_status(dev, priv);
266 
267 out:	kfree(buffer);
268 	return r;
269 }
270 
271 static int ch341_port_probe(struct usb_serial_port *port)
272 {
273 	struct ch341_private *priv;
274 	int r;
275 
276 	priv = kzalloc(sizeof(struct ch341_private), GFP_KERNEL);
277 	if (!priv)
278 		return -ENOMEM;
279 
280 	spin_lock_init(&priv->lock);
281 	priv->baud_rate = DEFAULT_BAUD_RATE;
282 
283 	r = ch341_configure(port->serial->dev, priv);
284 	if (r < 0)
285 		goto error;
286 
287 	usb_set_serial_port_data(port, priv);
288 	return 0;
289 
290 error:	kfree(priv);
291 	return r;
292 }
293 
294 static int ch341_port_remove(struct usb_serial_port *port)
295 {
296 	struct ch341_private *priv;
297 
298 	priv = usb_get_serial_port_data(port);
299 	kfree(priv);
300 
301 	return 0;
302 }
303 
304 static int ch341_carrier_raised(struct usb_serial_port *port)
305 {
306 	struct ch341_private *priv = usb_get_serial_port_data(port);
307 	if (priv->line_status & CH341_BIT_DCD)
308 		return 1;
309 	return 0;
310 }
311 
312 static void ch341_dtr_rts(struct usb_serial_port *port, int on)
313 {
314 	struct ch341_private *priv = usb_get_serial_port_data(port);
315 	unsigned long flags;
316 
317 	/* drop DTR and RTS */
318 	spin_lock_irqsave(&priv->lock, flags);
319 	if (on)
320 		priv->line_control |= CH341_BIT_RTS | CH341_BIT_DTR;
321 	else
322 		priv->line_control &= ~(CH341_BIT_RTS | CH341_BIT_DTR);
323 	spin_unlock_irqrestore(&priv->lock, flags);
324 	ch341_set_handshake(port->serial->dev, priv->line_control);
325 }
326 
327 static void ch341_close(struct usb_serial_port *port)
328 {
329 	usb_serial_generic_close(port);
330 	usb_kill_urb(port->interrupt_in_urb);
331 }
332 
333 
334 /* open this device, set default parameters */
335 static int ch341_open(struct tty_struct *tty, struct usb_serial_port *port)
336 {
337 	struct usb_serial *serial = port->serial;
338 	struct ch341_private *priv = usb_get_serial_port_data(port);
339 	int r;
340 
341 	r = ch341_configure(serial->dev, priv);
342 	if (r)
343 		return r;
344 
345 	if (tty)
346 		ch341_set_termios(tty, port, NULL);
347 
348 	dev_dbg(&port->dev, "%s - submitting interrupt urb\n", __func__);
349 	r = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
350 	if (r) {
351 		dev_err(&port->dev, "%s - failed to submit interrupt urb: %d\n",
352 			__func__, r);
353 		return r;
354 	}
355 
356 	r = usb_serial_generic_open(tty, port);
357 	if (r)
358 		goto err_kill_interrupt_urb;
359 
360 	return 0;
361 
362 err_kill_interrupt_urb:
363 	usb_kill_urb(port->interrupt_in_urb);
364 
365 	return r;
366 }
367 
368 /* Old_termios contains the original termios settings and
369  * tty->termios contains the new setting to be used.
370  */
371 static void ch341_set_termios(struct tty_struct *tty,
372 		struct usb_serial_port *port, struct ktermios *old_termios)
373 {
374 	struct ch341_private *priv = usb_get_serial_port_data(port);
375 	unsigned baud_rate;
376 	unsigned long flags;
377 	unsigned char ctrl;
378 	int r;
379 
380 	/* redundant changes may cause the chip to lose bytes */
381 	if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
382 		return;
383 
384 	baud_rate = tty_get_baud_rate(tty);
385 
386 	ctrl = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX;
387 
388 	switch (C_CSIZE(tty)) {
389 	case CS5:
390 		ctrl |= CH341_LCR_CS5;
391 		break;
392 	case CS6:
393 		ctrl |= CH341_LCR_CS6;
394 		break;
395 	case CS7:
396 		ctrl |= CH341_LCR_CS7;
397 		break;
398 	case CS8:
399 		ctrl |= CH341_LCR_CS8;
400 		break;
401 	}
402 
403 	if (C_PARENB(tty)) {
404 		ctrl |= CH341_LCR_ENABLE_PAR;
405 		if (C_PARODD(tty) == 0)
406 			ctrl |= CH341_LCR_PAR_EVEN;
407 		if (C_CMSPAR(tty))
408 			ctrl |= CH341_LCR_MARK_SPACE;
409 	}
410 
411 	if (C_CSTOPB(tty))
412 		ctrl |= CH341_LCR_STOP_BITS_2;
413 
414 	if (baud_rate) {
415 		priv->baud_rate = baud_rate;
416 
417 		r = ch341_set_baudrate_lcr(port->serial->dev, priv, ctrl);
418 		if (r < 0 && old_termios) {
419 			priv->baud_rate = tty_termios_baud_rate(old_termios);
420 			tty_termios_copy_hw(&tty->termios, old_termios);
421 		} else if (r == 0) {
422 			priv->lcr = ctrl;
423 		}
424 	}
425 
426 	spin_lock_irqsave(&priv->lock, flags);
427 	if (C_BAUD(tty) == B0)
428 		priv->line_control &= ~(CH341_BIT_DTR | CH341_BIT_RTS);
429 	else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
430 		priv->line_control |= (CH341_BIT_DTR | CH341_BIT_RTS);
431 	spin_unlock_irqrestore(&priv->lock, flags);
432 
433 	ch341_set_handshake(port->serial->dev, priv->line_control);
434 }
435 
436 static void ch341_break_ctl(struct tty_struct *tty, int break_state)
437 {
438 	const uint16_t ch341_break_reg =
439 			((uint16_t) CH341_REG_LCR << 8) | CH341_REG_BREAK;
440 	struct usb_serial_port *port = tty->driver_data;
441 	int r;
442 	uint16_t reg_contents;
443 	uint8_t *break_reg;
444 
445 	break_reg = kmalloc(2, GFP_KERNEL);
446 	if (!break_reg)
447 		return;
448 
449 	r = ch341_control_in(port->serial->dev, CH341_REQ_READ_REG,
450 			ch341_break_reg, 0, break_reg, 2);
451 	if (r < 0) {
452 		dev_err(&port->dev, "%s - USB control read error (%d)\n",
453 				__func__, r);
454 		goto out;
455 	}
456 	dev_dbg(&port->dev, "%s - initial ch341 break register contents - reg1: %x, reg2: %x\n",
457 		__func__, break_reg[0], break_reg[1]);
458 	if (break_state != 0) {
459 		dev_dbg(&port->dev, "%s - Enter break state requested\n", __func__);
460 		break_reg[0] &= ~CH341_NBREAK_BITS;
461 		break_reg[1] &= ~CH341_LCR_ENABLE_TX;
462 	} else {
463 		dev_dbg(&port->dev, "%s - Leave break state requested\n", __func__);
464 		break_reg[0] |= CH341_NBREAK_BITS;
465 		break_reg[1] |= CH341_LCR_ENABLE_TX;
466 	}
467 	dev_dbg(&port->dev, "%s - New ch341 break register contents - reg1: %x, reg2: %x\n",
468 		__func__, break_reg[0], break_reg[1]);
469 	reg_contents = get_unaligned_le16(break_reg);
470 	r = ch341_control_out(port->serial->dev, CH341_REQ_WRITE_REG,
471 			ch341_break_reg, reg_contents);
472 	if (r < 0)
473 		dev_err(&port->dev, "%s - USB control write error (%d)\n",
474 				__func__, r);
475 out:
476 	kfree(break_reg);
477 }
478 
479 static int ch341_tiocmset(struct tty_struct *tty,
480 			  unsigned int set, unsigned int clear)
481 {
482 	struct usb_serial_port *port = tty->driver_data;
483 	struct ch341_private *priv = usb_get_serial_port_data(port);
484 	unsigned long flags;
485 	u8 control;
486 
487 	spin_lock_irqsave(&priv->lock, flags);
488 	if (set & TIOCM_RTS)
489 		priv->line_control |= CH341_BIT_RTS;
490 	if (set & TIOCM_DTR)
491 		priv->line_control |= CH341_BIT_DTR;
492 	if (clear & TIOCM_RTS)
493 		priv->line_control &= ~CH341_BIT_RTS;
494 	if (clear & TIOCM_DTR)
495 		priv->line_control &= ~CH341_BIT_DTR;
496 	control = priv->line_control;
497 	spin_unlock_irqrestore(&priv->lock, flags);
498 
499 	return ch341_set_handshake(port->serial->dev, control);
500 }
501 
502 static void ch341_update_line_status(struct usb_serial_port *port,
503 					unsigned char *data, size_t len)
504 {
505 	struct ch341_private *priv = usb_get_serial_port_data(port);
506 	struct tty_struct *tty;
507 	unsigned long flags;
508 	u8 status;
509 	u8 delta;
510 
511 	if (len < 4)
512 		return;
513 
514 	status = ~data[2] & CH341_BITS_MODEM_STAT;
515 
516 	spin_lock_irqsave(&priv->lock, flags);
517 	delta = status ^ priv->line_status;
518 	priv->line_status = status;
519 	spin_unlock_irqrestore(&priv->lock, flags);
520 
521 	if (data[1] & CH341_MULT_STAT)
522 		dev_dbg(&port->dev, "%s - multiple status change\n", __func__);
523 
524 	if (!delta)
525 		return;
526 
527 	if (delta & CH341_BIT_CTS)
528 		port->icount.cts++;
529 	if (delta & CH341_BIT_DSR)
530 		port->icount.dsr++;
531 	if (delta & CH341_BIT_RI)
532 		port->icount.rng++;
533 	if (delta & CH341_BIT_DCD) {
534 		port->icount.dcd++;
535 		tty = tty_port_tty_get(&port->port);
536 		if (tty) {
537 			usb_serial_handle_dcd_change(port, tty,
538 						status & CH341_BIT_DCD);
539 			tty_kref_put(tty);
540 		}
541 	}
542 
543 	wake_up_interruptible(&port->port.delta_msr_wait);
544 }
545 
546 static void ch341_read_int_callback(struct urb *urb)
547 {
548 	struct usb_serial_port *port = urb->context;
549 	unsigned char *data = urb->transfer_buffer;
550 	unsigned int len = urb->actual_length;
551 	int status;
552 
553 	switch (urb->status) {
554 	case 0:
555 		/* success */
556 		break;
557 	case -ECONNRESET:
558 	case -ENOENT:
559 	case -ESHUTDOWN:
560 		/* this urb is terminated, clean up */
561 		dev_dbg(&urb->dev->dev, "%s - urb shutting down: %d\n",
562 			__func__, urb->status);
563 		return;
564 	default:
565 		dev_dbg(&urb->dev->dev, "%s - nonzero urb status: %d\n",
566 			__func__, urb->status);
567 		goto exit;
568 	}
569 
570 	usb_serial_debug_data(&port->dev, __func__, len, data);
571 	ch341_update_line_status(port, data, len);
572 exit:
573 	status = usb_submit_urb(urb, GFP_ATOMIC);
574 	if (status) {
575 		dev_err(&urb->dev->dev, "%s - usb_submit_urb failed: %d\n",
576 			__func__, status);
577 	}
578 }
579 
580 static int ch341_tiocmget(struct tty_struct *tty)
581 {
582 	struct usb_serial_port *port = tty->driver_data;
583 	struct ch341_private *priv = usb_get_serial_port_data(port);
584 	unsigned long flags;
585 	u8 mcr;
586 	u8 status;
587 	unsigned int result;
588 
589 	spin_lock_irqsave(&priv->lock, flags);
590 	mcr = priv->line_control;
591 	status = priv->line_status;
592 	spin_unlock_irqrestore(&priv->lock, flags);
593 
594 	result = ((mcr & CH341_BIT_DTR)		? TIOCM_DTR : 0)
595 		  | ((mcr & CH341_BIT_RTS)	? TIOCM_RTS : 0)
596 		  | ((status & CH341_BIT_CTS)	? TIOCM_CTS : 0)
597 		  | ((status & CH341_BIT_DSR)	? TIOCM_DSR : 0)
598 		  | ((status & CH341_BIT_RI)	? TIOCM_RI  : 0)
599 		  | ((status & CH341_BIT_DCD)	? TIOCM_CD  : 0);
600 
601 	dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
602 
603 	return result;
604 }
605 
606 static int ch341_reset_resume(struct usb_serial *serial)
607 {
608 	struct usb_serial_port *port = serial->port[0];
609 	struct ch341_private *priv = usb_get_serial_port_data(port);
610 	int ret;
611 
612 	/* reconfigure ch341 serial port after bus-reset */
613 	ch341_configure(serial->dev, priv);
614 
615 	if (tty_port_initialized(&port->port)) {
616 		ret = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO);
617 		if (ret) {
618 			dev_err(&port->dev, "failed to submit interrupt urb: %d\n",
619 				ret);
620 			return ret;
621 		}
622 	}
623 
624 	return usb_serial_generic_resume(serial);
625 }
626 
627 static struct usb_serial_driver ch341_device = {
628 	.driver = {
629 		.owner	= THIS_MODULE,
630 		.name	= "ch341-uart",
631 	},
632 	.id_table          = id_table,
633 	.num_ports         = 1,
634 	.open              = ch341_open,
635 	.dtr_rts	   = ch341_dtr_rts,
636 	.carrier_raised	   = ch341_carrier_raised,
637 	.close             = ch341_close,
638 	.set_termios       = ch341_set_termios,
639 	.break_ctl         = ch341_break_ctl,
640 	.tiocmget          = ch341_tiocmget,
641 	.tiocmset          = ch341_tiocmset,
642 	.tiocmiwait        = usb_serial_generic_tiocmiwait,
643 	.read_int_callback = ch341_read_int_callback,
644 	.port_probe        = ch341_port_probe,
645 	.port_remove       = ch341_port_remove,
646 	.reset_resume      = ch341_reset_resume,
647 };
648 
649 static struct usb_serial_driver * const serial_drivers[] = {
650 	&ch341_device, NULL
651 };
652 
653 module_usb_serial_driver(serial_drivers, id_table);
654 
655 MODULE_LICENSE("GPL");
656