aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2015-10-10 12:51:05 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-10-20 13:53:49 -0400
commiteec20f0654a45c43b303a2f386c654c4171d9f6e (patch)
treea00ef09bb1ce2b60ab6decb6ac9f8301145255c4
parentb3ae29667e22921b8bd8ba84bf719a240f303aa2 (diff)
[media] hackrf: switch to single function which configures everything
Implement single funtion, hackrf_set_params(), which handles all needed settings. Controls and other IOCTLs are just wrappers to that function. That way we can get easily better control what we could do on different device states - sleeping, receiving, transmitting. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r--drivers/media/usb/hackrf/hackrf.c323
1 files changed, 175 insertions, 148 deletions
diff --git a/drivers/media/usb/hackrf/hackrf.c b/drivers/media/usb/hackrf/hackrf.c
index eee42b48a3c7..eac1c521c9d8 100644
--- a/drivers/media/usb/hackrf/hackrf.c
+++ b/drivers/media/usb/hackrf/hackrf.c
@@ -93,11 +93,17 @@ struct hackrf_frame_buf {
93}; 93};
94 94
95struct hackrf_dev { 95struct hackrf_dev {
96#define POWER_ON (1 << 1) 96#define POWER_ON 1
97#define URB_BUF (1 << 2) 97#define USB_STATE_URB_BUF 2 /* XXX: set manually */
98#define USB_STATE_URB_BUF (1 << 3) 98#define SAMPLE_RATE_SET 10
99#define RX_BANDWIDTH 11
100#define RX_RF_FREQUENCY 12
101#define RX_RF_GAIN 13
102#define RX_LNA_GAIN 14
103#define RX_IF_GAIN 15
99 unsigned long flags; 104 unsigned long flags;
100 105
106 struct usb_interface *intf;
101 struct device *dev; 107 struct device *dev;
102 struct usb_device *udev; 108 struct usb_device *udev;
103 struct video_device vdev; 109 struct video_device vdev;
@@ -210,6 +216,140 @@ err:
210 return ret; 216 return ret;
211} 217}
212 218
219static int hackrf_set_params(struct hackrf_dev *dev)
220{
221 struct usb_interface *intf = dev->intf;
222 int ret, i;
223 u8 buf[8], u8tmp;
224 unsigned int uitmp, uitmp1, uitmp2;
225
226 if (!test_bit(POWER_ON, &dev->flags)) {
227 dev_dbg(&intf->dev, "device is sleeping\n");
228 return 0;
229 }
230
231 if (test_and_clear_bit(SAMPLE_RATE_SET, &dev->flags)) {
232 dev_dbg(&intf->dev, "ADC frequency=%u Hz\n", dev->f_adc);
233 uitmp1 = dev->f_adc;
234 uitmp2 = 1;
235 buf[0] = (uitmp1 >> 0) & 0xff;
236 buf[1] = (uitmp1 >> 8) & 0xff;
237 buf[2] = (uitmp1 >> 16) & 0xff;
238 buf[3] = (uitmp1 >> 24) & 0xff;
239 buf[4] = (uitmp2 >> 0) & 0xff;
240 buf[5] = (uitmp2 >> 8) & 0xff;
241 buf[6] = (uitmp2 >> 16) & 0xff;
242 buf[7] = (uitmp2 >> 24) & 0xff;
243 ret = hackrf_ctrl_msg(dev, CMD_SAMPLE_RATE_SET, 0, 0, buf, 8);
244 if (ret)
245 goto err;
246 }
247
248 if (test_and_clear_bit(RX_BANDWIDTH, &dev->flags)) {
249 static const struct {
250 u32 freq;
251 } bandwidth_lut[] = {
252 { 1750000}, /* 1.75 MHz */
253 { 2500000}, /* 2.5 MHz */
254 { 3500000}, /* 3.5 MHz */
255 { 5000000}, /* 5 MHz */
256 { 5500000}, /* 5.5 MHz */
257 { 6000000}, /* 6 MHz */
258 { 7000000}, /* 7 MHz */
259 { 8000000}, /* 8 MHz */
260 { 9000000}, /* 9 MHz */
261 {10000000}, /* 10 MHz */
262 {12000000}, /* 12 MHz */
263 {14000000}, /* 14 MHz */
264 {15000000}, /* 15 MHz */
265 {20000000}, /* 20 MHz */
266 {24000000}, /* 24 MHz */
267 {28000000}, /* 28 MHz */
268 };
269
270 if (dev->bandwidth_auto->val == true)
271 uitmp = dev->f_adc;
272 else
273 uitmp = dev->bandwidth->val;
274
275 for (i = 0; i < ARRAY_SIZE(bandwidth_lut); i++) {
276 if (uitmp <= bandwidth_lut[i].freq) {
277 uitmp = bandwidth_lut[i].freq;
278 break;
279 }
280 }
281
282 dev->bandwidth->val = uitmp;
283 dev->bandwidth->cur.val = uitmp;
284
285 dev_dbg(&intf->dev, "bandwidth selected=%u\n", uitmp);
286
287 uitmp1 = 0;
288 uitmp1 |= ((uitmp >> 0) & 0xff) << 0;
289 uitmp1 |= ((uitmp >> 8) & 0xff) << 8;
290 uitmp2 = 0;
291 uitmp2 |= ((uitmp >> 16) & 0xff) << 0;
292 uitmp2 |= ((uitmp >> 24) & 0xff) << 8;
293
294 ret = hackrf_ctrl_msg(dev, CMD_BASEBAND_FILTER_BANDWIDTH_SET,
295 uitmp1, uitmp2, NULL, 0);
296 if (ret)
297 goto err;
298 }
299
300 if (test_and_clear_bit(RX_RF_FREQUENCY, &dev->flags)) {
301 dev_dbg(&intf->dev, "RF frequency=%u Hz\n", dev->f_rf);
302 uitmp1 = dev->f_rf / 1000000;
303 uitmp2 = dev->f_rf % 1000000;
304 buf[0] = (uitmp1 >> 0) & 0xff;
305 buf[1] = (uitmp1 >> 8) & 0xff;
306 buf[2] = (uitmp1 >> 16) & 0xff;
307 buf[3] = (uitmp1 >> 24) & 0xff;
308 buf[4] = (uitmp2 >> 0) & 0xff;
309 buf[5] = (uitmp2 >> 8) & 0xff;
310 buf[6] = (uitmp2 >> 16) & 0xff;
311 buf[7] = (uitmp2 >> 24) & 0xff;
312 ret = hackrf_ctrl_msg(dev, CMD_SET_FREQ, 0, 0, buf, 8);
313 if (ret)
314 goto err;
315 }
316
317 if (test_and_clear_bit(RX_RF_GAIN, &dev->flags)) {
318 dev_dbg(&intf->dev, "RF gain val=%d->%d\n",
319 dev->rf_gain->cur.val, dev->rf_gain->val);
320
321 u8tmp = (dev->rf_gain->val) ? 1 : 0;
322 ret = hackrf_ctrl_msg(dev, CMD_AMP_ENABLE, u8tmp, 0, NULL, 0);
323 if (ret)
324 goto err;
325 }
326
327 if (test_and_clear_bit(RX_LNA_GAIN, &dev->flags)) {
328 dev_dbg(dev->dev, "LNA gain val=%d->%d\n",
329 dev->lna_gain->cur.val, dev->lna_gain->val);
330
331 ret = hackrf_ctrl_msg(dev, CMD_SET_LNA_GAIN, 0,
332 dev->lna_gain->val, &u8tmp, 1);
333 if (ret)
334 goto err;
335 }
336
337 if (test_and_clear_bit(RX_IF_GAIN, &dev->flags)) {
338 dev_dbg(&intf->dev, "IF gain val=%d->%d\n",
339 dev->if_gain->cur.val, dev->if_gain->val);
340
341 ret = hackrf_ctrl_msg(dev, CMD_SET_VGA_GAIN, 0,
342 dev->if_gain->val, &u8tmp, 1);
343 if (ret)
344 goto err;
345 }
346
347 return 0;
348err:
349 dev_dbg(&intf->dev, "failed=%d\n", ret);
350 return ret;
351}
352
213/* Private functions */ 353/* Private functions */
214static struct hackrf_frame_buf *hackrf_get_next_fill_buf(struct hackrf_dev *dev) 354static struct hackrf_frame_buf *hackrf_get_next_fill_buf(struct hackrf_dev *dev)
215{ 355{
@@ -527,6 +667,10 @@ static int hackrf_start_streaming(struct vb2_queue *vq, unsigned int count)
527 if (ret) 667 if (ret)
528 goto err; 668 goto err;
529 669
670 ret = hackrf_set_params(dev);
671 if (ret)
672 goto err;
673
530 /* start hardware streaming */ 674 /* start hardware streaming */
531 ret = hackrf_ctrl_msg(dev, CMD_SET_TRANSCEIVER_MODE, 1, 0, NULL, 0); 675 ret = hackrf_ctrl_msg(dev, CMD_SET_TRANSCEIVER_MODE, 1, 0, NULL, 0);
532 if (ret) 676 if (ret)
@@ -739,47 +883,32 @@ static int hackrf_s_frequency(struct file *file, void *priv,
739 const struct v4l2_frequency *f) 883 const struct v4l2_frequency *f)
740{ 884{
741 struct hackrf_dev *dev = video_drvdata(file); 885 struct hackrf_dev *dev = video_drvdata(file);
886 struct usb_interface *intf = dev->intf;
742 int ret; 887 int ret;
743 unsigned int upper, lower;
744 u8 buf[8];
745 888
746 dev_dbg(dev->dev, "tuner=%d type=%d frequency=%u\n", 889 dev_dbg(&intf->dev, "tuner=%d type=%d frequency=%u\n",
747 f->tuner, f->type, f->frequency); 890 f->tuner, f->type, f->frequency);
748 891
749 if (f->tuner == 0) { 892 if (f->tuner == 0) {
750 dev->f_adc = clamp_t(unsigned int, f->frequency, 893 dev->f_adc = clamp_t(unsigned int, f->frequency,
751 bands_adc[0].rangelow, bands_adc[0].rangehigh); 894 bands_adc[0].rangelow, bands_adc[0].rangehigh);
752 dev_dbg(dev->dev, "ADC frequency=%u Hz\n", dev->f_adc); 895 set_bit(SAMPLE_RATE_SET, &dev->flags);
753 upper = dev->f_adc;
754 lower = 1;
755 buf[0] = (upper >> 0) & 0xff;
756 buf[1] = (upper >> 8) & 0xff;
757 buf[2] = (upper >> 16) & 0xff;
758 buf[3] = (upper >> 24) & 0xff;
759 buf[4] = (lower >> 0) & 0xff;
760 buf[5] = (lower >> 8) & 0xff;
761 buf[6] = (lower >> 16) & 0xff;
762 buf[7] = (lower >> 24) & 0xff;
763 ret = hackrf_ctrl_msg(dev, CMD_SAMPLE_RATE_SET, 0, 0, buf, 8);
764 } else if (f->tuner == 1) { 896 } else if (f->tuner == 1) {
765 dev->f_rf = clamp_t(unsigned int, f->frequency, 897 dev->f_rf = clamp_t(unsigned int, f->frequency,
766 bands_rf[0].rangelow, bands_rf[0].rangehigh); 898 bands_rf[0].rangelow, bands_rf[0].rangehigh);
767 dev_dbg(dev->dev, "RF frequency=%u Hz\n", dev->f_rf); 899 set_bit(RX_RF_FREQUENCY, &dev->flags);
768 upper = dev->f_rf / 1000000;
769 lower = dev->f_rf % 1000000;
770 buf[0] = (upper >> 0) & 0xff;
771 buf[1] = (upper >> 8) & 0xff;
772 buf[2] = (upper >> 16) & 0xff;
773 buf[3] = (upper >> 24) & 0xff;
774 buf[4] = (lower >> 0) & 0xff;
775 buf[5] = (lower >> 8) & 0xff;
776 buf[6] = (lower >> 16) & 0xff;
777 buf[7] = (lower >> 24) & 0xff;
778 ret = hackrf_ctrl_msg(dev, CMD_SET_FREQ, 0, 0, buf, 8);
779 } else { 900 } else {
780 ret = -EINVAL; 901 ret = -EINVAL;
902 goto err;
781 } 903 }
782 904
905 ret = hackrf_set_params(dev);
906 if (ret)
907 goto err;
908
909 return 0;
910err:
911 dev_dbg(&intf->dev, "failed=%d\n", ret);
783 return ret; 912 return ret;
784} 913}
785 914
@@ -892,144 +1021,41 @@ static void hackrf_video_release(struct v4l2_device *v)
892 kfree(dev); 1021 kfree(dev);
893} 1022}
894 1023
895static int hackrf_set_bandwidth(struct hackrf_dev *dev)
896{
897 int ret, i;
898 u16 u16tmp, u16tmp2;
899 unsigned int bandwidth;
900
901 static const struct {
902 u32 freq;
903 } bandwidth_lut[] = {
904 { 1750000}, /* 1.75 MHz */
905 { 2500000}, /* 2.5 MHz */
906 { 3500000}, /* 3.5 MHz */
907 { 5000000}, /* 5 MHz */
908 { 5500000}, /* 5.5 MHz */
909 { 6000000}, /* 6 MHz */
910 { 7000000}, /* 7 MHz */
911 { 8000000}, /* 8 MHz */
912 { 9000000}, /* 9 MHz */
913 {10000000}, /* 10 MHz */
914 {12000000}, /* 12 MHz */
915 {14000000}, /* 14 MHz */
916 {15000000}, /* 15 MHz */
917 {20000000}, /* 20 MHz */
918 {24000000}, /* 24 MHz */
919 {28000000}, /* 28 MHz */
920 };
921
922 dev_dbg(dev->dev, "bandwidth auto=%d->%d val=%d->%d f_adc=%u\n",
923 dev->bandwidth_auto->cur.val,
924 dev->bandwidth_auto->val, dev->bandwidth->cur.val,
925 dev->bandwidth->val, dev->f_adc);
926
927 if (dev->bandwidth_auto->val == true)
928 bandwidth = dev->f_adc;
929 else
930 bandwidth = dev->bandwidth->val;
931
932 for (i = 0; i < ARRAY_SIZE(bandwidth_lut); i++) {
933 if (bandwidth <= bandwidth_lut[i].freq) {
934 bandwidth = bandwidth_lut[i].freq;
935 break;
936 }
937 }
938
939 dev->bandwidth->val = bandwidth;
940 dev->bandwidth->cur.val = bandwidth;
941
942 dev_dbg(dev->dev, "bandwidth selected=%d\n", bandwidth);
943
944 u16tmp = 0;
945 u16tmp |= ((bandwidth >> 0) & 0xff) << 0;
946 u16tmp |= ((bandwidth >> 8) & 0xff) << 8;
947 u16tmp2 = 0;
948 u16tmp2 |= ((bandwidth >> 16) & 0xff) << 0;
949 u16tmp2 |= ((bandwidth >> 24) & 0xff) << 8;
950
951 ret = hackrf_ctrl_msg(dev, CMD_BASEBAND_FILTER_BANDWIDTH_SET,
952 u16tmp, u16tmp2, NULL, 0);
953 if (ret)
954 dev_dbg(dev->dev, "failed=%d\n", ret);
955
956 return ret;
957}
958
959static int hackrf_set_rf_gain(struct hackrf_dev *dev)
960{
961 int ret;
962 u8 u8tmp;
963
964 dev_dbg(dev->dev, "rf val=%d->%d\n",
965 dev->rf_gain->cur.val, dev->rf_gain->val);
966
967 u8tmp = (dev->rf_gain->val) ? 1 : 0;
968 ret = hackrf_ctrl_msg(dev, CMD_AMP_ENABLE, u8tmp, 0, NULL, 0);
969 if (ret)
970 dev_dbg(dev->dev, "failed=%d\n", ret);
971
972 return ret;
973}
974
975static int hackrf_set_lna_gain(struct hackrf_dev *dev)
976{
977 int ret;
978 u8 u8tmp;
979
980 dev_dbg(dev->dev, "lna val=%d->%d\n",
981 dev->lna_gain->cur.val, dev->lna_gain->val);
982
983 ret = hackrf_ctrl_msg(dev, CMD_SET_LNA_GAIN, 0, dev->lna_gain->val,
984 &u8tmp, 1);
985 if (ret)
986 dev_dbg(dev->dev, "failed=%d\n", ret);
987
988 return ret;
989}
990
991static int hackrf_set_if_gain(struct hackrf_dev *dev)
992{
993 int ret;
994 u8 u8tmp;
995
996 dev_dbg(dev->dev, "val=%d->%d\n",
997 dev->if_gain->cur.val, dev->if_gain->val);
998
999 ret = hackrf_ctrl_msg(dev, CMD_SET_VGA_GAIN, 0, dev->if_gain->val,
1000 &u8tmp, 1);
1001 if (ret)
1002 dev_dbg(dev->dev, "failed=%d\n", ret);
1003
1004 return ret;
1005}
1006
1007static int hackrf_s_ctrl(struct v4l2_ctrl *ctrl) 1024static int hackrf_s_ctrl(struct v4l2_ctrl *ctrl)
1008{ 1025{
1009 struct hackrf_dev *dev = container_of(ctrl->handler, 1026 struct hackrf_dev *dev = container_of(ctrl->handler,
1010 struct hackrf_dev, hdl); 1027 struct hackrf_dev, hdl);
1028 struct usb_interface *intf = dev->intf;
1011 int ret; 1029 int ret;
1012 1030
1013 switch (ctrl->id) { 1031 switch (ctrl->id) {
1014 case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO: 1032 case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO:
1015 case V4L2_CID_RF_TUNER_BANDWIDTH: 1033 case V4L2_CID_RF_TUNER_BANDWIDTH:
1016 ret = hackrf_set_bandwidth(dev); 1034 set_bit(RX_BANDWIDTH, &dev->flags);
1017 break; 1035 break;
1018 case V4L2_CID_RF_TUNER_RF_GAIN: 1036 case V4L2_CID_RF_TUNER_RF_GAIN:
1019 ret = hackrf_set_rf_gain(dev); 1037 set_bit(RX_RF_GAIN, &dev->flags);
1020 break; 1038 break;
1021 case V4L2_CID_RF_TUNER_LNA_GAIN: 1039 case V4L2_CID_RF_TUNER_LNA_GAIN:
1022 ret = hackrf_set_lna_gain(dev); 1040 set_bit(RX_LNA_GAIN, &dev->flags);
1023 break; 1041 break;
1024 case V4L2_CID_RF_TUNER_IF_GAIN: 1042 case V4L2_CID_RF_TUNER_IF_GAIN:
1025 ret = hackrf_set_if_gain(dev); 1043 set_bit(RX_IF_GAIN, &dev->flags);
1026 break; 1044 break;
1027 default: 1045 default:
1028 dev_dbg(dev->dev, "unknown ctrl: id=%d name=%s\n", 1046 dev_dbg(&intf->dev, "unknown ctrl: id=%d name=%s\n",
1029 ctrl->id, ctrl->name); 1047 ctrl->id, ctrl->name);
1030 ret = -EINVAL; 1048 ret = -EINVAL;
1049 goto err;
1031 } 1050 }
1032 1051
1052 ret = hackrf_set_params(dev);
1053 if (ret)
1054 goto err;
1055
1056 return 0;
1057err:
1058 dev_dbg(&intf->dev, "failed=%d\n", ret);
1033 return ret; 1059 return ret;
1034} 1060}
1035 1061
@@ -1052,6 +1078,7 @@ static int hackrf_probe(struct usb_interface *intf,
1052 mutex_init(&dev->vb_queue_lock); 1078 mutex_init(&dev->vb_queue_lock);
1053 spin_lock_init(&dev->queued_bufs_lock); 1079 spin_lock_init(&dev->queued_bufs_lock);
1054 INIT_LIST_HEAD(&dev->queued_bufs); 1080 INIT_LIST_HEAD(&dev->queued_bufs);
1081 dev->intf = intf;
1055 dev->dev = &intf->dev; 1082 dev->dev = &intf->dev;
1056 dev->udev = interface_to_usbdev(intf); 1083 dev->udev = interface_to_usbdev(intf);
1057 dev->f_adc = bands_adc[0].rangelow; 1084 dev->f_adc = bands_adc[0].rangelow;