📄 hw_iomux.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 + -