更多内容请访问:与华为官方合作建立的鸿蒙技术社区https://harmonyos.51cto.com最后,我希望用完的效果能出来。如下:HDF驱动框架探路者5:前言要想深入了解HDF框架,就不能绕过linux驱动的掌握。看了魏东山老师对openharmony的移植,感觉linux驱动的内部供电还是很有必要的,所以本文对比了linux应用点亮imx6ull中的LED灯。所以先练内功。本文框架图本文框架图是结合近期3516测试HDF框架和imx6ull上linux驱动的学习。它基于社区目前使用的几个板和openharmony和linux。对比做出来的图片,如果觉得这张图有什么问题,欢迎大家批评指正。一、驱动1.1最简单的驱动逻辑如上图所示。首先是驱动入口函数和出口函数,分别是module_init(led_init)和module_exit(led_exit);然后分别实现led_open和led_write这两个业务函数。填充file_operations结构。最后将file_operations结构体放入register_chrdev函数中进行注册,再放入入口函数中。因为驱动的字符设备需要绑定到IO设备上使用,所以在入口函数中调用了class_create和device_create。1.2完成的实际代码如下:#include#include#include#include#include#include#include#include#include#include#include#includestaticintmajor;staticstructclass*led_class;/*registers*///IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3地址:0x02290000+0x14staticvolatileunsignedint*IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3;//GPIO5_GDIR地址:0x020AC004staticvolatileunsignedint*GPIO5_GDIR;//GPIO5_DR地址:0x020AC000staticvolatileunsignedint*GPIO5_DR;staticssize_tled_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*ppos){charval;intret;/*copy_from_user:getdatafromapp*/ret=copy_from_user(&val,buf,1);/*tosetgpioregister:out1/0*/if(val){/*setgpiotoletledon*/*GPIO5_DR&=~(1<<3);}else{/*setgpiotoletledoff*/*GPIO5_DR|=(1<<3)undefinedVS_SW_MUX_CTL_PAD_SNVS_TAMPER3);iounmap(GPIO5_GDIR);iounmap(GPIO5_DR);device_destroy(led_class,MKDEV(major,0));class_destroy(led_class);unregister_chrdev(major,"hello_led");}module_init(led_init);module_exit);(led_exit)MODULE_LICENSE("GPL");2、驱动测试部分2.1测试模块实现思路在linux内核中注册相应的驱动模块后,通过glibc库函数提供的打开、读写接口访问驱动,绑定驱动字符设备IO文件即可直接调用到对应的驱动2.2测试部分完成及实现代码#include#include#include#include#include#包括//ledtest/dev/helloledon//ledtest/dev/helloledoffintmain(intargc,char**argv){intfd;charstatus=0;if(argc!=3){printf("用法:%s\n",argv[0]);printf("例如:%s/dev/helloledon\n",argv[0]);printf("例如:%s/dev/helloledon\n",argv[0]);return-1;}//openfd=open(argv[1],O_RDWR);if(fd<0){printf("cannotopen%s\n",argv[0]);return-1;}//writeif(strcmp(argv[2],"on")==0){status=1;}write(fd,&status,1);return0;}3.编译3.1编译思路:首先,你需要将驱动编译成ko文件。将测试程序编译成可执行文件。3.2完成实现代码如下:KERN_DIR=/home/qzk/code/imx6ullPro/Linux-4.9.88all:make-C$(KERN_DIR)M=`pwd`modules$(CROSS_COMPILE)gcc-oledtestledtest.cclean:make-C$(KERN_DIR)M=`pwd`modulescleanrm-rfmodules.orderrm-fledtestobj-m+=led_drv.o上面的代码需要注意,使用时需要替换掉KERN_DIR中的值,替换成自己的内核目录,因为编译有时候会去这个目录下找头文件。4、安装测试用驱动4.1安装驱动思路通过以上步骤,你会发现驱动已经编译好,并放置在ubuntu系统中。我们的目标是将驱动安装到imx6ull中,所以我们的目标是将安装驱动的程序放入imx6ull中。这里的解决方法是:把网线插到电脑上,然后串口接imx6ull,先把ip地址写死,目标是两者能ping通,然后建nfs,这样就达到了目的imx6ull访问ubuntu4.2下的驱动Buildit环境安装好后,通过insmod命令安装驱动。4.3执行测试文件点亮和关灯如下图:如果执行命令没有意外的话,这个灯在你的控制之下/resource/1583更多信息请访问:Harmonyos技术社区与华为官方共建https://harmonyos.51cto.com