网络上有讲到关于kernel如何控制GPIO的方法往往比较复杂,这里介绍一种我在mstar platform实际写过的一种简单方法。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; }