CanMV K210工程源码架构解析

CanMV K210工程源码架构

关于CanMV

github源码地址: https://github.com/kendryte/canmv

CanMV, 让 AIOT 更简单~

CanMV 基于Sipeed MaixPy,但它与之不同,现在是一个完全独立的项目。 基于 Micropython 语法, 兼容移植openmv功能,运行在Canan强大的嵌入式AI SOC系列K210上,具有丰富的AI demo以快速实现强大的AI视觉开发。

K210 简介 :

  • 拥有硬件加速的 AI 图像识别
  • 带硬件浮点运算的双核处理器
  • 8MB(6MB+2MB) 内存
  • 16MB 外置 Flash
  • 芯片 CPU 最高可达 800MHz 主频 (开发板支持最高主频具体看开发板介绍, 通常400MHz)
  • 麦克风阵列支持(8个麦克风)
  • 硬件 AES SHA256 支持
  • FPIOA (每个外设可以映射到任意引脚)
  • 外设: I2C, SPI, I2S, WDT, TIMER, RTC, UART, GPIO 等等
  • 目录结构

    目录 子目录 子目录2 子目录3 内容梗概
    assets 资源文件
    projects 工程文件, 每个文件夹一个工程
    tools 工具
    components 组件
    └-boards 板级代码
    └-drivers 驱动
    └-micropython micropython 相关代码
    └-core micropython 源码
    └-port maixpy 自定义部分源码
    └-builtin_py maixpy 默认内置类
    └-include 移植部分头文件
    └-src 功能模块源码
    └-spiffs SPIFFS 文件系统
    └-utils 工具类(函数)

    基于micropython的主要功能模组实现都存放在目录 components/micropython/port/src 下,该目录结构如下:

    目录 子目录 内容梗概
    src mpy功能模块源码
    └-audio 音频相关
    └-lvgl lvgl UI
    └-Maix 芯片相关功能(gpio,kpu,fft,mic_arry等)
    └-modules 一些模组
    └-nes nes模拟器
    └-omv openmv
    └-speech 语音识别
    └-standaed_lib mpy标准模组
    └-touchscreen 触摸驱动模组
    └-ulab 类numpy数学计算模组
    └-video 视频相关

    不同功能板子的项目创建在 projects目录下,也可以选择无micropython的c开发。

    编译相关

    Kconfig配置

    工程使用 CMake 进行组织, 并且工程支持多个可配置选项(Kconfig

    如果需要添加配置项, 可以通过修改 Kconfig 文件来达到目的,所有配置项在编译时会生成宏定义添加到global_config.h(生成的文件)中去, 而且在 CmakeLists.txt 文件中都可以使用该宏定义。

    比如在 Kconfig 中定义 config BOARD_M5STICK, 在 CMakeLists.txt 中可以通过判断CONFIG_BOARD_M5STICK 是否为真来决定是否编译特定的代码。 编译时就可以通过python3 project.py menuconfig来选择是否勾选了

    编译配置

    以maixpy_canmv工程为例,menuconfig更改配置后新的配置文件保存在projects/maixpy_canmv/build/config/global_config.mk,build目录下是编译时的临时文件,当执行python3 project.py distclean清除编译时会被清掉,所以如果想让配置永久保存生效需要手动拷贝到文件projects/maixpy_canmv/config_defaults.mk里。

    注意: 如果更改源文件后编译出错时可以先尝试python3 project.py distclean清除编译,在重新python3 project.py build编译。

    固件裁剪

    当固件过大时会导致可用内存变少,无法跑大型py应用或者加载大模型,这时候可以通过裁剪固件大小的办法删去不必要的功能模块。

    通过python3 project.py menuconfig进入到配置界面,进入 Components configuration —> Micropython configurations—> Modules configurations —> 菜单,可以对micropython的模组进行按需选择。下面是一些不重要模组的大小占用情况:

    模组 大小(byte) 说明
    nes 139776 nes游戏模拟器,不重要且占用大优先裁剪
    ulab 39232 类numpy数学计算库,应用场合不多
    mic_array 9954 麦克风阵列,特有应用场景
    yuv_table 342784 openmv中的yuv转换表,用不到可裁掉
    video 5696 视频录制播放,占用不大可按需裁剪
    omv_advance 444800 openmv的算法核心实现,如果只需要kpu处理而不需要openmv的算法可以裁剪掉

    一般情况下想保留openmv算法与kpu跑大模型,可以裁剪这几个nes, ulab, mic_array, yuv_table, video

    新硬件的适配移植

    如果一个新板子sensor, lcd, sdcard等硬件引脚配置不一样,就需要重新进行适配移植,适配方式有两种:

    1. 源码里新增一个工程目录并适配
    2. 在已经烧录canmv固件的板子上上传一个config.json配置文件

    源码适配新硬件

    projects/maixpy_canmv项目为模板拷贝一份新的在projects目录下,比如起个名字为maixpy_test,然后打开其中的projects/maixpy_test/builtin_py/_boot.py文件,找到如下代码位置:

    config = {
    "type": "canmv",
    "lcd": {
        "rst" : 39,
        "dcx" : 37,
        "ss" : 38,
        "clk" : 36,
        "height": 240,
        "width": 320,
        "invert": 1, /* 反显 */
        "offset_x1": 0,
        "offset_y1": 0,
        "offset_x2": 0,
        "offset_y2": 0,
        "dir": 96  /* 显示方向 */
    },
    "freq_cpu": 416000000,
    "freq_pll1": 400000000,
    "kpu_div": 1,
    "sensor": {
        "cmos_pclk":47,
        "cmos_xclk":46,
        "cmos_href":44,
        "cmos_pwdn":45,
        "cmos_vsync":42,
        "cmos_rst":43,
        "reg_width":16,
        "i2c_num":2,
        "pin_clk":41,
        "pin_sda":40
    },
    "sdcard":{
        "sclk":28,
        "mosi":27,
        "miso":29,
        "cs":26,
        "cs_gpio":29
    },
    "board_info": {
    	"BOOT_KEY":  16,
    }
    }
    

    主要就是修改里面的lcd,sensor,sdcard的硬件引脚分配,对照原理图修改,具体说明可以参考源码中文件components/boards/config/readme.md

    该方式就是通过_boot.py程序启动时生成一个config.json到板端flash的文件系统里, 所以我们也可以自己上传一个config.json到flash文件系统里达到修改的目的,这就是下面的第二种方法。

    上传config.json到板端适配

    临时适配一个板子的话可以采用这种方式,具体说明可以参考源码中文件components/boards/config/readme.md。把上面代码config的里的json内容保存到config.json文件然后上传到板子flash重启即可生效。如果flash被擦除重烧录了固件的话那么config.json也就被重置为了初始内容,需要再次上传一遍修改的config.json,所以一般不推荐此方法适配,仅作为一个临时方案。

    文件系统

    使用的spiffs文件系统,针对嵌入式flash芯片,可以有效平衡磨损,另外提供了spiffs文件系统镜像生成工具,意味着可以将python脚本文件预先组织好生成镜像烧录到falsh指定位置替换。

    MicroPython 是从 0x0 开始的程序,在程序中会通过 spiffs 在 Flash 的 [0xD00000, (0xD00000 + 0x300000)) 区间构建 VFS (虚拟文件系统),是由 projects/maixpy_xxxxx/config_defaults.mk 中定义得到的。

    CONFIG_SPIFFS_SIZE=0x300000
    CONFIG_SPIFFS_START_ADDR=0xD00000
    

    flash分区规划

    canmv板载flash大小为16M,具体划分情况如下:

    起始地址 大小(byte) 说明
    0x0 3M 预留给固件烧录
    0x300000 (3M) 10M 空余,可用于存放kmodel模型,字库等二进制文件
    0xD00000 (13M) 3M 文件系统
    物联沃分享整理
    物联沃-IOTWORD物联网 » CanMV K210工程源码架构解析

    发表评论