Re: Keene

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

 



On Fri April 19 2013 11:11:27 Antti Palosaari wrote:
> On 04/19/2013 10:12 AM, Hans Verkuil wrote:
> > On Wed April 17 2013 21:45:24 Antti Palosaari wrote:
> >> On 04/15/2013 09:55 AM, Hans Verkuil wrote:
> >>> On Fri April 12 2013 02:11:41 Antti Palosaari wrote:
> >>>> Hello Hans,
> >>>> That device is working very, thank you for it. Anyhow, I noticed two things.
> >>>>
> >>>> 1) it does not start transmitting just after I plug it - I have to
> >>>> retune it!
> >>>> Output says it is tuned to 95.160000 MHz by default, but it is not.
> >>>> After I issue retune, just to same channel it starts working.
> >>>> $ v4l2-ctl -d /dev/radio0 --set-freq=95.16
> >>>
> >>> Can you try this patch:
> >>>
> >>
> >> It does not resolve the problem. It is quite strange behavior. After I
> >> install modules, and modules are unload, plug stick in first time, it
> >> usually (not every-time) starts TX. But when I replug it without
> >> unloading modules, it will never start TX. Tx is started always when I
> >> set freq using v4l2-ctl.
> >
> > If you replace 'false' by 'true' in the cmd_main, does that make it work?
> > I'm fairly certain that's the problem.
> 
> Nope, I replaces all 'false' with 'true' and problem remains. When 
> modules were unload and device is plugged it starts TX. When I replug it 
> doesn't start anymore.
> 
> I just added msleep(1000); just before keene_cmd_main() in .probe() and 
> now it seems to work every-time. So it is definitely timing issue. I 
> will try to find out some smallest suitable value for sleep and and sent 
> patch.
> 
> 
> >
> >>
> >> Possible timing issue?
> >>
> >>
> >> Is there some flag API flag to tell start / stop device? For my mind
> >> correct behavior is to stop TX and sleep when device is plugged/module
> >> load. Something like set freq 0 when device is not active to tell user
> >> it is not sending/receiving and must be tuned in order to operate.
> >
> > This is actually a core problem with the radio API: there is no clear
> > way of turning the tuner or modulator on and off on command. With video
> > you know that you can turn off the tuner if no filehandle is open. But
> > with radio you do not have that luxury since audio can go through alsa
> > or through an audio jack.
> >
> > One option is to use mute. Most radio receivers start off muted and you
> > have to unmute first. This could be used as a signal for receivers to
> > turn the tuner on/off. But for a modulator that's not an option: turning
> > off the modulator means turning off the transmitter, and that's not what
> > you want if you are, say, the presenter of a radio program and you want
> > to quickly mute because you feel a sneeze coming :-)
> >
> > I think we need a specific API for this, but in the absence of one we should
> > just leave the modulator enabled from the start.
> 
> yeah, that's just the issue I was wondering. Is there some reason 
> frequency value could not be used? Defining frequency to 0MHz or -1MHz 
> and Tx (maybe Rx too) is off?

It's one option, yes. But I'm not entirely pleased with that as I'd like the
driver to remember the last frequency. I would prefer to handle this as a
separate setting. There may be other solutions as well, I'm not sure.

The core problem is of course a poor design of the radio API: it really should
behave like a video node where it is possible to power off if nobody has the
node open. But that breaks compatibility...

Since this is all very specific to radio devices I am inclined to introduce
a radio-specific ioctl or control for this.

But there is a related issue with USB video devices: after the last close()
do you power off the device immediately, wait a bit before doing that or keep
it alive all the time? This becomes relevant if powering up takes a long time
because of e.g. having to reload firmware or intializing i2c devices.

So perhaps this can be solved with two generic controls:

bool CID_POWER_OFF_AT_LAST_CLOSE
int CID_POWER_OFF_DELAY (unit: seconds)

If POWER_OFF_AT_LAST_CLOSE is false, then you never power off. If it is true,
then power off after a given delay. If the delay == 0 then power off immediately.

Drivers can decide on proper default values. But radio devices must start
with CID_POWER_OFF_AT_LAST_CLOSE set to false for compatibility reasons.

I don't have time for the next few weeks to investigate this further, so if
you are interested...

Regards,

	Hans

> Here is power consumption I measured:
> 26.5mA play=false (idle mode)
> 39.0mA Tx on 95.16 MHz
> 
> It wastes 12.5mA (from USB Vcc 5v) when Tx is enabled.
> 
> regards
> Antti
> 
> >
> > Regards,
> >
> > 	Hans
> >
> >>
> >>
> >> regards
> >> Antti
> >>
> >>
> >>
> >>
> >>
> >>
> >>> diff --git a/drivers/media/radio/radio-keene.c b/drivers/media/radio/radio-keene.c
> >>> index 4c9ae76..99da3d4 100644
> >>> --- a/drivers/media/radio/radio-keene.c
> >>> +++ b/drivers/media/radio/radio-keene.c
> >>> @@ -93,7 +93,7 @@ static int keene_cmd_main(struct keene_device *radio, unsigned freq, bool play)
> >>>    	/* If bit 4 is set, then tune to the frequency.
> >>>    	   If bit 3 is set, then unmute; if bit 2 is set, then mute.
> >>>    	   If bit 1 is set, then enter idle mode; if bit 0 is set,
> >>> -	   then enter transit mode.
> >>> +	   then enter transmit mode.
> >>>    	 */
> >>>    	radio->buffer[5] = (radio->muted ? 4 : 8) | (play ? 1 : 2) |
> >>>    							(freq ? 0x10 : 0);
> >>> @@ -350,7 +350,6 @@ static int usb_keene_probe(struct usb_interface *intf,
> >>>    	radio->pa = 118;
> >>>    	radio->tx = 0x32;
> >>>    	radio->stereo = true;
> >>> -	radio->curfreq = 95.16 * FREQ_MUL;
> >>>    	if (hdl->error) {
> >>>    		retval = hdl->error;
> >>>
> >>> @@ -383,6 +382,8 @@ static int usb_keene_probe(struct usb_interface *intf,
> >>>    	video_set_drvdata(&radio->vdev, radio);
> >>>    	set_bit(V4L2_FL_USE_FH_PRIO, &radio->vdev.flags);
> >>>
> >>> +	keene_cmd_main(radio, 95.16 * FREQ_MUL, false);
> >>> +
> >>>    	retval = video_register_device(&radio->vdev, VFL_TYPE_RADIO, -1);
> >>>    	if (retval < 0) {
> >>>    		dev_err(&intf->dev, "could not register video device\n");
> >>>
> >>>
> >>>> 2) What is that log printing?
> >>>> ALSA sound/usb/mixer.c:932 13:0: cannot get min/max values for control 2
> >>>> (id 13)
> >>>>
> >>>>
> >>>> usb 5-2: new full-speed USB device number 3 using ohci_hcd
> >>>> usb 5-2: New USB device found, idVendor=046d, idProduct=0a0e
> >>>> usb 5-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> >>>> usb 5-2: Product: B-LINK USB Audio
> >>>> usb 5-2: Manufacturer: HOLTEK
> >>>> ALSA sound/usb/mixer.c:932 13:0: cannot get min/max values for control 2
> >>>> (id 13)
> >>>> radio-keene 5-2:1.2: V4L2 device registered as radio0
> >>>
> >>> No idea, and I don't get that message either.
> >>>
> >>> Regards,
> >>>
> >>> 	Hans
> >>>
> >>>>
> >>>>
> >>>> $ v4l2-ctl -d /dev/radio0 --all -L
> >>>> Driver Info (not using libv4l2):
> >>>> 	Driver name   : radio-keene
> >>>> 	Card type     : Keene FM Transmitter
> >>>> 	Bus info      : usb-0000:00:13.0-2
> >>>> 	Driver version: 3.9.0
> >>>> 	Capabilities  : 0x800C0000
> >>>> 		Modulator
> >>>> 		Radio
> >>>> Frequency: 1522560 (95.160000 MHz)
> >>>> Modulator:
> >>>> 	Name                 : FM
> >>>> 	Capabilities         : 62.5 Hz stereo
> >>>> 	Frequency range      : 76.0 MHz - 108.0 MHz
> >>>> 	Subchannel modulation: stereo
> >>>> Priority: 2
> >>>>
> >>>> User Controls
> >>>>
> >>>>                               mute (bool)   : default=0 value=0
> >>>>
> >>>> FM Radio Modulator Controls
> >>>>
> >>>>             audio_compression_gain (int)    : min=-15 max=18 step=3
> >>>> default=0 value=0 flags=slider
> >>>>                       pre_emphasis (menu)   : min=0 max=2 default=1 value=1
> >>>> 				1: 50 Microseconds
> >>>> 				2: 75 Microseconds
> >>>>                   tune_power_level (int)    : min=84 max=118 step=1
> >>>> default=118 value=118 flags=slider
> >>>>
> >>>>
> >>>> regards
> >>>> Antti
> >>>>
> >>>>
> >>
> >>
> >>
> 
> 
> 
--
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