glowing 发表于 2017-3-20 00:16:28

mstar安卓电视方案kernel控制GPIO的方法

关于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_ADDR0x0f02UL
#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_ADDR0x0f0AUL
#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;
}

kbh2006@163.com 发表于 2017-3-20 08:49:32

小鱼永翔 发表于 2017-3-20 09:20:48

页: [1]
查看完整版本: mstar安卓电视方案kernel控制GPIO的方法