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

青瀾爸爸發表於2016-06-06

這幾天在做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模組,進行修改過了,不知道是不是在修改的時候把管腳改掉了,由於手頭資料不足,所以無法判斷。可能性不大,但是並沒有解決。)如果誰知道相關的解釋,希望能告訴我一下。在此謝過!

相關文章