# libbare-cpu **Repository Path**: ingenic-dev/libbare-cpu ## Basic Information - **Project Name**: libbare-cpu - **Description**: 适用于君正芯片平台,裸系统驱动 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: develop/master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 15 - **Forks**: 5 - **Created**: 2022-01-27 - **Last Updated**: 2025-09-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # libbare-cpu 介绍 libbare-cpu 是Ingenic为其MCU提供的一个底层硬件库,旨在提供不依依赖于操作系统的裸机环境,其结构简单,直接面对硬件控制器寄存器编程,能够实现误操作系统的业务逻辑。同时libbare-cpu提供了基于 freertos/alios/rthtread的porting文件,方便适配到rtos系统,满足对操作系统有需求的用户。 配合Ingenic提供的JTAG调试器,支持使用VSCode 在线调试代码。 目前主要支持芯片 - X16XX - X26XX ## 系统结构 ![Alt text]() ## 源码目录结构 ``` ├── cpu │   ├── core # CPU 体系结构相关,主要是mips xburst系列. │   └── soc-x16xx # soc-x16xx 系列芯片寄存器定义 │   └── soc-x2000 # soc-x2000 系列芯片寄存器定义 ├── Doxyfile # 用于生成API文档 ├── drivers │   ├── bsp # 开发板级相关的驱动,例如:开发板上的camera/lcd驱动等,封装成库文件 │   │   ├── common │   │   ├── x16xx-halley6 # [chipname]-[devboard] │   │   └── x2000-halley5 │   ├── core # mips架构,用于适配不同系统的文件,支持裸系统bare/alios/rtthread/freertos. │   │   ├── alios │   │   ├── bare │   │   ├── freertos │   │   └── rtthread │   ├── core-riscv # riscv架构,用于适配不同系统的文件,支持裸系统bare/alios/rtthread/freertos. │   └── drivers-x16xx # soc-x16xx 对应的hal 寄存器驱动 │   ├── drivers-x2000 # soc-x2000 对应的hal 寄存器驱动 │   ├── drivers-x2600 # soc-x2600 对应的hal 寄存器驱动 ├── lib │   ├── gcc # gcc 库 │   └── libc | ├── minimal # 最小的C库实现,不支持浮点 │   └── newlib # 移植的newlibc,支持浮点和软浮点 ├── Middlewares # 中间组件 │   ├── Third_Party │   └── X16XX_USB_Device_Library ├── projects # 工程示例 │   ├── x16xx-halley6 # 针对 x16xx系列芯片 halley6开发板的示例程序. │   │   ├── Apps # 实现某些有特色功能的应用程序,例如:音频播放器,camera recorder 等等。 │   │   ├── Demos # 结合市场需求,开发的具有特色的产品推广的 demo. │   │   ├── Examples # 针对芯片控制器编写的使用示例,例如:串口,SPI,I2C 等等. │   │   └── Templates # 工程模板,可以复制Templates到其他文件夹,进行工程创建. │   ├── x2000-halley5 # 针对 x2000系列芯片 halley5开发板的示例程序. │   │   ├── Apps # 实现某些有特色功能的应用程序,例如:音频播放器,camera recorder 等等。 │   │   ├── Demos # 结合市场需求,开发的具有特色的产品推广的 demo. │   │   ├── Examples # 针对芯片控制器编写的使用示例,例如:串口,SPI,I2C 等等. │   │   └── Templates # 工程模板,可以复制Templates到其他文件夹,进行工程创建. │   └── x2660-halley # 针对 x2600系列芯片 halley开发板的示例程序. 支持mips/riscv体系结构的程序. │   ├── Apps │   ├── Demos │   ├── Examples │   └── Templates ├── README.md └── tools ├── astyle.sh ├── create_project.py ├── ld.lds # 系统的链接脚本 ├── proj ├── vscode_template ├── dev-tools | ├── Windows # windows 开发工相关软件安装包 | └── Linux # Linux 开发工具相关软件 └── windows ``` ## lib 目录说明 ``` ├── gcc │   ├── fp64 │   ├── include │   └── sof └── libc ├── minimal │   └── include └── newlib ├── include └── lib ├── fp64 └── sof ``` 主要包含 - gcc [libgcc 使用说明](lib/gcc/README.md) - libc-minimal - libc-newlib # 开发环境搭建 ### 工具链信息汇总 | 工具链名称 | 支持芯片系列 | Linux下载链接 | Windows下载链接 | 百度网盘链接 | |------------------|-----------------------|-------------------------------------------------------------------------------|------------------------------------------------------------------------------|------------------------------------------------------------------------------| | XBURST1 | X1600系列 | ftp://ftp.ingenic.com.cn/Ingenic-MIPS-Toolchain/releases/ingenic-mips-toolchain-r5.1.6/mips-ingenic-xburst1-elf-tools-r5.1.6.tar.bz2 | ftp://ftp.ingenic.com.cn/Ingenic-MIPS-Toolchain/releases/ingenic-mips-toolchain-r5.1.6/mips-ingenic-xburst1-elf-tools-x86_64-w64.r5.1.6.zip | [链接](https://pan.baidu.com/s/1V1Adnp-9UHB9Imy2D7ZcNw?pwd=res3) 提取码: res3 | | XBURST2 | X2000/X2600系列 | ftp://ftp.ingenic.com.cn/Ingenic-MIPS-Toolchain/releases/ingenic-mips-toolchain-r5.1.6/mips-ingenic-xburst2-elf-tools-r5.1.6.tar.bz2 | ftp://ftp.ingenic.com.cn/Ingenic-MIPS-Toolchain/releases/ingenic-mips-toolchain-r5.1.6/mips-ingenic-xburst2-elf-tools-x86_64-w64.r5.1.6.zip | [链接](https://pan.baidu.com/s/1Zp7cB9Z0n4KabGO18iRDbQ?pwd=9g4f) 提取码: 9g4f | | RISC-V V0 | X2600系列(RISC-V小核) | ftp://ftp.ingenic.com.cn/Ingenic-RISCV-Toolchain/Victory0-Series/releases/riscv-ingenic-victory0-series-toolchain-r1.0.1/riscv-ingenic-victory0-series-toolchain-r1.0.1.tar.bz2 | ftp://ftp.ingenic.com.cn/Ingenic-RISCV-Toolchain/Victory0-Series/releases/riscv-ingenic-victory0-series-toolchain-r1.0.0/riscv-ingenic-victory0-series-toolchain-win64-r1.0.0.tar.bz2 | [链接](https://pan.baidu.com/s/1PxAr3NA-hGOlMNxs4-hKYw?pwd=nz6i) 提取码: nz6i | 注意: 如果ftp无法访问,请使用百度网盘链接进行下载。 ## U-BOOT 下载 - git clone http://git1.ingenic.com.cn:8082/gerrit/bootloader/u-boot -b ingenic-master u-boot-ingenic-master ## 烧录工具下载 | 平台 | 官方下载链接 | 替代下载方案(百度网盘) | |-----------|----------------------------------------------------------------------------|---------------------------------------------------------------------------------------| | Linux | ftp://ftp.ingenic.com.cn/DevSupport/Tools/USBBurner/cloner-latest-ubuntu.tar.gz | | | Windows | ftp://ftp.ingenic.com.cn/DevSupport/Tools/USBBurner/cloner-latest-windows.zip | | | Linux & Windows | | [链接](https://pan.baidu.com/s/1LhyN_0TirFWVwAbnMRk9aw) 提取码: svwi| 参考文档 tools 目录下包含必要的开发工具: ``` tools ├── dev-tools │   ├── linux │   └── windows │   ├── adb │   ├── CMake │   └── mingw64 ├── ld.lds └── windows └── Windows开发环境搭建.md ``` ## 开发环境设置 - [windows 开发环境搭建](tools/windows/Windows开发环境搭建.md) - [Linux 开发环境搭建]() # 使用方法 使用示例参考projects/template ## 2.1 Linux 平台开发 ### 2.1.1 基于Makefile编译 ``` $ make ``` 会在build目录生成template.elf, template.bin文件. ### 2.1.2 基于cmake构建 前提:确认cmake 版本 cmake-v3.23.1 ,可以使用最新的cmake版本。 ``` $ mkdir build $ cd build $ cmake -DCMAKE_TOOLCHAIN_FILE=../mips-gcc-sde-elf.cmake .. $ make ``` 会在build目录下生成template.elf,template.bin文件. ### 2.1.3 基于vscode 集成开发环境 前提:确认cmake 版本 cmake-v3.23.1 ,可以使用最新的cmake版本。 注意:不要使用工具链的cmake。否则vscode 会报错。 流程如下: 1. vscode 打开工程 2. 选择cmake kits:cmake-kits "GCC for ingenic cross compile on Linux" 3. lunch(F5) 运行编译、调试 4. 选择状态栏,build, 进行代码编译. ## 2.2 windows 平台开发 windows 开发需要安装相关的软件和系统环境变量配置,参考 Windows开发环境搭建手册 ### 2.2.1 基于vscode集成开发环境 流程如下: 1. vscode 打开创建好的工程文件夹,例如 projects/template 文件夹 2. 选择cmake-kits "GCC for ingenic cross compile on Windows" 3. lunch(F5) 运行编译、调试 4. 或者选择状态栏,build,仅编译. 说明: vscode 可以支持在线调试,也可以仅编译后,使用烧录工具烧到开发板运行 ### 2.2.2 基于命令行编译 前提: 系统必须安装msys - mingw64-make 工具. ``` $ mkdir build $ cd build $ cmake -DCMAKE_TOOLCHAIN_FILE=../mips-gcc-sde-elf.cmake -G "MinGW Makefiles" ../ $ mingw32-make ``` # 3. 程序烧录 ## 烧录配置 打开烧录工具,选择配置界面 ![](./tools/windows/imgs/cloner1.png) ### 3.1 选择烧录配置 以x16xx系列芯片x1600e,halley6开发板为例. ![](./tools/windows/imgs/cloner2.png) 1. 选择芯片平台"x1600" 2. 根据开发板配置选择板级。 开发板板载nand flash,选择"x1600e_sfc_nand_lpddr2_linux.cfg" 开发板板载nor flash,选择"x1600e_sfc_nor_lpddr2_linux.cfg" ### 3.2 选择烧录镜像 运行裸机驱动程序需要烧录uboot和裸机程序 ![](./tools/windows/imgs/cloner3.png) 1. 选择uboot镜像, u-boot-with-spl.bin 注意:uboot镜像需要另外修改和编译,uboot需要将裸机程序引导在0x80600000地址进行启动,所以需要修改其boot command。 以halley6开发板为例,在Manhattan工程的u-boot目录,修改uboot板级配置文件( u-boot/include/configs/halley6.h )中boot command的定义, 根据板载flash类型进行区分: Nor flash: ``` #define CONFIG_BOOTCOMMAND "sfcnor read 0x40000 0x600000 0x80600000;go 0x80600000" ``` Nand flash: ``` #define CONFIG_BOOTCOMMAND "sfcnand read 0x100000 0x800000 0x80600000;go 0x80600000" ``` 修改保存之后,回到u-boot/目录,进行编译,同样根据板载flash类型进行区分: Nor flash: 执行`` make halley6_uImage_sfc_nor -j `` Nand flash: 执行`` make halley6_uImage_sfc_nand -j `` 编译成功之后,就会在该目录下生成u-boot-with-spl.bin镜像。 2. 选择之前编译完成的裸机驱动程序(二进制`*.bin`文件,这里以template.bin为例) 到这里烧录配置完成,点击“保存”按钮,保存配置, 回到初始界面后,点击“开始”按钮,开始烧录. ### 3.3 spl 启动 raw driver 注:目前此启动模式暂时只针对x1600 nor flash panda 板。 该章节中采用的是 spl 启动 raw driver ,3.2 部分采用的是 u-boot 启动。 #### 3.3.1 uboot 编译 spl ​ 打开 ubooot 程序在u-boot 目录下进行执行 ```c make distclean;make panda_rtos_sfc_nor; ``` ​ 在 **u-boot/spl** 目录下生成 **u-boot-spl-pad.bin** ,烧录工具选择该文件位置以及选择之前编译完成的裸机驱动程序(二进制`*.bin`文件,这里以 **template.bin** 为例),此时 spl 所占大小为 256K ​ 烧录具体选择如下 ![image-20230407184809368](tools/windows/imgs/cloner4.png) ![image-20230407190031456](tools/windows/imgs/cloner5.png) #### 3.3.2 减少 spl 所占空间修改 注:与 3.3.1 选择一个即可 第一步:打开 uboot 源码目录输入,对应图片进行修改如下可作为参考最小 32k 大小 ```c vim include/configs/panda.h ``` ![image-20230410114925484](tools/windows/imgs/cloner6.png) 编译执行 ```c make distclean;make panda_rtos_sfc_nor ``` 此时烧录文件为 uboot /spl目录下 **u-boot-spl-pad.bin** 与编译出的**template.bin**文件 烧录工具也需要进行对应的修改,按照以下图片进行修改。 ![image-20230407191433075](tools/windows/imgs/cloner7.png) 需要对 uboot 部分和 kernel部分都修改为与图片一致的数据 ![image-20230407191534290](tools/windows/imgs/cloner8.png) # 3.4 详细参考资料 libbare 是裸机SDK, 对应Linux 的SDK 资料更加全面,其中部分开发流程可以参考Linux的开发资料。 - 烧录工具的详细使用 - uboot 开发和配置 | 芯片平台 | 资料名称 | 链接 | | --------- | -------- | -------- | | X16XX | 文档仓库 | [X16XX开发手册](https://gitee.com/ingenic-dev/ingenic-linux-docs/blob/ingenic-master/zh-cn/X16XX/) | | X26XX | 文档仓库 | [X2600开发手册](https://gitee.com/ingenic-dev/ingenic-linux-docs/tree/ingenic-master/zh-cn/X2500) | # 4. 创建工程 ## 4.1 基于已有工程 可以在project目录下,找到一个合适的工程,复制到新的文件夹,进行以下修改 1. SDK_PATH 修改 ``` 修改工程目录CMakelists.txt 中SDK_PATH 到 libbare-cpu 根目录,可以是相对路径,也可以使用绝对路径. SDK_PATH = ../../ ``` 2. 修改CMakelists.txt 工程名称 例如: ``` Project(my_template) # Modified ``` 3. 添加源文件 根据工程实际情况,添加需要编译的源文件 ``` set(sources_SRCS # Modified ${SDK_PATH}/cpu/core/genex.S ${SDK_PATH}/cpu/core/spinlock.c ${SDK_PATH}/cpu/core/start.S ${SDK_PATH}/cpu/core/traps.c ${SDK_PATH}/cpu/soc-x16xx/interrupt.c ${SDK_PATH}/cpu/soc-x16xx/serial.c ${SDK_PATH}/cpu/soc-x16xx/startup.c ${SDK_PATH}/drivers/drivers-x16xx/src/x16xx_hal_def.c ${SDK_PATH}/lib/libc/minimal/ctype.c ${SDK_PATH}/lib/libc/minimal/div64.c ${SDK_PATH}/lib/libc/minimal/string.c ${SDK_PATH}/lib/libc/minimal/vsprintf.c main.c ) ``` 4. 添加头文件路径 根据实际情况,添加需要包含的路径 ``` include_directories( ${SDK_PATH}/lib/libc/minimal/include ${SDK_PATH}/drivers/drivers-x16xx/include ${SDK_PATH}/cpu/core/include ${SDK_PATH}/cpu/soc-x16xx/include ) ``` 5. 添加库路径 ``` link_directories( ${SDK_PATH}/lib/libc/newlib/lib/ ) ``` 6. 添加链接的库选项 确保要链接的库在link_directories中定义 ``` set(CMAKE_LD_FLAGS "${CPU_PARAMETERS}" -lm -lc -lgcc -lnosys) ``` # 在线调试 ## 5 JDI调试 ### 5.1.准备调试环境 - [JDI 调试环境搭建和使用](tools/jdi_web_control_panel/readme.md) ### 5.2. 调试说明 ![](./tools/windows/imgs/vscode.png) 按下键盘的F5或者Run菜单下的Start Debugging开始调试。等待代码编译并加载完成会出现如图所示界面。图中标注的序号代表不同的工作区域。各个区域含义如下。 ``` 1.表示目前处于debug菜单栏,显示各种调试相关的选项视图。 2.显示调试过程中的变量、数组、寄存器值。这些值会随着调试位置变化而动态变化。另外,鼠标放在结构体上也可以显示 3.调试控制区域。6个按钮从左到右依次是:执行到下一个断点(断点位置需手动添加)、执行到下一行、执行到函数体内、从函数体中执行出去、重新开始调试、结束调试。 4.在该区域可以手动添加断点。 5.函数的调用堆栈 6.添加的断点信息 ``` 注意 ## 6 开发板调试 使用配套的panda开发板通过添加打印的方式进行调试。