2 * Infinity Unlimited USB Phoenix driver
4 * Copyright (C) 2007 Alain Degreffe (eczema@ecze.com)
6 * Original code taken from iuutool (Copyright (C) 2006 Juan Carlos Borrás)
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * And tested with help of WB Electronics
16 #include <linux/kernel.h>
17 #include <linux/errno.h>
18 #include <linux/init.h>
19 #include <linux/slab.h>
20 #include <linux/tty.h>
21 #include <linux/tty_driver.h>
22 #include <linux/tty_flip.h>
23 #include <linux/serial.h>
24 #include <linux/module.h>
25 #include <linux/moduleparam.h>
26 #include <linux/spinlock.h>
27 #include <linux/uaccess.h>
28 #include <linux/usb.h>
29 #include <linux/usb/serial.h>
30 #include "iuu_phoenix.h"
31 #include <linux/random.h>
34 #ifdef CONFIG_USB_SERIAL_DEBUG
43 #define DRIVER_VERSION "v0.5"
44 #define DRIVER_DESC "Infinity USB Unlimited Phoenix driver"
46 static struct usb_device_id id_table
[] = {
47 {USB_DEVICE(IUU_USB_VENDOR_ID
, IUU_USB_PRODUCT_ID
)},
48 {} /* Terminating entry */
50 MODULE_DEVICE_TABLE(usb
, id_table
);
52 static struct usb_driver iuu_driver
= {
53 .name
= "iuu_phoenix",
54 .probe
= usb_serial_probe
,
55 .disconnect
= usb_serial_disconnect
,
61 static int boost
= 100;
62 static int clockmode
= 1;
63 static int cdmode
= 1;
64 static int iuu_cardin
;
65 static int iuu_cardout
;
68 static void read_rxcmd_callback(struct urb
*urb
);
71 spinlock_t lock
; /* store irq state */
72 wait_queue_head_t delta_msr_wait
;
75 u8 termios_initialized
;
76 int tiostatus
; /* store IUART SIGNAL for tiocmget call */
77 u8 reset
; /* if 1 reset is needed */
78 int poll
; /* number of poll */
79 u8
*writebuf
; /* buffer for writing to device */
80 int writelen
; /* num of byte to write to device */
81 u8
*buf
; /* used for initialize speed */
82 u8
*dbgbuf
; /* debug buffer */
87 static void iuu_free_buf(struct iuu_private
*priv
)
91 kfree(priv
->writebuf
);
94 static int iuu_alloc_buf(struct iuu_private
*priv
)
96 priv
->buf
= kzalloc(256, GFP_KERNEL
);
97 priv
->dbgbuf
= kzalloc(256, GFP_KERNEL
);
98 priv
->writebuf
= kzalloc(256, GFP_KERNEL
);
99 if (!priv
->buf
|| !priv
->dbgbuf
|| !priv
->writebuf
) {
101 dbg("%s problem allocation buffer", __func__
);
104 dbg("%s - Privates buffers allocation success", __func__
);
108 static int iuu_startup(struct usb_serial
*serial
)
110 struct iuu_private
*priv
;
111 priv
= kzalloc(sizeof(struct iuu_private
), GFP_KERNEL
);
112 dbg("%s- priv allocation success", __func__
);
115 if (iuu_alloc_buf(priv
)) {
119 spin_lock_init(&priv
->lock
);
120 init_waitqueue_head(&priv
->delta_msr_wait
);
121 usb_set_serial_port_data(serial
->port
[0], priv
);
125 /* Shutdown function */
126 static void iuu_shutdown(struct usb_serial
*serial
)
128 struct usb_serial_port
*port
= serial
->port
[0];
129 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
137 dbg("%s - I will free all", __func__
);
138 usb_set_serial_port_data(port
, NULL
);
140 dbg("%s - priv is not anymore in port structure", __func__
);
143 dbg("%s priv is now kfree", __func__
);
147 static int iuu_tiocmset(struct tty_struct
*tty
, struct file
*file
,
148 unsigned int set
, unsigned int clear
)
150 struct usb_serial_port
*port
= tty
->driver_data
;
151 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
154 /* FIXME: locking on tiomstatus */
155 dbg("%s (%d) msg : SET = 0x%04x, CLEAR = 0x%04x ", __func__
,
156 port
->number
, set
, clear
);
158 spin_lock_irqsave(&priv
->lock
, flags
);
160 priv
->tiostatus
= TIOCM_RTS
;
162 if (!(set
& TIOCM_RTS
) && priv
->tiostatus
== TIOCM_RTS
) {
163 dbg("%s TIOCMSET RESET called !!!", __func__
);
166 spin_unlock_irqrestore(&priv
->lock
, flags
);
170 /* This is used to provide a carrier detect mechanism
171 * When a card is present, the response is 0x00
172 * When no card , the reader respond with TIOCM_CD
173 * This is known as CD autodetect mechanism
175 static int iuu_tiocmget(struct tty_struct
*tty
, struct file
*file
)
177 struct usb_serial_port
*port
= tty
->driver_data
;
178 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
182 spin_lock_irqsave(&priv
->lock
, flags
);
183 rc
= priv
->tiostatus
;
184 spin_unlock_irqrestore(&priv
->lock
, flags
);
189 static void iuu_rxcmd(struct urb
*urb
)
191 struct usb_serial_port
*port
= urb
->context
;
193 int status
= urb
->status
;
195 dbg("%s - enter", __func__
);
198 dbg("%s - status = %d", __func__
, status
);
204 memset(port
->write_urb
->transfer_buffer
, IUU_UART_RX
, 1);
205 usb_fill_bulk_urb(port
->write_urb
, port
->serial
->dev
,
206 usb_sndbulkpipe(port
->serial
->dev
,
207 port
->bulk_out_endpointAddress
),
208 port
->write_urb
->transfer_buffer
, 1,
209 read_rxcmd_callback
, port
);
210 result
= usb_submit_urb(port
->write_urb
, GFP_ATOMIC
);
213 static int iuu_reset(struct usb_serial_port
*port
, u8 wt
)
215 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
217 char *buf_ptr
= port
->write_urb
->transfer_buffer
;
218 dbg("%s - enter", __func__
);
220 /* Prepare the reset sequence */
222 *buf_ptr
++ = IUU_RST_SET
;
223 *buf_ptr
++ = IUU_DELAY_MS
;
225 *buf_ptr
= IUU_RST_CLEAR
;
227 /* send the sequence */
229 usb_fill_bulk_urb(port
->write_urb
,
231 usb_sndbulkpipe(port
->serial
->dev
,
232 port
->bulk_out_endpointAddress
),
233 port
->write_urb
->transfer_buffer
, 4, iuu_rxcmd
, port
);
234 result
= usb_submit_urb(port
->write_urb
, GFP_ATOMIC
);
245 static void iuu_update_status_callback(struct urb
*urb
)
247 struct usb_serial_port
*port
= urb
->context
;
248 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
250 int status
= urb
->status
;
252 dbg("%s - enter", __func__
);
255 dbg("%s - status = %d", __func__
, status
);
260 st
= urb
->transfer_buffer
;
261 dbg("%s - enter", __func__
);
262 if (urb
->actual_length
== 1) {
265 priv
->tiostatus
= iuu_cardout
;
268 priv
->tiostatus
= iuu_cardin
;
271 priv
->tiostatus
= iuu_cardin
;
277 static void iuu_status_callback(struct urb
*urb
)
279 struct usb_serial_port
*port
= urb
->context
;
281 int status
= urb
->status
;
283 dbg("%s - status = %d", __func__
, status
);
284 usb_fill_bulk_urb(port
->read_urb
, port
->serial
->dev
,
285 usb_rcvbulkpipe(port
->serial
->dev
,
286 port
->bulk_in_endpointAddress
),
287 port
->read_urb
->transfer_buffer
, 256,
288 iuu_update_status_callback
, port
);
289 result
= usb_submit_urb(port
->read_urb
, GFP_ATOMIC
);
292 static int iuu_status(struct usb_serial_port
*port
)
296 dbg("%s - enter", __func__
);
298 memset(port
->write_urb
->transfer_buffer
, IUU_GET_STATE_REGISTER
, 1);
299 usb_fill_bulk_urb(port
->write_urb
, port
->serial
->dev
,
300 usb_sndbulkpipe(port
->serial
->dev
,
301 port
->bulk_out_endpointAddress
),
302 port
->write_urb
->transfer_buffer
, 1,
303 iuu_status_callback
, port
);
304 result
= usb_submit_urb(port
->write_urb
, GFP_ATOMIC
);
309 static int bulk_immediate(struct usb_serial_port
*port
, u8
*buf
, u8 count
)
312 struct usb_serial
*serial
= port
->serial
;
315 dbg("%s - enter", __func__
);
317 /* send the data out the bulk port */
320 usb_bulk_msg(serial
->dev
,
321 usb_sndbulkpipe(serial
->dev
,
322 port
->bulk_out_endpointAddress
), buf
,
323 count
, &actual
, HZ
* 1);
325 if (status
!= IUU_OPERATION_OK
)
326 dbg("%s - error = %2x", __func__
, status
);
328 dbg("%s - write OK !", __func__
);
332 static int read_immediate(struct usb_serial_port
*port
, u8
*buf
, u8 count
)
335 struct usb_serial
*serial
= port
->serial
;
338 dbg("%s - enter", __func__
);
340 /* send the data out the bulk port */
343 usb_bulk_msg(serial
->dev
,
344 usb_rcvbulkpipe(serial
->dev
,
345 port
->bulk_in_endpointAddress
), buf
,
346 count
, &actual
, HZ
* 1);
348 if (status
!= IUU_OPERATION_OK
)
349 dbg("%s - error = %2x", __func__
, status
);
351 dbg("%s - read OK !", __func__
);
355 static int iuu_led(struct usb_serial_port
*port
, unsigned int R
,
356 unsigned int G
, unsigned int B
, u8 f
)
360 buf
= kmalloc(8, GFP_KERNEL
);
364 dbg("%s - enter", __func__
);
366 buf
[0] = IUU_SET_LED
;
368 buf
[2] = (R
>> 8) & 0xFF;
370 buf
[4] = (G
>> 8) & 0xFF;
372 buf
[6] = (B
>> 8) & 0xFF;
374 status
= bulk_immediate(port
, buf
, 8);
376 if (status
!= IUU_OPERATION_OK
)
377 dbg("%s - led error status = %2x", __func__
, status
);
379 dbg("%s - led OK !", __func__
);
380 return IUU_OPERATION_OK
;
383 static void iuu_rgbf_fill_buffer(u8
*buf
, u8 r1
, u8 r2
, u8 g1
, u8 g2
, u8 b1
,
386 *buf
++ = IUU_SET_LED
;
396 static void iuu_led_activity_on(struct urb
*urb
)
398 struct usb_serial_port
*port
= urb
->context
;
400 char *buf_ptr
= port
->write_urb
->transfer_buffer
;
401 *buf_ptr
++ = IUU_SET_LED
;
403 get_random_bytes(buf_ptr
, 6);
406 iuu_rgbf_fill_buffer(buf_ptr
, 255, 255, 0, 0, 0, 0, 255);
409 usb_fill_bulk_urb(port
->write_urb
, port
->serial
->dev
,
410 usb_sndbulkpipe(port
->serial
->dev
,
411 port
->bulk_out_endpointAddress
),
412 port
->write_urb
->transfer_buffer
, 8 ,
414 result
= usb_submit_urb(port
->write_urb
, GFP_ATOMIC
);
417 static void iuu_led_activity_off(struct urb
*urb
)
419 struct usb_serial_port
*port
= urb
->context
;
421 char *buf_ptr
= port
->write_urb
->transfer_buffer
;
426 *buf_ptr
++ = IUU_SET_LED
;
427 iuu_rgbf_fill_buffer(buf_ptr
, 0, 0, 255, 255, 0, 0, 255);
429 usb_fill_bulk_urb(port
->write_urb
, port
->serial
->dev
,
430 usb_sndbulkpipe(port
->serial
->dev
,
431 port
->bulk_out_endpointAddress
),
432 port
->write_urb
->transfer_buffer
, 8 ,
434 result
= usb_submit_urb(port
->write_urb
, GFP_ATOMIC
);
439 static int iuu_clk(struct usb_serial_port
*port
, int dwFrq
)
442 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
445 u8 DIV
= 0; /* 8bit */
446 u8 XDRV
= 0; /* 8bit */
447 u8 PUMP
= 0; /* 3bit */
448 u8 PBmsb
= 0; /* 2bit */
449 u8 PBlsb
= 0; /* 8bit */
450 u8 PO
= 0; /* 1bit */
455 int frq
= (int)dwFrq
;
457 dbg("%s - enter", __func__
);
460 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
;
461 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
462 priv
->buf
[Count
++] = 0x09;
463 priv
->buf
[Count
++] = 0x00;
465 status
= bulk_immediate(port
, (u8
*) priv
->buf
, Count
);
467 dbg("%s - write error ", __func__
);
470 } else if (frq
== 3579000) {
475 } else if (frq
== 3680000) {
480 } else if (frq
== 6000000) {
486 unsigned int result
= 0;
487 unsigned int tmp
= 0;
492 unsigned int lP
= 2055;
493 unsigned int lDiv
= 4;
495 for (lQ
= 2; lQ
<= 47 && !found
; lQ
++)
496 for (lP
= 2055; lP
>= 8 && !found
; lP
--)
497 for (lDiv
= 4; lDiv
<= 127 && !found
; lDiv
++) {
498 tmp
= (12000000 / lDiv
) * (lP
/ lQ
);
499 if (abs((int)(tmp
- frq
)) <
500 abs((int)(frq
- result
))) {
501 check2
= (12000000 / lQ
);
504 check
= (12000000 / lQ
) * lP
;
505 if (check
> 400000000)
507 if (check
< 100000000)
509 if (lDiv
< 4 || lDiv
> 127)
520 P2
= ((P
- PO
) / 2) - 4;
523 PBmsb
= (P2
>> 8 & 0x03);
525 PO
= (P
>> 10) & 0x01;
528 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
529 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
530 priv
->buf
[Count
++] = 0x09;
531 priv
->buf
[Count
++] = 0x20; /* Adr = 0x09 */
532 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
533 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
534 priv
->buf
[Count
++] = 0x0C;
535 priv
->buf
[Count
++] = DIV
; /* Adr = 0x0C */
536 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
537 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
538 priv
->buf
[Count
++] = 0x12;
539 priv
->buf
[Count
++] = XDRV
; /* Adr = 0x12 */
540 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
541 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
542 priv
->buf
[Count
++] = 0x13;
543 priv
->buf
[Count
++] = 0x6B; /* Adr = 0x13 */
544 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
545 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
546 priv
->buf
[Count
++] = 0x40;
547 priv
->buf
[Count
++] = (0xC0 | ((PUMP
& 0x07) << 2)) |
548 (PBmsb
& 0x03); /* Adr = 0x40 */
549 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
550 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
551 priv
->buf
[Count
++] = 0x41;
552 priv
->buf
[Count
++] = PBlsb
; /* Adr = 0x41 */
553 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
554 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
555 priv
->buf
[Count
++] = 0x42;
556 priv
->buf
[Count
++] = Q
| (((PO
& 0x01) << 7)); /* Adr = 0x42 */
557 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
558 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
559 priv
->buf
[Count
++] = 0x44;
560 priv
->buf
[Count
++] = (char)0xFF; /* Adr = 0x44 */
561 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
562 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
563 priv
->buf
[Count
++] = 0x45;
564 priv
->buf
[Count
++] = (char)0xFE; /* Adr = 0x45 */
565 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
566 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
567 priv
->buf
[Count
++] = 0x46;
568 priv
->buf
[Count
++] = 0x7F; /* Adr = 0x46 */
569 priv
->buf
[Count
++] = IUU_UART_WRITE_I2C
; /* 0x4C */
570 priv
->buf
[Count
++] = FrqGenAdr
<< 1;
571 priv
->buf
[Count
++] = 0x47;
572 priv
->buf
[Count
++] = (char)0x84; /* Adr = 0x47 */
574 status
= bulk_immediate(port
, (u8
*) priv
->buf
, Count
);
575 if (status
!= IUU_OPERATION_OK
)
576 dbg("%s - write error ", __func__
);
580 static int iuu_uart_flush(struct usb_serial_port
*port
)
584 u8 rxcmd
= IUU_UART_RX
;
585 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
587 dbg("%s - enter", __func__
);
589 if (iuu_led(port
, 0xF000, 0, 0, 0xFF) < 0)
592 for (i
= 0; i
< 2; i
++) {
593 status
= bulk_immediate(port
, &rxcmd
, 1);
594 if (status
!= IUU_OPERATION_OK
) {
595 dbg("%s - uart_flush_write error", __func__
);
599 status
= read_immediate(port
, &priv
->len
, 1);
600 if (status
!= IUU_OPERATION_OK
) {
601 dbg("%s - uart_flush_read error", __func__
);
606 dbg("%s - uart_flush datalen is : %i ", __func__
,
608 status
= read_immediate(port
, priv
->buf
, priv
->len
);
609 if (status
!= IUU_OPERATION_OK
) {
610 dbg("%s - uart_flush_read error", __func__
);
615 dbg("%s - uart_flush_read OK!", __func__
);
616 iuu_led(port
, 0, 0xF000, 0, 0xFF);
620 static void read_buf_callback(struct urb
*urb
)
622 struct usb_serial_port
*port
= urb
->context
;
623 unsigned char *data
= urb
->transfer_buffer
;
624 struct tty_struct
*tty
;
625 int status
= urb
->status
;
627 dbg("%s - status = %d", __func__
, status
);
630 if (status
== -EPROTO
) {
631 /* reschedule needed */
636 dbg("%s - %i chars to write", __func__
, urb
->actual_length
);
637 tty
= tty_port_tty_get(&port
->port
);
639 dbg("%s - data is NULL !!!", __func__
);
640 if (tty
&& urb
->actual_length
&& data
) {
641 tty_insert_flip_string(tty
, data
, urb
->actual_length
);
642 tty_flip_buffer_push(tty
);
645 iuu_led_activity_on(urb
);
648 static int iuu_bulk_write(struct usb_serial_port
*port
)
650 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
654 char *buf_ptr
= port
->write_urb
->transfer_buffer
;
655 dbg("%s - enter", __func__
);
657 *buf_ptr
++ = IUU_UART_ESC
;
658 *buf_ptr
++ = IUU_UART_TX
;
659 *buf_ptr
++ = priv
->writelen
;
661 memcpy(buf_ptr
, priv
->writebuf
,
664 for (i
= 0; i
< priv
->writelen
; i
++)
665 sprintf(priv
->dbgbuf
+ i
*2 ,
666 "%02X", priv
->writebuf
[i
]);
667 priv
->dbgbuf
[priv
->writelen
+i
*2] = 0;
668 dbg("%s - writing %i chars : %s", __func__
,
669 priv
->writelen
, priv
->dbgbuf
);
671 usb_fill_bulk_urb(port
->write_urb
, port
->serial
->dev
,
672 usb_sndbulkpipe(port
->serial
->dev
,
673 port
->bulk_out_endpointAddress
),
674 port
->write_urb
->transfer_buffer
, priv
->writelen
+ 3,
676 result
= usb_submit_urb(port
->write_urb
, GFP_ATOMIC
);
677 spin_lock_irqsave(&priv
->lock
, flags
);
679 spin_unlock_irqrestore(&priv
->lock
, flags
);
680 usb_serial_port_softint(port
);
684 static int iuu_read_buf(struct usb_serial_port
*port
, int len
)
687 dbg("%s - enter", __func__
);
689 usb_fill_bulk_urb(port
->read_urb
, port
->serial
->dev
,
690 usb_rcvbulkpipe(port
->serial
->dev
,
691 port
->bulk_in_endpointAddress
),
692 port
->read_urb
->transfer_buffer
, len
,
693 read_buf_callback
, port
);
694 result
= usb_submit_urb(port
->read_urb
, GFP_ATOMIC
);
698 static void iuu_uart_read_callback(struct urb
*urb
)
700 struct usb_serial_port
*port
= urb
->context
;
701 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
703 int status
= urb
->status
;
706 unsigned char *data
= urb
->transfer_buffer
;
709 dbg("%s - enter", __func__
);
712 dbg("%s - status = %d", __func__
, status
);
717 dbg("%s - data is NULL !!!", __func__
);
719 if (urb
->actual_length
== 1 && data
!= NULL
)
722 if (urb
->actual_length
> 1) {
723 dbg("%s - urb->actual_length = %i", __func__
,
728 /* if len > 0 call readbuf */
730 if (len
> 0 && error
== 0) {
731 dbg("%s - call read buf - len to read is %i ",
733 status
= iuu_read_buf(port
, len
);
736 /* need to update status ? */
737 if (priv
->poll
> 99) {
738 status
= iuu_status(port
);
743 /* reset waiting ? */
745 if (priv
->reset
== 1) {
746 status
= iuu_reset(port
, 0xC);
749 /* Writebuf is waiting */
750 spin_lock_irqsave(&priv
->lock
, flags
);
751 if (priv
->writelen
> 0) {
752 spin_unlock_irqrestore(&priv
->lock
, flags
);
753 status
= iuu_bulk_write(port
);
756 spin_unlock_irqrestore(&priv
->lock
, flags
);
757 /* if nothing to write call again rxcmd */
758 dbg("%s - rxcmd recall", __func__
);
759 iuu_led_activity_off(urb
);
762 static int iuu_uart_write(struct tty_struct
*tty
, struct usb_serial_port
*port
,
763 const u8
*buf
, int count
)
765 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
767 dbg("%s - enter", __func__
);
772 spin_lock_irqsave(&priv
->lock
, flags
);
773 if (priv
->writelen
> 0) {
774 /* buffer already filled but not commited */
775 spin_unlock_irqrestore(&priv
->lock
, flags
);
778 /* fill the buffer */
779 memcpy(priv
->writebuf
, buf
, count
);
780 priv
->writelen
= count
;
781 spin_unlock_irqrestore(&priv
->lock
, flags
);
786 static void read_rxcmd_callback(struct urb
*urb
)
788 struct usb_serial_port
*port
= urb
->context
;
790 int status
= urb
->status
;
792 dbg("%s - status = %d", __func__
, status
);
799 usb_fill_bulk_urb(port
->read_urb
, port
->serial
->dev
,
800 usb_rcvbulkpipe(port
->serial
->dev
,
801 port
->bulk_in_endpointAddress
),
802 port
->read_urb
->transfer_buffer
, 256,
803 iuu_uart_read_callback
, port
);
804 result
= usb_submit_urb(port
->read_urb
, GFP_ATOMIC
);
805 dbg("%s - submit result = %d", __func__
, result
);
809 static int iuu_uart_on(struct usb_serial_port
*port
)
814 buf
= kmalloc(sizeof(u8
) * 4, GFP_KERNEL
);
819 buf
[0] = IUU_UART_ENABLE
;
820 buf
[1] = (u8
) ((IUU_BAUD_9600
>> 8) & 0x00FF);
821 buf
[2] = (u8
) (0x00FF & IUU_BAUD_9600
);
822 buf
[3] = (u8
) (0x0F0 & IUU_TWO_STOP_BITS
) | (0x07 & IUU_PARITY_EVEN
);
824 status
= bulk_immediate(port
, buf
, 4);
825 if (status
!= IUU_OPERATION_OK
) {
826 dbg("%s - uart_on error", __func__
);
827 goto uart_enable_failed
;
829 /* iuu_reset() the card after iuu_uart_on() */
830 status
= iuu_uart_flush(port
);
831 if (status
!= IUU_OPERATION_OK
)
832 dbg("%s - uart_flush error", __func__
);
838 /* Diables the IUU UART (a.k.a. the Phoenix voiderface) */
839 static int iuu_uart_off(struct usb_serial_port
*port
)
843 buf
= kmalloc(1, GFP_KERNEL
);
846 buf
[0] = IUU_UART_DISABLE
;
848 status
= bulk_immediate(port
, buf
, 1);
849 if (status
!= IUU_OPERATION_OK
)
850 dbg("%s - uart_off error", __func__
);
856 static int iuu_uart_baud(struct usb_serial_port
*port
, u32 baud
,
857 u32
*actual
, u8 parity
)
864 unsigned int T1FrekvensHZ
= 0;
866 dataout
= kmalloc(sizeof(u8
) * 5, GFP_KERNEL
);
871 if (baud
< 1200 || baud
> 230400) {
873 return IUU_INVALID_PARAMETER
;
877 T1FrekvensHZ
= 500000;
882 T1FrekvensHZ
= 2000000;
887 T1FrekvensHZ
= 6000000;
892 T1FrekvensHZ
= 24000000;
895 T1reload
= 256 - (u8
) (T1FrekvensHZ
/ (baud
* 2));
897 /* magic number here: ENTER_FIRMWARE_UPDATE; */
898 dataout
[DataCount
++] = IUU_UART_ESC
;
899 /* magic number here: CHANGE_BAUD; */
900 dataout
[DataCount
++] = IUU_UART_CHANGE
;
901 dataout
[DataCount
++] = T1Frekvens
;
902 dataout
[DataCount
++] = T1reload
;
904 *actual
= (T1FrekvensHZ
/ (256 - T1reload
)) / 2;
906 switch (parity
& 0x0F) {
907 case IUU_PARITY_NONE
:
908 dataout
[DataCount
++] = 0x00;
910 case IUU_PARITY_EVEN
:
911 dataout
[DataCount
++] = 0x01;
914 dataout
[DataCount
++] = 0x02;
916 case IUU_PARITY_MARK
:
917 dataout
[DataCount
++] = 0x03;
919 case IUU_PARITY_SPACE
:
920 dataout
[DataCount
++] = 0x04;
924 return IUU_INVALID_PARAMETER
;
928 switch (parity
& 0xF0) {
929 case IUU_ONE_STOP_BIT
:
930 dataout
[DataCount
- 1] |= IUU_ONE_STOP_BIT
;
933 case IUU_TWO_STOP_BITS
:
934 dataout
[DataCount
- 1] |= IUU_TWO_STOP_BITS
;
938 return IUU_INVALID_PARAMETER
;
942 status
= bulk_immediate(port
, dataout
, DataCount
);
943 if (status
!= IUU_OPERATION_OK
)
944 dbg("%s - uart_off error", __func__
);
949 static int set_control_lines(struct usb_device
*dev
, u8 value
)
954 static void iuu_close(struct tty_struct
*tty
,
955 struct usb_serial_port
*port
, struct file
*filp
)
957 /* iuu_led (port,255,0,0,0); */
958 struct usb_serial
*serial
;
959 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
961 unsigned int c_cflag
;
963 serial
= port
->serial
;
967 dbg("%s - port %d", __func__
, port
->number
);
972 c_cflag
= tty
->termios
->c_cflag
;
973 if (c_cflag
& HUPCL
) {
974 /* drop DTR and RTS */
975 priv
= usb_get_serial_port_data(port
);
976 spin_lock_irqsave(&priv
->lock
, flags
);
977 priv
->line_control
= 0;
978 spin_unlock_irqrestore(&priv
->lock
, flags
);
979 set_control_lines(port
->serial
->dev
, 0);
983 /* shutdown our urbs */
984 dbg("%s - shutting down urbs", __func__
);
985 usb_kill_urb(port
->write_urb
);
986 usb_kill_urb(port
->read_urb
);
987 usb_kill_urb(port
->interrupt_in_urb
);
989 /* wait one second to free all buffers */
990 iuu_led(port
, 0, 0, 0xF000, 0xFF);
992 usb_reset_device(port
->serial
->dev
);
996 static int iuu_open(struct tty_struct
*tty
,
997 struct usb_serial_port
*port
, struct file
*filp
)
999 struct usb_serial
*serial
= port
->serial
;
1003 unsigned long flags
;
1004 struct iuu_private
*priv
= usb_get_serial_port_data(port
);
1006 dbg("%s - port %d", __func__
, port
->number
);
1007 usb_clear_halt(serial
->dev
, port
->write_urb
->pipe
);
1008 usb_clear_halt(serial
->dev
, port
->read_urb
->pipe
);
1010 buf
= kmalloc(10, GFP_KERNEL
);
1014 /* fixup the endpoint buffer size */
1015 kfree(port
->bulk_out_buffer
);
1016 port
->bulk_out_buffer
= kmalloc(512, GFP_KERNEL
);
1017 port
->bulk_out_size
= 512;
1018 kfree(port
->bulk_in_buffer
);
1019 port
->bulk_in_buffer
= kmalloc(512, GFP_KERNEL
);
1020 port
->bulk_in_size
= 512;
1022 if (!port
->bulk_out_buffer
|| !port
->bulk_in_buffer
) {
1023 kfree(port
->bulk_out_buffer
);
1024 kfree(port
->bulk_in_buffer
);
1029 usb_fill_bulk_urb(port
->write_urb
, port
->serial
->dev
,
1030 usb_sndbulkpipe(port
->serial
->dev
,
1031 port
->bulk_out_endpointAddress
),
1032 port
->bulk_out_buffer
, 512,
1036 usb_fill_bulk_urb(port
->read_urb
, port
->serial
->dev
,
1037 usb_rcvbulkpipe(port
->serial
->dev
,
1038 port
->bulk_in_endpointAddress
),
1039 port
->bulk_in_buffer
, 512,
1042 /* set the termios structure */
1043 spin_lock_irqsave(&priv
->lock
, flags
);
1044 if (tty
&& !priv
->termios_initialized
) {
1045 *(tty
->termios
) = tty_std_termios
;
1046 tty
->termios
->c_cflag
= CLOCAL
| CREAD
| CS8
| B9600
1047 | TIOCM_CTS
| CSTOPB
| PARENB
;
1048 tty
->termios
->c_ispeed
= 9600;
1049 tty
->termios
->c_ospeed
= 9600;
1050 tty
->termios
->c_lflag
= 0;
1051 tty
->termios
->c_oflag
= 0;
1052 tty
->termios
->c_iflag
= 0;
1053 priv
->termios_initialized
= 1;
1054 tty
->low_latency
= 1;
1057 spin_unlock_irqrestore(&priv
->lock
, flags
);
1059 /* initialize writebuf */
1060 #define FISH(a, b, c, d) do { \
1061 result = usb_control_msg(port->serial->dev, \
1062 usb_rcvctrlpipe(port->serial->dev, 0), \
1063 b, a, c, d, buf, 1, 1000); \
1064 dbg("0x%x:0x%x:0x%x:0x%x %d - %x", a, b, c, d, result, \
1065 buf[0]); } while (0);
1067 #define SOUP(a, b, c, d) do { \
1068 result = usb_control_msg(port->serial->dev, \
1069 usb_sndctrlpipe(port->serial->dev, 0), \
1070 b, a, c, d, NULL, 0, 1000); \
1071 dbg("0x%x:0x%x:0x%x:0x%x %d", a, b, c, d, result); } while (0)
1073 /* This is not UART related but IUU USB driver related or something */
1074 /* like that. Basically no IUU will accept any commands from the USB */
1075 /* host unless it has received the following message */
1076 /* sprintf(buf ,"%c%c%c%c",0x03,0x02,0x02,0x0); */
1078 SOUP(0x03, 0x02, 0x02, 0x0);
1080 iuu_led(port
, 0xF000, 0xF000, 0, 0xFF);
1084 switch (clockmode
) {
1085 case 2: /* 3.680 Mhz */
1086 iuu_clk(port
, IUU_CLK_3680000
* boost
/ 100);
1088 iuu_uart_baud(port
, 9600 * boost
/ 100, &actual
,
1091 case 3: /* 6.00 Mhz */
1092 iuu_clk(port
, IUU_CLK_6000000
* boost
/ 100);
1094 iuu_uart_baud(port
, 16457 * boost
/ 100, &actual
,
1097 default: /* 3.579 Mhz */
1098 iuu_clk(port
, IUU_CLK_3579000
* boost
/ 100);
1100 iuu_uart_baud(port
, 9600 * boost
/ 100, &actual
,
1104 /* set the cardin cardout signals */
1111 iuu_cardin
= TIOCM_CD
;
1116 iuu_cardout
= TIOCM_CD
;
1119 iuu_cardin
= TIOCM_DSR
;
1124 iuu_cardout
= TIOCM_DSR
;
1127 iuu_cardin
= TIOCM_CTS
;
1132 iuu_cardout
= TIOCM_CTS
;
1135 iuu_cardin
= TIOCM_RNG
;
1140 iuu_cardout
= TIOCM_RNG
;
1143 iuu_uart_flush(port
);
1145 dbg("%s - initialization done", __func__
);
1147 memset(port
->write_urb
->transfer_buffer
, IUU_UART_RX
, 1);
1148 usb_fill_bulk_urb(port
->write_urb
, port
->serial
->dev
,
1149 usb_sndbulkpipe(port
->serial
->dev
,
1150 port
->bulk_out_endpointAddress
),
1151 port
->write_urb
->transfer_buffer
, 1,
1152 read_rxcmd_callback
, port
);
1153 result
= usb_submit_urb(port
->write_urb
, GFP_KERNEL
);
1156 dev_err(&port
->dev
, "%s - failed submitting read urb,"
1157 " error %d\n", __func__
, result
);
1158 iuu_close(tty
, port
, NULL
);
1161 dbg("%s - rxcmd OK", __func__
);
1166 static struct usb_serial_driver iuu_device
= {
1168 .owner
= THIS_MODULE
,
1169 .name
= "iuu_phoenix",
1171 .id_table
= id_table
,
1175 .write
= iuu_uart_write
,
1176 .read_bulk_callback
= iuu_uart_read_callback
,
1177 .tiocmget
= iuu_tiocmget
,
1178 .tiocmset
= iuu_tiocmset
,
1179 .attach
= iuu_startup
,
1180 .shutdown
= iuu_shutdown
,
1183 static int __init
iuu_init(void)
1186 retval
= usb_serial_register(&iuu_device
);
1188 goto failed_usb_serial_register
;
1189 retval
= usb_register(&iuu_driver
);
1191 goto failed_usb_register
;
1192 printk(KERN_INFO KBUILD_MODNAME
": " DRIVER_VERSION
":"
1195 failed_usb_register
:
1196 usb_serial_deregister(&iuu_device
);
1197 failed_usb_serial_register
:
1201 static void __exit
iuu_exit(void)
1203 usb_deregister(&iuu_driver
);
1204 usb_serial_deregister(&iuu_device
);
1207 module_init(iuu_init
);
1208 module_exit(iuu_exit
);
1210 MODULE_AUTHOR("Alain Degreffe eczema@ecze.com");
1212 MODULE_DESCRIPTION(DRIVER_DESC
);
1213 MODULE_LICENSE("GPL");
1215 MODULE_VERSION(DRIVER_VERSION
);
1216 module_param(debug
, bool, S_IRUGO
| S_IWUSR
);
1217 MODULE_PARM_DESC(debug
, "Debug enabled or not");
1219 module_param(xmas
, bool, S_IRUGO
| S_IWUSR
);
1220 MODULE_PARM_DESC(xmas
, "xmas color enabled or not");
1222 module_param(boost
, int, S_IRUGO
| S_IWUSR
);
1223 MODULE_PARM_DESC(boost
, "overclock boost percent 100 to 500");
1225 module_param(clockmode
, int, S_IRUGO
| S_IWUSR
);
1226 MODULE_PARM_DESC(clockmode
, "1=3Mhz579,2=3Mhz680,3=6Mhz");
1228 module_param(cdmode
, int, S_IRUGO
| S_IWUSR
);
1229 MODULE_PARM_DESC(cdmode
, "Card detect mode 0=none, 1=CD, 2=!CD, 3=DSR, "
1230 "4=!DSR, 5=CTS, 6=!CTS, 7=RING, 8=!RING");