smscoreapi.h 12.6 KB
Newer Older
1
/*
2
 *  Driver for the Siano SMS1xxx USB dongle
3
 *
4 5 6
 *  author: Anatoly Greenblat
 *
 *  Copyright (c), 2005-2008 Siano Mobile Silicon, Inc.
7 8
 *
 *  This program is free software; you can redistribute it and/or modify
9 10
 *  it under the terms of the GNU General Public License version 3 as
 *  published by the Free Software Foundation;
11
 *
12 13
 *  Software distributed under the License is distributed on an "AS IS"
 *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
14
 *
15
 *  See the GNU General Public License for more details.
16 17 18 19 20 21
 *
 *  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., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

22 23 24
#ifndef __smscoreapi_h__
#define __smscoreapi_h__

25 26 27 28 29 30 31
#include <linux/version.h>
#include <linux/device.h>
#include <linux/list.h>
#include <linux/mm.h>
#include <asm/scatterlist.h>
#include <asm/page.h>

32 33 34 35 36
#include "dmxdev.h"
#include "dvbdev.h"
#include "dvb_demux.h"
#include "dvb_frontend.h"

37 38 39 40 41 42 43 44 45
#include <linux/mutex.h>

typedef struct mutex kmutex_t;

#define kmutex_init(_p_) mutex_init(_p_)
#define kmutex_lock(_p_) mutex_lock(_p_)
#define kmutex_trylock(_p_) mutex_trylock(_p_)
#define kmutex_unlock(_p_) mutex_unlock(_p_)

46
#ifndef min
47
#define min(a, b) (((a) < (b)) ? (a) : (b))
48 49 50 51
#endif

#define SMS_ALLOC_ALIGNMENT					128
#define SMS_DMA_ALIGNMENT					16
52
#define SMS_ALIGN_ADDRESS(addr) \
53
	((((uintptr_t)(addr)) + (SMS_DMA_ALIGNMENT-1)) & ~(SMS_DMA_ALIGNMENT-1))
54 55 56 57 58

#define SMS_DEVICE_FAMILY2					1
#define SMS_ROM_NO_RESPONSE					2
#define SMS_DEVICE_NOT_READY				0x8000000

59
enum sms_device_type_st {
60
	SMS_STELLAR = 0,
61 62 63 64
	SMS_NOVA_A0,
	SMS_NOVA_B0,
	SMS_VEGA,
	SMS_NUM_OF_DEVICE_TYPES
65
};
66

67 68 69
struct smscore_device_t;
struct smscore_client_t;
struct smscore_buffer_t;
70

71
typedef int (*hotplug_t)(struct smscore_device_t *coredev,
72
			 struct device *device, int arrival);
73 74 75 76 77 78 79 80

typedef int (*setmode_t)(void *context, int mode);
typedef void (*detectmode_t)(void *context, int *mode);
typedef int (*sendrequest_t)(void *context, void *buffer, size_t size);
typedef int (*loadfirmware_t)(void *context, void *buffer, size_t size);
typedef int (*preload_t)(void *context);
typedef int (*postload_t)(void *context);

81
typedef int (*onresponse_t)(void *context, struct smscore_buffer_t *cb);
82 83
typedef void (*onremove_t)(void *context);

84
struct smscore_buffer_t {
85
	/* public members, once passed to clients can be changed freely */
86 87 88 89
	struct list_head entry;
	int				size;
	int				offset;

90
	/* private members, read-only for clients */
91 92 93
	void			*p;
	dma_addr_t		phys;
	unsigned long	offset_in_common;
94
};
95

96
struct smsdevice_params_t {
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
	struct device	*device;

	int				buffer_size;
	int				num_buffers;

	char			devpath[32];
	unsigned long	flags;

	setmode_t		setmode_handler;
	detectmode_t	detectmode_handler;
	sendrequest_t	sendrequest_handler;
	preload_t		preload_handler;
	postload_t		postload_handler;

	void			*context;
112 113
	enum sms_device_type_st device_type;
};
114

115
struct smsclient_params_t {
116 117 118 119 120 121
	int				initial_id;
	int				data_type;
	onresponse_t	onresponse_handler;
	onremove_t		onremove_handler;

	void			*context;
122
};
123

124
/* GPIO definitions for antenna frequency domain control (SMS8021) */
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
#define SMS_ANTENNA_GPIO_0					1
#define SMS_ANTENNA_GPIO_1					0

#define BW_8_MHZ							0
#define BW_7_MHZ							1
#define BW_6_MHZ							2
#define BW_5_MHZ							3
#define BW_ISDBT_1SEG						4
#define BW_ISDBT_3SEG						5

#define MSG_HDR_FLAG_SPLIT_MSG				4

#define MAX_GPIO_PIN_NUMBER					31

#define HIF_TASK							11
#define SMS_HOST_LIB						150
#define DVBT_BDA_CONTROL_MSG_ID				201

#define SMS_MAX_PAYLOAD_SIZE				240
#define SMS_TUNE_TIMEOUT					500

#define MSG_SMS_GPIO_CONFIG_REQ				507
#define MSG_SMS_GPIO_CONFIG_RES				508
#define MSG_SMS_GPIO_SET_LEVEL_REQ			509
#define MSG_SMS_GPIO_SET_LEVEL_RES			510
#define MSG_SMS_GPIO_GET_LEVEL_REQ			511
#define MSG_SMS_GPIO_GET_LEVEL_RES			512
#define MSG_SMS_RF_TUNE_REQ					561
#define MSG_SMS_RF_TUNE_RES					562
#define MSG_SMS_INIT_DEVICE_REQ				578
#define MSG_SMS_INIT_DEVICE_RES				579
#define MSG_SMS_ADD_PID_FILTER_REQ			601
#define MSG_SMS_ADD_PID_FILTER_RES			602
#define MSG_SMS_REMOVE_PID_FILTER_REQ		603
#define MSG_SMS_REMOVE_PID_FILTER_RES		604
#define MSG_SMS_DAB_CHANNEL					607
#define MSG_SMS_GET_PID_FILTER_LIST_REQ		608
#define MSG_SMS_GET_PID_FILTER_LIST_RES		609
#define MSG_SMS_GET_STATISTICS_REQ			615
#define MSG_SMS_GET_STATISTICS_RES			616
#define MSG_SMS_SET_ANTENNA_CONFIG_REQ		651
#define MSG_SMS_SET_ANTENNA_CONFIG_RES		652
#define MSG_SMS_GET_STATISTICS_EX_REQ		653
#define MSG_SMS_GET_STATISTICS_EX_RES		654
#define MSG_SMS_SLEEP_RESUME_COMP_IND		655
#define MSG_SMS_DATA_DOWNLOAD_REQ			660
#define MSG_SMS_DATA_DOWNLOAD_RES			661
#define MSG_SMS_SWDOWNLOAD_TRIGGER_REQ		664
#define MSG_SMS_SWDOWNLOAD_TRIGGER_RES		665
#define MSG_SMS_SWDOWNLOAD_BACKDOOR_REQ		666
#define MSG_SMS_SWDOWNLOAD_BACKDOOR_RES		667
#define MSG_SMS_GET_VERSION_EX_REQ			668
#define MSG_SMS_GET_VERSION_EX_RES			669
#define MSG_SMS_SET_CLOCK_OUTPUT_REQ		670
#define MSG_SMS_I2C_SET_FREQ_REQ			685
#define MSG_SMS_GENERIC_I2C_REQ				687
#define MSG_SMS_GENERIC_I2C_RES				688
#define MSG_SMS_DVBT_BDA_DATA				693
#define MSG_SW_RELOAD_REQ					697
#define MSG_SMS_DATA_MSG					699
#define MSG_SW_RELOAD_START_REQ				702
#define MSG_SW_RELOAD_START_RES				703
#define MSG_SW_RELOAD_EXEC_REQ				704
#define MSG_SW_RELOAD_EXEC_RES				705
#define MSG_SMS_SPI_INT_LINE_SET_REQ		710
#define MSG_SMS_ISDBT_TUNE_REQ				776
#define MSG_SMS_ISDBT_TUNE_RES				777

#define SMS_INIT_MSG_EX(ptr, type, src, dst, len) do { \
	(ptr)->msgType = type; (ptr)->msgSrcId = src; (ptr)->msgDstId = dst; \
	(ptr)->msgLength = len; (ptr)->msgFlags = 0; \
} while (0)
197 198
#define SMS_INIT_MSG(ptr, type, len) \
	SMS_INIT_MSG_EX(ptr, type, 0, HIF_TASK, len)
199

200
enum SMS_DEVICE_MODE {
201 202 203 204 205 206 207 208 209 210 211
	DEVICE_MODE_NONE = -1,
	DEVICE_MODE_DVBT = 0,
	DEVICE_MODE_DVBH,
	DEVICE_MODE_DAB_TDMB,
	DEVICE_MODE_DAB_TDMB_DABIP,
	DEVICE_MODE_DVBT_BDA,
	DEVICE_MODE_ISDBT,
	DEVICE_MODE_ISDBT_BDA,
	DEVICE_MODE_CMMB,
	DEVICE_MODE_RAW_TUNER,
	DEVICE_MODE_MAX,
212
};
213

214
struct SmsMsgHdr_ST {
215 216 217 218 219
	u16	msgType;
	u8	msgSrcId;
	u8	msgDstId;
	u16	msgLength; /* Length of entire message, including header */
	u16	msgFlags;
220
};
221

222 223
struct SmsMsgData_ST {
	struct SmsMsgHdr_ST	xMsgHeader;
224
	u32			msgData[1];
225
};
226

227 228
struct SmsDataDownload_ST {
	struct SmsMsgHdr_ST	xMsgHeader;
229 230
	u32			MemAddr;
	u8			Payload[SMS_MAX_PAYLOAD_SIZE];
231
};
232

233 234
struct SmsVersionRes_ST {
	struct SmsMsgHdr_ST	xMsgHeader;
235

236 237 238
	u16		ChipModel; /* e.g. 0x1102 for SMS-1102 "Nova" */
	u8		Step; /* 0 - Step A */
	u8		MetalFix; /* 0 - Metal 0 */
239

240 241 242 243 244
	u8		FirmwareId; /* 0xFF � ROM, otherwise the
				     * value indicated by
				     * SMSHOSTLIB_DEVICE_MODES_E */
	u8		SupportedProtocols; /* Bitwise OR combination of
					     * supported protocols */
245

246 247 248 249
	u8		VersionMajor;
	u8		VersionMinor;
	u8		VersionPatch;
	u8		VersionFieldPatch;
250

251 252 253 254
	u8		RomVersionMajor;
	u8		RomVersionMinor;
	u8		RomVersionPatch;
	u8		RomVersionFieldPatch;
255

256
	u8		TextLabel[34];
257
};
258

259
struct SmsFirmware_ST {
260 261 262 263
	u32			CheckSum;
	u32			Length;
	u32			StartAddress;
	u8			Payload[1];
264
};
265

266
struct SMSHOSTLIB_STATISTICS_ST {
267
	u32 Reserved; /* Reserved */
268 269

	/* Common parameters */
270 271 272
	u32 IsRfLocked; /* 0 - not locked, 1 - locked */
	u32 IsDemodLocked; /* 0 - not locked, 1 - locked */
	u32 IsExternalLNAOn; /* 0 - external LNA off, 1 - external LNA on */
273 274

	/* Reception quality */
275 276 277
	s32  SNR; /* dB */
	u32 BER; /* Post Viterbi BER [1E-5] */
	u32 FIB_CRC;	/* CRC errors percentage, valid only for DAB */
278 279 280 281
	u32 TS_PER; /* Transport stream PER, 0xFFFFFFFF indicate N/A,
		     * valid only for DVB-T/H */
	u32 MFER; /* DVB-H frame error rate in percentage,
		   * 0xFFFFFFFF indicate N/A, valid only for DVB-H */
282 283 284
	s32  RSSI; /* dBm */
	s32  InBandPwr; /* In band power in dBM */
	s32  CarrierOffset; /* Carrier Offset in bin/1024 */
285

286
	/* Transmission parameters, valid only for DVB-T/H */
287
	u32 Frequency; /* Frequency in Hz */
288 289 290 291 292 293 294 295 296
	u32 Bandwidth; /* Bandwidth in MHz */
	u32 TransmissionMode; /* Transmission Mode, for DAB modes 1-4,
			       * for DVB-T/H FFT mode carriers in Kilos */
	u32 ModemState; /* from SMS_DvbModemState_ET */
	u32 GuardInterval; /* Guard Interval, 1 divided by value */
	u32 CodeRate; /* Code Rate from SMS_DvbModemState_ET */
	u32 LPCodeRate; /* Low Priority Code Rate from SMS_DvbModemState_ET */
	u32 Hierarchy; /* Hierarchy from SMS_Hierarchy_ET */
	u32 Constellation; /* Constellation from SMS_Constellation_ET */
297 298

	/* Burst parameters, valid only for DVB-H */
299 300 301 302 303 304 305 306 307
	u32 BurstSize; /* Current burst size in bytes */
	u32 BurstDuration; /* Current burst duration in mSec */
	u32 BurstCycleTime; /* Current burst cycle time in mSec */
	u32 CalculatedBurstCycleTime; /* Current burst cycle time in mSec,
				       * as calculated by demodulator */
	u32 NumOfRows; /* Number of rows in MPE table */
	u32 NumOfPaddCols; /* Number of padding columns in MPE table */
	u32 NumOfPunctCols; /* Number of puncturing columns in MPE table */
	/* Burst parameters */
308 309
	u32 ErrorTSPackets; /* Number of erroneous transport-stream packets */
	u32 TotalTSPackets; /* Total number of transport-stream packets */
310 311 312 313 314 315
	u32 NumOfValidMpeTlbs; /* Number of MPE tables which do not include
				* errors after MPE RS decoding */
	u32 NumOfInvalidMpeTlbs; /* Number of MPE tables which include errors
				  * after MPE RS decoding */
	u32 NumOfCorrectedMpeTlbs; /* Number of MPE tables which were corrected
				    * by MPE RS decoding */
316 317

	/* Common params */
318 319
	u32 BERErrorCount; /* Number of errornous SYNC bits. */
	u32 BERBitCount; /* Total number of SYNC bits. */
320 321

	/* Interface information */
322
	u32 SmsToHostTxErrors; /* Total number of transmission errors. */
323 324

	/* DAB/T-DMB */
325
	u32 PreBER; /* DAB/T-DMB only: Pre Viterbi BER [1E-5] */
326 327

	/* DVB-H TPS parameters */
328 329
	u32 CellId; /* TPS Cell ID in bits 15..0, bits 31..16 zero;
		     * if set to 0xFFFFFFFF cell_id not yet recovered */
330

331
};
332

333
struct SmsMsgStatisticsInfo_ST {
334
	u32 RequestResult;
335

336
	struct SMSHOSTLIB_STATISTICS_ST Stat;
337

338
	/* Split the calc of the SNR in DAB */
339 340
	u32 Signal; /* dB */
	u32 Noise; /* dB */
341

342
};
343

344

345
struct smsdvb_client_t {
346 347
	struct list_head entry;

348 349
	struct smscore_device_t	*coredev;
	struct smscore_client_t	*smsclient;
350 351 352 353 354 355

	struct dvb_adapter	adapter;
	struct dvb_demux	demux;
	struct dmxdev		dmxdev;
	struct dvb_frontend	frontend;

356 357
	fe_status_t		fe_status;
	int			fe_ber, fe_snr, fe_signal_strength;
358 359 360

	struct completion	tune_done, stat_done;

361
	/* todo: save freq/band instead whole struct */
362 363
	struct dvb_frontend_parameters fe_params;

364
};
365

366 367 368 369 370 371
extern void smscore_registry_setmode(char *devpath, int mode);
extern int smscore_registry_getmode(char *devpath);

extern int smscore_register_hotplug(hotplug_t hotplug);
extern void smscore_unregister_hotplug(hotplug_t hotplug);

372 373 374
extern int smscore_register_device(struct smsdevice_params_t *params,
				   struct smscore_device_t **coredev);
extern void smscore_unregister_device(struct smscore_device_t *coredev);
375

376 377 378 379
extern int smscore_start_device(struct smscore_device_t *coredev);
extern int smscore_load_firmware(struct smscore_device_t *coredev,
				 char *filename,
				 loadfirmware_t loadfirmware_handler);
380

381 382
extern int smscore_set_device_mode(struct smscore_device_t *coredev, int mode);
extern int smscore_get_device_mode(struct smscore_device_t *coredev);
383

384 385 386 387
extern int smscore_register_client(struct smscore_device_t *coredev,
				    struct smsclient_params_t *params,
				    struct smscore_client_t **client);
extern void smscore_unregister_client(struct smscore_client_t *client);
388

389
extern int smsclient_sendrequest(struct smscore_client_t *client,
390
				 void *buffer, size_t size);
391 392
extern void smscore_onresponse(struct smscore_device_t *coredev,
			       struct smscore_buffer_t *cb);
393 394


395 396 397
extern struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev);
extern void smscore_putbuffer(struct smscore_device_t *coredev,
			      struct smscore_buffer_t *cb);
398

399 400 401
void smscore_set_board_id(struct smscore_device_t *core, int id);
int smscore_get_board_id(struct smscore_device_t *core);

402
/* smsdvb.c */
403 404 405 406 407 408
int smsdvb_register(void);
void smsdvb_unregister(void);

/* smsusb.c */
int smsusb_register(void);
void smsusb_unregister(void);
409

410 411 412 413 414 415 416 417 418 419 420 421 422 423
/* ------------------------------------------------------------------------ */

extern int sms_debug;

#define DBG_INFO 1
#define DBG_ADV  2

#define sms_printk(kern, fmt, arg...) \
	printk(kern "%s: " fmt "\n", __func__, ##arg)

#define dprintk(kern, lvl, fmt, arg...) do {\
	if (sms_debug & lvl) \
		sms_printk(kern, fmt, ##arg); } while (0)

424
#define sms_log(fmt, arg...) sms_printk(KERN_INFO, fmt, ##arg)
425
#define sms_err(fmt, arg...) \
426
	sms_printk(KERN_ERR, "line: %d: " fmt, __LINE__, ##arg)
427
#define sms_warn(fmt, arg...)  sms_printk(KERN_WARNING, fmt, ##arg)
428
#define sms_info(fmt, arg...) \
429
	dprintk(KERN_INFO, DBG_INFO, fmt, ##arg)
430
#define sms_debug(fmt, arg...) \
431
	dprintk(KERN_DEBUG, DBG_ADV, fmt, ##arg)
432 433


434
#endif /* __smscoreapi_h__ */