Re: How to add support for the em2765 webcam Speedlink VAD Laplace to the kernel ?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 06.10.2012 13:56, schrieb Mauro Carvalho Chehab:
> Em Sun, 23 Sep 2012 16:03:25 +0200
> Frank Schäfer <fschaefer.oss@xxxxxxxxxxxxxx> escreveu:
>
>> Ping !
> Sorry, too busy those days.

No problem.

>> Am 26.08.2012 20:53, schrieb Frank Schäfer:
>>> Sorry for the delayed reply, I got distracted by something with higher
>>> prority.
>>>
>>>
>>> Am 22.08.2012 20:15, schrieb Mauro Carvalho Chehab:
>>>> Em 22-08-2012 04:53, Frank Schäfer escreveu:
>>>>> Am 21.08.2012 19:29, schrieb Mauro Carvalho Chehab:
>>>>>> Hmm... before reading the rest of this email... I found some doc saying that
>>>>>> em2765 is UVC compliant. Doesn't the uvcdriver work with this device?
>>>>> Yeah, I stumbled over that, too. :D
>>>>> But this device is definitely not UVC compliant. Take a look at the
>>>>> lsusb output.
>>>>> Maybe they are using a different firmware or something like that, but I
>>>>> have no idea why the hell they should make a UVC compliant device
>>>>> non-UVC-compliant...
>>>>> Another notable difference to the devices we've seen so far is the
>>>>> em25xx-style EEPROM. Maybe there is a connection.
>>>>>
>>>>> Btw, do we know any em25xx devices ???
>>>> No, I never heard about em25xx. It seems that there are some new em275xx
>>>> chips, but I don't have any technical data.
>>> Maybe they changed the name and there was never a em2580/em2585.
>>> But I assume this is an older chip design.
>> In the mean time I was told that em2580/em2585 devices really exists.
>> They are used for example in intraoral cameras for dentists.
>> The em2765 seems to be a kind of relabled em25xx.
> Ok.
>
>> Both chips have two i2c busses and work only with 16 bit address
>> eeproms, which have to be connected to bus A.
>> The sensor read/write procedure used for this webcam is very likely the
>> standard method for accessing i2c bus B of these chips.
>> It COULD also be vendor specific procedure, but I don't think 3 other
>> slave addresses would be probed in that case...
> AFAIKT, newer em28xx chips are using this concept. The em28xx-i2c code require
> changes to support two I2C buses, and to handle 16 bit eeproms. We never cared
> of doing that because we never needed, so far, to read anything from those
> devices' eeproms.
>
>
>> <snip>
>>>>>> You'll see several supported devices using the secondary bus for TV and
>>>>>> demod. As, currently, the TV eeprom is not read on those devices, nobody
>>>>>> cared enough to add a separate I2C bus code for it, as all access used
>>>>>> by the driver happen just on the second bus.
>>>>> Well, the same applies to this webcam. We do not really need to read the
>>>>> EEPROM at the moment.
>>>>>
>>>>>
>>>>>>>> A proper mapping for it to use ov2640 driver is to create two i2c
>>>>>>>> buses, one used by eeprom access, and another one for sensor.
>>>>>>> Sure.
>>>>>>>
>>>>>>>>> Interestingly, the standard I2C reads are used, too, for reading the
>>>>>>>>> EEPROM. So maybe there is a "physical" difference.
>>>>>>>>>
>>>>>>>>> "Proprietary" is probably not the best name, but I don't have e better
>>>>>>>>> one at the moment (suggestions ?).
>>>>>>>> It is just another bus: instead of using req 3/4 for read/write, it uses
>>>>>>>> req 6 for both reads/writes at the i2c-like sensor bus.
>>>>>>>>
>>>>>>>>>>>> - uses 16bit eeprom
>>>>>>>>>>>> - em25xx-eeprom with different layout
>>>>>>>>>> There are other supported chips with 16bit eeproms. Currently,
>>>>>>>>>> support for 16bit eeproms is disabled just because this weren't
>>>>>>>>>> needed so far, but I'm sure this is a need there.
>>>>>>>>> Yes, I've read the comment in em28xx_i2c_eeprom():
>>>>>>>>> "...there is the risk that we could corrupt the eeprom (since a 16-bit
>>>>>>>>> read call is interpreted as a write call by 8-bit eeproms)..."
>>>>>>>>> How can we know if a device uses an 8bit or 16bit EEPROM ? Can we derive
>>>>>>>>> that from the uses em27xx/28xx-chip ?
>>>>>>>> I don't know any other way to check it than to read the chip ID, at register
>>>>>>>> 0x0a. Those are the chip ID's that we currently know:
>>>>>>>>
>>>>>>>> enum em28xx_chip_id {
>>>>>>>> 	CHIP_ID_EM2800 = 7,
>>>>>>>> 	CHIP_ID_EM2710 = 17,
>>>>>>>> 	CHIP_ID_EM2820 = 18,	/* Also used by some em2710 */
>>>>>>>> 	CHIP_ID_EM2840 = 20,
>>>>>>>> 	CHIP_ID_EM2750 = 33,
>>>>>>>> 	CHIP_ID_EM2860 = 34,
>>>>>>>> 	CHIP_ID_EM2870 = 35,
>>>>>>>> 	CHIP_ID_EM2883 = 36,
>>>>>>>> 	CHIP_ID_EM2874 = 65,
>>>>>>>> 	CHIP_ID_EM2884 = 68,
>>>>>>>> 	CHIP_ID_EM28174 = 113,
>>>>>>>> };
>>>>>>>>
>>>>>>>> Even if we add it as a separate driver, it is likely wise to re-use the
>>>>>>>> registers description at drivers/media/usb/em28xx/em28xx-reg.h, moving it
>>>>>>>> to drivers/include/media, as em2765 likely uses the same registers. 
>>>>>>>> It also makes sense to add a chip detection at the existing driver, 
>>>>>>>> for it to bail out if it detects an em2765 (and the reverse on the new
>>>>>>>> driver).
>>>>>>> em2765 has chip-id 0x36 = 54.
>>>>>>> Do you want me to send a patch ?
>>>>>> Yes, please send it when you'll be ready for driver submission.
>>>>> Will do that.
>>>>>
>>>>>>> Do you really think the em28xx driver should always bail out when it
>>>>>>> detects the em2765 ?
>>>>>> Well, having 2 drivers for the same chipset is a very bad idea. Either
>>>>>> one should use it.
>>>>>>
>>>>>> Another option would be to have a generic em28xx dispatcher driver
>>>>>> that would handle all of them, probe the board, and then starting
>>>>>> either one, depending if the driver is webcam or not.
>>>>> Sounds good.
>>>>>
>>>>>> Btw, this is on my TODO list (with low priority), as there are several
>>>>>> devices that have only DVB. So, it makes sense to split the analog
>>>>>> TV driver, just like we did with the DVB and alsa drivers. This way,
>>>>>> an em28xx core driver will contain only the probe and the core functions
>>>>>> like i2c and the common helper functions, while all the rest would be
>>>>>> on separate drivers.
>>>>> Yeah, a compact bridge module providing chip info, bridge register r/w
>>>>> functions and access to the 2 + 1 i2c busses sounds good.
>>>>> If I understand you right, this module should also do the probing and
>>>>> then call the right driver for the device, e.g. gspca for webcams ?
>>>>> Sounds complicating, because the bridge module is still needed after the
>>>>> handover to the other driver, but I know nearly nothing about the
>>>>> modules interaction possibilites (except that one module can call
>>>>> another ;) ).
>>>> It is not complicated.
>>>>
>>>> At the main driver, take a look at request_module_async(), at em28xx-cards: 
>>>> it basically schedules a deferred work that will load the needed drivers,
>>>> after em28xx finishes probing.
>>>>
>>>> At the sub-drivers, they use em28xx_register_extension() on their init
>>>> code. This function uses a table with 4 parameters, like this one:
>>>>
>>>> static struct em28xx_ops audio_ops = {
>>>> 	.id   = EM28XX_AUDIO,
>>>> 	.name = "Em28xx Audio Extension",
>>>> 	.init = em28xx_audio_init,
>>>> 	.fini = em28xx_audio_fini,
>>>> };
>>>>
>>>> The .init() function will then do everything that it is needed for the
>>>> device to run. It is called when the main driver detects a new card,
>>>> and it is ready for that (the main driver has some code there to avoid
>>>> race conditions, serializing the extensions load).
>>>>
>>>> The .fini() is called when the device got removed, or when the driver
>>>> calls em28xx_unregister_extension().
>>>>
>>>> The struct em28xx *dev is passed as a parameter on both calls, to allow
>>>> the several drivers to share common data.
>>>>
>>>> This logic works pretty well, even on SMP environments with lots of CPU.
>>>> The only care needed there (with won't affect a webcam driver) is to
>>>> properly lock the driver to avoid two different sub-drivers to access the
>>>> same device resources at the same time (this is needed between DVB and video
>>>> parts of the driver).
>>>>
>>>> By moving the TV part to a separate driver, it makes sense to also create
>>>> an em28xx_video structure, moving there everything that it is not common,
>>>> but this is an optimization that could be done anytime.
>>>>
>>>> I suggest you to create an em28xx_webcam struct and put there data that it
>>>> is specifics to the webcam driver there, if any.
>>> Ok, thanks for your explanations.
>>> I will see what I can do.
>>>
>>>>>> IMO, doing that that could be better than coding em2765 as a
>>>>>> completely separate driver.
>>>>> Sounds like the best approach. But also lots of non-trivial work which
>>>>> someone has to do first. I'm afraid too much for a beginner like me...
>>>>> And we should keep in mind that this probably means that people will
>>>>> have to wait several further kernel releases before their device gets
>>>>> supported.
>>>> Well, it is not that hard. If I had any time, I would do it right now.
>>>> It probably won't take more than a few hours of work to split the video
>>>> part into a separate driver, as 99% of the work is to move a few functions
>>>> between the .c files, and move the init code from em28xx-cards.c to
>>>> em28xx-video.
>>>>
>>>> I can seek for doing that after the media workshop that will happen
>>>> next week.
>>> Ok.
>>> Trying to summarize the plan, I'm not sure that I understand the driver
>>> layout completely yet..
>>> We are going to
>>> - separate the video part of the em28xx driver and create a compact
>>> module providing just the core fucntions
>>> - let this module do the probing an then either call "the rest" of the
>>> em28xx driver for DVB-devices or a gspca module for all em27xx/em28xx
>>> based webcams
> Yes.
>
>>> - use sub-modules for the sensors and possibly other commonly used
>>> features (e.g. an eeprom module) in the webcam module
> I think that this should also be part of the em28xx core, as 2 I2C buses
> and 16-bit eeproms are also used on newer em28xx chips (em2874/em2875 for
> example). The way request_module_async works allow the main em28xx to load
> a gspca-based em25xx/em27xx module that, in turn, will use symbols defined
> on the main em28xx module.

Ok.

>>> Ist that correct ?
>> Mauro, could you please elaborate your plan ?
>> What exactly do you want me to do to get this device supported by the
>> kernel ?
> Basically, the core em28xx module will have:
> 	drivers/media/usb/em28xx/em28xx-cards.c
> 	drivers/media/usb/em28xx/em28xx-i2c.c
> 	drivers/media/usb/em28xx/em28xx-core.c
>
> Eventually, part of the functions under em28xx-core could be moved
> to em28xx-video, as they would be used just there. For the already
> supported em2710/em2750 webcams, we should need to change the logic
> there to use the new gspca-em2xxx module, but this change can be
> done later.
>
> The em28xx-alsa module already have:
> 	drivers/media/usb/em28xx/em28xx-audio.c
> Nothing changes on it.
>
> The em28xx-dvb module already have:
> 	drivers/media/usb/em28xx/em28xx-dvb.c
> Nothing changes on it.
>
> The new em28xx-v4l module will have:
> 	drivers/media/usb/em28xx/em28xx-vbi.c
> 	drivers/media/usb/em28xx/em28xx-video.c
>
> The em28xx-rc module already have:
> 	drivers/media/usb/em28xx/em28xx-input.c
> It makes sense to split it into two separate files, one with just the
> remote control stuff, and the other one with the webcam snapshot buttons.
>
> The file with the webcam buttons support should be merged with the em28xx
> gspca module, together with the code you wrote.

Ok, but then there is not much left in the gspca driver. ;)
The two main remaining things feature blocks are
- USB-bulk-support
- data/frame processing
and I think it would make sense to have them both in em28xx, too.

I would say that the main reason for a gspca subdriver would be
- the different code for i2c bus B (there is still a chance that this is
something SpeedLink specific !)
- the complicating buttons stuff
- the ov2640 code (as long as no sub-module is used for that)
which would require adding lots of new code to the em28xx-driver not
needed by 95% of the devices.

The big question is, which devices can we expect to appear in the future ?
I'm pretty sure there are much more cameras (like the mentioned
intraoral camera devices fro dentists). As I said before, I can see the
Windows driver probing 4 ic2 slave addresses.
Tuner i2c clients are also mentioned in the em2580/em2585 datasheet, so
these chips could be designed for TV stuff, too (although we haven't
seen such a device yet).


>
>> In the mean time I have ported the gspca driver to the ic2 interface,
>> which was necessary to experiment with the ov2640 soc-camera driver,
> Good!

It still needs some issues to be resolved (there seems to be a nice
USB-locking issue cause by the interaction with the gspca_main module...).

>
>> but also increased the code size enormously.
> Why?

Additional functions (i2c_xfer, i2c_xfer, ...), structs (i2c_algorithm,
i2c_adapter, i2c_client, ...).
Also some code duplication is required (e.g. i2c_check_for_device methods)
And of course everything times 2 because we have two busses.

>
>> Unfortunately, lots of changes to the ov2640 driver would be necessary
>> use it. It starts with the init sequence and continues with a long
>> sequence of sensor register writes at capturing start.
>> My hope was, that the differences can be neglected, but unfortunately
>> this is not the case.
>> Given the amount of work, the fact that most of these registers are
>> undocumented and the high risk to break things for other users of the
>> driver, I think we should stay with the "custom" code for this webcam at
>> least for the moment.
> Well, then do a new ov2640 i2c driver. We can later try to merge both, if
> we can get enough spec data.

I'm not sure we will ever get them.
The datasheet we have is already detailed and manufacturers never
document everything (even for there customers).

I will see what I can do to use the existing driver, but it's definitely
a bigger task...

Regards,
Frank

>> Please also consider the time factor.
>>
>> Regards,
>> Frank
>>
> Regards,
> Mauro

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux