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

📄 sccb.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 *   sccb.c
 *
 * Project:
 * --------
 *   Maui_sw
 *
 * Description:
 * ------------
 *   SCCB module driver code
 *
 * Author:
 * -------
 * -------
 *
 *============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 *
 * removed!
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================
 ****************************************************************************/
#include "kal_release.h"
#include "stack_common.h"
#include "stack_msgs.h"
#include "app_ltlcom.h"       /* Task message communiction */
#include "syscomp_config.h"
#include "task_config.h"
#include "stacklib.h"
#include "stack_timer.h"      /*stack_timer_struct....definitions*/
#include "drv_comm.h"
#include "IntrCtrl.h"
#include "reg_base.h"
#include "gpio_sw.h"
#include "sccb.h"
#include "isp_if.h"

#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229))

//#define SCCB_LISR_ENABLE
volatile kal_uint8 sccb_status=0;
kal_uint32 SCCB_DELAY=0x100;
kal_uint32 MAX_RETRY_COUNT=0x1000;
kal_uint8	sccb_mode = 0;
kal_uint8	sccb_write_id=0, sccb_read_id=0;

/*************************************************************************
* FUNCTION
*	sccb_LISR
*
* DESCRIPTION
*	Entry function of SCCB LISR routine
*
* PARAMETERS
*	None
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void sccb_LISR(void)
{
	kal_uint16 int_status;

	int_status=DRV_Reg(SCCB_STATUS_REG);

	if (int_status & SCCB_READ_COMPLETE)
		sccb_status |= SCCB_READ_COMPLETE;
	if (int_status & SCCB_WRITE_COMPLETE)
		sccb_status |= SCCB_WRITE_COMPLETE;
}

void init_sccb(void)
{
	sccb_config(SCCB_SW_8BIT, 0x00, 0x00, NULL);
}

/*************************************************************************
* FUNCTION
*	power_off_sccb
*
* DESCRIPTION
*	This function power off SCCB interface
*
* PARAMETERS
*
* RETURNS
*
* GLOBALS AFFECTED
*
*************************************************************************/
void power_off_sccb(void)
{
	kal_uint32 save_irq_mask;    
    save_irq_mask=SaveAndSetIRQMask();			
    DRV_Reg(DRVPDN_CON2) |= DRVPDN_CON2_SCCB;  /* Power off SCCB */	    
    RestoreIRQMask(save_irq_mask);			    
}
/*************************************************************************
* FUNCTION
*	sccb_config
*
* DESCRIPTION
*	This function configure SCCB interface
*
* PARAMETERS
*	para
*		mode - SCCB_SW_8BIT, SCCB_SW_16BIT, SCCB_HW_8BIT or SCCB_HW_16BIT
*		wid, rid - slave write/read id
*	freq - HW SCCB Frequency Parameter
*
* RETURNS
*	TRUE/FALSE
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint8 sccb_config(kal_uint8 mode, kal_uint8 write_id, kal_uint8 read_id, SCCB_FREQ_STRUCT *freq)
{
	kal_uint32 save_irq_mask;

	sccb_mode = mode;		
	sccb_write_id = write_id;
	sccb_read_id = read_id;		  			  		  	
	switch(mode)
	{
		case SCCB_SW_8BIT:
		case SCCB_SW_16BIT:		
		  	save_irq_mask=SaveAndSetIRQMask();		
			GPIO_ModeSetup(SCCB_SERIAL_CLK_PIN,0x0);
			GPIO_ModeSetup(SCCB_SERIAL_DATA_PIN,0x0);		
			SET_SCCB_CLK_HIGH;
			SET_SCCB_DATA_HIGH;
			SET_SCCB_CLK_OUTPUT;
			SET_SCCB_DATA_OUTPUT;			
		  	RestoreIRQMask(save_irq_mask);			
		break;
		case SCCB_HW_8BIT:
		case SCCB_HW_16BIT:		
		    /* Set GPIO as Output High */
  	        save_irq_mask=SaveAndSetIRQMask();		    
            GPIO_ModeSetup(SCCB_SERIAL_CLK_PIN,0);
            GPIO_ModeSetup(SCCB_SERIAL_DATA_PIN,0);
            GPIO_InitIO(OUTPUT,SCCB_SERIAL_CLK_PIN);
            GPIO_InitIO(OUTPUT,SCCB_SERIAL_DATA_PIN);		    
		    GPIO_WriteIO(1,SCCB_SERIAL_CLK_PIN);
		    GPIO_WriteIO(1,SCCB_SERIAL_DATA_PIN);		    		
		    /* Power on SCCB and then switch GPIO to HW Mode */
   DRV_Reg(DRVPDN_CON2) &= (~DRVPDN_CON2_SCCB);  /* Power on SCCB */	
	GPIO_ModeSetup(SCCB_SERIAL_CLK_PIN,0x01);
	GPIO_ModeSetup(SCCB_SERIAL_DATA_PIN,0x01);
		  	RestoreIRQMask(save_irq_mask);			            
			if(freq!=NULL)
			{
				SET_SCCB_BUFFER_TIMER( freq->TBUF );
				SET_SCCB_START_HOLD_TIME( freq->THDSTA );
				SET_SCCB_DATA_HOLD_TIME( freq->THDDTA );
				SET_SCCB_CLK_LOW_PERIOD( freq->TLOW );
				SET_SCCB_CLK_HIGH_PERIOD( freq->THIGH );
				SET_SCCB_STOP_SETUP_TIME( freq->TSUSTO );
			}		
	SET_SCCB_MASTER_MODE;
	CLEAR_SCCB_BUFFER;
#if (defined(SCCB_LISR_ENABLE))
	IRQ_Register_LISR(IRQ_SCCB_CODE, sccb_LISR,"SCCB ISR");

  	IRQSensitivity(IRQ_SCCB_CODE,LEVEL_SENSITIVE);
	IRQUnmask(IRQ_SCCB_CODE);
#endif			
		break;
		default:		
			return KAL_FALSE;
	}
	return KAL_TRUE;
}

/*************************************************************************
* FUNCTION
*	sccb_getMode
*
* DESCRIPTION
*	This function Get SCCB Mode
*
* PARAMETERS
*	None
*
* RETURNS
*	SCCB Mode - SCCB_SW_8BIT, SCCB_SW_16BIT, SCCB_HW_8BIT, SCCB_HW_16BIT
*************************************************************************/
kal_uint8 sccb_getMode(void)
{
	return sccb_mode;
}

/*************************************************************************
* FUNCTION
*	sccb_setDelay
*
* DESCRIPTION
*	This function set SCCB delay count for read SCCB status complete signal
*
* PARAMETERS
*	delay - 0x100~=1; 0x800~=8; 0x1000~=16; 0x8000~=132 TDMA@52MHz (1TDMA=1/32K )
*
* RETURNS
*	SCCB Mode - SCCB_SW_8BIT, SCCB_SW_16BIT, SCCB_HW_8BIT, SCCB_HW_16BIT
*************************************************************************/
void sccb_setDelay(kal_uint32 delay)
{
	SCCB_DELAY = delay;
}

kal_uint8 sccb_wait_writeComplete(void)
{
	kal_uint32 i=0;
	#if (defined(SCCB_LISR_ENABLE))
	while (!(sccb_status & SCCB_WRITE_COMPLETE)) {};		
#else
	for(i=SCCB_DELAY;i>0;i--)	;		
	while (SCCB_IS_WRITTING && ((i++)<MAX_RETRY_COUNT) ) ;		
	#endif	
	if(i>=MAX_RETRY_COUNT)
		return KAL_FALSE;
	return KAL_TRUE;		
}

kal_uint8 sccb_wait_readComplete(void)
{
	kal_uint32 i=0;	
	if((sccb_mode==SCCB_SW_8BIT)||(sccb_mode==SCCB_SW_16BIT))	
	{
		while (GET_SCCB_DATA_BIT && ((i++)<MAX_RETRY_COUNT));	
	}
	else
	{
		#if (defined(SCCB_LISR_ENABLE))				
		while (!(sccb_status & SCCB_READ_COMPLETE)) {};		
		#else
		for(i=SCCB_DELAY;i>0;i--)	;
		while (SCCB_IS_READING && ((i++)<MAX_RETRY_COUNT)) ;			
#endif
		if(i>=MAX_RETRY_COUNT)
			return KAL_FALSE;
	}
	return KAL_TRUE;			
}

/*************************************************************************
* FUNCTION
*	sccb_send_byte
*
* DESCRIPTION
*	This function send one byte to through software SCCB
*
* PARAMETERS
*	send_byte : the data that writes out through software sccb
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void sccb_send_byte(kal_uint8 send_byte)
{
	signed char i;
	kal_uint32 j=0;	
	SET_SCCB_CLK_LOW;	
	SET_SCCB_DATA_OUTPUT;

	for (i=7;i>=0;i--)
	{	/* data bit 7~0 */
		if (send_byte & (1<<i))
		{
			SET_SCCB_DATA_HIGH;
		}
		else
		{
			SET_SCCB_DATA_LOW;
		}
		for (j=0; j<SCCB_DELAY; j++); 
		SET_SCCB_CLK_HIGH;
		for (j=0; j<SCCB_DELAY; j++); 
		SET_SCCB_CLK_LOW;
	}
	/* don't care bit, 9th bit */

	SET_SCCB_DATA_LOW;
	SET_SCCB_DATA_INPUT;
	SET_SCCB_CLK_HIGH;
	sccb_wait_readComplete();	
	SET_SCCB_CLK_LOW;
	SET_SCCB_DATA_OUTPUT;	
}	/* SCCB_send_byte() */

/*************************************************************************
* FUNCTION
*	sccb_get_byte
*
* DESCRIPTION
*	This function read one byte through software SCCB interface
*
* PARAMETERS
*	None
*
* RETURNS
*	the data that read from SCCB interface
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint16 sccb_get_byte(void)
{
	kal_uint16 get_byte=0;
	signed char i;
	kal_uint32 j;
	SET_SCCB_CLK_LOW;		
	if(sccb_mode==SCCB_SW_8BIT)
	{
	SET_SCCB_DATA_INPUT;
	for (i=7;i>=0;i--)
	{	/* data bit 7~0 */
			for (j=0; j<SCCB_DELAY; j++); 
		SET_SCCB_CLK_HIGH;
			for (j=0; j<SCCB_DELAY; j++); 			
		if (GET_SCCB_DATA_BIT)
			get_byte |= (1<<i);
			for (j=0; j<SCCB_DELAY; j++); 
		SET_SCCB_CLK_LOW;
	}
	/* don't care bit, 9th bit */
		NACK_BIT;		
	}
	else if(sccb_mode==SCCB_SW_16BIT)
	{
		SET_SCCB_DATA_INPUT;
		
		for (i=15; i>=8; i--)
		{	/* data bit 15~8 */
			for(j=0;j<SCCB_DELAY;j++);		
			SET_SCCB_CLK_HIGH;
			for(j=0;j<SCCB_DELAY;j++);
			if (GET_SCCB_DATA_BIT)
				get_byte |= (1<<i);
			for(j=0;j<SCCB_DELAY;j++);
			SET_SCCB_CLK_LOW;
		}
		for(j=0;j<SCCB_DELAY;j++);	
		SET_SCCB_DATA_OUTPUT;
		SET_SCCB_DATA_LOW;
		for(j=0;j<SCCB_DELAY;j++);
		SET_SCCB_CLK_HIGH;
		for(j=0;j<SCCB_DELAY;j++);
		SET_SCCB_CLK_LOW;
		for(j=0;j<SCCB_DELAY;j++);

		SET_SCCB_DATA_INPUT;
		
		for (i=7; i>=0; i--)
		{	/* data bit 7~0 */
			for(j=0;j<SCCB_DELAY;j++);		
			SET_SCCB_CLK_HIGH;
			for(j=0;j<SCCB_DELAY;j++);
			if (GET_SCCB_DATA_BIT)
				get_byte |= (1<<i);
			for(j=0;j<SCCB_DELAY;j++);
			SET_SCCB_CLK_LOW;
		}
		NACK_BIT;			
	}
	return get_byte;
}	/* sccb_get_byte() */

/*************************************************************************
* FUNCTION
*	sccb_write
*
* DESCRIPTION
*	This function 3 phase write to specified register through SCCB interface
*
* PARAMETERS
*	cmd : the register index of device
*  parameter : setting value of the specified register of device
*
* RETURNS
*	None

⌨️ 快捷键说明

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