⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw_i2sctrl.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 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 + -