|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
关于kernel控制GPIO的方法往往比较复杂,这里介绍一种在mstar平台实际写过的一种简单方法。
Kernel是往往没有现成的GPIO控制接口,所以得自己造。
这里以在kernel控制PAD_GPIO_PM1,PAD_GPIO_PM5这两个IO口为例。例子中出现的寄存器要在你所用平台的CHIP资料上找。
#if defined(CONFIG_ARM) || defined(CONFIG_MIPS)
#define REG_MIPS_BASE 0xFD000000 //Use 8 bit addressing
#elif defined(CONFIG_ARM64)
extern ptrdiff_t mstar_pm_base;
#define REG_MIPS_BASE (mstar_pm_base)
#endif
#define MHal_GPIO_REG(addr) (*(volatile U8*)(REG_MIPS_BASE + (((addr) & ~1) << 1) + (addr & 1)))
#define PAD_GPIO_PM1 11
#define PAD_GPIO_PM1_ADDR 0x0f02UL
#define PAD_GPIO_PM1_OEN BIT0
#define PAD_GPIO_PM1_OUT BIT1
#define PAD_GPIO_PM1_IN BIT2
#define PAD_GPIO_PM5 15
#define PAD_GPIO_PM5_ADDR 0x0f0AUL
#define PAD_GPIO_PM5_OEN BIT0
#define PAD_GPIO_PM5_OUT BIT1
#define PAD_GPIO_PM5_IN BIT2
void GPIO_PM1_Set_High()
{
MHal_GPIO_REG(PAD_GPIO_PM1_ADDR) &= ~PAD_GPIO_PM1_OEN;
MHal_GPIO_REG(PAD_GPIO_PM1_ADDR) |= PAD_GPIO_PM1_OUT;
}
void GPIO_PM1_Set_Low()
{
MHal_GPIO_REG(PAD_GPIO_PM1_ADDR) &= ~PAD_GPIO_PM1_OEN;
MHal_GPIO_REG(PAD_GPIO_PM1_ADDR) &= ~PAD_GPIO_PM1_OUT;
}
void GPIO_PM5_Set_High()
{
MHal_GPIO_REG(PAD_GPIO_PM5_ADDR) &= ~PAD_GPIO_PM1_OEN;
MHal_GPIO_REG(PAD_GPIO_PM5_ADDR) |= PAD_GPIO_PM1_OUT;
}
void GPIO_PM5_Set_Low()
{
MHal_GPIO_REG(PAD_GPIO_PM5_ADDR) &= ~PAD_GPIO_PM1_OEN;
MHal_GPIO_REG(PAD_GPIO_PM5_ADDR) &= ~PAD_GPIO_PM1_OUT;
} |
|