Re: [PATCH 3/6] msi3101: add u8 sample format

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/29/2013 05:51 AM, Antti Palosaari wrote:
> Add unsigned 8-bit sample format. Format is got directly from
> hardware, but it is converted from signed to unsigned. It is worst
> known sampling resolution hardware offer.
> 
> Signed-off-by: Antti Palosaari <crope@xxxxxx>
> ---
>  drivers/staging/media/msi3101/sdr-msi3101.c | 67 ++++++++++++++++++++++++++++-
>  1 file changed, 66 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/staging/media/msi3101/sdr-msi3101.c b/drivers/staging/media/msi3101/sdr-msi3101.c
> index 9c54c63..2110488 100644
> --- a/drivers/staging/media/msi3101/sdr-msi3101.c
> +++ b/drivers/staging/media/msi3101/sdr-msi3101.c
> @@ -385,6 +385,7 @@ static const struct msi3101_gain msi3101_gain_lut_1000[] = {
>  #define MSI3101_CID_TUNER_IF              ((V4L2_CID_USER_BASE | 0xf000) + 12)
>  #define MSI3101_CID_TUNER_GAIN            ((V4L2_CID_USER_BASE | 0xf000) + 13)
>  
> +#define V4L2_PIX_FMT_SDR_U8     v4l2_fourcc('D', 'U', '0', '8') /* unsigned 8-bit */
>  #define V4L2_PIX_FMT_SDR_S8     v4l2_fourcc('D', 'S', '0', '8') /* signed 8-bit */
>  #define V4L2_PIX_FMT_SDR_S12    v4l2_fourcc('D', 'S', '1', '2') /* signed 12-bit */
>  #define V4L2_PIX_FMT_SDR_S14    v4l2_fourcc('D', 'S', '1', '4') /* signed 14-bit */

These defines should be moved to videodev2.h and documented in DocBook.

Regards,

	Hans

> @@ -428,6 +429,9 @@ struct msi3101_format {
>  /* format descriptions for capture and preview */
>  static struct msi3101_format formats[] = {
>  	{
> +		.name		= "I/Q 8-bit unsigned",
> +		.pixelformat	= V4L2_PIX_FMT_SDR_U8,
> +	}, {
>  		.name		= "I/Q 8-bit signed",
>  		.pixelformat	= V4L2_PIX_FMT_SDR_S8,
>  	}, {
> @@ -487,6 +491,7 @@ struct msi3101_state {
>  	u32 next_sample; /* for track lost packets */
>  	u32 sample; /* for sample rate calc */
>  	unsigned long jiffies;
> +	unsigned long jiffies_next;
>  	unsigned int sample_ctrl_bit[4];
>  };
>  
> @@ -572,6 +577,63 @@ static int msi3101_convert_stream_504(struct msi3101_state *s, u8 *dst,
>  	return dst_len;
>  }
>  
> +static int msi3101_convert_stream_504_u8(struct msi3101_state *s, u8 *dst,
> +		u8 *src, unsigned int src_len)
> +{
> +	int i, j, i_max, dst_len = 0;
> +	u32 sample_num[3];
> +	s8 *s8src;
> +	u8 *u8dst;
> +
> +	/* There could be 1-3 1024 bytes URB frames */
> +	i_max = src_len / 1024;
> +	u8dst = (u8 *) dst;
> +
> +	for (i = 0; i < i_max; i++) {
> +		sample_num[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | src[0] << 0;
> +		if (i == 0 && s->next_sample != sample_num[0]) {
> +			dev_dbg_ratelimited(&s->udev->dev,
> +					"%d samples lost, %d %08x:%08x\n",
> +					sample_num[0] - s->next_sample,
> +					src_len, s->next_sample, sample_num[0]);
> +		}
> +
> +		/*
> +		 * Dump all unknown 'garbage' data - maybe we will discover
> +		 * someday if there is something rational...
> +		 */
> +		dev_dbg_ratelimited(&s->udev->dev, "%*ph\n", 12, &src[4]);
> +
> +		/* 504 x I+Q samples */
> +		src += 16;
> +
> +		s8src = (s8 *) src;
> +		for (j = 0; j < 1008; j++)
> +			*u8dst++ = *s8src++ + 128;
> +
> +		src += 1008;
> +		dst += 1008;
> +		dst_len += 1008;
> +	}
> +
> +	/* calculate samping rate and output it in 10 seconds intervals */
> +	if (unlikely(time_is_before_jiffies(s->jiffies_next))) {
> +#define MSECS 10000UL
> +		unsigned int samples = sample_num[i_max - 1] - s->sample;
> +		s->jiffies_next = jiffies + msecs_to_jiffies(MSECS);
> +		s->sample = sample_num[i_max - 1];
> +		dev_dbg(&s->udev->dev,
> +				"slen=%d samples=%u msecs=%lu sampling rate=%lu\n",
> +				src_len, samples, MSECS,
> +				samples * 1000UL / MSECS);
> +	}
> +
> +	/* next sample (sample = sample + i * 504) */
> +	s->next_sample = sample_num[i_max - 1] + 504;
> +
> +	return dst_len;
> +}
> +
>  /*
>   * +===========================================================================
>   * |   00-1023 | USB packet type '384'
> @@ -1159,7 +1221,10 @@ static int msi3101_set_usb_adc(struct msi3101_state *s)
>  		reg7 = 0x000c9407;
>  	}
>  
> -	if (s->pixelformat == V4L2_PIX_FMT_SDR_S8) {
> +	if (s->pixelformat == V4L2_PIX_FMT_SDR_U8) {
> +		s->convert_stream = msi3101_convert_stream_504_u8;
> +		reg7 = 0x000c9407;
> +	} else if (s->pixelformat == V4L2_PIX_FMT_SDR_S8) {
>  		s->convert_stream = msi3101_convert_stream_504;
>  		reg7 = 0x000c9407;
>  	} else if (s->pixelformat == V4L2_PIX_FMT_SDR_MSI2500_384) {
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux