☰
Zephyr BSP: 36-Zephyr集成公司HAL
2026/9/29 4:19:25 网站建设 项目流程

摘要:本文是 Zephyr BSP 系列第 36 篇,核心回答一个现实问题——公司已有 HAL 时,Zephyr Driver 该如何与之协作。文章首先给出最终架构:Zephyr Driver 调 Company HAL,Company HAL 直接操作 SoC,并解释为什么不要让 Driver 直接操作寄存器(避免代码重复、绕过 SoC workaround)。随后详细阐述 HAL 与 Driver 的职责边界:HAL 管"怎么操作硬件",Driver 管"怎么把硬件变成 Zephyr Device";HAL 应保持 RTOS independent,不解析 Devicetree、不依赖 Kconfig,而 Clock/Reset 的 ownership 要清晰划分。最后给出推荐的目录结构、常见错误清单,以及从 09 到 36 篇的完整学习链路总结。

Company HAL 怎么放进 Zephyr?

这一篇非常关键。

到35 — BSP Validation,你已经建立了一个完整认识:

Application ↓ Zephyr API ↓ Zephyr Driver ↓ Company SoC ↓ Hardware

但真正做公司 SoC BSP 时,还会遇到一个现实问题:
公司通常已经有一套 HAL。为什么还要重新写 Zephyr Driver?

答案是:
Zephyr Driver 不应该重新实现硬件寄存器逻辑。
最理想的架构是:Zephyr Driver 调 Company HAL,Company HAL 再直接操作 SoC。

1. 先看最终架构

假设公司已经有:

Company HAL ├── uart.c ├── gpio.c ├── spi.c ├── i2c.c ├── timer.c ├── clock.c └── irq.c

那么 Zephyr BSP 推荐形成:

┌─────────────────────────────┐ │ Application │ │ │ │printk()/UART API/GPIO │ └──────────────┬──────────────┘ │ ▼ ┌─────────────────────────────┐ │ Zephyr API │ │ │ │uart_poll_out()│ │gpio_pin_set()│ │spi_transceive()│ └──────────────┬──────────────┘ │ ▼ ┌─────────────────────────────┐ │ Zephyr Driver │ │ │ │ uart_company.c │ │ gpio_company.c │ │ spi_company.c │ └──────────────┬──────────────┘ │ ▼ ┌─────────────────────────────┐ │ Company HAL │ │ │ │company_uart_init()│ │company_uart_write()│ │company_gpio_set()│ │company_spi_transfer()│ └──────────────┬──────────────┘ │ ▼ ┌─────────────────────────────┐ │ Company SoC HW │ │ │ │ UART/GPIO/SPI/I2C │ │ Clock/IRQ/Timer │ └─────────────────────────────┘

这就是今天这一篇最核心的结构。

2. 为什么不要让 Zephyr Driver 直接操作寄存器?

当然可以:

staticintcompany_uart_poll_out(...){UART0->TXDATA=c;while(!(UART0->STATUS&TX_READY));return0;}

但是如果公司已经有 HAL:

company_uart_write(UART0, c);

那么重新写寄存器逻辑会产生两个问题。

问题 1:代码重复

原来:

Company HAL ↓ UART register

现在变成:

Zephyr UART Driver ↓ UART register

两套代码都维护 UART。

问题 2:HAL 的 SoC workaround 被绕过

真实 SoC 往往不是:

UART=几个寄存器

而可能存在:

ClockenableReset release Pinmux FIFO configuration Errata workaround DMA Power management Silicon revision

这些东西可能已经封装在 HAL:

company_uart_init(){company_clock_enable(...);company_reset_deassert(...);company_pinmux_uart(...);/* * Silicon revision workaround */...UART->CTRL=...;}

如果 Zephyr Driver 自己重新实现:

UART->CTRL=...

很容易绕过这些逻辑。

3. 所以 Company HAL 的位置是什么?

可以把它理解成:
HAL 是 SoC 厂商提供的「硬件操作库」。

而:
Zephyr Driver 是把这些硬件能力翻译成 Zephyr API。
两者不是竞争关系。

4. 一个非常重要的边界

例如 Company HAL:

intcompany_uart_init(conststructcompany_uart_config*cfg);intcompany_uart_putc(uint32_tbase,uint8_tc);intcompany_uart_getc

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询