SuperIC社区_

标题: kernel也可以控制GPIO [打印本页]

作者: Jack.Lin    时间: 2016-5-28 15:10
标题: 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;
}





作者: Jack.Lin    时间: 2016-6-1 16:32
希望对大家有用。
作者: AlexWeng    时间: 2016-7-3 19:17
牛牛牛!
作者: xuludestiny    时间: 2016-7-5 13:00
很有用,谢谢楼主,,
作者: steven    时间: 2016-8-26 12:14
这方法不太实用,代码移植性不好
作者: jayden    时间: 2016-8-31 14:25
靠,我自己找了好久找到,早看你帖子就好!!
作者: creass    时间: 2016-9-3 13:40
AlexWeng 发表于 2016-7-3 19:17
牛牛牛!

Jack 必须牛!
作者: Sunny    时间: 2016-9-6 16:18
学习了。
作者: Robby.zou    时间: 2016-9-30 11:03

作者: steven    时间: 2016-9-30 11:53
不是通用写法,没啥实际用处
作者: creass    时间: 2016-9-30 14:30
好东西要顶起来,大家说对不对吗?
作者: Alanz    时间: 2016-9-30 14:34

作者: xuludestiny    时间: 2016-10-17 14:42
解决方法有很多种,有没有用,介绍一种思路。
作者: demn61    时间: 2016-10-28 17:26
不错,对GPIO pin脚的控制有很好的参考意义!
作者: lixpjita    时间: 2016-12-28 14:32
赞一个~!
作者: AlexWeng    时间: 2017-4-15 22:47
不错不错,学习了!




欢迎光临 SuperIC社区_ (/) Powered by Discuz! X3.3