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>
