| @@ -27,8 +27,8 @@ | ||
| 27 | 27 | #define USB_UOT100_VENDOR_ID 0x10c4 |
| 28 | 28 | #define USB_UOT100_PRODUCT_ID 0x2030 |
| 29 | 29 | |
| 30 | -#define SET_REG_DELAY 10 | |
| 31 | -#define UOT100_TS_BUF_SIZE 2048 | |
| 30 | +#define SET_REG_DELAY 5 /* 5ms */ | |
| 31 | +#define UOT100_TS_BUF_SIZE 188*200 | |
| 32 | 32 | |
| 33 | 33 | static struct usb_device_id uot100_table [] = { |
| 34 | 34 | /* 00 */ { USB_DEVICE(USB_UOT100_VENDOR_ID, USB_UOT100_PRODUCT_ID) }, |
| @@ -52,41 +52,34 @@ | ||
| 52 | 52 | unsigned char reg[20]; |
| 53 | 53 | int channel; /* curent channel */ |
| 54 | 54 | struct kfifo *tsfifo; |
| 55 | + unsigned char fifo_copy_buf[1024]; | |
| 56 | + unsigned char last_buff[188]; | |
| 55 | 57 | spinlock_t tsfifo_lock; |
| 56 | 58 | atomic_t timerinfo; |
| 57 | 59 | struct timer_list timer; |
| 58 | 60 | }; |
| 59 | 61 | |
| 60 | -#define TS_SIZE 192 | |
| 61 | -struct usb_uot100_ts_info { | |
| 62 | - unsigned char data[192]; | |
| 63 | -}; | |
| 62 | +static struct usb_driver uot100_driver; | |
| 64 | 63 | |
| 65 | - | |
| 66 | - | |
| 67 | 64 | #define to_uot100_dev(d) container_of(d, struct usb_uot100, kref) |
| 68 | - | |
| 69 | -static struct usb_driver uot100_driver; | |
| 70 | - | |
| 71 | - | |
| 72 | -int uot100_non_block_read_ts(struct usb_uot100 *dev); | |
| 73 | - | |
| 74 | - | |
| 75 | 65 | /*********************/ |
| 76 | 66 | /* internal function */ |
| 77 | 67 | /*********************/ |
| 78 | 68 | |
| 79 | -static void uot100_timer_handler(unsigned long ptr) | |
| 69 | + | |
| 70 | +void print_buffer(unsigned char *p, int length) | |
| 80 | 71 | { |
| 81 | - struct usb_uot100 *dev = (struct usb_uot100 *) ptr; | |
| 82 | - dbg("timer\n"); | |
| 83 | - uot100_non_block_read_ts(dev); | |
| 84 | - uot100_non_block_read_ts(dev); | |
| 85 | - uot100_non_block_read_ts(dev); | |
| 86 | - uot100_non_block_read_ts(dev); | |
| 87 | - uot100_non_block_read_ts(dev); | |
| 88 | - dev->timer.expires = jiffies + HZ/2; | |
| 89 | - add_timer(&dev->timer); | |
| 72 | +#ifdef DEBUG | |
| 73 | + int i; | |
| 74 | +#define HEX_OFFSET "\ | |
| 75 | + +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F" | |
| 76 | + printk(HEX_OFFSET); | |
| 77 | + for (i=0; i<length; i++) { | |
| 78 | + if (i % 16 == 0) printk("\n%04X-%04X:", i, i+15); | |
| 79 | + printk(" %02X", *(p+i)); | |
| 80 | + } | |
| 81 | + printk(" len=%d\n", length); | |
| 82 | +#endif //DEBUG | |
| 90 | 83 | } |
| 91 | 84 | |
| 92 | 85 |
| @@ -114,12 +107,12 @@ | ||
| 114 | 107 | return; |
| 115 | 108 | } |
| 116 | 109 | |
| 117 | -#define REG_BUF_SIZE 5 | |
| 110 | +#define WRITE_REG_SIZE 5 | |
| 118 | 111 | int uot100_write_reg(struct usb_uot100 *dev, u8 reg1, u8 reg2, u8 reg3, u8 reg4, u8 reg5 ) |
| 119 | 112 | { |
| 120 | 113 | u8 *buf=NULL; |
| 121 | 114 | struct urb *urb=NULL; |
| 122 | - int len = REG_BUF_SIZE, retval; | |
| 115 | + int len = WRITE_REG_SIZE, retval; | |
| 123 | 116 | |
| 124 | 117 | //dbg("uot100_write_reg() reg1=0x%02x reg2=0x%02x reg3=0x%02x reg4=0x%02x reg5=0x%02x", |
| 125 | 118 | // reg1, reg2, reg3, reg4, reg5); |
| @@ -129,7 +122,7 @@ | ||
| 129 | 122 | retval = -ENOMEM; |
| 130 | 123 | goto error; |
| 131 | 124 | } |
| 132 | - buf = usb_buffer_alloc(dev->udev, REG_BUF_SIZE, GFP_KERNEL, &urb->transfer_dma); | |
| 125 | + buf = usb_buffer_alloc(dev->udev, WRITE_REG_SIZE, GFP_KERNEL, &urb->transfer_dma); | |
| 133 | 126 | if(!buf){ |
| 134 | 127 | retval = -ENOMEM; |
| 135 | 128 | goto error; |
| @@ -141,7 +134,7 @@ | ||
| 141 | 134 | buf[4] = reg5; |
| 142 | 135 | |
| 143 | 136 | usb_fill_bulk_urb(urb, dev->udev, usb_sndbulkpipe(dev->udev, dev->bulk_out_endpoint_addr), |
| 144 | - buf, REG_BUF_SIZE, (usb_complete_t)uot100_write_bulk_callback, dev); | |
| 137 | + buf, WRITE_REG_SIZE, (usb_complete_t)uot100_write_bulk_callback, dev); | |
| 145 | 138 | urb->transfer_flags = 0x2; |
| 146 | 139 | |
| 147 | 140 | retval = usb_submit_urb(urb, GFP_KERNEL); |
| @@ -220,12 +213,45 @@ | ||
| 220 | 213 | return retval; |
| 221 | 214 | } |
| 222 | 215 | |
| 216 | +#define READ_TS_SIZE 197 | |
| 217 | +static void uot100_non_block_read_ts_callback(struct urb *urb, struct pt_regs *regs) | |
| 218 | +{ | |
| 219 | + struct usb_uot100 *dev = urb->context; | |
| 220 | + int retval = 0; | |
| 221 | + | |
| 222 | + if(urb->status && | |
| 223 | + !(urb->status == -ENOENT || | |
| 224 | + urb->status == -ECONNRESET || | |
| 225 | + urb->status == -ESHUTDOWN)){ | |
| 226 | + err("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status); | |
| 227 | + memset(&dev->reg, 0x00, READ_REG_SIZE); | |
| 228 | + } | |
| 229 | + else{ | |
| 230 | +// print_buffer(dev->bulk_in_buffer, urb->actual_length); | |
| 231 | + | |
| 232 | + if(dev->bulk_in_buffer[0] == 0x47){ /* sanity mpeg header check */ | |
| 233 | + if(memcmp(dev->bulk_in_buffer, dev->last_buff, 188) != 0) /* duplicate check */ | |
| 234 | + retval = kfifo_put(dev->tsfifo, dev->bulk_in_buffer, 188); | |
| 235 | + if(retval != 188) | |
| 236 | + info("fifo full %d %d", retval, kfifo_len(dev->tsfifo)); | |
| 237 | + else | |
| 238 | + info("duplicate %d", __kfifo_len(dev->tsfifo)); | |
| 239 | + | |
| 240 | + memcpy(dev->last_buff, dev->bulk_in_buffer, 188); | |
| 241 | + } | |
| 242 | + } | |
| 243 | + | |
| 244 | + //atode | |
| 245 | + //usb_buffer_free(urb->dev, urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma); | |
| 246 | +} | |
| 247 | + | |
| 248 | + | |
| 223 | 249 | int uot100_non_block_read_ts(struct usb_uot100 *dev) |
| 224 | 250 | { |
| 225 | 251 | int retval = 0; |
| 226 | 252 | struct urb *urb=NULL; |
| 227 | 253 | |
| 228 | - dbg("uot100_non_block_read_reg %d", READ_REG_SIZE); | |
| 254 | + dbg("uot100_non_block_read_ts"); | |
| 229 | 255 | urb = usb_alloc_urb(0, GFP_KERNEL); |
| 230 | 256 | if(!urb){ |
| 231 | 257 | retval = -ENOMEM; |
| @@ -233,8 +259,8 @@ | ||
| 233 | 259 | } |
| 234 | 260 | |
| 235 | 261 | usb_fill_bulk_urb(urb, dev->udev, usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpoint_addr), |
| 236 | - dev->bulk_in_buffer, 0xc5, (usb_complete_t)uot100_non_block_read_reg_callback, dev); | |
| 237 | - urb->transfer_flags = 0x3; | |
| 262 | + dev->bulk_in_buffer, READ_TS_SIZE, (usb_complete_t)uot100_non_block_read_ts_callback, dev); | |
| 263 | + urb->transfer_flags = 0x3; | |
| 238 | 264 | |
| 239 | 265 | retval = usb_submit_urb(urb, GFP_KERNEL); |
| 240 | 266 | if(retval){ |
| @@ -250,7 +276,6 @@ | ||
| 250 | 276 | return retval; |
| 251 | 277 | } |
| 252 | 278 | |
| 253 | - | |
| 254 | 279 | /* set configuration register |
| 255 | 280 | * |
| 256 | 281 | * send VENDOR DEVICE packet |
| @@ -305,7 +330,7 @@ | ||
| 305 | 330 | /* get register addr:2bytes data:1byte */ |
| 306 | 331 | int uot100_get_reg(struct usb_uot100 *dev, u16 addr, u8 *data ) |
| 307 | 332 | { |
| 308 | - int len = REG_BUF_SIZE; | |
| 333 | + int len = WRITE_REG_SIZE; | |
| 309 | 334 | int retval; |
| 310 | 335 | |
| 311 | 336 | dbg("uot100_get_reg() addr=0x%04x",addr); |
| @@ -319,7 +344,7 @@ | ||
| 319 | 344 | 0xff); |
| 320 | 345 | |
| 321 | 346 | dbg("uot100_set_reg() retval=%d len=%d", retval, len); |
| 322 | - if(retval != 0 || len < REG_BUF_SIZE) | |
| 347 | + if(retval != 0 || len < WRITE_REG_SIZE) | |
| 323 | 348 | return -EFAULT; |
| 324 | 349 | |
| 325 | 350 | /* delay */ |
| @@ -396,37 +421,14 @@ | ||
| 396 | 421 | return 0; |
| 397 | 422 | } |
| 398 | 423 | |
| 399 | -static ssize_t uot100_ts_read(struct usb_uot100 *dev, struct usb_uot100_ts_info *ts) | |
| 424 | +static void uot100_timer_handler(unsigned long ptr) | |
| 400 | 425 | { |
| 401 | - int retval = 0; | |
| 402 | - size_t count; | |
| 403 | - | |
| 404 | - dbg("read count %d", count); | |
| 405 | - retval = usb_bulk_msg(dev->udev, | |
| 406 | - usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpoint_addr), | |
| 407 | - dev->bulk_in_buffer, | |
| 408 | - min(dev->bulk_in_size, count), | |
| 409 | - &count, HZ*10); | |
| 410 | - | |
| 411 | - kfifo_put(dev->tsfifo, dev->bulk_in_buffer, count); | |
| 412 | - | |
| 413 | - if(!retval){ | |
| 414 | -#ifdef DEBUG | |
| 415 | - unsigned char *buf = dev->bulk_in_buffer; | |
| 416 | - info("read len:%d %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", | |
| 417 | - count, | |
| 418 | - *buf,*(buf+1),*(buf+2),*(buf+3),*(buf+4), | |
| 419 | - *(buf+5),*(buf+6),*(buf+7),*(buf+8),*(buf+9), | |
| 420 | - *(buf+10),*(buf+11),*(buf+12),*(buf+13),*(buf+14), | |
| 421 | - *(buf+15),*(buf+16),*(buf+17),*(buf+18),*(buf+19) | |
| 422 | - ); | |
| 423 | -#endif | |
| 424 | - retval = count; | |
| 425 | - }else{ | |
| 426 | - dbg("can't read\n"); | |
| 427 | - } | |
| 428 | - | |
| 429 | - return retval; | |
| 426 | + struct usb_uot100 *dev = (struct usb_uot100 *) ptr; | |
| 427 | + dbg("timer"); | |
| 428 | + uot100_non_block_read_ts(dev); | |
| 429 | + uot100_non_block_read_ts(dev); | |
| 430 | + dev->timer.expires = jiffies + HZ/10; | |
| 431 | + add_timer(&dev->timer); | |
| 430 | 432 | } |
| 431 | 433 | |
| 432 | 434 | /******************/ |
| @@ -547,7 +549,7 @@ | ||
| 547 | 549 | uot100_write_reg(dev, 0x02, 0x00, 0x00, 0x00, 0x00); |
| 548 | 550 | } |
| 549 | 551 | |
| 550 | - printk(KERN_INFO "add timer\n"); | |
| 552 | + dbg("add timer"); | |
| 551 | 553 | dev->timer.expires = jiffies + 10*HZ; |
| 552 | 554 | add_timer(&dev->timer); |
| 553 | 555 |
| @@ -603,7 +605,7 @@ | ||
| 603 | 605 | |
| 604 | 606 | file->private_data = dev; |
| 605 | 607 | exit: |
| 606 | - dbg("open %d\n", retval); | |
| 608 | + dbg("open %d", retval); | |
| 607 | 609 | return retval; |
| 608 | 610 | } |
| 609 | 611 |
| @@ -624,11 +626,12 @@ | ||
| 624 | 626 | static ssize_t uot100_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) |
| 625 | 627 | { |
| 626 | 628 | struct usb_uot100 *dev; |
| 627 | - int retval = 0; | |
| 628 | - | |
| 629 | + int retval = 0, i = 0; | |
| 630 | + | |
| 629 | 631 | dev = (struct usb_uot100 *) file->private_data; |
| 630 | 632 | |
| 631 | 633 | dbg("read count %d", count); |
| 634 | +#if 0 | |
| 632 | 635 | retval = usb_bulk_msg(dev->udev, |
| 633 | 636 | usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpoint_addr), |
| 634 | 637 | dev->bulk_in_buffer, |
| @@ -636,28 +639,31 @@ | ||
| 636 | 639 | &count, HZ*10); |
| 637 | 640 | |
| 638 | 641 | kfifo_put(dev->tsfifo, dev->bulk_in_buffer, count); |
| 639 | - kfifo_get(dev->tsfifo, dev->bulk_in_buffer, count); | |
| 642 | +#endif | |
| 643 | + retval = kfifo_get(dev->tsfifo, dev->fifo_copy_buf, 188); | |
| 640 | 644 | |
| 641 | - if(!retval){ | |
| 642 | - if(copy_to_user(buffer, dev->bulk_in_buffer, count)) | |
| 645 | + if(retval == 0){ | |
| 646 | + for(i=0; i<100; i++){ | |
| 647 | + msleep(50); | |
| 648 | + if(__kfifo_len(dev->tsfifo) >= 188) | |
| 649 | + retval = kfifo_get(dev->tsfifo, dev->fifo_copy_buf, 188); | |
| 650 | + } | |
| 651 | + } | |
| 652 | + i = kfifo_len(dev->tsfifo); | |
| 653 | + | |
| 654 | + if(retval > 0){ | |
| 655 | + if(copy_to_user(buffer, dev->fifo_copy_buf, retval)) | |
| 643 | 656 | retval = -EFAULT; |
| 644 | 657 | else{ |
| 645 | 658 | #ifdef DEBUG |
| 646 | - unsigned char *buf = dev->bulk_in_buffer; | |
| 647 | - info("read len:%d %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", | |
| 648 | - count, | |
| 649 | - *buf,*(buf+1),*(buf+2),*(buf+3),*(buf+4), | |
| 650 | - *(buf+5),*(buf+6),*(buf+7),*(buf+8),*(buf+9), | |
| 651 | - *(buf+10),*(buf+11),*(buf+12),*(buf+13),*(buf+14), | |
| 652 | - *(buf+15),*(buf+16),*(buf+17),*(buf+18),*(buf+19) | |
| 653 | - ); | |
| 659 | + print_buffer(dev->fifo_copy_buf, retval); | |
| 654 | 660 | #endif |
| 655 | - retval = count; | |
| 656 | 661 | } |
| 657 | 662 | }else{ |
| 658 | - dbg("can't read\n"); | |
| 663 | + info("can't read()"); | |
| 659 | 664 | } |
| 660 | 665 | |
| 666 | + info("read count %d %d %d", count, retval, i ); | |
| 661 | 667 | return retval; |
| 662 | 668 | } |
| 663 | 669 |
| @@ -805,7 +811,7 @@ | ||
| 805 | 811 | buffer_size = endpoint->wMaxPacketSize; |
| 806 | 812 | dev->bulk_in_size = buffer_size; |
| 807 | 813 | dev->bulk_in_endpoint_addr = endpoint->bEndpointAddress; |
| 808 | - dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL); | |
| 814 | + dev->bulk_in_buffer = kmalloc(buffer_size*4, GFP_KERNEL); | |
| 809 | 815 | if(!dev->bulk_in_buffer){ |
| 810 | 816 | err("Could not allocate bulk_in_buffer"); |
| 811 | 817 | goto error; |
| @@ -844,7 +850,7 @@ | ||
| 844 | 850 | dev->tsfifo = kfifo_alloc(UOT100_TS_BUF_SIZE, GFP_KERNEL, |
| 845 | 851 | &dev->tsfifo_lock); |
| 846 | 852 | if (IS_ERR(dev->tsfifo)) { |
| 847 | - printk(KERN_ERR "kfifo_alloc failed\n"); | |
| 853 | + printk(KERN_ERR "kfifo_alloc failed"); | |
| 848 | 854 | return PTR_ERR(dev->tsfifo); |
| 849 | 855 | } |
| 850 | 856 |