0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式大杂烩 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2023-07-03 09:02 次阅读

开发环境:

主机:Ubuntu12.04

开发板:RT5350

Openwrt:Openwrt15.05

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,就是我们要发送的命令了,这个命令应该和驱动程序约定好。

2 写 Makefile 文件

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

CC = gcc
CFLAGS = -Wall
OBJS = myleds_test.o
all: myleds_test
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<   $(LDFLAGS)
fbtest: $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS)
clean:
rm -f rbcfg *.o

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

# 
#Copyright (C) 2019 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 的语法,在前面的章节中已经讲解过,不再赘述。

3 编译应用程序

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

$ make menuconfig

在弹出的菜单选项中,配置选项。

Utilities --->

<* > myleds_test

1688309681269x4ci4b0lar

图1

接着我们就能看到我们自己写的应用程序的选项 myleds_test,将该选项配置进系统,即选为*。接下来,退出保存,并重新编译系统。

$ make V=99

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

20.4 测试

将新编译出来的固件,重新烧入开发板。然后将前面编译出来的驱动模块软件包也传入到开发板。接下来就开始测试。

1). 安装驱动程序

opkg install kmod-myleds_3.18.109-1_ramips_24kec.ipk

cd lib/modules/3.18.109/

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 输出高电平。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    242

    文章

    23281

    浏览量

    660988
  • 接口
    +关注

    关注

    33

    文章

    8610

    浏览量

    151212
  • 开发板
    +关注

    关注

    25

    文章

    5057

    浏览量

    97519
  • 应用程序
    +关注

    关注

    37

    文章

    3269

    浏览量

    57718
  • OpenWrt
    +关注

    关注

    10

    文章

    130

    浏览量

    39309
收藏 人收藏

    评论

    相关推荐

    Openwrt开发指南 16 驱动开发字符设备驱动程序框架

    我们在学习 C 语言的时候,知道每个应用程序的入口函数,即第一个被执行的函数是 main函数,那么,我们自己的驱动程序,哪个函数是入口函数呢?
    的头像 发表于 06-30 09:01 3452次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>16<b class='flag-5'>章</b> <b class='flag-5'>驱动</b><b class='flag-5'>开发</b><b class='flag-5'>之</b>字符设备<b class='flag-5'>驱动程序</b>框架

    Openwrt开发指南 25 配置OpenWrt支持网络摄像头

    Openwrt开发指南 25 配置OpenWrt支持网络摄像头
    的头像 发表于 07-13 08:56 2436次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>25<b class='flag-5'>章</b> 配置<b class='flag-5'>OpenWrt</b>支持网络摄像头

    Openwrt开发指南 2 OpenWrt开发环境搭建

    烧写到设备中;另外,嵌入式设备的资源并不足以用来开发软件。所以需要用到交叉开发模式:在主机上编辑、编译软件,然后在目标板上运行、验证程序。对于MT7621等开发板,进行物联网
    的头像 发表于 06-27 09:09 7183次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>2<b class='flag-5'>章</b> <b class='flag-5'>OpenWrt</b><b class='flag-5'>开发</b>环境搭建

    Openwrt开发指南 3 OpenWrt下载及配置

    编译OpenWrt首先需要下载源码,OpenWrt的源码是通过git下载,OpenWrt目前已经很好的支持了MT7620、MT7821等芯片,因此OpenWrt系统完全可以用于MT76
    的头像 发表于 06-27 09:10 5846次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>3<b class='flag-5'>章</b> <b class='flag-5'>OpenWrt</b>下载及配置

    Openwrt开发指南 13 OpenWrt启动流程

    任何系统的启动都是开发人员首要关注的问题,因为只有了解了系统的启动流程和启动机制,才能真正掌握一个系统,如果对启动的启动不熟悉的话,是不可能真正用好一个系统,openwrt系统也不例外,他的启动和一般的嵌入式系统启动还有所区别,现在咱们就分析一下
    的头像 发表于 06-29 09:09 3572次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>13<b class='flag-5'>章</b> <b class='flag-5'>OpenWrt</b>启动流程

    Openwrt开发指南 15 驱动开发字符设备驱动程序概念介绍

    从上到下,一个软件系统可以分为:应用程序、库、操作系统(内核)、驱动程序开发人员可以专注于自己熟悉的部分,对于相邻层,只需要了解它的接口,无需关注它的实现细节。
    的头像 发表于 06-30 09:00 2794次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>15<b class='flag-5'>章</b> <b class='flag-5'>驱动</b><b class='flag-5'>开发</b><b class='flag-5'>之</b>字符设备<b class='flag-5'>驱动程序</b><b class='flag-5'>之</b>概念介绍

    Openwrt开发指南 17 驱动开发字符设备驱动程序

    首先将 RT5350_drv 文件夹传到 OpenWrt 源码的chaos_calmer/package/kernel 目录下。然后进入 OpenWrt 源码的顶层目录,执行 make menuconfig。
    的头像 发表于 07-02 09:20 3252次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>17<b class='flag-5'>章</b> <b class='flag-5'>驱动</b><b class='flag-5'>开发</b><b class='flag-5'>之</b>字符设备<b class='flag-5'>驱动程序</b>

    Openwrt开发指南 18 驱动开发字符设备应用程序

    在前面的章节中, 我们成功的写出了我们自己的驱动程序, 并且向应用程序提供了 open、read、write 三个接口,那么接下来我们就来编写应用程序,调用这些接口。
    的头像 发表于 07-02 09:21 2578次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>18<b class='flag-5'>章</b> <b class='flag-5'>驱动</b><b class='flag-5'>开发</b><b class='flag-5'>之</b>字符设备<b class='flag-5'>应用程序</b>

    Openwrt开发指南 19 驱动开发LED驱动程序

    我们的驱动开发,无论是单片机、还是 ARM、或者是我们的 MIPS,核心思想,都是读写某个地址,即操作某个寄存器。
    的头像 发表于 07-03 09:01 3105次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>19<b class='flag-5'>章</b> <b class='flag-5'>驱动</b><b class='flag-5'>开发</b><b class='flag-5'>之</b><b class='flag-5'>LED</b><b class='flag-5'>驱动程序</b>

    Openwrt开发指南 22 Openwrt串口的使用2

    在上一中,我们成功的让驱动程序支持了串口 2,并且做了简单的测试。接下来,我们就为串口 2 添加一个应用程序,从而实现 Wi-Fi 串口。实现过程非常简单,首先进入 OpenWrt
    的头像 发表于 07-05 09:09 4136次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>22<b class='flag-5'>章</b> <b class='flag-5'>Openwrt</b>串口的使用2

    Openwrt开发指南 24 配置开发板支持U盘

    Openwrt开发指南 24 配置开发板支持U盘
    的头像 发表于 07-13 08:55 3398次阅读
    <b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>24<b class='flag-5'>章</b> 配置<b class='flag-5'>开发</b>板支持U盘

    Mali GPU OpenGL ES应用程序开发指南

    这是适用于马里GPU的OpenGL ES应用程序开发指南。 它提供了使用OpenGL ES 1.1和OpenGL ES 2.0 API为马里GPU开发应用程序
    发表于 08-30 07:57

    MATLAB Runtime Server 应用程序开发指南

    MATLAB Runtime Server 应用程序开发指南:The MATLAB Runtime Server is a variant of MATLAB®
    发表于 02-21 08:40 40次下载

    openwrt开发教程1~6

    openwrt开发教程1~6
    发表于 03-17 14:23 55次下载

    【正点原子FPGA连载】第九按键控制LED灯实验 -摘自【正点原子】新起点FPGA开发指南_V2.1

    【正点原子FPGA连载】第九按键控制LED灯实验 -摘自【正点原子】新起点FPGA开发指南_V2.1
    发表于 12-04 13:06 10次下载
    【正点原子FPGA连载】第九<b class='flag-5'>章</b>按键控制<b class='flag-5'>LED</b>灯实验 -摘自【正点原子】新起点<b class='flag-5'>之</b>FPGA<b class='flag-5'>开发指南</b>_V2.1