Re: [PATCH RFCv1] v4l2: add support for SDR transmitter
Hi Antti, Looks good, but the DocBook updates are missing. You probably planned to do that in RFCv2 or similar. Which device will have sdr_out? What's the cheapest device and where can I buy it? I'd like to be able to test it (and add qv4l2 support), Regards, Hans On 05/14/2015 07:51 PM, Antti Palosaari wrote: New IOCTL ops: vidioc_enum_fmt_sdr_out vidioc_g_fmt_sdr_out vidioc_s_fmt_sdr_out vidioc_try_fmt_sdr_out New vb2 buffertype: V4L2_BUF_TYPE_SDR_OUTPUT New v4l2 capability: V4L2_CAP_SDR_OUTPUT Cc: Hans Verkuil hverk...@xs4all.nl Signed-off-by: Antti Palosaari cr...@iki.fi --- drivers/media/v4l2-core/v4l2-dev.c | 14 -- drivers/media/v4l2-core/v4l2-ioctl.c| 25 + drivers/media/v4l2-core/videobuf-core.c | 4 +++- include/media/v4l2-ioctl.h | 8 include/trace/events/v4l2.h | 1 + include/uapi/linux/videodev2.h | 5 - 6 files changed, 53 insertions(+), 4 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index 71a1b93..6b1eaed 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -637,8 +637,8 @@ static void determine_valid_ioctls(struct video_device *vdev) ops-vidioc_try_fmt_sliced_vbi_out))) set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap); - } else if (is_sdr) { - /* SDR specific ioctls */ + } else if (is_sdr is_rx) { + /* SDR receiver specific ioctls */ if (ops-vidioc_enum_fmt_sdr_cap) set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls); if (ops-vidioc_g_fmt_sdr_cap) @@ -647,6 +647,16 @@ static void determine_valid_ioctls(struct video_device *vdev) set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls); if (ops-vidioc_try_fmt_sdr_cap) set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); + } else if (is_sdr is_tx) { + /* SDR transmitter specific ioctls */ + if (ops-vidioc_enum_fmt_sdr_out) + set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls); + if (ops-vidioc_g_fmt_sdr_out) + set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls); + if (ops-vidioc_s_fmt_sdr_out) + set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls); + if (ops-vidioc_try_fmt_sdr_out) + set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); } if (is_vid || is_vbi || is_sdr) { diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index 1476602..e78b7b8 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -153,6 +153,7 @@ const char *v4l2_type_names[] = { [V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE] = vid-cap-mplane, [V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE] = vid-out-mplane, [V4L2_BUF_TYPE_SDR_CAPTURE]= sdr-cap, + [V4L2_BUF_TYPE_SDR_OUTPUT] = sdr-out, }; EXPORT_SYMBOL(v4l2_type_names); @@ -325,6 +326,7 @@ static void v4l_print_format(const void *arg, bool write_only) sliced-service_lines[1][i]); break; case V4L2_BUF_TYPE_SDR_CAPTURE: + case V4L2_BUF_TYPE_SDR_OUTPUT: sdr = p-fmt.sdr; pr_cont(, pixelformat=%c%c%c%c\n, (sdr-pixelformat 0) 0xff, @@ -973,6 +975,10 @@ static int check_fmt(struct file *file, enum v4l2_buf_type type) if (is_sdr is_rx ops-vidioc_g_fmt_sdr_cap) return 0; break; + case V4L2_BUF_TYPE_SDR_OUTPUT: + if (is_sdr is_tx ops-vidioc_g_fmt_sdr_out) + return 0; + break; default: break; } @@ -1321,6 +1327,11 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops, break; ret = ops-vidioc_enum_fmt_sdr_cap(file, fh, arg); break; + case V4L2_BUF_TYPE_SDR_OUTPUT: + if (unlikely(!is_tx || !is_sdr || !ops-vidioc_enum_fmt_sdr_out)) + break; + ret = ops-vidioc_enum_fmt_sdr_out(file, fh, arg); + break; } if (ret == 0) v4l_fill_fmtdesc(p); @@ -1415,6 +1426,10 @@ static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops, if (unlikely(!is_rx || !is_sdr || !ops-vidioc_g_fmt_sdr_cap)) break; return ops-vidioc_g_fmt_sdr_cap(file, fh, arg); + case V4L2_BUF_TYPE_SDR_OUTPUT: + if (unlikely(!is_tx || !is_sdr || !ops-vidioc_g_fmt_sdr_out)) + break; + return
Re: [PATCH RFCv1] v4l2: add support for SDR transmitter
Moikka! On 05/15/2015 12:25 PM, Hans Verkuil wrote: Hi Antti, Looks good, but the DocBook updates are missing. You probably planned to do that in RFCv2 or similar. Yep, first code then doc. Which device will have sdr_out? What's the cheapest device and where can I buy it? I'd like to be able to test it (and add qv4l2 support), I used HackRF One, it is likely 150-250e used one. Currently I have implemented almost all radio features it has, only option to enable antenna power supply is missing (and firmware upgrade, but it is not radio feature). Device is half-duplex - only RX or TX could be used at the time. Driver creates two device nodes, one for receiver and another for transmitter. There is: 2 x struct video_device 2 x struct v4l2_device 2 x struct vb2_queue 2 x struct v4l2_ctrl_handler Locking is still missing. I am not sure how it should be done, but likely I try add lock to start/stop streaming. When start streaming is called it sets some flag/lock and if another device node tries start streaming at same time error is returned. Device uses Complex S8 format for both receiver and transmitter. I will add that format to vivid and then it should be possible generate beep using vivid and transmit it using HackRF (cat /dev/swradio0 /dev/swradio1), where swradio0 is vivid and swradio1 is HackRF. regards Antti -- http://palosaari.fi/ -- To unsubscribe from this list: send the line unsubscribe linux-media in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH RFCv1] v4l2: add support for SDR transmitter
New IOCTL ops: vidioc_enum_fmt_sdr_out vidioc_g_fmt_sdr_out vidioc_s_fmt_sdr_out vidioc_try_fmt_sdr_out New vb2 buffertype: V4L2_BUF_TYPE_SDR_OUTPUT New v4l2 capability: V4L2_CAP_SDR_OUTPUT Cc: Hans Verkuil hverk...@xs4all.nl Signed-off-by: Antti Palosaari cr...@iki.fi --- drivers/media/v4l2-core/v4l2-dev.c | 14 -- drivers/media/v4l2-core/v4l2-ioctl.c| 25 + drivers/media/v4l2-core/videobuf-core.c | 4 +++- include/media/v4l2-ioctl.h | 8 include/trace/events/v4l2.h | 1 + include/uapi/linux/videodev2.h | 5 - 6 files changed, 53 insertions(+), 4 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index 71a1b93..6b1eaed 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -637,8 +637,8 @@ static void determine_valid_ioctls(struct video_device *vdev) ops-vidioc_try_fmt_sliced_vbi_out))) set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap); - } else if (is_sdr) { - /* SDR specific ioctls */ + } else if (is_sdr is_rx) { + /* SDR receiver specific ioctls */ if (ops-vidioc_enum_fmt_sdr_cap) set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls); if (ops-vidioc_g_fmt_sdr_cap) @@ -647,6 +647,16 @@ static void determine_valid_ioctls(struct video_device *vdev) set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls); if (ops-vidioc_try_fmt_sdr_cap) set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); + } else if (is_sdr is_tx) { + /* SDR transmitter specific ioctls */ + if (ops-vidioc_enum_fmt_sdr_out) + set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls); + if (ops-vidioc_g_fmt_sdr_out) + set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls); + if (ops-vidioc_s_fmt_sdr_out) + set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls); + if (ops-vidioc_try_fmt_sdr_out) + set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); } if (is_vid || is_vbi || is_sdr) { diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index 1476602..e78b7b8 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -153,6 +153,7 @@ const char *v4l2_type_names[] = { [V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE] = vid-cap-mplane, [V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE] = vid-out-mplane, [V4L2_BUF_TYPE_SDR_CAPTURE]= sdr-cap, + [V4L2_BUF_TYPE_SDR_OUTPUT] = sdr-out, }; EXPORT_SYMBOL(v4l2_type_names); @@ -325,6 +326,7 @@ static void v4l_print_format(const void *arg, bool write_only) sliced-service_lines[1][i]); break; case V4L2_BUF_TYPE_SDR_CAPTURE: + case V4L2_BUF_TYPE_SDR_OUTPUT: sdr = p-fmt.sdr; pr_cont(, pixelformat=%c%c%c%c\n, (sdr-pixelformat 0) 0xff, @@ -973,6 +975,10 @@ static int check_fmt(struct file *file, enum v4l2_buf_type type) if (is_sdr is_rx ops-vidioc_g_fmt_sdr_cap) return 0; break; + case V4L2_BUF_TYPE_SDR_OUTPUT: + if (is_sdr is_tx ops-vidioc_g_fmt_sdr_out) + return 0; + break; default: break; } @@ -1321,6 +1327,11 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops, break; ret = ops-vidioc_enum_fmt_sdr_cap(file, fh, arg); break; + case V4L2_BUF_TYPE_SDR_OUTPUT: + if (unlikely(!is_tx || !is_sdr || !ops-vidioc_enum_fmt_sdr_out)) + break; + ret = ops-vidioc_enum_fmt_sdr_out(file, fh, arg); + break; } if (ret == 0) v4l_fill_fmtdesc(p); @@ -1415,6 +1426,10 @@ static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops, if (unlikely(!is_rx || !is_sdr || !ops-vidioc_g_fmt_sdr_cap)) break; return ops-vidioc_g_fmt_sdr_cap(file, fh, arg); + case V4L2_BUF_TYPE_SDR_OUTPUT: + if (unlikely(!is_tx || !is_sdr || !ops-vidioc_g_fmt_sdr_out)) + break; + return ops-vidioc_g_fmt_sdr_out(file, fh, arg); } return -EINVAL; } @@ -1494,6 +1509,11 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops, break; CLEAR_AFTER_FIELD(p, fmt.sdr); return ops-vidioc_s_fmt_sdr_cap(file, fh, arg); + case V4L2_BUF_TYPE_SDR_OUTPUT: +