在上一篇文章:OpenWrt开发(4)-- 添加内核驱动模块 – 读写寄存器 中我们添加了一个在可以读写寄存器数据的内核驱动,为了方便在命令行读写寄存器数值来进行调试,故再添加一个应用来方便在命令行调用内核驱动读写寄存器数值。
建立应用源码目录
package/utils/reg
- 在OpenWrt代码库中新建
package/utils/reg
文件夹。 - 在新建的文件夹下新建一个
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