为设备驱动程序创建自己的寄存器

标签 c embedded i2c

我正在用 c 编写嵌入式设备驱动程序。

我的设备有 3 个不同的 I²C 地址。 每个 I²C 地址都有不同的寄存器,可以与寄存器地址一起使用(例如 0xAB)

一些寄存器地址重叠但名称不同。

设备a:0x12有0x00(状态寄存器)

Device b: 0x23 has 0x00 (Set interrupt mask)

目前我已经将这些不同的 0x00 定义为 但是设备b也有不同的其他寄存器

#define DEVICE_A_STATUS  (0x00)
#define DEVICE_B_INTMASK (0x00)
#define DEVICE_B_MEH     (0xAF)

我该怎么做,只有设备 A 才能访问 a 的 i2c 寄存器地址。

创建一个结构?

最后我需要将设备地址 (0x12) 和寄存器地址 (0xAF) 传递给一个函数。此功能应该能够处理所有 3 种不同的 i2c 设备。 我认为类似继承的东西可能在 C++ 中起作用,但我如何在 C 中轻松、干净地做到这一点?

最佳答案

How would i make it, that only device A can access the i2c register addresses for a?

使用封装。设备A寄存器定义应该限制在设备A驱动的范围内。

Create a struct?

除非您需要在 RAM 中保留设备寄存器值的副本,否则我真的看不出结构对您有何帮助。结构对于内存映射寄存器很有用,但这些 I2C 设备不是内存映射的(它们通过 I2C 总线访问)。

In the end i need to pass the device address (0x12) and the register address (0xAF), to a function. This function should be able to handle all 3 different i2c devices. I think something inheritance like would work maybe in c++, but how would i do it easy, and clean, and in c ?

是的,您想要您描述的功能,但不,我不认为它是继承。相反,将其视为相互叠加的不同层次的抽象。在低级别,您有一个 I2C 驱动程序来实现您描述的功能。低级 I2C 驱动程序对可能连接到总线的任何特定 I2C 设备一无所知。然后在 I2C 驱动程序之上的一层,您拥有连接到 I2C 总线的每种设备类型的设备驱动程序。这些设备驱动程序了解并封装其设备寄存器的详细信息。这些设备驱动程序调用了较低级别的 I2C 驱动程序函数。较高级别的设备驱动程序使用较低级别的 I2C 驱动程序(它们不继承较低级别的 I2C 驱动程序)。

文件 i2c.h 包含低级 I2C 驱动程序接口(interface)的声明,包括您描述的函数:

void I2CSetDeviceRegister(uint8_t device_address, uint8_t register_address, uint8_t register_value);
uint8_t I2CGetDeviceRegister(uint8_t device_address, uint8_t register_address);

文件device_a.c包括i2c.h并定义了封装的寄存器定义:

#include "i2c.h"   // This device uses the lower level I2C driver

#define REGISTER_STATUS 0   // The scope of this register definition is encapsulated within device_a.c

文件device_b.c包含i2c.h并定义了封装的寄存器定义:

#include "i2c.h"  // This device uses the lower level I2C driver

#define REGISTER_INT_MASK 0  // The scope of this register definition is encapsulated within device_b.c

关于为设备驱动程序创建自己的寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49941972/

相关文章:

c - 函数中的 Printf 更改 main 中的输出值

c - 汇编 x86-32 和一些 c 函数

c - 嵌入式系统中的堆溢出检测/预防

c - 整合来自 3 轴陀螺仪的读数?

c - *完全*相等的 double 为 (a==b) 返回 0

javascript - 有人尝试在嵌入式环境中运行node.js 或原始v8 引擎吗?

operating-system - 关于基于 ROM 的可执行文件的基本问题

Linux I2C 内核驱动绑定(bind)

c - 为什么 Atmega8 上的 MPU-6050 通过 I2C 输出显示恒定值?

c - 在C中迭代结束时打印出迭代数组