资讯动态

Zephyr BSP: 36-Zephyr集成公司HAL

发布时间:2026/9/29 4:19:34 来源:尧图企业网站定制
摘要:本文是 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-STATUSTX_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

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑