diff options
author | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2010-04-09 12:25:22 +0000 |
---|---|---|
committer | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2010-04-09 12:25:22 +0000 |
commit | 22f107b6e4f667512d9563f0a5d235947fc7c850 (patch) | |
tree | 233c80a0df4c2376c626317db4363e4c22f3b721 /c/src/lib/libbsp/arm/lpc24xx | |
parent | added dma header (diff) | |
download | rtems-22f107b6e4f667512d9563f0a5d235947fc7c850.tar.bz2 |
Changes throughout
Diffstat (limited to 'c/src/lib/libbsp/arm/lpc24xx')
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/ChangeLog | 6 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/Makefile.am | 8 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/configure.ac | 25 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h | 6 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/irq/irq.c | 6 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/make/custom/lpc24xx.inc | 3 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/misc/io.c | 9 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c | 30 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c | 76 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 | 12 |
10 files changed, 150 insertions, 31 deletions
diff --git a/c/src/lib/libbsp/arm/lpc24xx/ChangeLog b/c/src/lib/libbsp/arm/lpc24xx/ChangeLog index 01835eaa4c..00dbd6afa7 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/ChangeLog +++ b/c/src/lib/libbsp/arm/lpc24xx/ChangeLog @@ -1,3 +1,9 @@ +2010-04-09 Sebastian Huber <sebastian.huber@embedded-brains.de> + + * Makefile.am, configure.ac, include/lpc24xx.h, irq/irq.c, + make/custom/lpc24xx.inc, misc/io.c, startup/bspstart.c, + startup/bspstarthooks.c, startup/linkcmds.lpc2362: Changes throughout. + 2010-03-29 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> * configure.ac: make the lpc2362 a SMALL MEMORY BSP diff --git a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am index 1ea711b82d..f10bfec9de 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am +++ b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am @@ -86,7 +86,6 @@ libbsp_a_SOURCES += ../../shared/bootcard.c \ ../../shared/bsplibc.c \ ../../shared/bsppost.c \ ../../shared/bsppredriverhook.c \ - ../../shared/bsppretaskinghook.c \ ../../shared/gnatinstallhandler.c \ ../../shared/sbrk.c \ ../../shared/src/stackalloc.c \ @@ -135,13 +134,8 @@ libbsp_a_SOURCES += ../../../libcpu/shared/src/cache_manager.c \ ../../../libcpu/arm/shared/cache/cache_.h libbsp_a_CPPFLAGS += -I$(srcdir)/../../../libcpu/arm/shared/include -# Start hooks (FIXME: This is brittle.) +# Start hooks libbsp_a_SOURCES += startup/bspstarthooks.c -libbsp_a-bspstarthooks.o: startup/bspstarthooks.c - $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbsp_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS:-mthumb=) \ - -MT libbsp_a-bspstarthooks.o -MD -MP -MF $(DEPDIR)/libbsp_a-bspstarthooks.Tpo -c -o libbsp_a-bspstarthooks.o \ - `test -f 'startup/bspstarthooks.c' || echo '$(srcdir)/'`startup/bspstarthooks.c - $(am__mv) $(DEPDIR)/libbsp_a-bspstarthooks.Tpo $(DEPDIR)/libbsp_a-bspstarthooks.Po ############################################################################### # Network # diff --git a/c/src/lib/libbsp/arm/lpc24xx/configure.ac b/c/src/lib/libbsp/arm/lpc24xx/configure.ac index 37c6ab34b9..1dd90bf09a 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/configure.ac +++ b/c/src/lib/libbsp/arm/lpc24xx/configure.ac @@ -6,7 +6,7 @@ # AC_PREREQ(2.59) -AC_INIT([rtems-c-src-lib-libbsp-arm-lpc247x],[_RTEMS_VERSION],[rtems-bugs@rtems.com]) +AC_INIT([rtems-c-src-lib-libbsp-arm-lpc24xx],[_RTEMS_VERSION],[rtems-bugs@rtems.com]) AC_CONFIG_SRCDIR([bsp_specs]) RTEMS_TOP(../../../../../..) @@ -21,22 +21,25 @@ RTEMS_PROG_CCAS RTEMS_CHECK_NETWORKING AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes") -RTEMS_BSPOPTS_SET([BSP_SMALL_MEMORY],[lpc2362],[TRUE]) +RTEMS_BSPOPTS_SET([BSP_SMALL_MEMORY],[lpc2362],[1]) RTEMS_BSPOPTS_SET([BSP_SMALL_MEMORY],[*],[]) -RTEMS_BSPOPTS_HELP([BSP_SMALL_MEMORY],[set to true fo low memory footprint]) +RTEMS_BSPOPTS_HELP([BSP_SMALL_MEMORY],[disable testsuite samples with high memory demands]) +RTEMS_BSPOPTS_SET([LPC24XX_OSCILLATOR_MAIN],[lpc2362],[3686400U]) RTEMS_BSPOPTS_SET([LPC24XX_OSCILLATOR_MAIN],[*],[12000000U]) RTEMS_BSPOPTS_HELP([LPC24XX_OSCILLATOR_MAIN],[main oscillator frequency in Hz]) RTEMS_BSPOPTS_SET([LPC24XX_OSCILLATOR_RTC],[*],[32768U]) RTEMS_BSPOPTS_HELP([LPC24XX_OSCILLATOR_RTC],[RTC oscillator frequency in Hz]) +RTEMS_BSPOPTS_SET([LPC24XX_CCLK],[lpc2362],[58982400U]) RTEMS_BSPOPTS_SET([LPC24XX_CCLK],[*],[72000000U]) RTEMS_BSPOPTS_HELP([LPC24XX_CCLK],[CPU clock in Hz]) RTEMS_BSPOPTS_SET([LPC24XX_UART_BAUD],[*],[115200U]) RTEMS_BSPOPTS_HELP([LPC24XX_UART_BAUD],[baud for UARTs]) +RTEMS_BSPOPTS_SET([LPC24XX_ETHERNET_RMII],[lpc24xx_ea],[1]) RTEMS_BSPOPTS_SET([LPC24XX_ETHERNET_RMII],[*],[]) RTEMS_BSPOPTS_HELP([LPC24XX_ETHERNET_RMII],[enable RMII for Ethernet]) @@ -59,9 +62,11 @@ RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_CONSOLE],[configuration for console (UART 0)] RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_1],[*],[]) RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_UART_1],[configuration for UART 1]) +RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_2],[lpc2362],[0]) RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_2],[lpc24xx_ncs_*],[0]) RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_UART_2],[configuration for UART 2]) +RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_3],[lpc2362],[0]) RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_3],[lpc24xx_ncs_*],[0]) RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_UART_3],[configuration for UART 3]) @@ -74,6 +79,20 @@ RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_I2C_1],[configuration for I2C 1]) RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_I2C_2],[*],[]) RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_I2C_2],[configuration for I2C 2]) +RTEMS_BSPOPTS_SET([LPC24XX_HEAP_EXTEND],[lpc2362],[1]) +RTEMS_BSPOPTS_HELP([LPC24XX_HEAP_EXTEND],[enable heap extend by Ethernet and USB regions]) + +RTEMS_BSPOPTS_SET([LPC24XX_STOP_GPDMA],[*],[1]) +RTEMS_BSPOPTS_HELP([LPC24XX_STOP_GPDMA],[stop general purpose DMA at start-up to avoid DMA interference]) + +RTEMS_BSPOPTS_SET([LPC24XX_STOP_ETHERNET],[lpc2362],[]) +RTEMS_BSPOPTS_SET([LPC24XX_STOP_ETHERNET],[*],[1]) +RTEMS_BSPOPTS_HELP([LPC24XX_STOP_ETHERNET],[stop Ethernet controller at start-up to avoid DMA interference]) + +RTEMS_BSPOPTS_SET([LPC24XX_STOP_USB],[lpc2362],[]) +RTEMS_BSPOPTS_SET([LPC24XX_STOP_USB],[*],[1]) +RTEMS_BSPOPTS_HELP([LPC24XX_STOP_USB],[stop USB controller at start-up to avoid DMA interference]) + RTEMS_BSPOPTS_SET([BSP_START_RESET_VECTOR],[lpc24xx_ncs_rom_ext],[0x80000040]) RTEMS_BSPOPTS_HELP([BSP_START_RESET_VECTOR],[reset vector address for BSP start]) diff --git a/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h b/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h index 2f296036d5..d7a5d11c0f 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h +++ b/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h @@ -1970,6 +1970,12 @@ typedef struct { #define LPC24XX_FIO ((volatile lpc24xx_fio *) FIO_BASE_ADDR) +/* PCONP */ + +#define PCONP_GPDMA (1U << 29) +#define PCONP_ETHERNET (1U << 30) +#define PCONP_USB (1U << 31) + /** @} */ #endif /* LIBBSP_ARM_LPC24XX_LPC24XX_H */ diff --git a/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c b/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c index d3073315f8..c16bd46bd8 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c +++ b/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c @@ -110,8 +110,10 @@ rtems_status_code bsp_interrupt_facility_initialize(void) /* Reset priority mask register */ VICSWPrioMask = 0xffff; - /* Acknowledge interrupt */ - VICVectAddr = 0; + /* Acknowledge interrupts for all priorities */ + for (i = LPC24XX_IRQ_PRIORITY_VALUE_MIN; i <= LPC24XX_IRQ_PRIORITY_VALUE_MAX; ++i) { + VICVectAddr = 0; + } /* Install the IRQ exception handler */ _CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL); diff --git a/c/src/lib/libbsp/arm/lpc24xx/make/custom/lpc24xx.inc b/c/src/lib/libbsp/arm/lpc24xx/make/custom/lpc24xx.inc index e2018939a9..f8b1cbf072 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/make/custom/lpc24xx.inc +++ b/c/src/lib/libbsp/arm/lpc24xx/make/custom/lpc24xx.inc @@ -8,6 +8,7 @@ include $(RTEMS_ROOT)/make/custom/default.cfg RTEMS_CPU = arm -CPU_CFLAGS = -mcpu=arm7tdmi-s -mstructure-size-boundary=8 -mthumb +CPU_CFLAGS = -mcpu=arm7tdmi-s -mthumb -mstructure-size-boundary=8 \ + -Wextra -Wno-unused -Wpointer-arith -Wcast-qual -Wconversion -Wmissing-prototypes CFLAGS_OPTIMIZE_V = -Os -g diff --git a/c/src/lib/libbsp/arm/lpc24xx/misc/io.c b/c/src/lib/libbsp/arm/lpc24xx/misc/io.c index 340ce2153a..877131fa77 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/misc/io.c +++ b/c/src/lib/libbsp/arm/lpc24xx/misc/io.c @@ -77,6 +77,7 @@ static const lpc24xx_io_entry lpc24xx_io_config_table [] = { /* ADC */ LPC24XX_IO_ENTRY(LPC24XX_MODULE_ADC, 0, 0, 12, 0, 13, LPC24XX_IO_ALTERNATE_2), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_ADC, 1, 0, 23, 0, 25, LPC24XX_IO_ALTERNATE_0), /* I2C */ LPC24XX_IO_ENTRY(LPC24XX_MODULE_I2C_0, 0, 0, 27, 0, 28, LPC24XX_IO_ALTERNATE_0), @@ -103,8 +104,14 @@ static const lpc24xx_io_entry lpc24xx_io_config_table [] = { LPC24XX_IO_ENTRY(LPC24XX_MODULE_USB, 0, 0, 29, 0, 30, LPC24XX_IO_ALTERNATE_0), LPC24XX_IO_ENTRY(LPC24XX_MODULE_USB, 0, 1, 19, 1, 19, LPC24XX_IO_ALTERNATE_1), + /* SPI */ + LPC24XX_IO_ENTRY(LPC24XX_MODULE_SPI, 0, 0, 15, 0, 18, LPC24XX_IO_ALTERNATE_2), + + /* PWM */ + LPC24XX_IO_ENTRY(LPC24XX_MODULE_PWM_1, 0, 2, 0, 2, 0, LPC24XX_IO_ALTERNATE_0), + /* Terminate */ - LPC24XX_IO_ENTRY(LPC24XX_MODULE_COUNT, 0, 0, 0, 0, 0, 0), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_COUNT, 0, 0, 0, 0, 0, 0) }; static rtems_status_code lpc24xx_io_iterate( diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c index 76e1aa79aa..097b66c513 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c @@ -30,6 +30,36 @@ #include <bsp/stackalloc.h> #include <bsp/system-clocks.h> +#ifdef LPC24XX_HEAP_EXTEND + LINKER_SYMBOL(lpc24xx_region_heap_0_begin); + LINKER_SYMBOL(lpc24xx_region_heap_0_size); + LINKER_SYMBOL(lpc24xx_region_heap_0_end); + + LINKER_SYMBOL(lpc24xx_region_heap_1_begin); + LINKER_SYMBOL(lpc24xx_region_heap_1_size); + LINKER_SYMBOL(lpc24xx_region_heap_1_end); + + extern Heap_Control *RTEMS_Malloc_Heap; +#endif + +void bsp_pretasking_hook(void) +{ + #ifdef LPC24XX_HEAP_EXTEND + _Heap_Extend( + RTEMS_Malloc_Heap, + lpc24xx_region_heap_0_begin, + (uintptr_t) lpc24xx_region_heap_0_size, + NULL + ); + _Heap_Extend( + RTEMS_Malloc_Heap, + lpc24xx_region_heap_1_begin, + (uintptr_t) lpc24xx_region_heap_1_size, + NULL + ); + #endif +} + void bsp_start(void) { /* Initialize Timer 1 */ diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c index 732d30ddf5..9d56df2c7a 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c @@ -28,6 +28,10 @@ #define BSP_START_SECTION __attribute__((section(".bsp_start"))) +#if defined(LPC24XX_EMC_MICRON) || defined(LPC24XX_EMC_NUMONYX) + #define LPC24XX_EMC_INIT +#endif + #ifdef LPC24XX_EMC_MICRON static void BSP_START_SECTION lpc24xx_ram_test_32(void) { @@ -114,15 +118,17 @@ static void BSP_START_SECTION lpc24xx_init_emc_0(void) numonyx.waitrun = 0xf; #endif - /* Set pin functions for EMC */ - PINSEL5 = (PINSEL5 & 0xf000f000) | 0x05550555; - PINSEL6 = 0x55555555; - PINSEL8 = 0x55555555; - PINSEL9 = (PINSEL9 & 0x0f000000) | 0x50555555; + #ifdef LPC24XX_EMC_INIT + /* Set pin functions for EMC */ + PINSEL5 = (PINSEL5 & 0xf000f000) | 0x05550555; + PINSEL6 = 0x55555555; + PINSEL8 = 0x55555555; + PINSEL9 = (PINSEL9 & 0x0f000000) | 0x50555555; + #endif #ifdef LPC24XX_EMC_NUMONYX /* Static Memory 1 settings */ - bsp_start_memcpy_arm( + bsp_start_memcpy( (int *) EMC_STA_BASE_1, (const int *) &numonyx, sizeof(numonyx) @@ -135,8 +141,10 @@ static void BSP_START_SECTION lpc24xx_init_emc_0(void) */ static void BSP_START_SECTION lpc24xx_init_emc_1(void) { - /* Use normal memory map */ - EMC_CTRL = CLEAR_FLAG(EMC_CTRL, 0x2); + #ifdef LPC24XX_EMC_INIT + /* Use normal memory map */ + EMC_CTRL = CLEAR_FLAG(EMC_CTRL, 0x2); + #endif #ifdef LPC24XX_EMC_MICRON /* Check if we need to initialize it */ @@ -326,7 +334,13 @@ static void BSP_START_SECTION lpc24xx_init_pll(void) } /* Set PLL */ - lpc24xx_set_pll(1, 0, 11, 3); + #if LPC24XX_OSCILLATOR_MAIN == 12000000U + lpc24xx_set_pll(1, 0, 11, 3); + #elif LPC24XX_OSCILLATOR_MAIN == 3686400U + lpc24xx_set_pll(1, 0, 47, 5); + #else + #error "unexpected main oscillator frequency" + #endif } static void BSP_START_SECTION lpc24xx_clear_bss(void) @@ -355,9 +369,18 @@ void BSP_START_SECTION bsp_start_hook_1(void) /* Re-map interrupt vectors to internal RAM */ MEMMAP = SET_MEMMAP_MAP(MEMMAP, 2); - /* Set memory accelerator module (MAM) */ + /* Fully enable memory accelerator module functions (MAM) */ MAMCR = 0; - MAMTIM = 4; + #if LPC24XX_CCLK <= 20000000U + MAMTIM = 0x1; + #elif LPC24XX_CCLK <= 40000000U + MAMTIM = 0x2; + #elif LPC24XX_CCLK <= 60000000U + MAMTIM = 0x3; + #else + MAMTIM = 0x4; + #endif + MAMCR = 0x2; /* Enable fast IO for ports 0 and 1 */ SCS = SET_FLAG(SCS, 0x1); @@ -377,29 +400,52 @@ void BSP_START_SECTION bsp_start_hook_1(void) /* Initialize EMC hook 1 */ lpc24xx_init_emc_1(); + #ifdef LPC24XX_STOP_GPDMA + if ((PCONP & PCONP_GPDMA) != 0) { + GPDMA_CONFIG = 0; + PCONP &= ~PCONP_GPDMA; + } + #endif + + #ifdef LPC24XX_STOP_ETHERNET + if ((PCONP & PCONP_ETHERNET) != 0) { + MAC_COMMAND = 0x38; + MAC_MAC1 = 0xcf00; + MAC_MAC1 = 0; + PCONP &= ~PCONP_ETHERNET; + } + #endif + + #ifdef LPC24XX_STOP_USB + if ((PCONP & PCONP_USB) != 0) { + OTG_CLK_CTRL = 0; + PCONP &= ~PCONP_USB; + } + #endif + /* Copy .text section */ - bsp_start_memcpy_arm( + bsp_start_memcpy( (int *) bsp_section_text_begin, (const int *) bsp_section_text_load_begin, (size_t) bsp_section_text_size ); /* Copy .rodata section */ - bsp_start_memcpy_arm( + bsp_start_memcpy( (int *) bsp_section_rodata_begin, (const int *) bsp_section_rodata_load_begin, (size_t) bsp_section_rodata_size ); /* Copy .data section */ - bsp_start_memcpy_arm( + bsp_start_memcpy( (int *) bsp_section_data_begin, (const int *) bsp_section_data_load_begin, (size_t) bsp_section_data_size ); /* Copy .fast section */ - bsp_start_memcpy_arm( + bsp_start_memcpy( (int *) bsp_section_fast_begin, (const int *) bsp_section_fast_load_begin, (size_t) bsp_section_fast_size diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 index 76e2358f2f..3446994f8b 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 @@ -48,12 +48,20 @@ REGION_ALIAS ("REGION_TEXT", ROM_INT); REGION_ALIAS ("REGION_TEXT_LOAD", ROM_INT); REGION_ALIAS ("REGION_RODATA", ROM_INT); REGION_ALIAS ("REGION_RODATA_LOAD", ROM_INT); -REGION_ALIAS ("REGION_DATA", RAM_ETH); +REGION_ALIAS ("REGION_DATA", RAM_INT); REGION_ALIAS ("REGION_DATA_LOAD", ROM_INT); REGION_ALIAS ("REGION_FAST", RAM_INT); REGION_ALIAS ("REGION_FAST_LOAD", ROM_INT); -REGION_ALIAS ("REGION_BSS", RAM_ETH); +REGION_ALIAS ("REGION_BSS", RAM_INT); REGION_ALIAS ("REGION_WORK", RAM_INT); REGION_ALIAS ("REGION_STACK", RAM_INT); +lpc24xx_region_heap_0_begin = ORIGIN (RAM_ETH); +lpc24xx_region_heap_0_size = LENGTH (RAM_ETH); +lpc24xx_region_heap_0_end = lpc24xx_region_heap_0_begin + lpc24xx_region_heap_0_size; + +lpc24xx_region_heap_1_begin = ORIGIN (RAM_USB); +lpc24xx_region_heap_1_size = LENGTH (RAM_USB); +lpc24xx_region_heap_1_end = lpc24xx_region_heap_1_begin + lpc24xx_region_heap_1_size; + INCLUDE linkcmds.base |