咱们今天就把 openvela 的新平台适配比作 “给新房子装修”——vendor_template 是 “毛坯房模板”,咱们要做的就是按自己的 “户型(芯片 / 板级需求)” 改细节,最终装出能住人的 “房子(可运行的系统)”。下面一步步拆解开,保证你看得明明白白~

第一步:先摸清 “毛坯房模板” 的结构(熟悉 vendor_template 目录)

vendor_template 就像一个标准化的毛坯房设计图,里面的每个房间、线路接口都有固定位置,咱们先得知道哪个地方该改啥。通常它的目录结构长这样(对应系统三层架构):

vendor_template/
├─ arch/           # 架构层相关(对应“房屋地基”,一般不用改)
│  └─ armv7-m/     # 比如ARMv7-M架构的基础代码(已适配,别动)
├─ chip/           # 芯片层(对应“房屋主体结构”,按芯片改)
│  └─ template_chip/  # 芯片模板(咱们要改成目标芯片,比如stm32f407)
│     ├─ kconfig    # 芯片级配置选项
│     ├─ Makefile   # 芯片代码编译规则
│     ├─ irq.c      # 中断控制器驱动(芯片核心功能)
│     ├─ clock.c    # 时钟管理驱动(芯片“心脏”)
│     └─ gpio.c     # 通用IO口逻辑(芯片“手脚”)
├─ board/          # 板级层(对应“装修+家具”,按开发板改)
│  └─ template_board/ # 板级模板(改成目标开发板,比如stm32f4discovery)
│     ├─ kconfig    # 板级配置选项
│     ├─ Makefile   # 板级代码编译规则
│     ├─ board.h    # PIN脚定义(比如LED接哪个GPIO)
│     └─ board_init.c # 板级初始化(比如给传感器上电)
└─ Kconfig          # 全局配置入口(决定哪些功能“启用”)
└─ Makefile         # 全局编译规则(控制整个vendor代码的编译流程)

记住:arch 目录基本不用碰(地基不用改),重点改chipboard目录 —— 就像装修时不用动地基,只改主体结构和内饰。

第二步:改 “主体结构”(适配芯片层 chip 目录)

假设咱们要适配的芯片是 “STM32F407”(一款常用的 ARMv7-M 架构芯片),就把template_chip改成stm32f407,然后逐个文件改:

1. 改kconfig:告诉系统 “这芯片有啥功能”

就像给装修师傅列清单:“这房子有 3 个卧室、2 个卫生间”。
打开chip/stm32f407/kconfig,原来的模板里可能有config TEMPLATE_CHIP,咱们改成:

kconfig

config CHIP_STM32F407
    bool "Support STM32F407 SoC"
    select ARCH_ARMV7_M  # 关联它的架构(ARMv7-M)
    help
        Enable support for STM32F407 SoC, which includes Cortex-M4 core,
        168MHz clock, 12-bit ADC, SPI/I2C/UART peripherals.

再把芯片特有的外设加上,比如:

kconfig

config STM32F407_UART
    bool "Enable UART peripheral"
    depends on CHIP_STM32F407  # 依赖STM32F407芯片
    default y  # 默认启用UART

这样编译时系统就知道 “这芯片有 UART 外设,可以用”。

2. 改Makefile:告诉编译器 “怎么编译芯片代码”

就像给厨师列步骤:“先切菜,再下锅”。
chip/stm32f407/Makefile里要指定编译哪些文件(irq.c、clock.c 等),比如:

makefile

# 要编译的源文件
CHIP_SRCS = irq.c clock.c gpio.c

# 把编译结果放进芯片层库(类似把零件装进“主体结构仓库”)
include $(TOPDIR)/scripts/Makefile.component

这样编译器就知道 “这芯片的核心代码是这几个文件,要编译成芯片层的库”。

3. 改驱动文件(irq.c/clock.c/gpio.c):给芯片 “接电线”

这一步是芯片适配的核心,就像给房屋主体接电线、装水管,让每个部件能工作。

  • irq.c:芯片的中断控制器逻辑。比如 STM32F407 的中断向量表、中断使能 / 禁用函数,要按芯片手册写(比如stm32_irq_enable()函数)。
  • clock.c:时钟管理。比如怎么把芯片主频从 8MHz(默认)升到 168MHz(最高),需要配置 PLL 锁相环,这一步得严格按芯片数据手册的 “时钟树” 来写(就像调水龙头水压,不能乱拧)。
  • gpio.c:通用 IO 口控制。比如gpio_set_mode()函数,要定义 STM32F407 的 GPIO 口是输入还是输出,对应寄存器操作(比如往GPIO_MODER寄存器写值)。

第三步:“装修” 板级层(board 目录)

假设咱们的开发板是 “STM32F4 Discovery”(基于 STM32F407,带 LED、加速度传感器),把template_board改成stm32f4discovery,开始 “装修”:

1. 改kconfig:告诉系统 “板子上有啥外设”

比如开发板上有 LED(PD13)、加速度传感器(LIS302DL,接 SPI1),就在board/stm32f4discovery/kconfig里加:

kconfig

config BOARD_STM32F4DISCOVERY
    bool "STM32F4 Discovery Board"
    depends on CHIP_STM32F407  # 依赖STM32F407芯片
    select LED_SUPPORT        # 启用LED支持
    select SPI_SUPPORT        # 启用SPI支持(因为有传感器)

config LED_PIN
    int "LED Pin Number"
    default 13  # LED接PD13
    depends on BOARD_STM32F4DISCOVERY

相当于告诉系统:“这板子有 LED 和 SPI 传感器,LED 在 13 号脚”。

2. 改Makefile:指定板级代码编译规则

类似芯片层,指定要编译的板级文件:

makefile

# 板级源文件
BOARD_SRCS = board_init.c

# 编译后放进板级库(类似把家具放进“装修仓库”)
include $(TOPDIR)/scripts/Makefile.component
3. 改board.h:定义 “家具位置”(PIN 脚映射)

就像给每个家具贴标签:“沙发在客厅东边,桌子在厨房”。
比如定义 LED 和 SPI 的 PIN 脚:

// LED接PD13
#define LED_PORT        GPIOD
#define LED_PIN         13

// SPI1(接传感器):SCK=PA5,MOSI=PA7,MISO=PA6
#define SPI1_SCK_PORT   GPIOA
#define SPI1_SCK_PIN    5
#define SPI1_MOSI_PORT  GPIOA
#define SPI1_MOSI_PIN   7
#define SPI1_MISO_PORT  GPIOA
#define SPI1_MISO_PIN   6

这样上层代码用LED_PIN就能直接控制开发板的 LED,不用管具体硬件细节。

4. 改board_init.c:“开电测试” 板级初始化

这一步是板子上电后最先执行的初始化,就像装修完第一次通电,检查灯亮不亮、水龙头有水没。
比如:

void board_init(void)
{
    // 1. 先初始化芯片(调用芯片层的初始化,比如时钟)
    chip_init();

    // 2. 初始化板级外设
    // 初始化LED引脚为输出
    gpio_set_mode(LED_PORT, LED_PIN, GPIO_MODE_OUTPUT);

    // 初始化SPI1(给传感器用)
    spi_init(SPI1);
}

初始化完后,LED 就能亮,传感器就能通过 SPI 通信了。

第四步:全局配置与编译(“总体验收”)

1. 改顶层 Kconfig:把新平台 “加入菜单”

打开vendor_template/Kconfig,加一行让新平台出现在编译选项里:

kconfig

source "chip/stm32f407/Kconfig"
source "board/stm32f4discovery/Kconfig"

# 让用户能选这个平台
config PLATFORM_STM32F4
    bool "STM32F4 Platform"
    select CHIP_STM32F407
    select BOARD_STM32F4DISCOVERY

这样编译时用make menuconfig就能看到 “STM32F4 Platform” 选项了。

2. 编译测试:“拎包入住”

最后一步就是编译,生成能烧录的二进制文件:

bash

# 配置平台(选STM32F4 Platform)
make menuconfig

# 编译
make -j4

# 生成产物(在build目录下)
# libarch.a(架构层库,没变)
# libboards.a(板级库,咱们的装修成果)
# vela_nuttx.bin(可烧录的固件,整个房子)

烧录vela_nuttx.bin到开发板,如果 LED 能闪、传感器能读数据,就说明适配成功啦!

总结:适配就像 “盖房子”

  • 架构层:地基(不用动)
  • 芯片层:主体结构(按芯片手册接 “水电”)
  • 板级层:装修 + 家具(按开发板外设定义 “位置” 和 “初始化步骤”)

跟着模板改,每一步对应 “看结构→改主体→搞装修→总体验收”,新平台适配就搞定啦~

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐