10. EEPROM HAL

10.1. 概述

  • EEPROM HAL(硬件抽象层)组件为 HPMicro SDK 中访问各种类型的 EEPROM 存储设备提供统一接口。它抽象了底层硬件差异,为应用程序提供一致的 API 来读写 EEPROM 数据

    • eeprom hal 特点

      • 支持三种驱动方式:
        • 基于 flash 模拟 eeprom

        • i2c eeprom

        • spi eeprom

      • 多实例支持
        • HAL 层通过注册的方式支持多个 eeprom 设备实例,通过注册名统一管理

        • 每个实例可以独立配置不同的硬件接口和参数

      • 统一接口调用
        • 提供统一的读写接口,屏蔽底层实现差异;可以通过 hal 层调用 API,同时也可以直接调用底层驱动 API(需要自己配置参数)

      • 页感知写入
        • 底层提供防回卷功能,自动处理页边界跨越

      • 状态轮询
        • 提供写入完成状态轮询接口,确保数据写入成功

10.2. 架构描述

  • eeprom hal 层架构图

    +----------------------------------------------------------+
    |                          应用层                          |
    |              (使用 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)          |
    +----------------------------------------------------------+

10.3. 相关宏定义以及枚举和结构体介绍

  • 宏定义

    • 定义了用于配置的 eeprom 类型和允许注册的最大实例数量(可扩展)

      /**
      * @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 可扩展)

      支持的 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 层设备结构体定义

      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 调用函数集定义

      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 设备实例注册数组

      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 配置参数

      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 配置参数

      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 配置参数

      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;
      

10.4. API调用流程介绍

  • 使用流程

    应用程序启动
            │
            ▼
    ┌──────────────────────────┐
    │  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 数据区起始地址,擦除单元大小和数量等参数。

    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。

      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。

      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 实例为例

      hpm_eeprom_device_t *e2p_dev = hpm_eeprom_find("e2p_dev_spi"); /* 通过名称查找 eeprom 实例句柄 */
      hpm_eeprom_init(e2p_dev); /* 初始化 eeprom 实例 */
      
    • 通过实例句柄进行读写操作

      hpm_eeprom_write_block(device, addr, len, (uint8_t *)&write_val); /* 写数据 */
      
      hpm_eeprom_read_block(device, addr, len, (uint8_t *)&read_val); /* 读数据 */
      

    当注册结束后,用户不需要关心底层驱动的实现细节,只需通过实例句柄调用统一的读写接口即可完成对 eeprom 的操作。