?? drv_ch_i2c_com.c
字號:
/******************************************************************************
File Name : drv_ch_i2c.c
Description : Channel I2C(Inter IC bus) driver functions
Copyright (C) 2004
******************************************************************************/
/********************************************************************
Header Files
********************************************************************/
/* global include */
#include <string.h>
// #include "types.h"
// #include "iic.h"
#if defined(SUPPORT_NEC_CHIP)
#include "types.h"
#include "htype.h"
#include "Iic.h"
#elif defined(CHIPSET_ST)
#include "stddefs.h"
#include "sti2c.h"
#endif
/* local include */
#include "app_data.h"// 7710_T
#include "i2c.h"
#include "sttbx.h"// 7710_T
#include "drv_ch_i2c_com.h"
#include "ddi_channel.h"
#include "ddi_uart.h"
#include "ddi_hw.h"
#include "drv_tuner_com.h"
#include "ddi_ch_common.h"
#include "vkernel.h"
#include "sss_dbg.h"
// #include "ch_print.h"
//#define STTBX_PRINT
#include "sttbx.h"
/********************************************************************
Debug Option
********************************************************************/
//#define CH_PRINT // All Print Enable /Disable
#define CH_PRINT_ERROR // Error Print Enable / Disable
//#define CH_PRINT_WARNING
//#define CH_PRINT_DEBUG
//#define CH_PRINT_DATA
#ifdef CHANNEL_DEBUG
#define PrintInfo(_x_) STTBX_Print (_x_)
#define PrintDebug(_x_) STTBX_Print (_x_)
#else
#define PrintInfo(_x_)
#define PrintDebug(_x_)
#endif
#if defined(CH_PRINT_ERROR)
#define PrintError(_x_) STTBX_Print (_x_)
#else
#define PrintError(_x_)
#endif
#ifdef CHANNEL_DEBUG
#define PrintDump(_x_) STTBX_Print (_x_)
#else
#define PrintDump(_x_)
#endif
/*=============================================================================
Definitions
=============================================================================*/
#define DDI_CH_I2C_DEVICEID (0)
#define I2C_BUS_ACCESS_TIMEOUT (100)
#define DDI_CH_I2C_WRITE_TIMEOUT (100)
#define DDI_CH_I2C_READ_TIMEOUT (100)// SN欄肺 message啊 救棵扼坷綽 鞏力甫 秦搬竅扁 困秦 10->100欄肺 藹闌 淋 20060111
#define DDI_CH_I2C_OK (0)
#define DDI_CH_I2C_SEND_BYTES (1)
#ifdef PHILIPS_TUNER
unsigned char DEMOD_REG[DEMOD_NUM_OF_REG] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/* 0 */ 0x21,0x97,0x00,0xD4, 0x53,0x0B,0xAA,0x2A, 0x09,0x00,0x00,0x00, 0x8C,0x02,0x00,0x00,
#if defined(CI_DVDC_S)
/* 1 */ 0x80,0x85,0x89,0x00, 0x00,0x00,0x00,0xB0, 0x80,0x40,0x61,0xB0, 0x00,0x00,0x00,0x00,
#else//0x11 : 8D->85 (conti. clock) on Dec-8, for new aston cam's aging stability
/* 1 */ 0x80,0x85,0x89,0x00, 0x00,0x00,0x00,0xB0, 0x80,0x40,0x61,0xB0, 0x00,0x00,0x00,0x00,
#endif
/* 2 */ 0x81,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
/* 3 */ 0x03,0x55,0x00,0x00, 0x78,0x00,0x30,0x44, 0x00,0x00,0x2F,0x00, 0x06,0x00,0x00,0x8A,
/* 4 */ 0x64,0x4F,0x43,0x00, 0x00,0x00,0x00,0x00, 0xE0,0x10,0x38,0xF0, 0x00,0x00,0x00,0x00,
/* 5 */ 0x00,0x00,0x00,0x00, 0x00,0x07
}; /* initial value */
#else
unsigned char DEMOD_REG[2][DEMOD_NUM_OF_REG] =
{
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/* 0 */ 0x21,0x97,0x00,0xD4, 0x53,0x2B,0xAA,0x2A, 0x09,0x00,0x00,0x00, 0x8C,0x02,0x00,0x00,
#if defined(CI_DVDC_S)
/* 1 */ 0x80,0x85,0x89,0x00, 0x00,0x00,0x00,0xB0, 0x80,0x40,0x61,0xB0, 0x00,0x00,0x00,0x00,
#else //0x11 : 8D->85 (conti. clock) on Dec-8, for new aston cam's aging stability
/* 1 */ 0x80,0x85,0x89,0x00, 0x00,0x00,0x00,0xB0, 0x80,0x40,0x61,0xB0, 0x00,0x00,0x00,0x00,
#endif
/* 2 */ 0x81,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
/* 3 */ 0x03,0x55,0x00,0x00, 0x78,0x00,0x30,0x44, 0x00,0x00,0x2F,0x00, 0x06,0x00,0x00,0x0A,
/* 4 */ 0x64,0x4F,0x43,0x00, 0x00,0x00,0x00,0x00, 0xE0,0x10,0x38,0xF0, 0x00,0x00,0x00,0x00,
/* 5 */ 0x00,0x00,0x00,0x00, 0x00,0x07
}
,
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/* 0 */ 0x21,0x97,0x00,0xD4, 0x53,0x2B,0xAA,0x2A, 0x09,0x00,0x00,0x00, 0x8C,0x02,0x00,0x00,
#if defined(CI_DVDC_S)
/* 1 */ 0x80,0x85,0x89,0x00, 0x00,0x00,0x00,0xB0, 0x80,0x40,0x61,0xB0, 0x00,0x00,0x00,0x00,
#else //0x11 : 8D->85 (conti. clock) on Dec-8, for new aston cam's aging stability
/* 1 */ 0x80,0x85,0x89,0x00, 0x00,0x00,0x00,0xB0, 0x80,0x40,0x61,0xB0, 0x00,0x00,0x00,0x00,
#endif
/* 2 */ 0x81,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
/* 3 */ 0x03,0x55,0x00,0x00, 0x78,0x00,0x30,0x44, 0x00,0x00,0x2F,0x00, 0x06,0x00,0x00,0x0A,
/* 4 */ 0x64,0x4F,0x43,0x00, 0x00,0x00,0x00,0x00, 0xE0,0x10,0x38,0xF0, 0x00,0x00,0x00,0x00,
/* 5 */ 0x00,0x00,0x00,0x00, 0x00,0x07
}
}; /* initial value */
#endif
/*=============================================================================
Export Variables
=============================================================================*/
#if defined(CHIPSET_ST)
extern ST_DeviceName_t g_I2CDeviceName[];//
#endif
/*=============================================================================
Variables
=============================================================================*/
#if defined(CHIPSET_ST)
STI2C_Handle_t g_hDEMOD_I2CHandle[MAXIMUM_NUMBER_UNITS];
STI2C_Handle_t g_hTUNER_I2CHandle[MAXIMUM_NUMBER_UNITS];
STI2C_Handle_t g_hDEMOD_Ter_I2CHandle[MAXIMUM_NUMBER_UNITS];
STI2C_Handle_t g_hTUNER_Ter_I2CHandle[MAXIMUM_NUMBER_UNITS];
#else
#endif
unsigned long g_hDemod_I2c_Addr[MAXIMUM_NUMBER_UNITS];
unsigned long g_hTuner_I2c_Addr[MAXIMUM_NUMBER_UNITS];
unsigned char g_hI2c_DeviceId[MAXIMUM_NUMBER_UNITS];
#define CH_I2C_TUNER_HANDLEID_SAT 0// 7710_sh
#define CH_I2C_DEMOD_HANDLEID_SAT 1// 7710_sh
#define CH_I2C_TUNER_HANDLEID_TER 2// 7710_sh
#define CH_I2C_DEMOD_HANDLEID_TER 3// 7710_sh
int DRV_Ch_Sat_I2c_Init(unsigned char unitId);
int DRV_Ch_Ter_I2c_Init(unsigned char unitId);
/*=============================================================================
Function : drv_ch_i2c_Init
Description : STI2C_Open
Input :
Output :
Return : TRUE if error, FALSE if success
=============================================================================*/
int DRV_Ch_I2c_Init(unsigned char unitId, unsigned long type)
{
switch(type)
{
case DDI_CHANNEL_TYPE_SAT:
DRV_Ch_Sat_I2c_Init(unitId);
break;
case DDI_CHANNEL_TYPE_TER:
DRV_Ch_Ter_I2c_Init(unitId);
break;
case DDI_CHANNEL_TYPE_CAB:
break;
default:
break;
}
}
/*=============================================================================
Function : drv_ch_i2c_Init
Description : STI2C_Open
Input :
Output :
Return : TRUE if error, FALSE if success
=============================================================================*/
int DRV_Ch_Sat_I2c_Init(unsigned char unitId)
{
int TotalError = DDI_CH_I2C_OK;
#if defined(CHIPSET_ST)
int ErrCode;
STI2C_OpenParams_t I2COpenParams;
I2COpenParams.BusAccessTimeOut = CHANNEL_I2C_ACCESS_TIMEOUT;
I2COpenParams.AddressType = STI2C_ADDRESS_7_BITS;
I2COpenParams.I2cAddress = g_hTuner_I2c_Addr[unitId];
// 7710_T ErrCode = STI2C_Open(g_I2CDeviceName[I2C_BACK_DEVICE], &I2COpenParams, &g_hTUNER_I2CHandle[unitId]);
ErrCode = I2C_Open(I2C_BACK, CH_I2C_TUNER_HANDLEID_SAT, g_hTuner_I2c_Addr[unitId]);
if(ErrCode != DDI_CH_I2C_OK){
PrintError(("drv_ch_Sat_i2c_Init() Error :<Tuner> STI2C_Open(%s) ErrCode : 0x%x \n" , I2C_GET_DEVICENAME(I2C_BACK) , ErrCode ));
TotalError |= ErrCode;
}
I2COpenParams.BusAccessTimeOut = CHANNEL_I2C_ACCESS_TIMEOUT;
I2COpenParams.AddressType = STI2C_ADDRESS_7_BITS;
I2COpenParams.I2cAddress = g_hDemod_I2c_Addr[unitId];
PrintDebug((">> drv_ch_Sat_i2c_Init Unit Id [%x]==> I2COpenParams_2.I2cAddress %x \n",unitId,I2COpenParams.I2cAddress ));
// 7710_T ErrCode = STI2C_Open(g_I2CDeviceName[I2C_BACK_DEVICE], &I2COpenParams, &g_hDEMOD_I2CHandle[unitId]);
ErrCode = I2C_Open(I2C_BACK, CH_I2C_DEMOD_HANDLEID_SAT,g_hDemod_I2c_Addr[unitId]);
if(ErrCode != DDI_CH_I2C_OK){
PrintError(("drv_ch_Sat_i2c_Init() Error :<Demod> STI2C_Open(%s , 0x%x) 0x%x \n" , I2C_GET_DEVICENAME(I2C_BACK) , g_hDEMOD_I2CHandle[unitId] , ErrCode ));
TotalError |= ErrCode;
}
#else
#endif
return TotalError;
}
int DRV_Ch_Ter_I2c_Init(unsigned char unitId)
{
int TotalError = DDI_CH_I2C_OK;
int ErrCode;
STI2C_OpenParams_t I2COpenParams;
g_hTuner_I2c_Addr[unitId]=0xC0;
g_hDemod_I2c_Addr[unitId]=0x86;
ErrCode = I2C_Open(I2C_BACK, CH_I2C_TUNER_HANDLEID_SAT, g_hTuner_I2c_Addr[unitId]);
if(ErrCode != ST_NO_ERROR){
PrintError(("DRV_Ch_Ter_I2c_Init() Error :<Tuner> STI2C_Open(%s , 0x%x) 0x%x \n" , I2C_GET_DEVICENAME(I2C_BACK) , ErrCode ));
TotalError |= ErrCode;
}
ErrCode = I2C_Open(I2C_BACK, CH_I2C_DEMOD_HANDLEID_SAT, g_hDemod_I2c_Addr[unitId]);
if(ErrCode != ST_NO_ERROR){
PrintError(("DRV_Ch_Ter_I2c_Init() Error :<Tuner> STI2C_Open(%s , 0x%x) 0x%x \n" ,I2C_GET_DEVICENAME(I2C_BACK) , ErrCode ));
TotalError |= ErrCode;
}
#if 0
#if defined(CHIPSET_ST)
int ErrCode;
STI2C_OpenParams_t I2COpenParams;
I2COpenParams.BusAccessTimeOut = CHANNEL_I2C_ACCESS_TIMEOUT;
I2COpenParams.AddressType = STI2C_ADDRESS_7_BITS;
I2COpenParams.I2cAddress = g_hTuner_I2c_Addr[unitId];
ErrCode = STI2C_Open(g_I2CDeviceName[I2C_BACK_DEVICE], &I2COpenParams, &g_hTUNER_Ter_I2CHandle[unitId]);
if(ErrCode != DDI_CH_I2C_OK){
PrintError(("drv_ch_ter_i2c_Init() Error :<Tuner> STI2C_Open(%s , 0x%x) 0x%x \n" , g_I2CDeviceName[unitId] , g_hTUNER_Ter_I2CHandle[unitId] , ErrCode ));
TotalError |= ErrCode;
}
I2COpenParams.BusAccessTimeOut = CHANNEL_I2C_ACCESS_TIMEOUT;
I2COpenParams.AddressType = STI2C_ADDRESS_7_BITS;
I2COpenParams.I2cAddress = g_hDemod_I2c_Addr[unitId];
ErrCode = STI2C_Open(g_I2CDeviceName[I2C_BACK_DEVICE], &I2COpenParams, &g_hDEMOD_Ter_I2CHandle[unitId]);
if(ErrCode != DDI_CH_I2C_OK){
PrintError(("drv_ch_ter_i2c_Init() Error :<Demod> STI2C_Open(%s , 0x%x) 0x%x \n" , g_I2CDeviceName[unitId] , g_hDEMOD_Ter_I2CHandle[unitId] , ErrCode ));
TotalError |= ErrCode;
}
#elif defined(SUPPORT_NEC_CHIP)
#else
PrintError(("[DRV_Ch_I2c_Write()] UNKNOWN CHIP\n\r"));
#endif
#endif
return TotalError;
} /* end of drv_ch_ter_i2c_Init */
/*=============================================================================
Function : drv_i2c_Write
Description : STI2C_Write
Input :
Output :
Return : TRUE if error, FALSE if success
=============================================================================*/
int DRV_Ch_I2c_Write(unsigned char unitId, unsigned long Handle, unsigned char *Buffer, unsigned long NumberToWrite )
{
int ErrCode;
unsigned int NumberWritten;
#if defined(CHIPSET_ST)
STI2C_Lock((STI2C_Handle_t)Handle,TRUE);
ErrCode = STI2C_Write((STI2C_Handle_t)Handle, (const unsigned char *)Buffer, (unsigned int)NumberToWrite, (unsigned int)DDI_CH_I2C_WRITE_TIMEOUT, &NumberWritten);
STI2C_Unlock((STI2C_Handle_t)Handle);
#elif defined(SUPPORT_NEC_CHIP)
MMAC_IIC_WRITE_IOPB iopb;
// buffer[0] -> subaddr buffer[1] -> data.
iopb.deviceNumber = (MMAC_IIC_DEV_NUM)g_hI2c_DeviceId[unitId];
iopb.data = &Buffer[1];
iopb.length = (unsigned long)(NumberToWrite-1);
iopb.slaveAddr = (unsigned char)g_hDemod_I2c_Addr[unitId];
iopb.numSubAddressBytes = MMAC_IIC_ONE_BYTE_ADDRESSING;
iopb.subAddr = (unsigned long)Buffer[0];
iopb.timeout = (unsigned long)DDI_CH_I2C_WRITE_TIMEOUT;
ErrCode = (int)MMAC_IIC_Write(&iopb);
#else
PrintError(("[DRV_Ch_I2c_Write()] UNKNOWN CHIP\n\r"));
#endif
if(ErrCode != DDI_CH_I2C_OK)
{
PrintError(("DRV_Ch_I2c_Write() Fails[%x] Handle:[%x] SubAddr:[%x] NtR:[%d]\n\r", ErrCode, Handle, Buffer[0], NumberWritten));
}
else
{
#ifdef CH_PRINT_DATA
int i=0;
PrintDump((" drv_i2c_Write() OK \n"));
for(i = 0; i < NumberToWrite; i++)
PrintDump(("[0x%02X]", Buffer[i]));
PrintDump(("\n"));
#endif
}
return ErrCode;
} /* end of drv_i2c_Write */
/*=============================================================================
Function : drv_i2c_Write
Description : STI2C_Write
Input :
Output :
Return : TRUE if error, FALSE if success
=============================================================================*/
int DRV_Ch_Tuner_I2c_Write(unsigned char unitId, unsigned long Handle, unsigned char *Buffer, unsigned long NumberToWrite )
{
int ErrCode;
unsigned int NumberWritten;
#if defined(CHIPSET_ST)
STI2C_Lock((STI2C_Handle_t)Handle,TRUE);
ErrCode = STI2C_Write((STI2C_Handle_t)Handle, Buffer, (unsigned int)NumberToWrite, (unsigned int)DDI_CH_I2C_WRITE_TIMEOUT, &NumberWritten);
STI2C_Unlock((STI2C_Handle_t)Handle);
#elif defined(SUPPORT_NEC_CHIP)
MMAC_IIC_WRITE_IOPB iopb;
// buffer[0] -> subaddr buffer[1] -> data.
iopb.deviceNumber = (MMAC_IIC_DEV_NUM)g_hI2c_DeviceId[unitId];
iopb.data = &Buffer[0];
iopb.length = (unsigned long)(NumberToWrite);
iopb.slaveAddr = (unsigned char)g_hTuner_I2c_Addr[unitId];
iopb.numSubAddressBytes = MMAC_IIC_ZERO_BYTE_ADDRESSING;
iopb.subAddr = (unsigned long)0;
iopb.timeout = (unsigned long)DDI_CH_I2C_WRITE_TIMEOUT;
ErrCode = (int)MMAC_IIC_Write(&iopb);
#else
PrintError(("[DRV_Ch_I2c_Write()] UNKNOWN CHIP\n\r"));
#endif
if(ErrCode != DDI_CH_I2C_OK)
{
PrintError(("DRV_Ch_Tuner_I2c_Write() Fails[%x] Handle:[%x] SubAddr:[%x] NtR:[%d]\n\r", ErrCode, Handle, Buffer[0], NumberWritten));
}
else
{
#ifdef CH_PRINT_DATA
int i=0;
PrintDump((" drv_i2c_Write() OK \n"));
for(i = 0; i < NumberToWrite; i++)
PrintDump(("[0x%02X]", Buffer[i]));
PrintDump(("\n"));
#endif
}
return ErrCode;
} /* end of drv_i2c_Write */
/*=============================================================================
Function : drv_i2c_Write
Description : STI2C_Write
Input :
Output :
Return : TRUE if error, FALSE if success
=============================================================================*/
int DRV_Ch_I2c_WriteNoStop(unsigned char unitId, unsigned long Handle, unsigned char *Buffer, unsigned long NumberToWrite)
{
int ErrCode;
unsigned int NumberWritten;
#if defined(CHIPSET_ST)
ErrCode = STI2C_WriteNoStop(Handle, Buffer, NumberToWrite, DDI_CH_I2C_WRITE_TIMEOUT, &NumberWritten);
#elif defined(SUPPORT_NEC_CHIP)
MMAC_IIC_WRITE_IOPB iopb;
// buffer[0] -> subaddr buffer[1] -> data.
iopb.deviceNumber = (MMAC_IIC_DEV_NUM)g_hI2c_DeviceId[unitId];
iopb.data = &Buffer[1];
iopb.length = (unsigned long)(NumberToWrite-1);
iopb.slaveAddr = (unsigned char)g_hDemod_I2c_Addr[unitId];
iopb.numSubAddressBytes = MMAC_IIC_ONE_BYTE_ADDRESSING;
iopb.subAddr = (unsigned long)Buffer[0];
iopb.timeout = (unsigned long)DDI_CH_I2C_WRITE_TIMEOUT;
ErrCode = (int)MMAC_IIC_Write(&iopb);
#else
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -