第20章 驱动开发之LED应用程序

来源:互联网 发布:会员视频源码 编辑:程序博客网 时间:2024/06/07 04:45

20.1 编写应用程序

在前面的章节中, 我们成功的写出了我们自己的驱动程序, 并且向应用程序提供了 open、ioctl 两个接口,那么接下来我们就来编写应用程序,调用这些接口。

#include <stdio.h>#include <curses.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <sys/ioctl.h>#include <string.h>#define MYLEDS_LED1_ON 0#define MYLEDS_LED1_OFF 1#define MYLEDS_LED2_ON 2#define MYLEDS_LED2_OFF 3/*** ledtest <dev> <on|off>**/void print_usage(char *file){    printf("Usage:\n");    printf("%s <dev> <on|off>\n",file);    printf("eg. \n");    printf("%s led1 on\n", file);    printf("%s led1 off\n", file);    printf("%s led2 on\n", file);    printf("%s led2 off\n", file);}int main(int argc, char **argv){    int fd;    if (argc != 3)    {        print_usage(argv[0]);        return 0;    }    /* 1.打开设备节点 */    fd = open("/dev/myleds", O_RDWR | O_NONBLOCK);    if (fd < 0)    {        printf("can't open!\n");        return -1;    }    /* 2.根据参数不同,控制 LEDs */    if(!strcmp("led1", argv[1]))    {        if (!strcmp("on", argv[2]))        {            // 亮灯            ioctl(fd, MYLEDS_LED1_ON);        }        else if (!strcmp("off", argv[2]))        {            // 灭灯            ioctl(fd, MYLEDS_LED1_OFF);        }        else        {            print_usage(argv[0]);            return 0;        }    }    else if(!strcmp("led2", argv[1]))    {        if (!strcmp("on", argv[2]))        {            // 亮灯            ioctl(fd, MYLEDS_LED2_ON);        }        else if (!strcmp("off", argv[2]))        {            // 灭灯            ioctl(fd, MYLEDS_LED2_OFF);        }        else        {            print_usage(argv[0]);            return 0;        }    }    else    {        print_usage(argv[0]);        return 0;    }    return 0;}

该应用程序很简单,main 函数是我们应用程序的入口函数,然后在 main 函数的开始部分,首先对参数个数进行了判断,如果参数个数小于 2 个,则打印出帮助信息,并返回。接着就是调用驱动程序提供的 open 函数接口,来打开相应的设备节点。当打开成功以后,我们就可以对该驱动进行控制操作了,那么,我们就是通过 ioctl 向驱动发送命令,从而来控制想要的设备。ioctl 函数,一共有 2 个参数,参数 1,是前面的 open 函数返回的文件句柄,参数 2,就是我们要发送的命令了,这个命令应该和驱动程序约定好。

20.2 写 Makefile 文件

前面我们写出了应用程序, 接下来我们就要编译该应用程序。 首先创建一个 myleds_test目录,然后进入该目录,再创建一个 src 目录,在 src 目录下新建一个 Makefile 文件,内容如下。

CC = gccCFLAGS = -WallOBJS = myleds_test.oall: myleds_test%.o: %.c$(CC) $(CFLAGS) -c -o $@ $< $(LDFLAGS)fbtest: $(OBJS)$(CC) -o $@ $(OBJS) $(LDFLAGS)clean:rm -f rbcfg *.o

然后将前面写的应用程序 myleds_test.c 复制到该目录下,接着回到上一级目录,即
f403tech_drv_test 目录,再创建一个 Makefile 文件,内容如下。

#
#Copyright (C) 2012 OpenWrt.org
#
#This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=myleds_test
PKG_RELEASE:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/myleds_test
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Frame buffer device testing tool
DEPENDS:=+libncurses
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Build/Configure
endef
TARGET_LDFLAGS :=
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) \
CC="$(TARGET_CC)" \
CFLAGS="$(TARGET_CFLAGS) -Wall" \
LDFLAGS="$(TARGET_LDFLAGS)"
endef
define Package/myleds_test/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/myleds_test $(1)/usr/sbin/
endef
$(eval $(call BuildPackage,myleds_test))

关于该 Makefile 的语法,在前面的章节中已经讲解过,不再赘述。

20.3 编译应用程序

将 myleds_test 的整个文件传到 OpenWrt 系统源码的 openwrt/trunk/package 目录下,然后进入 OpenWrt 系统源码的顶层目录,执行 make menuconfig。

# cd /work/openwrt/trunk/ 
# make menuconfig

在弹出的菜单选项中,首先进入 Utilities 选项。
这里写图片描述

图1

接着我们就能看到我们自己写的应用程序的选项 f403tech_drv_test,将该选项配置进系统,即选为*。
这里写图片描述

图2

接下来,退出保存,并重新编译系统。

# make V=99

编译完成以后,新生成的固件里面,就已经包含了我们的应用程序了

20.4 测试

将新编译出来的固件,按照第 3 章中的方法,重新烧入开发板。然后将前面编译出来的驱动模块软件包也传入到开发板。接下来就开始测试。
1). 安装驱动程序

# opkg install kmod-myleds_3.10.36-1_ramips_24kec.ipk 
# cd lib/modules/3.10.36/
# insmod myleds.ko

2). 运行测试程序

# cd / # myleds_test led1 on # myleds_test led1 off # myleds_test led2 on # myleds_test led2 off

当我们执行 myleds_test led1 on 这条命令的时候,我们会发现 GPIO25 输出了高电平,如果上面有 LED 灯,它则会被点亮,如果没有,我们可以用万用表测试一下电平;当我们执行 myleds_test led1 off 这条命令的时候,我们会发现 GPIO25 输出了低电平,如果上面有LED 灯,它则不会被点亮,如果没有,我们可以用万用表测试一下电平;同理,myleds_testled2 on 则是让 GPIO26 输出高电平。

附件下载

点击下载链接

原创粉丝点击