【Zephyr,启动!】移植了 Duo 和 Duo S 的 Zephyr RTOS

哈啰大家好,

最近给 Duo 和 Duo S 的小核移植了 Zephyr RTOS,分享给大家!

仓库地址:GitHub - xingrz/zephyr at milkv-duo/hwmv2/dev

相对于 FreeRTOS,Zephyr 的优势

  • 支持 Windows/Linux/macOS 三大平台的开发环境
  • 自带了非常多经典 IP、外设(如屏幕和摄像头)的驱动,不需要重复发明轮子
  • 内核/驱动/板级配置与用户代码分层,API 一致,让业务真正平台无关,方便移植

支持的特性

  • Mailbox
  • PINMUX
  • GPIO
  • PWM
  • UART

上手

1. 环境搭建

参考 Getting Started Guide — Zephyr Project Documentation

2. 拉取代码

# 初始化一个目录作为工作区,此处以 ~/zephyrproject 举例
west init ~/zephyrproject -m https://github.com/xingrz/zephyr.git --mr milkv-duo/hwmv2/dev
cd ~/zephyrproject/zephyr
west update

3. 编译

此处以 Duo 为例编译一个 blinky 示例。Duo S 把下面的 milkv_duo 换成 milkv_duos 即可。

west build -s samples/basic/blinky -p -b milkv_duo

该示例会以 1s 间隔闪烁 Duo 开发板上的 LED。因此你需要删除 Linux 下面的 /mnt/system/blink.sh 才能使它生效。

4. 启动

第一步:从官方的 duo-buildroot-sdk 构建出 TF 卡镜像。

注意:因为 Zephyr 这边也实现了 PINMUX 驱动,引脚复用可能会被之后启动的 U-Boot 覆盖,因此如果需要以 Zephyr 里设置 PINMUX 为准的话,则需要删除 U-Boot 里对应的设置(位于 build/boards/cv180x/cv1800b_milkv_duo_sd/u-boot/cvi_board_init.c);如果以 U-Boot 为准,则需要更改 Zephyr boards/milkv/duo/milkv_duo.dts 里对应的 pinctrl 节点。

第二步:将官方镜像中的 FreeRTOS 替换为 Zephyr,重新打包一个 fip.bin

python3 /path/to/duo-buildroot-sdk/fsbl/plat/cv180x/fiptool.py \
    -v genfip "/path/to/new/fip.bin" \
    --OLD_FIP="/path/to/old/fip.bin" \
    --BLCP_2ND="build/zephyr/zephyr.bin"

将生成的 fip.bin 替换到 SD 卡里即可。

第三步:擦电,开机!

5. 日志打印

Duo 上默认使用 UART1 (GP0) 打印日志,Duo S 上默认使用 UART2 (B11) 打印日志。


谢谢大家, 欢迎交流!

4 Likes

nice project, thank you sharing !

请问一下关于大小核的串口问题。
我使用了你的zephyr patch. 然后我在大核小核都跑了zephyr.
目前发现:
小核

  1. 可以在uart1上用中断或poll模式运行shell, uart2上用poll模式运行shell

大核

  1. 可以在uart0上用中断或poll模式运行shell.
  2. 可以在uart1上用poll模式运行shell.中断模式会出异常。中断号用45
  3. 可以在uart4上用poll模式运行shell, 中断模式会出异常。中断号用48

请问一下您试过大核串口的中断模式么?中断号用多少?

1 Like

我没有在大核上跑过 Zephyr。

中断号可在 CV180X-Interrupt-v1.xlsx 查到,C906B_intr_num 列是大核,C906L_intr_num 列是小核。

1 Like

一不小心捕捉到一只 XiNGRZ :yum:~~~~~~~

请问一下关于zephyr中的GPIO-LED和GPIO-Key相关的管脚功能时,如何使用pinctrl来配置成GPIO0-3这四组模式?

在zephyr代码里UART或其它总线可以增加pinctrl-0来配置管脚为uart对应的tx,rx功能模式。但是没看到如何配置LED和Key相关的pinctrl配置方式。

Zephyr 通常是假设你的引脚默认就是作为 GPIO 使用的。在 CV1800 这种大部分引脚都默认被复用到别的外设的芯片上确实会有点难搞。

那看来只有在board的初始化时对管脚复用做配置了。

west update 必须要更新所有的module 模块吗?

@xiaoshitou west update会检查所有module是否和west.yml里记录的revision一致。west.yml记录的通常是具体的commit id而不是branch,所以除非你手动进了某个module切了分支,否则说不上是更新。

嗯嗯, west.yml 所有的模块都是必须的吗? 因为网速的问题, 有的无法更新下来,会导致编译失败吗?

不好说,根据你编译的app用了什么功能而定。只要编译失败了,那就是必须的。只要编译没失败,那就不是必须的。