.. _eeprom_hal: EEPROM HAL ========================== 概述 ------ - EEPROM HAL(硬件抽象层)组件为 HPMicro SDK 中访问各种类型的 EEPROM 存储设备提供统一接口。它抽象了底层硬件差异,为应用程序提供一致的 API 来读写 EEPROM 数据 - eeprom hal 特点 - 支持三种驱动方式: - 基于 flash 模拟 eeprom - i2c eeprom - spi eeprom - 多实例支持 - HAL 层通过注册的方式支持多个 eeprom 设备实例,通过注册名统一管理 - 每个实例可以独立配置不同的硬件接口和参数 - 统一接口调用 - 提供统一的读写接口,屏蔽底层实现差异;可以通过 hal 层调用 API,同时也可以直接调用底层驱动 API(需要自己配置参数) - 页感知写入 - 底层提供防回卷功能,自动处理页边界跨越 - 状态轮询 - 提供写入完成状态轮询接口,确保数据写入成功 架构描述 ---------------------- - eeprom hal 层架构图 .. _architecture_diagram: .. rst-class:: center-block .. raw:: html
+----------------------------------------------------------+
| 应用层 |
| (使用 EEPROM 存储的用户应用) |
+----------------------------------------------------------+
|
| 统一 API
|
+----------------------------------------------------------+
| HAL 层 (eeprom_hal) |
| - 设备注册与管理 |
| - 设备发现(按名称查找) |
| - 统一接口(read/write/init/deinit) |
+----------------------------------------------------------+
|
+----------------+----------------+
| | |
| | |
+------------------+ +--------------+ +------------------+
| I2C 设备 | | SPI 设备 | | Flash 模拟 |
| 驱动层 | | 驱动层 | | 驱动层 |
| | | | | |
| - I2C 协议 | | - SPI 协议 | | - XPI Flash API |
| - AT24Cxx 系列 | | - AT25xxx | | - E2P 模拟库 |
+------------------+ +--------------+ +------------------+
| | |
| | |
| | |
+----------------------------------------------------------+
| 硬件抽象层 |
| (I2C 驱动、SPI 驱动、XPI 驱动) |
+----------------------------------------------------------+
| | |
| | |
| | |
+----------------------------------------------------------+
| 硬件层 |
| (I2C EEPROM、SPI EEPROM、NOR Flash) |
+----------------------------------------------------------+
相关宏定义以及枚举和结构体介绍
------------------------------
- 宏定义
- 定义了用于配置的 eeprom 类型和允许注册的最大实例数量(可扩展)
.. code-block:: c
/**
* @brief eeprom 支持驱动类型
* @note 用于注册时指定 eeprom 设备类型(可扩展)
*/
#define EEPROM_FLAG_EMULATION_XPI 0x0
#define EEPROM_FLAG_DEVICE_I2C 0x4
#define EEPROM_FLAG_DEVICE_SPI 0x5
/**
* @brief eeprom 允许注册最大数量
* @note 用于初始化注册 eeprom 的数组大小(可扩展)
*/
#define EEPROM_MAX_DEVICE_CNT 32
/**
* @brief eeprom spi 指令
*/
#define E2P_SPI_INSTRUCTION_WREN 0x06 /* 写使能 */
#define E2P_SPI_INSTRUCTION_RDSR 0x05 /* 读状态寄存器 */
#define E2P_SPI_INSTRUCTION_WRDI 0x04 /* 写禁止 */
#define E2P_SPI_INSTRUCTION_READ 0x03 /* 读数据 */
#define E2P_SPI_INSTRUCTION_WRITE 0x02 /* 写数据 */
#define E2P_SPI_INSTRUCTION_WRSR 0x01 /* 写状态寄存器 */
- 枚举介绍
- eeprom 支持的实体设备,包括 i2c 和 spi(list 中参数由数据手册获得,list 可扩展)
.. code-block:: text
支持的 i2c eeprom 设备:
+--------------------+-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| 公司 | 型号 (Series) | 存储容量 | 页大小 (Bytes) | 宏定义 (Macro) | 备注 (Notes) |
+====================+=======================+============+================+==========================================+==========================================+
| Microchip (Atmel) | AT24C01 / AT24C02 | 1Kbit/2Kbit| 8 | E2P_DEVICE_AT24C01, E2P_DEVICE_AT24C02 | 标准 8 位地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | 24xx01 / 24xx02 | 1Kbit/2Kbit| 8 | E2P_DEVICE_24xx01, E2P_DEVICE_24xx02 | 标准 8 位地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | AT24C04 / 24xx04 | 4Kbit | 16 | E2P_DEVICE_AT24C04, E2P_DEVICE_24xx04 | 9位地址,A8 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | AT24C08 / 24xx08 | 8Kbit | 16 | E2P_DEVICE_AT24C08, E2P_DEVICE_24xx08 | 10位地址,A9, A8 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | AT24C16 / 24xx16 | 16Kbit | 16 | E2P_DEVICE_AT24C16, E2P_DEVICE_24xx16 | 11位地址,A10, A9, A8 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | AT24C32 | 32Kbit | 32 | E2P_DEVICE_AT24C32 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | AT24C64 / 24xxC64 | 64Kbit | 32 | E2P_DEVICE_AT24C64, E2P_DEVICE_24xxC64 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | AT24C128 / 24xx128 | 128Kbit | 64 | E2P_DEVICE_AT24C128, E2P_DEVICE_24xx128 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | AT24C256 / 24xx256 | 256Kbit | 64 | E2P_DEVICE_AT24C256, E2P_DEVICE_24xx256 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | AT24C512 / 24xx512 | 512Kbit | 128 | E2P_DEVICE_AT24C512, E2P_DEVICE_24xx512 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | AT24CM01 | 1Mbit | 256 | E2P_DEVICE_AT24CM01 | 17位地址,A16 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | AT24CM02 | 2Mbit | 256 | E2P_DEVICE_AT24CM02 | 18位地址,A17, A16 在设备地址中 |
+--------------------+-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| ON Semi | NV24C02 | 2Kbit | 16 | E2P_DEVICE_NV24C02 | 标准 8 位地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | NV24C04 | 4Kbit | 16 | E2P_DEVICE_NV24C04 | 9位地址,A8 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | NV24C08 | 8Kbit | 16 | E2P_DEVICE_NV24C08 | 10位地址,A9, A8 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | NV24C16 | 16Kbit | 16 | E2P_DEVICE_NV24C16 | 11位地址,A10, A9, A8 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | NV24C32 | 32Kbit | 32 | E2P_DEVICE_NV24C32 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | NV24C64 | 64Kbit | 32 | E2P_DEVICE_NV24C64 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | NV24C128 | 128Kbit | 64 | E2P_DEVICE_NV24C128 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | NV24C256 | 256Kbit | 64 | E2P_DEVICE_NV24C256 | 2字节地址 |
+--------------------+-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| STMicroelectronics | M24C01 / M24C02 | 1Kbit/2Kbit| 16 | E2P_DEVICE_M24C01, E2P_DEVICE_M24C02 | 标准 8 位地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | M24C04 | 4Kbit | 16 | E2P_DEVICE_M24C04 | 9位地址,A8 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | M24C08 | 8Kbit | 16 | E2P_DEVICE_M24C08 | 10位地址,A9, A8 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | M24C16 | 16Kbit | 16 | E2P_DEVICE_M24C16 | 11位地址,A10, A9, A8 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | M24C32 | 32Kbit | 32 | E2P_DEVICE_M24C32 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | M24128 | 128Kbit | 64 | E2P_DEVICE_M24128 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | M24256 | 256Kbit | 64 | E2P_DEVICE_M24256 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | M24512 | 512Kbit | 128 | E2P_DEVICE_M24512 | 2字节地址 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | M24M01 | 1Mbit | 256 | E2P_DEVICE_M24M01 | 17位地址,A16 在设备地址中 |
| +-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
| | M24M02 | 2Mbit | 256 | E2P_DEVICE_M24M02 | 18位地址,A17, A16 在设备地址中 |
+--------------------+-----------------------+------------+----------------+------------------------------------------+------------------------------------------+
支持的 spi eeprom 设备:
+--------------------+------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| 公司/品牌 | 型号 (Series) | 存储容量 | 页大小 (Bytes) | 宏定义 (Macro) | 备注 (Notes) |
+====================+==================+===========+================+=====================================+=========================================================+
| Microchip (Atmel) | AT25010B | 1Kbit | 8 | E2P_DEVICE_AT25010B | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | AT25020B | 2Kbit | 8 | E2P_DEVICE_AT25020B | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | AT25040B | 4Kbit | 8 | E2P_DEVICE_AT25040B | 9位地址,MSB 在指令序列中传输 |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | AT25080B | 8Kbit | 32 | E2P_DEVICE_AT25080B | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | AT25160B | 16Kbit | 32 | E2P_DEVICE_AT25160B | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | AT25320B | 32Kbit | 32 | E2P_DEVICE_AT25320B | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | AT25640B | 64Kbit | 32 | E2P_DEVICE_AT25640B | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | AT25128B | 128Kbit | 64 | E2P_DEVICE_AT25128B | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | AT25256B | 256Kbit | 64 | E2P_DEVICE_AT25256B | |
+--------------------+------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| STMicroelectronics | M95010 | 1Kbit | 16 | E2P_DEVICE_M95010 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95020 | 2Kbit | 16 | E2P_DEVICE_M95020 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95040 | 4Kbit | 16 | E2P_DEVICE_M95040 | 9位地址,MSB 在指令序列中传输 |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95080 | 8Kbit | 32 | E2P_DEVICE_M95080 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95160 | 16Kbit | 32 | E2P_DEVICE_M95160 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95320 | 32Kbit | 32 | E2P_DEVICE_M95320 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95640 | 64Kbit | 32 | E2P_DEVICE_M95640 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95128 | 128Kbit | 64 | E2P_DEVICE_M95128 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95256 | 256Kbit | 64 | E2P_DEVICE_M95256 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95512 | 512Kbit | 128 | E2P_DEVICE_M95512 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95M01 | 1Mbit | 256 | E2P_DEVICE_M95M01 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95M02 | 2Mbit | 256 | E2P_DEVICE_M95M02 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | M95M04 | 4Mbit | 256 | E2P_DEVICE_M95M04 | |
+--------------------+------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| ABLIC (Seiko) | S-25C010A | 1Kbit | 16 | E2P_DEVICE_S_25C010A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | S-25C020A | 2Kbit | 16 | E2P_DEVICE_S_25C020A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | S-25C040A | 4Kbit | 16 | E2P_DEVICE_S_25C040A | 9位地址,MSB 在指令序列中传输 |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | S-25C080A | 8Kbit | 32 | E2P_DEVICE_S_25C080A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | S-25C160A | 16Kbit | 32 | E2P_DEVICE_S_25C160A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | S-25C320A | 32Kbit | 32 | E2P_DEVICE_S_25C320A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | S-25C640A | 64Kbit | 32 | E2P_DEVICE_S_25C640A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | S-25C128A | 128Kbit | 64 | E2P_DEVICE_S_25C128A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | S-25C256A | 256Kbit | 64 | E2P_DEVICE_S_25C256A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | S-25C512A | 512Kbit | 128 | E2P_DEVICE_S_25C512A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | S-25CM01A | 1Mbit | 256 | E2P_DEVICE_S_25CM01A | |
+--------------------+------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| Generic/Other | 25xx010A | 1Kbit | 16 | E2P_DEVICE_25xx010A | (通常兼容 S-25C 系列) |
| (Microchip, etc.) +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx020A | 2Kbit | 16 | E2P_DEVICE_25xx020A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx040A | 4Kbit | 16 | E2P_DEVICE_25xx040A | 9位地址,MSB 在指令序列中传输 |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx080A | 8Kbit | 16 | E2P_DEVICE_25xx080A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx160A | 16Kbit | 16 | E2P_DEVICE_25xx160A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx080B | 8Kbit | 32 | E2P_DEVICE_25xx080B | (通常兼容 AT25 系列) |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx160B | 16Kbit | 32 | E2P_DEVICE_25xx160B | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx320A | 32Kbit | 32 | E2P_DEVICE_25xx320A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx640A | 64Kbit | 32 | E2P_DEVICE_25xx640A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx128 | 128Kbit | 64 | E2P_DEVICE_25xx128 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx256 | 256Kbit | 64 | E2P_DEVICE_25xx256 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25x512 | 512Kbit | 128 | E2P_DEVICE_25x512 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | 25xx1024 | 1Mbit | 256 | E2P_DEVICE_25xx1024 | |
+--------------------+------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| ON Semi | NV25010A | 1Kbit | 16 | E2P_DEVICE_NV25010A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | NV25020A | 2Kbit | 16 | E2P_DEVICE_NV25020A | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | NV25040A | 4Kbit | 16 | E2P_DEVICE_NV25040A | 9位地址,MSB 在指令序列中传输 |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | NV25080 | 8Kbit | 32 | E2P_DEVICE_NV25080 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | NV25160 | 16Kbit | 32 | E2P_DEVICE_NV25160 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | NV25320 | 32Kbit | 32 | E2P_DEVICE_NV25320 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | NV25640 | 64Kbit | 32 | E2P_DEVICE_NV25640 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | NV25128 | 128Kbit | 64 | E2P_DEVICE_NV25128 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | NV25256 | 256Kbit | 64 | E2P_DEVICE_NV25256 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | NV25512 | 512Kbit | 128 | E2P_DEVICE_NV25512 | |
| +------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
| | NV25M01 | 1Mbit | 256 | E2P_DEVICE_NV25M01 | |
+--------------------+------------------+-----------+----------------+-------------------------------------+---------------------------------------------------------+
- 结构体介绍
- eeprom hal 层设备结构体定义
.. code-block:: c
typedef struct {
uint32_t flag; /* eeprom 设备类型标志 */
char device_name[E2P_DEVICE_NAME_MAX_LEN]; /* 设备实例名称 */
void *host; /* eeprom 设备所使用的硬件接口句柄 */
void *private; /* 用户私有数据 */
void *config; /* eeprom 设备配置参数 */
void *ops; /* eeprom 设备操作函数集 */
} hpm_eeprom_device_t;
- eeprom 调用函数集定义
.. code-block:: c
typedef struct {
hpm_stat_t (*init)(hpm_eeprom_device_t *device);
hpm_stat_t (*deinit)(hpm_eeprom_device_t *device);
hpm_stat_t (*write)(hpm_eeprom_device_t *device, uint32_t data_addr, uint32_t len, uint8_t *data);
hpm_stat_t (*read)(hpm_eeprom_device_t *device, uint32_t data_addr, uint32_t len, uint8_t *data);
} e2p_device_ops_t;
- eeprom 设备实例注册数组
.. code-block:: c
typedef struct {
hpm_eeprom_device_t device[EEPROM_MAX_DEVICE_CNT]; /* eeprom 设备实例数组 */
uint8_t device_count; /* 已注册设备数量 */
uint32_t device_bit; /* 已注册设备标志位 */
} eeprom_context_t;
- eeprom emulation 配置参数
.. code-block:: c
typedef struct {
uint32_t flash_base_addr; /* 模拟 eeprom 使用的 flash 基地址 */
uint32_t version; /* 模拟 eeprom 版本号 */
uint32_t opt_header; /* 模拟 eeprom 配置头 */
uint32_t opt0; /* 模拟 eeprom 配置选项0 */
uint32_t opt1; /* 模拟 eeprom 配置选项1 */
uint32_t start_addr; /* 模拟 eeprom 数据区起始地址 */
uint32_t erase_size; /* 模拟 eeprom 擦除单元大小 */
uint32_t sector_cnt; /* 模拟 eeprom 擦除单元数量 */
} e2p_emu_xpi_config_t;
- eeprom device spi 配置参数
.. code-block:: c
typedef struct {
SPI_Type *base; /* SPI 外设基地址 */
uint32_t cs_pin; /* SPI 片选引脚 */
uint32_t (*clock_init)(SPI_Type *ptr); /* SPI 时钟初始化函数指针 */
void (*pin_init)(void); /* SPI 引脚初始化函数指针 */
void (*cs_control)(uint32_t pin, uint8_t state); /* SPI 片选引脚控制函数指针 */
} e2p_device_spi_host_config_t;
- eeprom device i2c 配置参数
.. code-block:: c
typedef struct {
I2C_Type *base; /* I2C 外设基地址 */
uint32_t (*clock_init)(I2C_Type *ptr); /* I2C 时钟初始化函数指针 */
void (*pin_init)(void); /* I2C 引脚初始化函数指针 */
} e2p_device_i2c_host_config_t;
typedef struct {
uint32_t dev_addr; /* eeprom 设备地址 */
uint32_t addr_bytes; /* 地址字节数 */
uint32_t page_size; /* 页大小 */
uint32_t timeout; /* I2C 操作超时时间 */
} e2p_device_i2c_attribute_t;
API调用流程介绍
---------------------
- 使用流程
.. _process_diagram:
.. rst-class:: center-block
.. raw:: html
应用程序启动
│
▼
┌──────────────────────────┐
│ 1. 准备配置 │
│ - 主机配置 │
│ - 设备属性 │
└──────────┬───────────────┘
│
▼
┌──────────────────────────┐
│ 2. 注册参数 │
│ hpm_eeprom_ │
│ register_param() │
└──────────┬───────────────┘
│
▼
┌──────────────────────────┐
│ 3. 注册设备 │
│ hpm_eeprom_ │
│ register() │
└──────────┬───────────────┘
│
▼
┌──────────────────────────┐
│ 4. 查找设备 │
│ hpm_eeprom_find() │
└──────────┬───────────────┘
│
▼
┌──────────────────────────┐
│ 5. 初始化设备 │
│ hpm_eeprom_init() │
└──────────┬───────────────┘
│
▼
┌──────────────────────────┐
│ 6. 读写操作 │
│ hpm_eeprom_read_ │
│ block() │
│ hpm_eeprom_write_ │
│ block() │
└──────────┬───────────────┘
│
▼
┌──────────────────────────┐
│ 7. 清理 (可选) │
│ hpm_eeprom_ │
│ unregister() │
└──────────────────────────┘
- 根据实际的 eeprom 资源注册实例
举例:
- 注册一个模拟 eeprom 实例,使用 xpi 接口的 flash,具体可参考 unit_test/drivers/eeprom/e2p_emu/e2p_emu_test.c
- 准备工作: 需清楚使用的 flash 基地址,模拟 eeprom 版本号,配置头和选项,模拟 eeprom 数据区起始地址,擦除单元大小和数量等参数。
.. code-block:: c
e2p_emu_xpi_config_t emu_config = {
.flash_base_addr = BOARD_FLASH_BASE_ADDRESS,
.version = 0x4553,
.opt_header = BOARD_APP_XPI_NOR_CFG_OPT_HDR,
.opt0 = BOARD_APP_XPI_NOR_CFG_OPT_OPT0,
.opt1 = BOARD_APP_XPI_NOR_CFG_OPT_OPT1,
.start_addr = BOARD_APP_EEPROM_EMU_START_ADDR,
.erase_size = BOARD_APP_EEPROM_EMU_ERASE_SIZE,
.sector_cnt = BOARD_APP_EEPROM_EMU_SECTOR_COUNT,
};
hpm_eeprom_device_t e2p_emu_temp = {
.ptr = BOARD_APP_XPI_NOR_XPI_BASE,
.flag = EEPROM_FLAG_EMULATION_XPI,
.config = &emu_config,
}; /* 配置模拟 eeprom 的参数 */
hpm_eeprom_register_emulation_xpi_param(&e2p_emu_temp); /* 获取模拟 eeprom 参数(主要获取 ops 接口) */
hpm_eeprom_register(&e2p_emu_temp, "e2p_emu"); /* 注册模拟 eeprom 实例 */
- 注册一个 spi 驱动的 eeprom 实例,以 AT25128 为例,获取相关参数,具体可参考 unit_test/drivers/eeprom/e2p_spi/e2p_spi_test.c
eeprom hal 层提供了一个全局 list hpm_support_e2p_spi_device_list[] 用于存放支持的 spi eeprom 设备参数,用户需要根据具体设备选择对应的索引。
同时指定使用的片选引脚,硬件 spi 接口即可注册。
- 准备工作: 需配置 spi 硬件接口的基地址,片选引脚,时钟初始化函数,引脚初始化函数,片选引脚控制函数等参数; 同时确认使用的 eeprom 型号, 如果在上述列表中, 需对 id 赋值; 如果不在, 需要自行填充 dev_attr 参数, 并对 id 赋值 0xff。
.. code-block:: c
uint32_t dev_type = E2P_DEVICE_AT25128; /* 选择 spi eeprom 设备类型 */
e2p_device_spi_attribute_t dev_attr;
e2p_device_spi_host_config_t host_info = {
.base = BOARD_APP_SPI_BASE,
.cs_pin = BOARD_SPI_CS_PIN,
.clock_init = board_init_spi_eeprom_clock,
.pin_init = board_init_spi_eeprom_pin,
.cs_control = board_write_spi_cs,
}; /* 配置 spi 硬件接口 */
hpm_eeprom_device_t e2p_dev_temp = {
.host = &host_info,
.flag = EEPROM_FLAG_DEVICE_SPI,
.config = &dev_attr,
}; /* 配置已知的 spi eeprom 设备参数 */
hpm_eeprom_register_spi_param(&e2p_dev_temp, &host_info, dev_id); /* 获取 spi eeprom 参数 */
hpm_eeprom_register(&e2p_dev_temp, "e2p_dev_spi"); /* 注册 spi eeprom 实例 */
- 注册一个 i2c 驱动的 eeprom 实例,以 AT24C02 为例,获取相关参数,具体可参考 unit_test/drivers/eeprom/e2p_i2c/e2p_i2c_test.c
eeprom hal 层提供了一个全局 list hpm_support_e2p_i2c_device_list[] 用于存放支持的 i2c eeprom 设备参数,用户需要根据具体设备选择对应的索引。
同时指定使用的硬件 i2c 接口即可注册。
- 准备工作: 需配置 i2c 硬件接口的基地址,时钟初始化函数,引脚初始化函数等参数; 同时确认使用的 eeprom 型号, 如果在上述列表中, 需对 id 赋值; 如果不在, 需要自行填充 dev_attr 参数, 并对 id 赋值 0xff。
.. code-block:: c
uint8_t custom_id = 0;
uint32_t e2p_device_index = HPM_E2P_I2C_ADD_CUSTOM_ID_TO_DEV_ID(custom_id, E2P_DEVICE_AT24C02);
e2p_device_i2c_attribute_t dev_attr;
e2p_device_i2c_host_config_t host_info = {
.base = HPM_I2C1,
.clock_init = board_init_i2c_eeprom_clock,
.pin_init = board_init_i2c_eeprom_pin,
}; /* 配置 i2c 硬件接口 */
hpm_eeprom_device_t e2p_dev_temp = {
.host = &host_info,
.flag = EEPROM_FLAG_DEVICE_I2C,
.config = &dev_attr,
}; /* 配置已知的 i2c eeprom 设备参数 */
hpm_eeprom_register_i2c_param(&e2p_dev_temp, &host_info, e2p_device_id); /* 获取 i2c eeprom 参数 */
hpm_eeprom_register(&e2p_dev_temp, "e2p_dev_i2c"); /* 注册 i2c eeprom 实例 */
- 注意:
- 每个实例注册时需要指定唯一的名称,用于后续调用时区分不同实例
- 使用 I2C eeprom 时,用户需要注意区分不同的设备 ID,根据板级的实际情况指定 custom_id 值,避免冲突。
- 注册时需要先进性参数注册,再进行实例注册;如果没有参数注册,实例注册时,ops 接口将为空,无法进行后续操作(删除列表时可能会造成异常)
- 如果 hal 层中没有用户需要的 eeprom 设备(比如用户使用的 spi eeprom 型号,不在 list 中定义),可以参考 list 表中的定义,自行填充配置进行注册;同时,需要确认 pinmux 引脚配置正确。
- 如果用户不想通过 hal 层,想要直接使用底层驱动 API,也可以直接查看对应驱动代码,调用底层驱动 API 进行读写操作,但需要自行配置参数。
- 通过名称获取对应的 eeprom 实例句柄并初始化
举例: 以 spi 驱动的 eeprom 实例为例
.. code-block:: c
hpm_eeprom_device_t *e2p_dev = hpm_eeprom_find("e2p_dev_spi"); /* 通过名称查找 eeprom 实例句柄 */
hpm_eeprom_init(e2p_dev); /* 初始化 eeprom 实例 */
- 通过实例句柄进行读写操作
.. code-block:: c
hpm_eeprom_write_block(device, addr, len, (uint8_t *)&write_val); /* 写数据 */
hpm_eeprom_read_block(device, addr, len, (uint8_t *)&read_val); /* 读数据 */
当注册结束后,用户不需要关心底层驱动的实现细节,只需通过实例句柄调用统一的读写接口即可完成对 eeprom 的操作。