树莓派3B+驱动开发(8)- i2c控制PCF8591

news/2024/12/20 22:16:48/

github主页:https://github.com/snqx-lqh
本项目github地址:https://github.com/snqx-lqh/RaspberryPiDriver
本项目硬件地址:https://oshwhub.com/from_zero/shu-mei-pai-kuo-zhan-ban
欢迎交流

笔记说明

这一节,主要是设备树有点不同,其他和正点原子的教程差不多。

主要参考的文章

正点原子《I.MX6U 嵌入式 Linux 驱动开发指南 V1.81》

本节源码路径02_Firmware/16_pcf8591_drv_i2c

设备树

这里为了减少篇幅,只是写了i2c相关的,完整的看项目源代码。

// Definitions for gpio-key module
/dts-v1/;
/plugin/;/ {compatible = "brcm,bcm2835";fragment@2 {// Configure the gpio pin controllertarget = <&i2c1>;__overlay__ {clock-frequency = <100000>;status = "okay";pinctrl-names = "default";pinctrl-0 = <&i2c1_pins>;pcf8591@48{compatible = "shb,pcf8591";reg = <0x48>;};};};fragment@3 {target = <&i2c1_pins>;pins1: __overlay__ {brcm,pins = <2 3>;brcm,function = <4>; /* alt 0 */};};
};

驱动代码

首先驱动出入口函数发生了变化,使用的是和i2c相关的注册和注销。

/* 传统匹配方式ID列表 */
static const struct i2c_device_id pcf8591_id[] = {{"shb,pcf8591", 0},  {}
};/* 设备树匹配列表 */
static const struct of_device_id pcf8591_of_match[] = {{ .compatible = "shb,pcf8591" },{ /* Sentinel */ }
};/* i2c驱动结构体 */	
static struct i2c_driver pcf8591_driver = {.probe = pcf8591_probe,.remove = pcf8591_remove,.driver = {.owner = THIS_MODULE,.name = "pcf8591",.of_match_table = pcf8591_of_match, },.id_table = pcf8591_id,
};    static int __init pcf8591_init(void)
{int ret = 0;ret = i2c_add_driver(&pcf8591_driver);return ret;
}static void __exit pcf8591_exit(void)
{i2c_del_driver(&pcf8591_driver);
}module_init(pcf8591_init);
module_exit(pcf8591_exit);

其他的差别不大

然后i2c的读写方式如下

static int pcf8591_read_regs(pcf8591_dev_t *dev, u8 reg, void *val, int len)
{int ret;struct i2c_msg msg[2];struct i2c_client *client = (struct i2c_client *)dev->client;/* msg[0]为发送要读取的首地址 */msg[0].addr = client->addr;			/* pcf8591地址 */msg[0].flags = 0;					/* 标记为发送数据 */msg[0].buf = &reg;					/* 读取的首地址 */msg[0].len = 1;						/* reg长度*//* msg[1]读取数据 */msg[1].addr = client->addr;			/* pcf8591地址 */msg[1].flags = I2C_M_RD;			/* 标记为读取数据*/msg[1].buf = val;					/* 读取数据缓冲区 */msg[1].len = len;					/* 要读取的数据长度*/ret = i2c_transfer(client->adapter, msg, 2);if(ret == 2) {ret = 0;} else {printk("i2c rd failed=%d reg=%06x len=%d\n",ret, reg, len);ret = -EREMOTEIO;}return ret;
}static s32 pcf8591_write_regs(pcf8591_dev_t *dev, u8 reg, u8 *buf, u8 len)
{u8 b[10];struct i2c_msg msg;struct i2c_client *client = (struct i2c_client *)dev->client;b[0] = reg;					/* 寄存器首地址 */memcpy(&b[1],buf,len);		/* 将要写入的数据拷贝到数组b里面 */msg.addr = client->addr;	/* pcf8591地址 */msg.flags = 0;				/* 标记为写数据 */msg.buf = b;				/* 要写入的数据缓冲区 */msg.len = len + 1;			/* 要写入的数据长度 */return i2c_transfer(client->adapter, &msg, 1);
}

其他的就是正常的读写操作了。


http://www.ppmy.cn/news/1556743.html

相关文章

如何实现单例模式?

什么是单例模式&#xff1f; 单例模式是一种创建型的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例 单例模式在整个程序运行期间只创建一个对象&#xff0c;常用于管理全局资源&#xff0c;实现日志系统等场景 将构造函数私…

从零开始:PHP基础教程系列-第11篇:使用Composer管理依赖

从零开始&#xff1a;PHP基础教程系列 第11篇&#xff1a;使用Composer管理依赖 一、什么是Composer&#xff1f; Composer是PHP的依赖管理工具。它允许开发者轻松地管理项目中的库和依赖项&#xff0c;自动下载和更新所需的包&#xff0c;以及处理版本冲突。Composer使得在…

游戏引擎学习第48天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们正在进行碰撞检测的工作&#xff0c;昨天我们几乎完成了一部分代码。由于一些原因&#xff0c;昨天的直播结束时未能完成所有内容。今天我们将继续进行&#xff0c;首先回顾一下之前的进展。我们需要让角色能够正确地与…

《Python 解释器和 PyCharm 详解》

一、引言 Python 是一种广泛使用的高级编程语言&#xff0c;具有简洁、易读、可扩展性强等特点。在使用 Python 进行开发时&#xff0c;需要了解 Python 解释器和集成开发环境&#xff08;IDE&#xff09;的作用和特点。本文将详细介绍 Python 解释器和 PyCharm&#xff0c;帮助…

Unity读取、新建Excel表格

把dll资源解压后&#xff0c;全部导入到unity中的Plugins文件下面 资源放在标题下方&#xff0c;可以自行下载 使用教程 引入命名空间 using SimpleExcel;。这个命名空间下主要有两个类&#xff1a;WorkBook和Sheet。WorkBook用于对整个excel文件的操作&#xff0c;如创建、打开…

MySQL基础笔记(二)

在此特别感谢尚硅谷-康师傅的MySQL精品教程 获取更好的阅读体验请前往我的博客主站! 如果本文对你的学习有帮助&#xff0c;请多多点赞、评论、收藏&#xff0c;你们的反馈是我更新最大的动力&#xff01; 多表查询 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更…

Yolov8源码分析

1、目录介绍 主要目录ultralitics&#xff08;重点&#xff09; 1、assets目录 这个文件保存了YOLO历史上可以说是最经典的两张图片&#xff0c;供大家测试程序来使用的。 2、cfg 这个文件下面保存了我们的模型配置文件&#xff0c;cfg目录是项目配置的集中地&#xff0c;其…

有关异步场景的 10 大 Spring Boot 面试问题

本文将探讨与 Spring Boot 中的异步场景相关的十大面试问题。这些问题涵盖了广泛的主题&#xff0c;从基本的注释和配置到高级概念&#xff0c;例如使用 Spring WebFlux 进行反应式编程。在本文结束时&#xff0c;您将对如何利用 Spring Boot 中的异步编程来构建强大而高效的应…