OpenWrt开发(5)-- 添加自己的应用 -- 在命令行读写寄存器数值

在上一篇文章:OpenWrt开发(4)-- 添加内核驱动模块 – 读写寄存器 中我们添加了一个在可以读写寄存器数据的内核驱动,为了方便在命令行读写寄存器数值来进行调试,故再添加一个应用来方便在命令行调用内核驱动读写寄存器数值。

建立应用源码目录

package/utils/reg

  1. 在OpenWrt代码库中新建package/utils/reg文件夹。
  2. 在新建的文件夹下新建一个src文件夹用于存放驱动源码,例:package/utils/reg/src

添加第一层Makefile

package/utils/reg文件夹下新建一个Makefile文件,内容参考如下

#引入OpenWrt内置的规则文件
include $(TOPDIR)/rules.mk

#定义软件包的名称和版本号
PKG_NAME:=reg
PKG_RELEASE:=1

#指定软件包的编译目录
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

#引入OpenWrt内置的包配置文件
include $(INCLUDE_DIR)/package.mk

#定义软件包reg的相关信息
define Package/reg
SECTION:=utils
CATEGORY:=Utilities
DEPENDS:= +kmod-drv_regopt
TITLE:=reg modify the register from user area
endef

#定义软件包reg的描述信息
define Package/reg/description
endef

#定义编译前的准备工作
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef

#定义软件包reg的安装方法
define Package/reg/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/reg $(1)/bin/
endef

#调用OpenWrt的BuildPackage函数生成软件包reg的相关规则
$(eval $(call BuildPackage,reg))

编写应用C代码及对应的Makefile文件

编写应用C代码

package/utils/reg/src文件夹下新建一个reg.c文件,内容参考如下:

#include <stdio.h> // 包含标准输入输出函数库

#include <sys/types.h> // 包含类型定义
#include <sys/stat.h>  // 包含文件状态信息的函数库
#include <fcntl.h>     // 包含文件控制函数库
#include <stdio.h>     // 包含标准输入输出函数库

#define FALSE -1 // 定义FALSE值为-1
#define TRUE 0   // 定义TRUE值为0

#define DEV_NAME "/dev/regopt" // 定义设备文件名为"/dev/regopt"

int main(int argc, char **argv) // main函数
{
    int fd;               // 文件描述符
    unsigned long val[2]; // 无符号长整型数组

    if (argc < 3 || argc > 4) // 参数错误提示
    {
        printf("Usage : %s r addr \n", argv[0]);
        printf("Usage : %s w addr value\n", argv[0]);
        return FALSE; // 返回FALSE值
    }

    fd = open(DEV_NAME, O_RDWR); // 打开设备文件
    if (fd < 0)                  // 打开失败
    {
        printf("can't open!\n"); // 输出错误信息
        return FALSE;            // 返回FALSE值
    }

    val[0] = strtol(argv[2], NULL, 16); // 将参数2转换为16进制的长整型并存储在val[0]中
    if (*(argv[1]) == 'w')              // 如果参数1是'w'
    {
        val[1] = strtol(argv[3], NULL, 16); // 将参数3转换为16进制的长整型并存储在val[1]中
        write(fd, val, 8);                  // 向设备文件写入数据
    }
    else if (*(argv[1]) == 'r') // 如果参数1是'r'
    {
        read(fd, val, 8);                            // 从设备文件读取数据
        printf("add:0x%x = 0x%x\n", val[0], val[1]); // 输出读取到的数据
    }
    close(fd); // 关闭设备文件
    return 0;  // 返回0
}

编写二级Makefile

package/utils/reg/src文件夹下新建一个Makefile文件,内容参考如下:

# build testio executable when user executes "make"

appreg: reg.o
	$(CC) $(LDFLAGS) reg.o -o reg

appreg.o: reg.c
	$(CC) $(CFLAGS) -c reg.c

# remove object files and executable when user executes "make clean"
clean:
	rm *.o appreg

编译应用

命令行输入make menuconfig,选中新建立的应用:

$ make menuconfig
  Utilities —>
    reg

如果路径下找不到新的应用选项,则在命令行中先清除编译缓存再输入make menuconfig进入配置页面即可:

$ make clean
$ rm -r tmp
$ make menuconfig

随后便可以进行应用编译或者直接把应用编译到系统固件中:

##只编译这个驱动模块
$ make package/utils/reg
##重新编译系统固件
$ make -j 8 V=s

使用说明

可以使用reg命令读写寄存器
例如修改GPIO1 mode寄存器:

$ reg r 10000060
add:0x10000060 = 0x54044450

$ reg w 10000060 54044405

$ reg r 10000060
add:0x10000060 = 0x54044405

$ reg w 10000060 54044450

$ reg r 10000060
add:0x10000060 = 0x54044450
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值