em28xx?

Andrew Gallatin gallatin at gmail.com
Sun Jan 9 20:34:15 UTC 2011


On Sat, Jan 8, 2011 at 3:30 PM, Hans Petter Selasky <hselasky at c2i.net> wrote:
> On Saturday 08 January 2011 20:49:59 Andrew Gallatin wrote:
>> On Sat, Jan 8, 2011 at 2:11 PM, Andrew Gallatin <gallatin at 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
>
> Try the attached patch.

Thanks, but it didn't work.  I think that (part) of the problem is
that the dev it
is using is not the one you're initializing.  It is using sc->ui->dev.
I tried an analogous patch to initialize that dev, and it got me much, much
further along:

@@ -403,7 +403,10 @@
                return (-ENOMEM);
        }
        ui = p_dev->bsd_iface_start + i;
+       ui->dev.driver_static.name = "webcamd";
+       ui->dev.driver = &ui->dev.driver_static;

+       printf("sc = %p\n", sc);
        sc->udrv = udrv;
        sc->p_dev = p_dev;
        sc->ui = ui;


The device now attaches the analog part, but I don't have
digital yet (which is what I want/need).

The problem I have now is that dvb_init() is stuck trying to acquire a mutex.
I don't suppose we have WITNESS for the linux code ;)

Drew

(gdb) thread apply all bt

Thread 8 (Thread 801008200 (LWP 100261)):
#0  0x0000000800cebcfc in poll () from /lib/libc.so.7
#1  0x0000000800a307fe in poll () from /lib/libthr.so.3
#2  0x000000080081d63d in libusb20_dev_wait_process () from /usr/lib/libusb.so.2
#3  0x0000000000407a66 in usb_exec (arg=Variable "arg" is not available.
) at /usr/home/gallatin/tmp/webcamd-0.1.18/kernel/linux_usb.c:185
#4  0x0000000800a2e2be in pthread_getprio () from /lib/libthr.so.3
#5  0x0000000000000000 in ?? ()
Error accessing memory address 0x7fffff3fb000: Bad address.

Thread 5 (Thread 801007c00 (LWP 100260)):
#0  0x0000000800a34d1c in pthread_kill () from /lib/libthr.so.3
#1  0x0000000800a37103 in pthread_cond_signal () from /lib/libthr.so.3
#2  0x0000000000403716 in __wait_event (q=0x7575e0) at
/usr/home/gallatin/tmp/webcamd-0.1.18/kernel/linux_thread.c:168
#3  0x00000000004781d5 in pvr2_context_thread_func (foo=Variable "foo"
is not available.
) at /usr/home/gallatin/tmp/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/pvrusb2/pvrusb2-context.c:174
#4  0x000000000040387f in kthread_wrapper (arg=0x801010060) at
/usr/home/gallatin/tmp/webcamd-0.1.18/kernel/linux_thread.c:443
#5  0x0000000800a2e2be in pthread_getprio () from /lib/libthr.so.3
#6  0x0000000000000000 in ?? ()
Error accessing memory address 0x7fffff7fd000: Bad address.

Thread 4 (Thread 801007900 (LWP 100259)):
#0  0x0000000800d2ff6c in nanosleep () from /lib/libc.so.7
#1  0x0000000800d2fd25 in usleep () from /lib/libc.so.7
#2  0x0000000800a30268 in usleep () from /lib/libthr.so.3
#3  0x0000000000406212 in timer_exec (arg=Variable "arg" is not available.
) at /usr/home/gallatin/tmp/webcamd-0.1.18/kernel/linux_timer.c:141
#4  0x0000000800a2e2be in pthread_getprio () from /lib/libthr.so.3
#5  0x0000000000000000 in ?? ()
Error accessing memory address 0x7fffff9fe000: Bad address.

Thread 3 (Thread 801007600 (LWP 100258)):
#0  0x0000000800a34d1c in pthread_kill () from /lib/libthr.so.3
#1  0x0000000800a37103 in pthread_cond_signal () from /lib/libthr.so.3
#2  0x0000000000405e3c in work_exec (arg=Variable "arg" is not available.
) at /usr/home/gallatin/tmp/webcamd-0.1.18/kernel/linux_task.c:111
#3  0x0000000800a2e2be in pthread_getprio () from /lib/libthr.so.3
#4  0x0000000000000000 in ?? ()
Error accessing memory address 0x7fffffbff000: Bad address.

Thread 2 (Thread 801007300 (LWP 100255)):
#0  0x0000000800a34d1c in pthread_kill () from /lib/libthr.so.3
#1  0x0000000800a37103 in pthread_cond_signal () from /lib/libthr.so.3
#2  0x0000000000403695 in down (sem=0x801208b60) at
/usr/home/gallatin/tmp/webcamd-0.1.18/kernel/linux_thread.c:307
#3  0x000000000046ef27 in dvb_init (dev=0x801208600) at
/usr/home/gallatin/tmp/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-dvb.c:502
#4  0x000000000046e963 in em28xx_init_extension (dev=0x801208600) at
/usr/home/gallatin/tmp/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-core.c:1230
#5  0x000000000046ca77 in em28xx_usb_probe (interface=0x8011c54b0,
id=0x6d4488) at
/usr/home/gallatin/tmp/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-cards.c:2979
#6  0x000000000040853c in usb_linux_probe_p (p_bus=0x758e10,
p_addr=0x758e14, p_index=0x758e18) at
/usr/home/gallatin/tmp/webcamd-0.1.18/kernel/linux_usb.c:418
#7  0x00000000004f056f in main (argc=-5712, argv=0x7fffffffead0) at
webcamd.c:482


(gdb) frame 3
#3  0x000000000046ef27 in dvb_init (dev=0x801208600) at
/usr/home/gallatin/tmp/webcamd-0.1.18/v4l-dvb/linux/drivers/media/video/em28xx/em28xx-dvb.c:502
502             mutex_lock(&dev->lock);
(gdb) p dev
$5 = (struct em28xx *) 0x801208600
(gdb) p *dev
$6 = {name = "em28xx #0", '\0' <repeats 20 times>, model = 76, devno =
0, chip_id = CHIP_ID_EM2870, v4l2_dev = {dev = 0x8011c54b0, subdevs =
{next = 0x801208638, prev = 0x801208638},
    lock = <incomplete type>, name = "webcamd ", '\0' <repeats 27
times>, notify = 0}, board = {name = 0x5890c8 "KWorld PlusTV 340U or
UB435-Q (ATSC)", vchannels = 0, tuner_type = 4,
    tuner_addr = 0, tda9887_conf = 0, dvb_gpio = 0x6d49f0,
suspend_gpio = 0x0, tuner_gpio = 0x6d4580, mute_gpio = 0x0, is_em2800
= 0, has_msp34xx = 0, mts_firmware = 0,
    max_range_640_480 = 0, has_dvb = 1, has_snapshot_button = 0,
is_webcam = 0, valid = 0, has_ir_i2c = 0, xclk = 39 '\'', i2c_speed =
64 '@', radio_addr = 0 '\0', tvaudio_addr = 0,
    decoder = EM28XX_NODECODER, adecoder = EM28XX_NOADECODER, input =
{{type = 0, vmux = 0, amux = EM28XX_AMUX_VIDEO, aout =
EM28XX_AOUT_PCM_MIC_PCM, gpio = 0x0}, {type = 0, vmux = 0,
        amux = EM28XX_AMUX_VIDEO, aout = EM28XX_AOUT_PCM_MIC_PCM, gpio
= 0x0}, {type = 0, vmux = 0, amux = EM28XX_AMUX_VIDEO, aout =
EM28XX_AOUT_PCM_MIC_PCM, gpio = 0x0}, {type = 0,
        vmux = 0, amux = EM28XX_AMUX_VIDEO, aout =
EM28XX_AOUT_PCM_MIC_PCM, gpio = 0x0}}, radio = {type = 0, vmux = 0,
amux = EM28XX_AMUX_VIDEO, aout = EM28XX_AOUT_PCM_MIC_PCM,
      gpio = 0x0}, ir_codes = 0x0}, em28xx_sensor = EM28XX_NOSENSOR,
sensor_xres = 0, sensor_yres = 0, sensor_xtal = 0, progressive = 0,
vinmode = 16, vinctl = 17,
  has_audio_class = 0, has_alsa_audio = 0, format = 0x6d4ca0, ir =
0x0, wait_after_write = 0, devlist = {next = 0x6d4a90, prev =
0x6d4a90}, i2s_speed = 0, audio_mode = {
    ac97 = EM28XX_NO_AC97, ac97_feat = 0, ac97_vendor_id = 0,
has_audio = 0, i2s_3rates = 0, i2s_5rates = 0}, tuner_type = 4,
tuner_addr = 0, tda9887_conf = 0, i2c_adap = {
    owner = 0x0, id = 65567, class = 0, algo = 0x6d4c60, algo_data =
0x801208600, level = 0 '\0', bus_lock = {sem = {value = 1}}, timeout =
1000, retries = 0, dev = {minor = 0,
      busnum = 0, kobj = <incomplete type>, refcount = {refcount =
{counter = 1}}, release = 0, driver = 0x0, parent = 0x8011c4b00,
driver_data = 0x801208630, fops = 0x0, cdev = 0x0,
      class = 0x0, driver_static = {name = 0x0, owner = 0x0}, devt =
0, name = "i2c-129", '\0' <repeats 56 times>, bus_name = '\0' <repeats
31 times>,
      bus_id = '\0' <repeats 31 times>}, nr = 129, name = "em28xx #0",
'\0' <repeats 38 times>, dev_released = {done = 0, wait = {sleep_ref =
0, sleep_count = 0}}}, i2c_client = {
    flags = 0, addr = 80, name = "em28xx internal\000\000\000\000",
adapter = 0x8012087a8, driver = 0x0, dev = {minor = 0, busnum = 0,
kobj = <incomplete type>, refcount = {
        refcount = {counter = 0}}, release = 0, driver = 0x0, parent =
0x0, driver_data = 0x0, fops = 0x0, cdev = 0x0, class = 0x0,
driver_static = {name = 0x0, owner = 0x0},
      devt = 0, name = '\0' <repeats 63 times>, bus_name = '\0'
<repeats 31 times>, bus_id = '\0' <repeats 31 times>}, irq = 0,
detected = {next = 0x0, prev = 0x0}}, users = 0,
  vdev = 0x80124a180, norm = 255, ctl_freq = 0, ctl_input = 0,
ctl_ainput = 0, ctl_aoutput = 1, mute = 1, volume = 31, width = 720,
height = 576, hscale = 0, vscale = 0,
  interlaced = 1, video_bytesread = 0, hash = 680043282, i2c_hash = 0,
adev = {name = '\0' <repeats 49 times>, transfer_buffer = {0x0, 0x0,
0x0, 0x0, 0x0}, urb = {0x0, 0x0, 0x0, 0x0,
      0x0}, udev = 0x0, capture_transfer_done = 0,
capture_pcm_substream = 0x0, hwptr_done_capture = 0, sndcard = 0x0,
users = 0, capture_stream = STREAM_OFF,
    slock = <incomplete type>}, state = 0, io = IO_NONE, capture_type
= 0, vbi_read = 0, cur_field = 0 '\0', vbi_width = 720, vbi_height =
18, request_module_wk = {entry = {
      tqe_next = 0x0, tqe_prev = 0x0}, func = 0}, lock = {sem = {value
= 0}}, ctrl_urb_lock = {sem = {value = 1}}, inqueue = {next = 0x0,
prev = 0x0}, outqueue = {next = 0x0,
    prev = 0x0}, open = {sleep_ref = 0, sleep_count = 0}, wait_frame =
{sleep_ref = 0, sleep_count = 0}, wait_stream = {sleep_ref = 0,
sleep_count = 0}, vbi_dev = 0x0,
  radio_dev = 0x0, resources = 0,
  eedata = "\032ëg\225\200\033@£À\023k\020j\"\000\000\000\000\004W\000\r\000\000\000\000\000\000\000\000\000\000D\000\000\000ð\020\001\000\000\000\000\000[\034À\000\000\000
@ \200\002 \001\001", '\0' <repeats 48 times>, "\"\003U\000S\000B\000
\0002\0008\0007\0000\000 \000D\000e\000v\000i\000c\000e", '\0'
<repeats 118 times>, vidq = {active = {next = 0x801208cb8,
      prev = 0x801208cb8}, queued = {next = 0x801208cc8, prev =
0x801208cc8}, wq = {sleep_ref = 0, sleep_count = 0}, pos = 0}, vbiq =
{active = {next = 0x801208ce8,
      prev = 0x801208ce8}, queued = {next = 0x801208cf8, prev =
0x801208cf8}, wq = {sleep_ref = 0, sleep_count = 0}, pos = 0},
isoc_ctl = {max_pkt_size = 0, num_bufs = 0, urb = 0x0,
    transfer_buffer = 0x0, cmd = 0 '\0', pos = 0, size = 0, pktsize =
0, field = 0, tmp_buf = 0, tmp_buf_len = 0, vid_buf = 0x0, vbi_buf =
0x0, nfields = 0, isoc_copy = 0},
  slock = <incomplete type>, udev = 0x8011c4b00, alt = 6, max_pkt_size
= 2892, num_alt = 8, alt_max_pkt_size = 0x801164b00, urb = {0x0, 0x0,
0x0, 0x0, 0x0}, transfer_buffer = {0x0,
    0x0, 0x0, 0x0, 0x0}, urb_buf = '\0' <repeats 79 times>,
em28xx_write_regs = 0x46d4c0 <em28xx_write_regs>, em28xx_read_reg =
0x46d960 <em28xx_read_reg>,
  em28xx_read_reg_req_len = 0x46d740 <em28xx_read_reg_req_len>,
em28xx_write_regs_req = 0x46d320 <em28xx_write_regs_req>,
em28xx_read_reg_req = 0x46d930 <em28xx_read_reg_req>,
  mode = EM28XX_SUSPEND, reg_gpo_num = 4, reg_gpio_num = 8, reg_gpo =
0 '\0', reg_gpio = 16 '\020', snapshot_button_path = '\0' <repeats 29
times>, sbutton_input_dev = 0x0,
  sbutton_query_work = {work = {entry = {tqe_next = 0x0, tqe_prev =
0x0}, func = 0}, timer = {entry = {tqe_next = 0x0, tqe_prev = 0x0},
function = 0, expires = 0, data = 0}},
  dvb = 0x80101f700}
(gdb) p dev->lock
$7 = {sem = {value = 0}}


Thanks,

Drew


More information about the freebsd-multimedia mailing list