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

相关文章

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Linux:alias如何设置永久生效

《Linux:alias如何设置永久生效》在Linux中设置别名永久生效的步骤包括:在/root/.bashrc文件中配置别名,保存并退出,然后使用source命令(或点命令)使配置立即生效,这样,别... 目录linux:alias设置永久生效步骤保存退出后功能总结Linux:alias设置永久生效步骤

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动