Makefile文件
KERNELDIR := /home/xfg/linux/imx_7ull/i2x_6ub/system_file/i2SOM-iMX-Linux CURRENT_PATH := $(shell pwd) obj-m := dtsled.o build: kernel_modules kernel_modules: $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules clean: $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) cleanledApp.c应用测试文件
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> /* *argc:应用程序参数个数 *argv[]:具体的参数内容,字符串形式 *./ledApp <filename> <0:1> 0表示关,1表示开 *./ledApp /dev/dtsled 0 关闭led灯 *./ledApp /dev/dtsled 1 打开led灯 * */ #define LEDOFF 0 #define LEDON 1 int main(int argc, char *argv[]) { int ret = 0; int fd = 0; char *filename; unsigned char databuf[1]; if(argc !=3) { printf("Instruction usage error!!!\r\n"); printf("./ledApp <filename> <0:1> 0表示关,1表示开\r\n"); printf("./ledApp ./dev/dtsled 1 \r\n"); return -1; } filename = argv[1]; fd = open(filename, O_RDWR); if(fd < 0) { printf("open file %s failed\r\n", filename); } databuf[0] = atoi(argv[2]); ret = write(fd, databuf, sizeof(databuf)); if(ret < 0) { printf("write file %s failed\r\n", filename); } ret =close(fd); if(ret <0) { printf("close file %s falied!\r\n", filename); } return 0; } 六、测试 1.设备树测试回到内核源码的根目录下重新编译设备树文件,编译命令
make dtbs编译完成后将/arch/arm/boot/dts目录下的i2c6ulxb-i2s6ull-emmc.dtb拷贝至tftp服务器下,然后重启开发版即可,我使用的是nfs挂载根文件系统的方式进行测试的,当然也可以直接更新开发板中的设备树,只是这样比较麻烦,开发中不建议这么操作。
重新启动后,进入/proc/device-tree/目录下查看我们更改的节点信息是否存在,如下图所示:
可知我们添加的desled节点信息是确定的,接下来测试驱动。 1.驱动测试
将应用文件和驱动文件编译后拷贝到开发版的/lib/modules/4.1.43/目录下,挂载led驱动,如下图所示:
挂载成功后可以看到我们申请的gpio引脚编号是133,最后通过应用测试led是否能打开和关闭,如下图所示:
如果能正常打开和关闭led灯,说明我们的驱动和应用程序没有问题,若有写得不好的地方,望各位大佬指出。 参考文献
gpio子系统和pinctrl子系统(上):https://www.cnblogs.com/rongpmcu/p/7662751.html
Linux 驱动学习笔记 - gpio 子系统 (八):https://blog.csdn.net/tyustli/article/details/105484666