^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * HackRF driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2014 Antti Palosaari <crope@iki.fi>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <media/v4l2-device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <media/v4l2-ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <media/v4l2-ctrls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <media/v4l2-event.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <media/videobuf2-v4l2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <media/videobuf2-vmalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * Used Avago MGA-81563 RF amplifier could be destroyed pretty easily with too
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * strong signal or transmitting to bad antenna.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * Set RF gain control to 'grabbed' state by default for sure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) static bool hackrf_enable_rf_gain_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) module_param_named(enable_rf_gain_ctrl, hackrf_enable_rf_gain_ctrl, bool, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) MODULE_PARM_DESC(enable_rf_gain_ctrl, "enable RX/TX RF amplifier control (warn: could damage amplifier)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* HackRF USB API commands (from HackRF Library) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) CMD_SET_TRANSCEIVER_MODE = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) CMD_SAMPLE_RATE_SET = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) CMD_BASEBAND_FILTER_BANDWIDTH_SET = 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) CMD_BOARD_ID_READ = 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) CMD_VERSION_STRING_READ = 0x0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) CMD_SET_FREQ = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) CMD_AMP_ENABLE = 0x11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) CMD_SET_LNA_GAIN = 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) CMD_SET_VGA_GAIN = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) CMD_SET_TXVGA_GAIN = 0x15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * bEndpointAddress 0x81 EP 1 IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * Transfer Type Bulk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * wMaxPacketSize 0x0200 1x 512 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define MAX_BULK_BUFS (6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define BULK_BUFFER_SIZE (128 * 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) static const struct v4l2_frequency_band bands_adc_dac[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .tuner = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) .type = V4L2_TUNER_SDR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .index = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .capability = V4L2_TUNER_CAP_1HZ | V4L2_TUNER_CAP_FREQ_BANDS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .rangelow = 200000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .rangehigh = 24000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) static const struct v4l2_frequency_band bands_rx_tx[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .tuner = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .type = V4L2_TUNER_RF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) .index = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .capability = V4L2_TUNER_CAP_1HZ | V4L2_TUNER_CAP_FREQ_BANDS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .rangelow = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .rangehigh = 4294967294LL, /* max u32, hw goes over 7GHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) /* stream formats */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct hackrf_format {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) u32 pixelformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) u32 buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) /* format descriptions for capture and preview */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) static struct hackrf_format formats[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) .pixelformat = V4L2_SDR_FMT_CS8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .buffersize = BULK_BUFFER_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static const unsigned int NUM_FORMATS = ARRAY_SIZE(formats);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* intermediate buffers with raw data from the USB device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct hackrf_buffer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct vb2_v4l2_buffer vb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) struct hackrf_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define USB_STATE_URB_BUF 1 /* XXX: set manually */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define RX_ON 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define TX_ON 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define RX_ADC_FREQUENCY 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define TX_DAC_FREQUENCY 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define RX_BANDWIDTH 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define TX_BANDWIDTH 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define RX_RF_FREQUENCY 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define TX_RF_FREQUENCY 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define RX_RF_GAIN 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define TX_RF_GAIN 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define RX_IF_GAIN 19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define RX_LNA_GAIN 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define TX_LNA_GAIN 21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct usb_interface *intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct usb_device *udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) struct video_device rx_vdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) struct video_device tx_vdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) struct v4l2_device v4l2_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) /* videobuf2 queue and queued buffers list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) struct vb2_queue rx_vb2_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) struct vb2_queue tx_vb2_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) struct list_head rx_buffer_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct list_head tx_buffer_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) spinlock_t buffer_list_lock; /* Protects buffer_list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) unsigned int sequence; /* Buffer sequence counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) unsigned int vb_full; /* vb is full and packets dropped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) unsigned int vb_empty; /* vb is empty and packets dropped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* Note if taking both locks v4l2_lock must always be locked first! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) struct mutex v4l2_lock; /* Protects everything else */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct mutex vb_queue_lock; /* Protects vb_queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) struct urb *urb_list[MAX_BULK_BUFS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) int buf_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) unsigned long buf_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) u8 *buf_list[MAX_BULK_BUFS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) dma_addr_t dma_addr[MAX_BULK_BUFS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) int urbs_initialized;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) int urbs_submitted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* USB control message buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define BUF_SIZE 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) u8 buf[BUF_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* Current configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) unsigned int f_adc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) unsigned int f_dac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) unsigned int f_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) unsigned int f_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) u32 pixelformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) u32 buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /* Controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) struct v4l2_ctrl_handler rx_ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) struct v4l2_ctrl *rx_bandwidth_auto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) struct v4l2_ctrl *rx_bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) struct v4l2_ctrl *rx_rf_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) struct v4l2_ctrl *rx_lna_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) struct v4l2_ctrl *rx_if_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) struct v4l2_ctrl_handler tx_ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) struct v4l2_ctrl *tx_bandwidth_auto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) struct v4l2_ctrl *tx_bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) struct v4l2_ctrl *tx_rf_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) struct v4l2_ctrl *tx_lna_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /* Sample rate calc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) unsigned long jiffies_next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) unsigned int sample;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) unsigned int sample_measured;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define hackrf_dbg_usb_control_msg(_dev, _r, _t, _v, _i, _b, _l) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) char *_direction; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (_t & USB_DIR_IN) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) _direction = "<<<"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) _direction = ">>>"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) dev_dbg(_dev, "%02x %02x %02x %02x %02x %02x %02x %02x %s %*ph\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) _t, _r, _v & 0xff, _v >> 8, _i & 0xff, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) _i >> 8, _l & 0xff, _l >> 8, _direction, _l, _b); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /* execute firmware command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) static int hackrf_ctrl_msg(struct hackrf_dev *dev, u8 request, u16 value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) u16 index, u8 *data, u16 size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) u8 requesttype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) switch (request) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) case CMD_SET_TRANSCEIVER_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) case CMD_SET_FREQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) case CMD_AMP_ENABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) case CMD_SAMPLE_RATE_SET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) case CMD_BASEBAND_FILTER_BANDWIDTH_SET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) pipe = usb_sndctrlpipe(dev->udev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) requesttype = (USB_TYPE_VENDOR | USB_DIR_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) case CMD_BOARD_ID_READ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) case CMD_VERSION_STRING_READ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) case CMD_SET_LNA_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) case CMD_SET_VGA_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) case CMD_SET_TXVGA_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) pipe = usb_rcvctrlpipe(dev->udev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) requesttype = (USB_TYPE_VENDOR | USB_DIR_IN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) dev_err(dev->dev, "Unknown command %02x\n", request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /* write request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if (!(requesttype & USB_DIR_IN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) memcpy(dev->buf, data, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) ret = usb_control_msg(dev->udev, pipe, request, requesttype, value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) index, dev->buf, size, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) hackrf_dbg_usb_control_msg(dev->dev, request, requesttype, value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) index, dev->buf, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) dev_err(dev->dev, "usb_control_msg() failed %d request %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) ret, request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /* read request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (requesttype & USB_DIR_IN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) memcpy(data, dev->buf, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) static int hackrf_set_params(struct hackrf_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) u8 buf[8], u8tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) unsigned int uitmp, uitmp1, uitmp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) const bool rx = test_bit(RX_ON, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) const bool tx = test_bit(TX_ON, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static const struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) u32 freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) } bandwidth_lut[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) { 1750000}, /* 1.75 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) { 2500000}, /* 2.5 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) { 3500000}, /* 3.5 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) { 5000000}, /* 5 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) { 5500000}, /* 5.5 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) { 6000000}, /* 6 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) { 7000000}, /* 7 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) { 8000000}, /* 8 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) { 9000000}, /* 9 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) {10000000}, /* 10 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) {12000000}, /* 12 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) {14000000}, /* 14 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) {15000000}, /* 15 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) {20000000}, /* 20 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) {24000000}, /* 24 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) {28000000}, /* 28 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if (!rx && !tx) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) dev_dbg(&intf->dev, "device is sleeping\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) /* ADC / DAC frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (rx && test_and_clear_bit(RX_ADC_FREQUENCY, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) dev_dbg(&intf->dev, "RX ADC frequency=%u Hz\n", dev->f_adc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) uitmp1 = dev->f_adc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) uitmp2 = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) set_bit(TX_DAC_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) } else if (tx && test_and_clear_bit(TX_DAC_FREQUENCY, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) dev_dbg(&intf->dev, "TX DAC frequency=%u Hz\n", dev->f_dac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) uitmp1 = dev->f_dac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) uitmp2 = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) set_bit(RX_ADC_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) uitmp1 = uitmp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) if (uitmp1 || uitmp2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) buf[0] = (uitmp1 >> 0) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) buf[1] = (uitmp1 >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) buf[2] = (uitmp1 >> 16) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) buf[3] = (uitmp1 >> 24) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) buf[4] = (uitmp2 >> 0) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) buf[5] = (uitmp2 >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) buf[6] = (uitmp2 >> 16) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) buf[7] = (uitmp2 >> 24) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) ret = hackrf_ctrl_msg(dev, CMD_SAMPLE_RATE_SET, 0, 0, buf, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) /* bandwidth */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) if (rx && test_and_clear_bit(RX_BANDWIDTH, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) if (dev->rx_bandwidth_auto->val == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) uitmp = dev->f_adc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) uitmp = dev->rx_bandwidth->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) for (i = 0; i < ARRAY_SIZE(bandwidth_lut); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) if (uitmp <= bandwidth_lut[i].freq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) uitmp = bandwidth_lut[i].freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) dev->rx_bandwidth->val = uitmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) dev->rx_bandwidth->cur.val = uitmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) dev_dbg(&intf->dev, "RX bandwidth selected=%u\n", uitmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) set_bit(TX_BANDWIDTH, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) } else if (tx && test_and_clear_bit(TX_BANDWIDTH, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (dev->tx_bandwidth_auto->val == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) uitmp = dev->f_dac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) uitmp = dev->tx_bandwidth->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) for (i = 0; i < ARRAY_SIZE(bandwidth_lut); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (uitmp <= bandwidth_lut[i].freq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) uitmp = bandwidth_lut[i].freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) dev->tx_bandwidth->val = uitmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) dev->tx_bandwidth->cur.val = uitmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) dev_dbg(&intf->dev, "TX bandwidth selected=%u\n", uitmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) set_bit(RX_BANDWIDTH, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) uitmp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (uitmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) uitmp1 = uitmp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) uitmp1 |= ((uitmp >> 0) & 0xff) << 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) uitmp1 |= ((uitmp >> 8) & 0xff) << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) uitmp2 |= ((uitmp >> 16) & 0xff) << 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) uitmp2 |= ((uitmp >> 24) & 0xff) << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) ret = hackrf_ctrl_msg(dev, CMD_BASEBAND_FILTER_BANDWIDTH_SET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) uitmp1, uitmp2, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /* RX / TX RF frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) if (rx && test_and_clear_bit(RX_RF_FREQUENCY, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) dev_dbg(&intf->dev, "RX RF frequency=%u Hz\n", dev->f_rx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) uitmp1 = dev->f_rx / 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) uitmp2 = dev->f_rx % 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) set_bit(TX_RF_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) } else if (tx && test_and_clear_bit(TX_RF_FREQUENCY, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) dev_dbg(&intf->dev, "TX RF frequency=%u Hz\n", dev->f_tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) uitmp1 = dev->f_tx / 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) uitmp2 = dev->f_tx % 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) set_bit(RX_RF_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) uitmp1 = uitmp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) if (uitmp1 || uitmp2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) buf[0] = (uitmp1 >> 0) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) buf[1] = (uitmp1 >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) buf[2] = (uitmp1 >> 16) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) buf[3] = (uitmp1 >> 24) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) buf[4] = (uitmp2 >> 0) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) buf[5] = (uitmp2 >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) buf[6] = (uitmp2 >> 16) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) buf[7] = (uitmp2 >> 24) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) ret = hackrf_ctrl_msg(dev, CMD_SET_FREQ, 0, 0, buf, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) /* RX RF gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) if (rx && test_and_clear_bit(RX_RF_GAIN, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) dev_dbg(&intf->dev, "RX RF gain val=%d->%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) dev->rx_rf_gain->cur.val, dev->rx_rf_gain->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) u8tmp = (dev->rx_rf_gain->val) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) ret = hackrf_ctrl_msg(dev, CMD_AMP_ENABLE, u8tmp, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) set_bit(TX_RF_GAIN, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) /* TX RF gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) if (tx && test_and_clear_bit(TX_RF_GAIN, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) dev_dbg(&intf->dev, "TX RF gain val=%d->%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) dev->tx_rf_gain->cur.val, dev->tx_rf_gain->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) u8tmp = (dev->tx_rf_gain->val) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) ret = hackrf_ctrl_msg(dev, CMD_AMP_ENABLE, u8tmp, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) set_bit(RX_RF_GAIN, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) /* RX LNA gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) if (rx && test_and_clear_bit(RX_LNA_GAIN, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) dev_dbg(dev->dev, "RX LNA gain val=%d->%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) dev->rx_lna_gain->cur.val, dev->rx_lna_gain->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) ret = hackrf_ctrl_msg(dev, CMD_SET_LNA_GAIN, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) dev->rx_lna_gain->val, &u8tmp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) /* RX IF gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) if (rx && test_and_clear_bit(RX_IF_GAIN, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) dev_dbg(&intf->dev, "IF gain val=%d->%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) dev->rx_if_gain->cur.val, dev->rx_if_gain->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) ret = hackrf_ctrl_msg(dev, CMD_SET_VGA_GAIN, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) dev->rx_if_gain->val, &u8tmp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) /* TX LNA gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) if (tx && test_and_clear_bit(TX_LNA_GAIN, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) dev_dbg(&intf->dev, "TX LNA gain val=%d->%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) dev->tx_lna_gain->cur.val, dev->tx_lna_gain->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) ret = hackrf_ctrl_msg(dev, CMD_SET_TXVGA_GAIN, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) dev->tx_lna_gain->val, &u8tmp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) /* Private functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) static struct hackrf_buffer *hackrf_get_next_buffer(struct hackrf_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) struct list_head *buffer_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) struct hackrf_buffer *buffer = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) spin_lock_irqsave(&dev->buffer_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if (list_empty(buffer_list))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) buffer = list_entry(buffer_list->next, struct hackrf_buffer, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) list_del(&buffer->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) leave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) spin_unlock_irqrestore(&dev->buffer_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) return buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) static void hackrf_copy_stream(struct hackrf_dev *dev, void *dst, void *src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) unsigned int src_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) memcpy(dst, src, src_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) /* calculate sample rate and output it in 10 seconds intervals */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) if (unlikely(time_is_before_jiffies(dev->jiffies_next))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) #define MSECS 10000UL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) unsigned int msecs = jiffies_to_msecs(jiffies -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) dev->jiffies_next + msecs_to_jiffies(MSECS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) unsigned int samples = dev->sample - dev->sample_measured;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) dev->jiffies_next = jiffies + msecs_to_jiffies(MSECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) dev->sample_measured = dev->sample;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) dev_dbg(dev->dev, "slen=%u samples=%u msecs=%u sample rate=%lu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) src_len, samples, msecs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) samples * 1000UL / msecs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) /* total number of samples */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) dev->sample += src_len / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) * This gets called for the bulk stream pipe. This is done in interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) * time, so it has to be fast, not crash, and not stall. Neat.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) static void hackrf_urb_complete_in(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) struct hackrf_dev *dev = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) struct hackrf_buffer *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) unsigned int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) dev_dbg_ratelimited(&intf->dev, "status=%d length=%u/%u\n", urb->status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) urb->actual_length, urb->transfer_buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) switch (urb->status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) case 0: /* success */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) case -ETIMEDOUT: /* NAK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) case -ECONNRESET: /* kill */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) case -ENOENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) case -ESHUTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) default: /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) dev_err_ratelimited(&intf->dev, "URB failed %d\n", urb->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) goto exit_usb_submit_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) /* get buffer to write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) buffer = hackrf_get_next_buffer(dev, &dev->rx_buffer_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) if (unlikely(buffer == NULL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) dev->vb_full++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) dev_notice_ratelimited(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) "buffer is full - %u packets dropped\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) dev->vb_full);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) goto exit_usb_submit_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) len = min_t(unsigned long, vb2_plane_size(&buffer->vb.vb2_buf, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) hackrf_copy_stream(dev, vb2_plane_vaddr(&buffer->vb.vb2_buf, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) urb->transfer_buffer, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) vb2_set_plane_payload(&buffer->vb.vb2_buf, 0, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) buffer->vb.sequence = dev->sequence++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) buffer->vb.vb2_buf.timestamp = ktime_get_ns();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) vb2_buffer_done(&buffer->vb.vb2_buf, VB2_BUF_STATE_DONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) exit_usb_submit_urb:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) static void hackrf_urb_complete_out(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) struct hackrf_dev *dev = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) struct hackrf_buffer *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) unsigned int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) dev_dbg_ratelimited(&intf->dev, "status=%d length=%u/%u\n", urb->status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) urb->actual_length, urb->transfer_buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) switch (urb->status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) case 0: /* success */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) case -ETIMEDOUT: /* NAK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) case -ECONNRESET: /* kill */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) case -ENOENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) case -ESHUTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) default: /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) dev_err_ratelimited(&intf->dev, "URB failed %d\n", urb->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) /* get buffer to read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) buffer = hackrf_get_next_buffer(dev, &dev->tx_buffer_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) if (unlikely(buffer == NULL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) dev->vb_empty++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) dev_notice_ratelimited(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) "buffer is empty - %u packets dropped\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) dev->vb_empty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) urb->actual_length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) goto exit_usb_submit_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) len = min_t(unsigned long, urb->transfer_buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) vb2_get_plane_payload(&buffer->vb.vb2_buf, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) hackrf_copy_stream(dev, urb->transfer_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) vb2_plane_vaddr(&buffer->vb.vb2_buf, 0), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) urb->actual_length = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) buffer->vb.sequence = dev->sequence++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) buffer->vb.vb2_buf.timestamp = ktime_get_ns();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) vb2_buffer_done(&buffer->vb.vb2_buf, VB2_BUF_STATE_DONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) exit_usb_submit_urb:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) static int hackrf_kill_urbs(struct hackrf_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) for (i = dev->urbs_submitted - 1; i >= 0; i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) dev_dbg(dev->dev, "kill urb=%d\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) /* stop the URB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) usb_kill_urb(dev->urb_list[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) dev->urbs_submitted = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) static int hackrf_submit_urbs(struct hackrf_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) int i, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) for (i = 0; i < dev->urbs_initialized; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) dev_dbg(dev->dev, "submit urb=%d\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) ret = usb_submit_urb(dev->urb_list[i], GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) dev_err(dev->dev, "Could not submit URB no. %d - get them all back\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) hackrf_kill_urbs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) dev->urbs_submitted++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) static int hackrf_free_stream_bufs(struct hackrf_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) if (dev->flags & USB_STATE_URB_BUF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) while (dev->buf_num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) dev->buf_num--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) dev_dbg(dev->dev, "free buf=%d\n", dev->buf_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) usb_free_coherent(dev->udev, dev->buf_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) dev->buf_list[dev->buf_num],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) dev->dma_addr[dev->buf_num]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) dev->flags &= ~USB_STATE_URB_BUF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) static int hackrf_alloc_stream_bufs(struct hackrf_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) dev->buf_num = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) dev->buf_size = BULK_BUFFER_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) dev_dbg(dev->dev, "all in all I will use %u bytes for streaming\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) MAX_BULK_BUFS * BULK_BUFFER_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) for (dev->buf_num = 0; dev->buf_num < MAX_BULK_BUFS; dev->buf_num++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) dev->buf_list[dev->buf_num] = usb_alloc_coherent(dev->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) BULK_BUFFER_SIZE, GFP_KERNEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) &dev->dma_addr[dev->buf_num]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) if (!dev->buf_list[dev->buf_num]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) dev_dbg(dev->dev, "alloc buf=%d failed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) dev->buf_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) hackrf_free_stream_bufs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) dev_dbg(dev->dev, "alloc buf=%d %p (dma %llu)\n", dev->buf_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) dev->buf_list[dev->buf_num],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) (long long)dev->dma_addr[dev->buf_num]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) dev->flags |= USB_STATE_URB_BUF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) static int hackrf_free_urbs(struct hackrf_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) hackrf_kill_urbs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) for (i = dev->urbs_initialized - 1; i >= 0; i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) if (dev->urb_list[i]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) dev_dbg(dev->dev, "free urb=%d\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) /* free the URBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) usb_free_urb(dev->urb_list[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) dev->urbs_initialized = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) static int hackrf_alloc_urbs(struct hackrf_dev *dev, bool rcv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) usb_complete_t complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) if (rcv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) pipe = usb_rcvbulkpipe(dev->udev, 0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) complete = &hackrf_urb_complete_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) pipe = usb_sndbulkpipe(dev->udev, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) complete = &hackrf_urb_complete_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) /* allocate the URBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) for (i = 0; i < MAX_BULK_BUFS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) dev_dbg(dev->dev, "alloc urb=%d\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) dev->urb_list[i] = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) if (!dev->urb_list[i]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) for (j = 0; j < i; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) usb_free_urb(dev->urb_list[j]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) usb_fill_bulk_urb(dev->urb_list[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) dev->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) pipe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) dev->buf_list[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) BULK_BUFFER_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) complete, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) dev->urb_list[i]->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) dev->urb_list[i]->transfer_dma = dev->dma_addr[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) dev->urbs_initialized++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) /* The user yanked out the cable... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) static void hackrf_disconnect(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) struct v4l2_device *v = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) struct hackrf_dev *dev = container_of(v, struct hackrf_dev, v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) dev_dbg(dev->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) mutex_lock(&dev->vb_queue_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) mutex_lock(&dev->v4l2_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) /* No need to keep the urbs around after disconnection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) dev->udev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) v4l2_device_disconnect(&dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) video_unregister_device(&dev->tx_vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) video_unregister_device(&dev->rx_vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) mutex_unlock(&dev->v4l2_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) mutex_unlock(&dev->vb_queue_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) v4l2_device_put(&dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) /* Videobuf2 operations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) static void hackrf_return_all_buffers(struct vb2_queue *vq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) enum vb2_buffer_state state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) struct hackrf_dev *dev = vb2_get_drv_priv(vq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) struct hackrf_buffer *buffer, *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) struct list_head *buffer_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) dev_dbg(&intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) if (vq->type == V4L2_BUF_TYPE_SDR_CAPTURE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) buffer_list = &dev->rx_buffer_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) buffer_list = &dev->tx_buffer_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) spin_lock_irqsave(&dev->buffer_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) list_for_each_entry_safe(buffer, node, buffer_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) dev_dbg(&intf->dev, "list_for_each_entry_safe\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) vb2_buffer_done(&buffer->vb.vb2_buf, state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) list_del(&buffer->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) spin_unlock_irqrestore(&dev->buffer_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) static int hackrf_queue_setup(struct vb2_queue *vq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) unsigned int *nbuffers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) unsigned int *nplanes, unsigned int sizes[], struct device *alloc_devs[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) struct hackrf_dev *dev = vb2_get_drv_priv(vq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) dev_dbg(dev->dev, "nbuffers=%d\n", *nbuffers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) /* Need at least 8 buffers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) if (vq->num_buffers + *nbuffers < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) *nbuffers = 8 - vq->num_buffers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) *nplanes = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) sizes[0] = PAGE_ALIGN(dev->buffersize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) dev_dbg(dev->dev, "nbuffers=%d sizes[0]=%d\n", *nbuffers, sizes[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) static void hackrf_buf_queue(struct vb2_buffer *vb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) struct vb2_queue *vq = vb->vb2_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) struct hackrf_dev *dev = vb2_get_drv_priv(vq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) struct hackrf_buffer *buffer = container_of(vbuf, struct hackrf_buffer, vb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) struct list_head *buffer_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) dev_dbg_ratelimited(&dev->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) if (vq->type == V4L2_BUF_TYPE_SDR_CAPTURE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) buffer_list = &dev->rx_buffer_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) buffer_list = &dev->tx_buffer_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) spin_lock_irqsave(&dev->buffer_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) list_add_tail(&buffer->list, buffer_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) spin_unlock_irqrestore(&dev->buffer_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) static int hackrf_start_streaming(struct vb2_queue *vq, unsigned int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) struct hackrf_dev *dev = vb2_get_drv_priv(vq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) unsigned int mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) dev_dbg(&intf->dev, "count=%i\n", count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) mutex_lock(&dev->v4l2_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) /* Allow only RX or TX, not both same time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) if (vq->type == V4L2_BUF_TYPE_SDR_CAPTURE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) if (test_bit(TX_ON, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) goto err_hackrf_return_all_buffers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) mode = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) set_bit(RX_ON, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) if (test_bit(RX_ON, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) goto err_hackrf_return_all_buffers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) mode = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) set_bit(TX_ON, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) dev->sequence = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) ret = hackrf_alloc_stream_bufs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) ret = hackrf_alloc_urbs(dev, (mode == 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) ret = hackrf_submit_urbs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) ret = hackrf_set_params(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) /* start hardware streaming */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) ret = hackrf_ctrl_msg(dev, CMD_SET_TRANSCEIVER_MODE, mode, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) mutex_unlock(&dev->v4l2_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) hackrf_kill_urbs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) hackrf_free_urbs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) hackrf_free_stream_bufs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) clear_bit(RX_ON, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) clear_bit(TX_ON, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) err_hackrf_return_all_buffers:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) hackrf_return_all_buffers(vq, VB2_BUF_STATE_QUEUED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) mutex_unlock(&dev->v4l2_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) static void hackrf_stop_streaming(struct vb2_queue *vq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) struct hackrf_dev *dev = vb2_get_drv_priv(vq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) dev_dbg(&intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) mutex_lock(&dev->v4l2_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) /* stop hardware streaming */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) hackrf_ctrl_msg(dev, CMD_SET_TRANSCEIVER_MODE, 0, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) hackrf_kill_urbs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) hackrf_free_urbs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) hackrf_free_stream_bufs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) hackrf_return_all_buffers(vq, VB2_BUF_STATE_ERROR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) if (vq->type == V4L2_BUF_TYPE_SDR_CAPTURE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) clear_bit(RX_ON, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) clear_bit(TX_ON, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) mutex_unlock(&dev->v4l2_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) static const struct vb2_ops hackrf_vb2_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) .queue_setup = hackrf_queue_setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) .buf_queue = hackrf_buf_queue,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) .start_streaming = hackrf_start_streaming,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) .stop_streaming = hackrf_stop_streaming,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) .wait_prepare = vb2_ops_wait_prepare,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) .wait_finish = vb2_ops_wait_finish,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) static int hackrf_querycap(struct file *file, void *fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) struct v4l2_capability *cap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) dev_dbg(&intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) cap->capabilities = V4L2_CAP_SDR_CAPTURE | V4L2_CAP_TUNER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) V4L2_CAP_SDR_OUTPUT | V4L2_CAP_MODULATOR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) V4L2_CAP_STREAMING | V4L2_CAP_READWRITE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) V4L2_CAP_DEVICE_CAPS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) strscpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) strscpy(cap->card, dev->rx_vdev.name, sizeof(cap->card));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) static int hackrf_s_fmt_sdr(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) struct v4l2_format *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) struct video_device *vdev = video_devdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) struct vb2_queue *q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) dev_dbg(dev->dev, "pixelformat fourcc %4.4s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) (char *)&f->fmt.sdr.pixelformat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) if (vdev->vfl_dir == VFL_DIR_RX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) q = &dev->rx_vb2_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) q = &dev->tx_vb2_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) if (vb2_is_busy(q))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) for (i = 0; i < NUM_FORMATS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) if (f->fmt.sdr.pixelformat == formats[i].pixelformat) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) dev->pixelformat = formats[i].pixelformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) dev->buffersize = formats[i].buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) f->fmt.sdr.buffersize = formats[i].buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) dev->pixelformat = formats[0].pixelformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) dev->buffersize = formats[0].buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) f->fmt.sdr.pixelformat = formats[0].pixelformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) f->fmt.sdr.buffersize = formats[0].buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) static int hackrf_g_fmt_sdr(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) struct v4l2_format *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) dev_dbg(dev->dev, "pixelformat fourcc %4.4s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) (char *)&dev->pixelformat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) f->fmt.sdr.pixelformat = dev->pixelformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) f->fmt.sdr.buffersize = dev->buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) static int hackrf_try_fmt_sdr(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) struct v4l2_format *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) dev_dbg(dev->dev, "pixelformat fourcc %4.4s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) (char *)&f->fmt.sdr.pixelformat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) for (i = 0; i < NUM_FORMATS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) if (formats[i].pixelformat == f->fmt.sdr.pixelformat) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) f->fmt.sdr.buffersize = formats[i].buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) f->fmt.sdr.pixelformat = formats[0].pixelformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) f->fmt.sdr.buffersize = formats[0].buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) static int hackrf_enum_fmt_sdr(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) struct v4l2_fmtdesc *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) dev_dbg(dev->dev, "index=%d\n", f->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) if (f->index >= NUM_FORMATS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) f->pixelformat = formats[f->index].pixelformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) static int hackrf_s_tuner(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) const struct v4l2_tuner *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) dev_dbg(dev->dev, "index=%d\n", v->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) if (v->index == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) else if (v->index == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) static int hackrf_g_tuner(struct file *file, void *priv, struct v4l2_tuner *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) dev_dbg(dev->dev, "index=%d\n", v->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) if (v->index == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) strscpy(v->name, "HackRF ADC", sizeof(v->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) v->type = V4L2_TUNER_SDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) v->capability = V4L2_TUNER_CAP_1HZ | V4L2_TUNER_CAP_FREQ_BANDS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) v->rangelow = bands_adc_dac[0].rangelow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) v->rangehigh = bands_adc_dac[0].rangehigh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) } else if (v->index == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) strscpy(v->name, "HackRF RF", sizeof(v->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) v->type = V4L2_TUNER_RF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) v->capability = V4L2_TUNER_CAP_1HZ | V4L2_TUNER_CAP_FREQ_BANDS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) v->rangelow = bands_rx_tx[0].rangelow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) v->rangehigh = bands_rx_tx[0].rangehigh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) static int hackrf_s_modulator(struct file *file, void *fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) const struct v4l2_modulator *a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) dev_dbg(dev->dev, "index=%d\n", a->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) return a->index > 1 ? -EINVAL : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) static int hackrf_g_modulator(struct file *file, void *fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) struct v4l2_modulator *a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) dev_dbg(dev->dev, "index=%d\n", a->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) if (a->index == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) strscpy(a->name, "HackRF DAC", sizeof(a->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) a->type = V4L2_TUNER_SDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) a->capability = V4L2_TUNER_CAP_1HZ | V4L2_TUNER_CAP_FREQ_BANDS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) a->rangelow = bands_adc_dac[0].rangelow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) a->rangehigh = bands_adc_dac[0].rangehigh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) } else if (a->index == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) strscpy(a->name, "HackRF RF", sizeof(a->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) a->type = V4L2_TUNER_RF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) a->capability = V4L2_TUNER_CAP_1HZ | V4L2_TUNER_CAP_FREQ_BANDS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) a->rangelow = bands_rx_tx[0].rangelow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) a->rangehigh = bands_rx_tx[0].rangehigh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) static int hackrf_s_frequency(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) const struct v4l2_frequency *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) struct video_device *vdev = video_devdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) unsigned int uitmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) dev_dbg(&intf->dev, "tuner=%d type=%d frequency=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) f->tuner, f->type, f->frequency);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) if (f->tuner == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) uitmp = clamp(f->frequency, bands_adc_dac[0].rangelow,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) bands_adc_dac[0].rangehigh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) if (vdev->vfl_dir == VFL_DIR_RX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) dev->f_adc = uitmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) set_bit(RX_ADC_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) dev->f_dac = uitmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) set_bit(TX_DAC_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) } else if (f->tuner == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) uitmp = clamp(f->frequency, bands_rx_tx[0].rangelow,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) bands_rx_tx[0].rangehigh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) if (vdev->vfl_dir == VFL_DIR_RX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) dev->f_rx = uitmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) set_bit(RX_RF_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) dev->f_tx = uitmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) set_bit(TX_RF_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) ret = hackrf_set_params(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) static int hackrf_g_frequency(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) struct v4l2_frequency *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) struct video_device *vdev = video_devdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) dev_dbg(dev->dev, "tuner=%d type=%d\n", f->tuner, f->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) if (f->tuner == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) f->type = V4L2_TUNER_SDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) if (vdev->vfl_dir == VFL_DIR_RX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) f->frequency = dev->f_adc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) f->frequency = dev->f_dac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) } else if (f->tuner == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) f->type = V4L2_TUNER_RF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) if (vdev->vfl_dir == VFL_DIR_RX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) f->frequency = dev->f_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) f->frequency = dev->f_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) static int hackrf_enum_freq_bands(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) struct v4l2_frequency_band *band)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) struct hackrf_dev *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) dev_dbg(dev->dev, "tuner=%d type=%d index=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) band->tuner, band->type, band->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) if (band->tuner == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) if (band->index >= ARRAY_SIZE(bands_adc_dac)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) *band = bands_adc_dac[band->index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) } else if (band->tuner == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) if (band->index >= ARRAY_SIZE(bands_rx_tx)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) *band = bands_rx_tx[band->index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) static const struct v4l2_ioctl_ops hackrf_ioctl_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) .vidioc_querycap = hackrf_querycap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) .vidioc_s_fmt_sdr_cap = hackrf_s_fmt_sdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) .vidioc_g_fmt_sdr_cap = hackrf_g_fmt_sdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) .vidioc_enum_fmt_sdr_cap = hackrf_enum_fmt_sdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) .vidioc_try_fmt_sdr_cap = hackrf_try_fmt_sdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) .vidioc_s_fmt_sdr_out = hackrf_s_fmt_sdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) .vidioc_g_fmt_sdr_out = hackrf_g_fmt_sdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) .vidioc_enum_fmt_sdr_out = hackrf_enum_fmt_sdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) .vidioc_try_fmt_sdr_out = hackrf_try_fmt_sdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) .vidioc_reqbufs = vb2_ioctl_reqbufs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) .vidioc_create_bufs = vb2_ioctl_create_bufs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) .vidioc_prepare_buf = vb2_ioctl_prepare_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) .vidioc_querybuf = vb2_ioctl_querybuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) .vidioc_qbuf = vb2_ioctl_qbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) .vidioc_dqbuf = vb2_ioctl_dqbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) .vidioc_expbuf = vb2_ioctl_expbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) .vidioc_streamon = vb2_ioctl_streamon,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) .vidioc_streamoff = vb2_ioctl_streamoff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) .vidioc_s_tuner = hackrf_s_tuner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) .vidioc_g_tuner = hackrf_g_tuner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) .vidioc_s_modulator = hackrf_s_modulator,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) .vidioc_g_modulator = hackrf_g_modulator,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) .vidioc_s_frequency = hackrf_s_frequency,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) .vidioc_g_frequency = hackrf_g_frequency,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) .vidioc_enum_freq_bands = hackrf_enum_freq_bands,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) .vidioc_log_status = v4l2_ctrl_log_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) static const struct v4l2_file_operations hackrf_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) .open = v4l2_fh_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) .release = vb2_fop_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) .read = vb2_fop_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) .write = vb2_fop_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) .poll = vb2_fop_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) .mmap = vb2_fop_mmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) .unlocked_ioctl = video_ioctl2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) static const struct video_device hackrf_template = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) .name = "HackRF One",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) .release = video_device_release_empty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) .fops = &hackrf_fops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) .ioctl_ops = &hackrf_ioctl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) static void hackrf_video_release(struct v4l2_device *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) struct hackrf_dev *dev = container_of(v, struct hackrf_dev, v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) dev_dbg(dev->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) v4l2_ctrl_handler_free(&dev->rx_ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) v4l2_ctrl_handler_free(&dev->tx_ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) v4l2_device_unregister(&dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) static int hackrf_s_ctrl_rx(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) struct hackrf_dev *dev = container_of(ctrl->handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) struct hackrf_dev, rx_ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) case V4L2_CID_RF_TUNER_BANDWIDTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) set_bit(RX_BANDWIDTH, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) case V4L2_CID_RF_TUNER_RF_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) set_bit(RX_RF_GAIN, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) case V4L2_CID_RF_TUNER_LNA_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) set_bit(RX_LNA_GAIN, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) case V4L2_CID_RF_TUNER_IF_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) set_bit(RX_IF_GAIN, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) dev_dbg(&intf->dev, "unknown ctrl: id=%d name=%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) ctrl->id, ctrl->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) ret = hackrf_set_params(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) static int hackrf_s_ctrl_tx(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) struct hackrf_dev *dev = container_of(ctrl->handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) struct hackrf_dev, tx_ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) struct usb_interface *intf = dev->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) case V4L2_CID_RF_TUNER_BANDWIDTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) set_bit(TX_BANDWIDTH, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) case V4L2_CID_RF_TUNER_LNA_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) set_bit(TX_LNA_GAIN, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) case V4L2_CID_RF_TUNER_RF_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) set_bit(TX_RF_GAIN, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) dev_dbg(&intf->dev, "unknown ctrl: id=%d name=%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) ctrl->id, ctrl->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) ret = hackrf_set_params(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) static const struct v4l2_ctrl_ops hackrf_ctrl_ops_rx = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) .s_ctrl = hackrf_s_ctrl_rx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) static const struct v4l2_ctrl_ops hackrf_ctrl_ops_tx = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) .s_ctrl = hackrf_s_ctrl_tx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) static int hackrf_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) struct hackrf_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) u8 u8tmp, buf[BUF_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) dev = kzalloc(sizeof(*dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) if (!dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) mutex_init(&dev->v4l2_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) mutex_init(&dev->vb_queue_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) spin_lock_init(&dev->buffer_list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) INIT_LIST_HEAD(&dev->rx_buffer_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) INIT_LIST_HEAD(&dev->tx_buffer_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) dev->intf = intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) dev->dev = &intf->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) dev->udev = interface_to_usbdev(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) dev->pixelformat = formats[0].pixelformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) dev->buffersize = formats[0].buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) dev->f_adc = bands_adc_dac[0].rangelow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) dev->f_dac = bands_adc_dac[0].rangelow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) dev->f_rx = bands_rx_tx[0].rangelow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) dev->f_tx = bands_rx_tx[0].rangelow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) set_bit(RX_ADC_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) set_bit(TX_DAC_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) set_bit(RX_RF_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) set_bit(TX_RF_FREQUENCY, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) /* Detect device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) ret = hackrf_ctrl_msg(dev, CMD_BOARD_ID_READ, 0, 0, &u8tmp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) ret = hackrf_ctrl_msg(dev, CMD_VERSION_STRING_READ, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) buf, BUF_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) dev_err(dev->dev, "Could not detect board\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) goto err_kfree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) buf[BUF_SIZE - 1] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) dev_info(dev->dev, "Board ID: %02x\n", u8tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) dev_info(dev->dev, "Firmware version: %s\n", buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) /* Init vb2 queue structure for receiver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) dev->rx_vb2_queue.type = V4L2_BUF_TYPE_SDR_CAPTURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) dev->rx_vb2_queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) VB2_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) dev->rx_vb2_queue.ops = &hackrf_vb2_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) dev->rx_vb2_queue.mem_ops = &vb2_vmalloc_memops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) dev->rx_vb2_queue.drv_priv = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) dev->rx_vb2_queue.buf_struct_size = sizeof(struct hackrf_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) dev->rx_vb2_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) ret = vb2_queue_init(&dev->rx_vb2_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) dev_err(dev->dev, "Could not initialize rx vb2 queue\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) goto err_kfree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) /* Init vb2 queue structure for transmitter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) dev->tx_vb2_queue.type = V4L2_BUF_TYPE_SDR_OUTPUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) dev->tx_vb2_queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) VB2_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) dev->tx_vb2_queue.ops = &hackrf_vb2_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) dev->tx_vb2_queue.mem_ops = &vb2_vmalloc_memops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) dev->tx_vb2_queue.drv_priv = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) dev->tx_vb2_queue.buf_struct_size = sizeof(struct hackrf_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) dev->tx_vb2_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) ret = vb2_queue_init(&dev->tx_vb2_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) dev_err(dev->dev, "Could not initialize tx vb2 queue\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) goto err_kfree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) /* Register controls for receiver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) v4l2_ctrl_handler_init(&dev->rx_ctrl_handler, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) dev->rx_bandwidth_auto = v4l2_ctrl_new_std(&dev->rx_ctrl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) &hackrf_ctrl_ops_rx, V4L2_CID_RF_TUNER_BANDWIDTH_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 0, 1, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) dev->rx_bandwidth = v4l2_ctrl_new_std(&dev->rx_ctrl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) &hackrf_ctrl_ops_rx, V4L2_CID_RF_TUNER_BANDWIDTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 1750000, 28000000, 50000, 1750000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) v4l2_ctrl_auto_cluster(2, &dev->rx_bandwidth_auto, 0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) dev->rx_rf_gain = v4l2_ctrl_new_std(&dev->rx_ctrl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) &hackrf_ctrl_ops_rx, V4L2_CID_RF_TUNER_RF_GAIN, 0, 12, 12, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) dev->rx_lna_gain = v4l2_ctrl_new_std(&dev->rx_ctrl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) &hackrf_ctrl_ops_rx, V4L2_CID_RF_TUNER_LNA_GAIN, 0, 40, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) dev->rx_if_gain = v4l2_ctrl_new_std(&dev->rx_ctrl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) &hackrf_ctrl_ops_rx, V4L2_CID_RF_TUNER_IF_GAIN, 0, 62, 2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) if (dev->rx_ctrl_handler.error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) ret = dev->rx_ctrl_handler.error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) dev_err(dev->dev, "Could not initialize controls\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) goto err_v4l2_ctrl_handler_free_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) v4l2_ctrl_grab(dev->rx_rf_gain, !hackrf_enable_rf_gain_ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) v4l2_ctrl_handler_setup(&dev->rx_ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) /* Register controls for transmitter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) v4l2_ctrl_handler_init(&dev->tx_ctrl_handler, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) dev->tx_bandwidth_auto = v4l2_ctrl_new_std(&dev->tx_ctrl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) &hackrf_ctrl_ops_tx, V4L2_CID_RF_TUNER_BANDWIDTH_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 0, 1, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) dev->tx_bandwidth = v4l2_ctrl_new_std(&dev->tx_ctrl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) &hackrf_ctrl_ops_tx, V4L2_CID_RF_TUNER_BANDWIDTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 1750000, 28000000, 50000, 1750000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) v4l2_ctrl_auto_cluster(2, &dev->tx_bandwidth_auto, 0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) dev->tx_lna_gain = v4l2_ctrl_new_std(&dev->tx_ctrl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) &hackrf_ctrl_ops_tx, V4L2_CID_RF_TUNER_LNA_GAIN, 0, 47, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) dev->tx_rf_gain = v4l2_ctrl_new_std(&dev->tx_ctrl_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) &hackrf_ctrl_ops_tx, V4L2_CID_RF_TUNER_RF_GAIN, 0, 15, 15, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) if (dev->tx_ctrl_handler.error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) ret = dev->tx_ctrl_handler.error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) dev_err(dev->dev, "Could not initialize controls\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) goto err_v4l2_ctrl_handler_free_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) v4l2_ctrl_grab(dev->tx_rf_gain, !hackrf_enable_rf_gain_ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) v4l2_ctrl_handler_setup(&dev->tx_ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) /* Register the v4l2_device structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) dev->v4l2_dev.release = hackrf_video_release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) ret = v4l2_device_register(&intf->dev, &dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) dev_err(dev->dev, "Failed to register v4l2-device (%d)\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) goto err_v4l2_ctrl_handler_free_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) /* Init video_device structure for receiver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) dev->rx_vdev = hackrf_template;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) dev->rx_vdev.queue = &dev->rx_vb2_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) dev->rx_vdev.queue->lock = &dev->vb_queue_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) dev->rx_vdev.v4l2_dev = &dev->v4l2_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) dev->rx_vdev.ctrl_handler = &dev->rx_ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) dev->rx_vdev.lock = &dev->v4l2_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) dev->rx_vdev.vfl_dir = VFL_DIR_RX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) dev->rx_vdev.device_caps = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) V4L2_CAP_SDR_CAPTURE | V4L2_CAP_TUNER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) video_set_drvdata(&dev->rx_vdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) ret = video_register_device(&dev->rx_vdev, VFL_TYPE_SDR, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) dev_err(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) "Failed to register as video device (%d)\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) goto err_v4l2_device_unregister;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) dev_info(dev->dev, "Registered as %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) video_device_node_name(&dev->rx_vdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) /* Init video_device structure for transmitter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) dev->tx_vdev = hackrf_template;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) dev->tx_vdev.queue = &dev->tx_vb2_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) dev->tx_vdev.queue->lock = &dev->vb_queue_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) dev->tx_vdev.v4l2_dev = &dev->v4l2_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) dev->tx_vdev.ctrl_handler = &dev->tx_ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) dev->tx_vdev.lock = &dev->v4l2_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) dev->tx_vdev.vfl_dir = VFL_DIR_TX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) dev->tx_vdev.device_caps = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) V4L2_CAP_SDR_OUTPUT | V4L2_CAP_MODULATOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) video_set_drvdata(&dev->tx_vdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) ret = video_register_device(&dev->tx_vdev, VFL_TYPE_SDR, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) dev_err(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) "Failed to register as video device (%d)\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) goto err_video_unregister_device_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) dev_info(dev->dev, "Registered as %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) video_device_node_name(&dev->tx_vdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) dev_notice(dev->dev, "SDR API is still slightly experimental and functionality changes may follow\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) err_video_unregister_device_rx:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) video_unregister_device(&dev->rx_vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) err_v4l2_device_unregister:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) v4l2_device_unregister(&dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) err_v4l2_ctrl_handler_free_tx:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) v4l2_ctrl_handler_free(&dev->tx_ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) err_v4l2_ctrl_handler_free_rx:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) v4l2_ctrl_handler_free(&dev->rx_ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) err_kfree:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) /* USB device ID list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) static const struct usb_device_id hackrf_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) { USB_DEVICE(0x1d50, 0x6089) }, /* HackRF One */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) MODULE_DEVICE_TABLE(usb, hackrf_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) /* USB subsystem interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) static struct usb_driver hackrf_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) .name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) .probe = hackrf_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) .disconnect = hackrf_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) .id_table = hackrf_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) module_usb_driver(hackrf_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) MODULE_DESCRIPTION("HackRF");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) MODULE_LICENSE("GPL");