// SPDX-License-Identifier: GPL-2.0-or-later /* A driver for the D-Link DSB-R100 USB radio and Gemtek USB Radio 21. *ThedeviceplugsintoboththeUSBandananalogaudioinput,sothisthing *onlydealswithinitialisationandfrequencysetting,the *audiodatahastobehandledbyasounddriver. * *Majorissue:Ican'tfindoutwherethedevicereportsthesignal *strength,andindeedthewindowssoftwareappearantlyjustlooks *atthestereoindicatoraswell.So,scanningwillonlyfind *stereostations.Sad,butIcan'thelpit. * *Also,thewindowsprogramsendsoodlesofmessagesovertothe *device,andIcouldn'tfigureouttheirmeaning.Mysuspicion *isthattheydon'thaveany:-) * *Youmightfindsomeinterestingstuffaboutthismoduleat *http://unimut.fsk.uni-heidelberg.de/unimut/demi/dsbr * *FullytestedwiththeKeeneUSBFMTransmitterandthev4l2-compliancetool. * *Copyright(c)2000MarkusDemleitner<msdemlei@cl.uni-heidelberg.de>
*/
/* *VersionInformation
*/
MODULE_AUTHOR("Markus Demleitner <msdemlei@tucana.harvard.edu>");
MODULE_DESCRIPTION("D-Link DSB-R100 USB FM radio driver");
MODULE_LICENSE("GPL");
MODULE_VERSION("1.1.0");
/* Commands the device appears to understand */ #define DSB100_TUNE 1 #define DSB100_ONOFF 2
#define TB_LEN 16
/* Frequency limits in MHz -- these are European values. For Japanese
devices, that would be 76 and 91. */ #define FREQ_MIN 87.5 #define FREQ_MAX 108.0 #define FREQ_MUL 16000
/* set a frequency, freq is defined by v4l's TUNER_LOW, i.e. 1/16th kHz */ staticint dsbr100_setfreq(struct dsbr100_device *radio, unsigned freq)
{ unsigned f = (freq / 16 * 80) / 1000 + 856; int retval = 0;
/* switch on radio */ staticint dsbr100_start(struct dsbr100_device *radio)
{ int retval = usb_control_msg(radio->usbdev,
usb_rcvctrlpipe(radio->usbdev, 0),
DSB100_ONOFF,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 0x01, 0x00, radio->transfer_buffer, 8, 300);
if (retval >= 0) return dsbr100_setfreq(radio, radio->curfreq);
dev_err(&radio->usbdev->dev, "%s - usb_control_msg returned %i, request %i\n",
__func__, retval, DSB100_ONOFF); return retval;
}
/* switch off radio */ staticint dsbr100_stop(struct dsbr100_device *radio)
{ int retval = usb_control_msg(radio->usbdev,
usb_rcvctrlpipe(radio->usbdev, 0),
DSB100_ONOFF,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 0x00, 0x00, radio->transfer_buffer, 8, 300);
if (retval >= 0) return0;
dev_err(&radio->usbdev->dev, "%s - usb_control_msg returned %i, request %i\n",
__func__, retval, DSB100_ONOFF); return retval;
}
/* return the device status. This is, in effect, just whether it
sees a stereo signal or not. Pity. */ staticvoid dsbr100_getstat(struct dsbr100_device *radio)
{ int retval = usb_control_msg(radio->usbdev,
usb_rcvctrlpipe(radio->usbdev, 0),
USB_REQ_GET_STATUS,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 0x00, 0x24, radio->transfer_buffer, 8, 300);
/* check if the device is present and register with v4l and usb if it is */ staticint usb_dsbr100_probe(struct usb_interface *intf, conststruct usb_device_id *id)
{ struct dsbr100_device *radio; struct v4l2_device *v4l2_dev; int retval;
radio = kzalloc(sizeof(struct dsbr100_device), GFP_KERNEL);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.