summaryrefslogtreecommitdiffstats
path: root/api/xc3028_control.h
blob: 14e32fec4dcb608d38ed87e08f04e71acdd9d407 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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
//                                                   
// Automatically generated C header file for         
// control of the XC3028L via the i2c interface.      
//                                                   
// Filename : xc3028_control.h                                     
// Generated : 7/3/2007 2:48:24 PM                                    
//                                                   
// (c) 2007, Xceive Corporation                         
//                                                   
//
// Disclaimer:
//
// Xceive assumes no responsibility for any consequences arising from the use
// of this computer code, nor from any infringement of patents or the rights of
// third parties that may result from its use. No license is granted by
// implication or otherwise under any patent or other rights of Xceive. The
// customer is responsible for assuring that proper design and operating
// safeguards are observed to minimize inherent and procedural hazards. Xceive
// assumes no responsibility for applications assistance or customer product
// design.
// The present computer code is not authorized for use in medical, life-support
// equipment, or any other application involving a potential risk of severe
// property or environmental damage, personal injury, or death without prior
// express written approval of Xceive.  Any such use is understood to be
// entirely at the user's risk.
//
//                                                   
                                                     
#ifndef __XC3028_CONTROL_H                                       
#define __XC3028_CONTROL_H                                       
                                                     
/* *********************************************************************** */
/* Defines                                                                 */
/* *********************************************************************** */

#define XC3028_MAX_I2C_WRITE_LENGTH                     52

#define XC3028_RESULT_SUCCESS                           0
#define XC3028_RESULT_RESET_FAILURE                     1
#define XC3028_RESULT_I2C_WRITE_FAILURE                 2
#define XC3028_RESULT_I2C_READ_FAILURE                  3
#define XC3028_RESULT_WAIT_FAILURE                      4
#define XC3028_RESULT_OUT_OF_RANGE                      5
#define XC3028_RESULT_INVALID_CHANNEL_IDENTIFIER        6
#define XC3028_RESULT_NO_CHANNELMAP_SPECIFIED           7

/* *********************************************************************** */
/* Type Declarations                                                       */
/* *********************************************************************** */

/*
   This represents an I2C firmware file encoded as a string of unsigned char.
   Format is as follows:

   char[0  ]=len0_MSB  -> len = len_MSB * 256 + len_LSB
   char[1  ]=len0_LSB  -> length of first write transaction
   char[2  ]=data0 -> first byte to be sent
   char[3  ]=data1
   char[4  ]=data2
   char[   ]=...
   char[M  ]=dataN  -> last byte to be sent
   char[M+1]=len1_MSB  -> len = len_MSB * 256 + len_LSB
   char[M+2]=len1_LSB  -> length of second write transaction
   char[M+3]=data0
   char[M+4]=data1
   ...
   etc.

   The [len] value should be interpreted as follows:

   len= len_MSB _ len_LSB
   len=1111_1111_1111_1111   : End of I2C_SEQUENCE
   len=0000_0000_0000_0000   : Reset command: Do hardware reset
   len=0NNN_NNNN_NNNN_NNNN   : Normal transaction: number of bytes = {1:32767)
   len=1WWW_WWWW_WWWW_WWWW   : Wait command: wait for {1:32767} ms

   For the RESET and WAIT commands, the two following bytes will contain
   immediately the length of the following transaction.

*/


typedef struct {
    unsigned char *sequence;
} XC3028_I2C_SEQUENCE; 

typedef unsigned char XC3028_SCODE_TABLE[16][12];

typedef struct {
    char              identifier[4];
    unsigned int      frequency;
    unsigned char     dcode;
} XC3028_CHANNEL;

typedef struct {
    int               nb_channels;
    XC3028_CHANNEL    *channels;
} XC3028_CHANNEL_MAP;

typedef struct {
    XC3028_I2C_SEQUENCE    *base_firmware_ptr;
    XC3028_I2C_SEQUENCE    *std_firmware_ptr;
    XC3028_SCODE_TABLE     *scode_table_ptr;
} XC3028_TV_MODE;

typedef struct _XC3028_Current_Modes
{
	XC3028_TV_MODE      XC3028_current_tv_mode;
	XC3028_CHANNEL_MAP *XC3028_current_channel_map_ptr;
	XC3028_CHANNEL      XC3028_current_channel;
}XC3028_Current_Modes;

/* *********************************************************************** */
/* Dummy functions to be implemented by customer                           */
/* *********************************************************************** */

// Sends data bytes to xc3028 via I2C starting with
// bytes_to_send[0] and ending with bytes_to_send[nb_bytes_to_send-1]
// Returns one of the XCEIVE_XC3028_RESULT result codes listed above
int i2c_send_to_xc3028(unsigned char *bytes_to_send, int nb_bytes_to_send);
// Reads data bytes from xc3028 via I2C starting with
// bytes_received[0] and ending with bytes_received[nb_bytes_to_receive-1]
// Returns one of the XCEIVE_XC3028_RESULT result codes listed above
int i2c_receive_from_xc3028(unsigned char *bytes_received, int nb_bytes_to_receive);
// Does hardware reset
// Returns one of the XCEIVE_XC3028_RESULT result codes listed above
int reset_xc3028();
// Waits for wait_ms milliseconds
// Returns one of the XCEIVE_XC3028_RESULT result codes listed above
int wait_xc3028(int wait_ms);

/* *********************************************************************** */
/* Functions implemented in xc3028_init.c file                             */
/* All return one of the XCEIVE_XC3028_RESULT result codes as listed above */
/* *********************************************************************** */

// Initialize device according to supplied tv mode.
// Supplied channel map will be used for future calls to xc3028_set_channel.
int xc3028_initialize(XC3028_TV_MODE* new_tv_mode_ptr, XC3028_CHANNEL_MAP* new_channel_map_ptr);

// Switch to new RF channel.
// Set channel.frequency=0 to enable lookup of frequency+dcode using channel.identifier
// Set channel.dcode to 0xFF to enable dcode lookup from channel map, otherwise
// provided value is used instead.
int xc3028_set_channel(XC3028_CHANNEL new_channel);

int xc3028_set_frequency(long frequency_in_hz);

// Power-down device.
// To restart, call xc3028_initialize().
int xc3028_shutdown();

// Get current frequency error.
int xc3028_get_frequency_error(long *frequency_error_hz);

// Get lock status.
int xc3028_get_lock_status(unsigned short int *lock_status);

// Get device version information.
int xc3028_get_version( unsigned char* hw_majorversion,unsigned char* hw_minorversion,
                        unsigned char* fw_majorversion, unsigned char* fw_minorversion);

// Get device product ID.
int xc3028_get_product_id(unsigned short int *product_id);

// Get horizontal sync frequency.
int xc3028_get_hsync_freq(long *hsync_freq_hz);

// Get number of lines per frame.
int xc3028_get_frame_lines(unsigned short int *frame_lines);

// Get quality estimate.
int xc3028_get_quality(unsigned short int *quality);

// Do full scan for channels
int xc3028_full_scan(unsigned int freq_min, unsigned int freq_max, int freq_list_size, unsigned int *freq_list, int *nb_freq_found);

#endif