点击(此处)折叠或打开
-
主要是参考
-
https://gitee.com/liangzili/harmony-raspberry
- 虽然是 harmony 1.0 的版本相关, 但是对于构建 liteos-A的整体架构流程和各个环节上绕坑还是很有参考意义的.
Linux的强大在于它支持的硬件非常多,但是它过于庞大,启动慢、耗电,这些缺点导致它不适合用在物联网领域。比如倒车摄像头,没人能忍受2秒钟后才看见图像:即使你能忍受,也很难把Linux优化到2秒内启动。
Liteos-a为物联网而生,支持MMU,支持内核/APP空间隔离、支持各个APP空间隔离,系统更健壮;支持POSIX接口,大量开源软件可以在Liteos-a上直接使用;启动快,省电。
实现上的差异化
-
参考 https://blog.csdn.net/fzf1996/article/details/116297562
- 了解 liteOS_A 和 linux 的内核架构/实现的文件架构的差别 .
liteOS_A 前期准备.
-
开发机环境
-
ubuntu
-
引导流程
-
iROM -> UBOOT -> liteos.bin (100,000) -> rootfs.jffs2(10,100,000)
-
go 100000 - 10100000
-
-
引导媒介 SD
-
fat32 格式. mkfs.vfat /dev/sdb1
-
内容
-
start4.elf --- raspberry pi 4b 特有
-
config.txt
-
fixup4.dat
-
u-boot.bin
-
bcm2711-rpi-4-b.dtb.
-
- 看到没, 这个部分和 linux部分基本上没有什么差别.
liteOS-A配置部分
-
-
1. 添加新的单板. make menuconfig -> 进入huawei LiteOS configure 界面
-
- 添加 platform kernel\liteos_a\platform\Kconfig
-
新增 RASPi2B (选中 cortex_A7)
-
- 设置编译器. kernel\liteos_a\Kconfig
-
设置为 clang-llvm
-
- 其他
-
Enable kernel SMP
-
Enable libc
-
Enable posix
-
Enable security module
-
Enable VFS
- Enable Driver

点击(此处)折叠或打开
-
-------------------------------------------------
-
修改 makefile
-
-
kernel\liteos_a\Makefile
-
ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B), y)
-
FSTYPE = jffs2 设置根文件系统类型和大小.
-
ROOTFS_SIZE = 0xA00000
-
endif
-
-
##### make lib #####
-
$(__LIBS): $(OUT) $(CXX_INCLUDE)
-
ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B),y)
-
BOARD_INCLUDE_DIR := $(LITEOSTOPDIR)/../../vendor/broadcom/BCM2836/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
-
-
同时在源码目录/vendor下添加broadcom文件目录, 下层目录参考
-
内核/架构/芯片公司/芯片/板卡公司/硬件版本
-
Cortex-A7/Armv7-A/broadcom/BCM2836/Raspberry_Pi/.. (跟着韦东山老师走)
-
------------------------------------------------
-
修改 vendor\broadcom\BCM2836\BCM2836.mk
-
-
设置基目录地址
-
BCM2836_BASE_DIR := $(LITEOSTOPDIR)/../../vendor/broadcom/BCM2836
-
------------------------------------------------
-
kernel\liteos_a\platform\Makefile
-
仿照其他单板添加,43行左右
-
$(LOSCFG_PLATFORM_RASPBERRYPI2B) \
-
ifeq ($(findstring y, $(LOSCFG_PLATFORM_HI3518EV300)$(LOSCFG_PLATFORM_HI3516DV300)$(LOSCFG_PLATFORM_RASPBERRYPI2B)), y)
-
-
------------------------------------------------
-
kernel\liteos_a\platform\bsp.mk
-
-
设置单板的设备类型,比如中断、timer、串口、USB之类的,58行左右
-
-
########################## LOSCFG_PLATFORM_RASPBERRYPI2B Options##############################
-
else ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B), y)
-
HWI_TYPE := arm/interrupt/gic
-
TIMER_TYPE := arm/timer/arm_generic
-
HRTIMER_TYPE := BCM2836/hrtimer
-
#UART_TYPE := amba_pl011
-
-
设置头文件要包含的目录,在90行左右
-
-
ifeq ($(findstring y, $(LOSCFG_PLATFORM_HI3518EV300)$(LOSCFG_PLATFORM_HI3516DV300)), y)
-
PLATFORM_INCLUDE += -I $(LITEOSTOPDIR)/../../vendor/hisi/hi35xx/$(LITEOS_PLATFORM)/config/board/include/hisoc
-
else ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B),y)
-
PLATFORM_INCLUDE += -I $(LITEOSTOPDIR)/../../vendor/broadcom/BCM2836/board/include
-
endif
-
------------------------------------------------
-
drivers\hdf\lite\hdf_lite.mk
-
-
设置HDF的顶层目录,在39行左右,有点没搞懂,为啥不直接使用一个默认的路径
-
-
include $(LITEOSTOPDIR)/../../vendor/huawei/hdf/hdf_vendor.mk
-
替换为:
-
ifeq ($(findstring y, $(LOSCFG_PLATFORM_HI3518EV300)$(LOSCFG_PLATFORM_HI3516DV300)), y)
-
include $(LITEOSTOPDIR)/../../vendor/huawei/hdf/hdf_vendor.mk
-
endif
-
-
ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B), y)
-
include $(LITEOSTOPDIR)/../../vendor/broadcom/hdf/hdf_vendor.mk
-
endif
-
------------------------------------------------
-
vendor\huawei\hdf\hdf_vendor.mk(TODO)
-
-
设置下单板的HDF相关文件路径,18行左右
-
-
else ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B), y)
-
LIB_SUBDIRS += $(LITEOS_SOURCE_ROOT)/vendor/broadcom/BCM2836/config
-
VENDOR_HDF_DRIVERS_PLATFORM_ROOT := $(LITEOSTOPDIR)/../../vendor/broadcom/BCM2836/platform #这个文件夹还没有
-
------------------------------------------------
-
编译
-
-
编译测试的时候可以修改kernel\liteos_a\tools\build\mk\los_config.mk HIDE的值为空,可以显示make的执行命令
-
-
HIDE := #删除@表示显示make的执行命令
-
------------------------------------------------
-
修改下面这4个头文件(TODO)
-
-
kernel/liteos_a/shell/full/src/base/show.c
-
kernel/liteos_a/shell/full/src/base/shcmd.c
-
kernel/liteos_a/shell/full/src/base/shmsg.c
-
kernel/liteos_a/shell/full/src/cmds/dmesg.c
-
#elif defined LOSCFG_PLATFORM_RASPBERRYPI2B
-
#include "uart.h"
-
-
------------------------------------------------
-
tools\build\mk\los_config.mk:170
-
-
LITEOS_BASELIB += -lhi35xx_bsp
-
LIB_SUBDIRS += $(LITEOSTOPDIR)/../../vendor/hisi/hi35xx/$(LITEOS_PLATFORM)/config/board/
-
替换为:
-
ifeq ($(LITEOS_PLATFORM),BCM2836)
-
include $(LITEOSTOPDIR)/../../vendor/broadcom/BCM2836/BCM2836.mk
-
endif
-
ifeq ($(findstring y, $(LOSCFG_PLATFORM_HI3518EV300)$(LOSCFG_PLATFORM_HI3516DV300)), y)
-
LITEOS_BASELIB += -lhi35xx_bsp
-
LIB_SUBDIRS += $(LITEOSTOPDIR)/../../vendor/hisi/hi35xx/$(LITEOS_PLATFORM)/config/board/
-
endif
-
------------------------------------------------
-
kernel\liteos_a\kernel\common\los_config.h
-
-
43行左右,注释此行
-
-
//#include "hisoc/clock.h" //或者直接把这个文件放到hisoc这个文件夹试试
-
#include "clock.h"
- ------------------------------------------------
点击(此处)折叠或打开
-
启动模式
-
树莓派默认启动在HYP模式,我们需要在内核启动前改为SVC模式
-
-
kernel\liteos_a\arch\arm\arm\src\startup\reset_vector_up.S 在115行左右,reset_vector:下面添加
-
-
mrs r0,cpsr //读取CPU模式寄存器
-
bic r0,r0,#0x1F //清除CPU模式位(如果处于催眠模式,它将是1A)保留所有其他
-
orr r0,r0,#0x13 //设置CPU_MODE为SVC_MODE (0x13),而ORR仍然保留所有其他位
-
msr spsr_cxsf,r0 //将其写入spsr_cxsf寄存器,以便在调用交换机时加载该寄存器。
-
add r0,pc,#4 //从pc计算要进入SVC_MODE的地址(后面的两个操作码很长)
-
msr ELR_hyp,r0 //将地址值写入ELR_hyp寄存器
- eret //执行了回车指令
点击(此处)折叠或打开
-
串口打印驱动
- https://gitee.com/liangzili/harmony-raspberry/blob/master/doc/2.3%E3%80%81%E4%B8%B2%E5%8F%A3%E5%88%86%E6%9E%90%E7%A7%BB%E6%A4%8D.md
点击(此处)折叠或打开
-
系统时钟
-
操作系统运行多任务,需要tick中断来切换Task,tick中断由Timer产生,主要文件kernel\liteos_a\platform\hw\arm\timer\arm_generic\arm_generic_timer.c
-
-
Timer的驱动文件在kernel\liteos_a\platform\bsp.mk进行了设置
-
########################## LOSCFG_PLATFORM_RASPBERRYPI2B Options##############################
-
else ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B), y)
-
HWI_TYPE := arm/interrupt/gic
-
TIMER_TYPE := arm/timer/arm_generic
-
HRTIMER_TYPE := BCM2836/hrtimer
-
#UART_TYPE := amba_pl011
-
endif
-
-
-
分析这个文件参考
- https://gitee.com/liangzili/harmony-raspberry/blob/master/doc/2.4%E3%80%81%E7%B3%BB%E7%BB%9F%E6%97%B6%E9%92%9F.md