如下述:
以下是从ecos的官网文档中抄录下来的。但在浩瀚的文档中找到这些信息也非易事,在此记录下来,以备查用。
其中reset vector定义在packages/hal/arm/arch/v3_0/src/vector.S中。
PLATFORM_SETUP1定义在packages/hal/arm/arch/v3_0/include/hal_platform_setup.h中。
cyg_start定义在packages/redboot/v3_0/src/main.c中。
Getting RedBoot Going ===================== Startup ======= 1. Reset entry point. At location 0. Transfer control to ROM entry point: reset_vector. 2. Here we call invoke PLATFORM_SETUP1 macro. This does the following: - disable interrupts - disable and clear caches - Init memory controllers. may involve discovery of what RAM is present. - Set up clock frequencies. - Init MMU table - sets up TTBR and DACR to default values - fills in MMU table to map - DRAM at 0x00000000 cacheable/buffered - Device registers elsewhere uncacheable/unbuffered usually 1-1 - DRAM at 0xF0000000 uncacheable/unbuffered (1-1 in aaed2000) - remap ROM at 0 elsewhere - Enable MMU - Relocate image to RAM for ROMRAM startup - Any other CPU setup required 3. Jump to HAL startup. - Plant vector intructions at 0+ - copy .data section to RAM - Init CPSR and SPSR - Set SP - Clear .bss - Call hal_hardware_init() - call initialize_stub() if GDB stubs included - call hal_ctrlc_isr_init() - call cyg_hal_invoke_constructors() - call cyg_start() HAL Serial support ================== Set up CDL in platform CDL file. CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS number of channels usually 0, 1 or 2 CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL channel to use for GDB CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_BAUD initial baud rate CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL channel to use for console CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD initial baud rate CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_DEFAULT default console channel The code in hal_diag.c need to be converted to the new serial device. If this the same as a device already supported, copy that. Things that need to be written: struct channel_data_t; Structure containing base address, timeout and ISR vector number for each serial device. xxxx_ser_channels[]; Array of channel_data_t, initialized with parameters of each channel. void cyg_hal_plf_serial_init_channel(void *__ch_data) Initialize the serial device. parameter is a pointer to a channel_data_t. void cyg_hal_plf_serial_putc(void * __ch_data, char *c) Send a character to the serial device. Poll for ready, write the char. Maybe poll for char sent. bool cyg_hal_plf_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch) Look for a character and return it if available. If none available, return false. int cyg_hal_plf_serial_control(void *__ch_data, __comm_control_cmd_t __func, ...) An IOCTL-like function for controlling various aspects of the serial device. May need to do some work in __COMMCTL_IRQ_ENABLE and __COMMCTL_IRQ_DISABLE cases to enable/disable interrupts. int cyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc, CYG_ADDRWORD __vector, CYG_ADDRWORD __data) Interrupt handler, specifically for dealing with Ctrl-C. - Check for an incoming character. - Read the character and call cyg_hal_is_break(). - If result is true, set *__ctrlc to 1. - return CYG_ISR_HANDLED; void cyg_hal_plf_serial_init() Initialize each of the serial channels. - call cyg_hal_plf_serial_init_channel() for each channel. - call CYGACC_COMM_IF_* macros for each channel - cut/paste/edit these. Interrupt Controller ==================== ARM platforms have interrupt controller access in functions in variant or platform source file. void hal_interrupt_mask(int vector) Manipulate interrupt controller to mask the interrupt. void hal_interrupt_unmask(int vector) Manipulate interrupt controller to unmask the interrupt. void hal_interrupt_acknowledge(int vector) Manipulate interrupt controller to acknowledge the interrupt. May not be needed in some platforms. void hal_interrupt_configure(int vector, int level, int up) Set interrupt detection: level vs. edge; high/low rising/falling. Leave empty where not implemented. void hal_interrupt_set_level(int vector, int level) Set interrupt priority level. Leave empty where not implemented. Redboot Configuration ===================== Having done all of the above, you should be in a position to get RedBoot running. If the platform you copied has redboot, there should be some .ecm files in the misc directory. Named redboot_<startup>.ecm. Choose a startup and edit the .ecm file. - remove any options that are not relevant - comment out FLASH, ETH and COMPRESS packages Configure for redboot: % setenv ECOS_REPOSITORY <path to source repository> % ecosconfig new xxxxxxxx redboot % ecosconfig import $ECOS_REPOSITORY/hal/arm/arm9/xxxxxxxx/current/misc/redboot_ROM.ecm % ecosconfig tree % make Repeat until successful.