Zephyr 之创建 Custom SoC - 2

Zephyr 之创建 Custom SoC - 2

intro

前一篇文章中,我们实现创建了一个新的 Custom SoC,但这个 SoC 中没有包含与 SoC 有关的具体内容,例如记录着 SoC 各外设寄存器信息的头文件,厂商提供的驱动代码等,这里统称为硬件抽象层 HAL,本文将继续讲解创建 Custom SoC 的第二部分,实现添加 SoC 有关的信息。

添加 HAL

HAL 层的内容不再 Zephyr 原本的代码中,打开 Zephyr Project 文件夹下,除了 Zephyr 的代码外,还有 modules,bootloader 等名称的文件夹,HAL 就存放在 modules 文件夹中。
能否直接在 modules/hal 中添加 custom soc 的内容?自然是不行的,这样 zephyr 是找不到 custom soc 的 hal 代码的,具体的做法大致如下:

  • 在 GitHub 或 Gitee 中创建一个名为 hal_custom_soc 等仓库
  • 并且添加必要的 hal 文件和 zephyr 配置文件
  • 在 zephyr 的 west.yaml 中添加相应信息
  • 执行 west update 指令,拉取 hal_custom_soc 仓库的内容

可参考Zephyr 代码 https://gitee.com/UnsicentificLaLaLaLa/zephyr.githttps://gitee.com/UnsicentificLaLaLaLa/hal_mindmotion_for_zephyr.git

首先呢,在 GitHub 或 Gitee 上创建一个 hal_xxx 的仓库,作为存放芯片寄存器头文件,hal 驱动等代码的仓库,在其它位置 clone 这个仓库,放入芯片资料,调试下载所需的 pack 文件,以及 zephyr 文件夹和一个 CMakeLists.txt 文件。

tree
.
├── CMakeLists.txt
├── LICENSE
├── xxx_soc_hal
│   ├── xxx_soc.c
│   └── xxx_soc.h
├── support
│   └── xxx_soc.pack
└── zephyr
    └── module.yml

zephyr 文件夹内需要放置一个 module.yml 文件,内容填充如下:

name: hal_xxx
build:
  cmake: .
  settings:
    dts_root: .

hal_xxx 和文件夹名 hal_xxx 保持一致,至于为什么写这些东西,截至目前暂不清楚。

然后是 CMakeLists.txt 文件,这个文件能够让 zephyr 在编译的时候找到相应的芯片代码,在查看编译生成的 build 文件时发现,在编译的时候,会把所有厂商的 hal_xxx 文件夹路径包含进去,然后通过 CMakeLists.txt 来区分需要包含哪个子文件夹中的芯片代码。所以说这个 CMakeLists.txt 是连接 zephyr 与芯片代码之间重要的桥梁,看下如何编写:

add_subdirectory_ifdef(CONFIG_SOC_SERIES_XXXX xxx_soc_hal)

就一句话,把根据 zephyr 中的 cmake 配置宏来区分添加哪个文件夹。

xxx_soc_hal 存放芯片代码,就是芯片厂商提供的头文件,驱动代码等,不需要 linker 文件,也不需要启动代码,但可能需要 SystemInit 代码,在进入操作系统前进行系统时钟初始化等操作。

support 是为了存放 pack 包,然后 zephyr 可用使用 pyocd 的形式对微控制器进行下载程序和调试代码的操作,当然,support 只是为了方便管理而创建的,也可以把这个 pack 放在芯片层,或者其它位置,只要能够让 zephyr 找到这个 pack 包即可。

上面可以发现,zephyr 在找代码的时候,是通过 CMakeLists.txt 来查找的,这是一个经验,在多层目录结构中,可以在每层目录下放一个 CMakeLists.txt 文件,按照宏的条件来选择添加不同的文件夹路径,找到相应的代码。

综上,hal_xxx 这个仓库已经完成,把添加好代码的仓库 push 到远程,即可结束第一步的操作。

引入 HAL

前面既然已经将 hal_xxx 整理完成,接下来就得让 zephyr 能够找到这个 hal_xxx。
打开 zephyr 的 west.yml 文件,感受下它的文件格式:

manifest:
  defaults:
    remote: upstream

  remotes:
    - name: upstream
      url-base: https://github.com/zephyrproject-rtos
    - name: babblesim
      url-base: https://github.com/BabbleSim

  group-filter: [-babblesim]

  #
  # Please add items below based on alphabetical order
  projects:
    - name: acpica
      revision: 0333c2af13179f9b33d495cf7cb9a509f751cbb1
      path: modules/lib/acpica
    - name: bsim
      repo-path: babblesim-manifest
      revision: 384a091445c57b44ac8cbd18ebd245b47c71db94
      path: tools/bsim
      groups:
        - babblesim
...

default 字段表示了如果 project 字段中的内容没有指定 remote 的话,就是 upstream 中获得这个仓库,upstream 指的是 zephyr 的 github 账户。在这里要么联系 zephyr 官方给我们开放一个仓库添加芯片的 hal 文件,要么学那个 babblesim 定制一个自己的链接。

remotes 中定义了两个字段,代表两个账户,分别是 upstream 和 babblesim,upstream 在前面的字段中表达了作为默认账户。在这里,我们可以将自己的 github 或 gitee 账户添加到 remotes 中,方便下面的 projects 去引用:

...
  remotes:
    - name: upstream
      url-base: https://github.com/zephyrproject-rtos
    - name: babblesim
      url-base: https://github.com/BabbleSim
    - name: UnsicentificLaLaLaLa
      url-base: https://gitee.com/UnsicentificLaLaLaLa

  group-filter: [-babblesim, -UnsicentificLaLaLaLa]
...

记得在 group-filter 中添加自己的账户名。

模仿 babblesim 的添加方法添加自己的仓库链接,其中 revision 可以不写,这样代表引用的仓库版本总是默认的,好处是总能下载到最新的代码,缺点是如果仓库多的话,每个仓库都从远程仓库中检查一番,会花费很长的时间,因此,建议加上 revision,或者只在关心的仓库中舍去 revision 字段:

...
    - name: hal_xxx
      path: modules/hal/xxx
      remote: UnsicentificLaLaLaLa
      groups:
        - hal
...

写好 west.yml 之后,到 zephyrproject 文件夹下,执行 west update 指令:

west update

这样就能从远程仓库中拉取代码了,拉取完之后,到 zephyrproject/modules/hal 中检查一下是否成功拉取代码,拉取到了,旧代码已经成功引入到 zephyr 仓库中。

检查 HAL

按照前文中创建应用的方法创建一个空的 main() 函数,里面只带一个 while(1) 循环,引入相应的头文件,使用寄存器或者库函数的方法试图点亮一个 LED 灯,在 soc init 那边将微控制器的 SystemInit 函数加进去,引入相应的头文件,编译,看看能否正确执行这个点灯程序,如果有条件的话,可以使用 jlink 调试器,加上 ozone 调试软件,尝试单步调试,看看能不能跑到主函数。

可能会编译出错,因为不同厂家对内核中断的中断名表示不一致,例如系统调用中断,有的厂家可能是 SVC_Handler,有些是 SVCall_Handler,对应的中断号也不一致,按照编译出错的提示修改。

当然也可能会出现其它的错误,按照提示解决就行。

Summary

不同芯片的 hal 文件不属于 Zephyr 的代码,因此会放在 zephyr 仓库之外,使用 west.yml 来记录。
zephyr 仓库中放置芯片的 hal 文件,然后使用 CMakeLists.txt 文件来索引让 zephyr 找到它们。
尝试创建一个 app 来验证它们,或者修改现有的 hello world 来运行它们,最后调试来判断是否运行成功。
如果编译出错且不知道如何解决,可以贴在评论区寻求帮助。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值