imx6ul linux读取DS18B20温度

2024-05-14 22:32

本文主要是介绍imx6ul linux读取DS18B20温度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

imx6ul linux读取DS18B20温度

首先尝试加载模块

root@imx6ulevk:~# modprobe w1-gpio
modprobe: FATAL: Module w1-gpio not found in directory /lib/modules/4.1.15-2.1.0+g30278ab

imx6ul 内核默认没有开启W1的内核选项所以没有这个模块。

1.驱动源码

源码目录:~/freescale/linux-imx/drivers/w1
w1-gpio.c是单总线的IO操作方法,用于模拟单总线时序;
w1_therm.c是DS18B20的寄存器操作方法,和IO时序无关;
可以将驱动结构看成是将“w1_therm”挂接到“w1-gpio”总线上,由w1-gpio控制w1_therm工作。

2.编译模块

开启内核选项

wujun@wj-vBox:~/freescale/linux-imx$ make menuconfig
CONFIG_W1=m
CONFIG_W1_CON=y
CONFIG_W1_MASTER_GPIO=m
CONFIG_W1_SLAVE_THERM=m

编译

wujun@wj-vBox:~/freescale/linux-imx$ make modules
CC [M] drivers/w1/w1.o
CC [M] drivers/w1/w1_int.o
CC [M] drivers/w1/w1_family.o
CC [M] drivers/w1/w1_netlink.o
CC [M] drivers/w1/w1_io.o
LD [M] drivers/w1/wire.o
CC [M] drivers/w1/masters/w1-gpio.o
CC [M] drivers/w1/slaves/w1_therm.o
Building modules, stage 2.
MODPOST 70 modules
CC drivers/w1/masters/w1-gpio.mod.o
LD [M] drivers/w1/masters/w1-gpio.ko
CC drivers/w1/slaves/w1_therm.mod.o
LD [M] drivers/w1/slaves/w1_therm.ko
CC drivers/w1/wire.mod.o
LD [M] drivers/w1/wire.ko

拷贝出内核模块到tftp共享目录

wujun@wj-vBox:~/freescale/linux-imx$ cp drivers/w1/wire.ko ~/share-doc/
wujun@wj-vBox:~/freescale/linux-imx$ cp drivers/w1/masters/w1-gpio.ko ~/share-doc/
wujun@wj-vBox:~/freescale/linux-imx$ cp drivers/w1/slaves/w1_therm.ko ~/share-doc/

把下面三个内核模块放在EVB /lib/modules/4.1.15-2.1.0+g30278ab/kernel路径下.
./drivers/w1/wire.ko
./drivers/w1/masters/w1-gpio.ko
.drivers/w1/slaves/w1_therm.ko

这种情况下还是不能用modprobe加载的,只能用insmod手动加载。因为没有生成依赖文件。
可以用make modules_install命令,这个命令会把模块都放到/lib/modules下,需要超级用户权限。
查看生成的模块依赖文件的内容。
在虚拟机/lib/modules/4.1.15-00158-g30278ab/modules.dep
61:kernel/drivers/w1/masters/w1-gpio.ko: kernel/drivers/w1/wire.ko
62:kernel/drivers/w1/slaves/w1_therm.ko: kernel/drivers/w1/wire.ko
63:kernel/drivers/w1/wire.ko:

可以看到w1-gpio.ko和w1_therm.ko依赖wire.ko.
wire.ko不依赖其他的模块.

3.加载模块

我这边暂时使用手动加载的方式,不更新模块了。

root@imx6ulevk:~# insmod /lib/modules/4.1.15-2.1.0+g30278ab/kernel/drivers/w1/wire.ko
Driver for 1-wire Dallas network protocol.
root@imx6ulevk:~# insmod /lib/modules/4.1.15-2.1.0+g30278ab/kernel/drivers/w1/masters/w1-gpio.ko
root@imx6ulevk:~# lsmod
Module Size Used by
w1_gpio 3113 0
wire 28158 1 w1_gpio
root@imx6ulevk:/sys/bus/w1# ls
devices drivers drivers_autoprobe drivers_probe uevent

device下没有文件。应该是DTS里没有定义IO的原因。

4.根据驱动修改dts

查找驱动要查找的节点名称

wujun@wj-vBox:~/freescale/linux-imx/drivers/w1$ grep -rn “compatible” .
./masters/w1-gpio.c:72: { .compatible = “w1-gpio” },

新增文件arch/arm/boot/dts/imx6ul-14×14-evk-w1.dts
#include “imx6ul-14×14-evk.dts”
/ {
onewire@0 {
compatible = “w1-gpio”;
gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
linux,open-drain;
pinctrl-names = “default”;
pinctrl-0 = <&pinctrl_onewire>;
status = “okay”;
};
};

修改文件arch/arm/boot/dts/imx6ul-14×14-evk.dts

pinctrl_onewire: onewire@0 {
fsl,pins = <
MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 0x4001b8b0

;
};

重新编译内核,拷贝出编译结果,实际上可以只编译dtbs.

wujun@wj-vBox:~/freescale/linux-imx$ cp arch/arm/boot/zImage ~/share-doc/
wujun@wj-vBox:~/freescale/linux-imx$ cp arch/arm/boot/dts/imx6ul-14×14-evk-w1.dtb ~/share-doc/

5.uboot下载内核

tftp 0x81000000 zImage;tftp 0x81A00000 imx6ul-14×14-evk-w1.dtb;bootz 0x81000000 – 0x81A00000;

上传模块到文件系统
root@imx6ulevk:/lib/modules/4.1.15-2.1.0+g30278ab/kernel/drivers/w1# ls
masters slaves wire.ko

6.加载模块


root@imx6ulevk:~# insmod /lib/modules/4.1.15-2.1.0+g30278ab/kernel/drivers/w1/wire.ko
Driver for 1-wire Dallas network protocol.
root@imx6ulevk:~# insmod /lib/modules/4.1.15-2.1.0+g30278ab/kernel/drivers/w1/masters/w1-gpio.ko
root@imx6ulevk:~# insmod /lib/modules/4.1.15-2.1.0+g30278ab/kernel/drivers/w1/slaves/w1_therm.ko
root@imx6ulevk:~# lsmod
Module Size Used by
w1_therm 3493 0
w1_gpio 3113 0
wire 28158 2 w1_gpio,w1_therm

查看内核log
[ 42.363031] Driver for 1-wire Dallas network protocol.
[ 49.544609] w1_master_driver w1_bus_master1: Family 28 for 28.04170349c8ff.20 is not registered.
[ 49.621696] ci_hdrc ci_hdrc.0: there is a vbus glitch
查看设备
root@imx6ulevk:~# ls -l /sys/bus/w1/devices/
total 0
lrwxrwxrwx 1 root root 0 Jan 1 00:09 w1_bus_master1 -> ../../../devices/w1_bus_master1

接入DS18B20后可以看到有个新的设备
root@imx6ulevk:~# ls /sys/bus/w1/devices/
28-04170349c8ff w1_bus_master1

7.查看温度


root@imx6ulevk:~# cat /sys/bus/w1/devices/28-04170349c8ff/w1_slave
bf 01 4b 46 7f ff 0c 10 61 : crc=61 YES
bf 01 4b 46 7f ff 0c 10 61 t=27937

8.用脚本读取温度

root@imx6ulevk:~/rd_temp# ./rd_temp.sh
e1 01 4b 46 7f ff 0c 10 c5 ; 01-01-1970-00:15:15 ; 30.062
e1 01 4b 46 7f ff 0c 10 c5 ; 01-01-1970-00:15:18 ; 30.062
e0 01 4b 46 7f ff 0c 10 86 ; 01-01-1970-00:15:22 ; 30.000
e0 01 4b 46 7f ff 0c 10 86 ; 01-01-1970-00:15:26 ; 30.000
df 01 4b 46 7f ff 0c 10 80 ; 01-01-1970-00:15:30 ; 29.937
df 01 4b 46 7f ff 0c 10 80 ; 01-01-1970-00:15:34 ; 29.937
de 01 4b 46 7f ff 0c 10 c3 ; 01-01-1970-00:15:37 ; 29.937
de 01 4b 46 7f ff 0c 10 c3 ; 01-01-1970-00:15:41 ; 29.875

这篇关于imx6ul linux读取DS18B20温度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/990038

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

Linux 下的Vim命令宝贝

vim 命令详解(转自:https://www.cnblogs.com/usergaojie/p/4583796.html) vi: Visual Interface 可视化接口 vim: VI iMproved VI增强版 全屏编辑器,模式化编辑器 vim模式: 编辑模式(命令模式)输入模式末行模式 模式转换: 编辑-->输入: i: 在当前光标所在字符的前面,转为输入模式

Linux和Mac分卷压缩

使用 zip 命令压缩文件 使用 zip 命令压缩文件,并结合 split 命令来分卷: zip - largefile | split -b 500k 举例: zip - ./tomcat.dmg |split -b 500k 上述命令将文件 largefile 压缩成 zip 包并分卷成不超过 500k 的文件,分解后文件名默认是 x* ,后缀为 2 位a-z 字母,如 aa、ab。

Linux文本三剑客sed

sed和awk grep就是查找文本当中的内容,最强大的功能就是使用扩展正则表达式 sed sed是一种流编辑器,一次处理一行内容。 如果只是展示,会放在缓冲区(模式空间),展示结束后,会从模式空间把结果删除 一行行处理,处理完当前行,才会处理下一行。直到文件的末尾。 sed的命令格式和操作选项: sed -e '操作符 ' -e '操作符' 文件1 文件2 -e表示可以跟多个操作