LCD液晶发烧友
LCD显示驱动开发与视频处理技术交流博客!

kernel也可以控制GPIO

网络上有讲到关于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; }

本站部份内容来自互联网,如有侵犯您的权益请联我们删除!液晶发烧友 » kernel也可以控制GPIO
分享到: 更多 (0)

LCD液晶发烧友技术博客!

联系我们