驱动分层

[English]

备注

驱动分层模型适用于所有外设,本节以 UART 为例进行说明。

示例

下图列出了与 UART 驱动实现相关的文件。

- armino
    - middleware
        - driver
            - include
                - uart.h
            - uart
                - uart_driver.c
                - uart_driver.h
                - uart_statis.c
                - uart_statis.h
        - arch
            - bk7236
                - soc
                    - uart_cap.h
                    - uart_reg.h
                    - uart_struct.h
                - hal
                    - uart_ll.c
                    - uart_ll.h
            - common
                - hal
                    - include
                        - uart_hal.h
                        - uart_types.h
                    - uart_hal.c
                - soc
                    - include
                        - uart_hw.h

分层概述

UART 驱动分成驱动层,HAL(硬件抽象)层, LL(寄存器接口)层与 SOC(寄存器定义)层, 各层功能概述如下:

层次

功能概述

驱动层

  1. 提供应用程序能访问的公开 API, API 稳定并向后兼容

  2. 应用程序仅能通过这一层的 API 访问硬件

  3. 依赖 HAL, 通常是 HAL 功能子集

  4. 内部实现通常具有平台无关性

  5. 可依赖 OS 以及 Beken SDK 其他组件

HAL

  1. 对硬件的抽象,提供一组稳定而全面的 API 接口

  2. 通常性能更好,占用更少资源,将 Beken 芯片运行移植到其他 软件平台时,可考虑仅移植 HAL 层

  3. 不同板子上 HAL 接口通常一致

  4. HAL 层接口不承诺稳定,基于 HAL 层移植的代码在 HAL 升级后 可能面临兼容性问题

  5. 仅能依赖 LL/SOC, 以及打印相关代码

  6. 不涉及任何直接寄存器操作

LL

  1. 通常是对寄存器访问的简单包装, 使程序更具有可读性

  2. 通常实现为 inline 函数

  3. 实现尽可能简单

SoC

提供寄存器定义

文件说明

层次

头文件名

功能概述

Driver

uart_types.h

uart.h

uart_driver.c

uart_driver.h

uart_statis.c

uart_statis.h

提供 UART API 类型定义, 可直接引用 mod_types.h 中的定义

UART API 声明

UART 驱动实现

UART 驱动私有数据类型与宏定义,仅 UART 驱动层可访问

UART 驱动统计相关信息

UART 驱动统计相关类似定义

HAL

uart_hal.h

uart_hal.c

uart_ll.h

硬件抽象层 API 声明,不同板子共用一份

UART 硬件抽象层接口实现

包装寄存器访问接口,使得寄存代码更可读

SoC

uart_reg.h

uart_struct.h

uart_cap.h

寄存器宏定义,板子相关

以 C 结构体形式定义寄存器

硬件能力参数