📄 user_if.c
字号:
/* This is a program of QAM NIM for Samsung tuner
IF you have any questions or comments, feel free send
a mail to : papilon@samsung.co.kr
Thanx a lot!
*/
/* include files */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#include <dos.h>
#include "qam3118.h"
#include "host_api.h"
#define TRUE 1
#define FALSE 0
/* misc compiler constants */
#define STATUS_XPOS 50
#define STATUS_YPOS 8
#define REVERSE_VIDEO textcolor(BLUE); textbackground(WHITE)
#define NORMAL_VIDEO textcolor(WHITE); textbackground(BLUE)
#define SW_TITLE " BCM93180 QAMLink Controller"
#define VERSION "2.04"
#define TOGGLE_RST 0x01 /* Printer Port Bit 0 Output */
//#define NTSC 0 // 1: NTSC 0 : PAL
/* global variables */
qamstatus_t qam_status;
int glb_slave_addr = SLAVE_ADDR; //
int glb_port_data = 0x0378;
int glb_port_status = 0x0379;
int glb_port_control = 0x037A;
int glb_stosc1=0,glb_stosc2=0;
int access;
float Symbol_Rate = 6.925;// China spec.
float Down_Xtal = 38.000;
int T_AGC = 110; //default starting number
int Level;
int Select_QAM = 3;//default 64QAM
int gap = 0;
int NTSC = 0; // 0: PAL, 1: NTSC
int sori = 0;
int Normal = 0;//0: Inverse spectrum 1:normal spectrum
/* error states */
static char *errno_status[] = {
"NO ERROR ",
"I2C_NOACK ", /* Acknowledge not seen on I2C transfer */
"I2C_BAD_PROTO", /* Protocol violation on I2C bus */
"SCR_ERROR ", /* error in executing script file */
" ",
};
/* function prototypes */
int qam_lookup(char *keyword);
char *file_choose(char *type, char *extension, char *prompt);
int my_get_char(void);
int set_op_mode(void);
enum ShellCmdType parse(char *bufp, int *nargs, char **arg);
int eval_acq_script(char *fname, int npasses, int wait_time);
int show_menu(char *menu[]);
void show_status(int refresh);
int compute_pll_div(float fval, int *pll1_div, int *pll2_div);
void dump_bcm3118(void);
void Init_FEC();
void Init_Config();
void Acquire_Baud_Timing();
void Constellation_4_Refinement();
void Constellation_16_Refinement();
void Constellation_64_Refinement();
void Constellation_32_Refinement();
void Constellation_128_Refinement();
void Constellation_256_Refinement();
int run_command_file(FILE *fp);
void Set_QAM();
void Set_Symbol();
void Set_Freq();
void Dis_Show();
void QAM_Init();
void Adapt_AGC_2();
void My_Acquisition(void);
void Check_Spectrum_Inverse();
void Check_Lock();
/* keyword for shell commands */
enum ShellCmdType {
SHELL_NOOP=0 ,
SHELL_QAM_READ ,
SHELL_QAM_WRITE,
SHELL_HELP ,
SHELL_EXIT ,
SHELL_PROMPT ,
SHELL_QAM_INIT ,
SHELL_PING ,
SHELL_SET ,
SHELL_TUNE ,
SHELL_UNKNOWN
};
static struct {
enum ShellCmdType keyval;
char *keyword;
} ShellKeyword[] = {
SHELL_QAM_READ , "qam_read" ,
SHELL_QAM_WRITE, "qam_write" ,
SHELL_HELP , "help" ,
SHELL_EXIT , "exit" ,
SHELL_PROMPT , "prompt" ,
SHELL_QAM_INIT , "qam_init" ,
SHELL_PING , "ping" ,
SHELL_SET , "set" ,
SHELL_TUNE , "tune" ,
SHELL_UNKNOWN , (char *) 0
};
/* menu prompts */
static char *main_menu[] = {
"Reacquire QAM Channel ", /* F1 */
"Execute Command File ", /* F2 */
"Select Acq Script ", /* F3 */
"Set Symbol Rate ", /* F4 */
"Tune to Frequency ", /* F5 */
"Monitor BCM3118 State ", /* F6 */
"Monitor Equalizer ", /* F7 */
"Monitor Constellation ", /* F8 */
"On-Line Help ", /* F9 */
"Exit ", /* F10 */
(char *) 0
};
/* C6M Channel-to-Frequency Mapping */
/* ADD : allow for user defined frequency mappings */
#define MAX_CHANNEL 94
static float paldk_freq_map[] = {
55.2625 ,
61.2625 ,
67.2625 ,
73.2625 ,
83.2625 ,
79.2625 ,
85.2625 ,
91.2625 ,
97.2625 ,
103.2625 ,
109.2625 ,
115.2625 ,
121.2625 ,
127.2625 ,
133.2625 ,
139.2625 ,
145.2625 ,
151.2625 ,
157.2625 ,
163.2625 ,
169.2625 ,
175.2625 ,
181.2625 ,
187.2625 ,
193.2625 ,
199.2625 ,
205.2625 ,
211.2625 ,
217.2625 ,
223.2625 ,
229.2625 ,
235.2625 ,
241.2625 ,
247.2625 ,
253.2625 ,
259.2625 ,
265.2625 ,
271.2625 ,
277.2625 ,
283.2625 ,
289.2625 ,
295.2625 ,
301.2625 ,
307.2625 ,
313.2625 ,
319.2625 ,
325.2625 ,
331.2625 ,
337.2625 ,
343.2625 ,
349.2625 ,
355.2625 ,
361.2625 ,
367.2625 ,
373.2625 ,
379.2625 ,
385.2625 ,
391.2625 ,
397.2625 ,
403.2625 ,
409.2625 ,
415.2625 ,
421.2625 ,
427.2625 ,
433.2625 ,
439.2625 ,
445.2625 ,
451.2625 ,
457.2625 ,
463.2625 ,
469.2625 ,
475.2625 ,
481.2625 ,
487.2625 ,
493.2625 ,
499.2625 ,
505.2625 ,
511.2625 ,
517.2625 ,
523.2625 ,
529.2625 ,
535.2625 ,
541.2625 ,
547.2625 ,
553.2625 ,
559.2625 ,
565.2625 ,
571.2625 ,
577.2625 ,
583.2625 ,
589.2625 ,
595.2625
};
static float c6m_freq_map[] = {
55.2625 ,
61.2625 ,
67.2625 ,
73.2625 ,
83.2625 ,
79.2625 ,
85.2625 ,
91.2625 ,
97.2625 ,
103.2625 ,
109.2625 ,
115.2625 ,
121.2625 ,
127.2625 ,
133.2625 ,
139.2625 ,
145.2625 ,
151.2625 ,
157.2625 ,
163.2625 ,
169.2625 ,
175.2625 ,
181.2625 ,
187.2625 ,
193.2625 ,
199.2625 ,
205.2625 ,
211.2625 ,
217.2625 ,
223.2625 ,
229.2625 ,
235.2625 ,
241.2625 ,
247.2625 ,
253.2625 ,
259.2625 ,
265.2625 ,
271.2625 ,
277.2625 ,
283.2625 ,
289.2625 ,
295.2625 ,
301.2625 ,
307.2625 ,
313.2625 ,
319.2625 ,
325.2625 ,
331.2625 ,
337.2625 ,
343.2625 ,
349.2625 ,
355.2625 ,
361.2625 ,
367.2625 ,
373.2625 ,
379.2625 ,
385.2625 ,
391.2625 ,
397.2625 ,
403.2625 ,
409.2625 ,
415.2625 ,
421.2625 ,
427.2625 ,
433.2625 ,
439.2625 ,
445.2625 ,
451.2625 ,
457.2625 ,
463.2625 ,
469.2625 ,
475.2625 ,
481.2625 ,
487.2625 ,
493.2625 ,
499.2625 ,
505.2625 ,
511.2625 ,
517.2625 ,
523.2625 ,
529.2625 ,
535.2625 ,
541.2625 ,
547.2625 ,
553.2625 ,
559.2625 ,
565.2625 ,
571.2625 ,
577.2625 ,
583.2625 ,
589.2625 ,
595.2625
};
/* keywords for activating action from shell */
static struct {
int keyval;
char *keyword;
int r_w; /* Bit2=1 for MB, Bit1=1 for write reg, Bit0=1 for read reg */
} qam_keyword[] = {
/* Single Byte Registers */
SB_IRQCTL , "irqctl", 3,
SB_RSTCTL , "rstctl", 3,
SB_FRZCTL , "frzctl", 3,
SB_QAMCTL , "qamctl", 3,
SB_LMSCTL , "lmsctl", 3,
SB_RTCCTL , "rtcctl", 3,
SB_BYPCTL , "bypctl", 3,
SB_FMTCTL , "fmtctl", 3,
SB_FFECTL , "ffectl", 3,
SB_DSSCTL , "dssctl", 3,
SB_STOSCM , "stoscm", 2,
SB_RSTCTR , "rstctr", 3,
SB_FRZCTL2, "frzctl2", 3,
SB_RSVD2 , "rsvd2" , 3,
SB_MASCTL , "masctl", 3,
SB_TUNCTL , "tunctl", 3,
SB_EQLCTL , "eqlctl", 3,
SB_RSCR0 , "rscr0", 1,
SB_RSCR1 , "rscr1", 1,
SB_RSCR2 , "rscr2", 1,
SB_SYNCR2 , "syncr2", 3,
SB_LRESWR , "lreswr", 3,
SB_LRESST , "lresst", 3,
SB_LRESPO , "lrespo", 3,
SB_LRESPA , "lrespa", 3,
SB_SYNCR3 , "syncr3", 3,
SB_HRMEVA , "hrmeva", 3,
SB_SYNCR4 , "syncr4", 3,
SB_SYNTST , "syntst", 3,
SB_HRMCOU , "hrmcou", 3,
SB_HRMDIS , "hrmdis", 3,
SB_HRMPRBS, "hrmprbs", 3,
SB_HRMPAT , "hrmpat", 3,
SB_HRMSEE , "hrmsee", 3,
SB_SYNCR5 , "syncr5", 3,
SB_SYNCR6 , "syncr6", 3,
SB_BINVSYN, "binvsyn", 3,
SB_INVSYT , "invsyt", 3,
SB_LSSYCT , "lssyct", 3,
SB_SYNSTA , "synsta", 1,
SB_TUNSET , "tunset", 3,
SB_CLKSET , "clkset", 3,
SB_TUNSEL0, "tunsel0", 2,
SB_TUNSEL1, "tunsel1", 2,
/* multi-byte op codes */
MB_STF0 , "stf0", 6,
MB_STF1 , "stf1", 6,
MB_STF2 , "stf2", 6,
MB_STF3 , "stf3", 6,
MB_STF4 , "stf4", 6,
MB_STF5 , "stf5", 6,
MB_STF6 , "stf6", 6,
MB_STF7 , "stf7", 6,
MB_STD0 , "std0", 6,
MB_STD1 , "std1", 6,
MB_STD2 , "std2", 6,
MB_STD3 , "std3", 6,
MB_STD4 , "std4", 6,
MB_STD5 , "std5", 6,
MB_STD6 , "std6", 6,
MB_STD7 , "std7", 6,
MB_STD8 , "std8", 6,
MB_STD9 , "std9", 6,
MB_STD10 , "std10", 6,
MB_STD11 , "std11", 6,
MB_STSNRT , "stsnrt", 6,
MB_STSNRE , "stsnre", 6,
MB_STSNRC , "stsnrc", 6,
MB_STATHR , "stathr", 6,
MB_STABW , "stabw", 6,
MB_STAI , "stai", 6,
MB_STIF , "stif", 6,
MB_STBBI , "stbbi", 6,
MB_STBBQ , "stbbq", 6,
MB_STBRLC , "stbrlc", 6,
MB_STBRIC , "stbric", 6,
MB_STBRI , "stbri", 6,
MB_STBFOS , "stbfos", 6,
MB_STBEN , "stben", 6,
MB_STBRDL , "stbrdl", 6,
MB_STDRLC , "stdrlc", 6,
MB_STDRIC , "stdric", 6,
MB_STDRI , "stdri", 6,
MB_STDRSP , "stdrsp", 6,
MB_STDRPA , "stdrpa", 6,
MB_STDRRB , "stdrrb", 6,
MB_STDRFD , "stdrfd", 6,
MB_STGDSI , "stgdsi", 6,
MB_STOSC1 , "stosc1", 6,
MB_STOSC2 , "stosc2", 6,
MB_STLPST , "stlpst", 6,
MB_LDF0 , "ldf0", 5,
MB_LDF1 , "ldf1", 5,
MB_LDF2 , "ldf2", 5,
MB_LDF3 , "ldf3", 5,
MB_LDF4 , "ldf4", 5,
MB_LDF5 , "ldf5", 5,
MB_LDF6 , "ldf6", 5,
MB_LDF7 , "ldf7", 5,
MB_LDD0 , "ldd0", 5,
MB_LDD1 , "ldd1", 5,
MB_LDD2 , "ldd2", 5,
MB_LDD3 , "ldd3", 5,
MB_LDD4 , "ldd4", 5,
MB_LDD5 , "ldd5", 5,
MB_LDD6 , "ldd6", 5,
MB_LDD7 , "ldd7", 5,
MB_LDD8 , "ldd8", 5,
MB_LDD9 , "ldd9", 5,
MB_LDD10 , "ldd10", 5,
MB_LDD11 , "ldd11", 5,
MB_LDSFT , "ldsft", 5,
MB_LDSNRE , "ldsnre", 5,
MB_LDALI , "ldali", 5,
MB_LDAI , "ldai", 5,
MB_LDIF , "ldif", 5,
MB_LDBBI , "ldbbi", 5,
MB_LDBBQ , "ldbbq", 5,
MB_LDADS , "ldads", 5,
MB_LDBRFO , "ldbrfo", 5,
MB_LDBRI , "ldbri", 5,
MB_LDBNCO , "ldbnco", 5,
MB_LDBRDS , "ldbrds", 5,
MB_LDDRFO , "lddrfo", 5,
MB_LDDRI , "lddri", 5,
MB_LDDRPA , "lddrpa", 5,
MB_LDGDS , "ldgds", 5,
MB_LDID , "ldid", 5,
0 , (char *) 0
};
void Tuner_AGC(int value)
{
char eight_1,eight_2;
int ival,qval;
//scanf("%d",&value);
if( value <20)
{
value = 20;
T_AGC = 20;
}
eight_2 = (char)(value - 128);//2's compliment
ival = ((eight_2 & 0xff)<<8 );
qam_write(MB_W,MB_STGDSI,ival,0x0000);
}
int qam_lookup(char *keyword)
{
int i;
/* convert keyword to lowercase */
for (i=0; keyword[i] != '\0'; i++) keyword[i] = tolower(keyword[i]);
/* lookup keyword and return the keyval */
for (i=0; qam_keyword[i].keyword != (char *) 0; i++) {
if (strcmp(qam_keyword[i].keyword,keyword) == 0) {
access = qam_keyword[i].r_w;
return qam_keyword[i].keyval;
}
}
return QAM_UNKNOWN;
}
char *file_choose(char *type, char *extension, char *prompt)
{
char buf[132];
char files[64][10],source_path[80],*cp;
static char name[32];
int i,j,c,n=0,sel=0,x,y,lastx,lasty;
int nrows,ncols,cur_row,cur_col,dirstat;
FILE *fp;
struct find_t source_files;
/* obtain list of available script files */
sprintf(source_path,"%s\\*%s",type,extension);
dirstat = _dos_findfirst(source_path,_A_NORMAL,&source_files);
while (!dirstat) {
for (cp=source_files.name; *cp != '.' && *cp != '\0'; cp++) ;
if (*cp == '.') *cp = '\0';
strncpy(files[n++],source_files.name,10);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -