📄 hw_i2sctrl.c
字号:
/****************************************************************
Copyright (C) 2007 RockChip All Rights Reserved.
File: I2sCtrl.c
Desc: I2S control
Author:LingZJ
Date: 2007/06/30
note:
$Log: HW_I2sCtrl.c,v $
Revision 1.2 2008/06/19 04:43:31 Administrator
代码整理!
Revision 1.1.1.1 2008/05/07 04:15:08 Administrator
no message
Revision 1.1.1.1 2008/03/06 13:29:05 Lingzhaojun
no message
Revision 1.6 2007/11/21 09:08:23 Huangzufang
录音提交
Revision 1.5 2007/10/25 08:53:52 Fangsaihong
更新录音程序
Revision 1.4 2007/10/23 08:24:12 Huangxinyu
调试后修改bug
Revision 1.3 2007/10/15 09:16:04 Huangxinyu
根据RK27提交修改driver
Revision 1.2 2007/10/08 02:38:44 Lingzhaojun
添加版本自动注释脚本
Revision 1.1.1.1 2007/09/27 09:06:01 cvsadmin
no message
1.2007-06-29,LingZJ,创建文件
2.2007-06-30,LingZJ,整理程序和变量,常量。
*****************************************************************/
#include "hw_include.h"
#include "HW_I2sCtrl.h"
UINT16 I2S_mode;
void I2sISR(void)
{
}
/**************************************************************************
* 函数名称: I2sStart
* 函数描述: 启动I2S 传输
* 入口参数: 传输方向,
TX: 输出到codec
RX: 输入到内部
* 出口参数: 无
* 返回值: 无
* 注释: 和HDMA 配合使用,
先启动HDMA , 再启动I2S, 以免数据丢失
***************************************************************************/
void I2sStart(I2S_Start_t TxOrRx)
{
UINT32 opr;
opr = Reset_Tx | Reset_Rx;
//reset I2S
WriteReg32(RegI2s_OPR, opr);
delay_nops(100);
// opr = ReadReg32(RegI2s_OPR);
// Intr_RegISR(INTC_I2S, I2sISR);
// Intr_Disable(INTC_I2S);
// we alway using request1 channel and start I2S transmit or receive
if (TxOrRx == I2S_Start_Rx)
opr = Req2_Rx | Reg2_enable | Req1_disable | Rx_start;
else
opr = Req1_Tx | Reg1_enable | Req2_disable | Tx_start;
//
// if(TxOrRx == I2S_Start_Rx)
// opr |= Rx_start;
// else
// opr |= Tx_start;
WriteReg32(RegI2s_OPR, opr);
}
/**************************************************************************
* 函数名称: I2sStop
* 函数描述: 停止I2S 传输
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
void I2sStop(void)
{
UINT32 opr;
opr = ReadReg32(RegI2s_OPR);
opr &= ~(Tx_start | Rx_start);
opr |= Req1_disable | Req2_disable;
WriteReg32(RegI2s_OPR, opr);
// HW_I2sResetTx();
// HW_I2sResetRx();
}
/**************************************************************************
* 函数名称: I2S_PowerOnInit
* 函数描述: I2S 开机初始化函数
* 入口参数: I2S 初始化模式,主模式或从模式
* 出口参数: 无
* 返回值: 无
* 注释: 目前主模式未完成调试
***************************************************************************/
void I2S_PowerOnInit(I2S_mode_t mode)
{
UINT32 contol;
// open i2s clock
Scu_ClockEnable(I2S_CLOCK);
Scu_ClockEnable(I2S_PCLOCK);
delay_nops(100);
//Intr_RegISR(INTC_I2S, I2sISR);
Intr_Disable(INTC_I2S);
//reset I2S and disable request
WriteReg32(RegI2s_OPR, Reset_Tx | Reset_Rx | Req1_disable | Req2_disable);
// disable all I2S interrupt
WriteReg32(RegI2s_IER, 0x00);
// set interface is 256fs, so LRCK/SCK = 64, and MCLK/SCK=4
// set sample data resolution is 16bit, and stereo mode, interface is I2S
contol = LRCK_rate64 | SCK_rate4 | Sample_16bit | Stereo_mode | IF_I2S;
// set master or slave mode
if (mode == I2S_MasterMode)
contol |= Master_mode;
else
contol |= Slave_mode;
WriteReg32(RegI2s_TXCTL, contol);
contol |= Clear_RxFIFO;
WriteReg32(RegI2s_RXCTL, contol);
// set FIFO HalfFull mode
contol = ReadReg32(RegI2s_FIFOSTS) & (~(0x0f << 16));
contol |= Tx_HalfFull | Rx_HalfFull; //Tx_AlmostEmpty|Rx_HalfFull;
WriteReg32(RegI2s_FIFOSTS, contol);
I2S_mode = (UINT16)mode;
}
/**************************************************************************
* 函数名称: I2S_DeInit
* 函数描述: I2S 反初始化函数
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释: 当不使用I2S 设备,如用内部codec时,开机必须先调用此函数
***************************************************************************/
void I2S_DeInit(void)
{
Intr_Disable(INTC_I2S);
Scu_ClockDisable(I2S_CLOCK);
Scu_ClockDisable(I2S_PCLOCK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -