Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 8 Jan 2011 14:49:59 -0500
From:      Andrew Gallatin <gallatin@gmail.com>
To:        freebsd-multimedia@freebsd.org
Subject:   Re: em28xx?
Message-ID:  <AANLkTimOtABnMgkNn9jAiThWmZ9Ec3pNQ%2Bq_GR_1Ae4h@mail.gmail.com>
In-Reply-To: <AANLkTimhh9qt1mwMk0NJ0_XP2W14azixpKD=fZYYpOpi@mail.gmail.com>
References:  <AANLkTimhh9qt1mwMk0NJ0_XP2W14azixpKD=fZYYpOpi@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
On Sat, Jan 8, 2011 at 2:11 PM, Andrew Gallatin <gallatin@gmail.com> wrote:

> (see appended output).  Has anybody tried  this before?  What are the
> general steps for porting a driver?

So I hacked on it for a while (see attached dirty patch) and I've got
the em28xx device seen.  But it dies in v4l2_device_register():
(gdb) bt
#0  0x000000000040aeba in v4l2_device_register (dev=0x8011bf4b0,
v4l2_dev=0x801202630)
    at /tank/ports/multimedia/webcamd/work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/v4l2-device.c:47
#1  0x000000000046c933 in em28xx_usb_probe (interface=0x8011bf4b0, id=0x6d43c8)
    at /tank/ports/multimedia/webcamd/work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-cards.c:2908
#2  0x00000000004084f2 in usb_linux_probe_p (p_bus=0x758d50,
p_addr=0x758d54, p_index=0x758d58) at
/tank/ports/multimedia/webcamd/work.bak/webcamd-0.1.18/kernel/linux_usb.c:415
#3  0x00000000004f04ff in main (argc=-5792, argv=0x7fffffffea80) at
webcamd.c:482
(gdb) frame 0
#0  0x000000000040aeba in v4l2_device_register (dev=0x8011bf4b0,
v4l2_dev=0x801202630)
    at /tank/ports/multimedia/webcamd/work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/v4l2-device.c:47
47                      snprintf(v4l2_dev->name,
sizeof(v4l2_dev->name), "%s %s",
(gdb) l
42                      return 0;
43              }
44
45              /* Set name to driver name + device name if it is empty. */
46              if (!v4l2_dev->name[0])
47                      snprintf(v4l2_dev->name,
sizeof(v4l2_dev->name), "%s %s",
48                              dev->driver->name, dev_name(dev));
49              if (dev_get_drvdata(dev))
50                      v4l2_warn(v4l2_dev, "Non-NULL drvdata on register\n");
51              dev_set_drvdata(dev, v4l2_dev);
(gdb) p dev->driver->name
Cannot access memory at address 0x0
(gdb) p dev->driver
$2 = (struct device_driver *) 0x0
(gdb) p dev
$3 = (struct device *) 0x8011bf4b0


Advice?

Thanks,

Drew

[-- Attachment #2 --]
Only in work.bak: .PLIST.flattened
Only in work.bak: .PLIST.mktmp
Only in work.bak: .PLIST.objdump
Only in work.bak: .PLIST.setuid
Only in work.bak: .PLIST.writable
Only in work.bak: .build_done.webcamd._usr_local
Only in work.bak: .configure_done.webcamd._usr_local
Only in work.bak: .install_done.webcamd._usr_local
Only in work.bak: webcamd
diff -ur work/webcamd-0.1.18/Makefile work.bak/webcamd-0.1.18/Makefile
--- work/webcamd-0.1.18/Makefile	2011-01-08 14:43:09.147795917 -0500
+++ work.bak/webcamd-0.1.18/Makefile	2011-01-08 14:28:59.311054655 -0500
@@ -316,13 +316,13 @@
 #
 
 #SRCS+= em28xx-audio.c
-#SRCS+= em28xx-cards.c
-#SRCS+= em28xx-core.c
-#SRCS+= em28xx-dvb.c
-#SRCS+= em28xx-i2c.c
-#SRCS+= em28xx-input.c
-#SRCS+= em28xx-vbi.c
-#SRCS+= em28xx-video.c
+SRCS+= em28xx-cards.c
+SRCS+= em28xx-core.c
+SRCS+= em28xx-dvb.c
+SRCS+= em28xx-i2c.c
+SRCS+= em28xx-input.c
+SRCS+= em28xx-vbi.c
+SRCS+= em28xx-video.c
 
 #
 # hdpvr
Only in work.bak/webcamd-0.1.18: a.out
Only in work.bak/webcamd-0.1.18: au0828.4.gz
Only in work.bak/webcamd-0.1.18: benq.4.gz
Only in work.bak/webcamd-0.1.18: bttv.4.gz
Only in work.bak/webcamd-0.1.18: conex.4.gz
Only in work.bak/webcamd-0.1.18: cpiax.4.gz
Only in work.bak/webcamd-0.1.18: cx23885.4.gz
Only in work.bak/webcamd-0.1.18: cx88.4.gz
Only in work.bak/webcamd-0.1.18: em28xx.4.gz
Only in work.bak/webcamd-0.1.18: et61x251.4.gz
Only in work.bak/webcamd-0.1.18: finepix.4.gz
Only in work.bak/webcamd-0.1.18: gl860.4.gz
Only in work.bak/webcamd-0.1.18: ibmcam.4.gz
Only in work.bak/webcamd-0.1.18: ivtv.4.gz
Only in work.bak/webcamd-0.1.18: jeilinj.4.gz
Only in work.bak/webcamd-0.1.18: m5602.4.gz
Only in work.bak/webcamd-0.1.18: mars.4.gz
Only in work.bak/webcamd-0.1.18: meye.4.gz
Only in work.bak/webcamd-0.1.18: mr97310a.4.gz
Only in work.bak/webcamd-0.1.18: ov519.4.gz
Only in work.bak/webcamd-0.1.18: ov534.4.gz
Only in work.bak/webcamd-0.1.18: pacxxx.4.gz
Only in work.bak/webcamd-0.1.18: pvrusb2.4.gz
Only in work.bak/webcamd-0.1.18: pwc.4.gz
Only in work.bak/webcamd-0.1.18: saa7134.4.gz
Only in work.bak/webcamd-0.1.18: saa7164.4.gz
Only in work.bak/webcamd-0.1.18: se401.4.gz
Only in work.bak/webcamd-0.1.18: si470x.4.gz
Only in work.bak/webcamd-0.1.18: sn9c102.4.gz
Only in work.bak/webcamd-0.1.18: sn9c20x.4.gz
Only in work.bak/webcamd-0.1.18: sonixj.4.gz
Only in work.bak/webcamd-0.1.18: spca5xx.4.gz
Only in work.bak/webcamd-0.1.18: sq905c.4.gz
Only in work.bak/webcamd-0.1.18: stk014.4.gz
Only in work.bak/webcamd-0.1.18: stv06xx.4.gz
Only in work.bak/webcamd-0.1.18: sunplus.4.gz
Only in work.bak/webcamd-0.1.18: t613.4.gz
Only in work.bak/webcamd-0.1.18: tv8532.4.gz
Only in work.bak/webcamd-0.1.18: usbvision.4.gz
diff -ur work/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-core.c work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-core.c
--- work/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-core.c	2010-07-01 23:38:54.000000000 -0400
+++ work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-core.c	2011-01-08 14:31:25.512793982 -0500
@@ -973,9 +973,11 @@
 	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
 		urb = dev->isoc_ctl.urb[i];
 		if (urb) {
+#if 0
 			if (!irqs_disabled())
 				usb_kill_urb(urb);
 			else
+#endif
 				usb_unlink_urb(urb);
 
 			if (dev->isoc_ctl.transfer_buffer[i]) {
diff -ur work/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-dvb.c work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-dvb.c
--- work/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-dvb.c	2010-07-01 23:38:54.000000000 -0400
+++ work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-dvb.c	2011-01-08 14:30:11.155799727 -0500
@@ -504,8 +504,10 @@
 	/* init frontend */
 	switch (dev->model) {
 	case EM2874_LEADERSHIP_ISDBT:
+#if 0
 		dvb->frontend = dvb_attach(s921_attach,
 				&sharp_isdbt, &dev->i2c_adap);
+#endif
 
 		if (!dvb->frontend) {
 			result = -EINVAL;
diff -ur work/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-input.c work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-input.c
--- work/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-input.c	2010-07-01 23:38:54.000000000 -0400
+++ work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-input.c	2011-01-08 14:35:46.992025560 -0500
@@ -335,6 +335,7 @@
 		dprintk("%s: toggle: %d, count: %d, key 0x%02x%02x\n", __func__,
 			poll_result.toggle_bit, poll_result.read_count,
 			poll_result.rc_address, poll_result.rc_data[0]);
+#if 0
 		if (ir->full_code)
 			ir_keydown(ir->input,
 				   poll_result.rc_address << 8 |
@@ -344,7 +345,7 @@
 			ir_keydown(ir->input,
 				   poll_result.rc_data[0],
 				   poll_result.toggle_bit);
-
+#endif
 		if (ir->dev->chip_id == CHIP_ID_EM2874)
 			/* The em2874 clears the readcount field every time the
 			   register is read.  The em2860/2880 datasheet says that it
@@ -382,7 +383,7 @@
 #else
 	INIT_DELAYED_WORK(&ir->work, em28xx_ir_work);
 #endif
-	schedule_delayed_work(&ir->work, 0);
+	//schedule_delayed_work(&ir->work, 0);
 
 	return 0;
 }
@@ -391,7 +392,7 @@
 {
 	struct em28xx_IR *ir = priv;
 
-	cancel_delayed_work_sync(&ir->work);
+	//cancel_delayed_work_sync(&ir->work);
 }
 
 int em28xx_ir_change_protocol(void *priv, u64 ir_type)
@@ -439,7 +440,7 @@
 	struct em28xx_IR *ir;
 	struct input_dev *input_dev;
 	int err = -ENOMEM;
-
+#if 0
 	if (dev->board.ir_codes == NULL) {
 		/* No remote control support */
 		return 0;
@@ -507,6 +508,7 @@
 	dev->ir = NULL;
  err_out_free:
 	kfree(ir);
+#endif
 	return err;
 }
 
@@ -519,7 +521,7 @@
 		return 0;
 
 	em28xx_ir_stop(ir);
-	ir_input_unregister(ir->input);
+//	ir_input_unregister(ir->input);
 	kfree(ir);
 
 	/* done */
diff -ur work/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx.h work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx.h
--- work/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx.h	2010-07-01 23:38:54.000000000 -0400
+++ work.bak/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx.h	2011-01-08 14:23:31.752143955 -0500
@@ -35,7 +35,7 @@
 #include <media/ir-kbd-i2c.h>
 #include <media/ir-core.h>
 #if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE)
-#include <media/videobuf-dvb.h>
+//#include <media/videobuf-dvb.h>
 #endif
 #include "tuner-xc2028.h"
 #include "em28xx-reg.h"
diff -ur work/webcamd-0.1.18/v4l-dvb/linux/include/media/ir-core.h work.bak/webcamd-0.1.18/v4l-dvb/linux/include/media/ir-core.h
--- work/webcamd-0.1.18/v4l-dvb/linux/include/media/ir-core.h	2010-07-01 23:38:54.000000000 -0400
+++ work.bak/webcamd-0.1.18/v4l-dvb/linux/include/media/ir-core.h	2011-01-08 14:24:09.522791901 -0500
@@ -17,7 +17,7 @@
 #define _IR_CORE
 
 #include <linux/spinlock.h>
-#include <linux/kfifo.h>
+//#include <linux/kfifo.h>
 #include <linux/time.h>
 #include <linux/timer.h>
 #include <media/rc-map.h>
diff -ur work/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-core.c work.bak/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-core.c
--- work/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-core.c	2010-07-01 23:38:54.000000000 -0400
+++ work.bak/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-core.c	2011-01-08 14:31:25.512793982 -0500
@@ -973,9 +973,11 @@
 	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
 		urb = dev->isoc_ctl.urb[i];
 		if (urb) {
+#if 0
 			if (!irqs_disabled())
 				usb_kill_urb(urb);
 			else
+#endif
 				usb_unlink_urb(urb);
 
 			if (dev->isoc_ctl.transfer_buffer[i]) {
diff -ur work/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-dvb.c work.bak/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-dvb.c
--- work/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-dvb.c	2010-07-01 23:38:54.000000000 -0400
+++ work.bak/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-dvb.c	2011-01-08 14:30:11.155799727 -0500
@@ -504,8 +504,10 @@
 	/* init frontend */
 	switch (dev->model) {
 	case EM2874_LEADERSHIP_ISDBT:
+#if 0
 		dvb->frontend = dvb_attach(s921_attach,
 				&sharp_isdbt, &dev->i2c_adap);
+#endif
 
 		if (!dvb->frontend) {
 			result = -EINVAL;
diff -ur work/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-input.c work.bak/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-input.c
--- work/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-input.c	2010-07-01 23:38:54.000000000 -0400
+++ work.bak/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx-input.c	2011-01-08 14:35:46.992025560 -0500
@@ -335,6 +335,7 @@
 		dprintk("%s: toggle: %d, count: %d, key 0x%02x%02x\n", __func__,
 			poll_result.toggle_bit, poll_result.read_count,
 			poll_result.rc_address, poll_result.rc_data[0]);
+#if 0
 		if (ir->full_code)
 			ir_keydown(ir->input,
 				   poll_result.rc_address << 8 |
@@ -344,7 +345,7 @@
 			ir_keydown(ir->input,
 				   poll_result.rc_data[0],
 				   poll_result.toggle_bit);
-
+#endif
 		if (ir->dev->chip_id == CHIP_ID_EM2874)
 			/* The em2874 clears the readcount field every time the
 			   register is read.  The em2860/2880 datasheet says that it
@@ -382,7 +383,7 @@
 #else
 	INIT_DELAYED_WORK(&ir->work, em28xx_ir_work);
 #endif
-	schedule_delayed_work(&ir->work, 0);
+	//schedule_delayed_work(&ir->work, 0);
 
 	return 0;
 }
@@ -391,7 +392,7 @@
 {
 	struct em28xx_IR *ir = priv;
 
-	cancel_delayed_work_sync(&ir->work);
+	//cancel_delayed_work_sync(&ir->work);
 }
 
 int em28xx_ir_change_protocol(void *priv, u64 ir_type)
@@ -439,7 +440,7 @@
 	struct em28xx_IR *ir;
 	struct input_dev *input_dev;
 	int err = -ENOMEM;
-
+#if 0
 	if (dev->board.ir_codes == NULL) {
 		/* No remote control support */
 		return 0;
@@ -507,6 +508,7 @@
 	dev->ir = NULL;
  err_out_free:
 	kfree(ir);
+#endif
 	return err;
 }
 
@@ -519,7 +521,7 @@
 		return 0;
 
 	em28xx_ir_stop(ir);
-	ir_input_unregister(ir->input);
+//	ir_input_unregister(ir->input);
 	kfree(ir);
 
 	/* done */
diff -ur work/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx.h work.bak/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx.h
--- work/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx.h	2010-07-01 23:38:54.000000000 -0400
+++ work.bak/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/drivers/media/video/em28xx/em28xx.h	2011-01-08 14:23:31.752143955 -0500
@@ -35,7 +35,7 @@
 #include <media/ir-kbd-i2c.h>
 #include <media/ir-core.h>
 #if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE)
-#include <media/videobuf-dvb.h>
+//#include <media/videobuf-dvb.h>
 #endif
 #include "tuner-xc2028.h"
 #include "em28xx-reg.h"
diff -ur work/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/include/media/ir-core.h work.bak/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/include/media/ir-core.h
--- work/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/include/media/ir-core.h	2010-07-01 23:38:54.000000000 -0400
+++ work.bak/webcamd-0.1.18/v4l-dvb-abd3aac6644e/linux/include/media/ir-core.h	2011-01-08 14:24:09.522791901 -0500
@@ -17,7 +17,7 @@
 #define _IR_CORE
 
 #include <linux/spinlock.h>
-#include <linux/kfifo.h>
+//#include <linux/kfifo.h>
 #include <linux/time.h>
 #include <linux/timer.h>
 #include <media/rc-map.h>
Only in work.bak/webcamd-0.1.18: vc032x.4.gz
Only in work.bak/webcamd-0.1.18: w9966.4.gz
Only in work.bak/webcamd-0.1.18: w996x.4.gz
Only in work.bak/webcamd-0.1.18: webcamd.8.gz
Only in work.bak/webcamd-0.1.18: webcamd.core
Only in work.bak/webcamd-0.1.18: zc0301.4.gz
Only in work.bak/webcamd-0.1.18: zc3xx.4.gz
Only in work.bak/webcamd-0.1.18: zoran.4.gz
Only in work.bak/webcamd-0.1.18: zr364xx.4.gz
Only in work.bak: webcamd.conf

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTimOtABnMgkNn9jAiThWmZ9Ec3pNQ%2Bq_GR_1Ae4h>