Ralink RT5350:新增自定義GPIO應用程式
Ralink RT5350:新增自定義GPIO應用程式
1.編寫LED應用程式,並修改相關配置檔案
1.1 新建led目錄
1.2新建led.c
1.3 編寫led.c
1.4 新建led目錄下Makefile
1.5 修改led上層目錄下的Makefile
1.6 將IO口的模式配置為GPIO模式
2. 新增核心支援,並編譯得到應用程式led
2.1修改配置檔案config.in
2.2 新增核心對LED的支援,配置menuconfig
2.3 編譯核心,得到應用程式led
3. 燒寫核心檔案(root_uImage)到開發板
3.1 首先將USB串列埠連結到電腦
3.2 開啟超級終端,並配置
3.3 配置電腦的網絡卡
3.4 開啟tftpd32,並配置
3.5 連線網線
3.6 將核心下載到開發板
4. 驗證應用程式led
4.1 檢視/bin目錄下是否存在應用程式led
4.2 使用led,點亮和熄滅LED燈
4.3 驗證GPIO_1的電平的變化
附錄:開發板(ZQ-WIFI-130)電路圖
Pillar Peng
2015.10.11
開發環境:
Window: WIN7 旗艦版
Linux: Fedora6
雷凌原廠開發包:Ralink_ApSoC_SDK_4000_20120222.tar
開發板:主控晶片MIPS = 雷凌Ralink RT5350F 具體如下圖。
本文目的:編寫新的GPIO應用程式,然後新增核心支援,並且加入到根檔案系統,最後燒寫進開發板上使用。
Ralink SDK中自帶的GPIO應用程式的弊端:本身SDK自帶的GPIO應用程式根本不適用,它的讀寫功能都是同時改變所有的IO口,使用GPIO寫時,會宕機,重新啟動系統。
本文寫的應用程式是控制RT5350的GPIO_1的高低電平,由於本人使用GPIO_1來控制LED,所以應用程式名改為LED。
1.編寫LED應用程式(根據原有的GPIO應用程式而得),並修改相關配置檔案
1.1 新建led目錄,在/root/RT288x_SDK/source/user/rt2880_app目錄下
#cd /root/RT288x_SDK/source/user/rt2880_app
#mkdir led
1.2 進入led目錄,接著新建led.c
#cd ./led
#vi led.c
1.3 編寫led.c內容,內容如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <linux/autoconf.h>
#include "ralink_gpio.h"
#define GPIO_DEV "/dev/gpio"
void led_on(void)
{
int fd, req, arg;
//open device gpio
fd = open(GPIO_DEV, O_RDONLY);
if (fd < 0)
{
perror(GPIO_DEV);
return -1;
}
//set gpio_1 direction to output
req = RALINK_GPIO_SET_DIR_OUT;
arg = 0x00000002;
if (ioctl(fd, req, arg) < 0)
{
perror("ioctl");
close(fd);
return -1;
}
//set gpio_1 ; turn on led
req = RALINK_GPIO_SET;
arg = 0x00000002;
if (ioctl(fd, req, arg) < 0)
{
perror("ioctl");
close(fd);
return -1;
}
close(fd);
return 0;
}
void led_off(void)
{
int fd, req, arg;
//open device gpio
fd = open(GPIO_DEV, O_RDONLY);
if (fd < 0)
{
perror(GPIO_DEV);
return -1;
}
//set gpio_1 direction to output
req = RALINK_GPIO_SET_DIR_OUT;
arg = 0x00000002;
if (ioctl(fd, req, arg) < 0)
{
perror("ioctl");
close(fd);
return -1;
}
//clear gpio_1 ; turn off led
req = RALINK_GPIO_CLEAR;
arg = 0x00000002;
if (ioctl(fd, req, arg) < 0)
{
perror("ioctl");
close(fd);
return -1;
}
close(fd);
return 0;
}
void usage(char *cmd)
{
printf("Usage: clear gpio_1: %s 0 \n", cmd);
printf(" set gpio_1: %s 1\n", cmd);
exit(0);
}
int main(int argc, char *argv[])
{
//如果引數小於兩個,則列印該應用程式的用法
if (argc < 2)
usage(argv[0]);
switch (argv[1][0])
{
case '0': //輸入命令:#led 0 ;則gpio_1=0,即是led off
led_off();
break;
case '1': //輸入命令:#led 1 ;則gpio_1=1,即是led on
led_on();
break;
default:
usage(argv[0]);
}
return 0;
}
/**************************** led.c 已完 *********************************/
1.4 在led目錄下,新建Makefile
#vi Makefile
Makefile檔案的內容如下:(參考gpio目錄下的Makefile)
EXEC = led
CFLAGS += -I$(ROOTDIR)/$(LINUXDIR)/drivers/char
all: $(EXEC)
$(EXEC): $(EXEC).c
$(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] [email protected].c $(LDLIBS)
romfs:
$(ROMFSINST) /bin/$(EXEC)
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
########################### LED Makefile 已完 ################################
1.5 修改led上層目錄(/root/RT288x_SDK/source/user/rt2880_app)下的Makefile
#cd /root/RT288x_SDK/source/user/rt2880_app
#vi Makfile
在Makefile檔案的第一行新增如下程式碼:
ra_dir_$(CONFIG_RALINKAPP_LED) += led
修改完後,如下圖所示:
1.6 將IO口的模式配置為GPIO模式
1.6.1修改檔案ralink_gpio.h
1) 開啟檔案:
#vi /root/RT288x_SDK/source/linux-2.6.21.x/drivers/char/ralink_gpio.h
2) 找到下面這行內容:
#define RALINK_GPIOMODE_DFT (RALINK_GPIOMODEUARTF)
並將這行改為如下內容:
#define RALINK_GPIOMODE_DFT (RALINK_GPIOMODEUARTF|1)
注:這行大概位於367行,也可以使用vi的查詢命令(/DFT)。
1.6.2 RT5350的IO口有幾種模式:一種是GPIO模式,另一種是正常模式(即是複用埠模式)。RT5350的資料手冊中的1.3 Pin Sharing Scheme,中有說明,GPIO口與複用功能引腳的對應關係,具體如下圖所示:
本文所用的GPIO_1是I2C的複用引腳,而系統預設的正常模式(複用埠模式),所以需要將GPIO_1更改為GPIO模式。而GPIO的模式由暫存器GPIOMODE控制,GPIOMODE暫存器介紹,如下圖所示:
2. 新增核心支援,並編譯得到應用程式led
2.1修改配置檔案config.in
Config.in檔案的位置:/root/RT288x_SDK/source/config
#cd /root/RT288x_SDK/source/config
#vi config.in
在config.in中找到下面這行:
bool ‘GPIO’ CONFIG_RALINKAPP_GPIO,
然後在其上一行或者下一行,新增以下程式碼:
bool ‘LED’ CONFIG_RALINKAPP_LED
修改完成後,儲存退出(ESC:wq),結果如圖所示:
2.2 新增核心對LED的支援,配置menuconfig
2.2.1回到source目錄
#cd /root/RT288x_SDK/source
2.2.2進入配置介面,進行配置
#make menuconfig
出現介面,如下圖所示:
選擇Kernel/Library/Defaults Selection —>,進入下一個介面,如下圖所示:
選擇Customize Vendor/User Settings (NEW),然後退出,再退出,儲存配置。
接著出現以下配置介面:
選擇 Ralink Proprietary Application —>,進入下一個介面,如下圖所示:
使用空格,選擇“[*] LED(NEW)”,然後退出,再退出,儲存配置。
2.3 編譯核心,得到應用程式led,其位置就在led的目錄下
2.3.1 回到source目錄然後編譯核心
#cd /root/RT288x_SDK/source/
#make dep
#make
幾分鐘後,便可編譯完成。
2.3.2編譯完成後,檢視是否生成應用程式led,檢視得到核心檔案。
1) 檢視是否有生成應用程式led
#ls /root/RT288x_SDK/source/user/rt2880_app/led/led
2) 檢視是否將應用程式加入到根檔案系統(ROMFS)的/bin目錄中
#ls /root/RT288x_SDK/source/romfs/bin/led
3) 檢視核心檔案:root_uImage
#ls /root/RT288x_SDK/source/images
3. 燒寫核心檔案(root_uImage)到開發板
使用到的工具如下:
1) 超級終端
2) Tftpd32
3) 串列埠(這裡使用的USB轉串列埠)
4) 網線
以下是步驟:
3.1 首先將USB串列埠連結到電腦
開啟“裝置管理器”,檢視串列埠是否和電腦連結正常,正常則如下圖所示:
3.2 開啟超級終端,並配置
3.2.1 開啟後輸入新建“連線”的名稱,然後確定,如圖所示:
3.2.2 選擇你使用的串列埠,這裡是COM4,然後確定。
3.2.3 配置串列埠屬性,一定注意波特率為:57600;和資料流控制為:無。如下圖所示:
3.2.4 應用,確定,即可,超級終端配置完成。
3.2.5 連線串列埠,注意開發板有兩個串列埠,要使用串列埠2才可以,如下圖所示:
3.3 配置電腦的網絡卡,使用靜態IP : 10.10.10.3(與開發板的Uboot時的IP地址10.10.10.123,處於同一閘道器即可),具體配置如下圖所示:
3.4 開啟tftpd32,並配置,如下圖所示:
圖中1所示:選擇核心所在的資料夾,點選“Browe”可以選擇。
圖中2所示:tftp伺服器即是電腦。
3.5 連線網線
注意:網線一端連線剛剛配置的網絡卡上,另一端連線開發板的“LAN”口,如下圖所示:
3.6 將核心下載到開發板
3.6.1給開發板上電,馬上對著超級終端視窗,不停的按數字鍵“2”,直到出現以下文字,如下圖所示:
3.6.2
1) 接著鍵入“y”
2) Input device IP (10.10.10.123) ==:10.10.10.123,回車;這個是開發板的IP
3) Input server IP (10.10.10.3) ==:10.10.10.3,再回車;這個是電腦的IP
4) Input Linux Kernel filename () ==:root_uImage,輸入核心名root_uImage,然後回車
具體如下圖所示:
3.6.3 看到下圖內容說明所有的連線都正確,正在將核心檔案下載到開發板。
3.6.4 看到下面的內容說明開發板的系統已經啟動完成。
4. 驗證應用程式led
4.1 檢視/bin目錄下是否存在應用程式led
在超級終端裡輸入以下命令:
#ls /bin/led
結果如下圖所示:
4.2 使用led,點亮和熄滅LED燈
在超級終端裡輸入以下命令:
#led 1 //GPIO_1輸出高電平(點亮LED)
#led 0 //GPIO_1輸出低電平(熄滅LED)
4.3 驗證GPIO_1的電平的變化
4.3.1找到GPIO_1測量電平即可。
4.3.2在上面已經說過,LED燈是被GPIO_1控制的,那麼GPIO_1在開發板的哪個位置呢?
這個開發板的GPIO_1的位置如圖所示:
撒花,完結!
附錄:開發板(ZQ-WIFI-130)電路圖
最後附上自己用萬用表炒出來的關於本開發板的部分電路圖,電路圖是按照開發板的佈局。
下面的圖片是屬於向量圖,可以放大看得。
Pillar Peng
2015.10.11