내가 DAC5000 을 7710 기반의 DACS7000 으로 포팅하면서 알게된 것들을 정리했다.
나중에라도 혹시 이와 비슷한 작업을 하게될 때, 많은 도움이 될 것이라 생각한다.
작업 환경
DAC5000 은 '2005년 7월 16일자 버전'을 기준으로 했다.
7710 관련 소스코드는 '7710HD_v1.0.0 Snap REFERENCE SOFTWARE' 를 사용했다.
전체적인 포팅방향은 같은 이름의 함수나 같은 기능을 하는 루틴의 경우, 7710 코드를 따랐다.
작업 순서
c:\ 아래에 STM 디렉토리를 만들고, 그 안에 ST20R2.1.2 디렉토리를 복사한다.
포팅할 디렉토리 DACS7000 이름으로 디렉토리를 만든다. 이제부터가 중요하다. DACS7000 디렉토리안에는 다음과 같이 구성되어야 한다.
이름 | 근원 | 설명 |
config | 7710ref | 타겟보드 부팅에 필요한 .cfg 파일들 |
include | 7710ref | 헤더 파일들 |
lib | 7710ref | 라이브러리 파일(stapi_stpti4.lib), 7710ref\src 컴파일하면 생성 |
make | DACS5000 | 컴파일시 환경 설정 |
src | DACS5000 | 소스 코드들 |
makefile | DACS5000 | 컴파일시 옵션 지정 |
가장 먼저 makefile 을 수정한다.
여기서 수정해야 할 것은 경로 수정이다. 수정했다면, 이제 본격적으로 컴파일해보자!! 만일 컴파일을 하기전에 에러가 났다면, 분명 그것은 make 디렉토리 문제이다.
make 디렉토리 문제의 경우, 대부분 경로나 세팅이 기존의(DAC5000) 것이라서 그럴 것이다.
울트라에디터를 이용해서, '5000' 이나 '5517' 이나 'mb382' 로 검색한다. 이들을 각각 'DACS7000' 이나 '7710' 이나 'mb391' 로 수정한다. 만일 그래도 make 에서 에러가 난다면,
'sysconf.mak' 과 'toolset.mak' 를 7710ref 로 부터 복사한다.
앞에서 make 파일문제가 해결되었다면, 이제부터 컴파일 에러를 디버깅해야 한다.
가장 흔한 에러가 define 에러이다. 이런 것들은 대개의 경우, 7710ref 소스 코드를 서로 비교하면서, 7710 쪽으로 맞춰주면 된다.
이때 DAC5000 에는 있었는 데, 7710ref 에서는 없었다면, 주석처리해야 한다. 이의 반대 경우라면, 새로이 추가시켜야 한다.
또한 흔한 에러중에 헤더파일(.h)에 대한 것이다. 이것은 거의 대부분, 7020 관련 헤더파일을 include 하거나 할때 발생한다. 또한 H/W 에 의존적인 sti7710.h 나 mb391.h 같은 경우에는 stdevice.h 파일을 include 시키면 된다.
Stmerge 와 Stpti 를 제외하고 포팅한 현재까지 새롭게 DACS7000 에 복사한 헤더 파일들은 다음과 같다.
7710 → DACS7000 | app_data.h |
5517 → DACS7000 | stcfg.h, stintmr.h, stpwm.h, sttsmux.h, eeprom.c(세마포어 루틴 주석처리) |
직접 작업한 결과, 컴파일에러를 잡는 일은 그리 오랜 시간이 걸리지 않았다.
마지막으로 컴파일한 Makefile 을 살펴보자!!
#---------------------------------------------------------------------- APP_NAME := top HEX_NAME := arena #---------------------------------------------------------------------- ARENA_ROOT = C:/STM/DACS7000 ARENA_USER_CONFIG = C:/STM/DACS7000/config #ARENA_CONFIG = $(ARENA_USER_CONFIG) ARENA_INCLUDE = C:/STM/DACS7000/include ROOT = C:/STM/DACS7000/ ARENA_MAKE = $(ROOT)make ARENA_EXPORTS = $(ROOT)lib ARENA_TARGET_PATH = $(ROOT)config/platform ARENA_MAKE_VERSION := 2 SUPPRESS_CLEAN_ALL := 1 ifdef IN_OBJECT_DIR include $(ARENA_MAKE)/generic.mak TARGETS := $(APP_NAME).lku INCLUDE_PATH = $(ROOT)include/arena_inc SRC_DIR = C:/STM/DACS7000/src UI_DIR = $(SRC_DIR)/ui CM_DIR = $(SRC_DIR)/cm COMMON_DIR = $(SRC_DIR)/common AUD_DIR = $(SRC_DIR)/av PSIP_DIR = $(SRC_DIR)/psip NIM_DIR = $(SRC_DIR)/nim FLASH_DIR = $(SRC_DIR)/flash DEVICE_DIR = $(SRC_DIR)/device OAL = $(SRC_DIR)/osal DV = $(SRC_DIR)/dv_ddec2 LIB_DIR = C:/STM/DACS7000/lib TUNER = $(SRC_DIR)/tuner INTERFACE = $(SRC_DIR)/interface # include for loadpfr EX_INCLUDE = C:/stm/5517ref/src/stgfx/src/olf CM_INCLUDE = $(SRC_DIR)cm/include #---------------------------------------------------------------------- # include path for shared objects INCLUDES += -I$(SRC_DIR)/system #INCLUDES += -I$(SRC_DIR)/system/5517 INCLUDES += -I$(ARENA_USER_CONFIG)/chip INCLUDES += -I$(ARENA_USER_CONFIG)/board INCLUDES += -I$(APP_DIR) INCLUDES += -I$(NIM_DIR) INCLUDES += -I$(UI_DIR) INCLUDES += -I$(UI_DIR)/osd INCLUDES += -I$(UI_DIR)/definition INCLUDES += -I$(CM_DIR) INCLUDES += -I$(CM_DIR)/include INCLUDES += -I$(AUD_DIR) INCLUDES += -I$(PSIP_DIR) INCLUDES += -I$(FLASH_DIR) INCLUDES += -I$(DEVICE_DIR) INCLUDES += -I$(TUNER) INCLUDES += -I$(COMMON_DIR) INCLUDES += -I$(COMMON_DIR)/key INCLUDES += -I$(COMMON_DIR)/keydef #INCLUDES += -I$(EX_INCLUDE) INCLUDES += -I$(CM_INCLUDE) INCLUDES += -I$(INTERFACE) #---------------------------------------------------------------------- # set virtual paths to objects (as path from top application ./objs/ST20 subdirectory) vpath %.c %.h $(SRC_DIR)/ui vpath %.c %.h $(SRC_DIR)/system vpath %.c %.h $(SRC_DIR)/system/dvb vpath %.c %.h $(SRC_DIR)/system/5517 vpath %.c %.h $(NIM_DIR) vpath %.c %.h $(UI_DIR) vpath %.c %.h $(UI_DIR)/osd vpath %.c %.h $(UI_DIR)/definition vpath %.c %.h $(CM_DIR) vpath %.c %.h $(SRC_DIR)/av vpath %.c %.h $(PSIP_DIR) vpath %.c %.h $(FLASH_DIR) vpath %.c %.h $(DEVICE_DIR) vpath %.c %.h $(TUNER) vpath %.c %.h $(COMMON_DIR) vpath %.c %.h $(COMMON_DIR)/key vpath %.c %.h $(INTERFACE) vpath %.h $(CM_DIR)/include vpath %.lib $(LIB_DIR) #---------------------------------------------------------------------- # objects to be built ST20_OBJS := main.tco boot.tco pio.tco evt.tco errors.tco avmem.tco \ uart.tco tbx.tco i2c.tco sections.tco cfg.tco pwm.tco layer.tco vmix.tco \ denc.tco vtg.tco initfuncs.tco blit.tco tt_gutil.tco tt_tool.tco debug.tco event.tco dma.tco # app_setup.tco tt_aud.tco tt_layer.tco tt_api.tco tt_blit.tco tt_vmix.tco tt_gutil.tco tt_tsmux.tco stblast.lib clkrv.tco 7020boot.tco 7020ddr.tco \ clk_gen.tco vin.tco # extern object to be built for AUD ST20_OBJS += vid.tco aud.tco clkrv.tco #tsmux.tco # Transport specific selection #ST20_OBJS += $(DVD_TRANSPORT).tco transport.tco # Service specific. ST20_OBJS += service.tco # application objects to be built #ST20_OBJS += callprog.tco ifdef ENABLE_TRACE ST20_OBJS += trace.tco CFLAGS += -DENABLE_TRACE endif # built for UI ST20_OBJS += osd_init.tco uiApi.tco uiUtil.tco vidutils.tco ui_nvm.tco ui_system.tco ui.tco chEdit.tco chInfo.tco graphics.tco unicodeProc.tco clock.tco uiPopup.tco uiChannel.tco # common objects to be built ST20_OBJS += sysInit.tco keyBoard.tco timer.tco # extern object to be built for CM ST20_OBJS += cmInterface.tco cmChange.tco \ cmDBmanage.tco cmNvm.tco cmScan.tco # extern object to be built for Psip ST20_OBJS += psip_api.tco psi_Main.tco psip_table.tco psip_filtersetup.tco psip_signalwait.tco \ parsePAT.tco parsePMT.tco \ parseTVCT.tco parseCVCT.tco parseMGT.tco parseEIT.tco parseETT.tco \ parseSTT.tco parseRRT.tco parseMSS.tco psip_parsing.tco hangulUtil.tco descTest1.tco # extern object to be built for NimDrv ST20_OBJS += nim3125.tco nimST.tco nimInterface.tco nimLib.tco tuner.tco # extern object to be built for FLASH #ST20_OBJS += getertxt.tco flash_main.tco tt_flash.tco # extern object to be built for POD # extern object to be built for DEVICE ST20_OBJS += eprom.tco avControlApi.tco avi.tco tsmuxapi.tco # extern object to be built for Tuner ST20_OBJS += lgtunerDlg.tco # extern object to be built for interface ST20_OBJS += interface.tco interFunc.tco #---------------------------------------------------------------------- # Produce a map file ST20_LKFLAGS = -M $(APP_NAME).map ST20_LKFLAGS = -M $(HEX_NAME).map #---------------------------------------------------------------------- # Debug reporting to UART, console (unset or NONE) or both (DEBUG: printf's to CONSOLE, STTBX_Print to UART) #CFLAGS += -DSTVTG_VSYNC_WITHOUT_VIDEO #CFLAGS += -DTV_ASPECT_RATIO=STGXOBJ_ASPECT_$(DVD_TV_OUTPUT) CFLAGS += -DSTTBX_PRINT -DSTTBX_REPORT ifeq "$(DVD_IO)" "UART" CFLAGS += -DREPORT_TO_UART else ifeq "$(DVD_IO)" "DEBUG" CFLAGS += -DREPORT_TO_UART -DREPORT_TO_CONSOLE else CFLAGS += -DREPORT_TO_CONSOLE DVD_RUNARGS="-log $(APP_NAME).log" endif endif # for simulation #CFLAGS += -DTESTFUN #---------------------------------------------------------------------- # for DEBUG # CFLAGS += -DARENA_DEBUG #---------------------------------------------------------------------- CFLAGS += $(OPTIONAL_CFLAGS) #---------------------------------------------------------------------- # Build targets include $(ARENA_MAKE)/defrules.mak ST20_LIB := stapi_stpti4.lib #make lku file (debugging) $(APP_NAME)_INIT := board_init $(ST20_TARGETS): $(ST20_OBJS) $(ST20_LIB) $(ECHO) Building $@ $(LINK_EXECUTABLE) #make hex file $(HEX_NAME)_INIT := board_init_hex $(HEX_NAME)_LKFLAGS := -romimage -o $(HEX_NAME).hex $(HEX_NAME).hex: initfuncs.tco $(ST20_OBJS) $(ST20_LIB) $(ECHO) Building $@ $(LINK_EXECUTABLE) #---------------------------------------------------------------------- clean: ifeq "$(ARCHITECTURE)" "ST20" -$(RM) *$(OBJ_SUFFIX) -$(RM) *$(LIB_SUFFIX) -$(RM) *$(EXE_SUFFIX) -$(RM) *.dbg -$(RM) *.map -$(RM) *.hex -$(RM) *.bin -$(RM) *.log endif #---------------------------------------------------------------------- else include c:/stm/DACS7000/make/builddir.mak #test with output logged to a file runlog: $(MAKE) run DVD_RUNARGS="-log $(APP_NAME).log" %.hex: check_object_dir $(MAKE_AT_TARGET) endif #EOF ------------------------------------------------------------------
컴파일 에러를 모두 잡았다면, 이제 정말 중요한 실행단계가 남았다.
앞의 작업보다 더 어렵다. 한번에 착~ 하고 돌아가면 좋겠지만, 현실은 그렇게 만만하지 않다. 나의 경우 총 5 ~ 6 번 부팅 및 초기 드라이버 세팅에서 에러가 발생했다.
'avmem.c, clkrv.c, aud.c, vid.c, vtg.c' 등이 그것이다. 거의 대부분의 에러가 초기화시 필요한 구조체의 잘못된 입력값이었다. 그 중 가장 골치 아팠던 것은 vid.c 였다. FDMA 를 초기화 시켜야 제대로 초기화 되었다.