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

📄 hw_iomux.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/*********************************************************************************
*     Copyright (C),2004-2005,  Fuzhou Rockchip Co.,Ltd.
*         All Rights Reserved
*          V1.00
* FileName :  Hw_iomux.c
* Author :  lzy
* Description:

* History  :
*   <author>  <time>    <version>    <desc>
*    lzy     07/9/14       1.0    ORG
*
$Log: hw_iomux.c,v $
Revision 1.5  2008/07/10 01:59:04  DDL
增加对camera模块的支持  由宏ROCK_CAMRA隔离

dengdl

Revision 1.4  2008/06/19 04:43:31  Administrator
代码整理!

Revision 1.3  2008/06/06 09:27:18  HJK
增加TVOUT功能

Revision 1.2  2008/05/15 08:02:04  HXY
增加VIP/HADC的Iomux接口

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.9  2007/11/26 14:40:15  Huangxinyu
MCU16_PANEL的IOMUX修改

Revision 1.8  2007/11/20 14:14:22  Nizhenyu
修改LCDC使用IO的设置

Revision 1.7  2007/11/17 07:21:47  Linzhengyuan
更改 PWM iomux bug

Revision 1.6  2007/10/20 04:46:31  Huangshilin
for RK2700

Revision 1.5  2007/10/17 01:51:39  Huangxinyu
增加iomux接口

Revision 1.4  2007/10/15 09:16:21  Huangxinyu
根据RK27提交修改driver

Revision 1.3  2007/10/08 02:38:44  Lingzhaojun
添加版本自动注释脚本


*********************************************************************************/
#include "hw_include.h"
#include "hw_iomux.h"

/**************************************************************************
* 函数名称:  IOMUX_SetI2CType
* 函数描述:  设定I2C 的口线方式
* 入口参数:
                            I2CIO_TYPE_t 枚举如下:
                            I2C_Internal:  内部I2C,控制内部codec使用
                            I2C_External:  外部I2C, 外部i2c设备使用
                            I2C_IOPORT:  设置为IO口模式
                            I2C_CE:         设置为flash ce模式
* 出口参数:  无
* 返回值:        无
* 注释:
***************************************************************************/
void IOMUX_SetI2CType(I2CIO_TYPE_t i2ctype)
{
    UINT32 config;

    config = ReadReg32(RegIOMuxA);

    config &= ~IOMUX_I2C_MASK;

    switch (i2ctype)
    {
        case I2C_IOPORT:
            {
                config |= IOMUX_I2C_INTERNAL | IOMUX_PB7 | IOMUX_PB6;
                break;
            }
        case I2C_External:
            {
                config |= IOMUX_I2C_EXTERNAL | IOMUX_SDA | IOMUX_SCL;
                break;
            }
        case I2C_Internal:
            {
                config |= IOMUX_I2C_INTERNAL | IOMUX_CE3 | IOMUX_CE2;
                break;
            }
        case I2C_CE:
        default:
            {
                config |= IOMUX_I2C_INTERNAL | IOMUX_CE3 | IOMUX_CE2;
                break;
            }
    }

    WriteReg32(RegIOMuxA, config);

}

/**************************************************************************
* 函数名称:  IOMUX_SetPanelType
* 函数描述:  设定液晶相关的口线
* 入口参数:  PANEL_TYPE_t
                            MCU18_PANEL:        MCU 18 位屏
                            MCU16_PANEL:        MCU 16 位屏,和MCU 18 位屏代码中没有区分
                            pRGB_PANEL:          并行RGB 18 位屏
                            pRGB_PANEL_DEN:     并行RGB 18 位屏, 带 DATA EN  口
                            sRGB_PANEL:          串行RGB 18 位屏
* 出口参数:  无
* 返回值:        无
* 注释:
***************************************************************************/
static void IOMUX_SetPanelType(UINT32 paneltype)
{
    UINT32 configa, configb;

    configa = ReadReg32(RegIOMuxA);
    configb = ReadReg32(RegIOMuxB);

    configa &= ~(IOMUX_VSYNC_LCDCS | IOMUX_LCD_DEN | IOMUX_LCD_D22 | 0xff);
    configb &= ~(IOMUX_LCD_DATA);

// D18 , D20 , D22 is no using in package chip, so we alway set LCD port
    configa |= IOMUX_LCD_D18 | IOMUX_LCD_D20 | IOMUX_LCD_D22;

// in RK27xx application ,  we can set VSYNC_LCDCS  as GPIO port when using MCU panel.
// in RK2700 demo board, VSYNC_LCDCS is always using in LCD
    switch (paneltype)
    {
        case pRGB_PANEL:
            {
                configa |= IOMUX_VSYNC_LCDCS | IOMUX_PA6 | IOMUX_LCD_D17 | IOMUX_LCD_D16;
                configb |= IOMUX_LCD_DATA;
                break;
            }
        case pRGB_PANEL_DEN:
            {
                configa |= IOMUX_VSYNC_LCDCS | IOMUX_LCD_DEN | IOMUX_LCD_D17 | IOMUX_LCD_D16;
                configb |= IOMUX_LCD_DATA;
                break;
            }
        case sRGB_PANEL:
            {
                configa |= IOMUX_VSYNC_LCDCS | IOMUX_PA6 | IOMUX_PA1 | IOMUX_PA0;
#ifdef TVOUT_PANEL
                configb |= IOMUX_LCD_DATA;
#else
                configb |= IOMUX_PE0_7;
#endif
                break;
            }
        case MCU16_PANEL:
            {
#ifdef TVOUT_PANEL
                configa |= IOMUX_VSYNC_LCDCS | IOMUX_PA6 | IOMUX_LCD_D17 | IOMUX_LCD_D16;
#else
                configa |= IOMUX_PA7 | IOMUX_PA6 | IOMUX_PA1 | IOMUX_PA0;
#endif
                configb |= IOMUX_LCD_DATA;
                break;
            }
        case MCU18_PANEL:
        default:
            {
#ifdef TVOUT_PANEL
                configa |= IOMUX_VSYNC_LCDCS | IOMUX_PA6 | IOMUX_LCD_D17 | IOMUX_LCD_D16;
#else
                configa |= IOMUX_PA7 | IOMUX_PA6 | IOMUX_LCD_D17 | IOMUX_LCD_D16;
#endif
                configb |= IOMUX_LCD_DATA;
                break;
            }
    }

    WriteReg32(RegIOMuxA, configa);
    WriteReg32(RegIOMuxB, configb);

}

/**************************************************************************
* 函数名称:  IOMUX_SetI2SType
* 函数描述:  设置I2S   口线形式
* 入口参数:  CODEC_TYPE_t
                            INTERNAL_CODEC:  内部audio codec
                            WM8750_CODEC:   外部wm8750 codec
                            WM8987_CODEC:   外部wm8987 codec
* 出口参数:  无
* 返回值:        无
* 注释:
***************************************************************************/
void IOMUX_SetI2SType(UINT32 codectype)
{
    UINT32 configa, configb;

    configa = ReadReg32(RegIOMuxA);
    configb = ReadReg32(RegIOMuxB);

    configa &= ~(IOMUX_I2S_EXTERNAL);
    configb &= ~(IOMUX_I2S_MCLK | IOMUX_I2S_SDO | IOMUX_I2S_SDI | IOMUX_I2S_LRCK | IOMUX_I2C_BCK);

    switch (codectype)
    {
        case INTERNAL_CODEC:
            {
                configa |= IOMUX_I2S_INTERNAL;
                configb |= IOMUX_PC6 | IOMUX_PC5 | IOMUX_PC4 | IOMUX_PC3 | IOMUX_PC2;
                break;
            }
        default:
            {
                configa |= IOMUX_I2S_EXTERNAL;
                configb |= IOMUX_I2S_MCLK | IOMUX_I2S_SDO | IOMUX_I2S_SDI | IOMUX_I2S_LRCK | IOMUX_I2C_BCK;
                break;
            }
    }
    WriteReg32(RegIOMuxA, configa);
    WriteReg32(RegIOMuxB, configb);
}

/**************************************************************************
* 函数名称:  IOMUX_SetUart0Port
* 函数描述:  设置UART0   口线形式
* 入口参数:  UART0_TYPE_t:
                            GPIO_TYPE
                            LCD_TYPE
                            UART_TYPE
* 出口参数:  无
* 返回值:        无
* 注释:
***************************************************************************/
void IOMUX_SetUart0Port(UART0IO_TYPE_t type)
{
    UINT32 configa;

    configa = ReadReg32(RegIOMuxA);

    configa &= ~0x0f;

    if (type > 2) type = 0;

    configa |= (type << 2) | type;

    WriteReg32(RegIOMuxA, configa);
}

/**************************************************************************
* 函数名称:  IOMUX_SetUart1Port
* 函数描述:  设置UART1   口线形式
* 入口参数:  UART0_TYPE_t:
                            GPIO_TYPE
                            LCD_TYPE
                            UART_TYPE
* 出口参数:  无
* 返回值:        无
* 注释:
***************************************************************************/
void IOMUX_SetUart1Port(UART1IO_TYPE_t type)
{
    UINT32 configb;

    configb = ReadReg32(RegIOMuxB);

    configb &= ~(0x0f << 6);

    if (type > 2) type = 0;

    configb |= (type << 8) | (type << 6);

    WriteReg32(RegIOMuxB, configb);
}

/**************************************************************************
* 函数名称:  IOMUX_SetPwmPort
* 函数描述:  设置PWM   口线形式
* 入口参数:  PWM_TYPE_t:
                            GPIO_TYPE
                            PWM_TYPE
* 出口参数:  无
* 返回值:        无
* 注释:
***************************************************************************/
void IOMUX_SetPwmPort(PWM_CH_t chn, PWM_TYPE_t type)
{
    UINT32 configb;

    configb = ReadReg32(RegIOMuxB);

    configb &= ~(0x01 << 11 << chn);

    configb |= type << 11 << chn;

    WriteReg32(RegIOMuxB, configb);
}

/**************************************************************************
* 函数名称:  IOMUX_SetSDPort
* 函数描述:  设置SD  SPI  口线形式
* 入口参数:  SD_TYPE_t:
                    SD_GPIO_TYPE,
                    SD_SD_TYPE,
                    SD_SPI_TYPE
* 出口参数:  无
* 返回值:    无
* 注释:
***************************************************************************/
void IOMUX_SetSDPort(SD_TYPE_t type)
{
    UINT32 configa;

    configa = ReadReg32(RegIOMuxA);

    configa &= ~(0x03 << 12);

    configa |= (type << 12);

    WriteReg32(RegIOMuxA, configa);
}

/**************************************************************************
* 函数名称:  IOMUX_SetVipType
* 函数描述:  设置 VIP/HADC 口线形式
* 入口参数:  VIP_TYPE_t:
     VIP_VIP_TYPE,
     VIP_HADC_TYPE
* 出口参数:  无
* 返回值:  无
* 注释:
***************************************************************************/
void IOMUX_SetVipType(VIP_TYPE_t type)
{
    UINT32 configb;

    configb = ReadReg32(RegIOMuxB);

    configb &= ~(0x1 << 22);

    configb |= (type << 22);

    WriteReg32(RegIOMuxB, configb);

}

/**************************************************************************
* 函数名称:  IOMUX_SetVipClkType
* 函数描述:  设置VIP Clock Out口线形式
* 入口参数:  VIPCLK_TYPE_t:
     VIPCLK_PF0_TYPE,
     VIPCLK_VIP_TYPE
* 出口参数:  无
* 返回值:  无
* 注释:
***************************************************************************/
void IOMUX_SetVipClkType(VIPCLK_TYPE_t          type)
{
    UINT32 configb;

    configb = ReadReg32(RegIOMuxB);

    configb &= ~(0x1 << 16);

    configb |= (type << 16);

    WriteReg32(RegIOMuxB, configb);
}

/**************************************************************************
* 函数名称:  IOMUX_SetSDRAMType
* 函数描述:  设定SDRAM 口线
* 入口参数:  SDRAM_SIZE_t
                            SDRAM_1x16:  1x16 sdram
                            SDRAM_4x16:   4x16 sdram
                            SDRAM_8x16:   8x16 sdram
                            SDRAM_16x16:  16x16 sdram
* 出口参数:  无
* 返回值:        无
* 注释:
***************************************************************************/
static void IOMUX_SetSDRAMType(SDRAM_SIZE_t  size)
{
    UINT32  configb;

    configb = ReadReg32(RegIOMuxB);

    switch (size)
    {
        case SDRAM_1x16:
            {
                configb |= IOMUX_PF2 | IOMUX_PF1;
                break;
            }
        case SDRAM_8x16:
            {
                configb |= IOMUX_PF2 | IOMUX_A11;
                break;
            }
        case SDRAM_16x16:
            {
                configb |= IOMUX_A12 | IOMUX_A11;
                break;
            }
        case SDRAM_4x16:
        default:
            {
                configb |= IOMUX_PF2 | IOMUX_A11;
                break;
            }
    }
    WriteReg32(RegIOMuxB, configb);
}


/**************************************************************************
* 函数名称:  IOMUX_PowerOnInit
* 函数描述:  初始化芯片的io mux 的设置
* 入口参数:  无
* 出口参数:  无
* 返回值:        无
* 注释:           更改hw_define.h 可以更改io的初始化状态
                          不得在不更改宏定义情况下直接修改此函数
                          默认i2c 对内,口线为flash CE,
                         调用的先后顺序会影响口线的状态,
                         没有使用到的可以不进行设置
***************************************************************************/
void IOMUX_PowerOnInit(void)
{
    unsigned int configa = 0;
    unsigned int configb = 0;

    configa |= IOMUX_I2C_INTERNAL | IOMUX_CE3 | IOMUX_CE2 | IOMUX_CE1;

#ifdef SD_CARD_EN
    configa |= IOMUX_SD;
#else
    configa |= IOMUX_PB05;
#endif

    WriteReg32(RegIOMuxA, configa);

    configb |= IOMUX_PD3 | IOMUX_PF4 | IOMUX_PF3
               | IOMUX_PF0 | IOMUX_PD2 | IOMUX_PD1 | IOMUX_PD0 | IOMUX_PC7;

    WriteReg32(RegIOMuxB, configb);

#ifdef PWM_BL_EN
    IOMUX_SetPwmPort(PWM_CH0, PWM_PWM_TYPE);
#endif

#if(CHIPTYPE == RK2700)
    IOMUX_SetUart1Port(UART1_UART_TYPE);
#elif (CHIPTYPE == RK2708)
	IOMUX_SetVipType(VIP_VIP_TYPE);
	IOMUX_SetVipClkType(VIP_VIP_TYPE);
#elif (CHIPTYPE == RK2710)
    IOMUX_SetVipType(VIP_HADC_TYPE);
    IOMUX_SetPwmPort(PWM_CH1, PWM_PWM_TYPE);
#endif

    IOMUX_SetI2CType(I2C_Internal);
    IOMUX_SetI2SType(CODEC_TYPE);
    IOMUX_SetUart0Port(UART0_LCD_TYPE);
    IOMUX_SetPanelType(LCDTYPE);
    IOMUX_SetSDPort(SD_SD_TYPE);
    IOMUX_SetSDRAMType(SDRAM_SIZE);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -