创建自己的设备驱动程序注册

时间:2018-04-20 12:45:31

标签: c embedded i2c

我正在c。

中编写嵌入式设备驱动程序

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

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

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

设备b:0x23有0x00(设置中断屏蔽)

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

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

如何制作,只有设备A才能访问i2c寄存器地址。

创建一个结构?

最后我需要将设备地址(0x12)和寄存器地址(0xAF)传递给一个函数。此功能应该能够处理所有3种不同的i2c设备。 我认为某些继承可能会在c ++中起作用,但我怎样才能轻松,干净,并且在c?

1 个答案:

答案 0 :(得分:0)

  

我怎么做,只有设备A可以访问i2c寄存器   地址为?

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

  

创建结构?

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

  

最后我需要传递设备地址(0x12)和寄存器   地址(0xAF),一个函数。这个功能应该能够处理   所有3种不同的i2c设备。我认为继承会像是一样   也许用c ++工作,但我怎样才能轻松,干净,并且在c?

是的,你想要你描述的功能但是没有,我不认为它是继承。相反,将其视为彼此分层的不同抽象层次。在较低级别,您有一个I2C驱动程序,可以实现您描述的功能。低级I2C驱动器对可能连接到总线的任何特定I2C器件一无所知。然后在I2C驱动程序上方的一层,您可以为连接到I2C总线的每种设备类型提供设备驱动程序。这些设备驱动程序知道并封装其设备寄存器的详细信息。并且这些设备驱动程序调用较低级别的I2C驱动程序功能。较高级别的设备驱动程序使用较低级别的I2C驱动程序(它们不继承较低级别的I2C驱动程序)。

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

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
相关问题