最近学习linux驱动,前面讲述了字符型驱动开发的驱动编写框架以及具体步骤,而LED驱动是字符型驱动中最基础的,本次我们就来学习一下linux的LED灯驱动开发步骤,同时源码放出来供大家参考。
本次驱动开发适用于全志,瑞芯微的开发板,其他开发板应该也同样适用,毕竟对于GPIO口的操作就那几个寄存器。我手上刚好有一块orangepi_3_lts板子(基于全志H6),所以我是基于这块板子来写LED灯驱动程序的,对于orangepi_3_lts这块板子,想要运行自己的驱动程序需要先加载内核头文件,具体步骤就不再赘述了,忘记的同学可以查看我的上一篇关于linux字符型驱动的文章,文章地址:Orangepi3_lts字符驱动编写框架及具体步骤_香橙派3b驱动编写-CSDN博客
同时本次LED灯驱动源码(包括驱动源码,Makefile,上层App测试程序)地址:香橙派LED灯内核驱动源码,包括驱动文件,makefile和上层测试app资源-CSDN文库
好,步入正题,我们先把操作步骤说清楚,至于源码是怎么写的,我们后面再说。假设我们现在已经编写好的驱动源码,Makefile和上层App测试程序,驱动源码编译成ko文件需要需要将源码放到开发板里,在开发板里编译,在虚拟机里编译会出错,香橙派会存在这么一个问题,不知道有没有大佬有解决方案。上层测试app可以在虚拟机里使用交叉编译器编译成可执行文件,编译命令如下:
/home/chuan-plus/my_orangepi3_lts/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc ledApp.c -o ledApp
编译之后将所需要的文件全部发送到开发板运行的系统上,注意,本次文件传输是通过网络进行传输的,需要开发板联网,由于orangepi_3_lts是板载wifi的,可以无线上网,不需要接网线(这也是我选择orangepi_3_lts的一个重要原因),发送命令如下:
scp -r 02_led [email protected]:/home/orangepi/mydriver
发送到开发板之后,通过如下命令查看本次使用的设备号有没有被占用。
cat /proc/devices
之后进入02_led/目录,使用如下命令编译驱动模块
make ARCH=arm64
编译之后会生成.ko文件,通过如下命令加载驱动
insmod led.ko
加载完驱动之后同样可以使用上面的命令查看该驱动对应的设备号等,之后使用如下命令创建设备节点
mknod /dev/led c 200 0
最后就是运行我们编写的测试App控制灯的亮灭了,命令如下:
./ledApp /dev/led 1
./ledApp /dev/led 0
至此加载以及测试流程完毕,下面简单介绍驱动程序如何写:
驱动主要流程就是写寄存器,包括IO口做什么引脚用,引脚驱动水平,输入输出模式以及读写高低电平四个寄存器,在手册上可以找到,通过源码具有较为详细的注释,方便学习。
最后贴一张测试成功的点灯图片: