📄 mt6189.c
字号:
/*******************************************************************************
*
* Filename:
* ---------
* MT6189.c
*
* Project:
* --------
* MAUI
*
* Description:
* ------------
*
* MT6189 I2C/3-wire Interface
*
* Author:
* -------
* -------
*
*******************************************************************************/
#include "l1audio_def.h"
#if (defined(MT6189A1) || defined(MT6189A2))
void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
void GPIO_InitIO(char direction, char port);
void GPIO_WriteIO(char data,char port);
char GPIO_ReadIO(char port);
void GPO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
void GPO_WriteIO(char data, char port);
#define USE_I2C
/* GPIO definition */
/// The following GPIO should be customized according to different platforms.
#define CRYCLK 41 /// GPIO #41: 32.768 kHz clock
#ifdef __CUST_NEW__
#ifdef USE_3_WIRE
extern const char gpio_fm_3wire_le_pin;
#endif
extern const char gpio_fm_i2c_sda_pin;
extern const char gpio_fm_i2c_scl_pin;
#ifdef USE_3_WIRE
#define LE gpio_fm_3wire_le_pin /// LE pin
#endif
#define SDA gpio_fm_i2c_sda_pin /// I2C data pin
#define SCL gpio_fm_i2c_scl_pin /// I2C clock pin
#else /* __CUST_NEW__ */
#define LE 4 /// GPIO #4: LE pin
#define SDA 53 /// GPIO #53: I2C data pin
#define SCL 24 /// GPIO #24: I2C clock pin
#endif /* __CUST_NEW__ */
#if defined(MT6205B) || defined(MT6208)
#ifdef __CUST_NEW__
extern const char gpio_fm_ext_switch_pin;
#define FM_SWITCH gpio_fm_ext_switch_pin /// external switch for FM/speech
#else /* __CUST_NEW__ */
#define FM_SWITCH 3 /// GPIO #3: external switch for FM/speech
#endif /* __CUST_NEW__ */
#define FM_PATH 0
#define SPEECH_PATH 1
void ExtSwitchInit(void) {
#ifndef __CUST_NEW__
GPIO_ModeSetup(FM_SWITCH, 0);
GPIO_InitIO(1, FM_SWITCH);
#endif /* __CUST_NEW__ */
GPIO_WriteIO(FM_SWITCH, SPEECH_PATH);
}
void SwitchExtFMPath(uint8 if_on) {
if (if_on) GPIO_WriteIO(FM_SWITCH, FM_PATH);
else GPIO_WriteIO(FM_SWITCH, SPEECH_PATH);
}
#endif
uint16 i2c_dummy_cnt;
#define I2C_DUMMY_DELAY(_delay) for (i2c_dummy_cnt = _delay; i2c_dummy_cnt!=0; i2c_dummy_cnt--)
uint8 const FM_RADIO_INPUT_LEVEL_THRESHOLD = 3;
void SerialCommCryClkOn(void)
{
#if !defined( MT6205B ) && !defined( MT6208 )
GPIO_ModeSetup(CRYCLK,3); /* 32.768kHz reference frequency */
#else
#ifdef __CUST_NEW__
extern const char gpio_fm_srclkena_pin;
GPO_ModeSetup(gpio_fm_srclkena_pin, 0);
GPO_WriteIO(1, gpio_fm_srclkena_pin);
#else /* __CUST_NEW__ */
/// Config SRCLKENA as GPO2 and set the output to 1 to keep 26M clock alive.
GPO_ModeSetup(2, 0);
GPO_WriteIO(1, 2);
#endif /* __CUST_NEW__ */
#endif
}
void SerialCommCryClkOff(void)
{
#if !defined( MT6205B ) && !defined( MT6208 )
GPIO_ModeSetup(CRYCLK,0);
#else
#ifdef __CUST_NEW__
extern const char gpio_fm_srclkena_pin;
GPO_ModeSetup(gpio_fm_srclkena_pin, 1);
#else /* __CUST_NEW__ */
/// Config GPO2 as SRCLKENA.
GPO_ModeSetup(2, 1);
#endif /* __CUST_NEW__ */
#endif
}
#ifdef USE_3_WIRE
void SerialCommInit(void)
{
#ifndef __CUST_NEW__
GPIO_ModeSetup(SCL,0);
GPIO_ModeSetup(SDA,0);
GPIO_ModeSetup(LE,0);
#endif /* __CUST_NEW__ */
GPIO_InitIO(1,SCL);
GPIO_InitIO(1,LE);
GPIO_WriteIO(1,SCL);
GPIO_InitIO(0,SDA);
GPIO_WriteIO(0,LE);
}
void SerialCommRelease(void)
{
GPIO_WriteIO(0,SCL);
GPIO_WriteIO(0,SDA);
GPIO_WriteIO(0,LE);
}
uint8 SerialCommTxByte(uint8 addr, uint8 data)
{
int16 i;
GPIO_WriteIO(1, LE);
GPIO_InitIO(1,SDA);
for(i=8; --i>=0;){
GPIO_WriteIO( 0, SCL);
GPIO_WriteIO(data&0x01, SDA);
data >>= 1;
#if defined( MT6228 )
I2C_DUMMY_DELAY(5);
#endif
GPIO_WriteIO( 1, SCL);
#if defined( MT6228 )
I2C_DUMMY_DELAY(5);
#endif
}
for(i=8; --i>=0;){
GPIO_WriteIO( 0, SCL);
GPIO_WriteIO(addr&0x01, SDA);
addr >>= 1;
#if defined( MT6228 )
I2C_DUMMY_DELAY(5);
#endif
GPIO_WriteIO( 1, SCL);
#if defined( MT6228 )
I2C_DUMMY_DELAY(5);
#endif
}
GPIO_InitIO(0,SDA);
GPIO_WriteIO(0, LE);
I2C_DUMMY_DELAY(10);
}
uint8 SerialCommRxByte(uint8 addr, uint8 *data)
{
int16 i;
uint16 dataRead=0;
*data = 0;
GPIO_WriteIO(1, LE);
GPIO_InitIO(1,SDA);
for(i=8; --i>=0;){
GPIO_WriteIO( 0, SCL);
GPIO_WriteIO(addr&0x01, SDA);
GPIO_WriteIO(1, SCL);
addr >>= 1;
#if defined( MT6228 )
I2C_DUMMY_DELAY(5);
#endif
}
GPIO_InitIO(0,SDA);
GPIO_WriteIO(0, LE);
for(i=0; i<8; i++){
GPIO_WriteIO( 0, SCL);
#if defined( MT6228 )
I2C_DUMMY_DELAY(5);
#endif
GPIO_WriteIO( 1, SCL);
dataRead = GPIO_ReadIO(SDA);
*data |= (dataRead << i);
}
I2C_DUMMY_DELAY(10);
}
#elif defined USE_I2C
void SerialCommInit(void)
{
#ifndef __CUST_NEW__
GPIO_ModeSetup(SCL,0);
GPIO_ModeSetup(SDA,0);
#endif /* __CUST_NEW__ */
GPIO_InitIO(1,SCL);
}
void SerialCommRelease(void)
{
GPIO_WriteIO(1,SCL);
GPIO_WriteIO(1,SDA);
}
/* Start sequence of I2C
SDA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -