/**
 *file    sys_gpio.c
 *brief   
 * 
 *par     Copyright (c) 2022  Unicmicro Corp., Ltd. All Rights Reserved.
 *author  James
 *date    2023-06-27
 *version 
 * 
 *history 
 *  Date        Note
 *
 *    DP_ALT转换 视频信号控制，整个框架放这里设置
 */

#include "drivers.h"
#include "libc.h"
#include "sys_gpio.h"
#include "sys_pd_hook.h"
#include "sc8002_reg_defs.h"
#include  "sys_alt_control.h"
#include "drv_adc.h"


#define MAX_POS 6
static u16_t sc_code_vol[MAX_POS] = {158,237,297,363,465,627};   //max 660



void alt_sys_init()
{

	drv_gpio_val_set(DSVL_POL,1);
	drv_gpio_oe_set(DSVL_POL,1);
	drv_gpio_en_set(DSVL_POL,1);

	drv_gpio_val_set(DSVL_DP_SW,1);
	drv_gpio_oe_set(DSVL_DP_SW,1);
	drv_gpio_en_set(DSVL_DP_SW,1);



		drv_gpio_val_set(ALT_LED_ON,0);
		drv_gpio_oe_set(ALT_LED_ON,1);
		drv_gpio_en_set(ALT_LED_ON,1);

		drv_gpio_val_set(ALT_VBUS_C1EN,0);
		drv_gpio_oe_set(ALT_VBUS_C1EN,1);
		drv_gpio_en_set(ALT_VBUS_C1EN,1);


		drv_gpio_val_set(ALT_DC_EN,0);
		drv_gpio_oe_set(ALT_DC_EN,1);
		drv_gpio_en_set(ALT_DC_EN,1);



		drv_gpio_val_set(ALT_SW_A_C,0);
		drv_gpio_oe_set(ALT_SW_A_C,1);
		drv_gpio_en_set(ALT_SW_A_C,1);





	drv_gpio_oe_set(DSVL_HPDOUT,0);
	drv_gpio_en_set(DSVL_HPDOUT,1);

	drv_gpio_oe_set(ALT_DC_DET,0);
	drv_gpio_en_set(ALT_DC_DET,1);

	drv_gpio_oe_set(ALT_SINK_IN,0);
	drv_gpio_en_set(ALT_SINK_IN,1);

	drv_gpio_oe_set(ALT_A_TO_C_CHECK,0);
    drv_gpio_en_set(ALT_A_TO_C_CHECK,1);


    drv_gpio_oe_set(ALT_SINK_DET,0);
    drv_gpio_en_set(ALT_SINK_DET,0);

    drv_gpio_oe_set(ALT_SINK_INT,0);
    drv_gpio_en_set(ALT_SINK_INT,0);

    drv_gpio_oe_set(ALT_SINK_GPIO,0);
    drv_gpio_en_set(ALT_SINK_GPIO,0);

	 // KEY: input
	drv_gpio_oe_set(DSVL_HPDOUT,0);
	drv_gpio_en_set(DSVL_HPDOUT,1);
	// 初始化：抓沿
	drv_gpio_intr_type_set(DSVL_HPDOUT, 1);
	// 设置下降沿
	drv_gpio_intr_polar_set(DSVL_HPDOUT, 0);
	// 设置 GPIO 中断回调函数
   // drv_gpio_intr_handler_set(DSVL_HPDOUT, sys_gpio_key_isr);
	drv_gpio_intr_mask_set(DSVL_HPDOUT, 0);
	// 使能 GPIO0 中断
	drv_gpio_intr_en_set(DSVL_HPDOUT, TRUE);


	sys_alt_usbc_to_a(FALSE);



	drv_gpio_oe_set(ALT_SINK_INT,0);
	drv_gpio_en_set(ALT_SINK_INT,1);
	// 初始化：抓沿
	drv_gpio_intr_type_set(ALT_SINK_INT, 1);
	//
	drv_gpio_intr_polar_set(ALT_SINK_INT, 0); //低电平中断
	// 设置 GPIO 中断回调函数
	drv_gpio_intr_handler_set(ALT_SINK_INT, sys_gpio_sink_int_hangdler);
	drv_gpio_intr_mask_set(ALT_SINK_INT, 0);
	// 使能 GPIO0 中断
	drv_gpio_intr_en_set(ALT_SINK_INT, TRUE);




	 sc8002_init();



}


void alt_output_enable(u8_t en)
{

	sc8002_enable(en);

}




void alt_outputvol(u8_t pos)
{

    if(pos > MAX_POS) return;
    sc_setvol(sc_code_vol[pos]);

}

void alt_ppsoutvol(u8_t pos)
{
	  if(pos > MAX_POS) return;
	  sc_setvol(sc_code_vol[pos]);

}


void alt_dsvl171_setmode(DSVL_mode mode)
{

	if(mode == e_dp_pass_a)
	{
		drv_gpio_val_set(DSVL_POL,0);
		drv_gpio_val_set(DSVL_DP_SW,0);
	}
	else if(mode == e_dp_pass_b)
	{
		drv_gpio_val_set(DSVL_POL,1);
		drv_gpio_val_set(DSVL_DP_SW,0);

	}
	else if(mode == e_dp_pass_c)
	{
		drv_gpio_val_set(DSVL_POL,0);
		drv_gpio_val_set(DSVL_DP_SW,1);

	}
	else if(mode == e_dp_pass_d)
	{

		drv_gpio_val_set(DSVL_POL,1);
	    drv_gpio_val_set(DSVL_DP_SW,1);
	}
	else return ;


}

void alt_test_timer()
{



   static u8_t reg;


    reg = alt_sinkboard_get();
    printf("i2c %d\r\n",reg);
}

void alt_test_pwm()
{

	volatile drv_timer_t  alt_en_timer = {3,0,0,0,0,0,0};
	drv_timer_start(5000, &alt_en_timer, (void *)alt_test_timer);


}


#define   SYS_ALT_BOARD_I2C  DRV_I2C_ID_1
#define   SYS_ALT_BASE_ADDR  0Xa0
#define   ALT_I2C_REG  0X01

/*
 * 获取sin板子的读取电压
 */
volatile u8_t tx[17]={0,1};
volatile u8_t rx[17];
u8_t alt_sinkboard_get()
{


	  drv_i2c_master_transmit(SYS_ALT_BOARD_I2C,SYS_ALT_BASE_ADDR,(u8_t *)tx,1,(u8_t *)rx,5);

	 drv_uart_puthex((u8_t *)&rx, 5, FALSE);
	 return 0;
}
/*
 * dp 热插拔
 */
u8_t alt_holdout_get()
{

  return 	drv_gpio_val_get(DSVL_HPDOUT);
}

/*
 * 过流保护
 */
u8_t alt_ocv_flag()
{

	return 0;
}




/*
 * 获取sin板子的读取电压
 */
volatile u8_t alt_tmp_txbuf1[17];
volatile u8_t alt_tmp_rxbuf1[17];

#define ALT_LED_ADR 0X06
#define ALT_SINK_POS_ADR 0X04
u32_t alt_sinkboard_sinkcapt_get(void)
{

	 drv_i2c_master_transmit(SYS_ALT_BOARD_I2C, SYS_ALT_BASE_ADDR, (u8_t *)alt_tmp_txbuf1, 0, (u8_t *)alt_tmp_rxbuf1, 4);

	 return alt_tmp_rxbuf1[2]*alt_tmp_rxbuf1[1];
}


/*
 * 根据协议来
 */
void  alt_sink_curcap_get(u8_t *pal,u8_t num)
{
	 drv_i2c_master_transmit(SYS_ALT_BOARD_I2C, SYS_ALT_BASE_ADDR, (u8_t *)alt_tmp_txbuf1, 0, (u8_t *)alt_tmp_rxbuf1, num);
	 drv_uart_puthex((u8_t *)alt_tmp_rxbuf1,num,0);
	 memcpy((u8_t *)pal,(u8_t *)alt_tmp_rxbuf1,num);


}



u8_t alt_sinkboard_ledstate_get(void)
{
	u8_t a;
	//alt_tmp_txbuf1[0] = ALT_LED_ADR;  //addr
   // drv_i2c_master_transmit(SYS_ALT_BOARD_I2C, SYS_ALT_BASE_ADDR, (u8_t *)alt_tmp_txbuf1, 1, &a, 1);
	drv_i2c_master_transmit(SYS_ALT_BOARD_I2C, SYS_ALT_BASE_ADDR, (u8_t *)alt_tmp_txbuf1, 0, (u8_t *)alt_tmp_rxbuf1, 7);
	a = alt_tmp_rxbuf1[6];
	return  a;

}

u8_t alt_sinkboard_numpos_get(void)
{
	return  drv_i2c_reg_get(SYS_ALT_BOARD_I2C, SYS_ALT_BASE_ADDR,ALT_SINK_POS_ADR);

}



void alt_sinkboard_pos_set(u8_t pos)
{
	alt_tmp_txbuf1[0] = 1;  //addr
	alt_tmp_txbuf1[1] = pos;
	printf("send pos = %d\r\n",pos);
	drv_i2c_master_transmit(SYS_ALT_BOARD_I2C,SYS_ALT_BASE_ADDR,(u8_t *)alt_tmp_txbuf1,2,NULL,0);


}




bool_t alt_dc_invol_get()
{
    return (drv_adc_read_multi_avg(SYS_DC_IN_ADC_ID, 3) * drv_flash_trim_ref_volt_get() * SYS_DC_IN_ADC_CONSTANT)>>12;
}











