记录移植步骤
Author : yhuan
Data : 2021-6-27
修改记录-1:
Author : yhuan
Data : 2021-7-3
支持了独立看门狗驱动,部分编译配置需要进行修改
硬件: 正点原子STM32MP157开发板
软件: ohos 1.1.0 LTS
相关变量
PLATFORM_STM32MP157
PLATFORM = stm32mp157
PRODUCT_NAME = yhuan_stm32mp157_liteos
DEVICE_COMPANY = st
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
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
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
kernel/liteos_a/platform/Makefile
(约46行)
MAIN_PLATFORMS := $(LOSCFG_PLATFORM_HI3518EV300) \
$(LOSCFG_PLATFORM_HI3516DV300) \
$(LOSCFG_PLATFORM_QEMU_ARM_VIRT_CA7) \
$(LOSCFG_PLATFORM_STM32MP157)
将本仓库放置到 $(ohos_root)/device 下
驱动部分代码会在 drivers/adapter/khdf/liteos/hdf_lite.mk 中引入
include $(LITEOSTOPDIR)/../../device/$(COMPANY_OF_SOC)/drivers/lite.mk
板级代码在配置中引入,详见后续
在 liteos_a 的根目录下输入指令
make menuconfig
Compiler:
Platform:
注意:板级代码在 BOARD CONFIG PATH 字段中配置
修改记录-1:此处HR TIMER ENABLE需要去掉
修改记录-2: BOARD CONFIG PATH 字段需要按照实际情况调整
Kernel:
暂时选中单核
FileSystem:
Driver:
修改记录-1
Debug:
Debug->Functionality of Shell:
单核启动脚本
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
单核启动脚本
映射 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
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
使用以下命令安装编译工具
sudo apt-get install mtd-utils
使用 Ctrl+Backspace组合进行删除
结束
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。