RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Openwrt開發(fā)指南 第20章 驅(qū)動(dòng)開發(fā)之LED應(yīng)用程序

嵌入式大雜燴 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-07-03 09:02 ? 次閱讀

開發(fā)環(huán)境:

主機(jī):Ubuntu12.04

開發(fā)板:RT5350

Openwrt:Openwrt15.05

1 編寫應(yīng)用程序

在前面的章節(jié)中, 我們成功的寫出了我們自己的驅(qū)動(dòng)程序, 并且向應(yīng)用程序提供了 open、ioctl 兩個(gè)接口,那么接下來我們就來編寫應(yīng)用程序,調(diào)用這些接口。

#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.打開設(shè)備節(jié)點(diǎn) */
fd = open("/dev/myleds", O_RDWR | O_NONBLOCK);
if (fd < 0)
{
printf("can't open!\\n");
return -1;
}
/* 2.根據(jù)參數(shù)不同,控制 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;
}

該應(yīng)用程序很簡(jiǎn)單,main 函數(shù)是我們應(yīng)用程序的入口函數(shù),然后在 main 函數(shù)的開始部分,首先對(duì)參數(shù)個(gè)數(shù)進(jìn)行了判斷,如果參數(shù)個(gè)數(shù)小于 2 個(gè),則打印出幫助信息,并返回。接著就是調(diào)用驅(qū)動(dòng)程序提供的 open 函數(shù)接口,來打開相應(yīng)的設(shè)備節(jié)點(diǎn)。當(dāng)打開成功以后,我們就可以對(duì)該驅(qū)動(dòng)進(jìn)行控制操作了,那么,我們就是通過 ioctl 向驅(qū)動(dòng)發(fā)送命令,從而來控制想要的設(shè)備。ioctl 函數(shù),一共有 2 個(gè)參數(shù),參數(shù) 1,是前面的 open 函數(shù)返回的文件句柄,參數(shù) 2,就是我們要發(fā)送的命令了,這個(gè)命令應(yīng)該和驅(qū)動(dòng)程序約定好。

2 寫 Makefile 文件

前面我們寫出了應(yīng)用程序, 接下來我們就要編譯該應(yīng)用程序。 首先創(chuàng)建一個(gè) myleds_test目錄,然后進(jìn)入該目錄,再創(chuàng)建一個(gè) src 目錄,在 src 目錄下新建一個(gè) Makefile 文件,內(nèi)容如下。

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

然后將前面寫的應(yīng)用程序 myleds_test.c 復(fù)制到該目錄下,接著回到上一級(jí)目錄,即myleds_test目錄,再創(chuàng)建一個(gè) Makefile 文件,內(nèi)容如下。

# 
#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))

關(guān)于該 Makefile 的語法,在前面的章節(jié)中已經(jīng)講解過,不再贅述。

3 編譯應(yīng)用程序

將 myleds_test 的整個(gè)文件傳到 OpenWrt 系統(tǒng)源碼的package 目錄下,然后進(jìn)入 OpenWrt 系統(tǒng)源碼的頂層目錄,執(zhí)行 make menuconfig。

$ make menuconfig

在彈出的菜單選項(xiàng)中,配置選項(xiàng)。

Utilities --->

<* > myleds_test

1688309681269x4ci4b0lar

圖1

接著我們就能看到我們自己寫的應(yīng)用程序的選項(xiàng) myleds_test,將該選項(xiàng)配置進(jìn)系統(tǒng),即選為*。接下來,退出保存,并重新編譯系統(tǒng)。

$ make V=99

編譯完成以后,新生成的固件里面,就已經(jīng)包含了我們的應(yīng)用程序了

20.4 測(cè)試

將新編譯出來的固件,重新燒入開發(fā)板。然后將前面編譯出來的驅(qū)動(dòng)模塊軟件包也傳入到開發(fā)板。接下來就開始測(cè)試。

1). 安裝驅(qū)動(dòng)程序

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

cd lib/modules/3.18.109/

insmod myleds.ko

2). 運(yùn)行測(cè)試程序

cd /

myleds_test led1 on

myleds_test led1 off

myleds_test led2 on

myleds_test led2 off

當(dāng)我們執(zhí)行 myleds_test led1 on 這條命令的時(shí)候,我們會(huì)發(fā)現(xiàn) GPIO25 輸出了高電平,如果上面有 LED 燈,它則會(huì)被點(diǎn)亮,如果沒有,我們可以用萬用表測(cè)試一下電平;當(dāng)我們執(zhí)行 myleds_test led1 off 這條命令的時(shí)候,我們會(huì)發(fā)現(xiàn) GPIO25 輸出了低電平,如果上面有LED 燈,它則不會(huì)被點(diǎn)亮,如果沒有,我們可以用萬用表測(cè)試一下電平;同理,myleds_testled2 on 則是讓 GPIO26 輸出高電平。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • led
    led
    +關(guān)注

    關(guān)注

    242

    文章

    23252

    瀏覽量

    660543
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8575

    瀏覽量

    151012
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5032

    瀏覽量

    97371
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3265

    瀏覽量

    57677
  • OpenWrt
    +關(guān)注

    關(guān)注

    10

    文章

    130

    瀏覽量

    39296
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Openwrt開發(fā)指南 16 驅(qū)動(dòng)開發(fā)字符設(shè)備驅(qū)動(dòng)程序框架

    我們?cè)趯W(xué)習(xí) C 語言的時(shí)候,知道每個(gè)應(yīng)用程序的入口函數(shù),即第一個(gè)被執(zhí)行的函數(shù)是 main函數(shù),那么,我們自己的驅(qū)動(dòng)程序,哪個(gè)函數(shù)是入口函數(shù)呢?
    的頭像 發(fā)表于 06-30 09:01 ?3427次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>16<b class='flag-5'>章</b> <b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>之</b>字符設(shè)備<b class='flag-5'>驅(qū)動(dòng)程序</b>框架

    Openwrt開發(fā)指南 25 配置OpenWrt支持網(wǎng)絡(luò)攝像頭

    Openwrt開發(fā)指南 25 配置OpenWrt支持網(wǎng)絡(luò)攝像頭
    的頭像 發(fā)表于 07-13 08:56 ?2402次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>25<b class='flag-5'>章</b> 配置<b class='flag-5'>OpenWrt</b>支持網(wǎng)絡(luò)攝像頭

    Openwrt開發(fā)指南 2 OpenWrt開發(fā)環(huán)境搭建

    燒寫到設(shè)備中;另外,嵌入式設(shè)備的資源并不足以用來開發(fā)軟件。所以需要用到交叉開發(fā)模式:在主機(jī)上編輯、編譯軟件,然后在目標(biāo)板上運(yùn)行、驗(yàn)證程序。對(duì)于MT7621等開發(fā)板,進(jìn)行物聯(lián)網(wǎng)
    的頭像 發(fā)表于 06-27 09:09 ?7113次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>2<b class='flag-5'>章</b> <b class='flag-5'>OpenWrt</b><b class='flag-5'>開發(fā)</b>環(huán)境搭建

    Openwrt開發(fā)指南 3 OpenWrt下載及配置

    編譯OpenWrt首先需要下載源碼,OpenWrt的源碼是通過git下載,OpenWrt目前已經(jīng)很好的支持了MT7620、MT7821等芯片,因此OpenWrt系統(tǒng)完全可以用于MT76
    的頭像 發(fā)表于 06-27 09:10 ?5757次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>3<b class='flag-5'>章</b> <b class='flag-5'>OpenWrt</b>下載及配置

    Openwrt開發(fā)指南 13 OpenWrt啟動(dòng)流程

    任何系統(tǒng)的啟動(dòng)都是開發(fā)人員首要關(guān)注的問題,因?yàn)橹挥辛私饬讼到y(tǒng)的啟動(dòng)流程和啟動(dòng)機(jī)制,才能真正掌握一個(gè)系統(tǒng),如果對(duì)啟動(dòng)的啟動(dòng)不熟悉的話,是不可能真正用好一個(gè)系統(tǒng),openwrt系統(tǒng)也不例外,他的啟動(dòng)和一般的嵌入式系統(tǒng)啟動(dòng)還有所區(qū)別,現(xiàn)在咱們就分析一下
    的頭像 發(fā)表于 06-29 09:09 ?3526次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>13<b class='flag-5'>章</b> <b class='flag-5'>OpenWrt</b>啟動(dòng)流程

    Openwrt開發(fā)指南 15 驅(qū)動(dòng)開發(fā)字符設(shè)備驅(qū)動(dòng)程序概念介紹

    從上到下,一個(gè)軟件系統(tǒng)可以分為:應(yīng)用程序、庫、操作系統(tǒng)(內(nèi)核)、驅(qū)動(dòng)程序。開發(fā)人員可以專注于自己熟悉的部分,對(duì)于相鄰層,只需要了解它的接口,無需關(guān)注它的實(shí)現(xiàn)細(xì)節(jié)。
    的頭像 發(fā)表于 06-30 09:00 ?2762次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>15<b class='flag-5'>章</b> <b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>之</b>字符設(shè)備<b class='flag-5'>驅(qū)動(dòng)程序</b><b class='flag-5'>之</b>概念介紹

    Openwrt開發(fā)指南 17 驅(qū)動(dòng)開發(fā)字符設(shè)備驅(qū)動(dòng)程序

    首先將 RT5350_drv 文件夾傳到 OpenWrt 源碼的chaos_calmer/package/kernel 目錄下。然后進(jìn)入 OpenWrt 源碼的頂層目錄,執(zhí)行 make menuconfig。
    的頭像 發(fā)表于 07-02 09:20 ?3224次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>17<b class='flag-5'>章</b> <b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>之</b>字符設(shè)備<b class='flag-5'>驅(qū)動(dòng)程序</b>

    Openwrt開發(fā)指南 18 驅(qū)動(dòng)開發(fā)字符設(shè)備應(yīng)用程序

    在前面的章節(jié)中, 我們成功的寫出了我們自己的驅(qū)動(dòng)程序, 并且向應(yīng)用程序提供了 open、read、write 三個(gè)接口,那么接下來我們就來編寫應(yīng)用程序,調(diào)用這些接口。
    的頭像 發(fā)表于 07-02 09:21 ?2558次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>18<b class='flag-5'>章</b> <b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>之</b>字符設(shè)備<b class='flag-5'>應(yīng)用程序</b>

    Openwrt開發(fā)指南 19 驅(qū)動(dòng)開發(fā)LED驅(qū)動(dòng)程序

    我們的驅(qū)動(dòng)開發(fā),無論是單片機(jī)、還是 ARM、或者是我們的 MIPS,核心思想,都是讀寫某個(gè)地址,即操作某個(gè)寄存器。
    的頭像 發(fā)表于 07-03 09:01 ?3075次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>19<b class='flag-5'>章</b> <b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>之</b><b class='flag-5'>LED</b><b class='flag-5'>驅(qū)動(dòng)程序</b>

    Openwrt開發(fā)指南 22 Openwrt串口的使用2

    在上一中,我們成功的讓驅(qū)動(dòng)程序支持了串口 2,并且做了簡(jiǎn)單的測(cè)試。接下來,我們就為串口 2 添加一個(gè)應(yīng)用程序,從而實(shí)現(xiàn) Wi-Fi 串口。實(shí)現(xiàn)過程非常簡(jiǎn)單,首先進(jìn)入 OpenWrt
    的頭像 發(fā)表于 07-05 09:09 ?4088次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>22<b class='flag-5'>章</b> <b class='flag-5'>Openwrt</b>串口的使用2

    Openwrt開發(fā)指南 24 配置開發(fā)板支持U盤

    Openwrt開發(fā)指南 24 配置開發(fā)板支持U盤
    的頭像 發(fā)表于 07-13 08:55 ?3315次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開發(fā)指南</b> <b class='flag-5'>第</b>24<b class='flag-5'>章</b> 配置<b class='flag-5'>開發(fā)</b>板支持U盤

    Mali GPU OpenGL ES應(yīng)用程序開發(fā)指南

    這是適用于馬里GPU的OpenGL ES應(yīng)用程序開發(fā)指南。 它提供了使用OpenGL ES 1.1和OpenGL ES 2.0 API為馬里GPU開發(fā)應(yīng)用程序
    發(fā)表于 08-30 07:57

    MATLAB Runtime Server 應(yīng)用程序開發(fā)指南

    MATLAB Runtime Server 應(yīng)用程序開發(fā)指南:The MATLAB Runtime Server is a variant of MATLAB®
    發(fā)表于 02-21 08:40 ?40次下載

    openwrt開發(fā)教程1~6

    openwrt開發(fā)教程1~6
    發(fā)表于 03-17 14:23 ?55次下載

    【正點(diǎn)原子FPGA連載】第九按鍵控制LED燈實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)FPGA開發(fā)指南_V2.1

    【正點(diǎn)原子FPGA連載】第九按鍵控制LED燈實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)FPGA開發(fā)指南_V2.1
    發(fā)表于 12-04 13:06 ?10次下載
    【正點(diǎn)原子FPGA連載】第九<b class='flag-5'>章</b>按鍵控制<b class='flag-5'>LED</b>燈實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)<b class='flag-5'>之</b>FPGA<b class='flag-5'>開發(fā)指南</b>_V2.1
    RM新时代网站-首页