这几天在做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模块,进行修改过了,不知道是不是在修改的时候把管脚改掉了,由于手头资料不足,所以无法判断。可能性不大,但是并没有解决。)如果谁知道相关的解释,希望能告诉我一下。在此谢过!