radio-ma901.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. /*
  2. * Driver for the MasterKit MA901 USB FM radio. This device plugs
  3. * into the USB port and an analog audio input or headphones, so this thing
  4. * only deals with initialization, frequency setting, volume.
  5. *
  6. * Copyright (c) 2012 Alexey Klimov <klimov.linux@gmail.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. */
  18. #include <linux/kernel.h>
  19. #include <linux/module.h>
  20. #include <linux/init.h>
  21. #include <linux/slab.h>
  22. #include <linux/input.h>
  23. #include <linux/videodev2.h>
  24. #include <media/v4l2-device.h>
  25. #include <media/v4l2-ioctl.h>
  26. #include <media/v4l2-ctrls.h>
  27. #include <media/v4l2-event.h>
  28. #include <linux/usb.h>
  29. #include <linux/mutex.h>
  30. #define DRIVER_AUTHOR "Alexey Klimov <klimov.linux@gmail.com>"
  31. #define DRIVER_DESC "Masterkit MA901 USB FM radio driver"
  32. #define DRIVER_VERSION "0.0.1"
  33. MODULE_AUTHOR(DRIVER_AUTHOR);
  34. MODULE_DESCRIPTION(DRIVER_DESC);
  35. MODULE_LICENSE("GPL");
  36. MODULE_VERSION(DRIVER_VERSION);
  37. #define USB_MA901_VENDOR 0x16c0
  38. #define USB_MA901_PRODUCT 0x05df
  39. /* dev_warn macro with driver name */
  40. #define MA901_DRIVER_NAME "radio-ma901"
  41. #define ma901radio_dev_warn(dev, fmt, arg...) \
  42. dev_warn(dev, MA901_DRIVER_NAME " - " fmt, ##arg)
  43. #define ma901radio_dev_err(dev, fmt, arg...) \
  44. dev_err(dev, MA901_DRIVER_NAME " - " fmt, ##arg)
  45. /* Probably USB_TIMEOUT should be modified in module parameter */
  46. #define BUFFER_LENGTH 8
  47. #define USB_TIMEOUT 500
  48. #define FREQ_MIN 87.5
  49. #define FREQ_MAX 108.0
  50. #define FREQ_MUL 16000
  51. #define MA901_VOLUME_MAX 16
  52. #define MA901_VOLUME_MIN 0
  53. /* Commands that device should understand
  54. * List isn't full and will be updated with implementation of new functions
  55. */
  56. #define MA901_RADIO_SET_FREQ 0x03
  57. #define MA901_RADIO_SET_VOLUME 0x04
  58. #define MA901_RADIO_SET_MONO_STEREO 0x05
  59. /* Comfortable defines for ma901radio_set_stereo */
  60. #define MA901_WANT_STEREO 0x50
  61. #define MA901_WANT_MONO 0xd0
  62. /* module parameter */
  63. static int radio_nr = -1;
  64. module_param(radio_nr, int, 0);
  65. MODULE_PARM_DESC(radio_nr, "Radio file number");
  66. /* Data for one (physical) device */
  67. struct ma901radio_device {
  68. /* reference to USB and video device */
  69. struct usb_device *usbdev;
  70. struct usb_interface *intf;
  71. struct video_device vdev;
  72. struct v4l2_device v4l2_dev;
  73. struct v4l2_ctrl_handler hdl;
  74. u8 *buffer;
  75. struct mutex lock; /* buffer locking */
  76. int curfreq;
  77. u16 volume;
  78. int stereo;
  79. bool muted;
  80. };
  81. static inline struct ma901radio_device *to_ma901radio_dev(struct v4l2_device *v4l2_dev)
  82. {
  83. return container_of(v4l2_dev, struct ma901radio_device, v4l2_dev);
  84. }
  85. /* set a frequency, freq is defined by v4l's TUNER_LOW, i.e. 1/16th kHz */
  86. static int ma901radio_set_freq(struct ma901radio_device *radio, int freq)
  87. {
  88. unsigned int freq_send = 0x300 + (freq >> 5) / 25;
  89. int retval;
  90. radio->buffer[0] = 0x0a;
  91. radio->buffer[1] = MA901_RADIO_SET_FREQ;
  92. radio->buffer[2] = ((freq_send >> 8) & 0xff) + 0x80;
  93. radio->buffer[3] = freq_send & 0xff;
  94. radio->buffer[4] = 0x00;
  95. radio->buffer[5] = 0x00;
  96. radio->buffer[6] = 0x00;
  97. radio->buffer[7] = 0x00;
  98. retval = usb_control_msg(radio->usbdev, usb_sndctrlpipe(radio->usbdev, 0),
  99. 9, 0x21, 0x0300, 0,
  100. radio->buffer, BUFFER_LENGTH, USB_TIMEOUT);
  101. if (retval < 0)
  102. return retval;
  103. radio->curfreq = freq;
  104. return 0;
  105. }
  106. static int ma901radio_set_volume(struct ma901radio_device *radio, u16 vol_to_set)
  107. {
  108. int retval;
  109. radio->buffer[0] = 0x0a;
  110. radio->buffer[1] = MA901_RADIO_SET_VOLUME;
  111. radio->buffer[2] = 0xc2;
  112. radio->buffer[3] = vol_to_set + 0x20;
  113. radio->buffer[4] = 0x00;
  114. radio->buffer[5] = 0x00;
  115. radio->buffer[6] = 0x00;
  116. radio->buffer[7] = 0x00;
  117. retval = usb_control_msg(radio->usbdev, usb_sndctrlpipe(radio->usbdev, 0),
  118. 9, 0x21, 0x0300, 0,
  119. radio->buffer, BUFFER_LENGTH, USB_TIMEOUT);
  120. if (retval < 0)
  121. return retval;
  122. radio->volume = vol_to_set;
  123. return retval;
  124. }
  125. static int ma901_set_stereo(struct ma901radio_device *radio, u8 stereo)
  126. {
  127. int retval;
  128. radio->buffer[0] = 0x0a;
  129. radio->buffer[1] = MA901_RADIO_SET_MONO_STEREO;
  130. radio->buffer[2] = stereo;
  131. radio->buffer[3] = 0x00;
  132. radio->buffer[4] = 0x00;
  133. radio->buffer[5] = 0x00;
  134. radio->buffer[6] = 0x00;
  135. radio->buffer[7] = 0x00;
  136. retval = usb_control_msg(radio->usbdev, usb_sndctrlpipe(radio->usbdev, 0),
  137. 9, 0x21, 0x0300, 0,
  138. radio->buffer, BUFFER_LENGTH, USB_TIMEOUT);
  139. if (retval < 0)
  140. return retval;
  141. if (stereo == MA901_WANT_STEREO)
  142. radio->stereo = V4L2_TUNER_MODE_STEREO;
  143. else
  144. radio->stereo = V4L2_TUNER_MODE_MONO;
  145. return retval;
  146. }
  147. /* Handle unplugging the device.
  148. * We call video_unregister_device in any case.
  149. * The last function called in this procedure is
  150. * usb_ma901radio_device_release.
  151. */
  152. static void usb_ma901radio_disconnect(struct usb_interface *intf)
  153. {
  154. struct ma901radio_device *radio = to_ma901radio_dev(usb_get_intfdata(intf));
  155. mutex_lock(&radio->lock);
  156. video_unregister_device(&radio->vdev);
  157. usb_set_intfdata(intf, NULL);
  158. v4l2_device_disconnect(&radio->v4l2_dev);
  159. mutex_unlock(&radio->lock);
  160. v4l2_device_put(&radio->v4l2_dev);
  161. }
  162. /* vidioc_querycap - query device capabilities */
  163. static int vidioc_querycap(struct file *file, void *priv,
  164. struct v4l2_capability *v)
  165. {
  166. struct ma901radio_device *radio = video_drvdata(file);
  167. strlcpy(v->driver, "radio-ma901", sizeof(v->driver));
  168. strlcpy(v->card, "Masterkit MA901 USB FM Radio", sizeof(v->card));
  169. usb_make_path(radio->usbdev, v->bus_info, sizeof(v->bus_info));
  170. v->device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
  171. v->capabilities = v->device_caps | V4L2_CAP_DEVICE_CAPS;
  172. return 0;
  173. }
  174. /* vidioc_g_tuner - get tuner attributes */
  175. static int vidioc_g_tuner(struct file *file, void *priv,
  176. struct v4l2_tuner *v)
  177. {
  178. struct ma901radio_device *radio = video_drvdata(file);
  179. if (v->index > 0)
  180. return -EINVAL;
  181. v->signal = 0;
  182. /* TODO: the same words like in _probe() goes here.
  183. * When receiving of stats will be implemented then we can call
  184. * ma901radio_get_stat().
  185. * retval = ma901radio_get_stat(radio, &is_stereo, &v->signal);
  186. */
  187. strcpy(v->name, "FM");
  188. v->type = V4L2_TUNER_RADIO;
  189. v->rangelow = FREQ_MIN * FREQ_MUL;
  190. v->rangehigh = FREQ_MAX * FREQ_MUL;
  191. v->capability = V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
  192. /* v->rxsubchans = is_stereo ? V4L2_TUNER_SUB_STEREO : V4L2_TUNER_SUB_MONO; */
  193. v->audmode = radio->stereo ?
  194. V4L2_TUNER_MODE_STEREO : V4L2_TUNER_MODE_MONO;
  195. return 0;
  196. }
  197. /* vidioc_s_tuner - set tuner attributes */
  198. static int vidioc_s_tuner(struct file *file, void *priv,
  199. const struct v4l2_tuner *v)
  200. {
  201. struct ma901radio_device *radio = video_drvdata(file);
  202. if (v->index > 0)
  203. return -EINVAL;
  204. /* mono/stereo selector */
  205. switch (v->audmode) {
  206. case V4L2_TUNER_MODE_MONO:
  207. return ma901_set_stereo(radio, MA901_WANT_MONO);
  208. default:
  209. return ma901_set_stereo(radio, MA901_WANT_STEREO);
  210. }
  211. }
  212. /* vidioc_s_frequency - set tuner radio frequency */
  213. static int vidioc_s_frequency(struct file *file, void *priv,
  214. const struct v4l2_frequency *f)
  215. {
  216. struct ma901radio_device *radio = video_drvdata(file);
  217. if (f->tuner != 0)
  218. return -EINVAL;
  219. return ma901radio_set_freq(radio, clamp_t(unsigned, f->frequency,
  220. FREQ_MIN * FREQ_MUL, FREQ_MAX * FREQ_MUL));
  221. }
  222. /* vidioc_g_frequency - get tuner radio frequency */
  223. static int vidioc_g_frequency(struct file *file, void *priv,
  224. struct v4l2_frequency *f)
  225. {
  226. struct ma901radio_device *radio = video_drvdata(file);
  227. if (f->tuner != 0)
  228. return -EINVAL;
  229. f->frequency = radio->curfreq;
  230. return 0;
  231. }
  232. static int usb_ma901radio_s_ctrl(struct v4l2_ctrl *ctrl)
  233. {
  234. struct ma901radio_device *radio =
  235. container_of(ctrl->handler, struct ma901radio_device, hdl);
  236. switch (ctrl->id) {
  237. case V4L2_CID_AUDIO_VOLUME: /* set volume */
  238. return ma901radio_set_volume(radio, (u16)ctrl->val);
  239. }
  240. return -EINVAL;
  241. }
  242. /* TODO: Should we really need to implement suspend and resume functions?
  243. * Radio has it's own memory and will continue playing if power is present
  244. * on usb port and on resume it will start to play again based on freq, volume
  245. * values in device memory.
  246. */
  247. static int usb_ma901radio_suspend(struct usb_interface *intf, pm_message_t message)
  248. {
  249. return 0;
  250. }
  251. static int usb_ma901radio_resume(struct usb_interface *intf)
  252. {
  253. return 0;
  254. }
  255. static const struct v4l2_ctrl_ops usb_ma901radio_ctrl_ops = {
  256. .s_ctrl = usb_ma901radio_s_ctrl,
  257. };
  258. /* File system interface */
  259. static const struct v4l2_file_operations usb_ma901radio_fops = {
  260. .owner = THIS_MODULE,
  261. .open = v4l2_fh_open,
  262. .release = v4l2_fh_release,
  263. .poll = v4l2_ctrl_poll,
  264. .unlocked_ioctl = video_ioctl2,
  265. };
  266. static const struct v4l2_ioctl_ops usb_ma901radio_ioctl_ops = {
  267. .vidioc_querycap = vidioc_querycap,
  268. .vidioc_g_tuner = vidioc_g_tuner,
  269. .vidioc_s_tuner = vidioc_s_tuner,
  270. .vidioc_g_frequency = vidioc_g_frequency,
  271. .vidioc_s_frequency = vidioc_s_frequency,
  272. .vidioc_log_status = v4l2_ctrl_log_status,
  273. .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
  274. .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
  275. };
  276. static void usb_ma901radio_release(struct v4l2_device *v4l2_dev)
  277. {
  278. struct ma901radio_device *radio = to_ma901radio_dev(v4l2_dev);
  279. v4l2_ctrl_handler_free(&radio->hdl);
  280. v4l2_device_unregister(&radio->v4l2_dev);
  281. kfree(radio->buffer);
  282. kfree(radio);
  283. }
  284. /* check if the device is present and register with v4l and usb if it is */
  285. static int usb_ma901radio_probe(struct usb_interface *intf,
  286. const struct usb_device_id *id)
  287. {
  288. struct usb_device *dev = interface_to_usbdev(intf);
  289. struct ma901radio_device *radio;
  290. int retval = 0;
  291. /* Masterkit MA901 usb radio has the same USB ID as many others
  292. * Atmel V-USB devices. Let's make additional checks to be sure
  293. * that this is our device.
  294. */
  295. if (dev->product && dev->manufacturer &&
  296. (strncmp(dev->product, "MA901", 5) != 0
  297. || strncmp(dev->manufacturer, "www.masterkit.ru", 16) != 0))
  298. return -ENODEV;
  299. radio = kzalloc(sizeof(struct ma901radio_device), GFP_KERNEL);
  300. if (!radio) {
  301. dev_err(&intf->dev, "kzalloc for ma901radio_device failed\n");
  302. retval = -ENOMEM;
  303. goto err;
  304. }
  305. radio->buffer = kmalloc(BUFFER_LENGTH, GFP_KERNEL);
  306. if (!radio->buffer) {
  307. dev_err(&intf->dev, "kmalloc for radio->buffer failed\n");
  308. retval = -ENOMEM;
  309. goto err_nobuf;
  310. }
  311. retval = v4l2_device_register(&intf->dev, &radio->v4l2_dev);
  312. if (retval < 0) {
  313. dev_err(&intf->dev, "couldn't register v4l2_device\n");
  314. goto err_v4l2;
  315. }
  316. v4l2_ctrl_handler_init(&radio->hdl, 1);
  317. /* TODO:It looks like this radio doesn't have mute/unmute control
  318. * and windows program just emulate it using volume control.
  319. * Let's plan to do the same in this driver.
  320. *
  321. * v4l2_ctrl_new_std(&radio->hdl, &usb_ma901radio_ctrl_ops,
  322. * V4L2_CID_AUDIO_MUTE, 0, 1, 1, 1);
  323. */
  324. v4l2_ctrl_new_std(&radio->hdl, &usb_ma901radio_ctrl_ops,
  325. V4L2_CID_AUDIO_VOLUME, MA901_VOLUME_MIN,
  326. MA901_VOLUME_MAX, 1, MA901_VOLUME_MAX);
  327. if (radio->hdl.error) {
  328. retval = radio->hdl.error;
  329. dev_err(&intf->dev, "couldn't register control\n");
  330. goto err_ctrl;
  331. }
  332. mutex_init(&radio->lock);
  333. radio->v4l2_dev.ctrl_handler = &radio->hdl;
  334. radio->v4l2_dev.release = usb_ma901radio_release;
  335. strlcpy(radio->vdev.name, radio->v4l2_dev.name,
  336. sizeof(radio->vdev.name));
  337. radio->vdev.v4l2_dev = &radio->v4l2_dev;
  338. radio->vdev.fops = &usb_ma901radio_fops;
  339. radio->vdev.ioctl_ops = &usb_ma901radio_ioctl_ops;
  340. radio->vdev.release = video_device_release_empty;
  341. radio->vdev.lock = &radio->lock;
  342. radio->usbdev = interface_to_usbdev(intf);
  343. radio->intf = intf;
  344. usb_set_intfdata(intf, &radio->v4l2_dev);
  345. radio->curfreq = 95.21 * FREQ_MUL;
  346. video_set_drvdata(&radio->vdev, radio);
  347. /* TODO: we can get some statistics (freq, volume) from device
  348. * but it's not implemented yet. After insertion in usb-port radio
  349. * setups frequency and starts playing without any initialization.
  350. * So we don't call usb_ma901radio_init/get_stat() here.
  351. * retval = usb_ma901radio_init(radio);
  352. */
  353. retval = video_register_device(&radio->vdev, VFL_TYPE_RADIO,
  354. radio_nr);
  355. if (retval < 0) {
  356. dev_err(&intf->dev, "could not register video device\n");
  357. goto err_vdev;
  358. }
  359. return 0;
  360. err_vdev:
  361. v4l2_ctrl_handler_free(&radio->hdl);
  362. err_ctrl:
  363. v4l2_device_unregister(&radio->v4l2_dev);
  364. err_v4l2:
  365. kfree(radio->buffer);
  366. err_nobuf:
  367. kfree(radio);
  368. err:
  369. return retval;
  370. }
  371. /* USB Device ID List */
  372. static const struct usb_device_id usb_ma901radio_device_table[] = {
  373. { USB_DEVICE_AND_INTERFACE_INFO(USB_MA901_VENDOR, USB_MA901_PRODUCT,
  374. USB_CLASS_HID, 0, 0) },
  375. { } /* Terminating entry */
  376. };
  377. MODULE_DEVICE_TABLE(usb, usb_ma901radio_device_table);
  378. /* USB subsystem interface */
  379. static struct usb_driver usb_ma901radio_driver = {
  380. .name = MA901_DRIVER_NAME,
  381. .probe = usb_ma901radio_probe,
  382. .disconnect = usb_ma901radio_disconnect,
  383. .suspend = usb_ma901radio_suspend,
  384. .resume = usb_ma901radio_resume,
  385. .reset_resume = usb_ma901radio_resume,
  386. .id_table = usb_ma901radio_device_table,
  387. };
  388. module_usb_driver(usb_ma901radio_driver);