003——移植鸿蒙

慈云数据 2024-03-19 技术支持 75 0

目录

一、顶层Make分析

二、添加一个新的单板

2.1 Kconfig

2.2 Makefile

2.2.1 顶层Makefile 

2.2.2 platform下的Makefile

2.2.3 platform下的bsp.mk文件

2.3 编译与调试

2.4 解决链接错误

三、内核启动流程的学习

3.1 韦东山老师总结的启动四步

3.2 启动文件分析

3.3 main函数分析

3.4 OSmain函数分析

3.5 SystemInit函数分析


 

一、顶层Make分析

整体的编译框架和linux内核的一样都是分层的各自编译后由链接器来汇总

# Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved.
# Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
#    conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
#    of conditions and the following disclaimer in the documentation and/or other materials
#    provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
#    to endorse or promote products derived from this software without specific prior written
#    permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
LITEOSTOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
export OS=$(shell uname -s)
ifneq ($(OS), Linux)
LITEOSTOPDIR := $(shell dirname $(subst \,/,$(LITEOSTOPDIR))/./)
endif
LITEOSTHIRDPARTY := $(LITEOSTOPDIR)/../../third_party
export LITEOSTOPDIR
export LITEOSTHIRDPARTY
-include $(LITEOSTOPDIR)/tools/build/config.mk
RM = -rm -rf
MAKE = make
__LIBS = libs
APPS = apps
ROOTFSDIR = rootfsdir
ROOTFS = rootfs
LITEOS_TARGET = liteos
LITEOS_LIBS_TARGET = libs_target
LITEOS_MENUCONFIG_H = $(LITEOSTOPDIR)/include/generated/autoconf.h
LITEOS_PLATFORM_BASE = $(LITEOSTOPDIR)/platform
LITEOS_PLATFORM_MENUCONFIG_H = $(LITEOS_PLATFORM_BASE)/include/menuconfig.h
ifeq ($(LOSCFG_PLATFORM_HI3518EV300), y)
FSTYPE = jffs2
endif
ifeq ($(LOSCFG_PLATFORM_HI3516DV300), y)
FSTYPE = vfat
endif
ifeq ($(LOSCFG_PLATFORM_IMX6ULL), y)
FSTYPE = jffs2
endif
ifeq ($(LOSCFG_PLATFORM_STM32MP157), y)
FSTYPE = jffs2
ROOTFS_SIZE = 0xA00000
endif
ROOTFS_DIR = $(OUT)/rootfs
ROOTFS_ZIP = $(OUT)/rootfs.zip
VERSION =
all: $(OUT) $(BUILD) $(LITEOS_TARGET) $(APPS)
lib: $(OUT) $(BUILD) $(LITEOS_LIBS_TARGET)
help:
        $(HIDE)echo "-------------------------------------------------------"
        $(HIDE)echo "1.====make help:    get help infomation of make"
        $(HIDE)echo "2.====make:         make a debug version based the .config"
        $(HIDE)echo "3.====make debug:   make a debug version based the .config"
        $(HIDE)echo "4.====make release: make a release version for all platform"
        $(HIDE)echo "5.====make release PLATFORM=xxx:  make a release version only for platform xxx"
        $(HIDE)echo "6.====make rootfsdir: make a original rootfs dir"
        $(HIDE)echo "7.====make rootfs FSTYPE=***: make a original rootfs img"
        $(HIDE)echo "8.====make test: make the testsuits_app and put it into the rootfs dir"
        $(HIDE)echo "9.====make test_apps FSTYPE=***: make a rootfs img with the testsuits_app in it"
        $(HIDE)echo "xxx should be one of (hi3516cv300 hi3516ev200 hi3556av100/cortex-a53_aarch32 hi3559av100/cortex-a53_aarch64)"
        $(HIDE)echo "*** should be one of (jffs2)"
        $(HIDE)echo "-------------------------------------------------------"
debug:
        $(HIDE)echo "=============== make a debug version  ==============="
        $(HIDE) $(MAKE) all
release:
ifneq ($(PLATFORM),)
        $(HIDE)echo "=============== make a release version for platform $(PLATFORM) ==============="
        $(HIDE)$(SCRIPTS_PATH)/mklibversion.sh $(PLATFORM)
else
        $(HIDE)echo "================make a release version for all platform ==============="
        $(HIDE)$(SCRIPTS_PATH)/mklibversion.sh
endif
##### make dynload #####
-include $(LITEOS_MK_PATH)/dynload.mk
#-----need move when make version-----#
##### make lib #####
$(__LIBS): $(OUT) $(CXX_INCLUDE)
ifeq ($(LOSCFG_PLATFORM_IMX6ULL),y)
BOARD_INCLUDE_DIR := $(LITEOSTOPDIR)/../../vendor/nxp/imx6ull/board
else ifeq ($(LOSCFG_PLATFORM_STM32MP157), y)
BOARD_INCLUDE_DIR := $(LITEOSTOPDIR)/../../vendor/st/stm32mp157/board
else
BOARD_INCLUDE_DIR := $(LITEOSTOPDIR)/../../vendor/hisi/hi35xx/$(LITEOS_PLATFORM)/config/board
endif
$(OUT): $(LITEOS_MENUCONFIG_H)
        $(HIDE)mkdir -p $(OUT)/lib
        $(HIDE)$(CC) -I$(LITEOS_PLATFORM_BASE)/include -I$(BOARD_INCLUDE_DIR) \
                -E $(LITEOS_PLATFORM_BASE)/board.ld.S \
                -o $(LITEOS_PLATFORM_BASE)/board.ld -P
$(BUILD):
        $(HIDE)mkdir -p $(BUILD)
$(LITEOS_LIBS_TARGET): $(__LIBS)
        $(HIDE)for dir in $(LIB_SUBDIRS); \
                do $(MAKE) -C $$dir all || exit 1; \
        done
        $(HIDE)echo "=============== make lib done  ==============="
##### make menuconfig #####
export CONFIG_=LOSCFG_
MENUCONFIG_PATH = $(LITEOSTOPDIR)/tools/menuconfig
KCONFIG_FILE_PATH = $(LITEOSTOPDIR)/Kconfig
menuconfig:$(MENUCONFIG_PATH)/mconf
        $$(OUT)/$@.objsize
        $(OBJCOPY) -O binary $(OUT)/$@ $(LITEOS_TARGET_DIR)/$@.bin
ifeq ($(LOSCFG_PLATFORM_STM32MP157), y)
        mkimage.stm32 -T stm32image -a 0xC0100000 -e 0xC0100000 -d $(LITEOS_TARGET_DIR)/$@.bin $(LITEOS_TARGET_DIR)/liteos.stm32
        mkimage.stm32 -A arm -O linux -T kernel -C none -a 0xC0100000 -e 0xC0100000 -n liteos-a -d $(LITEOS_TARGET_DIR)/$@.bin $(LITEOS_TARGET_DIR)/liteos_with_uboot_header.bin
endif
        $(OBJDUMP) -t $(OUT)/$@ |sort >$(OUT)/$@.sym.sorted
        $(OBJDUMP) -d $(OUT)/$@ >$(OUT)/$@.asm
#       $(NM) -S --size-sort $(OUT)/$@ >$(OUT)/$@.size
$(APPS): $(LITEOS_TARGET)
        $(HIDE)$(MAKE) -C apps all
prepare:
        $(HIDE)mkdir -p $(OUT)/musl
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
        $(HIDE)cp -f $(LITEOSTOPDIR)/../../prebuilts/lite/sysroot/usr/lib/$(LLVM_TARGET)/a7_softfp_neon-vfpv4/libc.so $(OUT)/musl
        $(HIDE)cp -f $(LITEOS_COMPILER_PATH)/lib/$(LLVM_TARGET)/c++/a7_softfp_neon-vfpv4/libc++.so $(OUT)/musl
else
        $(HIDE)cp -f $(LITEOS_COMPILER_PATH)/target/usr/lib/libc.so $(OUT)/musl
        $(HIDE)cp -f $(LITEOS_COMPILER_PATH)/arm-linux-musleabi/lib/libstdc++.so.6 $(OUT)/musl
        $(HIDE)cp -f $(LITEOS_COMPILER_PATH)/arm-linux-musleabi/lib/libgcc_s.so.1 $(OUT)/musl
        $(STRIP) $(OUT)/musl/*
endif
$(ROOTFSDIR): prepare $(APPS)
        $(HIDE)$(MAKE) clean -C apps
        $(HIDE)$(shell $(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsdir.sh $(OUT)/bin $(OUT)/musl $(ROOTFS_DIR))
ifneq ($(VERSION),)
        $(HIDE)$(shell $(LITEOSTOPDIR)/tools/scripts/make_rootfs/releaseinfo.sh "$(VERSION)" $(ROOTFS_DIR))
endif
$(ROOTFS): $(ROOTFSDIR)
        $(HIDE)$(shell $(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsimg.sh $(ROOTFS_DIR) $(FSTYPE)  ${ROOTFS_SIZE})
        $(HIDE)cd $(ROOTFS_DIR)/.. && zip -r $(ROOTFS_ZIP) $(ROOTFS)
ifneq ($(OUT), $(LITEOS_TARGET_DIR))
        $(HIDE)mv $(ROOTFS_DIR) $(LITEOS_TARGET_DIR)rootfs
endif
clean:
        $(HIDE)for dir in $(LITEOS_SUBDIRS); \
                do $(MAKE) -C $$dir clean|| exit 1; \
        done
        $(HIDE)$(MAKE) -C apps clean
        $(HIDE)$(RM) $(__OBJS) $(LITEOS_TARGET) $(OUT) $(BUILD) $(LITEOS_MENUCONFIG_H) *.bak *~
        $(HIDE)$(RM) $(LITEOS_PLATFORM_MENUCONFIG_H)
        $(HIDE)$(RM) include
        $(HIDE)$(MAKE) cleanrootfs
        $(HIDE)echo "clean $(LITEOS_PLATFORM) finish"
cleanall:
        $(HIDE)$(RM) $(LITEOSTOPDIR)/out
        $(HIDE)find $(LITEOS_PLATFORM_BASE)/ -name board.ld -exec rm -rf {} \;
        $(HIDE)cd sample/sample_osdrv;make clean;cd ../..;
        $(HIDE)echo "clean all"
cleanrootfs:
        $(HIDE)$(RM) $(OUT)/rootfs
        $(HIDE)$(RM) $(OUT)/rootfs.zip
        $(HIDE)$(RM) $(OUT)/rootfs.img
.PHONY: all lib clean cleanall $(LITEOS_TARGET) debug release help

下面是apps目录的make

include ../.config
include ./module.mk
HIDE := @
APPS := app
all: $(APPS)
# Make
$(APPS):
ifneq ($(APP_SUBDIRS), )
        $(HIDE) for dir in $(APP_SUBDIRS); do $(MAKE) -C $$dir ; done
endif
clean:
ifneq ($(APP_SUBDIRS), )
        $(HIDE) for dir in $(APP_SUBDIRS); do $(MAKE) -C $$dir clean; done
endif
.PHONY: all $(APPS) clean
                             

其它的也类似每一层make都有两个配套的mk文件来描述资源

如果这个APP_SUBDIRS不是空的就会遍历每个目录去make

        最底层的make和源码放一起的这些就会去真正的进行编译操作。里面放了对应的编译规则

好处就是整个软件的最终结果被按功能分别编译,我们可以针对性的开启对应功能的编译,都编译后统一链接。 

        其实随着不断学习,感觉理解起来变得越来越容易了,以前觉得大型工程中的makefile是座山,现在充其量就是个小土包。有这种感觉的前提是我自己从0到1做了一次编译框架。然后现在再来看就有这种感觉了。

二、添加一个新的单板

        这个地方要感谢韦东山老师了,因为鸿蒙只适配海思的芯片,别人想移植就得知道全部源码才行。但是为了不泄露机密,核心的代码是不开源的。我们没法直接移植。韦老师接触过这部分做个一个补丁文件可以根据这个文件不断拓展新单板。按老师的话说留下了一个火种。

        既然这样我想试试能不能移植到我的另一块单板exynos4412上。不一定会成功如果耗时过多的话我就放到毕业后再去做。下面记录一下移植过程。

2.1 Kconfig

vi platform/Kconfig

        仿照韦东山老师添加的两个我也添加了一个exynos4412.

        现在其实有个问题,大家看图应该可以看出来,其它是四个都是ARM Cotex-A7的我加的这个是A9的。在鸿蒙的官网上没说是不是支持A9,(不排除我没找到的情况)。在老师的技术交流群里也没有人能回答我,咱们就当他支持先试试好啦。

现在就有这个咯

为什么缺了一块内容

        因为当前Kconfig里只有A7的配置。没办法了或许能改但是要改的地方还是有点多的暂时先不弄了。

再来看看makefile

2.2 Makefile

2.2.1 顶层Makefile 

指定文件系统的类型和大小

然后指定我们取board资源的目录

这里也有修改,但是不清楚改了啥,后面看下源码对比一手

        然后是这里看样子是对bin文件的一些处理这里只有stm32mp157的,老师说我们的可以放到后面做接着往下看。

这里也有改动,看样子是跟文件系统的修改

顶层的makefile就改完了

2.2.2 platform下的Makefile

        这里是一个匹配规则如果这里的某个芯片i型号被选择了就把对应的源码加到编译的对象里

我们来添加一下。

2.2.3 platform下的bsp.mk文件

  1. HWI_TYPE := arm/interrupt/gic

    • HWI_TYPE 可能是指硬件中断(HWI)的类型或使用的硬件中断控制器(GIC)。arm/interrupt/gic 表示使用ARM架构下的GIC(Generic Interrupt Controller)作为中断控制器。
  2. TIMER_TYPE := hisoc/timer

    • TIMER_TYPE 表示定时器的类型或所使用的硬件定时器。hisoc/timer 可能是特定于某种SoC(System on a Chip)的定时器实现。
  3. HRTIMER_TYPE := hisoc/hrtimer

    • HRTIMER_TYPE 可能是高精度定时器的类型或实现。hisoc/hrtimer 可能是特定于某种SoC的高精度定时器。
  4. NET_TYPE := hieth

    • NET_TYPE 表示网络类型的配置或使用的网络接口。hieth 可能是某种特定的网络硬件或驱动
  5. UART_TYPE := amba_pl011

    • UART_TYPE 表示UART(通用异步收发传输器)的类型或使用的硬件。amba_pl011 是ARM公司的一个UART控制器。
  6. USB_TYPE := usb3.0_hi3518ev300

    • USB_TYPE 表示USB的类型或使用的USB控制器。usb3.0_hi3518ev300 可能是特定于HI3518EV300芯片的USB 3.0控制器。
  7. LITEOS_CMACRO_TEST += -DTEST3518EV300

    • 这一行在LITEOS_CMACRO_TEST变量中添加了一个编译宏定义-DTEST3518EV300。这通常用于在编译时定义特定的宏,可能用于条件编译或特定的测试目的。

        串口和USB并没有处理,不知道什么原因往下接着看。

        然后就是这里指定一下平台总线这一层的头文件路径。

2.3 编译与调试

make clean报错找不到脚本 

然后去对应文件找,发现和下面这个变量有关

向上找,发现没设置编译器的路径就会调用这个脚本来获取路径

设置不了

在Kconfig里查找发现没有添加我们的单板类型

现在就有了。使用默认的这个编译器

可以clean成功了

找不到board下的这个头文件

因为我们用的A9不是A7回去先改成A7试试

报错在输出目录找不到inculude的这个头文件

这里应该有很多东西可是我们没有

不对哦,想起来了,我把.config拿来了一份也不对,board我往上翻一下修改

破案了

完蛋还是这个错误

这个文件find不到

等等

../../

我悟了

经过我的一番复制

终于和韦东山老师的一样了。

改回A9报错巨多还是先按A7来吧

上面报错对应shell下的这几个目录

 

ok再次编译只剩链接错误了

2.4 解决链接错误

 找不到这个库

修改一下mk文件的名字

还有里面的名字

:1,$s/IMAX6ULL_BASE_DIR/EXYNOS4412_BASE_DIR

好再来编译一下

他说宏没定义

vi /home/book/program/openharmony/vendor/samsung/exynos4412/driver/mtd/spi_nor/src/common/spinor.c =150

又来一个宏没定义

我是基于6ull改的所以和韦东山老师的不太一样

又来个新的错误

这些其实都是对应mk文件和我们的新的文件路径名匹配错误导致的

解决掉了一个还有两个

drivers/hdf/lite/hdf_lite.mk

vendor/democom/hdf/hdf_vendor.mk

grep一下

还是这个mtd的问题

这里明明定义了但是说没被定义

说明还是makefile的问题,没引过去

这里我取巧一下直接看已修改的driver文件

补完报错没变证明不是因为这个

这个mtd到底是哪里呢

又查了另一个,这俩难兄难弟都在这个头文件里定义的

        回去看了遍视频发现我没把分区mount的操作这里注释掉,也就是说我不用和文件系统相关的操作就暂时不会出那两个错误

ld.lld: error: undefined symbol: GetDevSpinorOps

>>> referenced by ld-temp.o

>>>               lto.tmp:(SystemInit)

ld.lld: error: undefined symbol: GetMtdCharFops

>>> referenced by ld-temp.o

>>>               lto.tmp:(SystemInit)

Makefile:165: recipe for target 'liteos' failed

make: *** [liteos] Error 1

 

这俩是关联的。

暂时没错误了

三、内核启动流程的学习

这里我就完全照搬老师的思想了,后面我更全面的了解后在自己总结一个

3.1 韦东山老师总结的启动四步

内核启动流程可以分为4步骤(非官方):

  • 启动

    • 使用汇编代码编写,涉及非常底层的设置,比如CPU设置、代码重定位等等

    • 地址映射也在这里实现

    • 它最终会调用main函数

  • main函数

    • 以后的代码,基本都是使用C语言编写了

    • 主要工作是:调用OsMain进行各类初始化、最终会启动用户程序

  • OsMain函数

    • 进行操作系统层面的初始化,比如异常初始化、任务初始化、IPC初始化

    • 调用SystemInit

  • SystemInit

    • 偏向于应用程序的初始化

    • 挂载根文件系统

    • 启动第一个用户进程

            所有的软件运行都是和这个类似的其实,上电后就是只能跑一个程序从启动文件开始跳到C的主函数,在ARM的汇编里就是b main。我看过很多很多的代码包括裸机环境的,带RTOS的以及linux的。都是从汇编跳到最初的主函数,然后系统级别的程序来初始化后面的环境变量。裸机环境没有多任务的话就是while1死循环,有多任务的话就是搞个状态机的机制做任务跳转,因为只有一个核心永远都是单线程的。看似多人只不过是切换的快。可能10ns就换一次任务。

            而操作系统环境要做的就比较多了,多核理论上是可以真的多线程的。只是线程由大脑统一调度。光有脑子没有配套的硬件设备也不行啊。就得把内存给大家分一下。不然一人用一会不还是单线程么。有mpu(有的也叫mmu叫什么的都有反正就是管理内存的。cpu不能直接用物理地址,虚拟的地址都由它来分配)的话这时候他就该发挥作用了。偏了。回到我们的主题往下看。

    3.2 启动文件分析

    启动文件藏的比较深

    最前面一定是初始化栈空间和向量表

    /*
     * Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved.
     * Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without modification,
     * are permitted provided that the following conditions are met:
     *
     * 1. Redistributions of source code must retain the above copyright notice, this list of
     *    conditions and the following disclaimer.
     *
     * 2. Redistributions in binary form must reproduce the above copyright notice, this list
     *    of conditions and the following disclaimer in the documentation and/or other materials
     *    provided with the distribution.
     *
     * 3. Neither the name of the copyright holder nor the names of its contributors may be used
     *    to endorse or promote products derived from this software without specific prior written
     *    permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    #define  ASSEMBLY
    #include "arch_config.h"
    #include "los_vm_boot.h"
    #include "los_vm_zone.h"
    #include "los_mmu_descriptor_v6.h"
    #undef ASSEMBLY
        .global __exc_stack_top
        .global __irq_stack_top
        .global __fiq_stack_top
        .global __svc_stack_top
        .global __abt_stack_top
        .global __undef_stack_top
        .global __exc_stack
        .global __irq_stack
        .global __fiq_stack
        .global __svc_stack
        .global __abt_stack
        .global __undef_stack
        .extern __bss_start
        .extern __bss_end
        .extern hal_clock_initialize_start
        .extern los_bss_init
        .extern _osExceptFiqHdl
        .extern _osExceptAddrAbortHdl
        .extern _osExceptDataAbortHdl
        .extern _osExceptPrefetchAbortHdl
        .extern _osExceptSwiHdl
        .extern _osExceptUndefInstrHdl
        .extern __stack_chk_guard_setup
        .extern g_firstPageTable
        .extern g_mmuJumpPageTable
        .equ MPIDR_CPUID_MASK, 0xffU
        .fpu vfpv4
        .arm
    /* param0 is stack bottom, param1 is stack size, r11 hold cpu id */
    .macro EXC_SP_SET param0, param1
        ldr    r1, =\param0
        mov    r0, \param1
        bl     sp_set
    .endm
    /* param0 is stack top, param1 is stack size, param2 is magic num */
    .macro STACK_MAGIC_SET param0, param1, param2
        ldr     r0, =\param0
        mov     r1, \param1
        ldr     r2, =\param2
        bl      excstack_magic
    .endm
    /* param0 is physical address, param1 virtual address, param2 is sizes, param3 is flag */
    .macro PAGE_TABLE_SET param0, param1, param2, param3
        ldr     r6, =\param0
        ldr     r7, =\param1
        ldr     r8, =\param2
        ldr     r10, =\param3
        bl      page_table_build
    .endm
        .code   32
        .section ".vectors","ax"
    __exception_handlers:
        /*
        *Assumption:  ROM code has these vectors at the hardware reset address.
        *A simple jump removes any address-space dependencies [i.e. safer]
        */
        b   reset_vector
        b   _osExceptUndefInstrHdl
        b   _osExceptSwiHdl
        b   _osExceptPrefetchAbortHdl
        b   _osExceptDataAbortHdl
        b   _osExceptAddrAbortHdl
        b   OsIrqHandler
        b   _osExceptFiqHdl
        /* Startup code which will get the machine into supervisor mode */
        .global reset_vector
        .type   reset_vector,function
    reset_vector:
    #if defined(LOSCFG_PLATFORM_STM32MP157)
    	ldr sp, =0xc0000000 + 0x1000000
    	mov r0, #'S'
    	bl uart_putc_phy
    #endif
    #if 1
    	/*
    	 * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,
    	 * except if in HYP mode already
    	 */
    	mrs	r0, cpsr
    	and	r1, r0, #0x1f		@ mask mode bits
    	teq	r1, #0x1a		@ test for HYP mode
    	bicne	r0, r0, #0x1f		@ clear all mode bits
    	orrne	r0, r0, #0x13		@ set SVC mode
    	orr	r0, r0, #0xc0		@ disable FIQ and IRQ
    	msr	cpsr,r0
    	/*
    	 * If I-cache is enabled invalidate it 
    	 */
    	mcr	p15, 0, r0, c7, c5, 0	@ invalidate icache
    	mcr     p15, 0, r0, c7, c10, 4	@ DSB
    	mcr     p15, 0, r0, c7, c5, 4	@ ISB
        /* do some early cpu setup: i/d cache disable, mmu disabled */
    //    mrc     p15, 0, r0, c1, c0, 0
    //    bic     r0, #(1
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon