1120 lines
32 KiB
C
Executable File
1120 lines
32 KiB
C
Executable File
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h> //define O_WRONLY and O_RDONLY
|
|
#include <pthread.h> /* mux- */
|
|
#include <unistd.h> /* -System V */
|
|
#include <sys/ioctl.h> /* ioctl - BSD and Linux */
|
|
#include <stropts.h> /* -XSI STREAMS */
|
|
#include <linux/spi/spidev.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <sys/time.h>
|
|
#include <errno.h>
|
|
#include <sys/select.h>
|
|
#include <math.h>
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <net/if.h>
|
|
#include <sys/ioctl.h>
|
|
#include <arpa/inet.h>
|
|
#include <linux/sockios.h>
|
|
#include <linux/ethtool.h>
|
|
|
|
|
|
|
|
|
|
|
|
#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;
|
|
}
|
|
|
|
|