cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

usbtv.h (4191B)


      1/*
      2 * Copyright (c) 2013 Lubomir Rintel
      3 * All rights reserved.
      4 *
      5 * Redistribution and use in source and binary forms, with or without
      6 * modification, are permitted provided that the following conditions
      7 * are met:
      8 * 1. Redistributions of source code must retain the above copyright
      9 *    notice, this list of conditions, and the following disclaimer,
     10 *    without modification.
     11 * 2. The name of the author may not be used to endorse or promote products
     12 *    derived from this software without specific prior written permission.
     13 *
     14 * Alternatively, this software may be distributed under the terms of the
     15 * GNU General Public License ("GPL").
     16 *
     17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 */
     29/*
     30 * Fushicai USBTV007 Audio-Video Grabber Driver
     31 *
     32 * No physical hardware was harmed running Windows during the
     33 * reverse-engineering activity
     34 */
     35
     36#include <linux/module.h>
     37#include <linux/slab.h>
     38#include <linux/usb.h>
     39
     40#include <media/v4l2-device.h>
     41#include <media/v4l2-ctrls.h>
     42#include <media/videobuf2-v4l2.h>
     43#include <media/videobuf2-vmalloc.h>
     44
     45/* Hardware. */
     46#define USBTV_VIDEO_ENDP	0x81
     47#define USBTV_AUDIO_ENDP	0x83
     48#define USBTV_BASE		0xc000
     49#define USBTV_CONTROL_REG	11
     50#define USBTV_REQUEST_REG	12
     51
     52/* Number of concurrent isochronous urbs submitted.
     53 * Higher numbers was seen to overly saturate the USB bus. */
     54#define USBTV_ISOC_TRANSFERS	16
     55#define USBTV_ISOC_PACKETS	8
     56
     57#define USBTV_CHUNK_SIZE	256
     58#define USBTV_CHUNK		240
     59
     60#define USBTV_AUDIO_URBSIZE	20480
     61#define USBTV_AUDIO_HDRSIZE	4
     62#define USBTV_AUDIO_BUFFER	65536
     63
     64/* Chunk header. */
     65#define USBTV_MAGIC_OK(chunk)	((be32_to_cpu(chunk[0]) & 0xff000000) \
     66							== 0x88000000)
     67#define USBTV_FRAME_ID(chunk)	((be32_to_cpu(chunk[0]) & 0x00ff0000) >> 16)
     68#define USBTV_ODD(chunk)	((be32_to_cpu(chunk[0]) & 0x0000f000) >> 15)
     69#define USBTV_CHUNK_NO(chunk)	(be32_to_cpu(chunk[0]) & 0x00000fff)
     70
     71#define USBTV_TV_STD  (V4L2_STD_525_60 | V4L2_STD_PAL | V4L2_STD_SECAM)
     72
     73/* parameters for supported TV norms */
     74struct usbtv_norm_params {
     75	v4l2_std_id norm;
     76	int cap_width, cap_height;
     77};
     78
     79/* A single videobuf2 frame buffer. */
     80struct usbtv_buf {
     81	struct vb2_v4l2_buffer vb;
     82	struct list_head list;
     83};
     84
     85/* Per-device structure. */
     86struct usbtv {
     87	struct device *dev;
     88	struct usb_device *udev;
     89
     90	/* video */
     91	struct v4l2_device v4l2_dev;
     92	struct v4l2_ctrl_handler ctrl;
     93	struct video_device vdev;
     94	struct vb2_queue vb2q;
     95	struct mutex v4l2_lock;
     96	struct mutex vb2q_lock;
     97
     98	/* List of videobuf2 buffers protected by a lock. */
     99	spinlock_t buflock;
    100	struct list_head bufs;
    101
    102	/* Number of currently processed frame, useful find
    103	 * out when a new one begins. */
    104	u32 frame_id;
    105	int chunks_done;
    106
    107	enum {
    108		USBTV_COMPOSITE_INPUT,
    109		USBTV_SVIDEO_INPUT,
    110	} input;
    111	v4l2_std_id norm;
    112	int width, height;
    113	int n_chunks;
    114	int iso_size;
    115	int last_odd;
    116	unsigned int sequence;
    117	struct urb *isoc_urbs[USBTV_ISOC_TRANSFERS];
    118
    119	/* audio */
    120	struct snd_card *snd;
    121	struct snd_pcm_substream *snd_substream;
    122	atomic_t snd_stream;
    123	struct work_struct snd_trigger;
    124	struct urb *snd_bulk_urb;
    125	size_t snd_buffer_pos;
    126	size_t snd_period_pos;
    127};
    128
    129int usbtv_set_regs(struct usbtv *usbtv, const u16 regs[][2], int size);
    130
    131int usbtv_video_init(struct usbtv *usbtv);
    132void usbtv_video_free(struct usbtv *usbtv);
    133
    134int usbtv_audio_init(struct usbtv *usbtv);
    135void usbtv_audio_free(struct usbtv *usbtv);
    136void usbtv_audio_suspend(struct usbtv *usbtv);
    137void usbtv_audio_resume(struct usbtv *usbtv);