1 Star 6 Fork 2

yhuan416 / st

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
移植日志.md 9.81 KB
一键复制 编辑 原始数据 按行查看 历史
yhuan416 提交于 2021-07-03 23:41 . doc

移植日志

记录移植步骤
Author : yhuan
Data : 2021-6-27

修改记录-1:
Author : yhuan
Data : 2021-7-3
支持了独立看门狗驱动,部分编译配置需要进行修改


硬件: 正点原子STM32MP157开发板

软件: ohos 1.1.0 LTS

liteos_a 添加单板编译

相关变量

PLATFORM_STM32MP157

PLATFORM = stm32mp157
PRODUCT_NAME = yhuan_stm32mp157_liteos
DEVICE_COMPANY = st

  1. 修改编译配置,添加PLATFORM_STM32MP157

kernel/liteos_a/Kconfig

config COMPILER_HIMIX_32
    bool "arm-linux-ohoseabi"
    depends on PLATFORM_HI3518EV300 || PLATFORM_HI3516DV300 || PLATFORM_QEMU_ARM_VIRT_CA7 || PLATFORM_STM32MP157

config COMPILER_CLANG_LLVM
    bool "clang-llvm"
    depends on PLATFORM_HI3518EV300 || PLATFORM_HI3516DV300 || PLATFORM_QEMU_ARM_VIRT_CA7 || PLATFORM_STM32MP157
  1. 修改平台配置

kernel/liteos_a/platform/Kconfig

添加平台

config PLATFORM
    string
    ...
    default "stm32mp157"      if PLATFORM_STM32MP157

添加产品名

config PRODUCT_NAME
    string "unknown"
    ...
    default "stm32mp157_liteos"       if PRODUCT_STM32MP157_LITEOS

添加公司名

config DEVICE_COMPANY
    string "unknown"
    ...
    default "st"        if PLATFORM_STM32MP157

添加编译选项

choice
    prompt "Chip"
    default PLATFORM_HI3516DV300
    help
      IPC has several chips:
      hi3516dv300
      hi3518ev300
      stm32mp157
      Qemu ARM Virt variants (based on different CPU types):
      qemu_arm_virt_ca7

...

config PLATFORM_STM32MP157
    bool "stm32mp157"
    select ARCH_CORTEX_A7

endchoice

choice
    prompt "Porduct"
    help
      Select your target board.

...

config PRODUCT_STM32MP157_LITEOS
    bool "stm32mp157_liteos" if PLATFORM_STM32MP157

endchoice
  1. 修改bsp编译参数

kernel/liteos_a/platform/bsp.mk


############################# HI3516DV300 Options#################################
ifeq ($(LOSCFG_PLATFORM_HI3516DV300), y)
    HWI_TYPE     := arm/interrupt/gic
    TIMER_TYPE   := arm/timer/arm_generic
    HRTIMER_TYPE := hisoc/hrtimer
    NET_TYPE     := hieth
    UART_TYPE    := amba_pl011
    USB_TYPE     := usb3.0_hi3516dv300
    LITEOS_CMACRO_TEST += -DTEST3516DV300

...

(约65行)
# yhuan@2021-6-24
else ifeq ($(LOSCFG_PLATFORM_STM32MP157), y)
    HWI_TYPE     := arm/interrupt/gic
    TIMER_TYPE   := arm/timer/arm_generic

endif
  1. 修改bsp的Makefile

kernel/liteos_a/platform/Makefile

(约46行)
MAIN_PLATFORMS := $(LOSCFG_PLATFORM_HI3518EV300) \
                  $(LOSCFG_PLATFORM_HI3516DV300) \
                  $(LOSCFG_PLATFORM_QEMU_ARM_VIRT_CA7) \
                  $(LOSCFG_PLATFORM_STM32MP157)

liteos_a 添加平台驱动以及板级配置

将本仓库放置到 $(ohos_root)/device 下

驱动部分代码会在 drivers/adapter/khdf/liteos/hdf_lite.mk 中引入

include $(LITEOSTOPDIR)/../../device/$(COMPANY_OF_SOC)/drivers/lite.mk

板级代码在配置中引入,详见后续

liteos_a 编译配置

在 liteos_a 的根目录下输入指令

make menuconfig

Compiler:
编译配置-Compiler

Platform:
编译配置-Platform

注意:板级代码在 BOARD CONFIG PATH 字段中配置

修改记录-1:此处HR TIMER ENABLE需要去掉
修改记录-2: BOARD CONFIG PATH 字段需要按照实际情况调整

Kernel:
编译配置-Kernel

暂时选中单核

FileSystem:
编译配置-FileSystem

Driver:
编译配置-Driver

修改记录-1
Debug:
编译配置-Debug

Debug->Functionality of Shell:
编译配置-Debug-1

liteos_a 修改启动脚本

单核启动脚本

kernel/liteos_a/arch/arm/arm/src/startup/reset_vector_up.S

注释掉 TEE 相关

#if !defined(LOSCFG_PLATFORM_STM32MP157)
    /* enable fpu+neon */
#ifndef LOSCFG_TEE_ENABLE
    MRC    p15, 0, r0, c1, c1, 2
    ORR    r0, r0, #0xC00
    BIC    r0, r0, #0xC000
    MCR    p15, 0, r0, c1, c1, 2

    LDR    r0, =(0xF << 20)
    MCR    p15, 0, r0, c1, c0, 2
    ISB
#endif
#endif

(约295行)
#if !defined(LOSCFG_PLATFORM_STM32MP157)
    /* enable fpu+neon */
    MRC    p15, 0, r0, c1, c1, 2
    ORR    r0, r0, #0xC00
    BIC    r0, r0, #0xC000
    MCR    p15, 0, r0, c1, c1, 2

    LDR    r0, =(0xF << 20)
    MCR    p15, 0, r0, c1, c0, 2
#endif

liteos_a 修改MMU映射相关

单核启动脚本
映射 RAMFS以及GIC

kernel/liteos_a/arch/arm/arm/src/startup/reset_vector_up.S


    PAGE_TABLE_SET SYS_MEM_BASE, KERNEL_VMM_BASE, KERNEL_VMM_SIZE, MMU_DESCRIPTOR_KERNEL_L1_PTE_FLAGS
    PAGE_TABLE_SET SYS_MEM_BASE, UNCACHED_VMM_BASE, UNCACHED_VMM_SIZE, MMU_INITIAL_MAP_NORMAL_NOCACHE
    
#if defined(LOSCFG_PLATFORM_STM32MP157)
    PAGE_TABLE_SET DDR_RAMFS_ADDR, DDR_RAMFS_VBASE, DDR_RAMFS_SIZE, MMU_INITIAL_MAP_DEVICE
#endif

    PAGE_TABLE_SET PERIPH_PMM_BASE, PERIPH_DEVICE_BASE, PERIPH_DEVICE_SIZE, MMU_INITIAL_MAP_DEVICE
    PAGE_TABLE_SET PERIPH_PMM_BASE, PERIPH_CACHED_BASE, PERIPH_CACHED_SIZE, MMU_DESCRIPTOR_KERNEL_L1_PTE_FLAGS
    PAGE_TABLE_SET PERIPH_PMM_BASE, PERIPH_UNCACHED_BASE, PERIPH_UNCACHED_SIZE, MMU_INITIAL_MAP_STRONGLY_ORDERED

#if defined(LOSCFG_PLATFORM_STM32MP157)
    PAGE_TABLE_SET GIC_PHY_BASE, GIC_VIRT_BASE, GIC_VIRT_SIZE, MMU_INITIAL_MAP_DEVICE
#endif

虚拟内存相关配置 配置好ramfs以及gic的虚拟空间

kernel/liteos_a/kernel/base/include/los_vm_zone.h

(约64行)
/* Uncached vmm aspace */
#if defined LOSCFG_PLATFORM_STM32MP157

#define DDR_RAMFS_VBASE         (KERNEL_VMM_BASE + KERNEL_VMM_SIZE)
#define UNCACHED_VMM_BASE       (DDR_RAMFS_VBASE + DDR_RAMFS_SIZE)

#else

#define UNCACHED_VMM_BASE       (KERNEL_VMM_BASE + KERNEL_VMM_SIZE)

#endif
#define UNCACHED_VMM_SIZE       DDR_MEM_SIZE

(约87行)
#define GIC_VIRT_BASE           (PERIPH_UNCACHED_BASE + PERIPH_UNCACHED_SIZE)
#define GIC_VIRT_SIZE           U32_C(GIC_PHY_SIZE)

(约100行)
// #if (PERIPH_UNCACHED_BASE >= (0xFFFFFFFFU - PERIPH_UNCACHED_SIZE))
#if (GIC_VIRT_BASE >= (0xFFFFFFFFU - GIC_VIRT_SIZE))
#error "Kernel virtual memory space has overflowed!"
#endif

修改Makefile

kernel/liteos_a/Makefile

如果没有工具,可以把本仓库 doc/tools 中的工具放入环境


$(LITEOS_TARGET): $(__LIBS)
	$(HIDE)touch $(LOSCFG_ENTRY_SRC)

	$(HIDE)for dir in $(LITEOS_SUBDIRS); \
	do $(MAKE) -C $$dir all || exit 1; \
	done

	$(LD) $(LITEOS_LDFLAGS) $(LITEOS_TABLES_LDFLAGS) $(LITEOS_DYNLDFLAGS) -Map=$(OUT)/$@.map -o $(OUT)/$@ --start-group $(LITEOS_LIBDEP) --end-group
#	$(SIZE) -t --common $(OUT)/lib/*.a >$(OUT)/$@.objsize
	$(OBJCOPY) -O binary $(OUT)/$@ $(LITEOS_TARGET_DIR)/$@.bin

# 编译生成bin文件之后还需要进行处理
# liteos_with_uboot_header.bin 可以用uboot启动
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

(约194)
$(ROOTFS): $(ROOTFSDIR)

# 如果是 mp157 指定根文件系统的大小
ifeq ($(LOSCFG_PLATFORM_STM32MP157), y)
	$(HIDE)$(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsimg.sh $(ROOTFS_DIR) $(FSTYPE) 0xA00000
	$(HIDE)cd $(ROOTFS_DIR)/.. && zip -r $(ROOTFS_ZIP) $(ROOTFS)
else
	$(HIDE)$(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsimg.sh $(ROOTFS_DIR) $(FSTYPE)
endif

...

修改根文件系统打包脚本

kernel/liteos_a/tools/scripts/make_rootfs/rootfsimg.sh


(约36行 添加)
ROOTFS_SIZE=$3

(约62行 修改)
if [ "${FSTYPE}" = "jffs2" ]; then
    if [ "${system}" != "Linux" ] ; then
        tool_check ${WIN_JFFS2_TOOL}
        ${WIN_JFFS2_TOOL} -q -o ${ROOTFS_IMG} -d ${ROOTFS_DIR} --pagesize=4096
    else
        tool_check ${JFFS2_TOOL}
		
		# 修改制作脚本
        # ${JFFS2_TOOL} -q -o ${ROOTFS_IMG} -d ${ROOTFS_DIR} --pagesize=4096
        echo ${JFFS2_TOOL} -q -o ${ROOTFS_IMG} -d ${ROOTFS_DIR} --pagesize=4096 --pad=${ROOTFS_SIZE}
        ${JFFS2_TOOL} -q -o ${ROOTFS_IMG} -d ${ROOTFS_DIR} --pagesize=4096 --pad=${ROOTFS_SIZE}
	    cp ${ROOTFS_IMG} ${ROOTFS_DIR}".jffs2"
	    cp ${ROOTFS_IMG} ${ROOTFS_DIR}".jffs2.bin"
    fi

...

编译指令

在 liteos_a 的根目录下

make menuconfig;make clean;make rootfs FSTYPE=jffs2

编译生成的固件放在 kernel/liteos_a/out/stm32mp157 中
固件

我们需要的文件是
liteos_with_uboot_header.bin
rootfs.jffs2.bin

启动单板

进入uboot

配置ip

setenv serverip 192.168.1.109;setenv ethaddr 32:34:46:78:9A:DC;setenv ipaddr 192.168.1.230

下载kernel

mw.b 0xc0100000 0xff 0xDC000;tftpboot 0xc0100000 liteos_with_uboot_header.bin

下载rootfs

mw.b 0xD0000000 0xff 0xA00000;tftpboot 0xD0000000 rootfs.jffs2.bin

启动

bootm 0xc0100000

启动后进入终端

终端

其他问题

  • mkfs.jffs2: 未找到命令 mkfs.jffs2
使用以下命令安装编译工具  
sudo apt-get install mtd-utils
  • make menuconfig 配置 不能使用退格键删除输入内容

使用 Ctrl+Backspace组合进行删除


结束

1
https://gitee.com/yhuan416/st.git
git@gitee.com:yhuan416/st.git
yhuan416
st
st
master

搜索帮助