LINUX下DHT22驱动调试

年前就把硬件拿到手了,结果被各种事情,加上个人的懒惰。一直拖到现在才把驱动跑起来。

如题,记录一下,温湿度模块DHT22的驱动加载。

板子是明远智瑞的开发板。驱动源码。是从git上面下载的。抱着试试的想法,结果可喜。

驱动源码下载链接

首先是linux下module的编译也就是模块驱动的编写

主要的麻烦就是Makefile的编写,新手一个,踩了很多坑。
参考了下面的链接,帮我解决了多个.C文件编译生成一个模块驱动 .ko的麻烦。
http://blog.sina.com.cn/s/blog_4cd5d2bb0101en6i.html
下面是我自己这个板子可以用的Makefile。


obj-m += dht22_drive.o
dht22_drive-objs = dht22.o dht22_sm.o 

KERNELDIR:=/home/linkorTech/my-work/02_Source/linux-4.1.15
all:
	make -C $(KERNELDIR) M=$(PWD) modules
clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers

第一行:是驱动模块的名字,生成后就是dht22_drive.ko
第二行:对应的驱动源码中有eth22.c 和eth22_sm.c 两源文件。这样就可以把多个C文件关联起来了。具体在上面的链接中有介绍。
第三行,是我板子源码的地址,我这里使用的开发板。在配置的编译环境的时候,ARCH和CROSS_COMPILE不用设置,交叉编译工具的脚本默认就设置好ARCH和CROSS_COMPILE

所以只需要进入,到驱动源码发目录下,执行make。这里是在我的虚拟机下进行的。(对了虚拟机也是官方提供的有教程,感觉有点广告嫌疑。。。QAQ)
就会生成响应的驱动模块。如下图
LINUX下DHT22驱动调试_第1张图片
然后把dht22_drive.ko,传到自己的开发板里。

在这里插入图片描述
使用 insmod dht22_drive.ko 加载驱动模块
在这里插入图片描述
卸载驱动模块是 rmmod dht22_drive.ko
在这里插入图片描述
加载完毕,只要硬件正常,那么,就会打印出此时的读数。
注意引脚的修改。我这里使用是P4脚。
查了相关手册是 MX6UL_PAD_GPIO1_IO05__PWM4_OUT。
引脚号是32*(1-1)+5=5。
在dht22.h这里修改了。这也是驱动代码中我唯一修改的地方。
LINUX下DHT22驱动调试_第2张图片
到此,DHT22模块的模块驱动调试完毕!!!!撒花!!

接下来是应用

驱动加载完毕后
在板子的/sys/kernel 目录下会生成一个的dht22的目录
进入改目录下,查看存在一下文件
在这里插入图片描述temperature: (只读)-显示最近的温度读数,以摄氏度为单位,例如“ 16.5”
humidity: (只读)-以百分比显示最近的湿度读数,例如“ 14.2%”
gpio_number: (只读)-显示传感器所连接的gpio。这是只读的,修改引脚的方法以及写在上面了。
autoupdate: (读写)-显示或更改自动更新设置。写除0以外的任何内容都解释为true。
autoupdate_timeout_ms:(读写)-显示或更改触发事件之间的间隔。仅当autoupdate设置为时,它才有效true。默认2000,且不得小于2000.因为这个模块的响应还是比较慢的。
trigger: (只写)- 如果autoupdate设置为false或自上次读取以来已经经过了足够的时间,则向该文件写入0以外的任何值都会导致触发事件。

使用分析

这里使用echo命令向trigger中写入1,就会触发一次温湿度模块的数据读取。读取到的值是保存在humidity和temperature中的。
在这里插入图片描述
对autoupdate 写入1 就会每隔两秒打印一次数据;写入0,则停止
LINUX下DHT22驱动调试_第3张图片

注意 humidity和temperature里保存的是上一次读取的值,不是实时的!!!!

可以用cat命令: cat temperature
在这里插入图片描述
针对autoupdate_timeout_ms参数的修改如下图。
在这里插入图片描述

到此,使用说明完毕!!!!再次撒花

2020年5月16日补充一下直接将dht驱动程序编译进zimage内核中的方法

先简单讲一下,我的理解(别人博客扒来的QAQ)
一、在 linux 内核中增加程序需要完成以下三项工作:

  1. 将编写的源代码复制到 Linux 内核源代码的相应目录;

  2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项;

  3. 在目录的 Makefile 文件中增加对新源代码的编译条目。

设备驱动程序存放在内核源码树根目录 drivers/ 的子目录下,在其内部,设备驱动文件进一步按照类别,类型等有序地组织起来。

a. 字符设备存在于 drivers/char/ 目录下

b. 块设备存放在 drivers/block/ 目录下

那么如何区分:(这段百度知道上扒来的)
Linux中I/O设备分为两类:字符设备和块设备。两种设备本身没有严格限制,但是,基于不同的功能进行百了分类。
(1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节度/字符来读写数据。举例来说,键盘、串口、调制解调器都是典型的字符设备。
(2)块设备:应用程序可以随机访问设备数据,程序可自行确定读取数据的回位置。硬盘、软盘、CD-ROM驱动器和闪存都是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。答此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。
总结一下,这两种类型的设备的根本区别在于它们是否可以被随机访问。字符设备只能顺序读取,块设备可以随机读取。

我这里简单理解为:块设备就是存储的磁盘类,字符设备就是键盘,鼠标什么的。

开始移植

一、首先,我这里在我的内核源码

linux-4.1.15\drivers\char 的目录下新建一个dht22的目录。把驱动源代码考进去,就是箭头所指的。其他的东西都是编译文件。一个就5个文件。

LINUX下DHT22驱动调试_第4张图片

二、修改char目录下的Makefile

这里我在Makefile文件的最后一行添加了这个

obj-$(CONFIG_DHT22)   += dht22/

在这里插入图片描述
注意以下两点

  1. CONFIG_DHT22 //这个叫啥我也不知道,但是在后面修改dht22目录下的Makefile会用到。
  2. dht22/ //也就是驱动源文件的目录

三、修改char目录下的Kconfig

在最后面添加下面的语句

config DHT22
	tristate "DHT22_driver"
	help
	for more information

注意以下两点

  1. 第二行 DHT22_driver 这个在后面的Make menuconfig中会遇到。
  2. for more information 这里感觉好像是用来添加描述该驱动的信息

LINUX下DHT22驱动调试_第5张图片

四、 修改dht22目录下的Makefile

内容如下:

obj-$(CONFIG_DHT22) += dht22.o dht22_sm.o

这里的CONFIG_DHT22和上面修改char目录下的Makefile中就对应到了

五、在linux-4.1.15\目录下,执行make menuconifg

在这里插入图片描述

然后就会进入这样的一个图形配置界面
LINUX下DHT22驱动调试_第6张图片
我们依次进入
Device Drivers
Character devices
然后就会找到,我们前面修改好的这的名字就是修改char目录下的Kconfig时我们写的。

LINUX下DHT22驱动调试_第7张图片
*表示编译进内核 M表示编译为.ko文件作为一个可以加载的模块驱动。
然后就可以保存退出。

六、编译内核系统

执行make,就开始编译,编译完成后。
当然,我这里是已经提前配置后编译环境的。
arch/arm/boot/zImage 即内核目标文件
把系统烧写进板子,登入进入/sys/kernel 目录,会看到已经又dht22的目录了。其他的就和上面的一样了

哈哈再次完结撒花!!!!!

其他参考链接
https://blog.csdn.net/k1ang/article/details/98789397
https://www.cnblogs.com/wi100sh/p/4552380.html

你可能感兴趣的:(DHT22,linux,嵌入式)