1、Ralink RT5350:添加自定义GPIO应用程序 开发环境: 2 1.编写LED应用程序,并修改相关配置文件 3 1.1 新建led目录 3 1.2新建led.c 3 1.3 编写led.c 3 1.4 新建led目录下Makefile 6 1.5 修改led上层目录下的Makefile 6 1.6 将IO口的模式配置为GPIO模式 7 2. 添加内核支持,并编译得到应用程序led 9 2.1修改配置文件config.in 9 2.2 添加内核对LED的支持,配置menuconfig 10 2.3 编译内核,得到应用程序led 12 3. 烧写内核文件(root
2、uImage)到开发板 12 3.1 首先将USB串口链接到电脑 13 3.2 打开超级终端,并配置 13 3.3 配置电脑的网卡 14 3.4 打开tftpd32,并配置 15 3.5 连接网线 15 3.6 将内核下载到开发板 16 4. 验证应用程序led 18 4.1 查看/bin目录下是否存在应用程序led 18 4.2 使用led,点亮和熄灭LED灯 18 4.3 验证GPIO_1的电平的变化 18 附录:开发板(ZQ-WIFI-130)电路图 19 Pillar Peng 20 2015.10.11 20
3、 开发环境: Window: WIN7 旗舰版 Linux: Fedora6 雷凌原厂开发包:Ralink_ApSoC_SDK_4000_20120222.tar 开发板:主控芯片MIPS = 雷凌Ralink RT5350F 具体如下图。 本文目的:编写新的GPIO应用程序,然后添加内核支持,并且加入到根文件系统,最后烧写进开发板上使用。 Ralink SDK中自带的GPIO应用程序的弊端:本身SDK自带的GPIO应用程序根本不适用,它的读写功能都是同时改变所有的IO口,使用GPIO写时,会死机,重新启动系统。 本文写的应用程序是控
4、制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
5、
#include
6、pen(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 =
7、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);
8、 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, ar
9、g) < 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[]) { //如果参数小于两个,则打印该应用程序的用法
10、 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; } /**************************
11、 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 $@ $@.c $(LDLIBS) romfs: $(ROMFSINS
12、T) /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_$(CO
13、NFIG_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
14、 (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寄存器介绍,如下图所示:
15、 , 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 添
16、加内核对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 ---
17、>,进入下一个界面,如下图所示: 使用空格,选择“[*] 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) 查看是否将应用
18、程序加入到根文件系统(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 打开超级终端,并配置
19、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所示:
20、选择内核所在的文件夹,点击“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,再
21、回车;这个是电脑的IP 4) Input Linux Kernel filename () ==:root_uImage,输入内核名root_uImage,然后回车 具体如下图所示: 3.7.3 看到下图内容说明所有的连接都正确,正在将内核文件下载到开发板。 3.7.4 看到下面的内容说明开发板的系统已经启动完成。 4. 验证应用程序led 4.1 查看/bin目录下是否存在应用程序led 在超级终端里输入以下命令: #ls /bin/led 结果如下图所示: 4.2 使用led,点亮和熄灭LED灯 在超级终端里输入以下命令: #led 1
22、 ;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






