mtk平台的gpio控制

https://yq.aliyun.com/ziliao/273436

 

一.mtk平台的gpio控制 
1.1 内核中的gpio配置 
//设置gpio18为GPIO模式 
mt_set_gpio_mode(GPIO18, GPIO_MODE_GPIO);   
//设置gpio18方向为out 
mt_set_gpio_dir(GPIO18, GPIO_DIR_OUT); 
//设置gpio18高 
mt_set_gpio_out(GPIO18, GPIO_OUT_ONE);  //低是ZERO 
1.2 上层应用控制gpio的高低 
cong@msi:/work/mtk/temp/gpiotest$ cat gpiotest.c 
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <linux/ioctl.h>

#define dbmsg(fmt, args ...) printf("%s:%s[%d]: "fmt"\n", __FILE__,__FUNCTION__, __LINE__,##args)

#define GPIO_IOC_MAGIC 0x90
#define GPIO_IOCQMODE _IOR(GPIO_IOC_MAGIC, 0x01, uint32_t)
#define GPIO_IOCTMODE0 _IOW(GPIO_IOC_MAGIC, 0x02, uint32_t)
#define GPIO_IOCTMODE1 _IOW(GPIO_IOC_MAGIC, 0x03, uint32_t)
#define GPIO_IOCTMODE2 _IOW(GPIO_IOC_MAGIC, 0x04, uint32_t)
#define GPIO_IOCTMODE3 _IOW(GPIO_IOC_MAGIC, 0x05, uint32_t)
#define GPIO_IOCQDIR _IOR(GPIO_IOC_MAGIC, 0x06, uint32_t)
#define GPIO_IOCSDIRIN _IOW(GPIO_IOC_MAGIC, 0x07, uint32_t)
#define GPIO_IOCSDIROUT _IOW(GPIO_IOC_MAGIC, 0x08, uint32_t)
#define GPIO_IOCQPULLEN _IOR(GPIO_IOC_MAGIC, 0x09, uint32_t)
#define GPIO_IOCSPULLENABLE _IOW(GPIO_IOC_MAGIC, 0x0A, uint32_t)
#define GPIO_IOCSPULLDISABLE _IOW(GPIO_IOC_MAGIC, 0x0B, uint32_t)
#define GPIO_IOCQPULL _IOR(GPIO_IOC_MAGIC, 0x0C, uint32_t)
#define GPIO_IOCSPULLDOWN _IOW(GPIO_IOC_MAGIC, 0x0D, uint32_t)
#define GPIO_IOCSPULLUP _IOW(GPIO_IOC_MAGIC, 0x0E, uint32_t)
#define GPIO_IOCQINV _IOR(GPIO_IOC_MAGIC, 0x0F, uint32_t)
#define GPIO_IOCSINVENABLE _IOW(GPIO_IOC_MAGIC, 0x10, uint32_t)
#define GPIO_IOCSINVDISABLE _IOW(GPIO_IOC_MAGIC, 0x11, uint32_t)
#define GPIO_IOCQDATAIN _IOR(GPIO_IOC_MAGIC, 0x12, uint32_t)
#define GPIO_IOCQDATAOUT _IOR(GPIO_IOC_MAGIC, 0x13, uint32_t)
#define GPIO_IOCSDATALOW _IOW(GPIO_IOC_MAGIC, 0x14, uint32_t)
#define GPIO_IOCSDATAHIGH _IOW(GPIO_IOC_MAGIC, 0x15, uint32_t)
    
int main ( int argc, char *argv[] )
{
    int fd_gpio;
    int ret;
    
    fd_gpio = open("/dev/mtgpio",O_RDWR);
    if(fd_gpio < 0)
    {
     printf("fd_gpio open error\n");
        return -1;
    }

    while(1)
    {
        ret = ioctl(fd_gpio, GPIO_IOCSDATAHIGH, 18);
        sleep(1);
        ret = ioctl(fd_gpio, GPIO_IOCSDATAHIGH, 18);
        sleep(1);
    }

    close(fd_gpio);
    return 0;
} 1.3 应用代码 
  Linux内核---56.gpio控制__Linuxgpiotest.rar  (下载后改名为gpiotest.tar.gz) 
1.4 查看gpio状态 
/sys/class/misc/mtgpio/pin
130|root@78P01:/ # cat /sys/class/misc/mtgpio/pin 
PIN: [MODE] [PULL_SEL] [DIN] [DOUT] [PULL EN] [DIR] [IES]
3: 3 0 0 0 0 0 1 MI                  -->MODE这一项就是在code.dws中配的MODE
4: 3 0 0 0 0 1 1 MO
5: 3 0 1 0 0 1 1 CS
6: 3 0 0 0 0 1 1 CLK 二.利用sys控制gpio口 
2.1 代码如下 
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/ioport.h>
#include <linux/errno.h>
#include <linux/workqueue.h>
#include <linux/platform_device.h>
#include <linux/types.h>
#include <linux/io.h>
#include <mach/mt_gpio.h>

#define GPIO_POWER_EN GPIO123 //

typedef struct {
    int gpio_power;
}hello_priv;

static ssize_t hello_set_power(struct device *dev,struct device_attribute *attr,const char *buf, size_t count)
{
    hello_priv* prv = dev_get_drvdata(dev);
    if ('0' == buf[0]) //shutdown
    { //process: pin low-->high
     mt_set_gpio_out(prv->gpio_power, GPIO_OUT_ZERO);
      msleep(1500);
      mt_set_gpio_out(prv->gpio_power, GPIO_OUT_ONE);
      printk(KERN_NOTICE "cong: %s:%s[%d]: buf=%s", __FILE__,__FUNCTION__, __LINE__,buf); 
    }else if ('1' == buf[0]

以上是Linux内核---56.gpio控制__Linux的全部内容,在云栖社区的博客、问答、云栖号、人物、课程等栏目也有Linux内核---56.gpio控制__Linux的相关内容,欢迎继续使用右上角搜索按钮进行搜索linux内核 ,以便于您获取更多的相关知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值