📄 wm8775.c
字号:
#include <stdio.h>//Standard 86xx includes#define ALLOW_OS_CODE 1#include "rmdef/rmdef.h"#include "llad/include/gbus.h"//helper includes#include "../helper/helper.h"#include "wm8775.h"static RMstatus wm_wReg(WM8775_CONFIG* pC, RMuint8 reg, RMuint16 data){ RMuint8 b[2]; RMuint32 byteCount = 2; b[0] = ((reg & 0x1F) << 1) | ((data & 0x0100)?1:0); b[1] = data & 0xFF; printf("0x%x 0x%x\n", b[0], b[1]); return I2Cal_Write( pC->pI2Cal_Context, I2C_WR_ADDR(pC->uI2CAddress), b, &byteCount );}// External API//------------------------------------------------------------------------------RMstatus wm8775_reset(WM8775_CONFIG *pW){ return wm_wReg(pW, 0x17, 0);}RMstatus wm8775_powerDown(WM8775_CONFIG *pW, RMuint8 powerDown){ RMstatus s; if( powerDown ) { if( (s = wm_wReg(pW, 0x0D, 0x42)) != RM_OK ) { DPRINT(("wm8775_power() powerdown ADC and input Mux failed\n")); return s; } // power down ALL return wm_wReg(pW, 0x0D, 0x43); } else { // power up ALL return wm_wReg(pW, 0x0D, 0x00); }}RMstatus wm8775_mode(WM8775_CONFIG *pW, RMbool masterMode, WM8775_ADCRATE adcRate, RMbool setOversampleFrom128xTo64x){ RMuint16 controlw = 0x0000; switch( adcRate ) { case wm8775_adc_256fs: controlw = 0x02; break; case wm8775_adc_384fs: controlw = 0x03; break; case wm8775_adc_512fs: controlw = 0x04; break; case wm8775_adc_768fs: controlw = 0x05; break; default: return RM_INVALID_PARAMETER; } if( setOversampleFrom128xTo64x ) controlw |= 0x0008; if( masterMode ) controlw |= 0x0100; return wm_wReg(pW, 0x0C, controlw);}RMstatus wm8775_audioInterface(WM8775_CONFIG *pW, WM8775_INTERFACE_FORMAT format, RMbool bitclkPolarityInvert, WM8775_WORD_LENGTH wl, RMbool adcHighPassFilterDisable){ RMuint16 controlw = 0x0000; switch( format) { case wm8775_if_rightjust: controlw = 0x0000; break; case wm8775_if_leftjust: controlw = 0x0001; break; case wm8775_if_i2s: controlw = 0x0002; break; case wm8775_if_dsp_early: controlw = 0x0003; break; case wm8775_if_rightjust_adclrcInv: controlw = 0x0004; break; case wm8775_if_leftjust_adclrcInv: controlw = 0x0005; break; case wm8775_if_i2s_adclrcInv: controlw = 0x0006; break; case wm8775_if_dsp_late: controlw = 0x0007; break; default: return RM_INVALID_PARAMETER; } switch (wl) { case wm8775_wl_16bit: break; case wm8775_wl_20bit: controlw |= (0x01 << 4); break; case wm8775_wl_24bit: controlw |= (0x02 << 4); break; case wm8775_wl_32bit: if( (format == wm8775_if_rightjust) || (format == wm8775_if_rightjust_adclrcInv) ) { DPRINT(("wm8775_interface() right justified + 32 bit Mode not supported\n")); return RM_INVALID_PARAMETER; } controlw |= (0x03 << 4); break; default: return RM_INVALID_PARAMETER; } if( bitclkPolarityInvert ) controlw |= 0x0008; if( adcHighPassFilterDisable ) controlw |= 0x0100; return wm_wReg(pW, 0x0B, controlw);}RMstatus wm8775_gain(WM8775_CONFIG *pW, RMuint8 leftGain, RMuint8 rightGain, RMbool enaLeftZeroX, RMbool enaRightZeroX){ RMstatus s; RMuint16 word = leftGain; if( (s = wm_wReg(pW, 0x19, word | ((enaLeftZeroX?1:0) << 8))) != RM_OK ) return s; //left word = rightGain; return wm_wReg(pW, 0x1A, word | ((enaRightZeroX?1:0) << 8) ); // right}RMstatus wm8775_inputMuxControl(WM8775_CONFIG *pW, RMuint8 inputMask, RMbool leftMute, RMbool rightMute, RMbool linkRight2LeftGain){ RMuint16 controlw = 0x0000; if( inputMask & 0xF0 ) return RM_INVALID_PARAMETER; else controlw = inputMask; if( leftMute ) controlw |= 0x0080; if( rightMute ) controlw |= 0x0040; if( linkRight2LeftGain ) controlw |= 0x0100; return wm_wReg(pW, 0x15, controlw);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -