1. 程式人生 > >Ralink RT5350:新增自定義GPIO應用程式

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