Re: [PATCH v4 1/6] drivers:staging: ti-st: fmdrv common header file

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

 



On Tuesday, November 16, 2010 14:18:09 manjunatha_halli@xxxxxx wrote:
> From: Manjunatha Halli <manjunatha_halli@xxxxxx>
> 
> These are common headers used in FM submodules (FM V4L2, FM common,
> FM Rx,and FM TX).
> 
> Signed-off-by: Manjunatha Halli <manjunatha_halli@xxxxxx>
> ---
>  drivers/staging/ti-st/fmdrv.h |  259 +++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 259 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/staging/ti-st/fmdrv.h
> 
> diff --git a/drivers/staging/ti-st/fmdrv.h b/drivers/staging/ti-st/fmdrv.h
> new file mode 100644
> index 0000000..68ed44c
> --- /dev/null
> +++ b/drivers/staging/ti-st/fmdrv.h
> @@ -0,0 +1,259 @@
> +/*
> + *  FM Driver for Connectivity chip of Texas Instruments.
> + *
> + *  Common header for all FM driver sub-modules.
> + *
> + *  Copyright (C) 2009 Texas Instruments
> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License version 2 as
> + *  published by the Free Software Foundation.
> + *
> + *  This program is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with this program; if not, write to the Free Software
> + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
> + *
> + */
> +
> +#ifndef _FM_DRV_H
> +#define _FM_DRV_H
> +
> +#include <linux/skbuff.h>
> +#include <linux/interrupt.h>
> +#include <sound/core.h>
> +#include <sound/initval.h>
> +#include <linux/timer.h>
> +#include <linux/version.h>
> +
> +#define FM_DRV_VERSION            "0.01"
> +/* Should match with FM_DRV_VERSION */
> +#define FM_DRV_RADIO_VERSION      KERNEL_VERSION(0, 0, 1)
> +#define FM_DRV_NAME               "ti_fmdrv"
> +#define FM_DRV_CARD_SHORT_NAME    "TI FM Radio"
> +#define FM_DRV_CARD_LONG_NAME     "Texas Instruments FM Radio"
> +
> +/* Flag info */
> +#define FM_INTTASK_RUNNING            0
> +#define FM_INTTASK_SCHEDULE_PENDING   1
> +#define FM_FIRMWARE_DW_INPROGRESS     2
> +#define FM_CORE_READY                 3
> +#define FM_CORE_TRANSPORT_READY       4
> +#define FM_AF_SWITCH_INPROGRESS	      5
> +#define FM_CORE_TX_XMITING	      6
> +
> +#define FM_TUNE_COMPLETE	      0x1
> +#define FM_BAND_LIMIT		      0x2
> +
> +#define FM_DRV_TX_TIMEOUT      (5*HZ)	/* 5 seconds */
> +#define FM_DRV_RX_SEEK_TIMEOUT (20*HZ)	/* 20 seconds */
> +
> +#define NO_OF_ENTRIES_IN_ARRAY(array) (sizeof(array) / sizeof(array[0]))
> +
> +enum {
> +	FM_MODE_OFF,
> +	FM_MODE_TX,
> +	FM_MODE_RX,
> +	FM_MODE_ENTRY_MAX
> +};
> +
> +#define FM_RX_RDS_INFO_FIELD_MAX	8	/* 4 Group * 2 Bytes */
> +
> +/* TODO:
> + * move the following CIDs to videodev2.h upon acceptance
> + */
> +#define V4L2_CTRL_CLASS_FM_RX 0x009c0000	/* FM Tuner control class */
> +/* FM Tuner class control IDs */
> +#define V4L2_CID_FM_RX_CLASS_BASE	(V4L2_CTRL_CLASS_FM_RX | 0x900)
> +#define V4L2_CID_FM_RX_CLASS		(V4L2_CTRL_CLASS_FM_RX | 1)
> +#define V4L2_CID_RSSI_THRESHOLD		(V4L2_CID_FM_RX_CLASS_BASE + 2)
> +#define V4L2_CID_TUNE_AF		(V4L2_CID_FM_RX_CLASS_BASE + 3)

Please post an RFC describing these new controls.

> +enum v4l2_tune_af {
> +	V4L2_FM_AF_OFF          = 0,
> +	V4L2_FM_AF_ON           = 1
> +};

Huh? If it is an on/off type of controls, then it should be a boolean.

> +#define V4L2_CID_FM_BAND		(V4L2_CID_FM_RX_CLASS_BASE + 1)
> +enum v4l2_fm_band {
> +	V4L2_FM_BAND_OTHER      = 0,
> +	V4L2_FM_BAND_JAPAN      = 1,
> +	V4L2_FM_BAND_OIRT       = 2

This was proposed and rejected for the wl1273 driver. Instead the driver should
hide this complexity. See the wl1273 driver.

> +};
> +
> +/*
> + * define private CIDs for V4L2
> + */
> +#define V4L2_CID_CHANNEL_SPACING (V4L2_CID_PRIVATE_BASE + 0)

The wl1273 driver has defined a new standard channel spacing control. So that
should be used.

> +
> +/* RX RDS data format */
> +struct fm_rdsdata_format {
> +	union {
> +		struct {
> +			unsigned char rdsbuff[FM_RX_RDS_INFO_FIELD_MAX];
> +		} groupdatabuff;
> +		struct {
> +			unsigned short pidata;
> +			unsigned char block_b_byte1;
> +			unsigned char block_b_byte2;
> +			unsigned char block_c_byte1;
> +			unsigned char block_c_byte2;
> +			unsigned char block_d_byte1;
> +			unsigned char block_d_byte2;
> +		} groupgeneral;
> +		struct {
> +			unsigned short pidata;
> +			unsigned char block_b_byte1;
> +			unsigned char block_b_byte2;
> +			unsigned char firstaf;
> +			unsigned char secondaf;
> +			unsigned char firstpsbyte;
> +			unsigned char secondpsbyte;
> +		} group0A;
> +
> +		struct {
> +			unsigned short pidata;
> +			unsigned char block_b_byte1;
> +			unsigned char block_b_byte2;
> +			unsigned short pidata2;
> +			unsigned char firstpsbyte;
> +			unsigned char secondpsbyte;
> +		} group0B;
> +	} rdsdata;
> +};
> +
> +/* FM region (Europe/US, Japan) info */
> +struct region_info {
> +	unsigned int channel_spacing;
> +	unsigned int bottom_frequency;
> +	unsigned int top_frequency;
> +	unsigned char region_index;
> +};
> +
> +typedef void (*int_handler_prototype) (void *);
> +
> +/* FM Interrupt processing related info */
> +struct fm_irq {
> +	unsigned char stage_index;
> +	unsigned short flag;	/* FM interrupt flag */
> +	unsigned short mask;	/* FM interrupt mask */
> +	/* Interrupt process timeout handler */
> +	struct timer_list int_timeout_timer;
> +	unsigned char irq_service_timeout_retry;
> +	int_handler_prototype *fm_int_handlers;
> +};
> +
> +/* RDS info */
> +struct fm_rds {
> +	unsigned char flag;	/* RX RDS on/off status */
> +	unsigned char last_block_index;	/* Last received RDS block */
> +
> +	/* RDS buffer */
> +	wait_queue_head_t read_queue;
> +	unsigned int buf_size;	/* Size is always multiple of 3 */
> +	unsigned int wr_index;
> +	unsigned int rd_index;
> +	unsigned char *buffer;
> +};
> +
> +#define FM_RDS_MAX_AF_LIST		25
> +
> +/*
> + * Current RX channel Alternate Frequency cache.
> + * This info is used to switch to other freq (AF)
> + * when current channel signal strengh is below RSSI threshold.
> + */
> +struct tuned_station_info {
> +	unsigned short picode;
> +	unsigned int af_cache[FM_RDS_MAX_AF_LIST];
> +	unsigned char no_of_items_in_afcache;
> +	unsigned char af_list_max;
> +};
> +
> +/* FM RX mode info */
> +struct fm_rx {
> +	struct region_info region;	/* Current selected band */
> +	unsigned int curr_freq;	/* Current RX frquency */
> +	unsigned char curr_mute_mode;	/* Current mute mode */
> +	unsigned char curr_deemphasis_mode; /* Current deemphasis mode */
> +	/* RF dependent soft mute mode */
> +	unsigned char curr_rf_depend_mute;
> +	unsigned short curr_volume;	/* Current volume level */
> +	short curr_rssi_threshold;	/* Current RSSI threshold level */
> +	/* Holds the index of the current AF jump */
> +	unsigned char cur_afjump_index;
> +	/* Will hold the frequency before the jump */
> +	unsigned int freq_before_jump;
> +	unsigned char rds_mode;	/* RDS operation mode (RDS/RDBS) */
> +	unsigned char af_mode;	/* Alternate frequency on/off */
> +	struct tuned_station_info cur_station_info;
> +	struct fm_rds rds;
> +};
> +
> +/*
> + * FM TX RDS data
> + *
> + * @ text_type: is the text following PS or RT
> + * @ text: radio text string which could either be PS or RT
> + * @ af_freq: alternate frequency for Tx
> + * TODO: to be declared in application
> + */
> +struct tx_rds {
> +	unsigned char text_type;
> +	unsigned char text[25];
> +	unsigned char flag;
> +	unsigned int af_freq;
> +};
> +/*
> + * FM TX global data
> + *
> + * @ pwr_lvl: Power Level of the Transmission from mixer control
> + * @ xmit_state: Transmission state = Updated locally upon Start/Stop
> + * @ audio_io: i2S/Analog
> + * @ tx_frq: Transmission frequency
> + */
> +struct fmtx_data {
> +	unsigned char pwr_lvl;
> +	unsigned char xmit_state;
> +	unsigned char audio_io;
> +	unsigned char region;
> +	unsigned short aud_mode;
> +	unsigned int preemph;
> +	unsigned long tx_frq;
> +	struct tx_rds rds;
> +};
> +
> +/* FM driver operation structure */
> +struct fmdrv_ops {
> +	struct video_device *radio_dev;	/* V4L2 video device pointer */
> +	struct snd_card *card;	/* Card which holds FM mixer controls */
> +	unsigned short asci_id;
> +	spinlock_t rds_buff_lock; /* To protect access to RDS buffer */
> +	spinlock_t resp_skb_lock; /* To protect access to received SKB */
> +
> +	long flag;		/*  FM driver state machine info */
> +	char streg_cbdata; /* status of ST registration */
> +
> +	struct sk_buff_head rx_q;	/* RX queue */
> +	struct tasklet_struct rx_task;	/* RX Tasklet */
> +
> +	struct sk_buff_head tx_q;	/* TX queue */
> +	struct tasklet_struct tx_task;	/* TX Tasklet */
> +	unsigned long last_tx_jiffies;	/* Timestamp of last pkt sent */
> +	atomic_t tx_cnt;	/* Number of packets can send at a time */
> +
> +	struct sk_buff *response_skb;	/* Response from the chip */
> +	/* Main task completion handler */
> +	struct completion maintask_completion;
> +	/* Opcode of last command sent to the chip */
> +	unsigned char last_sent_pkt_opcode;
> +	/* Handler used for wakeup when response packet is received */
> +	struct completion *response_completion;
> +	struct fm_irq irq_info;
> +	unsigned char curr_fmmode; /* Current FM chip mode (TX, RX, OFF) */
> +	struct fm_rx rx;	/* FM receiver info */
> +	struct fmtx_data tx_data;
> +};
> +#endif
> 

-- 
Hans Verkuil - video4linux developer - sponsored by Cisco
--
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