0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/kernel.h>
0014 #include <linux/errno.h>
0015 #include <linux/slab.h>
0016 #include <linux/tty.h>
0017 #include <linux/tty_driver.h>
0018 #include <linux/tty_flip.h>
0019 #include <linux/serial.h>
0020 #include <linux/module.h>
0021 #include <linux/moduleparam.h>
0022 #include <linux/spinlock.h>
0023 #include <linux/uaccess.h>
0024 #include <linux/usb.h>
0025 #include <linux/usb/serial.h>
0026 #include "iuu_phoenix.h"
0027 #include <linux/random.h>
0028
0029 #define DRIVER_DESC "Infinity USB Unlimited Phoenix driver"
0030
0031 static const struct usb_device_id id_table[] = {
0032 {USB_DEVICE(IUU_USB_VENDOR_ID, IUU_USB_PRODUCT_ID)},
0033 {}
0034 };
0035 MODULE_DEVICE_TABLE(usb, id_table);
0036
0037
0038 static int boost = 100;
0039 static int clockmode = 1;
0040 static int cdmode = 1;
0041 static int iuu_cardin;
0042 static int iuu_cardout;
0043 static bool xmas;
0044 static int vcc_default = 5;
0045
0046 static int iuu_create_sysfs_attrs(struct usb_serial_port *port);
0047 static int iuu_remove_sysfs_attrs(struct usb_serial_port *port);
0048 static void read_rxcmd_callback(struct urb *urb);
0049
0050 struct iuu_private {
0051 spinlock_t lock;
0052 u8 line_status;
0053 int tiostatus;
0054 u8 reset;
0055 int poll;
0056 u8 *writebuf;
0057 int writelen;
0058 u8 *buf;
0059 u8 len;
0060 int vcc;
0061 u32 boost;
0062 u32 clk;
0063 };
0064
0065 static int iuu_port_probe(struct usb_serial_port *port)
0066 {
0067 struct iuu_private *priv;
0068 int ret;
0069
0070 priv = kzalloc(sizeof(struct iuu_private), GFP_KERNEL);
0071 if (!priv)
0072 return -ENOMEM;
0073
0074 priv->buf = kzalloc(256, GFP_KERNEL);
0075 if (!priv->buf) {
0076 kfree(priv);
0077 return -ENOMEM;
0078 }
0079
0080 priv->writebuf = kzalloc(256, GFP_KERNEL);
0081 if (!priv->writebuf) {
0082 kfree(priv->buf);
0083 kfree(priv);
0084 return -ENOMEM;
0085 }
0086
0087 priv->vcc = vcc_default;
0088 spin_lock_init(&priv->lock);
0089
0090 usb_set_serial_port_data(port, priv);
0091
0092 ret = iuu_create_sysfs_attrs(port);
0093 if (ret) {
0094 kfree(priv->writebuf);
0095 kfree(priv->buf);
0096 kfree(priv);
0097 return ret;
0098 }
0099
0100 return 0;
0101 }
0102
0103 static void iuu_port_remove(struct usb_serial_port *port)
0104 {
0105 struct iuu_private *priv = usb_get_serial_port_data(port);
0106
0107 iuu_remove_sysfs_attrs(port);
0108 kfree(priv->writebuf);
0109 kfree(priv->buf);
0110 kfree(priv);
0111 }
0112
0113 static int iuu_tiocmset(struct tty_struct *tty,
0114 unsigned int set, unsigned int clear)
0115 {
0116 struct usb_serial_port *port = tty->driver_data;
0117 struct iuu_private *priv = usb_get_serial_port_data(port);
0118 unsigned long flags;
0119
0120
0121 dev_dbg(&port->dev, "%s msg : SET = 0x%04x, CLEAR = 0x%04x\n",
0122 __func__, set, clear);
0123
0124 spin_lock_irqsave(&priv->lock, flags);
0125
0126 if ((set & TIOCM_RTS) && !(priv->tiostatus == TIOCM_RTS)) {
0127 dev_dbg(&port->dev, "%s TIOCMSET RESET called !!!\n", __func__);
0128 priv->reset = 1;
0129 }
0130 if (set & TIOCM_RTS)
0131 priv->tiostatus = TIOCM_RTS;
0132
0133 spin_unlock_irqrestore(&priv->lock, flags);
0134 return 0;
0135 }
0136
0137
0138
0139
0140
0141
0142 static int iuu_tiocmget(struct tty_struct *tty)
0143 {
0144 struct usb_serial_port *port = tty->driver_data;
0145 struct iuu_private *priv = usb_get_serial_port_data(port);
0146 unsigned long flags;
0147 int rc;
0148
0149 spin_lock_irqsave(&priv->lock, flags);
0150 rc = priv->tiostatus;
0151 spin_unlock_irqrestore(&priv->lock, flags);
0152
0153 return rc;
0154 }
0155
0156 static void iuu_rxcmd(struct urb *urb)
0157 {
0158 struct usb_serial_port *port = urb->context;
0159 int status = urb->status;
0160
0161 if (status) {
0162 dev_dbg(&port->dev, "%s - status = %d\n", __func__, status);
0163
0164 return;
0165 }
0166
0167
0168 memset(port->write_urb->transfer_buffer, IUU_UART_RX, 1);
0169 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
0170 usb_sndbulkpipe(port->serial->dev,
0171 port->bulk_out_endpointAddress),
0172 port->write_urb->transfer_buffer, 1,
0173 read_rxcmd_callback, port);
0174 usb_submit_urb(port->write_urb, GFP_ATOMIC);
0175 }
0176
0177 static int iuu_reset(struct usb_serial_port *port, u8 wt)
0178 {
0179 struct iuu_private *priv = usb_get_serial_port_data(port);
0180 int result;
0181 char *buf_ptr = port->write_urb->transfer_buffer;
0182
0183
0184
0185 *buf_ptr++ = IUU_RST_SET;
0186 *buf_ptr++ = IUU_DELAY_MS;
0187 *buf_ptr++ = wt;
0188 *buf_ptr = IUU_RST_CLEAR;
0189
0190
0191
0192 usb_fill_bulk_urb(port->write_urb,
0193 port->serial->dev,
0194 usb_sndbulkpipe(port->serial->dev,
0195 port->bulk_out_endpointAddress),
0196 port->write_urb->transfer_buffer, 4, iuu_rxcmd, port);
0197 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
0198 priv->reset = 0;
0199 return result;
0200 }
0201
0202
0203
0204
0205
0206
0207
0208 static void iuu_update_status_callback(struct urb *urb)
0209 {
0210 struct usb_serial_port *port = urb->context;
0211 struct iuu_private *priv = usb_get_serial_port_data(port);
0212 u8 *st;
0213 int status = urb->status;
0214
0215 if (status) {
0216 dev_dbg(&port->dev, "%s - status = %d\n", __func__, status);
0217
0218 return;
0219 }
0220
0221 st = urb->transfer_buffer;
0222 dev_dbg(&port->dev, "%s - enter\n", __func__);
0223 if (urb->actual_length == 1) {
0224 switch (st[0]) {
0225 case 0x1:
0226 priv->tiostatus = iuu_cardout;
0227 break;
0228 case 0x0:
0229 priv->tiostatus = iuu_cardin;
0230 break;
0231 default:
0232 priv->tiostatus = iuu_cardin;
0233 }
0234 }
0235 iuu_rxcmd(urb);
0236 }
0237
0238 static void iuu_status_callback(struct urb *urb)
0239 {
0240 struct usb_serial_port *port = urb->context;
0241 int status = urb->status;
0242
0243 dev_dbg(&port->dev, "%s - status = %d\n", __func__, status);
0244 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
0245 usb_rcvbulkpipe(port->serial->dev,
0246 port->bulk_in_endpointAddress),
0247 port->read_urb->transfer_buffer, 256,
0248 iuu_update_status_callback, port);
0249 usb_submit_urb(port->read_urb, GFP_ATOMIC);
0250 }
0251
0252 static int iuu_status(struct usb_serial_port *port)
0253 {
0254 int result;
0255
0256 memset(port->write_urb->transfer_buffer, IUU_GET_STATE_REGISTER, 1);
0257 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
0258 usb_sndbulkpipe(port->serial->dev,
0259 port->bulk_out_endpointAddress),
0260 port->write_urb->transfer_buffer, 1,
0261 iuu_status_callback, port);
0262 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
0263 return result;
0264
0265 }
0266
0267 static int bulk_immediate(struct usb_serial_port *port, u8 *buf, u8 count)
0268 {
0269 int status;
0270 struct usb_serial *serial = port->serial;
0271 int actual = 0;
0272
0273
0274
0275 status =
0276 usb_bulk_msg(serial->dev,
0277 usb_sndbulkpipe(serial->dev,
0278 port->bulk_out_endpointAddress), buf,
0279 count, &actual, 1000);
0280
0281 if (status != IUU_OPERATION_OK)
0282 dev_dbg(&port->dev, "%s - error = %2x\n", __func__, status);
0283 else
0284 dev_dbg(&port->dev, "%s - write OK !\n", __func__);
0285 return status;
0286 }
0287
0288 static int read_immediate(struct usb_serial_port *port, u8 *buf, u8 count)
0289 {
0290 int status;
0291 struct usb_serial *serial = port->serial;
0292 int actual = 0;
0293
0294
0295 status =
0296 usb_bulk_msg(serial->dev,
0297 usb_rcvbulkpipe(serial->dev,
0298 port->bulk_in_endpointAddress), buf,
0299 count, &actual, 1000);
0300
0301 if (status != IUU_OPERATION_OK)
0302 dev_dbg(&port->dev, "%s - error = %2x\n", __func__, status);
0303 else
0304 dev_dbg(&port->dev, "%s - read OK !\n", __func__);
0305 return status;
0306 }
0307
0308 static int iuu_led(struct usb_serial_port *port, unsigned int R,
0309 unsigned int G, unsigned int B, u8 f)
0310 {
0311 int status;
0312 u8 *buf;
0313 buf = kmalloc(8, GFP_KERNEL);
0314 if (!buf)
0315 return -ENOMEM;
0316
0317 buf[0] = IUU_SET_LED;
0318 buf[1] = R & 0xFF;
0319 buf[2] = (R >> 8) & 0xFF;
0320 buf[3] = G & 0xFF;
0321 buf[4] = (G >> 8) & 0xFF;
0322 buf[5] = B & 0xFF;
0323 buf[6] = (B >> 8) & 0xFF;
0324 buf[7] = f;
0325 status = bulk_immediate(port, buf, 8);
0326 kfree(buf);
0327 if (status != IUU_OPERATION_OK)
0328 dev_dbg(&port->dev, "%s - led error status = %2x\n", __func__, status);
0329 else
0330 dev_dbg(&port->dev, "%s - led OK !\n", __func__);
0331 return IUU_OPERATION_OK;
0332 }
0333
0334 static void iuu_rgbf_fill_buffer(u8 *buf, u8 r1, u8 r2, u8 g1, u8 g2, u8 b1,
0335 u8 b2, u8 freq)
0336 {
0337 *buf++ = IUU_SET_LED;
0338 *buf++ = r1;
0339 *buf++ = r2;
0340 *buf++ = g1;
0341 *buf++ = g2;
0342 *buf++ = b1;
0343 *buf++ = b2;
0344 *buf = freq;
0345 }
0346
0347 static void iuu_led_activity_on(struct urb *urb)
0348 {
0349 struct usb_serial_port *port = urb->context;
0350 char *buf_ptr = port->write_urb->transfer_buffer;
0351
0352 if (xmas) {
0353 buf_ptr[0] = IUU_SET_LED;
0354 get_random_bytes(buf_ptr + 1, 6);
0355 buf_ptr[7] = 1;
0356 } else {
0357 iuu_rgbf_fill_buffer(buf_ptr, 255, 255, 0, 0, 0, 0, 255);
0358 }
0359
0360 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
0361 usb_sndbulkpipe(port->serial->dev,
0362 port->bulk_out_endpointAddress),
0363 port->write_urb->transfer_buffer, 8 ,
0364 iuu_rxcmd, port);
0365 usb_submit_urb(port->write_urb, GFP_ATOMIC);
0366 }
0367
0368 static void iuu_led_activity_off(struct urb *urb)
0369 {
0370 struct usb_serial_port *port = urb->context;
0371 char *buf_ptr = port->write_urb->transfer_buffer;
0372
0373 if (xmas) {
0374 iuu_rxcmd(urb);
0375 return;
0376 }
0377
0378 iuu_rgbf_fill_buffer(buf_ptr, 0, 0, 255, 255, 0, 0, 255);
0379
0380 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
0381 usb_sndbulkpipe(port->serial->dev,
0382 port->bulk_out_endpointAddress),
0383 port->write_urb->transfer_buffer, 8 ,
0384 iuu_rxcmd, port);
0385 usb_submit_urb(port->write_urb, GFP_ATOMIC);
0386 }
0387
0388
0389
0390 static int iuu_clk(struct usb_serial_port *port, int dwFrq)
0391 {
0392 int status;
0393 struct iuu_private *priv = usb_get_serial_port_data(port);
0394 int Count = 0;
0395 u8 FrqGenAdr = 0x69;
0396 u8 DIV = 0;
0397 u8 XDRV = 0;
0398 u8 PUMP = 0;
0399 u8 PBmsb = 0;
0400 u8 PBlsb = 0;
0401 u8 PO = 0;
0402 u8 Q = 0;
0403
0404 unsigned int P = 0;
0405 unsigned int P2 = 0;
0406 int frq = (int)dwFrq;
0407
0408 if (frq == 0) {
0409 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0410 priv->buf[Count++] = FrqGenAdr << 1;
0411 priv->buf[Count++] = 0x09;
0412 priv->buf[Count++] = 0x00;
0413
0414 status = bulk_immediate(port, (u8 *) priv->buf, Count);
0415 if (status != 0) {
0416 dev_dbg(&port->dev, "%s - write error\n", __func__);
0417 return status;
0418 }
0419 } else if (frq == 3579000) {
0420 DIV = 100;
0421 P = 1193;
0422 Q = 40;
0423 XDRV = 0;
0424 } else if (frq == 3680000) {
0425 DIV = 105;
0426 P = 161;
0427 Q = 5;
0428 XDRV = 0;
0429 } else if (frq == 6000000) {
0430 DIV = 66;
0431 P = 66;
0432 Q = 2;
0433 XDRV = 0x28;
0434 } else {
0435 unsigned int result = 0;
0436 unsigned int tmp = 0;
0437 unsigned int check;
0438 unsigned int check2;
0439 char found = 0x00;
0440 unsigned int lQ = 2;
0441 unsigned int lP = 2055;
0442 unsigned int lDiv = 4;
0443
0444 for (lQ = 2; lQ <= 47 && !found; lQ++)
0445 for (lP = 2055; lP >= 8 && !found; lP--)
0446 for (lDiv = 4; lDiv <= 127 && !found; lDiv++) {
0447 tmp = (12000000 / lDiv) * (lP / lQ);
0448 if (abs((int)(tmp - frq)) <
0449 abs((int)(frq - result))) {
0450 check2 = (12000000 / lQ);
0451 if (check2 < 250000)
0452 continue;
0453 check = (12000000 / lQ) * lP;
0454 if (check > 400000000)
0455 continue;
0456 if (check < 100000000)
0457 continue;
0458 if (lDiv < 4 || lDiv > 127)
0459 continue;
0460 result = tmp;
0461 P = lP;
0462 DIV = lDiv;
0463 Q = lQ;
0464 if (result == frq)
0465 found = 0x01;
0466 }
0467 }
0468 }
0469 P2 = ((P - PO) / 2) - 4;
0470 PUMP = 0x04;
0471 PBmsb = (P2 >> 8 & 0x03);
0472 PBlsb = P2 & 0xFF;
0473 PO = (P >> 10) & 0x01;
0474 Q = Q - 2;
0475
0476 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0477 priv->buf[Count++] = FrqGenAdr << 1;
0478 priv->buf[Count++] = 0x09;
0479 priv->buf[Count++] = 0x20;
0480 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0481 priv->buf[Count++] = FrqGenAdr << 1;
0482 priv->buf[Count++] = 0x0C;
0483 priv->buf[Count++] = DIV;
0484 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0485 priv->buf[Count++] = FrqGenAdr << 1;
0486 priv->buf[Count++] = 0x12;
0487 priv->buf[Count++] = XDRV;
0488 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0489 priv->buf[Count++] = FrqGenAdr << 1;
0490 priv->buf[Count++] = 0x13;
0491 priv->buf[Count++] = 0x6B;
0492 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0493 priv->buf[Count++] = FrqGenAdr << 1;
0494 priv->buf[Count++] = 0x40;
0495 priv->buf[Count++] = (0xC0 | ((PUMP & 0x07) << 2)) |
0496 (PBmsb & 0x03);
0497 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0498 priv->buf[Count++] = FrqGenAdr << 1;
0499 priv->buf[Count++] = 0x41;
0500 priv->buf[Count++] = PBlsb;
0501 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0502 priv->buf[Count++] = FrqGenAdr << 1;
0503 priv->buf[Count++] = 0x42;
0504 priv->buf[Count++] = Q | (((PO & 0x01) << 7));
0505 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0506 priv->buf[Count++] = FrqGenAdr << 1;
0507 priv->buf[Count++] = 0x44;
0508 priv->buf[Count++] = (char)0xFF;
0509 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0510 priv->buf[Count++] = FrqGenAdr << 1;
0511 priv->buf[Count++] = 0x45;
0512 priv->buf[Count++] = (char)0xFE;
0513 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0514 priv->buf[Count++] = FrqGenAdr << 1;
0515 priv->buf[Count++] = 0x46;
0516 priv->buf[Count++] = 0x7F;
0517 priv->buf[Count++] = IUU_UART_WRITE_I2C;
0518 priv->buf[Count++] = FrqGenAdr << 1;
0519 priv->buf[Count++] = 0x47;
0520 priv->buf[Count++] = (char)0x84;
0521
0522 status = bulk_immediate(port, (u8 *) priv->buf, Count);
0523 if (status != IUU_OPERATION_OK)
0524 dev_dbg(&port->dev, "%s - write error\n", __func__);
0525 return status;
0526 }
0527
0528 static int iuu_uart_flush(struct usb_serial_port *port)
0529 {
0530 struct device *dev = &port->dev;
0531 int i;
0532 int status;
0533 u8 *rxcmd;
0534 struct iuu_private *priv = usb_get_serial_port_data(port);
0535
0536 if (iuu_led(port, 0xF000, 0, 0, 0xFF) < 0)
0537 return -EIO;
0538
0539 rxcmd = kmalloc(1, GFP_KERNEL);
0540 if (!rxcmd)
0541 return -ENOMEM;
0542
0543 rxcmd[0] = IUU_UART_RX;
0544
0545 for (i = 0; i < 2; i++) {
0546 status = bulk_immediate(port, rxcmd, 1);
0547 if (status != IUU_OPERATION_OK) {
0548 dev_dbg(dev, "%s - uart_flush_write error\n", __func__);
0549 goto out_free;
0550 }
0551
0552 status = read_immediate(port, &priv->len, 1);
0553 if (status != IUU_OPERATION_OK) {
0554 dev_dbg(dev, "%s - uart_flush_read error\n", __func__);
0555 goto out_free;
0556 }
0557
0558 if (priv->len > 0) {
0559 dev_dbg(dev, "%s - uart_flush datalen is : %i\n", __func__, priv->len);
0560 status = read_immediate(port, priv->buf, priv->len);
0561 if (status != IUU_OPERATION_OK) {
0562 dev_dbg(dev, "%s - uart_flush_read error\n", __func__);
0563 goto out_free;
0564 }
0565 }
0566 }
0567 dev_dbg(dev, "%s - uart_flush_read OK!\n", __func__);
0568 iuu_led(port, 0, 0xF000, 0, 0xFF);
0569
0570 out_free:
0571 kfree(rxcmd);
0572
0573 return status;
0574 }
0575
0576 static void read_buf_callback(struct urb *urb)
0577 {
0578 struct usb_serial_port *port = urb->context;
0579 unsigned char *data = urb->transfer_buffer;
0580 int status = urb->status;
0581
0582 if (status) {
0583 if (status == -EPROTO) {
0584
0585 }
0586 return;
0587 }
0588
0589 dev_dbg(&port->dev, "%s - %i chars to write\n", __func__, urb->actual_length);
0590
0591 if (urb->actual_length) {
0592 tty_insert_flip_string(&port->port, data, urb->actual_length);
0593 tty_flip_buffer_push(&port->port);
0594 }
0595 iuu_led_activity_on(urb);
0596 }
0597
0598 static int iuu_bulk_write(struct usb_serial_port *port)
0599 {
0600 struct iuu_private *priv = usb_get_serial_port_data(port);
0601 unsigned long flags;
0602 int result;
0603 int buf_len;
0604 char *buf_ptr = port->write_urb->transfer_buffer;
0605
0606 spin_lock_irqsave(&priv->lock, flags);
0607 *buf_ptr++ = IUU_UART_ESC;
0608 *buf_ptr++ = IUU_UART_TX;
0609 *buf_ptr++ = priv->writelen;
0610
0611 memcpy(buf_ptr, priv->writebuf, priv->writelen);
0612 buf_len = priv->writelen;
0613 priv->writelen = 0;
0614 spin_unlock_irqrestore(&priv->lock, flags);
0615 dev_dbg(&port->dev, "%s - writing %i chars : %*ph\n", __func__,
0616 buf_len, buf_len, buf_ptr);
0617 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
0618 usb_sndbulkpipe(port->serial->dev,
0619 port->bulk_out_endpointAddress),
0620 port->write_urb->transfer_buffer, buf_len + 3,
0621 iuu_rxcmd, port);
0622 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
0623 usb_serial_port_softint(port);
0624 return result;
0625 }
0626
0627 static int iuu_read_buf(struct usb_serial_port *port, int len)
0628 {
0629 int result;
0630
0631 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
0632 usb_rcvbulkpipe(port->serial->dev,
0633 port->bulk_in_endpointAddress),
0634 port->read_urb->transfer_buffer, len,
0635 read_buf_callback, port);
0636 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
0637 return result;
0638 }
0639
0640 static void iuu_uart_read_callback(struct urb *urb)
0641 {
0642 struct usb_serial_port *port = urb->context;
0643 struct iuu_private *priv = usb_get_serial_port_data(port);
0644 unsigned long flags;
0645 int status = urb->status;
0646 int len = 0;
0647 unsigned char *data = urb->transfer_buffer;
0648 priv->poll++;
0649
0650 if (status) {
0651 dev_dbg(&port->dev, "%s - status = %d\n", __func__, status);
0652
0653 return;
0654 }
0655
0656 if (urb->actual_length == 1)
0657 len = (int) data[0];
0658
0659 if (urb->actual_length > 1) {
0660 dev_dbg(&port->dev, "%s - urb->actual_length = %i\n", __func__,
0661 urb->actual_length);
0662 return;
0663 }
0664
0665
0666 if (len > 0) {
0667 dev_dbg(&port->dev, "%s - call read buf - len to read is %i\n",
0668 __func__, len);
0669 status = iuu_read_buf(port, len);
0670 return;
0671 }
0672
0673 if (priv->poll > 99) {
0674 status = iuu_status(port);
0675 priv->poll = 0;
0676 return;
0677 }
0678
0679
0680
0681 if (priv->reset == 1) {
0682 status = iuu_reset(port, 0xC);
0683 return;
0684 }
0685
0686 spin_lock_irqsave(&priv->lock, flags);
0687 if (priv->writelen > 0) {
0688 spin_unlock_irqrestore(&priv->lock, flags);
0689 status = iuu_bulk_write(port);
0690 return;
0691 }
0692 spin_unlock_irqrestore(&priv->lock, flags);
0693
0694 dev_dbg(&port->dev, "%s - rxcmd recall\n", __func__);
0695 iuu_led_activity_off(urb);
0696 }
0697
0698 static int iuu_uart_write(struct tty_struct *tty, struct usb_serial_port *port,
0699 const u8 *buf, int count)
0700 {
0701 struct iuu_private *priv = usb_get_serial_port_data(port);
0702 unsigned long flags;
0703
0704 spin_lock_irqsave(&priv->lock, flags);
0705
0706 count = min(count, 256 - priv->writelen);
0707 if (count == 0)
0708 goto out;
0709
0710
0711 memcpy(priv->writebuf + priv->writelen, buf, count);
0712 priv->writelen += count;
0713 out:
0714 spin_unlock_irqrestore(&priv->lock, flags);
0715
0716 return count;
0717 }
0718
0719 static void read_rxcmd_callback(struct urb *urb)
0720 {
0721 struct usb_serial_port *port = urb->context;
0722 int result;
0723 int status = urb->status;
0724
0725 if (status) {
0726
0727 return;
0728 }
0729
0730 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
0731 usb_rcvbulkpipe(port->serial->dev,
0732 port->bulk_in_endpointAddress),
0733 port->read_urb->transfer_buffer, 256,
0734 iuu_uart_read_callback, port);
0735 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
0736 dev_dbg(&port->dev, "%s - submit result = %d\n", __func__, result);
0737 }
0738
0739 static int iuu_uart_on(struct usb_serial_port *port)
0740 {
0741 int status;
0742 u8 *buf;
0743
0744 buf = kmalloc(4, GFP_KERNEL);
0745
0746 if (!buf)
0747 return -ENOMEM;
0748
0749 buf[0] = IUU_UART_ENABLE;
0750 buf[1] = (u8) ((IUU_BAUD_9600 >> 8) & 0x00FF);
0751 buf[2] = (u8) (0x00FF & IUU_BAUD_9600);
0752 buf[3] = (u8) (0x0F0 & IUU_ONE_STOP_BIT) | (0x07 & IUU_PARITY_EVEN);
0753
0754 status = bulk_immediate(port, buf, 4);
0755 if (status != IUU_OPERATION_OK) {
0756 dev_dbg(&port->dev, "%s - uart_on error\n", __func__);
0757 goto uart_enable_failed;
0758 }
0759
0760 status = iuu_uart_flush(port);
0761 if (status != IUU_OPERATION_OK)
0762 dev_dbg(&port->dev, "%s - uart_flush error\n", __func__);
0763 uart_enable_failed:
0764 kfree(buf);
0765 return status;
0766 }
0767
0768
0769 static int iuu_uart_off(struct usb_serial_port *port)
0770 {
0771 int status;
0772 u8 *buf;
0773 buf = kmalloc(1, GFP_KERNEL);
0774 if (!buf)
0775 return -ENOMEM;
0776 buf[0] = IUU_UART_DISABLE;
0777
0778 status = bulk_immediate(port, buf, 1);
0779 if (status != IUU_OPERATION_OK)
0780 dev_dbg(&port->dev, "%s - uart_off error\n", __func__);
0781
0782 kfree(buf);
0783 return status;
0784 }
0785
0786 static int iuu_uart_baud(struct usb_serial_port *port, u32 baud_base,
0787 u32 *actual, u8 parity)
0788 {
0789 int status;
0790 u32 baud;
0791 u8 *dataout;
0792 u8 DataCount = 0;
0793 u8 T1Frekvens = 0;
0794 u8 T1reload = 0;
0795 unsigned int T1FrekvensHZ = 0;
0796
0797 dev_dbg(&port->dev, "%s - enter baud_base=%d\n", __func__, baud_base);
0798 dataout = kmalloc(5, GFP_KERNEL);
0799
0800 if (!dataout)
0801 return -ENOMEM;
0802
0803 baud = baud_base;
0804
0805 if (baud < 1200 || baud > 230400) {
0806 kfree(dataout);
0807 return IUU_INVALID_PARAMETER;
0808 }
0809 if (baud > 977) {
0810 T1Frekvens = 3;
0811 T1FrekvensHZ = 500000;
0812 }
0813
0814 if (baud > 3906) {
0815 T1Frekvens = 2;
0816 T1FrekvensHZ = 2000000;
0817 }
0818
0819 if (baud > 11718) {
0820 T1Frekvens = 1;
0821 T1FrekvensHZ = 6000000;
0822 }
0823
0824 if (baud > 46875) {
0825 T1Frekvens = 0;
0826 T1FrekvensHZ = 24000000;
0827 }
0828
0829 T1reload = 256 - (u8) (T1FrekvensHZ / (baud * 2));
0830
0831
0832 dataout[DataCount++] = IUU_UART_ESC;
0833
0834 dataout[DataCount++] = IUU_UART_CHANGE;
0835 dataout[DataCount++] = T1Frekvens;
0836 dataout[DataCount++] = T1reload;
0837
0838 *actual = (T1FrekvensHZ / (256 - T1reload)) / 2;
0839
0840 switch (parity & 0x0F) {
0841 case IUU_PARITY_NONE:
0842 dataout[DataCount++] = 0x00;
0843 break;
0844 case IUU_PARITY_EVEN:
0845 dataout[DataCount++] = 0x01;
0846 break;
0847 case IUU_PARITY_ODD:
0848 dataout[DataCount++] = 0x02;
0849 break;
0850 case IUU_PARITY_MARK:
0851 dataout[DataCount++] = 0x03;
0852 break;
0853 case IUU_PARITY_SPACE:
0854 dataout[DataCount++] = 0x04;
0855 break;
0856 default:
0857 kfree(dataout);
0858 return IUU_INVALID_PARAMETER;
0859 }
0860
0861 switch (parity & 0xF0) {
0862 case IUU_ONE_STOP_BIT:
0863 dataout[DataCount - 1] |= IUU_ONE_STOP_BIT;
0864 break;
0865
0866 case IUU_TWO_STOP_BITS:
0867 dataout[DataCount - 1] |= IUU_TWO_STOP_BITS;
0868 break;
0869 default:
0870 kfree(dataout);
0871 return IUU_INVALID_PARAMETER;
0872 }
0873
0874 status = bulk_immediate(port, dataout, DataCount);
0875 if (status != IUU_OPERATION_OK)
0876 dev_dbg(&port->dev, "%s - uart_off error\n", __func__);
0877 kfree(dataout);
0878 return status;
0879 }
0880
0881 static void iuu_set_termios(struct tty_struct *tty,
0882 struct usb_serial_port *port, struct ktermios *old_termios)
0883 {
0884 const u32 supported_mask = CMSPAR|PARENB|PARODD;
0885 struct iuu_private *priv = usb_get_serial_port_data(port);
0886 unsigned int cflag = tty->termios.c_cflag;
0887 int status;
0888 u32 actual;
0889 u32 parity;
0890 int csize = CS7;
0891 int baud;
0892 u32 newval = cflag & supported_mask;
0893
0894
0895 baud = tty->termios.c_ospeed;
0896
0897 dev_dbg(&port->dev, "%s - enter c_ospeed or baud=%d\n", __func__, baud);
0898
0899
0900 parity = 0;
0901 if (cflag & CMSPAR) {
0902 if (cflag & PARODD)
0903 parity |= IUU_PARITY_SPACE;
0904 else
0905 parity |= IUU_PARITY_MARK;
0906 } else if (!(cflag & PARENB)) {
0907 parity |= IUU_PARITY_NONE;
0908 csize = CS8;
0909 } else if (cflag & PARODD)
0910 parity |= IUU_PARITY_ODD;
0911 else
0912 parity |= IUU_PARITY_EVEN;
0913
0914 parity |= (cflag & CSTOPB ? IUU_TWO_STOP_BITS : IUU_ONE_STOP_BIT);
0915
0916
0917 status = iuu_uart_baud(port,
0918 baud * priv->boost / 100,
0919 &actual, parity);
0920
0921
0922
0923
0924
0925 if (old_termios)
0926 tty_termios_copy_hw(&tty->termios, old_termios);
0927 if (status != 0)
0928 return;
0929
0930 tty_encode_baud_rate(tty, baud, baud);
0931 tty->termios.c_cflag &= ~(supported_mask|CSIZE);
0932 tty->termios.c_cflag |= newval | csize;
0933 }
0934
0935 static void iuu_close(struct usb_serial_port *port)
0936 {
0937
0938
0939 iuu_uart_off(port);
0940
0941 usb_kill_urb(port->write_urb);
0942 usb_kill_urb(port->read_urb);
0943
0944 iuu_led(port, 0, 0, 0xF000, 0xFF);
0945 }
0946
0947 static void iuu_init_termios(struct tty_struct *tty)
0948 {
0949 tty->termios.c_cflag = B9600 | CS8 | CSTOPB | CREAD | PARENB | CLOCAL;
0950 tty->termios.c_ispeed = 9600;
0951 tty->termios.c_ospeed = 9600;
0952 tty->termios.c_lflag = 0;
0953 tty->termios.c_oflag = 0;
0954 tty->termios.c_iflag = 0;
0955 }
0956
0957 static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port)
0958 {
0959 struct usb_serial *serial = port->serial;
0960 struct device *dev = &port->dev;
0961 int result;
0962 int baud;
0963 u32 actual;
0964 struct iuu_private *priv = usb_get_serial_port_data(port);
0965
0966 baud = tty->termios.c_ospeed;
0967
0968 dev_dbg(dev, "%s - baud %d\n", __func__, baud);
0969 usb_clear_halt(serial->dev, port->write_urb->pipe);
0970 usb_clear_halt(serial->dev, port->read_urb->pipe);
0971
0972 priv->poll = 0;
0973
0974 #define SOUP(a, b, c, d) do { \
0975 result = usb_control_msg(port->serial->dev, \
0976 usb_sndctrlpipe(port->serial->dev, 0), \
0977 b, a, c, d, NULL, 0, 1000); \
0978 dev_dbg(dev, "0x%x:0x%x:0x%x:0x%x %d\n", a, b, c, d, result); } while (0)
0979
0980
0981
0982
0983
0984
0985 SOUP(0x03, 0x02, 0x02, 0x0);
0986
0987 iuu_led(port, 0xF000, 0xF000, 0, 0xFF);
0988 iuu_uart_on(port);
0989 if (boost < 100)
0990 boost = 100;
0991 priv->boost = boost;
0992 switch (clockmode) {
0993 case 2:
0994 priv->clk = IUU_CLK_3680000;
0995 iuu_clk(port, IUU_CLK_3680000 * boost / 100);
0996 result =
0997 iuu_uart_baud(port, baud * boost / 100, &actual,
0998 IUU_PARITY_EVEN);
0999 break;
1000 case 3:
1001 iuu_clk(port, IUU_CLK_6000000 * boost / 100);
1002 priv->clk = IUU_CLK_6000000;
1003
1004 result =
1005 iuu_uart_baud(port, 16457 * boost / 100, &actual,
1006 IUU_PARITY_EVEN);
1007 break;
1008 default:
1009 iuu_clk(port, IUU_CLK_3579000 * boost / 100);
1010 priv->clk = IUU_CLK_3579000;
1011 result =
1012 iuu_uart_baud(port, baud * boost / 100, &actual,
1013 IUU_PARITY_EVEN);
1014 }
1015
1016
1017 switch (cdmode) {
1018 case 0:
1019 iuu_cardin = 0;
1020 iuu_cardout = 0;
1021 break;
1022 case 1:
1023 iuu_cardin = TIOCM_CD;
1024 iuu_cardout = 0;
1025 break;
1026 case 2:
1027 iuu_cardin = 0;
1028 iuu_cardout = TIOCM_CD;
1029 break;
1030 case 3:
1031 iuu_cardin = TIOCM_DSR;
1032 iuu_cardout = 0;
1033 break;
1034 case 4:
1035 iuu_cardin = 0;
1036 iuu_cardout = TIOCM_DSR;
1037 break;
1038 case 5:
1039 iuu_cardin = TIOCM_CTS;
1040 iuu_cardout = 0;
1041 break;
1042 case 6:
1043 iuu_cardin = 0;
1044 iuu_cardout = TIOCM_CTS;
1045 break;
1046 case 7:
1047 iuu_cardin = TIOCM_RNG;
1048 iuu_cardout = 0;
1049 break;
1050 case 8:
1051 iuu_cardin = 0;
1052 iuu_cardout = TIOCM_RNG;
1053 }
1054
1055 iuu_uart_flush(port);
1056
1057 dev_dbg(dev, "%s - initialization done\n", __func__);
1058
1059 memset(port->write_urb->transfer_buffer, IUU_UART_RX, 1);
1060 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
1061 usb_sndbulkpipe(port->serial->dev,
1062 port->bulk_out_endpointAddress),
1063 port->write_urb->transfer_buffer, 1,
1064 read_rxcmd_callback, port);
1065 result = usb_submit_urb(port->write_urb, GFP_KERNEL);
1066 if (result) {
1067 dev_err(dev, "%s - failed submitting read urb, error %d\n", __func__, result);
1068 iuu_close(port);
1069 } else {
1070 dev_dbg(dev, "%s - rxcmd OK\n", __func__);
1071 }
1072
1073 return result;
1074 }
1075
1076
1077 static int iuu_vcc_set(struct usb_serial_port *port, unsigned int vcc)
1078 {
1079 int status;
1080 u8 *buf;
1081
1082 buf = kmalloc(5, GFP_KERNEL);
1083 if (!buf)
1084 return -ENOMEM;
1085
1086 buf[0] = IUU_SET_VCC;
1087 buf[1] = vcc & 0xFF;
1088 buf[2] = (vcc >> 8) & 0xFF;
1089 buf[3] = (vcc >> 16) & 0xFF;
1090 buf[4] = (vcc >> 24) & 0xFF;
1091
1092 status = bulk_immediate(port, buf, 5);
1093 kfree(buf);
1094
1095 if (status != IUU_OPERATION_OK)
1096 dev_dbg(&port->dev, "%s - vcc error status = %2x\n", __func__, status);
1097 else
1098 dev_dbg(&port->dev, "%s - vcc OK !\n", __func__);
1099
1100 return status;
1101 }
1102
1103
1104
1105
1106
1107 static ssize_t vcc_mode_show(struct device *dev,
1108 struct device_attribute *attr, char *buf)
1109 {
1110 struct usb_serial_port *port = to_usb_serial_port(dev);
1111 struct iuu_private *priv = usb_get_serial_port_data(port);
1112
1113 return sprintf(buf, "%d\n", priv->vcc);
1114 }
1115
1116 static ssize_t vcc_mode_store(struct device *dev,
1117 struct device_attribute *attr, const char *buf, size_t count)
1118 {
1119 struct usb_serial_port *port = to_usb_serial_port(dev);
1120 struct iuu_private *priv = usb_get_serial_port_data(port);
1121 unsigned long v;
1122
1123 if (kstrtoul(buf, 10, &v)) {
1124 dev_err(dev, "%s - vcc_mode: %s is not a unsigned long\n",
1125 __func__, buf);
1126 goto fail_store_vcc_mode;
1127 }
1128
1129 dev_dbg(dev, "%s: setting vcc_mode = %ld\n", __func__, v);
1130
1131 if ((v != 3) && (v != 5)) {
1132 dev_err(dev, "%s - vcc_mode %ld is invalid\n", __func__, v);
1133 } else {
1134 iuu_vcc_set(port, v);
1135 priv->vcc = v;
1136 }
1137 fail_store_vcc_mode:
1138 return count;
1139 }
1140 static DEVICE_ATTR_RW(vcc_mode);
1141
1142 static int iuu_create_sysfs_attrs(struct usb_serial_port *port)
1143 {
1144 return device_create_file(&port->dev, &dev_attr_vcc_mode);
1145 }
1146
1147 static int iuu_remove_sysfs_attrs(struct usb_serial_port *port)
1148 {
1149 device_remove_file(&port->dev, &dev_attr_vcc_mode);
1150 return 0;
1151 }
1152
1153
1154
1155
1156
1157 static struct usb_serial_driver iuu_device = {
1158 .driver = {
1159 .owner = THIS_MODULE,
1160 .name = "iuu_phoenix",
1161 },
1162 .id_table = id_table,
1163 .num_ports = 1,
1164 .num_bulk_in = 1,
1165 .num_bulk_out = 1,
1166 .bulk_in_size = 512,
1167 .bulk_out_size = 512,
1168 .open = iuu_open,
1169 .close = iuu_close,
1170 .write = iuu_uart_write,
1171 .read_bulk_callback = iuu_uart_read_callback,
1172 .tiocmget = iuu_tiocmget,
1173 .tiocmset = iuu_tiocmset,
1174 .set_termios = iuu_set_termios,
1175 .init_termios = iuu_init_termios,
1176 .port_probe = iuu_port_probe,
1177 .port_remove = iuu_port_remove,
1178 };
1179
1180 static struct usb_serial_driver * const serial_drivers[] = {
1181 &iuu_device, NULL
1182 };
1183
1184 module_usb_serial_driver(serial_drivers, id_table);
1185
1186 MODULE_AUTHOR("Alain Degreffe eczema@ecze.com");
1187
1188 MODULE_DESCRIPTION(DRIVER_DESC);
1189 MODULE_LICENSE("GPL");
1190
1191 module_param(xmas, bool, 0644);
1192 MODULE_PARM_DESC(xmas, "Xmas colors enabled or not");
1193
1194 module_param(boost, int, 0644);
1195 MODULE_PARM_DESC(boost, "Card overclock boost (in percent 100-500)");
1196
1197 module_param(clockmode, int, 0644);
1198 MODULE_PARM_DESC(clockmode, "Card clock mode (1=3.579 MHz, 2=3.680 MHz, "
1199 "3=6 Mhz)");
1200
1201 module_param(cdmode, int, 0644);
1202 MODULE_PARM_DESC(cdmode, "Card detect mode (0=none, 1=CD, 2=!CD, 3=DSR, "
1203 "4=!DSR, 5=CTS, 6=!CTS, 7=RING, 8=!RING)");
1204
1205 module_param(vcc_default, int, 0644);
1206 MODULE_PARM_DESC(vcc_default, "Set default VCC (either 3 for 3.3V or 5 "
1207 "for 5V). Default to 5.");