U-Boot客製化部分的跨平臺實現

U-Boot客製化部分的跨平臺實現

架構描述
客製化部分的跨平臺實現的意義:對於使用linux方案的公司而言,在boot的客製化過程中,由於管控鬆懈,需求不穩定。導致客製化部分與原廠(芯片原廠與u-boot)的代碼耦合性較高,也造成了切換新的平臺(尤其是新的廠家)的時候,boot中有不少適配工作,極易漏掉曾經的patch、feature等,且極不方便前期方案評估的時候快速完成demo看效果。在後期也會形成維護多個平臺的uboot,導致維護量繁重。究其原因,主要有二:1,客製化部分與原廠嵌套,混雜。2,底層接口(GPIO、IIC、PWM、ADC、FS等)需要重新適配,每個模塊都是直接調用原廠接口,故都需要更改。以上問題也就造成了新平臺來的時候,代碼搬過去會有大量報錯,也會有嵌套進原廠的部分遺漏。
爲了在boot中降低和原廠的耦合,將不同底層接口區分出來形成platform層,提供一套API給不同模塊使用,再使用統一定義的數據類型,即可以讓客製化部分限制於我們提供的platform層之上。而在原廠中添加我們的客製化流程則通過命令將其抽爲功能命令插入。即在新平臺上,只需要添加客製化的命令插入和底層HAL層的驅動適配即可完成我們客製化功能的在新的boot上的適配。整體如下圖所示
在這裏插入圖片描述即通過上圖所示方案進行對原生代碼和客製化形成Platform API的隔離,在不同的平臺上面通過適配底層驅動來完成跨平臺的實現。而在代碼的插入上,個人比較傾向於將Platform以上以Customer.a 將Platform以下以 CustomerPlatform.a的形式插入到原生代碼中。這樣也方便與原廠聯調的時候給對方我們的環境(只提供.a,不用泄露代碼文件)。
在這裏插入圖片描述
在這裏插入圖片描述
即在客製化部分上可以分爲:功能命令、設備驅動、porting對接層、系統信息層(ENV、INI)
而command、drivers、SysInfo編譯爲libcustomer.a porting編譯爲 libplatform.a
而porting層則是分爲平臺適配層和API接口,平臺適配根據配置文件進行選擇性的編譯。從而實現跨平臺的實現。
customer.a makefile如下:
#####################################################################
##文件名: Makefile
##功能描述:
##Copyright:locke
##函數列表:

##作者:locke
##日期:2019-10-8
##版本歷史:
#####################################################################
include $(TOPDIR)/config.mk
LIB = $(obj)liblocke.a

#AOBJS =

COBJS =

include ./command/Makefile
include ./SysInfo/Makefile
include ./drivers/Makefile
SRCS := $(AOBJS:.o=.S) $(COBJS:.o=.c)
OBJS := $(addprefix (obj),(obj),(AOBJS) $(COBJS))

all: $(LIB)

$(LIB): $(obj).depend $(OBJS)
$(AR) $(ARFLAGS) $@ $(OBJS)

#########################################################################
#defines $(obj).depend target
include $(SRCTREE)/rules.mk
sinclude $(obj).depend
#########################################################################
platform.a的makefile如下
#####################################################################
##文件名: Makefile
##功能描述:
##Copyright:locke
##函數列表:

##作者:locke
##日期:2019-10-9
##版本歷史:
#####################################################################
include $(TOPDIR)/config.mk
LIB = $(obj)libplatform.a

#AOBJS =
COBJS =

#portingApi ###
CFLAGS += -I./portingApi/inc/
CFLAGS += -I./portingApi/src/
CPPFLAGS += -I./portingApi/inc/
CPPFLAGS += -I./portingApi/src/
COBJS += ./portingApi/src/PortingGPIO.o
COBJS += ./portingApi/src/PortingIIC.o
COBJS += ./portingApi/src/PortingSAR.o
COBJS += ./portingApi/src/PortingPWM.o
COBJS += ./portingApi/src/PortingVFS.o
COBJS += ./portingApi/src/PortingCRI.o
COBJS += ./portingApi/src/PortingINI.o

ifeq ((CONFIGORIGINALPLATFORM),"mstar")include./portingmstar.mkelseifeq((CONFIG_ORIGINAL_PLATFORM), "mstar") include ./porting_mstar.mk else ifeq ((CONFIG_ORIGINAL_PLATFORM), “amlogic”)
include ./porting_amlogic.mk
else
include ./porting_mstar.mk
endif

SRCS := $(AOBJS:.o=.S) $(COBJS:.o=.c)
OBJS := $(addprefix (obj),(obj),(AOBJS) $(COBJS))

all: $(LIB)

$(LIB): $(obj).depend $(OBJS)
$(AR) $(ARFLAGS) $@ $(OBJS)

#########################################################################
#defines $(obj).depend target
(warning(warning ***(CFLAGS) $(SRCS)*****locke)
include $(SRCTREE)/rules.mk
sinclude $(obj).depend
#########################################################################

接口層的抽象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章