⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tv_image_sensor.c

📁 泰景的模拟电视全部驱动及MTK平台界面代码
💻 C
字号:
#include "Tv_Include.h"

/* Global Valuable */
#ifdef WIN32
kal_bool isp_digital_zoom_flag=FALSE;
#endif /* WIN32 */

static void ATV_InitHostI2C()
{
	// Initial host I2C interface
	GPIO_ModeSetup(ATV_I2C_SDA, 0);
	GPIO_InitIO(1, ATV_I2C_SDA);
	GPIO_WriteIO(1, ATV_I2C_SDA);
	GPIO_ModeSetup(ATV_I2C_SCL, 0);
	GPIO_InitIO(1, ATV_I2C_SCL);
	GPIO_WriteIO(1, ATV_I2C_SCL);
}

static void ATV_DeInitHostI2C()
{
	// De-Init host I2C interface
	GPIO_ModeSetup(ATV_I2C_SDA, 0);
	GPIO_InitIO(1, ATV_I2C_SDA);
	GPIO_WriteIO(0, ATV_I2C_SDA);
	GPIO_ModeSetup(ATV_I2C_SCL, 0);
	GPIO_InitIO(1, ATV_I2C_SCL);
	GPIO_WriteIO(0, ATV_I2C_SCL);
}

static void ATV_ChipPowerOn()
{
	// Turn on 1.2V & 2.8V LDO
	GPIO_ModeSetup(ATV_POWER_PIN, 0);
	GPIO_InitIO(1, ATV_POWER_PIN);
	GPIO_WriteIO(1, ATV_POWER_PIN);
}

static void ATV_ChipPowerOff()
{
	// Turn off 1.2V & 2.8V LDO
	GPIO_ModeSetup(ATV_POWER_PIN, 0);
	GPIO_InitIO(1, ATV_POWER_PIN);
	GPIO_WriteIO(0, ATV_POWER_PIN);
}

static void ATV_ChipReset()
{
	GPIO_ModeSetup(ATV_RESET_PIN, 0);
	GPIO_InitIO(1, ATV_RESET_PIN);
	GPIO_WriteIO(0, ATV_RESET_PIN);
	TLG_Delay(25);
	GPIO_WriteIO(1, ATV_RESET_PIN);
	TLG_Delay(25);
}

static void ATV_TestI2C()
{
	uint16 reg, write, read;

	// Test I2C communication
	for (reg = 0x7F, write = 1; reg <= 0x8E; reg++, write <<= 1)
		TLG_WriteReg(tlg_i2c_addr, reg, write);

	for (reg = 0x7F, write = 1; reg <= 0x8E; reg++, write <<= 1)
	{
		TLG_ReadReg(tlg_i2c_addr, reg, &read);
#ifdef WIN32
			//printf("[ATV] I2C test: Reg=%04x Wr=%04x Rd=%04x\n", reg, write, read);
#else
#ifdef ADS_MTK
			kal_prompt_trace(MOD_MMI, "[ATV] I2C test: Reg=%04x Wr=%04x Rd=%04x\n", reg, write, read);
#else /* default */
			;
#endif /* ADS_MTK */
#endif /* WIN32 */
	}
}

/*************************************************************************
* FUNCTION
* init_ATV
*
* DESCRIPTION
* This function initialize the ATV and ISP control register.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_int8 init_ATV(void)
{
	uint16 y, u, v;

	// Set polarities of PCLK, HSYNC and VSYNC
	SET_CMOS_CLOCK_POLARITY_LOW;
	SET_VSYNC_POLARITY_HIGH;
	SET_HSYNC_POLARITY_LOW;

	ENABLE_CAMERA_INDATA_FORMAT;
	SET_CAMERA_INPUT_TYPE(INPUT_YUV422);
	SET_CAMERA_INPUT_ORDER(INPUT_ORDER_YCbY1Cr);
	ENABLE_CAMERA_TG_CLK_48M;

	// Set ISP driving current
	set_isp_driving_current(ISP_DRIVING_2MA);

	ATV_InitHostI2C();
	ATV_ChipPowerOn();
	TLG_Delay(25);
	ATV_ChipReset();
	ATV_TestI2C();
	TLGAPP_Restart();
	TLGAPP_Init(tlg_i2c_addr);
	TLGAPP_InitTvChannelMap();
	TLGAPP_SetChannel(p_tlg_cur_map[gTvStorage.mCurChnIdx] CHN_S);

	// Preset backlight according to gTvOptions.mBrightness
	// ...
	
	// Preset contrast and saturation
	y = gTvOptions.mContrast;
	u = min(235 * gTvOptions.mSaturation / SATURATION_DEFAULT, 255);
	v = min(158 * gTvOptions.mSaturation / SATURATION_DEFAULT, 255);
	TLG_SetYUVScale(tlg_i2c_addr, y, u, v);

	// Preset definition
	TLG_SetMobileVidEnhancement(tlg_i2c_addr, TLG_MVE_MANUAL, gTvOptions.mDefinition);

	// Preset audio volume according to gTvOptions.mVolume
	// ...
	
	// Turn on FM audio amplifier
#ifdef ADS_MTK
	AFE_SetOutputDevice(L1SP_FM_RADIO, L1SP_LOUD_SPEAKER);
	AFE_TurnOnSpeaker(L1SP_FM_RADIO);
	AFE_SwitchExtAmplifier(TRUE);
	AFE_SetOutputVolume( L1SP_FM_RADIO, 128, 0);
#endif

return 1;
}

/*************************************************************************
* FUNCTION
* power_off_ATV
*
* DESCRIPTION
* This function is to turn off ATV power.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/

void power_off_ATV(void)
{
	StopTimer(ATV_TIMER_CHANNEL_CHANGE);

	// Turn off FM audio amplifier
#ifdef ADS_MTK
	AFE_TurnOffSpeaker(L1SP_FM_RADIO);
	AFE_SwitchExtAmplifier(FALSE);
#endif /* ADS_MTK */

	// Restore backlight according to system default

	TLGAPP_PowerDown();
	ATV_ChipReset();
	ATV_DeInitHostI2C();
	ATV_ChipPowerOff();
}

/*************************************************************************
* FUNCTION
* get_ATV_id
*
* DESCRIPTION
* None
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void get_ATV_id(kal_uint8 *sensor_write_id, kal_uint8 *sensor_read_id)
{
}

/*************************************************************************
* FUNCTION
* get_ATV_size
*
* DESCRIPTION
* None
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void get_ATV_size(kal_uint16 *sensor_width, kal_uint16 *sensor_height)
{
	if (gTvScanLines == TLG_TV_525_LINES)
	{
		*sensor_width = 360-(H_OFFSET_RANGE+H_REDUCE_525+gTvOptions.mHReduce)*PIXEL_STEP;
		*sensor_height = 244-(V_OFFSET_RANGE+V_REDUCE_525+gTvOptions.mVReduce)*PIXEL_STEP;
	}
	else /* TvScanLines == TLG_TV_625_LINES */
	{
		*sensor_width = 360-(H_OFFSET_RANGE+H_REDUCE_625+gTvOptions.mHReduce)*PIXEL_STEP;
		*sensor_height = 288-(V_OFFSET_RANGE+V_REDUCE_625+gTvOptions.mVReduce)*PIXEL_STEP;
	}
}

/*************************************************************************
* FUNCTION
* get_ATV_period
*
* DESCRIPTION
* None
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void get_ATV_period(kal_uint16 *pixel_number, kal_uint16 *line_number)
{
	if (gTvScanLines == TLG_TV_525_LINES)
	{
		*pixel_number = 360-(H_OFFSET_RANGE+H_REDUCE_525+gTvOptions.mHReduce)*PIXEL_STEP;
		*line_number = 244-(V_OFFSET_RANGE+V_REDUCE_525+gTvOptions.mVReduce)*PIXEL_STEP;
	}
	else /* TvScanLines == TLG_TV_625_LINES */
	{
		*pixel_number = 360-(H_OFFSET_RANGE+H_REDUCE_625+gTvOptions.mHReduce)*PIXEL_STEP;
		*line_number = 288-(V_OFFSET_RANGE+V_REDUCE_625+gTvOptions.mVReduce)*PIXEL_STEP;
	}
}

void ATV_preview(image_sensor_exposure_window_struct *image_window, image_sensor_config_struct *sensor_config_data)
{
	SET_TG_OUTPUT_CLK_DIVIDER(1);
	SET_CMOS_RISING_EDGE(0);
	SET_CMOS_FALLING_EDGE(0);
	ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
	SET_TG_PIXEL_CLK_DIVIDER(1);
	SET_CMOS_DATA_LATCH(1);

	DISABLE_CAMERA_TG_PHASE_COUNTER;
	DISABLE_CAMERA_CLOCK_OUTPUT_TO_CMOS;

	if (gTvScanLines == TLG_TV_525_LINES)
	{
		image_window->grab_start_x = 0;
		image_window->grab_start_y = 1;
		image_window->exposure_window_width = 360-(H_OFFSET_RANGE+H_REDUCE_525+gTvOptions.mHReduce)*PIXEL_STEP;
		image_window->exposure_window_height = 244-(V_OFFSET_RANGE+V_REDUCE_525+gTvOptions.mVReduce)*PIXEL_STEP;
	}
	else /* TvScanLines == TLG_TV_625_LINES */
	{
		image_window->grab_start_x = 16;
		image_window->grab_start_y = 1;
		image_window->exposure_window_width = 360-(H_OFFSET_RANGE+H_REDUCE_625+gTvOptions.mHReduce)*PIXEL_STEP-16*2;
		image_window->exposure_window_height = 288-(V_OFFSET_RANGE+V_REDUCE_625+gTvOptions.mVReduce)*PIXEL_STEP;
	}

#ifdef WIN32
	printf("ISP window: w=%d, h=%d\n",	image_window->exposure_window_width, image_window->exposure_window_height);
	printf("Aspect rate = %5.3f\n",	(float)image_window->exposure_window_width / image_window->exposure_window_height);
#endif /* WIN32 */
}

void ATV_capture(image_sensor_exposure_window_struct *image_window, image_sensor_config_struct *sensor_config_data)
{
}

/*************************************************************************
* FUNCTION
* write_ATV_reg
*
* DESCRIPTION
* None
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void write_ATV_reg(kal_uint32 addr, kal_uint32 para)
{
}

/*************************************************************************
* FUNCTION
* read_cmos_sensor
*
* DESCRIPTION
* None
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint32 read_ATV_reg(kal_uint32 addr)
{
	return 0;
}

/*************************************************************************
* FUNCTION
* set_ATV_shutter
*
* DESCRIPTION
* None
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void set_ATV_shutter(kal_uint16 shutter)
{
}

/*************************************************************************
* FUNCTION
* set_ATV_gain
*
* DESCRIPTION
* None
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint16 set_ATV_gain(kal_uint16 gain)
{
	return 0;
}

/*************************************************************************
* FUNCTION
* ATV_night_mode
*
* DESCRIPTION
* None
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void ATV_night_mode(kal_bool enable)
{
}

/*************************************************************************
* FUNCTION
* set_ATV_flashlight
*
* DESCRIPTION
* None
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void set_ATV_flashlight(kal_bool enable)
{
}

/*************************************************************************
* FUNCTION
* yuv_ATV_setting
*
* DESCRIPTION
* None
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint32 yuv_ATV_setting(kal_uint32 cmd, kal_uint32 para)
{
	return TRUE;
}

/*************************************************************************
* FUNCTION
* image_sensor_func_ATV
*
* DESCRIPTION
* ATV functions struct.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
image_sensor_func_struct image_sensor_func_ATV =
{
	init_ATV,
	get_ATV_id,
	get_ATV_size,
	get_ATV_period,
	ATV_preview,
	ATV_capture,
	write_ATV_reg,
	read_ATV_reg,
	set_ATV_shutter,
	ATV_night_mode,
	power_off_ATV,
	set_ATV_gain,
	set_ATV_flashlight,
	yuv_ATV_setting
};

void PowerOnFM(void)
{
	ATV_InitHostI2C();
	ATV_ChipPowerOn();
	ATV_ChipReset();
	ATV_TestI2C();
	TLGAPP_Restart();
	TLGAPP_Init(tlg_i2c_addr);
	TLGAPP_SetChannelMapFM();
	TLGAPP_SetChannel(p_tlg_cur_map[gFmStorage.mCurChnIdx] CHN_S);
}

void PowerOffFM(void)
{
	TLGAPP_PowerDown();
	ATV_ChipReset();
	ATV_DeInitHostI2C();
	ATV_ChipPowerOff();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -