年前就把硬件拿到手了,结果被各种事情,加上个人的懒惰。一直拖到现在才把驱动跑起来。
板子是明远智瑞的开发板。驱动源码。是从git上面下载的。抱着试试的想法,结果可喜。
驱动源码下载链接
主要的麻烦就是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)
就会生成响应的驱动模块。如下图
然后把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这里修改了。这也是驱动代码中我唯一修改的地方。
到此,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,则停止
可以用cat命令: cat temperature
针对autoupdate_timeout_ms参数的修改如下图。
到此,使用说明完毕!!!!再次撒花
先简单讲一下,我的理解(别人博客扒来的QAQ)
一、在 linux 内核中增加程序需要完成以下三项工作:
将编写的源代码复制到 Linux 内核源代码的相应目录;
在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项;
在目录的 Makefile 文件中增加对新源代码的编译条目。
设备驱动程序存放在内核源码树根目录 drivers/ 的子目录下,在其内部,设备驱动文件进一步按照类别,类型等有序地组织起来。
a. 字符设备存在于 drivers/char/ 目录下
b. 块设备存放在 drivers/block/ 目录下
那么如何区分:(这段百度知道上扒来的)
Linux中I/O设备分为两类:字符设备和块设备。两种设备本身没有严格限制,但是,基于不同的功能进行百了分类。
(1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节度/字符来读写数据。举例来说,键盘、串口、调制解调器都是典型的字符设备。
(2)块设备:应用程序可以随机访问设备数据,程序可自行确定读取数据的回位置。硬盘、软盘、CD-ROM驱动器和闪存都是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。答此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。
总结一下,这两种类型的设备的根本区别在于它们是否可以被随机访问。字符设备只能顺序读取,块设备可以随机读取。
我这里简单理解为:块设备就是存储的磁盘类,字符设备就是键盘,鼠标什么的。
linux-4.1.15\drivers\char 的目录下新建一个dht22的目录。把驱动源代码考进去,就是箭头所指的。其他的东西都是编译文件。一个就5个文件。
这里我在Makefile文件的最后一行添加了这个
obj-$(CONFIG_DHT22) += dht22/
在最后面添加下面的语句
config DHT22
tristate "DHT22_driver"
help
for more information
注意以下两点
内容如下:
obj-$(CONFIG_DHT22) += dht22.o dht22_sm.o
这里的CONFIG_DHT22和上面修改char目录下的Makefile中就对应到了
然后就会进入这样的一个图形配置界面
我们依次进入
Device Drivers
Character devices
然后就会找到,我们前面修改好的这的名字就是修改char目录下的Kconfig时我们写的。
*表示编译进内核 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