【milkv】1、光感bh1750驱动添加及测试

news2024/11/25 2:45:53

前言

本章介绍在milkv-duo开发板上添加光感bh1750,并实现应用层测试。

一、电路图查看

1.1 duo开发板i2c引脚

https://github.com/milkv-duo/duo-files
在这里插入图片描述

这些都是可以作为i2c使用的引脚
在这里插入图片描述

注意:电路图中的gpio0、1对应的是芯片上的gpio28、29,到dtsi中查看也是28、29。

电路图中检索gpio0、1即可找到对应的电路

如图,小板的gpio0、1的默认功能是IIC_SCL、IIC_SDA

而最左边框出来的是这个引脚可以复用的功能,具体需要到dtsi中打开对应的节点。
在这里插入图片描述

1.2 光感bh1750引脚

在这里插入图片描述

我买的是合宙的bh1750,已经下架了,可以找市面上已有的。

从左到右分别是addr | sda | scl | gnd | vcc

光感和duo板连接线路

bh1750  |  duo 
vcc     |  3.3v(out)
gnd     |  gnd
scl     |  gpio0(gpio28)
sda     |  gpio1(gpio29)
addr    |  gnd

二、dtsi添加

dts基础:https://blog.csdn.net/qq_53144843/article/details/123829747

dts文件路径:build\boards\cv180x\cv1800b_milkv_duo_sd\dts_riscv\cv1800b_milkv_duo_sd.dts

将如下内容添加到dts中

&i2c0 {
    status = "okay";
	clock-frequency = <100000>;
    bh1750:bh1750@23 {
        compatible = "rohm,bh1750";
        reg = <0x23>;
        status = "okay";
    };
};

其中23为bh1750的addr接地的i2c地址,具体可以看驱动以及传感器的文档。

Dtsi中增加后,编译img并刷机,查看devicetree下是否增加

# cd /sys/firmware/devicetree/base/i2c@04000000/bh1750@23
# cat name
bh1750

duo-buildroot-sdk\build\boards\default\dts\cv180x\cv180x_base.dtsi

i2c0: i2c@04000000 {
		compatible = "snps,designware-i2c";
		clocks = <&clk CV180X_CLK_I2C>;
		reg = <0x0 0x04000000 0x0 0x1000>;
		clock-frequency = <400000>;

		#size-cells = <0x0>;
		#address-cells = <0x1>;
		resets = <&rst RST_I2C0>;
		reset-names = "i2c0";
	};

这里的4000000就是i2c0控制器的地址,对应的device tree路径/sys/firmware/devicetree/base/i2c@04000000

三、bh1750驱动

注意需要和dtsi中匹配

ko基础:https://blog.csdn.net/li_man_man_man/article/details/126534271

添加驱动两种方法,我才用的是第二种。

3.1 编写驱动最终生成ko文件

参考:https://blog.csdn.net/ZOROE123/article/details/117442036

优点:可以手动添加及卸载

缺点:需要自己实现驱动,可以参考git和csdn上检索“sensor名称+linux“检索的相关code

3.2 打开config,将现有的驱动编译进img(config=y)

优点:不用自己实现驱动

缺点:适用于sdk已经有了驱动,不可动态卸载

bh1750驱动路径:
https://github.com/milkv-duo/duo-buildroot-sdk/blob/develop/linux_5.10/drivers/iio/light/bh1750.c

具体内容分析放到应用层介绍

查看驱动的Config配置流程

duo-buildroot-sdk\\linux_5.10\\drivers\\Makefile
obj-$(CONFIG_IIO)              += iio/

duo-buildroot-sdk\\linux_5.10\\drivers\\iio\\Makefile
obj-y += light/

duo-buildroot-sdk\\linux_5.10\\drivers\\iio\\light\\Makefile
obj-$(CONFIG_BH1750)             += bh1750.o

配置config文件

路径:

duo-buildroot-sdk\\build\\boards\\cv180x\\cv1800b_milkv_duo_sd\\linux\\cvitek_cv1800b_milkv_duo_sd_defconfig

添加内容如下

CONFIG_IIO=y
CONFIG_BH1750=y

查看编译log

CC drivers/iio/light/bh1750.o

表示已经bh1750的驱动编译完成。

完成后刷到tf卡后开机。

检索bh1750,发现有驱动以及设备树信息

在这里插入图片描述

3.3 i2c0报错

查看i2c是否加载上

i2cdetect -y -r 0

发现没有i2c地址显示

报错

[    1.943778] i2c_designware 4000000.i2c: controller timed out
[    1.949738] bh1750: probe of 0-0023 failed with error -110

提示i2c0 控制器time out。

3.4 解决

方法1:通过uboot中的驱动更改默认的pin配置

查看io默认状态

duo-buildroot-sdk\build\boards\cv180x\cv1800b_milkv_duo_sd\u-boot\cvi_board_init.c

原先配置

PINMUX_CONFIG(IIC0_SDA, XGPIOA_29);
PINMUX_CONFIG(IIC0_SCL, XGPIOA_28);

默认配置会导致i2c0无法加载成功,报错提示i2c超时。

更改为如下内容,注意放在最后。

PINMUX_CONFIG(IIC0_SDA, IIC0_SDA);
PINMUX_CONFIG(IIC0_SCL, IIC0_SCL);

更改原因:参考电路图中,引脚名称为IIC0_SDA,可以复用为左侧的这些引脚。

例如复用为uart2就设置

PINMUX_CONFIG(IIC0_SDA, UART2_RX);
PINMUX_CONFIG(IIC0_SCL, UART2_TX);

方法2:使用官方技术支持提供的工具

https://community.milkv.io/t/milk-v-duo-cvi-pinmux/292

四、驱动分析

基础知识点

iio介绍:https://blog.csdn.net/m0_74282605/article/details/128098034

bh1750驱动:https://blog.csdn.net/ZOROE123/article/details/117442036

misc介绍:https://blog.csdn.net/rj_ys/article/details/112791330

iio驱动:https://blog.csdn.net/weixin_68294039/article/details/124931816

bh驱动路径:

duo-buildroot-sdk\\linux_5.10\\drivers\\iio\\light\\bh1750.c

probe函数中定义了iio device的mode为DIRECT,表示生成sysfs,我们可以通过sysfs接口获取bh1750数据

在这里插入图片描述

iio通道

其中raw是我们需要的光感数据
在这里插入图片描述

参考资料:

iio生成sysfs接口:
https://blog.csdn.net/qq_17270067/article/details/109989738

应用程序调用iio的sysfs接口:
https://blog.csdn.net/qq_27094347/article/details/125926093

文件接口:
https://blog.csdn.net/weixin_45682654/article/details/128571696

测试驱动添加的sysfs接口

cat /sys/devices/platform/4000000.i2c/i2c-0/0-0023/iio:device0\\in_illuminance_raw

在这里插入图片描述
在这里插入图片描述

测试结果:

遮挡raw为2

未遮挡raw为182

五、应用层

5.1 代码

代码

test_bh1750.c

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "sys/ioctl.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
#include <poll.h>
#include <sys/select.h>
#include <sys/time.h>
#include <signal.h>
#include <fcntl.h>

//https://blog.csdn.net/weixin_45682654/article/details/128571696
static int file_data_read(char *filename, char *str)
{
    int ret = 0;
    FILE *data_stream;

    data_stream = fopen(filename, "r"); /* 只读打开 */
    if(data_stream == NULL) {
        printf("can't open file %s\\r\\n", filename);
        return -1;
    }

    ret = fscanf(data_stream, "%s", str);
    if(!ret) {
        printf("file read error!\\r\\n");
    } else if(ret == EOF) {
        /* 读到文件末尾的话将文件指针重新调整到文件头 */
        fseek(data_stream, 0, SEEK_SET);  
    }
    fclose(data_stream);    /* 关闭文件 */    
    return 0;
}

int main(int argc, char *argv[])
{
    int fd;
    int light_value;
    int test_time = 50;

    char str[50];
    int ret = 0;
    // char* filename = "/dev/iio:device0";
    // iio生成的sysfs接口
    char* filename = "/sys/devices/platform/4000000.i2c/i2c-0/0-0023/iio:device0/in_illuminance_raw";

    while(test_time){
        memset(str,0,50);
        file_data_read(filename, str);
        light_value = atof(str);
        printf("test_time %d :%d\\r\\n",50-test_time,light_value);
        sleep(1);
        test_time--;
    }

    return 0;
}

5.2 编译

先编译完整的img,因为改动过dts。

用balenaEtcher刷入tf卡后插到板子上,上电。

编译应用代码,生成可执行文件

编译及传输

riscv64-unknown-linux-musl-gcc -static -o test_bh1750 test_bh1750.c
scp test_bh1750 root@192.168.42.1:~/

输入密码:milkv

在这里插入图片描述

5.3 运行执行文件

登录设备

ssh root@192.168.42.1

执行文件

./test_bh1750

测试结果

在这里插入图片描述

六、小结

本章从电路图开始,介绍了引脚信息、dts配置、驱动添加流程、驱动简单分析、sysfs接口测试以及实现了光感的测试文件。

试用过程中遇到的问题主要是i2c0无法使用,后来发现是需要配置引脚的默认功能。

开发应用层的时候虽然可以通过cat命令读取到sysfs接口,但是代码实现还是需要参考一些教程,通过fopen等接口实现。

后续可以以此为例增加其他的传感器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1208668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么Springboot项目中有些写法继承了SpringBootServletInitializer类?Springboot的两种发布方式

文章目录 一、前言二、SpringBoot的两种发布方式2.1、内置容器运行2.2、外置容器&#xff08;Tomcat&#xff09;运行 三、扩展3.1、如何将 Spring Boot 项目打包成 war 包&#xff1f; 一、前言 在一次SpringBoot源码中看到了启动类中继承了SpringBootServletInitializer&…

EMC-4641C运动控制器固件升级

EMC-4641C运动控制器固件升级 更新前查看运动控制器固件版本 点击打开ESMTPTest_X64R.exe程序 点击搜索&#xff0c;程序自动选择IP为192.168.0.135的运动控制器&#xff08;实际操作时候可能会因为现场情况&#xff0c;IP会有细微不同&#xff09; 点击Connest 等待几秒后在…

『数据结构与算法』散列表(哈希表)

1. 什么是散列表 散列表&#xff08;Hash Table&#xff09;也叫哈希表&#xff0c;是根据给定关键字&#xff08;Key&#xff09;来计算出该关键字在表中存储地址的数据结构。也就是说&#xff0c;散列表建立了关键字与存储地址之间的一种直接映射关系&#xff0c;将关键字映…

【电路笔记】-诺顿定理(Norton‘s Theorem)

诺顿定理&#xff08;Norton’s Theorem&#xff09; 文章目录 诺顿定理&#xff08;Nortons Theorem&#xff09;1、概述与定义2、诺顿模型确定3、一些线性电路的诺顿模型3.1 单电压源3.2 单电流源3.3 多电流/电压源 5、总结 本文是我们上一篇有关戴维南定理的文章的延续。 在…

[文件读取]lanproxy 文件读取 (CVE-2021-3019)

1.1漏洞描述 漏洞编号CVE-2021-3019漏洞类型文件读取漏洞等级⭐漏洞环境VULFOCUS攻击方式 描述: Lanproxy 路径遍历漏洞通过../绕过读取任意文件。该漏洞允许目录遍历读取/../conf/config.properties来获取到内部网连接的凭据。 1.2漏洞等级 高危 1.3影响版本 Lanproxy 1.4漏洞…

酷柚易汛ERP-购货订单操作指南

1、应用场景 先下购货订单&#xff0c;收货入库后生成购货单。 2、主要操作 2.1 新增购货订单 打开【购货】-【购货订单】新增购货订单。&#xff08;*为必填项&#xff0c;其他为选填&#xff09; ① 录入供应商&#xff1a;点击供应商字段框的 &#xff0c;在弹框中选择供…

漏洞-任意账号注册

一漏洞介绍 1.未验证邮箱/手机号 情景&#xff1a;应用为了方便用户记录用户名&#xff0c;使用邮箱和手机号作为用户名&#xff08;因此很多应用在注册的时候就要求用户填写&#xff0c;多数时候都会给用户发送激活信息&#xff0c;激活后才能登录&#xff09; 缺陷&#xff…

Linux Mint 21.3 将搭载 Cinnamon 6.0 和实验性 Wayland 支持

导读Wayland 会话可能在 Linux Mint 23 系列中成为默认选项&#xff0c;预计将在 2026 年实现。 Linux Mint 项目今天在他们的每月新闻通讯中 宣布&#xff0c;他们已经开始着手在未来的 Linux Mint 发行版中实施 Wayland 会话&#xff0c;最初将在 Linux Mint 21.3 中提供。 …

3DMAX建模基础教程:常用工具补充

在本篇3DMAX建模基础教程中&#xff0c;我们将为您介绍一些常用的工具及其功能。熟练掌握这些工具将大大提高您的建模效率。 1️⃣ 选择与变换工具 选择工具&#xff1a;帮助您选择对象&#xff0c;可以通过单击对象或按组选择。 变换工具&#xff1a;对选定的对象进行移动、…

【milkv】0、duo编译环境搭建

一、开发资料整理 Docker https://hub.docker.com/repository/docker/dreamcmi/cv1800-docker/general GitHub https://github.com/milkv-duo/duo-buildroot-sdk CV181x/CV180x MMF SDK 开发文档汇总 https://developer.sophgo.com/thread/471.html cv181x芯片使用的交叉…

【计算机网络】UDP协议

UDP的结构 我们学习一个协议最主要的就是理解它的报文格式&#xff0c;对于UDP协议来说 我们看下面的这张图。 16位UDP长度&#xff0c;表示整个数据报&#xff08;UDP首部UDP数据&#xff09;的最大长度。UDP报文长度占两个字节&#xff0c;16位表示的数据范围&#xff08;0-…

新版本Idea设置启动参数

1.进入配置页面 2.点击下图红框的部分&#xff0c;会看到有很多操作可选 3.选择添加VM参数即可 此时就会多出一个可以输入参数的框了&#xff0c;如下&#xff1a;

一个破单机,也要用远程缓存?

大家好&#xff0c;豆小匠终于开始Coding了&#xff0c;这期来聊聊实战相关的杂谈。 正文开始&#xff01; 作为编程萌新的时候&#xff0c;总想着把程序做复杂&#xff0c;堆技术栈。 但是程序是为场景服务的&#xff0c;比如&#xff0c;我想提高接口的响应速度&#xff0c…

酷柚易汛ERP- 组装单与拆卸单操作

1、功能介绍 组装单用来处理企业组装等加工业务&#xff0c;拆卸单用来处理企业拆卸等加工业务&#xff0c;支持一对多的产品加工业务。 2、主要操作 2.1 新增组装单 打开【仓库】-【组装单】新增组装单。 录入组合件与子件&#xff0c;单据审核后&#xff0c;系统根据存货…

如何在Qemu上跑Milk-duo开发板

前言 &#xff08;1&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;2&#xff09;学习本文之前&#xff0c;要求先看一下Milk-V Duo快速上手的环境搭建部分&#xff0c;创建好镜像文件。 正文 编译milk-duo qemu &#xff08;1&#xff09;下面步…

【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍

目录 一、SysTick定时器 1、SysTick寄存器介绍 &#xff08;1&#xff09;控制及状态寄存器 &#xff08;2&#xff09;重装载数值寄存器 &#xff08;3&#xff09;当前数值寄存器 2、SysTick寄存器配置函数 二、FreeRTOS中的SysTick定时器 1、SysTick配置函数及分析 …

传输层协议-UDP协议

目录 传输层再谈端口号端口号范围划分认识知名端口号 UDP协议UDP协议格式UDP数据封装UDP数据分用 UDP协议的特点面向数据报 UDP缓冲区UDP使用注意事项基于UDP的应用层协议 传输层 实际上我们应用层的数据并不是直接发给网络的&#xff0c;而是需要先将数据发送给传输层&#xf…

网工内推 | 网工校招,金融、软件行业,HCIE认证优先,最高15薪

01 长威信息科技 招聘岗位&#xff1a;网络工程师&#xff08;24届校招&#xff09; 职责描述&#xff1a; 1、负责网络类、安全类产品的安装部署、调试和运行维护&#xff0c;以及网络故障分析、定位和处理&#xff1b; 2、负责实施项目各类文档编制工作&#xff0c;包括技术…

MySQL主从复制、读写分离(利用Amoeba和Mycat)、完全同步

目录 一、主从复制 1、概念 1.1主从复制延迟问题&#xff1a; 1.2、MySQL安全和性能配置&#xff1a; 1.3、主从复制的工作过程&#xff1a; 1.4、mysql主从复制注意点&#xff1a; 1.5、MySQL的主从复制的模式&#xff1a; 2、主从复制实验&#xff1a; 二、读写分离&…