一、Regmap 简介
Regmap 作为 Linux 内核中的一个框架,提供了一种方便且易于使用的方式来管理设备的映射寄存器。Regmap 的设计思想是让开发人员快速、灵活地访问这些寄存器,同时可以提供完整的错误处理机制。
Regmap 通过抽象出寄存器集合和访问寄存器的方式,为开发人员屏蔽了访问底层硬件例如 i2c、spi、pci 等的细节,提供了一种通用的访问方式。此外,Regmap 还通过缓存寄存器的方式,可以在一定程度上提升对硬件的访问效率。
二、Regmap 的使用方法
Regmap 被广泛应用于内核中访问设备寄存器,使用 Regmap 需要加载一个或多个协议来实现底层通信。Regmap 的 API 包括初始化、寄存器读写、寄存器更新、寄存器修改和查找操作。
1. Regmap 的初始化
Regmap 的初始化通常需要创建一个 Regmap 配置,其中包括访问设备寄存器的方法、寄存器位宽、缓存模式等配置信息。当创建完配置结构体后,就可以通过调用 regmap_init 接口来创建一个 Regmap 实例。
struct regmap_config cfg = {
.name = "example",
.reg_bits = 8,
.val_bits = 16,
.max_register = 0xffff,
.fast_io = true,
};
struct regmap *regmap;
regmap = regmap_init(&spi->dev, NULL, &cfg);
2. Regmap 的寄存器读写操作
Regmap 提供了一组 API 用于对设备的寄存器进行读写操作。这些 API 类似于内存读写操作函数,例如 regmap_read 和 regmap_write,这些函数可以读写单个寄存器的值,同时还支持读写多个寄存器的值。
regmap_read(regmap, 0x10, &value);
regmap_write(regmap, 0x20, value);
3. Regmap 的寄存器更新操作
Regmap 提供了两个 API 用于更新寄存器的值,这些值可以是为缓存模式下的寄存器值,也可以是直接更新硬件寄存器的值。这些 API 是 regmap_write_bits 和 regmap_update_bits。
regmap_write_bits 用于直接写入到设备寄存器,可以使用 mask 来选择要写入的位。这个 API 不会修改缓存值。
regmap_write_bits(regmap, 0x10, 0x01, 0x01);
regmap_update_bits 与 regmap_write_bits 类似,不同的是它会读取当前寄存器的值,修改指定的位后再写回。
regmap_update_bits(regmap, 0x20, 0x01, 0x01);
4. Regmap 的寄存器修改操作
Regmap 提供了一个 API 用于修改设备的寄存器值。不同于前面的 API,这个 API 需要提供一个 reg_sequence 结构体,该结构体包含了需要修改的寄存器地址和相应的值。这个 API 适用于需要一次性修改多个寄存器的场景。
struct reg_sequence reg[] = {
{ .reg = 0x10, .def = 0x1234 },
{ .reg = 0x20, .def = 0x5678 },
};
regmap_multi_reg_write(regmap, reg, ARRAY_SIZE(seq));
5. Regmap 的查找操作
Regmap 提供了一组 API 用于查找特定设备的 Regmap 实例。通过给定设备的描述信息,例如 I2C 地址、SPI CS 等,可以得到指向对应 Regmap 实例的指针。
struct regmap_config cfg = { .name = "example" };
struct regmap *regmap = regmap_init_i2c(i2cdev, &cfg);
三、Regmap 的优势和局限性
Regmap 是一个通用的设备寄存器映射框架,可以帮助开发人员快速地访问硬件寄存器。Regmap 的优势包括:
- 提供了一个统一的接口、简化了代码量和管理大小
- 访问底层硬件的细节被屏蔽了,简化了驱动模块的开发难度和单元测试过程
- 支持不同设备类型,包括 I2C、SPI、MMIO 等。
- 提供了缓存机制,可以在一定程度上提升对硬件的访问效率
Regmap 的局限性包括:
- Regmap 提供的是基于寄存器的接口,对于非寄存器设备,例如网卡,需要特殊处理。
- Regmap 提供的是同步接口,在高速I/O的情况下,它的响应速度较慢,对性能和用户体验不利。
四、小结
Regmap 是一个强大的设备寄存器映射框架,它为开发人员带来了许多便利性,让他们能够快速、方便地访问设备的寄存器。Regmap 的优势在于它的简单易用、高度可定制化、设备兼容性和缓存机制。但对于不符合寄存器模型的设备,Regmap 的使用可能受限。开发人员在使用 Regmap 时应该考虑其特点和局限性,避免不必要的缺陷和问题。