Hi3861 OpenHarmony嵌入式应用入门--启动流程

目录

BootLoader的启动与运行

[Hi3861 RiSC-V boot 启动文件介绍](#Hi3861 RiSC-V boot 启动文件介绍)

[Loaderboot 启动过程](#Loaderboot 启动过程)

Flashboot代码介绍

printf串口配置

内核启动任务


BootLoader的启动与运行

Hi3861 RiSC-V boot 启动文件介绍

  • Hi3861 的引导程序分为两部分,一部分是在芯片出厂时已经固定在 ROM,这部分的代码主要实现的功能是:芯片上电后,如果没有被打断(没有执行烧录过程)时会检验 flashboot,检验成功后跳转到flashboot 代码处运行;芯片上电后如果被打断(复位操作并执行烧录过程)时,下载 loaderboot,下载完之后校验成功跳转到 loaderboot 运行,汇编代码跳转到 C 代码,再下载其他镜像(burn、boot、signed)并烧录到 flash,结束后,按复位键,芯片启动。

Loaderboot 启动过程

  • Loaderboot 启动过程:路径: ./device/hisilicon/hispark_pegasus/sdk_liteos/boot/loaderboot/startup
  • Loaderboot 跳转到 C 代码:

Flashboot代码介绍

  • Flashboot 的执行逻辑与上述的 loaderboot 执行逻辑一致。路径: ./device/hisilicon/hispark_pegasus/sdk_liteos/boot/Flashboot/startup
  • Flashboot 跳转到 C 代码:

以上就是启动流程,其实就是两个入口,一个是boot入口,一个是正常运行的flash入口。

下面我们讲一下串口的设置。

printf串口配置

在hi_void start_fastboot(hi_void)函数中

uart_param_stru default_uart_param = FLASHBOOT_UART_DEFAULT_PARAM;

定义了串口,宏的代码如下

#define FLASHBOOT_UART_DEFAULT_PARAM    {115200, 8, 1, 0, 0, 0, 2, 1, 4}

数据具体意义需要结构体的定义,如下

typedef struct {
    hi_u32 baudrate;          /* Baud rate */
    hi_uchar databit;         /* 5; 6; 7; 8 */
    hi_uchar stopbit;         /* 1:stop_bit 1;  2: stop_bit 2. */
    hi_uchar parity;          /* 0: None; 1:Odd; 2:Even */
    hi_uchar flow_ctrl;       /* 0: None; 1:rts&&cts. 2:only rts; 3:only cts */
    hi_uchar fifoline_tx_int; /* 0:tx FIFO≤1/8full; 1:tx FIFO≤1/4full; 2:tx FIFO≤1/2full;
                                 3:tx FIFO≤3/4full; 4:tx FIFO≤7/8full */
    hi_uchar fifoline_rx_int; /* 0:rx FIFO≥1/8full; 1:rx FIFO≥1/4full; 2:rx FIFO≥1/2full;
                                 3:rx FIFO≥3/4full; 4:rx FIFO≥7/8full */
    hi_uchar fifoline_rts;    /* 0:rx FIFO≥1/8full; 1:rx FIFO≥1/4full; 2:rx FIFO≥1/2full;
                                 3:rx FIFO≥3/4full; 4:rx FIFO≥7/8full */
    hi_uchar pad;
} uart_param_stru;

用结构体和上面的数据一一对应即可。

调用如下函数进行初始化,串口0

    /* Initializing the Debugging Serial Port */
    ret = serial_init(UART0, default_uart_param);

内核启动任务

在上面我们讲过在start_fastboot函数中进入应用程序,在start_fastboot函数中会调用execute_upg_boot继续进行引导,再调用boot_head继续进行,函数里调用boot_get_start_addr_offset函数获取启动地址的偏移量,获取偏移量后调用boot_kernel函数启动任务。

hi_void start_fastboot(hi_void)
└─hi_void execute_upg_boot(hi_void)
  └─hi_void boot_head(hi_void)
    ├─hi_void boot_get_start_addr_offset(hi_u32 addr, hi_u32 *offset)
    └─hi_void boot_kernel(uintptr_t kaddr)

在boot_kernel函数中,使用之前取到的任务地址进行任务函数启动

hi_void boot_kernel(uintptr_t kaddr)
{
    __asm__ __volatile__("ecall");  /* switch U-MODE -> M-MODE */
    hi_void (*entry)(hi_void) = (hi_void*)(kaddr);
    entry();
}
相关推荐
Qingniu018 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
深圳市青牛科技实业有限公司10 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比11 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie11 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
极客小张15 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
Industio_触觉智能15 小时前
OpenHarmony4.1蓝牙芯片如何适配?触觉智能RK3568主板SBC3568演示
openharmony·rk3568·开源鸿蒙·鸿蒙开发板·触觉智能
m0_7393128717 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章18 小时前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频
TeYiToKu18 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
基极向上的三极管19 小时前
【AD】3-4 在原理图中放置元件
嵌入式硬件