#include #include #include #include #include #include //define O_WRONLY and O_RDONLY #include /* mux- */ #include /* -System V */ #include /* ioctl - BSD and Linux */ #include /* -XSI STREAMS */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../inc/config.h" #include "../inc/type.h" #include "../inc/igpio.h" #include "../inc/isys_config.h" #include "../inc/ispi.h" #include "../inc/delay.h" #include "../inc/ii2c.h" #include "../inc/lcd_task.h" #include "../inc/eeprom.h" #include "../inc/i2c_drv.h" #include "../inc/dac38j82.h" #include "../inc/dpd_proc.h" #include "../inc/uart_user.h" #include "../inc/isys_com.h" #include "../inc/tsoip.h" #include "../inc/adrv9009_ext.h" #include "../inc/fpga.h" #if USE_TUNER_18273 #include "../tuner/tuner_conf.h" #elif USE_TUNER_88436 #include "../tuner/tuner_conf.h" #include "../mn88436/include/MN_DMD_driver.h" #endif //PR04: Sony CXD2878(FREIA) tuner driver ported from EMV9.3 #include "../sonytuner/sony_cxd6801gl.h" #if 1 //extern S_CTTB_PARA cttb_para; extern S_IP2TS_PARA ip2ts[2]; // 20220214 add by oneshu extern char release_ver[30]; extern pthread_mutex_t mux_i2c_tuner; extern void inset_tsoip_instance(TSOIP_INSTANCE *p_tsoip_instance, S_TSOIP_CONFIG_PARA *p_tsoip_cfg_param); extern void ts_load_default_para(int tsoip_index, S_TSOIP_CONFIG_PARA *p_tsoip_config_param); extern void reset_dpd_to_normal_state(void); extern pthread_mutex_t mux_dpd_wr_ck; extern TS_NET_STRUCT ts_net_para; extern pthread_mutex_t mtx_phase78910_again; #endif #if ___spi_dev__ //------------------------------------- #define FPGA_SPI_NODE "/dev/spidev0.0" //------------------------------------- static int fpga_spi_fd = -1; //------------------------------------- static void spi_fpga_gpio_init(void) { log_printf(LOG_INFO, I_SYS_STATUS, "init spi gpio export\n"); set_gpio_export(SPI1_MISO_GP_NUM); log_printf(LOG_INFO, I_SYS_STATUS, "over. init spi gpio export\n"); log_printf(LOG_INFO, I_SYS_STATUS, "init spi gpio output\n"); set_gpio_io_direct(SPI1_MISO_GP_NUM,E_IO_IN); log_printf(LOG_INFO, I_SYS_STATUS, "over. init spi gpio output\n"); } uint8 GET_FPGA_SPI_MISO(void) { //#define GET_FPGA_SPI_MISO() GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) uint8 u8val; int ret; ret = get_gpio_value(SPI1_MISO_GP_NUM, &u8val); //ret = get_goio_value_by_shell(SPI1_MISO_GP_NUM, &u8val); return u8val; } void ad9528_reset_gpio(void) { set_gpio_export(AD9528_RESET_GPIO_NUM); set_gpio_io_direct(AD9528_RESET_GPIO_NUM, E_IO_OUT); set_gpio_value(AD9528_RESET_GPIO_NUM, E_IO_H); } void spi_fpga_init(void) { unsigned char mode = SPI_MODE_3 ; unsigned char bits = 8; unsigned int speed = 100000; init_spi_dev(FPGA_SPI_NODE, &fpga_spi_fd, mode, bits, speed); spi_fpga_gpio_init(); } /***************************************************************************** * Function : ispi_fpga_send_buf_4Byte * Description : wr 4byte data * Input : uint8 *puc * Output : None * Return : * Others : * Record * 1.Date : 20220211 * Author : Shu.Wang * Modification: Created function *****************************************************************************/ void ispi_fpga_send_buf_4Byte(uint8 *puc) { int ret = iSPI_I2S_Send4Byte(fpga_spi_fd, puc); if( ret < 0) printf("iSPI_I2S_Send4Byte err\n"); } void ispi_tx_big_block(uint8 *pdata, int bytelen) { int offset = 0; int ret = 0; int txlen = bytelen; while(1) { if((offset+SPI_BUFF_MAX)< txlen) { ret = spi_transfer_big_block(fpga_spi_fd, pdata+offset, SPI_BUFF_MAX); if(ret < 0){ printf(" spi transfer big block err\n"); } txlen -= SPI_BUFF_MAX; offset += SPI_BUFF_MAX; } else { ret = spi_transfer_big_block(fpga_spi_fd, pdata+offset, txlen); if(ret < 0){ printf(" Err. spi transfer big block err!\n"); } txlen = 0; break; } } } void ispi_rx_big_block(uint8 *pdata, int bytelen) { int ret = 0; int rxlen = bytelen; ret = spi_receiver_big_block(fpga_spi_fd, pdata, rxlen); if(ret < 0){ printf(" Err. spi transfer big block err!\n"); } } #endif//___spi_dev__ void TXEN_SET(int en) { if(en) fpga_byte_write(JESD_SEG_ADDR, JESD204B_RESET_STATUS_OFFSET_ADDR, 0x011); // set txen else fpga_byte_write(JESD_SEG_ADDR, JESD204B_RESET_STATUS_OFFSET_ADDR, 0x001); // clear txen } void jesd_reset_by_fpga(void) { fpga_i2c_sim_spi_write(0x004, 0x01); } void cfg_jesd204b(void) { uint32 u32data = 0; uint8 u8data = 0; /* rst jesd_axi jesd_phy jesd_phy_tx_gt jesd_tx , en 38j82_exen */ SET_BIT(u8data, 3); SET_BIT(u8data, 2); SET_BIT(u8data, 1); CLR_BIT(u8data, 0); fpga_byte_write(JESD_SEG_ADDR, JESD204B_RESET_STATUS_OFFSET_ADDR, u8data); // 0x00E u8data = 0; CLR_BIT(u8data, 3); CLR_BIT(u8data, 2); CLR_BIT(u8data, 1); SET_BIT(u8data, 0); fpga_byte_write(JESD_SEG_ADDR, JESD204B_RESET_STATUS_OFFSET_ADDR, u8data); // 0x001 //TXEN_SET(0);// clear . remove this line case hw pin has disconnect by lujingkan @20220120 fpga_i2c_sim_spi_write(0x004, 0x01); // jesd reset_by fpga log_printf(LOG_DEBUG,I_NOUSED,"jesd204b reset (0 jesd_axi, 1 jesd_phy, 2 jesd_phy_tx_gt, 3 jesd_tx )Done\n"); fpga_i2c_sim_spi_write(0x02c, 0x02); // suuclass 0x01-->0x02 0x00 0x02 fpga_i2c_sim_spi_write(0x810, 0x000f0f01); // 0x000f0d03 ---> 0x000f0f01 log_printf(LOG_DEBUG,I_NOUSED,"jesd204b init cfg Done\n"); #if 1 fpga_i2c_sim_spi_read(0x08,&u32data); log_printf(LOG_DEBUG,I_NOUSED,"read jesd204b 0x08 = 0x%x\n", u32data); fpga_i2c_sim_spi_read(0x0c,&u32data); log_printf(LOG_DEBUG,I_NOUSED,"read jesd204b 0x0c = 0x%x\n", u32data); fpga_i2c_sim_spi_read(0x10,&u32data); log_printf(LOG_DEBUG,I_NOUSED,"read jesd204b 0x10 = 0x%x\n", u32data); fpga_i2c_sim_spi_read(0x1C,&u32data); log_printf(LOG_DEBUG,I_NOUSED,"read jesd204b 0x1C = 0x%x\n", u32data); fpga_i2c_sim_spi_read(0x20,&u32data); log_printf(LOG_DEBUG,I_NOUSED,"read jesd204b 0x20 = 0x%x\n", u32data); fpga_i2c_sim_spi_read(0x24,&u32data); log_printf(LOG_DEBUG,I_NOUSED,"read jesd204b 0x24 = 0x%x\n", u32data); fpga_i2c_sim_spi_read(0x28,&u32data); log_printf(LOG_DEBUG,I_NOUSED,"read jesd204b 0x28 = 0x%x\n", u32data); fpga_i2c_sim_spi_read(0x2C,&u32data); log_printf(LOG_DEBUG,I_NOUSED,"read jesd204b 0x2C = 0x%x\n", u32data); fpga_i2c_sim_spi_read(0x38,&u32data); log_printf(LOG_DEBUG,I_NOUSED,"read jesd204b 0x38 = 0x%x\n", u32data); #endif } #if 0 void tuner_gpio_init(void) { set_gpio_export(TUNER_RST_GP_NUM); set_gpio_io_direct(TUNER_RST_GP_NUM,E_IO_OUT); log_printf(LOG_INFO, I_SYS_STATUS, "tuner_gpio_init finished.\n"); } #endif /***************************************************************************** * Function : hw_per_init * Description : init i2c /spi /gpio lcd /gpio key * Input : void * Output : None * Return : * Others : * Record * 1.Date : 20220117 * Author : Shu.Wang * Modification: Created function *****************************************************************************/ void hw_per_init(void) { gpio_mutex_init(); pthread_mutex_init(&mtx_phase78910_again, NULL); pthread_mutex_init(&mux_i2c_tuner, NULL); //tuner_gpio_init();//@DIF_UNUSED e_map_init(); // i2c init ii2c_hw_init(); // spi init spi_fpga_init(); // key init key_gpio_init(); // lcd init lcd_gpio_init(); lcd_gpio_init(); fpga_reset_gpio_init(); light_off(); lcd_init(); light_on(); } void local_ip_change_admin(S_CONFIG_PARA *ppara) { char cmd[100] = {0}; int ret = 0; // delete default route log_printf(LOG_INFO, I_SYS_STATUS, "del old default route\n"); ret = system("route del -net default eth0"); if(ret==127) { ret = system("route del -net default eth0"); log_printf(LOG_INFO, I_SYS_STATUS, "again, del old default route on eth0, ret=%d\n", ret); } memset(cmd, 0, sizeof(cmd)); sprintf(cmd, "ifconfig %s %d.%d.%d.%d netmask %d.%d.%d.%d up ", ADMIN_ETH, ppara->ip[0], ppara->ip[1], ppara->ip[2], ppara->ip[3], ppara->mask[0], ppara->mask[1], ppara->mask[2], ppara->mask[3]); system(cmd); log_printf(LOG_INFO, I_SYS_STATUS, "management interface set:%s\n", cmd); // add default route memset(cmd, 0, sizeof(cmd)); sprintf(cmd, "route add default gw %d.%d.%d.%d ", ppara->gateway[0], ppara->gateway[1], ppara->gateway[2], ppara->gateway[3]); log_printf(LOG_INFO, I_SYS_STATUS, "add new default route :%s\n", cmd); ret = system(cmd); if(ret == 127) { ret = system(cmd); log_printf(LOG_INFO, I_SYS_STATUS, "again, add new default route :%s, ret=%d\\n", cmd, ret); } } void local_ip_change_tsoip(S_TSOIP_CONFIG_PARA *ppara,ETH_INDEX ethindex) { if(ethindex >= ADMIN_ETH_INDEX) return; char cmd[100] = {0}; memset(cmd, 0, sizeof(cmd)); switch (ethindex) { case TSOIP_1_ETH_INDEX: sprintf(cmd, "ifconfig %s %d.%d.%d.%d netmask %d.%d.%d.%d ", TSOIP_1_ETH, ppara->ip[0], ppara->ip[1], ppara->ip[2], ppara->ip[3], ppara->mask[0], ppara->mask[1], ppara->mask[2], ppara->mask[3]); log_printf(LOG_DEBUG,I_NOUSED,"TSOIP 1, cmd=%s\n", cmd); break; case TSOIP_2_ETH_INDEX: sprintf(cmd, "ifconfig %s %d.%d.%d.%d netmask %d.%d.%d.%d ", TSOIP_2_ETH, ppara->ip[0], ppara->ip[1], ppara->ip[2], ppara->ip[3], ppara->mask[0], ppara->mask[1], ppara->mask[2], ppara->mask[3]); log_printf(LOG_DEBUG,I_NOUSED,"TSOIP 2, cmd=%s\n", cmd); break; } system(cmd); } void tsoip_multi_addr_net_set(int index) { index = index & 0x01; TSOIP_INSTANCE *p_tsoip1 = NULL; p_tsoip1 = (TSOIP_INSTANCE *)malloc(sizeof(TSOIP_INSTANCE)); log_printf(LOG_DEBUG,I_NOUSED,"index=%d\n", index); inset_tsoip_instance(p_tsoip1, &ip2ts[index].tsoip_config_para); p_tsoip1->index = index; udp_imgp_init((uint32) p_tsoip1); // function 内部有free(p_tsoip1) } void sys_net_init(void) { if(1){ //@(atsc) eth1 for tsoip1 local_ip_change_tsoip(&ip2ts[TSOIP_1].tsoip_config_para,TSOIP_1_ETH_INDEX); //@(atsc) eth0 for management interface local_ip_change_admin(&atsc_para.config_para); //@(atsc) eth1 for tsoip1 multi tsoip_multi_addr_net_set(TSOIP_1); // multi group } } int getMacByName(char * ifname, uint8 *macaddr) { if(macaddr==NULL || ifname==NULL) return -1; struct ifreq ifr; int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (sock == -1) { log_printf(LOG_ERR,I_NOUSED,"socket error\n"); return -1; } strcpy(ifr.ifr_name, ifname); if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) { if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) { unsigned char * ptr; ptr = (unsigned char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0]; //snprintf(macaddr,64,"%02X:%02X:%02X:%02X:%02X:%02X",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5)); //printf("Interface name : %s , Mac address : %s \n",ifr.ifr_name, macaddr); macaddr[0] = (uint8)(*(ptr+3)); macaddr[1] = (uint8)*(ptr+4); macaddr[2] = (uint8)*(ptr+5); } } }else{ log_printf(LOG_ERR,I_NOUSED,"get [%s] mac info error\n", ifname); return -1; } return 0; } #define __main_check__ 1 #if __main_check__ extern S_ATSC_PARA atsc_para; uint8 check_fpga_boot(void) { char cttb_zero[20]={0}; char cttb_ff[20]={"15.7 12153131"}; memset(&atsc_para.rg_para.fpga, 0, sizeof(atsc_para.rg_para.fpga)); init_version_info(); if((memcmp(atsc_para.rg_para.fpga,cttb_zero,sizeof(atsc_para.rg_para.fpga))==0)|| (memcmp(atsc_para.rg_para.fpga,cttb_ff,sizeof(atsc_para.rg_para.fpga))==0)) { return 0; } else{ return 1; } } void lcd_refresh_string(char *str, uint8 line ) { //char out_str[40]; //memcpy((char *)out_str, str, sizeof(out_str));//拷贝一下,直接str待验证 lcd_write_string(line,0," "); lcd_write_string(line,0,str); } #if BAK_PARA_CHECK void infor_exit_quit(uint8 number) { #if !DEBUG_ERR_CHECK static uint32 tick_bak; static BOOL refresh; #endif while(get_key_value() != KEY_EXIT) { #if !DEBUG_ERR_CHECK if(check_delay_over(&tick_bak,50)) { refresh=refresh?FALSE:TRUE; if(refresh) lcd_write_string(1,number, "Press ESC"); else lcd_write_string(1,number, " "); } #endif } } void eebak_clear(uint8 standard) { uint32 i; c256_bytewrite(EEPROM_FQPW_CHECK_FLAG,0xff); for(i=BAK_E2_DEFAULT_PARAM_ADDR;i<=END_BAK_EEPROM_ADDR;i++) c256_bytewrite2(i,0xff);//除载漏外参数,可用256字节 } void bak_error_warn(uint8 flag) { #define INF_NUM 5 #define PRE_INF 0 #define FIR_INF 1 #define SEC_INF1 2 #define SEC_INF2 3 #define EMPY_INF 4 char *out_str[3]={"OK","ERR","NULL"}; char *infor_str[INF_NUM] ={ " Backup Parameters Checking ... ", " Txfreq Rxfreq Power ", " Check And Confirm Parameters Legal ", " Then Cycle Power ... Press ESC ", " " }; #if DEBUG_ERR_CHECK char str[4]; uint8 freq; uint16 power; uint32 offset; flag |=BAK_ERR_DEBUG; //to wait #endif log_printf(LOG_DEBUG,I_NOUSED,"Bak para check begin !\n"); lcd_refresh_string(((char *)infor_str[EMPY_INF]),LINE_1);//打空字符 lcd_refresh_string(((char *)infor_str[EMPY_INF]),LINE_2);//打空字符 lcd_refresh_string(((char *)infor_str[PRE_INF]),LINE_1);//提示1 delay_ms(500);//sleep(1); #if !USE_TUNER clrbit(flag,2); if(1 == (flag&0x7f)) clrbit(flag,0); #endif if(flag) { lcd_refresh_string(infor_str[FIR_INF],LINE_1);//提示2 if(flag&BAK_ERR_TXFREQ) lcd_write_string(1,1,out_str[1]); else lcd_write_string(1,1,out_str[0]); #if USE_TUNER if(flag&BAK_ERR_RXFREQ) lcd_write_string(1,8,out_str[1]); else lcd_write_string(1,8,out_str[0]); #else lcd_write_string(1,8,out_str[2]); #endif if(flag&(BAK_ERR_POWER | BAK_ERR_DB )) lcd_write_string(1,16,out_str[1]); else lcd_write_string(1,16,out_str[0]); #if DEBUG_ERR_CHECK sprintf((char *)str,"%02X",flag); lcd_write_string(1,37,str); power = (c256_byteread2(BAK_EEPROM_POWER_UIH_ADDR)<< 8) \ | c256_byteread2(BAK_EEPROM_POWER_UIL_ADDR) ; sprintf((char *)str,"%02X_%02X",power>>8,power&0xff); lcd_write_string(0,24,str); sprintf((char *)str,"%02X_%02X",atsc_para.rf_para.power>>8,atsc_para.rf_para.power&0xff); lcd_write_string(1,24,str); freq = c256_byteread2(BAK_EEPROM_CHANNEL_ADDR); sprintf((char *)str,"%02X",freq); lcd_write_string(0,31,str); sprintf((char *)str,"%02X",atsc_para.rf_para.txfreq); lcd_write_string(1,31,str); freq = c256_byteread2(BAK_EEPROM_RXCHANNEL_ADDR); sprintf((char *)str,"%02X",freq); lcd_write_string(0,34,str); //sprintf((char *)str,"%02X",dvbt_para.rf_para.rxfreq); //lcd_write_string(1,34,str); #else lcd_write_string(1,26,"Press ESC"); #endif infor_exit_quit(26);//等待EXIT键退出 delay_ms(300); lcd_refresh_string(infor_str[SEC_INF1],LINE_1);//提示3 lcd_refresh_string(infor_str[SEC_INF2],LINE_2);//提示4 infor_exit_quit(26);//等待EXIT键退出 } log_printf(LOG_DEBUG,I_NOUSED,"bak para check end !\n"); } #endif//BAK_PARA_CHECK #if USE_TUNER int8 tuner_read_rssi(void) { #if USE_SONYCXD6801GL int rssi = 0; sonytuner_rssi(&rssi, 1); return (int8)rssi; #else uint32 ret = 0; int8 rssi = 0; uint8 data = 0; ret= TunerReadRSSI(&data); if(ret) { data = 0; } #if USE_SNR_ADJ data+=0;//data+=atsc_para.wd_para.sd; #endif rssi = data/2-LOG_RSSI_ADJUST; return rssi; #endif } uint32 tuner_get_snr(void) { int snr = 0; #if USE_SONYCXD6801GL sonytuner_snr(&snr, 1); #elif USE_TUNER_18273 #else float ret = DMD_get_cnr(); snr = (uint32)ret; #endif return snr; } //lock:1 unlock:0; //tmbslTDA18273_GetLockStatus uint32 tuner_get_lock(void) { #if USE_SONYCXD6801GL uint8 tslocked = 0; uint8 sync_state = 0; uint8 alp_lock_all = 0; uint8 plperr = 0; sonytuner_tslock(&tslocked, 1, &sync_state, &alp_lock_all, &plperr); return (uint32)tslocked; #elif USE_TUNER_18273 return 1; #else return DMD_get_lock(); //return TunerRead18273mode(); #endif } uint32 get_tuner_init_ok_flag(void) { return atsc_para.tuner_status_flag; } //外部已经调用 停止秒消息函数,此处延时使用delay_ticks void tuner_init(uint32 channel) { #if !USE_DBG_PASS_TUNER_INIT #if 1 uint32 rx_freq; int err; uint8 buf[24]; uint32 loop = 0; uint32 power_time = 0; #if USE_TUNER_18273 #else // if(atsc_para.system_para.input!=ASI_INPUT_TUNER) // { // return; // } #endif //return; //ldl 18-09-12 LBL_RESTART: delay_ticks(5); rx_freq = txfreq_to_hz(channel); rx_freq = rx_freq * 1000000; do { printf("tuner init %d times\n", loop); fpga_byte_write(0x01,0x61,0); fpga_byte_write(0x01,0x61,1); //配置前后写0,1 #if USE_TUNER_18273 //要根据tuner的类型,做出判断 err = TunerConf(rx_freq); #else //PR04: Sony CXD2878(FREIA) demod, ATSC1.0; sonytuner_init takes freq in MHz err = sonytuner_init(txfreq_to_hz(channel), 1); #endif lcd_write_string(0,0," "); lcd_write_string(1,0," "); if(!err) sprintf((char *)buf, "Tuner Ret:Succ %03dM ",rx_freq/1000000); else sprintf((char *)buf, "Tuner Ret:Err(%d)%03dM ",loop+1,rx_freq/1000000); lcd_write_string(1,0,buf); if(err) atsc_para.tuner_status_flag = 0; else atsc_para.tuner_status_flag = 1; lcd_write_cache(); delay_ticks(20); }while((err!=0)&&(++loop<2)); if(err!=0) { lcd_write_string(0,0,"SYSTEM INIT... "); lcd_write_string(1,0," "); lcd_write_cache(); printf("Init tuner timeout exit.\n"); return; } lcd_write_string(0,0,"SYSTEM INIT... "); lcd_write_string(1,0," "); lcd_write_cache(); printf("Init tuner normal exit.\n"); #endif #endif } void tuner_config_power_on(void) {//低电平复位tuner, #if 0//@TMP_UNUSED_TUNER GPIO_ResetBits(GPIOG, GPIO_Pin_1); delay_ticks(5); GPIO_SetBits(GPIOG, GPIO_Pin_1); #endif set_gpio_value(TUNER_RST_GP_NUM, E_IO_L); delay_ticks(5); set_gpio_value(TUNER_RST_GP_NUM, E_IO_H); } void tuner_config_power_reset(void) { #if 0//@TMP_UNUSED_TUNER GPIO_ResetBits(GPIOG, GPIO_Pin_1); delay_ticks(300); GPIO_SetBits(GPIOG, GPIO_Pin_1); set_gpio_value(TUNER_RST_GP_NUM, E_IO_L); delay_ticks(300); set_gpio_value(TUNER_RST_GP_NUM, E_IO_H); #endif } #endif//USE_TUNER #endif//__main_check__ #if 1 #define MODIFY_IP_SHELL "sh /usr/anywave/modify_ip_addr.sh" void config_imx_ip_addr(void) { char msg[20] = {0}; int ret = 0; int result = 0; system(MODIFY_IP_SHELL); } #endif void check_fpga_i2c() { printf("--------------------------------------------------------\n\n"); uint8 tmp_data = fpga_byte_read(0x01,0x26); printf("ck rd addr=0x26 data=0x%x\n", tmp_data); fpga_set_rf_output(0); tmp_data = fpga_byte_read(0x01,0x26); printf("ck rd addr=0x26 data=0x%x [0]\n", tmp_data); fpga_set_rf_output(1); tmp_data = fpga_byte_read(0x01,0x26); printf("ck rd addr=0x26 data=0x%x [1]\n", tmp_data); fpga_set_rf_output(0); tmp_data = fpga_byte_read(0x01,0x26); printf("ck rd addr=0x26 data=0x%x [0]\n", tmp_data); fpga_set_rf_output(1); tmp_data = fpga_byte_read(0x01,0x26); printf("ck rd addr=0x26 data=0x%x [1]\n", tmp_data); printf("--------------------------------------------------------\n\n"); } void dpd_boot_run_init(void) { //uint8 dpd_ctl3_reg = 0; pthread_mutex_init(&mux_dpd_wr_ck, NULL); //dpd_ctl3_reg = (DPD_CTRL3_FAGC_UPDATE | DPD_CTRL3_FAGC_SLOWDN ); // 注意.h文件中AXI_ADDR_DPD_CTRL2 和AXI_ADDR_DPD_CTRL3地址包含的寄存器 //fpga_byte_write(5, FPGA_ADDR_DPD_CTRL3, dpd_ctl3_reg); } void fpga_para_init(void) { uint16 time_delay =60; uint8 fpga_boot_flg=0; #if USE_DELAYED_RF_ENABLE fpga_boot_rf_hold_begin(); #endif lcd_write_string(1,0, " "); lcd_write_string(0,0, "Initializing. "); delay_ms(100); memset(&atsc_para,0,sizeof(atsc_para));//系统全局参数 #if 0 #if AW_ATSC_5X // Choose Rource fpga_byte_write(0x1,0x65 ,0x1); //国内 国外版本区分 #else fpga_byte_write(0x1,0x65 ,0x0); #endif #endif atsc_para.ad3_para.cor = c256_byteread(EEPROM_AD3_TYPE); if(atsc_para.ad3_para.cor>1) { atsc_para.ad3_para.cor = 0; } //fpga_save_agc_vol(); e2rom_read_all_para(); atsc_para.system_para.ab_mode = 0; log_printf(LOG_DEBUG,I_NOUSED,"default ABmode = 0 \n"); ts_load_default_para(TSOIP_1, &ip2ts[TSOIP_1].tsoip_config_para); sys_net_init(); #if 1// @check_fpga_boot while(time_delay--) { // wait for : FPGA start OK. log_printf(LOG_DEBUG,I_NOUSED,"lcd init cnt=%d\n",time_delay); if(time_delay%3==0) { lcd_write_string(LINE_1,0,"SYSTEM INIT... "); lcd_write_string(LINE_2,0," "); } else if(time_delay%3==1) { lcd_write_string(LINE_1,0,"SYSTEM INIT.. "); lcd_write_string(LINE_2,0," "); } else{ lcd_write_string(LINE_1,0,"SYSTEM INIT. "); lcd_write_string(LINE_2,0," "); } lcd_write_cache(); if(check_fpga_boot()) { log_printf(LOG_DEBUG,I_NOUSED,"===========================\n"); log_printf(LOG_DEBUG,I_NOUSED," ck_fpga_ver : %s, FPGA BOOT SUCCESS.\n",atsc_para.rg_para.fpga); log_printf(LOG_DEBUG,I_NOUSED,"===========================\n\n"); fpga_boot_flg=1; break; } delay_ms(200); } if(fpga_boot_flg==0){ lcd_write_string(LINE_1,0, "FPGA BOOT FAILED! "); lcd_write_string(LINE_2,0, " "); lcd_write_cache(); delay_ms(3000); lcd_write_string(LINE_1,0, " "); lcd_write_string(LINE_2,0, " "); lcd_write_cache(); } #if USE_DELAYED_RF_ENABLE else { /* Mute immediately after FPGA boot, before restoring saved parameters. */ fpga_set_rf_output(0); } #endif #endif// @check_fpga_boot #if BAK_PARA_CHECK if(atsc_para.wl_para.eebak) bak_error_warn(atsc_para.bak_err_flag); #endif #if USE_DRY_LOOP // dryloop 才有延迟开机 if(atsc_para.wh_para.func == 0) // TX模式缓开机 等待2秒 { // RF屏 dryloop.c 有单独处理 atsc_para.fpga_load_wait_flag =0; } #endif config_fpga_para(); #if USE_NEW_AGC fpga_byte_write(0x01,0x4A,agc_value[atsc_para.rf_para.agc] ); //这是否移动到read后 #else //fpga_byte_write(0x01,0x4A,atsc_para.rf_para.agc); fpga_byte_write(0x01,0x02, atsc_para.rf_para.agc); #endif lcd_write_string(0,0,"Initialize OK "); lcd_write_string(1,0," "); //delay_ms(100); init_version_info(); #if 1//NEED_TO_EN//@EN_DPD_ONBOOT set_dpd_unit_area_auto_inc(1); dpd_boot_run_init(); reset_dpd_to_normal_state(); boot_cfg_fagc_update(); #endif #if USE_DELAYED_RF_ENABLE /* * Enable the ADRV9009 TX path only after FPGA/JESD/DPD/FAGC boot * configuration is complete. The physical RF output remains muted for * RF_BOOT_STABLE_DELAY_MS inside fpga_boot_rf_hold_release(). */ if(fpga_boot_flg) { if(atsc_para.rf_para.rf && (adrv9009_set_tx_path_enable(1) != OK)) { log_printf(LOG_ERR, I_SYS_STATUS, "ADRV9009 TX enable failed, continue restoring requested RF state\n"); } fpga_boot_rf_hold_release(); } else { log_printf(LOG_DEBUG, I_NOUSED, "FPGA boot failed, keep RF output muted\n"); } #endif } #if 1//spect @NEED_ADD_FUNC @SPI_SPECT_READ void spect_spi_read(uint32 len,void *pdata,uint32 restart) { #if 0//@NEED_ADD_FUNC @SPI_SPECT_READ uint8 *pchar = (uint8*)pdata; if((len==0)||(pdata==0)) return; GPIO_ResetBits(GPIOB, GPIO_Pin_12); if(restart==1) { //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_TXE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE) == RESET); SPI_I2S_SendData(FPGA_SPI, 0xA5); //若需要重新读取数据,发送a5 //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_RXNE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_RXNE) == RESET); (void)SPI_I2S_ReceiveData(FPGA_SPI); } while(len--) { //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_TXE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE) == RESET); SPI_I2S_SendData(FPGA_SPI, 0xFF); //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_RXNE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_RXNE) == RESET); *pchar++ = SPI_I2S_ReceiveData(FPGA_SPI); } //while (SPI_I2S_GetFlagStatus(FPGA_SPI, SPI_I2S_FLAG_TXE) == RESET); while (__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE) == RESET); delay_us(5); GPIO_SetBits(GPIOB, GPIO_Pin_12); #endif } #endif /* end ,free the input point */ void udp_imgp_init(const uint32 p_tsoip_ins) { struct ip_mreq group; static S_PER_IGMP_INFO igmpinfo; struct sockaddr_in mcu_addr; int err; static uint32 multi_ip_inited[2] = {0}; static uint16 port_inited[2] = {0}; char unicast_ip_str[20] = {0}; uint32 multi_ip_addr = 0; TSOIP_INSTANCE *p_ts = NULL; p_ts = (TSOIP_INSTANCE*)p_tsoip_ins; IP_DATA(multi_ip_addr, p_ts->multicast_ip[0], p_ts->multicast_ip[1], p_ts->multicast_ip[2], p_ts->multicast_ip[3]); sprintf(unicast_ip_str, "%d.%d.%d.%d", p_ts->ip[0],p_ts->ip[1],p_ts->ip[2],p_ts->ip[3]); uint16 rec_port = p_ts->port; log_printf(LOG_DEBUG,I_NOUSED,"tsoip_%d %s multiaddr:%d.%d.%d.%d ip:%d.%d.%d.%d, port:%d\n", p_ts->index, p_ts->enable_multicast==IP2TS_REC_TYPE_MULTI?"enable group":"disable group", p_ts->multicast_ip[0], p_ts->multicast_ip[1], p_ts->multicast_ip[2], p_ts->multicast_ip[3], p_ts->ip[0],p_ts->ip[1],p_ts->ip[2],p_ts->ip[3], p_ts->port); //原先配置的有 if(multi_ip_inited[p_ts->index] != 0) { if((multi_ip_inited[p_ts->index] == multi_ip_addr) && (port_inited[p_ts->index] == rec_port) && (p_ts->enable_multicast==IP2TS_REC_TYPE_MULTI)) { return; } group.imr_multiaddr.s_addr = htonl(multi_ip_inited[p_ts->index]); group.imr_interface.s_addr = inet_addr(unicast_ip_str);//htonl(INADDR_ANY); setsockopt(igmpinfo.socket,IPPROTO_IP, IP_DROP_MEMBERSHIP, &group, sizeof(group)); close(igmpinfo.socket); log_printf(LOG_DEBUG,I_NOUSED,"close igmpsocket\n"); } // 组播地址合规,且 组播模式 if(IS_MULTI_ADDRESS(multi_ip_addr) && p_ts->enable_multicast==IP2TS_REC_TYPE_MULTI) { igmpinfo.socket = socket(AF_INET, SOCK_DGRAM, 0); if(igmpinfo.socket < 0) { log_printf(LOG_ERR,I_NOUSED,"failed to create udp sock_fd!\n"); return; } memset(&mcu_addr, 0, sizeof(mcu_addr)); mcu_addr.sin_family = AF_INET; mcu_addr.sin_port = htons(rec_port); mcu_addr.sin_addr.s_addr = inet_addr(unicast_ip_str);//htonl(INADDR_ANY); //htonl(rec_ip_addr);//INADDR_ANY; err = bind(igmpinfo.socket, (struct sockaddr *)&mcu_addr, sizeof(mcu_addr)); if (err < 0) { log_printf(LOG_ERR,I_NOUSED,"failed to bind sock_fd!\n"); return; } multi_ip_inited[p_ts->index] = multi_ip_addr; port_inited[p_ts->index] = rec_port; igmpinfo.port = port_inited[p_ts->index]; igmpinfo.ip = multi_ip_inited[p_ts->index]; group.imr_multiaddr.s_addr = htonl(igmpinfo.ip); group.imr_interface.s_addr = inet_addr(unicast_ip_str);//htonl(INADDR_ANY); err = setsockopt(igmpinfo.socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(group)); if(err < 0) { log_printf(LOG_ERR,I_NOUSED,"failed to ADD_MEMBERSHIP!code:%d\n", err); return; } log_printf(LOG_DEBUG,I_NOUSED,"bin igmpsocket success\n"); } free((char*)p_tsoip_ins); } //lPara:ip(组播地址) wPara:port(接收端口) void udp_imgp_reinit(MSG *pmsg) { udp_imgp_init(pmsg->lPara); } uint8_t get_temp_unit(void) { return atsc_para.wh_para.temp_unit; }