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模組,進行修改過了,不知道是不是在修改的時候把管腳改掉了,由於手頭資料不足,所以無法判斷。可能性不大,但是並沒有解決。)如果誰知道相關的解釋,希望能告訴我一下。在此謝過!
相關文章
- 又踩坑了!BigDecimal使用的5個坑!Decimal
- STM32 GPIO 暫存器的配置
- 踩了 Golang sync.Map 的一個坑Golang
- MySQL的這個bug,坑了多少人?MySql
- 今天踩了一個基礎坑
- 面試Go 被defer的幾個盲區坑了面試Go
- 舒服了,學習了,踩到一個 Lombok 的坑!Lombok
- 踩了個DNS解析的坑,但我還是沒想通DNS
- 哎,被這個叫做at least once的玩意坑麻了。AST
- 踩了的Dockerfile的坑Docker
- Linux下建立GPIO(/sys/class/gpio)Linux
- ThinkPHP 的 nginx 配置踩坑PHPNginx
- nginx配置gzip中的坑Nginx
- webpack 4 配置遇到的坑Web
- Maven配置中遇到的坑Maven
- GPIO模式模式
- 使用spi-gpio-custom模組配置SPI匯流排
- SpringBoot 專案中配置多個 Jackson 的 ObjectMapper ,以及配置遇到的坑Spring BootObjectAPP
- 想換坑了有沒有坑位
- STM32 GPIO的8種工作模式及相關配置暫存器模式
- 時區的坑,別再踩了!
- PHP 替換了檔案但是不生效的問題!(Opcache 的一個坑)PHPopcache
- 調教屬於你的“賈維斯”(給自己挖了一個很大的坑)
- Spring Boot 中的同一個 Bug,竟然把我坑了兩次!Spring Boot
- 初入職場的小夥伴請注意,這 8 個坑不要再踩了
- 在某音入坑了一個28.5的1T盤之後。。。。
- Homestead 配置踩坑
- baremetal GPIO中斷REM
- Python的16個“坑”Python
- MySQLtimestamp的一個坑MySql
- 小心,別被eureka坑了
- 挖了坑,讓自己跳
- 【避坑】初次接專案的血與淚,扎坑了老鐵(二)
- 都在呼籲理性愛國 蘋果卻又挖了一個坑蘋果
- 開發微信公眾號遇到的一個坑,只因一個字母 s ,我浪費了 5 個小時
- 樹莓派的GPIO程式設計樹莓派程式設計
- 有關GPIO的使用方法教程
- 等等!這兩個 Spring-RabbitMQ 的坑我們已經替你踩了SpringMQ