Ralink RT5350 GPIO配置(坑了个大爹的)

这几天在做Ranlink RT5350的模块,sdk比较方便,几个命令就基本上完成了所有的配置。但是小弟不才还是遇到了问题:在内核开了GPIO Support的情况下,不管如何调试管脚都不跳变。应用层测试程序如下:


#include<stdio.h>
#include "ralink_gpio.h"
#include <fcntl.h>


#define devnode "/dev/gpio"
#define USERDEFINEDGPIOPIN 1 


int main()
{
    int fd = 0;
    int res = 0;
    struct file * devfile;
    fd = open(devnode,O_RDWR);
    if(fd < 0)
    {
        perror("fd open error\r\n");
        exit(-1);
    }
    printf("fd = %d",fd);
    res = ioctl(fd,RALINK_GPIO_SET_DIR_OUT,RALINK_GPIO(USERDEFINEDGPIOPIN));
    if(res < 0)
    {
        perror("ioctl error\r\n");
        exit(-1);
    }
    while(1)
    {
        res = ioctl(fd ,RALINK_GPIO_SET,RALINK_GPIO(USERDEFINEDGPIOPIN));
        if(res < 0)
        {
            perror("ioctl error\r\n");
            exit(-1);
        }
        printf("io up\r\n");
        usleep(1000);
        res = ioctl(fd,RALINK_GPIO_CLEAR, RALINK_GPIO(USERDEFINEDGPIOPIN));
        if(res < 0)
        {
            perror("ioctl error\r\n");
            exit(-1);
        }
        printf("io down\r\n");
        usleep(1000);
    }

    return 0;
}

测试程序写得比较简陋,不要见怪。
在相应的管脚上一直没有反应。

后来一直在网上找资料,终于有些眉目:
GPIO_1是I2C的复用引脚,而系统默认的正常模式(复用端口模式),所以需要将GPIO_1更改为GPIO模式。

在驱动init下找到了关于GPIO_MODE的操作。

    //config these pins to gpio mode
    gpiomode = le32_to_cpu(*(volatile u32 *)(RALINK_REG_GPIOMODE));
#if !defined (CONFIG_RALINK_RT2880)
    gpiomode &= ~0x1C;  //clear bit[2:4]UARTF_SHARE_MODE
#endif
    gpiomode |= RALINK_GPIOMODE_DFT;
    *(volatile u32 *)(RALINK_REG_GPIOMODE) = cpu_to_le32(gpiomode);

跟着寻找RALINK_GPIOMODE_DFT的定义,找到了

// if you would like to enable GPIO mode for other pins, please modify this value
// !! Warning: changing this value may make other features(MDIO, PCI, etc) lose efficacy
#define RALINK_GPIOMODE_DFT     (RALINK_GPIOMODE_UARTF )

if you would like to enable GPIO mode for other pins, please modify this value
如果需要是能其他引脚的GPIO模式,请修改该值。

So

// if you would like to enable GPIO mode for other pins, please modify this value
// !! Warning: changing this value may make other features(MDIO, PCI, etc) lose efficacy
#define USERDEFINEDEGPIOPIN 0x1
#define RALINK_GPIOMODE_DFT     (RALINK_GPIOMODE_UARTF | USERDEFINEDEGPIOPIN)

后来发现如果这里选择0x01的话,并不是选择GPIO1,根据数据手册
这里写图片描述
是选择I2C_GPIO_MODE为GPIO模式(按照我的理解应该是上电默认GPIO,linux启动后改成了非GPIO,现在我们就要将他修改为GPIO的模式。)。

但是最神奇的事情发生了。
我选择的是I2C的GPIO模式,应用程序里面选择的是GPIO1,但是在这个时候GPIO1没有跳变,GPIO0跳变了,查了手册没有发现什么所以然。(我这边用的是RT5350模块,进行修改过了,不知道是不是在修改的时候把管脚改掉了,由于手头资料不足,所以无法判断。可能性不大,但是并没有解决。)如果谁知道相关的解释,希望能告诉我一下。在此谢过!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值