1 #****************************************************************************
3 # Copyright (c) 2001, 2002, 2003, 2004 Broadcom Corporation
5 # No portions of this material may be reproduced in any form without the
6 # written permission of:
8 # 16251 Laguna Canyon Road
9 # Irvine, California 92618
10 # All information contained in this document is Broadcom Corporation
11 # company private, proprietary, and trade secret.
13 #****************************************************************************
15 # Top-level Makefile for all commengine xDSL platforms
19 BRCM_RELEASETAG=$(BRCM_VERSION).$(BRCM_RELEASE)L.$(BRCM_EXTRAVERSION)
22 ###########################################
24 # Define Basic Variables
26 ###########################################
27 BUILD_DIR = $(shell pwd)
29 ifeq ($(strip $(KERNEL_VER)),2.6)
30 INC_KERNEL_BASE = $(BUILD_DIR)/kernel
31 ORIGINAL_KERNEL = linuxmips.tar.bz2
33 KERNEL_DIR = $(INC_KERNEL_BASE)/linux
34 BRCMDRIVERS_DIR = $(BUILD_DIR)/bcmdrivers
35 USERAPPS_DIR = $(BUILD_DIR)/userapps
36 LINUXDIR = $(INC_KERNEL_BASE)/linux
37 HOSTTOOLS_DIR = $(BUILD_DIR)/hostTools
38 IMAGES_DIR = $(BUILD_DIR)/images
39 TARGETS_DIR = $(BUILD_DIR)/targets
40 DEFAULTCFG_DIR = $(TARGETS_DIR)/defaultcfg
41 XCHANGE_DIR = $(BUILD_DIR)/xChange
42 FSSRC_DIR = $(TARGETS_DIR)/fs.src
43 CFE_FILE = $(TARGETS_DIR)/cfe/cfe$(BRCM_CHIP).bin
44 CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
45 else if [ -x /bin/bash ]; then echo /bin/bash; \
46 else echo sh; fi ; fi)
47 GENDEFCONFIG_CMD = $(HOSTTOOLS_DIR)/scripts/gendefconfig
53 ###########################################
55 # Import Build Profiles
57 ###########################################
59 LAST_PROFILE=$(shell find targets -name vmlinux | sed -e "s?targets/??" -e "s?/.*??" -e "q")
60 ifeq ($(strip $(PROFILE)),)
61 PROFILE=$(LAST_PROFILE)
64 ifneq ($(strip $(PROFILE)),)
65 include $(TARGETS_DIR)/$(PROFILE)/$(PROFILE)
67 export BRCM_FLASHPSI_SIZE
68 export BRCM_DRIVER_WIRELESS_PCMCIA_DATASWAP BRCM_DRIVER_WIRELESS_EBI_DMA
69 export BRCM_DRIVER_USB BRCM_DRIVER_ETHERNET_CONFIG
70 export BRCM_DEFAULTCFG
71 export BRCM_KERNEL_NF_FIREWALL BRCM_KERNEL_NF_MANGLE BRCM_KERNEL_NF_NAT
74 ###########################################
78 ###########################################
79 ifeq ($(strip $(BRCM_UCLIBC)),y)
81 ifeq ($(strip $(NTC)),1)
82 TOOLCHAIN=/opt/toolchains/uclibc-crosstools_gcc-3.4.2_uclibc-20050428
83 CROSS_COMPILE = $(TOOLCHAIN)/bin/mips-linux-uclibc-
85 TOOLCHAIN=/opt/toolchains/uclibc
86 CROSS_COMPILE = $(TOOLCHAIN)/bin/mips-uclibc-
89 TOOLCHAIN=/usr/crossdev/mips
90 CROSS_COMPILE = $(TOOLCHAIN)/bin/mips-linux-
95 AR = $(CROSS_COMPILE)ar
96 AS = $(CROSS_COMPILE)as
97 LD = $(CROSS_COMPILE)ld
98 CC = $(CROSS_COMPILE)gcc
99 CXX = $(CROSS_COMPILE)g++
100 CPP = $(CROSS_COMPILE)cpp
101 NM = $(CROSS_COMPILE)nm
102 STRIP = $(CROSS_COMPILE)strip
103 SSTRIP = $(CROSS_COMPILE)sstrip
104 OBJCOPY = $(CROSS_COMPILE)objcopy
105 OBJDUMP = $(CROSS_COMPILE)objdump
106 RANLIB = $(CROSS_COMPILE)ranlib
108 LIB_PATH = $(TOOLCHAIN)/mips-linux/lib
109 LIBDIR = $(TOOLCHAIN)/mips-linux/lib
110 LIBCDIR = $(TOOLCHAIN)/mips-linux
112 ###########################################
114 # Application-specific settings
116 ###########################################
117 INSTALL_DIR = $(TARGETS_DIR)/fs.src
118 TARGET_FS = $(TARGETS_DIR)/$(PROFILE)/fs
119 PROFILE_DIR = $(TARGETS_DIR)/$(PROFILE)
120 PROFILE_PATH = $(TARGETS_DIR)/$(PROFILE)/$(PROFILE)
122 FS_KERNEL_IMAGE_NAME = $(VENDOR_NAME)$(PROFILE)_fs_kernel
123 CFE_FS_KERNEL_IMAGE_NAME = $(VENDOR_NAME)$(PROFILE)_cfe_fs_kernel
124 FLASH_IMAGE_NAME = $(VENDOR_NAME)$(PROFILE)_flash_image_$(BRCM_BOARD_ID)
125 INC_BRCMDRIVER_PUB_PATH=$(BRCMDRIVERS_DIR)/opensource/include
126 INC_BRCMDRIVER_PRIV_PATH=$(BRCMDRIVERS_DIR)/broadcom/include
127 INC_BRCMBOARDPARMS_PATH=$(TARGETS_DIR)/boardparms
128 INC_ENDPOINT_PATH=$(BRCMDRIVERS_DIR)/broadcom/char/endpoint/bcm9$(BRCM_CHIP)/inc
129 #INC_ADSLDRV_PATH=$(BRCMDRIVERS_DIR)/broadcom/char/adsl/bcm9$(BRCM_CHIP)
130 INC_ADSLDRV_PATH=$(BRCMDRIVERS_DIR)/broadcom/char/adsl/impl1
131 BROADCOM_CFM_DIR=$(BROADCOM_DIR)/cfm
132 INC_BRCMCFM_PATH=$(BROADCOM_CFM_DIR)/inc
135 ifeq ($(strip $(BRCM_APP_PHONE)),sip)
139 BRCM_RELEASETAG := $(BRCM_RELEASETAG).sip
142 ifeq ($(strip $(BRCM_APP_PHONE)),mgcp)
146 BRCM_RELEASETAG := $(BRCM_RELEASETAG).mgcp
149 ifeq ($(strip $(BRCM_PROFILER_ENABLED)),y)
150 export BRCM_PROFILER_TOOL=1
152 export BRCM_PROFILER_TOOL=0
155 ifneq ($(strip $(BUILD_VODSL)),)
159 ifeq ($(strip $(BRCM_VODSL_STUNC)),y)
160 export BRCM_VODSL_STUN_CLIENT=1
163 ifeq ($(strip $(BRCM_VODSL_CONFIG_MANAGER)),y)
164 export BRCM_VODSL_CFGMGR=1
168 BRCM_DSP_HAL_EXTENSION :=
169 XCHANGE_DSP_APP_EXTENSION :=
170 export XCHANGE_DSP_APP=$(BRCM_DSP_CODEC)
172 ifeq ($(strip $(BRCM_DSP_PCM)),y)
173 XCHANGE_DSP_APP := dspApp3341_tdm
174 BRCM_DSP_HAL_EXTENSION := _pcm
177 ifeq ($(strip $(BRCM_DSP_HYBRID)),y)
178 XCHANGE_DSP_APP := dspApp3341_hybrid
179 BRCM_DSP_HAL_EXTENSION := _hybrid
182 ifeq ($(strip $(BRCM_DSP_HYBRID_EXT)),y)
183 BRCM_DSP_HAL_EXTENSION := _hybrid
184 XCHANGE_DSP_APP := dspApp3341_hybrid
185 XCHANGE_DSP_APP_EXTENSION := _ext
188 # APM application with FXO uses the hybrid HAL, as the FXO is provided by TDM port
189 ifeq ($(strip $(BRCM_DSP_APM_FXO)),y)
190 XCHANGE_DSP_APP := dspApp3341
191 BRCM_DSP_HAL_EXTENSION := _hybrid
192 XCHANGE_DSP_APP_EXTENSION := _fxo
195 ifeq ($(strip $(BRCM_DSP_APM_FXO_EXT)),y)
196 XCHANGE_DSP_APP := dspApp3341
197 BRCM_DSP_HAL_EXTENSION := _hybrid
198 XCHANGE_DSP_APP_EXTENSION := _fxo_ext
201 ifeq ($(strip $(BRCM_DSP_HYBRID_FXO)),y)
202 XCHANGE_DSP_APP := dspApp3341_hybrid
203 BRCM_DSP_HAL_EXTENSION := _hybrid
204 XCHANGE_DSP_APP_EXTENSION := _fxo
207 ifeq ($(strip $(BRCM_DSP_HYBRID_FXO_EXT)),y)
208 XCHANGE_DSP_APP := dspApp3341_hybrid
209 BRCM_DSP_HAL_EXTENSION := _fxo
210 XCHANGE_DSP_APP_EXTENSION := _fxo_ext
214 # Warning here, we do re-assign some of the variables defined earlier:
215 # BRCM_DSP_HAL and BRCM_DSP_HAL_EXTENSION for example, in order to pickup
216 # the correct board HAL application.
218 ifeq ($(strip $(BRCM_DSP_FXO)),y)
219 ifeq ($(strip $(BRCM_SLIC_LE9502)),y)
220 export XCHANGE_BUILD_APP=Bcm$(BRCM_CHIP)_Le9502FXO
221 BRCM_RELEASETAG := $(BRCM_RELEASETAG)._LE9502
222 BRCM_DSP_HAL := _Le9502FXO
223 BRCM_DSP_HAL_EXTENSION :=
224 export BRCM_SLIC_LE9502
226 ifeq ($(strip $(BRCM_SLIC_LE9500)),y)
227 export XCHANGE_BUILD_APP=Bcm$(BRCM_CHIP)_Le9500FXO
228 BRCM_RELEASETAG := $(BRCM_RELEASETAG)._LE9500
229 BRCM_DSP_HAL := _Le9500FXO
230 BRCM_DSP_HAL_EXTENSION :=
231 export BRCM_SLIC_LE9500
238 # DSP codec flags definition. To be used throughout the application (for configuration and vodsl)
241 BRCM_DSP_CODEC_DEFINES := -DXCFG_G711_SUPPORT=1
243 ifeq ($(strip $(BRCM_DSP_CODEC_G723)),y)
244 BRCM_DSP_CODEC_DEFINES += -DXCFG_G7231_SUPPORT=1
247 ifeq ($(strip $(BRCM_DSP_CODEC_G726)),y)
248 BRCM_DSP_CODEC_DEFINES += -DXCFG_G726_SUPPORT=1
251 ifeq ($(strip $(BRCM_DSP_CODEC_G729)),y)
252 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
255 ifeq ($(strip $(BRCM_DSP_CODEC_G7xx)),y)
256 BRCM_DSP_CODEC_DEFINES += -DXCFG_G7231_SUPPORT=1
257 BRCM_DSP_CODEC_DEFINES += -DXCFG_G726_SUPPORT=1
258 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
261 ifeq ($(strip $(BRCM_DSP_PCM)),y)
262 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
265 ifeq ($(strip $(BRCM_DSP_HYBRID)),y)
266 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
269 ifeq ($(strip $(BRCM_DSP_HYBRID_EXT)),y)
270 BRCM_DSP_CODEC_DEFINES += -DXCFG_G7231_SUPPORT=1
271 BRCM_DSP_CODEC_DEFINES += -DXCFG_G726_SUPPORT=1
272 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
275 ifeq ($(strip $(BRCM_DSP_HYBRID_FXO_EXT)),y)
276 BRCM_DSP_CODEC_DEFINES += -DXCFG_G7231_SUPPORT=1
277 BRCM_DSP_CODEC_DEFINES += -DXCFG_G726_SUPPORT=1
278 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
281 ifeq ($(strip $(BRCM_DSP_IOM2_APM)),y)
282 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
283 BRCM_DSP_CODEC_DEFINES += -DXCFG_G7231_SUPPORT=1
284 BRCM_DSP_CODEC_DEFINES += -DXCFG_G726_SUPPORT=1
285 BRCM_DSP_CODEC_DEFINES += -DXCFG_HYBRID_LOAD=1
288 ifeq ($(strip $(BRCM_DSP_IOM2)),y)
289 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
290 BRCM_DSP_CODEC_DEFINES += -DXCFG_G7231_SUPPORT=1
291 BRCM_DSP_CODEC_DEFINES += -DXCFG_G726_SUPPORT=1
294 ifeq ($(strip $(BRCM_DSP_CODEC_T38_EXT)),y)
295 BRCM_DSP_CODEC_DEFINES += -DXCFG_G726_SUPPORT=1
296 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
297 BRCM_DSP_CODEC_DEFINES += -DXCFG_FAX_SUPPORT=1
300 ifeq ($(strip $(BRCM_DSP_CODEC_T38_INT)),y)
301 BRCM_DSP_CODEC_DEFINES += -DXCFG_FAX_SUPPORT=1
304 ifeq ($(strip $(BRCM_DSP_APM_FXO_EXT)),y)
305 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
306 BRCM_DSP_CODEC_DEFINES += -DXCFG_G7231_SUPPORT=1
307 BRCM_DSP_CODEC_DEFINES += -DXCFG_G726_SUPPORT=1
310 ifeq ($(strip $(BRCM_DSP_APM_FXO)),y)
311 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
314 ifeq ($(strip $(BRCM_DSP_HYBRID_FXO_EXT)),y)
315 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
316 BRCM_DSP_CODEC_DEFINES += -DXCFG_G7231_SUPPORT=1
317 BRCM_DSP_CODEC_DEFINES += -DXCFG_G726_SUPPORT=1
320 ifeq ($(strip $(BRCM_DSP_HYBRID_FXO)),y)
321 BRCM_DSP_CODEC_DEFINES += -DXCFG_G729_SUPPORT=1
322 BRCM_DSP_CODEC_DEFINES += -DXCFG_G7231_SUPPORT=1
323 BRCM_DSP_CODEC_DEFINES += -DXCFG_G726_SUPPORT=1
328 # Definition of the number of voice channels supported based on the specific
329 # application being created.
332 ifeq ($(strip $(BRCM_DSP_HYBRID)), y)
333 BRCM_DSP_CHAN_DEFINES = -DNUM_APM_VOICE_CHANNELS=2 -DNUM_TDM_VOICE_CHANNELS=1 -DNUM_FXO_CHANNELS=0
335 ifeq ($(strip $(BRCM_DSP_HYBRID_EXT)), y)
336 BRCM_DSP_CHAN_DEFINES = -DNUM_APM_VOICE_CHANNELS=2 -DNUM_TDM_VOICE_CHANNELS=1 -DNUM_FXO_CHANNELS=0
338 ifeq ($(strip $(BRCM_DSP_APM_FXO)), y)
339 BRCM_DSP_CHAN_DEFINES = -DNUM_APM_VOICE_CHANNELS=2 -DNUM_TDM_VOICE_CHANNELS=0 -DNUM_FXO_CHANNELS=1
341 ifeq ($(strip $(BRCM_DSP_APM_FXO_EXT)), y)
342 BRCM_DSP_CHAN_DEFINES = -DNUM_APM_VOICE_CHANNELS=2 -DNUM_TDM_VOICE_CHANNELS=0 -DNUM_FXO_CHANNELS=1
344 ifeq ($(strip $(BRCM_DSP_HYBRID_FXO)), y)
345 BRCM_DSP_CHAN_DEFINES = -DNUM_APM_VOICE_CHANNELS=2 -DNUM_TDM_VOICE_CHANNELS=1 -DNUM_FXO_CHANNELS=1
347 ifeq ($(strip $(BRCM_DSP_HYBRID_FXO_EXT)), y)
348 BRCM_DSP_CHAN_DEFINES = -DNUM_APM_VOICE_CHANNELS=2 -DNUM_TDM_VOICE_CHANNELS=1 -DNUM_FXO_CHANNELS=1
350 BRCM_DSP_CHAN_DEFINES = -DNUM_APM_VOICE_CHANNELS=0 -DNUM_TDM_VOICE_CHANNELS=0 -DNUM_FXO_CHANNELS=0
358 export BRCM_DSP_CODEC_DEFINES
359 export BRCM_DSP_CHAN_DEFINES
361 export XCHANGE_BUILD_APP=Bcm$(BRCM_CHIP)$(BRCM_DSP_HAL)$(BRCM_DSP_HAL_EXTENSION)
362 export XCHANGE_DSP_APP_EXTENSION
363 export BRCM_DSP_HAL_EXTENSION
364 BRCM_RELEASETAG := $(BRCM_RELEASETAG).$(XCHANGE_DSP_APP)
366 # If no codec is selected, build G.711 load.
367 # Any XCHANGE_BUILD_APP directory would be OK
368 # because G.711 is included with all the voice DSP images.
369 ifneq ($(strip $(BUILD_VODSL)),)
370 ifeq ($(strip $(XCHANGE_DSP_APP)),)
371 export XCHANGE_BUILD_APP=Bcm$(BRCM_CHIP)gw
372 export XCHANGE_DSP_APP=g711
373 BRCM_RELEASETAG := $(BRCM_RELEASETAG).g711
377 ifeq ($(strip $(BRCM_MIPS_ONLY_BUILD)),y)
378 export XCHANGE_BUILD_APP=Bcm$(BRCM_CHIP)lv
380 BRCM_DSP_HAL_EXTENSION :=
381 XCHANGE_DSP_APP_EXTENSION=
384 ifeq ($(strip $(BRCM_VODSL_DUAL_3341)),y)
385 BRCM_RELEASETAG := $(BRCM_RELEASETAG).dual3341
388 #Set up ADSL standard
389 export ADSL=$(BRCM_ADSL_STANDARD)
391 #Set up ADSL_PHY_MODE {file | obj}
392 export ADSL_PHY_MODE=file
394 #Set up ADSL_SELF_TEST
395 export ADSL_SELF_TEST=$(BRCM_ADSL_SELF_TEST)
397 ###########################################
399 # Complete list of applications
401 ###########################################
402 export OPENSOURCE_DIR=$(USERAPPS_DIR)/opensource
403 SUBDIRS_OPENSOURCE = $(OPENSOURCE_DIR)/atm2684/pvc2684ctl \
404 $(OPENSOURCE_DIR)/bridge-utils \
405 $(OPENSOURCE_DIR)/ppp/pppoe \
406 $(OPENSOURCE_DIR)/udhcp \
407 $(OPENSOURCE_DIR)/iptables \
408 $(OPENSOURCE_DIR)/ebtables \
409 $(OPENSOURCE_DIR)/reaim \
410 $(OPENSOURCE_DIR)/iproute2 \
411 $(OPENSOURCE_DIR)/gdbserver \
412 $(OPENSOURCE_DIR)/libosip2 \
413 $(OPENSOURCE_DIR)/siproxd \
414 $(OPENSOURCE_DIR)/zebra \
415 $(OPENSOURCE_DIR)/net-snmp \
416 $(OPENSOURCE_DIR)/ftpd \
417 $(OPENSOURCE_DIR)/libcreduction \
418 $(OPENSOURCE_DIR)/busybox \
419 $(OPENSOURCE_DIR)/wireless_tools
421 #In future, we need to add soap when it
422 #is decoupled from cli
424 export BROADCOM_DIR=$(USERAPPS_DIR)/broadcom
425 SUBDIRS_BROADCOM = $(BROADCOM_DIR)/nvram \
426 $(BROADCOM_DIR)/cfm \
427 $(BROADCOM_DIR)/upnp/router/upnp \
428 $(BROADCOM_DIR)/nas \
429 $(BROADCOM_DIR)/wlctl \
430 $(BROADCOM_DIR)/vodsl \
431 $(BROADCOM_DIR)/atmctl \
432 $(BROADCOM_DIR)/adslctl \
433 $(BROADCOM_DIR)/netctl \
434 $(BROADCOM_DIR)/dnsprobe \
435 $(BROADCOM_DIR)/igmp \
436 $(BROADCOM_DIR)/dhcpr \
437 $(BROADCOM_DIR)/sntp \
438 $(BROADCOM_DIR)/ippd \
439 $(BROADCOM_DIR)/ddnsd \
440 $(BROADCOM_DIR)/ethctl \
441 $(BROADCOM_DIR)/hotplug \
442 $(BROADCOM_DIR)/epittcp \
443 $(BROADCOM_DIR)/snmp \
446 SUBDIRS_APP = $(SUBDIRS_BROADCOM) $(SUBDIRS_OPENSOURCE)
447 SUBDIRS = $(foreach dir, $(SUBDIRS_APP), $(shell if [ -d "$(dir)" ]; then echo $(dir); fi))
449 OPENSOURCE_APPS = pvc2684ctl pvc2684d brctl pppd udhcp iptables ebtables \
450 reaim tc libosip2 siproxd snmp zebra bftpd busybox gdbserver wireless_tools
452 BROADCOM_APPS = nvram cfm upnp nas wlctl vodsl atmctl adslctl netctl dnsprobe \
453 igmp dhcpr diagapp sntp ddnsd ilmi ippd hotplug ethctl epittcp ses snmp
454 LIBC_OPTIMIZATION = libcreduction
456 BUSYBOX_DIR = $(OPENSOURCE_DIR)/busybox
458 BRCMAPPS = $(BROADCOM_APPS) $(OPENSOURCE_APPS) $(LIBC_OPTIMIZATION)
460 all: sanity_check profile_check kernelbuild modbuild app hosttools buildimage
463 @cd $(INC_KERNEL_BASE); \
464 if [ ! -e linux/CREDITS ]; then \
465 echo Untarring original Linux kernel source...; \
466 (tar xkfj $(ORIGINAL_KERNEL) 2> /dev/null || true); \
468 $(MAKE) -C $(KERNEL_DIR)/scripts/lxdialog HOSTCC=gcc
469 $(CONFIG_SHELL) $(HOSTTOOLS_DIR)/scripts/Menuconfig $(TARGETS_DIR)/config.in
472 @if [ "$(PROFILE)" = "" ]; then \
473 echo You need to specify build profile name from $(TARGETS_DIR) using 'make PROFILE=<profile name>...'; exit 1; \
477 @if [ "$(LAST_PROFILE)" != "" ] && [ "$(LAST_PROFILE)" != "$(PROFILE)" ]; then \
478 echo "The specified profile, $(PROFILE), differs from the last one built, $(LAST_PROFILE)."; \
479 echo "The entire image must be rebuilt."; \
480 read -p "Press ENTER to rebuild the entire image or CTRL-C to abort. " ; \
481 $(MAKE) PROFILE=$(LAST_PROFILE) clean; \
482 $(MAKE) PROFILE=$(PROFILE); \
483 echo "Ignore the make exit error, Error 1"; \
487 $(KERNEL_DIR)/vmlinux:
488 $(GENDEFCONFIG_CMD) $(PROFILE_PATH)
490 cp -f $(KERNEL_DIR)/arch/mips/defconfig $(KERNEL_DIR)/.config; \
491 $(MAKE) oldconfig; $(MAKE); $(MAKE) modules_install
494 ifeq ($(wildcard $(KERNEL_DIR)/vmlinux),)
495 @cd $(INC_KERNEL_BASE); \
496 if [ ! -e linux/CREDITS ]; then \
497 echo Untarring original Linux kernel source...; \
498 (tar xkfj $(ORIGINAL_KERNEL) 2> /dev/null || true); \
500 $(GENDEFCONFIG_CMD) $(PROFILE_PATH)
502 cp -f $(KERNEL_DIR)/arch/mips/defconfig $(KERNEL_DIR)/.config; \
503 $(MAKE) oldconfig; $(MAKE)
505 cd $(KERNEL_DIR); $(MAKE)
508 kernel: profile_check kernelbuild hosttools buildimage
510 ifeq ($(strip $(VOXXXLOAD)),1)
511 modbuild: touch_voice_files
512 cd $(KERNEL_DIR); $(MAKE) modules && $(MAKE) modules_install
515 cd $(KERNEL_DIR); $(MAKE) modules && $(MAKE) modules_install
518 modules: profile_check modbuild hosttools buildimage
520 app: profile_check prebuild $(BRCMAPPS) hosttools buildimage
523 mkdir -p $(INSTALL_DIR)/bin $(INSTALL_DIR)/lib
525 # touch_voice_files doesn't clean up voice, just enables incremental build of voice code
527 find bcmdrivers/broadcom/char/endpoint/ \( -name '*.o' -o -name '*.a' -o -name '*.lib' -o -name '*.ko' -o -name '*.cmd' -o -name '.*.cmd' -o -name '*.c' -o -name '*.mod' \) -print -exec rm -f "{}" ";"
528 rm -rf kernel/linux/.tmp_versions/endpointdd.mod
529 rm -rf kernel/linux/arch/mips/defconfig
530 rm -rf kernel/linux/include/config/bcm/endpoint/
531 rm -rf kernel/linux/include/asm-mips/offset.h
532 rm -rf kernel/linux/include/asm-mips/reg.h
533 find kernel/linux/lib/ -name '*.o' -print -exec rm -f "{}" ";"
534 find kernel/linux/lib/ -name '*.lib' -print -exec rm -f "{}" ";"
536 # Build user applications depending on if they are
537 # specified in the profile
538 ifneq ($(strip $(BUILD_PVC2684CTL)),)
539 export BUILD_PVC2684D=$(BUILD_PVC2684CTL)
542 $(MAKE) -C $(OPENSOURCE_DIR)/atm2684/pvc2684ctl $(BUILD_PVC2684CTL)
547 ifneq ($(strip $(BUILD_BRCTL)),)
549 cd $(OPENSOURCE_DIR); (tar xkfj bridge-utils.tar.bz2 2> /dev/null || true)
550 $(MAKE) -C $(OPENSOURCE_DIR)/bridge-utils $(BUILD_BRCTL)
555 ifneq ($(strip $(BUILD_VCONFIG)),)
556 export BUILD_VCONFIG=y
559 ifneq ($(strip $(BUILD_CFM)),)
561 ifneq ($(strip $(BUILD_CFM_MENU)),)
562 export BUILD_CFM_MENU=y
566 $(MAKE) -C $(BROADCOM_DIR)/cfm $(BUILD_CFM)
571 # iptables is dependent on kernel netfilter modules
572 ifneq ($(strip $(BRCM_KERNEL_NETFILTER)),)
573 ifneq ($(strip $(BUILD_IPTABLES)),)
575 # cd $(OPENSOURCE_DIR); (tar xkfj iptables.tar.bz2 2> /dev/null || true)
576 cd $(OPENSOURCE_DIR);
577 $(MAKE) -C $(OPENSOURCE_DIR)/iptables $(BUILD_IPTABLES)
579 # cd $(OPENSOURCE_DIR); (tar xkfj iptables.tar.bz2 2> /dev/null || true)
580 cd $(OPENSOURCE_DIR);
581 $(MAKE) -C $(OPENSOURCE_DIR)/iptables static
587 @echo Warning: You need to enable netfilter in the kernel !!!!!
591 cd $(OPENSOURCE_DIR);
592 $(MAKE) -C $(OPENSOURCE_DIR)/wireless_tools install
594 ifneq ($(strip $(BUILD_EBTABLES)),)
596 cd $(OPENSOURCE_DIR); (tar xkfj ebtables.tar.bz2 2> /dev/null || true)
597 $(MAKE) -C $(OPENSOURCE_DIR)/ebtables $(BUILD_EBTABLES)
602 ifneq ($(strip $(BUILD_PPPD)),)
604 $(MAKE) -C $(OPENSOURCE_DIR)/ppp/pppoe $(BUILD_PPPD)
609 ifneq ($(strip $(BUILD_REAIM)),)
611 cd $(OPENSOURCE_DIR); (tar xkfj reaim.tar.bz2 2> /dev/null || true)
612 $(MAKE) -C $(OPENSOURCE_DIR)/reaim $(BUILD_REAIM)
617 ifneq ($(strip $(BRCM_KERNEL_NETQOS)),)
619 cd $(OPENSOURCE_DIR); (tar xkfj iproute2.tar.bz2 2> /dev/null || true)
620 $(MAKE) -C $(OPENSOURCE_DIR)/iproute2 dynamic
625 ifneq ($(strip $(BUILD_GDBSERVER)),)
627 install -m 755 $(TOOLCHAIN)/mips-linux-uclibc/target-apps/usr/bin/gdbserver $(INSTALL_DIR)/bin
628 $(STRIP) $(INSTALL_DIR)/bin/gdbserver
633 ifneq ($(strip $(BUILD_ETHWAN)),)
634 export BUILD_ETHWAN=y
637 ifneq ($(strip $(BUILD_UDHCP)),)
639 $(MAKE) -C $(OPENSOURCE_DIR)/udhcp $(BUILD_UDHCP)
644 # UPNP is dependent on iptables
645 ifneq ($(strip $(BUILD_IPTABLES)),)
646 ifneq ($(strip $(BUILD_UPNP)),)
648 $(MAKE) -C $(BROADCOM_DIR)/upnp/router/upnp $(BUILD_UPNP)
654 @echo Warning: You need to build iptables first !!!!!
658 ifneq ($(strip $(BUILD_SIPROXD)),)
660 cd $(OPENSOURCE_DIR); (tar xkfj siproxd.tar.bz2 2> /dev/null || true)
661 $(MAKE) -C $(OPENSOURCE_DIR)/siproxd $(BUILD_SIPROXD)
663 cd $(OPENSOURCE_DIR); (tar xkfj libosip2.tar.bz2 2> /dev/null || true)
664 $(MAKE) -C $(OPENSOURCE_DIR)/libosip2
670 ifneq ($(strip $(BUILD_SNMP)),)
672 ifneq ($(strip $(BUILD_SNMP_SET)),)
673 export BUILD_SNMP_SET=1
675 export BUILD_SNMP_SET=0
678 ifneq ($(strip $(BUILD_SNMP_ADSL_MIB)),)
679 export BUILD_SNMP_ADSL_MIB=1
681 export BUILD_SNMP_ADSL_MIB=0
684 ifneq ($(strip $(BUILD_SNMP_ATM_MIB)),)
685 export BUILD_SNMP_ATM_MIB=1
687 export BUILD_SNMP_ATM_MIB=0
690 ifneq ($(strip $(BUILD_SNMP_AT_MIB)),)
691 export BUILD_SNMP_AT_MIB=1
693 export BUILD_SNMP_AT_MIB=0
696 ifneq ($(strip $(BUILD_SNMP_SYSOR_MIB)),)
697 export BUILD_SNMP_SYSOR_MIB=1
699 export BUILD_SNMP_SYSOR_MIB=0
702 ifneq ($(strip $(BUILD_SNMP_TCP_MIB)),)
703 export BUILD_SNMP_TCP_MIB=1
705 export BUILD_SNMP_TCP_MIB=0
708 ifneq ($(strip $(BUILD_SNMP_UDP_MIB)),)
709 export BUILD_SNMP_UDP_MIB=1
711 export BUILD_SNMP_UDP_MIB=0
714 ifneq ($(strip $(BUILD_SNMP_IP_MIB)),)
715 export BUILD_SNMP_IP_MIB=1
717 export BUILD_SNMP_IP_MIB=0
720 ifneq ($(strip $(BUILD_SNMP_ICMP_MIB)),)
721 export BUILD_SNMP_ICMP_MIB=1
723 export BUILD_SNMP_ICMP_MIB=0
726 ifneq ($(strip $(BUILD_SNMP_SNMP_MIB)),)
727 export BUILD_SNMP_SNMP_MIB=1
729 export BUILD_SNMP_SNMP_MIB=0
732 ifneq ($(strip $(BUILD_SNMP_ATMFORUM_MIB)),)
733 export BUILD_SNMP_ATMFORUM_MIB=1
735 export BUILD_SNMP_ATMFORUM_MIB=0
738 ifneq ($(strip $(BRCM_SNMP)),)
739 export BUILD_SNMP_CHINA_TELECOM_CPE_MIB=0
743 ifneq ($(strip $(BRCM_SNMP)),)
744 ## $(MAKE) -C $(BROADCOM_DIR)/snmp $(BUILD_SNMP)
746 cd $(OPENSOURCE_DIR); (tar xkfj net-snmp.tar.bz2 2> /dev/null || true)
747 $(MAKE) -C $(OPENSOURCE_DIR)/net-snmp $(BUILD_SNMP)
753 ifneq ($(strip $(BUILD_ILMI)),)
755 cd $(OPENSOURCE_DIR); (tar xkfj net-snmp.tar.bz2 2> /dev/null || true)
756 $(MAKE) -C $(BROADCOM_DIR)/ilmi $(BUILD_ILMI)
761 ifneq ($(strip $(BUILD_VODSL)),)
763 $(MAKE) -C $(BROADCOM_DIR)/vodsl $(BUILD_VODSL)
768 # Leave it for the future when soap server is decoupled from cfm
769 ifneq ($(strip $(BUILD_SOAP)),)
770 ifeq ($(strip $(BUILD_SOAP_VER)),2)
772 $(MAKE) -C $(BROADCOM_DIR)/SoapToolkit/SoapServer $(BUILD_SOAP)
775 $(MAKE) -C $(BROADCOM_DIR)/soap $(BUILD_SOAP)
781 ifneq ($(strip $(BUILD_NAS)),)
784 $(MAKE) -C $(BROADCOM_DIR)/nas $(BUILD_NAS)
786 #add hotplug here, for nas use only
788 $(MAKE) -C $(BROADCOM_DIR)/hotplug $(BUILD_NAS)
793 #add hotplug here, for nas use only
797 ifneq ($(strip $(BUILD_WLCTL)),)
800 $(MAKE) -C $(BROADCOM_DIR)/wlctl $(BUILD_WLCTL)
806 #Always compile Ethernet control utility
808 $(MAKE) -C $(BROADCOM_DIR)/ethctl dynamic
810 ifneq ($(strip $(BUILD_DNSPROBE)),)
812 $(MAKE) -C $(BROADCOM_DIR)/dnsprobe $(BUILD_DNSPROBE)
817 ifneq ($(strip $(BUILD_IGMP)),)
819 $(MAKE) -C $(BROADCOM_DIR)/igmp $(BUILD_IGMP)
824 ifneq ($(strip $(BUILD_DHCPR)),)
826 $(MAKE) -C $(BROADCOM_DIR)/dhcpr $(BUILD_DHCPR)
831 ifneq ($(strip $(BUILD_ZEBRA)),)
833 cd $(OPENSOURCE_DIR); (tar xkfj zebra.tar.bz2 2> /dev/null || true)
834 $(MAKE) -C $(OPENSOURCE_DIR)/zebra $(BUILD_ZEBRA)
839 ifneq ($(strip $(BUILD_ATMCTL)),)
841 $(MAKE) -C $(BROADCOM_DIR)/atmctl $(BUILD_ATMCTL)
846 ifneq ($(strip $(BUILD_ADSLCTL)),)
848 $(MAKE) -C $(BROADCOM_DIR)/adslctl $(BUILD_ADSLCTL)
853 ifeq ($(strip $(BUILD_CFM_CLI)),y)
854 ifneq ($(strip $(BUILD_NETCTL)),)
856 $(MAKE) -C $(BROADCOM_DIR)/netctl $(BUILD_NETCTL)
864 ifneq ($(strip $(BUILD_BUSYBOX)),)
867 # cd $(OPENSOURCE_DIR); (tar xkfj busybox.tar.bz2 2> /dev/null || true)
868 # $(MAKE) -C $(OPENSOURCE_DIR)/busybox $(BUILD_BUSYBOX)
869 cd $(OPENSOURCE_DIR)/busybox;
871 # cp -f brcm.config .config
872 $(MAKE) -C $(OPENSOURCE_DIR)/busybox install
877 ifneq ($(strip $(BUILD_LIBCREDUCTION)),)
879 $(MAKE) -C $(OPENSOURCE_DIR)/libcreduction install
884 ifneq ($(strip $(BUILD_DIAGAPP)),)
886 $(MAKE) -C $(BROADCOM_DIR)/diagapp $(BUILD_DIAGAPP)
891 ifneq ($(strip $(BUILD_FTPD)),)
893 cd $(OPENSOURCE_DIR); (tar xkfj ftpd.tar.bz2 2> /dev/null || true)
894 $(MAKE) -C $(OPENSOURCE_DIR)/ftpd $(BUILD_FTPD)
899 ifneq ($(strip $(BUILD_DDNSD)),)
901 $(MAKE) -C $(BROADCOM_DIR)/ddnsd $(BUILD_DDNSD)
906 ifneq ($(strip $(BUILD_SNTP)),)
908 $(MAKE) -C $(BROADCOM_DIR)/sntp $(BUILD_SNTP)
913 ifneq ($(strip $(BUILD_EPITTCP)),)
915 $(MAKE) -C $(BROADCOM_DIR)/epittcp $(BUILD_EPITTCP)
920 ifneq ($(strip $(BUILD_SES)),)
922 $(MAKE) -C $(BROADCOM_DIR)/ses $(BUILD_SES)
927 ifneq ($(strip $(BUILD_NVRAM)),)
929 $(MAKE) -C $(BROADCOM_DIR)/nvram $(BUILD_NVRAM)
934 ifneq ($(strip $(BUILD_IPPD)),)
936 $(MAKE) -C $(BROADCOM_DIR)/ippd $(BUILD_IPPD)
942 $(MAKE) -C $(HOSTTOOLS_DIR)
945 buildimage: $(KERNEL_DIR)/vmlinux
946 su --command="cd $(TARGETS_DIR); ./buildFS"
947 ifeq ($(strip $(BRCM_KERNEL_ROOTFS)),squashfs)
948 #$(HOSTTOOLS_DIR)/mksquashfs $(TARGET_FS) $(PROFILE_DIR)/rootfs.img -noappend -be -always-use-fragments -gzip
949 $(HOSTTOOLS_DIR)/mksquashfs $(TARGET_FS) $(PROFILE_DIR)/rootfs.img -noappend -be -lzma -no-fragments -noI
951 ifeq ($(strip $(BRCM_KERNEL_ROOTFS)),cramfs)
952 # $(HOSTTOOLS_DIR)/mkcramfs -r -g $(TARGET_FS) $(PROFILE_DIR)/rootfs.img
953 $(HOSTTOOLS_DIR)/mkcramfs -r $(TARGET_FS) $(PROFILE_DIR)/rootfs.img
955 ifeq ($(strip $(BRCM_KERNEL_ROOTFS)),jffs2)
956 $(HOSTTOOLS_DIR)/mkfs.jffs2 -b -p -e $(BRCM_FLASHBLK_SIZE) -r $(TARGET_FS) -o $(PROFILE_DIR)/rootfs.img
961 ifneq ($(strip $(BRCM_KERNEL_ROOTFS)),nfs)
963 cp $(KERNEL_DIR)/vmlinux . ; \
964 $(STRIP) --remove-section=.note --remove-section=.comment vmlinux; \
965 $(OBJCOPY) -O binary vmlinux vmlinux.bin; \
966 $(HOSTTOOLS_DIR)/cmplzma -k -2 vmlinux vmlinux.bin vmlinux.lz;\
967 $(HOSTTOOLS_DIR)/bcmImageBuilder --output $(FS_KERNEL_IMAGE_NAME) --chip $(BRCM_CHIP) --board $(BRCM_BOARD_ID) --blocksize $(BRCM_FLASHBLK_SIZE) --cfefile $(CFE_FILE) --rootfsfile rootfs.img --kernelfile vmlinux.lz; \
968 $(HOSTTOOLS_DIR)/bcmImageBuilder --output $(CFE_FS_KERNEL_IMAGE_NAME) --chip $(BRCM_CHIP) --board $(BRCM_BOARD_ID) --blocksize $(BRCM_FLASHBLK_SIZE) --cfefile $(CFE_FILE) --rootfsfile rootfs.img --kernelfile vmlinux.lz --include-cfe; \
969 $(HOSTTOOLS_DIR)/createimg -b $(BRCM_BOARD_ID) -n $(BRCM_NUM_MAC_ADDRESSES) -m $(BRCM_BASE_MAC_ADDRESS) -i $(CFE_FS_KERNEL_IMAGE_NAME) -o $(FLASH_IMAGE_NAME); \
970 $(HOSTTOOLS_DIR)/addvtoken $(FLASH_IMAGE_NAME) $(FLASH_IMAGE_NAME).w
971 @mkdir -p $(IMAGES_DIR)
972 @cp $(PROFILE_DIR)/$(FS_KERNEL_IMAGE_NAME) $(IMAGES_DIR)/$(FS_KERNEL_IMAGE_NAME)_$(BRCM_RELEASETAG)-$(shell date '+%y%m%d_%H%M')
974 @echo -e "Done! Image $(PROFILE) has been built in $(IMAGES_DIR)."
975 ##### Add additional header - GEMTEK
976 $(HOSTTOOLS_DIR)/add_header $(MAGIC) $(PROFILE_DIR)/$(FS_KERNEL_IMAGE_NAME)
977 $(HOSTTOOLS_DIR)/add_header $(MAGIC) $(PROFILE_DIR)/$(CFE_FS_KERNEL_IMAGE_NAME)
978 @cp $(PROFILE_DIR)/bcm96348GW_* $(IMAGES_DIR)
982 cp $(KERNEL_DIR)/vmlinux . ; \
983 $(STRIP) --remove-section=.note --remove-section=.comment vmlinux
985 @echo -e "\t=== Following the below steps to start your NFS root file system on host ==="
986 @echo -e "Step 1: Copy $(PROFILE_DIR)/vmlinux to your TFTP server boot directory, such as /tftpboot"
987 @echo -e "Step 2: Add \"$(PROFILE_DIR)/fs *(rw,no_root_squash)\" to /etc/exports"
988 @echo -e "Step 3: Become root and restart your nfs server, such as \"service nfs restart\""
989 @echo -e "Step 4: Reboot your board and break into CFE bootloader, choose h on \"Run from flash/host\" and vmlinux on \"Default host run file name\""
993 ###########################################
995 # System code clean-up
997 ###########################################
999 subdirs: $(patsubst %, _dir_%, $(SUBDIRS))
1001 $(patsubst %, _dir_%, $(SUBDIRS)) :
1002 $(MAKE) -C $(patsubst _dir_%, %, $@) $(TGT)
1004 clean: target_clean app_clean kernel_clean hosttools_clean
1008 rm -fr $(INSTALL_DIR)/bin
1009 rm -fr $(INSTALL_DIR)/sbin
1010 rm -fr $(INSTALL_DIR)/lib
1011 rm -fr $(INSTALL_DIR)/upnp
1012 rm -fr $(INSTALL_DIR)/docs
1013 rm -fr $(INSTALL_DIR)/webs
1014 rm -fr $(INSTALL_DIR)/usr
1015 rm -fr $(INSTALL_DIR)/linuxrc
1017 kernel_clean: sanity_check
1018 $(MAKE) -C $(KERNEL_DIR) mrproper
1019 rm -f $(KERNEL_DIR)/arch/mips/defconfig
1020 rm -f $(HOSTTOOLS_DIR)/lzma/decompress/*.o
1021 rm -rf $(XCHANGE_DIR)/dslx/lib/LinuxKernel
1022 rm -rf $(XCHANGE_DIR)/dslx/obj/LinuxKernel
1024 app_clean: sanity_check fssrc_clean
1025 $(MAKE) subdirs TGT=clean
1026 rm -rf $(XCHANGE_DIR)/dslx/lib/LinuxUser
1027 rm -rf $(XCHANGE_DIR)/dslx/obj/LinuxUser
1029 target_clean: sanity_check
1030 rm -f $(PROFILE_DIR)/rootfs.img
1031 rm -f $(PROFILE_DIR)/vmlinux
1032 rm -f $(PROFILE_DIR)/vmlinux.bin
1033 rm -f $(PROFILE_DIR)/vmlinux.lz
1034 rm -f $(PROFILE_DIR)/$(FS_KERNEL_IMAGE_NAME)
1035 rm -f $(PROFILE_DIR)/$(CFE_FS_KERNEL_IMAGE_NAME)
1036 rm -f $(PROFILE_DIR)/$(FLASH_IMAGE_NAME)
1037 rm -f $(PROFILE_DIR)/$(FLASH_IMAGE_NAME).w
1038 rm -fr $(PROFILE_DIR)/modules
1039 find targets -name vmlinux -print -exec rm -f "{}" ";"
1040 su --command="rm -fr $(TARGET_FS)"
1043 $(MAKE) -C $(HOSTTOOLS_DIR) clean
1045 ###########################################
1047 # System-wide exported variables
1049 ###########################################
1051 export BRCM_VERSION BRCM_RELEASE BRCM_EXTRAVERSION BRCM_RELEASETAG BRCM_BOARD RUN_NOISE \
1052 INC_KERNEL_BASE KERNEL_DIR BRCMDRIVERS_DIR USERAPPS_DIR HOSTTOOLS_DIR TARGETS_DIR DEFAULTCFG_DIR XCHANGE_DIR FSSRC_DIR BUSYBOX_DIR \
1053 PROFILE_DIR INSTALL_DIR LINUXDIR INC_BRCMDRIVER_PUB_PATH INC_BRCMDRIVER_PRIV_PATH INC_BRCMBOARDPARMS_PATH INC_ENDPOINT_PATH INC_ADSLDRV_PATH BROADCOM_CFM_DIR INC_BRCMCFM_PATH BRCM_KERNEL_ROOTFS BRCMAPPS BRCM_MIPS_ONLY_BUILD \
1054 BRCM_UCLIBC CROSS_COMPILE TOOLCHAIN AS LD CC CXX AR NM STRIP SSTRIP OBJCOPY OBJDUMP RANLIB LIB_PATH LIBCDIR LIBDIR \
1055 BUILD_BR2684CTL BUILD_PVC2684CTL BUILD_RT2684D BUILD_BRCTL BUILD_CFM BUILD_CFM_CLI BUILD_IPTABLES BUILD_EBTABLES BUILD_VODSL BUILD_SIPROXD \
1056 BRCM_APP_PHONE BUILD_SOAP BUILD_SOAP_VER BRCM_DSP_CODEC_G711 BRCM_DSP_CODEC_G723 BRCM_DSP_CODEC_G726 BRCM_DSP_CODEC_G729 BRCM_MIPS_ONLY_BUILD \
1057 BRCM_DSP_CODEC_G7xx BRCM_DSP_PCM BRCM_DSP_HYBRID BRCM_DSP_HYBRID_EXT BRCM_DSP_APM_FXO BRCM_DSP_APM_FXO_EXT BRCM_DSP_HYBRID_FXO \
1058 BRCM_DSP_HYBRID_FXO_EXT BRCM_DSP_CODEC_T38_EXT BRCM_DSP_CODEC_T38_INT BRCM_DSP_HAL BRCM_DSP_HAL_EXTENSION XCHANGE_DSP_APP_EXTENSION BRCM_VOICE_COUNTRY_JAPAN BRCM_VOICE_GLOBAL_CFLAGS \
1059 BUILD_PPPD BUILD_REAIM BRCM_KERNEL_NETQOS BUILD_GDBSERVER BUILD_UDHCP BUILD_DHCPR BUILD_UPNP BUILD_SNMP BUILD_NAS BUILD_WLCTL BUILD_BUSYBOX BUILD_DNSPROBE BUILD_SLACTEST BUILD_VCONFIG BUILD_ETHWAN \
1060 BUILD_ZEBRA BUILD_ATMCTL BUILD_ADSLCTL BUILD_NETCTL BUILD_IGMP BRCM_PTHREADS BUILD_DIAGAPP \
1061 BUILD_CFM_TELNETD BUILD_CFM_SSHD BUILD_SSHD_MIPS_GENKEY BUILD_FTPD BRCM_DRIVER_PCI \
1062 BRCM_PSI_VERSION WEB_POPUP BUILD_DIR BUILD_DDNSD BUILD_SNTP BUILD_TOD BUILD_IPPD BUILD_VCONFIG JTAG_KERNEL_DEBUG \
1063 BUILD_EPITTCP BUILD_NVRAM BUILD_SES BUILD_BRCM_VLAN BRCM_SNMP BRCM_LDX_APP \
1064 BRCM_VODSL_DUAL_3341