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 $@ $@.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

猜你喜欢

转载自blog.csdn.net/z21109/article/details/49150481