blob: b5931bf39405cffcbc858f9df57ee5e203c541e9 [file] [log] [blame]
/*************************************************************************************
* Copyright (C) 2007-2016
* Copyright ? 2007 Marvell International Ltd.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
***************************************************************************************/
#include "ctypes.h"
#include "berlin_memmap.h"
#include "api_aio.h"
#include "avioDhub.h"
#include "aio.h"
#define GA_REG_WORD32_READ(addr, holder) (*(holder) = (*((volatile unsigned int *)(addr))))
#define GA_REG_WORD32_WRITE(addr, data) ((*((volatile unsigned int *)(addr))) = ((unsigned int)(data)))
#define PDM_ENABLE_ENABLE 1
#define PDM_ENABLE_DISABLE 0
#define I2S_MIC1_BASE (MEMMAP_I2S_REG_BASE + RA_AIO_MIC1)
#define I2S_MIC2_BASE (MEMMAP_I2S_REG_BASE + RA_AIO_MIC2)
#define I2S_MIC1_PRIAUD_CLKDIV (I2S_MIC1_BASE + RA_MIC_MICCTRL + RA_PRIAUD_CLKDIV)
#define I2S_MIC1_PRIAUD_CTRL (I2S_MIC1_BASE + RA_MIC_MICCTRL + RA_PRIAUD_CTRL)
#define I2S_MIC1_RXPORT (I2S_MIC1_BASE + RA_MIC_RXPORT)
#define I2S_MIC1_RSD0_CTRL (I2S_MIC1_BASE + RA_MIC_RSD0 + RA_AUDCH_CTRL)
#define I2S_MIC1_RSD0_DEBUGHI (I2S_MIC1_BASE + RA_MIC_RSD0 + RA_AUDCH_DEBUGHI)
#define I2S_MIC1_RSD0_DEBUGLO (I2S_MIC1_BASE + RA_MIC_RSD0 + RA_AUDCH_DEBUGLO)
#define I2S_MIC1_RSD1_CTRL (I2S_MIC1_BASE + RA_MIC_RSD1 + RA_AUDCH_CTRL)
#define I2S_MIC1_RSD1_DEBUGHI (I2S_MIC1_BASE + RA_MIC_RSD1 + RA_AUDCH_DEBUGHI)
#define I2S_MIC1_RSD1_DEBUGLO (I2S_MIC1_BASE + RA_MIC_RSD1 + RA_AUDCH_DEBUGLO)
#define I2S_PDM_MIC_SEL_CTRL (MEMMAP_I2S_REG_BASE + RA_AIO_PDM_MIC_SEL)
#define I2S_PDM_IOSEL_PDMCLK (MEMMAP_I2S_REG_BASE + RA_AIO_IOSEL + RA_IOSEL_PDMCLK)
#define I2S_PDM_IOSEL_PDM (MEMMAP_I2S_REG_BASE + RA_AIO_IOSEL + RA_IOSEL_PDM)
#define I2S_MIC1_PDM_CTRL1 (I2S_MIC1_BASE + RA_MIC_PDM_CTRL1)
#define I2S_MIC1_PDM_CTRL2 (I2S_MIC1_BASE + RA_MIC_PDM_CTRL2)
#define I2S_MIC2_PDM_CTRL1 (I2S_MIC2_BASE + RA_MIC_PDM_CTRL1)
#define I2S_MIC2_PDM_CTRL2 (I2S_MIC2_BASE + RA_MIC_PDM_CTRL2)
void Avio_SetHdclk()
{
UNSG32 address;
T32HDMI_HDPORT reg;
address = MEMMAP_I2S_REG_BASE+RA_AIO_HDMI+RA_HDMI_HDPORT;
GA_REG_WORD32_READ(address, &(reg.u32));
reg.uHDPORT_TXSEL = 0; // HD clk is selected
GA_REG_WORD32_WRITE(address, (reg.u32));
return;
}
void PdmSetup(unsigned char host, unsigned char clk_src, unsigned char clk_div,
unsigned char cycle_mode, unsigned char ch_bits, unsigned char latch_mode, unsigned char mute)
{
UNSG32 address;
if (avioDhubChMap_ag_MIC0_W_A0 == host) {
address = I2S_MIC1_PDM_CTRL1;
}
else{
address = I2S_MIC2_PDM_CTRL1;
}
T32MIC_PDM_CTRL1 reg;
GA_REG_WORD32_READ(address, &(reg.u32));
reg.uPDM_CTRL1_ENABLE=0;
GA_REG_WORD32_WRITE(address, (reg.u32));
GA_REG_WORD32_READ(address, &(reg.u32));
reg.uPDM_CTRL1_MCLKSEL = clk_src; //MCLK PRI
reg.uPDM_CTRL1_CLKDIV = clk_div;
reg.uPDM_CTRL1_CLKEN = 1;
reg.uPDM_CTRL1_INVCLK_OUT = 0;
reg.uPDM_CTRL1_INVCLK_INT = 1;
reg.uPDM_CTRL1_RLSB = 1; //LSB first
reg.uPDM_CTRL1_LATCH_MODE = latch_mode;
reg.uPDM_CTRL1_MODE = cycle_mode; //DDR mode
reg.uPDM_CTRL1_RDM = ch_bits; //32BIT
reg.uPDM_CTRL1_MUTE = mute;
GA_REG_WORD32_WRITE(address, (reg.u32));
/* set the PDM latch mode counter as 3 */
T32MIC_PDM_CTRL2 reg2;
reg2.uPDM_CTRL2_FDLT = 0x3;
reg2.uPDM_CTRL2_RDLT = 0x3;
address = I2S_MIC1_PDM_CTRL2;
GA_REG_WORD32_WRITE(address, (reg2.u32));
}
void PdmRxStart(int host, int chan)
{
UNSG32 base, address;
if (avioDhubChMap_ag_MIC0_W_A0 == host) {
base = I2S_MIC1_BASE;
}
else {
base = I2S_MIC2_BASE;
}
PdmSetEn(host, PDM_ENABLE_DISABLE);
T32MIC_RXDATA reg0;
address = base + RA_MIC_RXDATA;
GA_REG_WORD32_READ(address, &(reg0.u32));
reg0.uRXDATA_HBR = 0;
GA_REG_WORD32_WRITE(address,(reg0.u32));
T32MIC_HBRDMAP reg1;
address = base + RA_MIC_HBRDMAP;
GA_REG_WORD32_READ(address, &(reg1.u32));
reg1.uHBRDMAP_PORT0 = chan;
GA_REG_WORD32_WRITE(address,(reg1.u32));
T32AIO_PDM_MIC_SEL reg2;
address = I2S_PDM_MIC_SEL_CTRL;
GA_REG_WORD32_READ(address, &(reg2.u32));
reg2.uPDM_MIC_SEL_CTRL = 1; // 0-I2S Rx MIC mode, 1-PDM MIC mode
GA_REG_WORD32_WRITE(address, (reg2.u32));
T32IOSEL_PDMCLK reg3;
address = I2S_PDM_IOSEL_PDMCLK;
GA_REG_WORD32_READ(I2S_PDM_IOSEL_PDMCLK, &(reg3.u32));
reg3.uPDMCLK_SEL = 1; // 0-no clk out, 1 - clk out
GA_REG_WORD32_WRITE(address, (reg3.u32));
T32IOSEL_PDM reg4;
address = I2S_PDM_IOSEL_PDM;
GA_REG_WORD32_READ(address, &(reg4.u32));
reg4.uPDM_GENABLE = 1; // PDM GLOBAL Enable
GA_REG_WORD32_WRITE(address, (reg4.u32));
PdmSetEn(host, PDM_ENABLE_ENABLE);
return;
}
void PdmSetEn(int host, int enable)
{
UNSG32 address;
if (avioDhubChMap_ag_MIC0_W_A0 == host) {
address = I2S_MIC1_PDM_CTRL1;
}
else{
address = I2S_MIC2_PDM_CTRL1;
}
T32MIC_PDM_CTRL1 reg;
GA_REG_WORD32_READ(address, &(reg.u32));
reg.uPDM_CTRL1_ENABLE = enable;
GA_REG_WORD32_WRITE(address, (reg.u32));
}
void PdmMuteEn(int host, int mute)
{
UNSG32 address;
T32MIC_PDM_CTRL1 reg;
if (avioDhubChMap_ag_MIC0_W_A0 == host) {
address = I2S_MIC1_PDM_CTRL1;
}
else{
address = I2S_MIC2_PDM_CTRL1;
}
GA_REG_WORD32_READ(address, &(reg.u32));
reg.uPDM_CTRL1_MUTE = mute;
GA_REG_WORD32_WRITE(address, (reg.u32));
return;
}