From: Lars Hanisch <dvb@cinnamon-sage.de>
To: Mike Isely <isely@isely.net>
Cc: Hans Verkuil <hverkuil@xs4all.nl>, linux-media@vger.kernel.org
Subject: Re: RFC: exposing controls in sysfs
Date: Wed, 07 Apr 2010 20:50:33 +0200 [thread overview]
Message-ID: <4BBCD3F9.1070207@cinnamon-sage.de> (raw)
In-Reply-To: <alpine.DEB.1.10.1004060848540.27169@cnc.isely.net>
Am 06.04.2010 16:33, schrieb Mike Isely:
>
> Comments below...
>
> On Mon, 5 Apr 2010, Hans Verkuil wrote:
>
>> Hi all,
>>
>> The new control framework makes it very easy to expose controls in sysfs.
>> The way it is implemented now in the framework is that each device node
>> will get a 'controls' subdirectory in sysfs. Below which are all the controls
>> associated with that device node.
>>
>> So different device nodes can have different controls if so desired.
>>
>> The name of each sysfs file is derived from the control name, basically making
>> it lowercase, replacing ' ', '-' and '_' with '_' and skipping any other non-
>> alphanumerical characters. Seems to work well.
>>
>> For numerical controls you can write numbers in decimal, octal or hexadecimal.
>>
>> When you write to a button control it will ignore what you wrote, but still
>> execute the action.
>>
>> It looks like this for ivtv:
>>
>> $ ls /sys/class/video4linux/video1
>> controls dev device index name power subsystem uevent
>>
>> $ ls /sys/class/video4linux/video1/controls
>> audio_crc chroma_gain spatial_chroma_filter_type video_bitrate_mode
>> audio_emphasis contrast spatial_filter video_encoding
>> audio_encoding hue spatial_filter_mode video_gop_closure
>> audio_layer_ii_bitrate insert_navigation_packets spatial_luma_filter_type video_gop_size
>> audio_mute median_chroma_filter_maximum stream_type video_mute
>> audio_sampling_frequency median_chroma_filter_minimum stream_vbi_format video_mute_yuv
>> audio_stereo_mode median_filter_type temporal_filter video_peak_bitrate
>> audio_stereo_mode_extension median_luma_filter_maximum temporal_filter_mode video_temporal_decimation
>> balance median_luma_filter_minimum video_aspect volume
>> brightness mute video_b_frames
>> chroma_agc saturation video_bitrate
>>
>>
>> The question is, is this sufficient?
>>
>> One of the few drivers that exposes controls in sysfs is pvrusb2. As far as
>> I can tell from the source it will create subdirectories under the device
>> node for each control. Those subdirs have the name ctl_<control-name> (e.g.
>> ctl_volume), and below that are files exposing all the attributes of that
>> control: name, type, min_val, max_val, def_val, cur_val, custom_val, enum_val
>> and bit_val. Most are clear, but some are a bit more obscure. enum_val is
>> basically a QUERYMENU and returns all menu options. bit_val seems to be used
>> for some non-control values like the TV standard that pvrusb2 also exposes
>> and where bit_val is a bit mask of all the valid bits that can be used.
>>
>> Mike, if you have any additional information, just let us know. My pvrusb2
>> is in another country at the moment so I can't do any testing.
>
> Hans:
>
> What you see in the pvrusb2 driver is the result of an idea I had back
> in 2005. The pvrusb2 driver has an internal "control" API; my original
> idea back then was to then reimplement other interfaces on top of that
> API, in a manner that is as orthogonal as possible. The reality today
> is still pretty close to that concept (except for DVB unfortunately
> since that framework's architecture effectively has to take over the RF
> tuner...); the V4L2 implementation in the driver certainly works this
> way. The sysfs interface you see here is the result of implementing the
> same API through sysfs. Right now with the pvrusb2 driver the only
> thing not exported through sysfs is the actual streaming of video
> itself.
>
> The entire sysfs implementation in the driver can be found in
> pvrusb2-sysfs.c. Notice that the file is generic; there is not anything
> in it that is specific to any particular control. Rather,
> pvrusb2-sysfs.c is able to iterate through the driver's controls,
> picking up the control's name, its type, and accessors. Based on what
> it finds, this module then synthesizes the interface that you see in
> /class/pvrusb2/* - it's actually possible to add new controls to the
> driver without changing anything in pvrusb2-sysfs.c.
>
>
>>
>> Personally I think that it is overkill to basically expose the whole
>> QUERYCTRL information to sysfs. I see it as an easy and quick way to read and
>> modify controls via a command line.
>
> Over time, I have ended up using pretty much every control in that
> interface. Obviously not every control always gets touched, but I have
> found it extremely valuable to have such direct access to every "knob"
> in the driver this way.
>
> Also, the original concept was that the interface was to be orthogonal;
> in theory any kind of control action in one interface should be just as
> valid in another.
>
>
>>
>> Mike, do you know of anyone actively using that additional information?
>
> Yes.
>
> The VDR project at one time implemented a plugin to directly interface
> to the pvrusb2 driver in this manner. I do not know if it is still
> being used since I don't maintain that plugin.
Just FYI:
The PVR USB2 device is now handled by the pvrinput-plugin, which uses only ioctls. The "old" pvrusb2-plugin is obsolete.
http://projects.vdr-developer.org/projects/show/plg-pvrinput
Regards,
Lars.
>
> I have over the years seen feedback from many users who just love using
> the sysfs interface - by using sysfs for access to all the knobs&
> switches while just using "cat /dev/video0" (or whatever) to grab the
> video stream, it's possible to nearly completely operate the device
> without writing a single line of C code. I have read of some people who
> have hacked up shell scripts for special purposes using this driver.
>
> When I say "nearly completely" above, the big asterisk there is DVB.
> The analog side is completely operable via sysfs. However because of
> the way DVB works it is currently not possible to export the digital
> side of the driver through anything except DVB itself (a situation that
> I find to be "wrong" but probably will be very difficult to solve
> technically due to DVB's architecture and will likely be impossible
> anyway because the kinds of pvrusb2 driver changes that I think would be
> required probably won't be accepted by others anyway so I haven't been
> very motivated to attack the problem).
>
>
>>
>> And which non-control values do you at the moment expose in pvrusb2 through
>> sysfs? Can you perhaps give an ls -R of all the files you create in sysfs
>> for pvrusb2?
>
> *ALL* of them are exposed. The exact set is synthesized at run-time by
> pvrusb2-sysfs.c via introspection of the control API defined in
> pvrusb2-hdw.h. In the in-V4L version of the pvrusb2 driver this set of
> controls is likely a constant, but it has certainly changed over time as
> V4L and the pvrusb2 driver have evolved. In the standalone pvrusb2
> driver, the control set can actually vary due to ifdef's in
> pvrusb2-hdw.c, which are affected by the kernel version and v4l-dvb
> snapshot against which the driver is compiled.
>
>
>>
>> I am wondering whether some of those should get a place in the
>> framework as well. While I don't think e.g. cropping parameters are
>> useful, things like the current input or tuner frequency can be handy.
>> However, for those to be useful they would have to be wired up
>> internally through the framework. For example, VIDIOC_S_FREQUENCY
>> would have to be hooked up internally to a control. That would ensure
>> that however you access it (ioctl or sysfs) it will both end up in the
>> same s_ctrl function.
>
> I think you're missing a critical point here.
>
> There isn't any logic in the module within the pvrusb2 driver which
> "decides" which controls to expose. The driver itself has an internal
> API used by everything else, and all that pvrusb2-sysfs.c does is
> enumerate that to expose all of the controls. It would actually be
> extra work in the pvrusb2 driver to impose a policy on which controls
> are visible. The cropping parameters are an example of this. Another
> pvrusb2 driver user wanted to get cropping to work (which unfortunately
> *still* requires v4l-dvb changes that are not implemented). Part of his
> implementation involved adding a few extra knobs within the driver to
> control the cropping behavior. Once he did that, the knobs
> automatically became available via sysfs.
>
>
>>
>> It will be nice to hear from you what your experience is.
>
> Here's my experience:
>
> I originally did the sysfs interface back in 2005 as a proof of concept.
> I wanted to prove that the internal API within the driver was
> functionally complete and relatively easy to use. I had recently
> finished reading the LDDv3 and learned of the sysfs class interface.
> It occurred to me back then that it would be easy to define a sysfs
> class interface for the pvrusb2 driver in terms of that API. So I did,
> and it was literally a 2 day hack. It's worked fabulously well ever
> since. In terms of popularity, I find that the user community loves it,
> while the developer community seems to tolerate it.
>
> I routinely use the sysfs interface for my own testing. It's just
> simply trivial to tweak things in the driver at the shell level using
> that interface. I remember once using all the mpeg knobs to experiment
> with all the ways that filtering could be controlled, for example. A
> common use-case for me during testing is to use mplayer as a dumb
> streaming app while tweaking the driver via sysfs.
>
> I've had feedback from many users over the years who, upon discovering
> this interface, just latch onto it. On more than one occassion I've had
> feedback to the effect of "I don't care about any V4L app; I just want
> to stream video and the sysfs interface makes this trivial to control".
> Probably the fact that only just a small handful of V4L apps (xawtv,
> mythtv and recently now mplayer?) even handle mpeg video has amplified
> this behavior: Many users have found it simpler to forget about V4L apps
> and just instead "cat /dev/video0" along with some shell hacking.
>
> And long ago I know the VDR application gained a plugin script which
> itself used the sysfs interface to control the driver.
>
> One aspect of that sysfs interface that I think has had a lot of value
> over time is that it is (within limits) self-describing. For each
> control you get not only the ability to get (and usually set) its value,
> but you can inspect its limits, learn what the default value is,
> retrieve a description (though being english only that has limited
> utility), and discover its type. The sysfs interface in the driver
> tries to use symbolic values where possible, including when setting /
> clearing bits in a bit mask. The fact that such information is there
> helps when writing, say, a generic dialog-based wrapper to provide a TUI
> (Text User Interface) over the interface without having to encode too
> much specific information in the wrapper itself. Thus if new controls
> get added (or changed) later then such things just automatically adapt.
> Of course this isn't a perfect thing, but it helps.
>
>>
>> Comments? Ideas? Once we commit to something it is there for a long time to
>> come since sysfs is after all a public API (although it seems to be more
>> changable than ioctls).
>
> I have found it useful over a long period of time.
>
> I also suggest that if such an interface is defined in the general case
> that it should include some introspection capabilities, which will make
> it easier (or even possible) to evolve the interface over time while
> minimizing backwards compatibility issues.
>
> If such a generic interface were made available, I could see an argument
> to remove the sysfs interface from the pvrusb2 driver. HOWEVER there is
> a community using it, and also unless the generic interface were a
> complete replacement, the pvrusb2 piece will probably have to stay.
> (Note: the sysfs interface in the pvrusb2 driver is already a CONFIG_XX
> parameter so it's easy to deselect it when building the driver.)
>
> -Mike
>
>
next prev parent reply other threads:[~2010-04-07 19:09 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-05 21:47 RFC: exposing controls in sysfs Hans Verkuil
2010-04-05 22:12 ` Hans Verkuil
2010-04-06 6:37 ` Hans Verkuil
2010-04-06 11:06 ` Andy Walls
2010-04-06 11:27 ` Laurent Pinchart
2010-04-06 11:44 ` Markus Rechberger
2010-04-06 15:08 ` Mike Isely
2010-04-06 15:16 ` Mike Isely
2010-04-06 22:39 ` Hans Verkuil
2010-04-07 2:10 ` hermann pitton
2010-04-07 6:56 ` Hans Verkuil
2010-04-08 0:52 ` Mike Isely
2010-04-06 13:16 ` Mauro Carvalho Chehab
2010-04-06 13:44 ` Hans Verkuil
2010-04-06 13:59 ` Devin Heitmueller
2010-04-06 15:05 ` Mike Isely
2010-04-06 14:32 ` Mauro Carvalho Chehab
2010-04-06 16:06 ` Jonathan Cameron
2010-04-06 16:36 ` Bjørn Forsman
2010-04-06 14:41 ` Mike Isely
2010-04-06 16:19 ` Jonathan Cameron
2010-04-06 22:47 ` Hans Verkuil
2010-04-06 14:33 ` Mike Isely
2010-04-07 18:50 ` Lars Hanisch [this message]
2010-04-07 22:15 ` hermann pitton
2010-04-08 0:47 ` Mike Isely
2010-04-08 0:58 ` Mike Isely
2010-04-08 17:57 ` Lars Hanisch
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BBCD3F9.1070207@cinnamon-sage.de \
--to=dvb@cinnamon-sage.de \
--cc=hverkuil@xs4all.nl \
--cc=isely@isely.net \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.