📄 video_adv7181b.c
字号:
/**************************************************************程序说明 :ADV7181B视频解码设置和控制实验 FreeDev Digital Application Board采用了ADI公司的 ADV7181B视频解码芯片。 1、控制接口使用I2C,40H--write,41H---read。 2、I2C IP Quartus 工程目录中**************************************/#include <stdio.h>#include <system.h>#include <io.h>#include <alt_types.h>#define CVBS_AIN6 0#define S_VIDEO_AIN2_AIN4 1#define PAL_AIN6 2/*********************************************函数名:I2c_write_ADV7181B功 能:I2C写视频芯片ADV7181B控制寄存器输 入:设备地址,寄存器地址,数据返 回: -1 写器件地址错误 -2 写寄存器地址错误 -3 写数据错误 0 成功备 注:通过I2C控制总线写ADV7181B控制寄存器 使用了I2C库的相关函数。**********************************************/int I2C_write_ADV7181B(alt_u8 slaveAddr,alt_u8 sub_address,alt_u8 data){ alt_u8 uc; int iRet; uc=slaveAddr & 0xfe; iRet=start_write_waitack(uc); if(iRet<0) return -1; //write sub address iRet=write_waitack(sub_address); if(iRet<0) return -2; //write data iRet=write_waitack_stop(data); if(iRet<0) return -3; return 0; } /*********************************************函数名:I2c_read_ADV7181B功 能:I2C写视频芯片ADV7181B控制寄存器输 入:设备地址,字节地址,读数据指针返 回: -1 写器件地址错误 -2 写寄存器地址错误 -3 写数据错误 0 成功备 注:通过I2C控制总线写ADV7181B控制寄存器 使用了I2C库的相关函数。**********************************************/int I2C_read_ADV7181B(alt_u8 slaveAddr,alt_u8 sub_address,alt_u8 *pData){ alt_u8 uc; int iRet; //start uc=slaveAddr &0xfe; iRet=start_write_waitack(uc); if(iRet<0) return -1; //write sub address iRet=write_waitack(sub_address); if(iRet<0) return -2; //restart uc=slaveAddr | 0x01; iRet=start_read_waitack(uc); if(iRet<0) return -3; // read data and stop iRet=read_sendack_stop(pData); if(iRet<0) return -4; return 0;}/*********************************************函数名:show_ADV7181B_reg功 能:显示参数地址指定的ADV7181B控制寄存器值输 入:设返 回: 备 注:**********************************************/int show_ADV7181B_reg(unsigned char add){ int iRet; unsigned char ch,i; iRet=I2C_read_ADV7181B(0x41,add,&ch); if(iRet<0){ printf(" I2C_read_ADV7181B reg[%2x] error=[%d]\n",i,iRet); return -(i); } printf(" ADV7181B视频芯片寄存器[%2x]=[%2x]\n",add,ch); printf(" 适应国情\n"); return 0; }/*********************************************函数名:init_ADV7181B功 能:初始化视频芯片ADV7181B控制寄存器输 入:设返 回: 备 注:**********************************************/int init_ADV7181B(int format){ int iRet; unsigned char ch,i,j; int count; printf(" 初始化ADV7181B视频芯片寄存器...\n"); printf(" ADV7181B 复位...\n"); iRet=I2C_write_ADV7181B(0x40,0x0f,0x80); count = 0; while (count<200000) count++; printf(" ADV7181B复位OK\n"); if(format==CVBS_AIN6)//CVBS ANI6 { // Digital Clamp Control1 iRet=I2C_write_ADV7181B(0x40,0x15,0x00); if(iRet<0) return -1; // Shaping Filter Control iRet=I2C_write_ADV7181B(0x40,0x17,0x41); if(iRet<0) return -1; // Power down ADC1 ADC2 iRet=I2C_write_ADV7181B(0x40,0x3a,0x16); if(iRet<00) return -1; // CTI DNR Control4 iRet=I2C_write_ADV7181B(0x40,0x50,0x04); if(iRet<0) return -1; // ADC SWITCH1 select AIN6 iRet=I2C_write_ADV7181B(0x40,0xc3,0x05); if(iRet<0) return -1; // ADC SWITCH2 ADC_SW_MAN_EN iRet=I2C_write_ADV7181B(0x40,0xc4,0x80); if(iRet<0) return -1; // ADI Control 默认值 iRet=I2C_write_ADV7181B(0x40,0x0e,0x80); if(iRet<0) return -1; // CCI DNR Control 4 iRet=I2C_write_ADV7181B(0x40,0x50,0x20); if(iRet<0) return -1; // SD Saturation Cr iRet=I2C_write_ADV7181B(0x40,0xe4,0x3e); if(iRet<0) return -1; // PAL F Bit Toggle iRet=I2C_write_ADV7181B(0x40,0xea,0x0f); if(iRet<0) return -1; // Vsync Field Control 1 iRet=I2C_write_ADV7181B(0x40,0x31,0x12); if(iRet<0) return -1; // Vsync Field Control 2 iRet=I2C_write_ADV7181B(0x40,0x32,0x81); if(iRet<0) return -1; // Vsync Field Control 3 iRet=I2C_write_ADV7181B(0x40,0x33,0x84); if(iRet<0) return -1; // Polarity iRet=I2C_write_ADV7181B(0x40,0x37,0xA0); if(iRet<0) return -1; // NTSC V bit Begin iRet=I2C_write_ADV7181B(0x40,0xe5,0x80); if(iRet<0) return -1; // NTSC V bit End iRet=I2C_write_ADV7181B(0x40,0xe6,0x03); if(iRet<0) return -1; // NTSC F Bit Toggle iRet=I2C_write_ADV7181B(0x40,0xe7,0x85); if(iRet<0) return -1; // CTI DNR Ctrl 4 iRet=I2C_write_ADV7181B(0x40,0x50,0x00); if(iRet<0) return -1; // Lock Count iRet=I2C_write_ADV7181B(0x40,0x51,0x00); if(iRet<0) return -1; // 0x50 修改成 0x00 cvbs 自动检测所有制式 iRet=I2C_write_ADV7181B(0x40,0x00,0x00); if(iRet<0) return -1; // Extended Output Control iRet=I2C_write_ADV7181B(0x40,0x04,0x02); if(iRet<0) return -1; // Contrast Register iRet=I2C_write_ADV7181B(0x40,0x08,0x60); if(iRet<0) return -1; // Brightness Register iRet=I2C_write_ADV7181B(0x40,0x0a,0x18); if(iRet<0) return -1; // ADI Control iRet=I2C_write_ADV7181B(0x40,0x0e,0x05); if(iRet<0) return -1; }else if (format== S_VIDEO_AIN2_AIN4){ // S_VIDEO_AIN2_AIN4 // 0x06 0000 自动检测所有制式 0110 S_VIDEO iRet=I2C_write_ADV7181B(0x40,0x00,0x06); if(iRet<0) return -1; // ADC0--AIN2 ADC1--AIN4 iRet=I2C_write_ADV7181B(0x40,0xc3,0x41); if(iRet<0) return -1; // ADC_SW_MAN_EN 1 ,ADC2 NOT CONNECT iRet=I2C_write_ADV7181B(0x40,0xc4,0x80); if(iRet<0) return -1; // Power down ADC1 ADC2 iRet=I2C_write_ADV7181B(0x40,0x3a,0x12); if(iRet<0) return -1; // Digital Clamp Control1 iRet=I2C_write_ADV7181B(0x40,0x15,0x00); if(iRet<0) return -1; // Shaping Filter Control iRet=I2C_write_ADV7181B(0x40,0x17,0x41); if(iRet<0) return -1; // CTI DNR Control4 iRet=I2C_write_ADV7181B(0x40,0x50,0x04); if(iRet<0) return -1; // ADI Control 默认值 iRet=I2C_write_ADV7181B(0x40,0x0e,0x80); if(iRet<0) return -1; // CCI DNR Control 4 iRet=I2C_write_ADV7181B(0x40,0x50,0x20); if(iRet<0) return -1; // SD Saturation Cr iRet=I2C_write_ADV7181B(0x40,0xe4,0x3e); if(iRet<0) return -1; // PAL F Bit Toggle iRet=I2C_write_ADV7181B(0x40,0xea,0x0f); if(iRet<0) return -1; // Vsync Field Control 1 iRet=I2C_write_ADV7181B(0x40,0x31,0x12); if(iRet<0) return -1; // Vsync Field Control 2 iRet=I2C_write_ADV7181B(0x40,0x32,0x81); if(iRet<0) return -1; // Vsync Field Control 3 iRet=I2C_write_ADV7181B(0x40,0x33,0x84); if(iRet<0) return -1; // Polarity iRet=I2C_write_ADV7181B(0x40,0x37,0xA0); if(iRet<0) return -1; // NTSC V bit Begin iRet=I2C_write_ADV7181B(0x40,0xe5,0x80); if(iRet<0) return -1; // NTSC V bit End iRet=I2C_write_ADV7181B(0x40,0xe6,0x03); if(iRet<0) return -1; // NTSC F Bit Toggle iRet=I2C_write_ADV7181B(0x40,0xe7,0x85); if(iRet<0) return -1; // CTI DNR Ctrl 4 iRet=I2C_write_ADV7181B(0x40,0x50,0x00); if(iRet<0) return -1; // Lock Count iRet=I2C_write_ADV7181B(0x40,0x51,0x00); if(iRet<0) return -1; // Extended Output Control iRet=I2C_write_ADV7181B(0x40,0x04,0x02); if(iRet<0) return -1; // Contrast Register iRet=I2C_write_ADV7181B(0x40,0x08,0x60); if(iRet<0) return -1; // Brightness Register iRet=I2C_write_ADV7181B(0x40,0x0a,0x18); if(iRet<0) return -1; // ADI Control iRet=I2C_write_ADV7181B(0x40,0x0e,0x05); if(iRet<0) return -1; } else if (format== PAL_AIN6){ // PAL_AIN6 // 0x06 0000 自动检测所有制式 0110 S_VIDEO iRet=I2C_write_ADV7181B(0x40,0x00,0x80); if(iRet<0) return -1; // ADC0--AIN2 ADC1--AIN4 iRet=I2C_write_ADV7181B(0x40,0x07,0x01); if(iRet<0) return -1; iRet=I2C_write_ADV7181B(0x40,0x10,0x01);//+ if(iRet<0) return -1; // ADC_SW_MAN_EN 1 ,ADC2 NOT CONNECT iRet=I2C_write_ADV7181B(0x40,0x15,0x00); if(iRet<0) return -1; // Power down ADC1 ADC2 iRet=I2C_write_ADV7181B(0x40,0x17,0x41); if(iRet<0) return -1; // Digital Clamp Control1 iRet=I2C_write_ADV7181B(0x40,0x19,0xFA); if(iRet<0) return -1; // Polarity iRet=I2C_write_ADV7181B(0x40,0x37,0xA0); if(iRet<0) return -1; // ADI Control 默认值 iRet=I2C_write_ADV7181B(0x40,0x3A,0x16); if(iRet<0) return -1; // PAL F Bit Toggle iRet=I2C_write_ADV7181B(0x40,0x50,0x0A); if(iRet<0) return -1; // Vsync Field Control 1 iRet=I2C_write_ADV7181B(0x40,0xC3,0x05); if(iRet<0) return -1; // Vsync Field Control 2 iRet=I2C_write_ADV7181B(0x40,0xC4,0x80); if(iRet<0) return -1; // Vsync Field Control 3 iRet=I2C_write_ADV7181B(0x40,0x0E,0x80); if(iRet<0) return -1; // Polarity iRet=I2C_write_ADV7181B(0x40,0x50,0x20); if(iRet<0) return -1; // NTSC V bit Begin iRet=I2C_write_ADV7181B(0x40,0x52,0x18); if(iRet<0) return -1; // NTSC V bit End iRet=I2C_write_ADV7181B(0x40,0x58,0xED); if(iRet<0) return -1; // NTSC F Bit Toggle iRet=I2C_write_ADV7181B(0x40,0x77,0xC5); if(iRet<0) return -1; // CTI DNR Ctrl 4 iRet=I2C_write_ADV7181B(0x40,0x7C,0x93); if(iRet<0) return -1; // Lock Count iRet=I2C_write_ADV7181B(0x40,0x7D,0x00); if(iRet<0) return -1; // Extended Output Control iRet=I2C_write_ADV7181B(0x40,0xD0,0x48); if(iRet<0) return -1; // Contrast Register iRet=I2C_write_ADV7181B(0x40,0xD5,0xA0); if(iRet<0) return -1; // Brightness Register iRet=I2C_write_ADV7181B(0x40,0xD7,0xEA); if(iRet<0) return -1; // ADI Control iRet=I2C_write_ADV7181B(0x40,0xE4,0x3E); if(iRet<0) return -1; // Contrast Register iRet=I2C_write_ADV7181B(0x40,0xE9,0x3E); if(iRet<0) return -1; // Brightness Register iRet=I2C_write_ADV7181B(0x40,0xEA,0x0F); if(iRet<0) return -1; // ADI Control iRet=I2C_write_ADV7181B(0x40,0x0E,0x00); if(iRet<0) return -1; } return 0; }int main(){ int iRet,i,j; unsigned char ch; // 初始化视频I2C控制器 init_i2c(FREEDEV_I2C_0_BASE); // 复位音频处理芯片 aic23_reset(); // 设置为旁路状态 aic23_analog_bypass_test(); printf("视频芯片配置...\n"); // init_ADV7181B(CVBS_AIN6); //init_ADV7181B(S_VIDEO_AIN2_AIN4); // init_ADV7181B(CVBS_AIN6); init_ADV7181B(PAL_AIN6);//init_ADV7181B(PAL_AIN6); printf("视频芯片配置OK!!!\n"); printf("测试NIOS编译OK!!!\n"); /* //视频芯片状态 // ADV7181B revision show_ADV7181B_reg(0x11); // STATUS1 show_ADV7181B_reg(0x10); // STATUS2 show_ADV7181B_reg(0x12); // STATUS3 show_ADV7181B_reg(0x13); */ while(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -