• R/O
  • SSH
  • HTTPS

uot: Commit


Commit MetaInfo

Revision22 (tree)
Time2008-04-14 13:09:02
Authoreggman

Log Message

modify polling funciton

Change Summary

Incremental Difference

--- driver/trunk/uot100.c (revision 21)
+++ driver/trunk/uot100.c (revision 22)
@@ -27,8 +27,8 @@
2727 #define USB_UOT100_VENDOR_ID 0x10c4
2828 #define USB_UOT100_PRODUCT_ID 0x2030
2929
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
3232
3333 static struct usb_device_id uot100_table [] = {
3434 /* 00 */ { USB_DEVICE(USB_UOT100_VENDOR_ID, USB_UOT100_PRODUCT_ID) },
@@ -52,41 +52,34 @@
5252 unsigned char reg[20];
5353 int channel; /* curent channel */
5454 struct kfifo *tsfifo;
55+ unsigned char fifo_copy_buf[1024];
56+ unsigned char last_buff[188];
5557 spinlock_t tsfifo_lock;
5658 atomic_t timerinfo;
5759 struct timer_list timer;
5860 };
5961
60-#define TS_SIZE 192
61-struct usb_uot100_ts_info {
62- unsigned char data[192];
63-};
62+static struct usb_driver uot100_driver;
6463
65-
66-
6764 #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-
7565 /*********************/
7666 /* internal function */
7767 /*********************/
7868
79-static void uot100_timer_handler(unsigned long ptr)
69+
70+void print_buffer(unsigned char *p, int length)
8071 {
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
9083 }
9184
9285
@@ -114,12 +107,12 @@
114107 return;
115108 }
116109
117-#define REG_BUF_SIZE 5
110+#define WRITE_REG_SIZE 5
118111 int uot100_write_reg(struct usb_uot100 *dev, u8 reg1, u8 reg2, u8 reg3, u8 reg4, u8 reg5 )
119112 {
120113 u8 *buf=NULL;
121114 struct urb *urb=NULL;
122- int len = REG_BUF_SIZE, retval;
115+ int len = WRITE_REG_SIZE, retval;
123116
124117 //dbg("uot100_write_reg() reg1=0x%02x reg2=0x%02x reg3=0x%02x reg4=0x%02x reg5=0x%02x",
125118 // reg1, reg2, reg3, reg4, reg5);
@@ -129,7 +122,7 @@
129122 retval = -ENOMEM;
130123 goto error;
131124 }
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);
133126 if(!buf){
134127 retval = -ENOMEM;
135128 goto error;
@@ -141,7 +134,7 @@
141134 buf[4] = reg5;
142135
143136 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);
145138 urb->transfer_flags = 0x2;
146139
147140 retval = usb_submit_urb(urb, GFP_KERNEL);
@@ -220,12 +213,45 @@
220213 return retval;
221214 }
222215
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+
223249 int uot100_non_block_read_ts(struct usb_uot100 *dev)
224250 {
225251 int retval = 0;
226252 struct urb *urb=NULL;
227253
228- dbg("uot100_non_block_read_reg %d", READ_REG_SIZE);
254+ dbg("uot100_non_block_read_ts");
229255 urb = usb_alloc_urb(0, GFP_KERNEL);
230256 if(!urb){
231257 retval = -ENOMEM;
@@ -233,8 +259,8 @@
233259 }
234260
235261 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;
238264
239265 retval = usb_submit_urb(urb, GFP_KERNEL);
240266 if(retval){
@@ -250,7 +276,6 @@
250276 return retval;
251277 }
252278
253-
254279 /* set configuration register
255280 *
256281 * send VENDOR DEVICE packet
@@ -305,7 +330,7 @@
305330 /* get register addr:2bytes data:1byte */
306331 int uot100_get_reg(struct usb_uot100 *dev, u16 addr, u8 *data )
307332 {
308- int len = REG_BUF_SIZE;
333+ int len = WRITE_REG_SIZE;
309334 int retval;
310335
311336 dbg("uot100_get_reg() addr=0x%04x",addr);
@@ -319,7 +344,7 @@
319344 0xff);
320345
321346 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)
323348 return -EFAULT;
324349
325350 /* delay */
@@ -396,37 +421,14 @@
396421 return 0;
397422 }
398423
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)
400425 {
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);
430432 }
431433
432434 /******************/
@@ -547,7 +549,7 @@
547549 uot100_write_reg(dev, 0x02, 0x00, 0x00, 0x00, 0x00);
548550 }
549551
550- printk(KERN_INFO "add timer\n");
552+ dbg("add timer");
551553 dev->timer.expires = jiffies + 10*HZ;
552554 add_timer(&dev->timer);
553555
@@ -603,7 +605,7 @@
603605
604606 file->private_data = dev;
605607 exit:
606- dbg("open %d\n", retval);
608+ dbg("open %d", retval);
607609 return retval;
608610 }
609611
@@ -624,11 +626,12 @@
624626 static ssize_t uot100_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
625627 {
626628 struct usb_uot100 *dev;
627- int retval = 0;
628-
629+ int retval = 0, i = 0;
630+
629631 dev = (struct usb_uot100 *) file->private_data;
630632
631633 dbg("read count %d", count);
634+#if 0
632635 retval = usb_bulk_msg(dev->udev,
633636 usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpoint_addr),
634637 dev->bulk_in_buffer,
@@ -636,28 +639,31 @@
636639 &count, HZ*10);
637640
638641 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);
640644
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))
643656 retval = -EFAULT;
644657 else{
645658 #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);
654660 #endif
655- retval = count;
656661 }
657662 }else{
658- dbg("can't read\n");
663+ info("can't read()");
659664 }
660665
666+ info("read count %d %d %d", count, retval, i );
661667 return retval;
662668 }
663669
@@ -805,7 +811,7 @@
805811 buffer_size = endpoint->wMaxPacketSize;
806812 dev->bulk_in_size = buffer_size;
807813 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);
809815 if(!dev->bulk_in_buffer){
810816 err("Could not allocate bulk_in_buffer");
811817 goto error;
@@ -844,7 +850,7 @@
844850 dev->tsfifo = kfifo_alloc(UOT100_TS_BUF_SIZE, GFP_KERNEL,
845851 &dev->tsfifo_lock);
846852 if (IS_ERR(dev->tsfifo)) {
847- printk(KERN_ERR "kfifo_alloc failed\n");
853+ printk(KERN_ERR "kfifo_alloc failed");
848854 return PTR_ERR(dev->tsfifo);
849855 }
850856
Show on old repository browser