From 5684d159162ace6c354a3faa578c3fb6503f6b0e Mon Sep 17 00:00:00 2001 From: "mok.jingxian@gmail.com" Date: Wed, 30 May 2012 11:29:34 +0000 Subject: [PATCH] add bf533 bsp and cpu files. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2138 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- bsp/bf533/application.c | 41 ++ bsp/bf533/application.h | 28 + bsp/bf533/board.c | 257 ++++++++++ bsp/bf533/board.h | 94 ++++ bsp/bf533/rtconfig.h | 243 +++++++++ bsp/bf533/startup.c | 102 ++++ bsp/bf533/vdsp/bf533.dpj | 740 +++++++++++++++++++++++++++ bsp/bf533/vdsp/bf533.mak | 244 +++++++++ bsp/bf533/vdsp/bf533.pcf | Bin 0 -> 48185 bytes bsp/bf533/vdsp/bf533_basiccrt.s | 344 +++++++++++++ bsp/bf533/vdsp/bf533_heaptab.c | 85 +++ bsp/bf533/vdsp/bf533_init.dxe | Bin 0 -> 1608 bytes bsp/bf533/vdsp/bf533_ram.ldf | 424 +++++++++++++++ bsp/bf533/vdsp/bf533_sdram_64M.ldf | 486 ++++++++++++++++++ bsp/bf533/vdsp/mine.dxe | Bin 0 -> 157208 bytes libcpu/blackfin/bf53x/context_vdsp.S | 165 ++++++ libcpu/blackfin/bf53x/cpuport.c | 93 ++++ libcpu/blackfin/bf53x/serial.c | 284 ++++++++++ libcpu/blackfin/bf53x/serial.h | 56 ++ 19 files changed, 3686 insertions(+) create mode 100644 bsp/bf533/application.c create mode 100644 bsp/bf533/application.h create mode 100644 bsp/bf533/board.c create mode 100644 bsp/bf533/board.h create mode 100644 bsp/bf533/rtconfig.h create mode 100644 bsp/bf533/startup.c create mode 100644 bsp/bf533/vdsp/bf533.dpj create mode 100644 bsp/bf533/vdsp/bf533.mak create mode 100644 bsp/bf533/vdsp/bf533.pcf create mode 100644 bsp/bf533/vdsp/bf533_basiccrt.s create mode 100644 bsp/bf533/vdsp/bf533_heaptab.c create mode 100644 bsp/bf533/vdsp/bf533_init.dxe create mode 100644 bsp/bf533/vdsp/bf533_ram.ldf create mode 100644 bsp/bf533/vdsp/bf533_sdram_64M.ldf create mode 100644 bsp/bf533/vdsp/mine.dxe create mode 100644 libcpu/blackfin/bf53x/context_vdsp.S create mode 100644 libcpu/blackfin/bf53x/cpuport.c create mode 100644 libcpu/blackfin/bf53x/serial.c create mode 100644 libcpu/blackfin/bf53x/serial.h diff --git a/bsp/bf533/application.c b/bsp/bf533/application.c new file mode 100644 index 0000000000..1e3573d60f --- /dev/null +++ b/bsp/bf533/application.c @@ -0,0 +1,41 @@ +/* + * File : application.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2012, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2012-02-13 mojingxian first version + */ + +#include "application.h" +#include "board.h" +#include "rtthread.h" + +void app_init_entry(void *parg) +{ + parg = parg; + + rt_hw_core_timer_init();//start system tick in first thread. + + rt_hw_isr_install(); +} + + +void rt_application_init(void) +{ + rt_thread_t led_thread; + +#ifdef RT_USING_HEAP + led_thread = rt_thread_create("init", app_init_entry, RT_NULL, 512, 200, 20); +#endif + + if (led_thread != RT_NULL) + { + rt_thread_startup(led_thread); + } +} diff --git a/bsp/bf533/application.h b/bsp/bf533/application.h new file mode 100644 index 0000000000..1d0f995099 --- /dev/null +++ b/bsp/bf533/application.h @@ -0,0 +1,28 @@ +/* + * File : application.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2012, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2012-02-13 mojingxian first version + */ + +#ifndef __APPLICATION_H__ +#define __APPLICATION_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +void rt_application_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __APPLICATION_H__ */ diff --git a/bsp/bf533/board.c b/bsp/bf533/board.c new file mode 100644 index 0000000000..87daa517b9 --- /dev/null +++ b/bsp/bf533/board.c @@ -0,0 +1,257 @@ +/* + * File : board.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2012, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2012-02-13 mojingxian first version + */ + +#include "board.h" +#include "rtconfig.h" +#include "rtdef.h" +#include "rthw.h" +#include "serial.h" + +#include +#include +#include +#include +#include +#include +#include + +#define IVG_CLR(index) (index > 0 ? ((0xFFFFFFF0 << (index * 0x04)) | \ + (0xFFFFFFF0 >> ((0x08 - index) * 0x04))):0xFFFFFFF0) +#define IVG_SET(index,ivg) ((((ivg) - 0x07) & 0x0F) << (index * 0x04)) + +#define UART0 ((struct uartport *)pUART_THR) +struct serial_int_rx uart0_int_rx; +struct serial_device uart0 = +{ + UART0, + &uart0_int_rx, + RT_NULL +}; +struct rt_device uart0_device; + +/** + * This function is to set the EBIU(EXTERNAL BUS INTERFACE UNIT). + */ +static void rt_hw_ebiu_init(void) +{ + *pEBIU_AMBCTL0 = 0xffc2ffc2; + + *pEBIU_AMBCTL1 = 0xffc2ffc3; + + *pEBIU_AMGCTL = 0x010f; +} + +/** + * This is the timer interrupt service routine. + */ +EX_INTERRUPT_HANDLER(rt_hw_timer_handler) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +/** + * This function is called to initialize system tick source (typically a + * timer generating interrupts every 1 to 100 mS). + * We decided to use Core Timer as the tick interrupt source. + */ +void rt_hw_core_timer_init(void) +{ + *pTCNTL = 1; // Turn on timer, TMPWR + *pTSCALE = 0x00; + *pTCOUNT = CCLKSPEED / RT_TICK_PER_SECOND; + *pTPERIOD = CCLKSPEED / RT_TICK_PER_SECOND; + register_handler(ik_timer,rt_hw_timer_handler); + *pTCNTL = 0x07; // Start Timer and set Auto-reload +} + +void rt_hw_interrupt_init(void) +{ + extern rt_uint32_t rt_interrupt_from_thread; + extern rt_uint32_t rt_interrupt_to_thread; + extern rt_uint32_t rt_thread_switch_interrupt_flag; + extern rt_uint8_t rt_interrupt_nest; + extern void interrupt_thread_switch(void); + + register_handler(ik_ivg14,interrupt_thread_switch); //context_vdsp.S + + /* init interrupt nest, and context in thread sp */ + rt_interrupt_nest = 0; + rt_interrupt_from_thread = 0; + rt_interrupt_to_thread = 0; + rt_thread_switch_interrupt_flag = 0; +} + +static void rt_hw_pll_init(void) +{ + unsigned long imask; + + sysreg_write(reg_SYSCFG, 0x32); + + *pSIC_IWR = 0x01; + + *pPLL_CTL = SET_MSEL(SPEED_MULTIPLE); + + // PLL Re-programming Sequence. + // Core is idle'ed to allow the PPL to re-lock. + imask = cli(); + idle(); + sti(imask); + *pVR_CTL = 0x00FB; + + // PLL Re-programming Sequence. + // Core is idle'ed to allow the PPL to re-lock. + imask = cli(); + idle(); + sti(imask); + + *pPLL_DIV = BUS_DIVISOR; +} + +/** + * This function is called to initialize external sdram. + */ +static void rt_hw_exdram_init(void) +{ + // Initalize EBIU control registers to enable all banks + *pEBIU_AMBCTL1 = 0xFFFFFF02; + ssync(); + + *pEBIU_AMGCTL = 0x00FF; + ssync(); + + // Check if already enabled + if (SDRS != ((*pEBIU_SDSTAT) & SDRS)) + { + return; + } + + //SDRAM Refresh Rate Control Register + *pEBIU_SDRRC = 0x01A0; + + //SDRAM Memory Bank Control Register + *pEBIU_SDBCTL = 0x0025; //1.7 64 MB + + //SDRAM Memory Global Control Register + *pEBIU_SDGCTL = 0x0091998D;//0x998D0491 + + ssync(); +} + +short uart_set_bitrate(unsigned long bit_rate) +{ + unsigned short int divisor; + + switch (bit_rate) + { + case 1200: + case 2400: + case 4800: + case 9600: + case 19200: + case 28800: + case 38400: + case 57600: + case 115200: + case 125000: + divisor = (unsigned short int) ((float) SCLKSPEED / ((float) bit_rate * 16.0f) + 0.5f); + + *(pUART_LCR) |= DLAB; // Enable access to DLL and DLH registers + *(pUART_DLL) = divisor & 0xFF; + *(pUART_DLH) = divisor >> 8; + *(pUART_LCR) &= ~DLAB; // clear DLAB bit + + break; + + default: // baud rate not supported + break; + } + + return 0; +} + +void rt_hw_uart_init(void) +{ + // Apply UART configuration 8 bit data, No parity, 1 stop bit + *pUART_LCR = 0x0000; // Reset value + *pUART_LCR = WLS(8); + + // Ensure that Loopback mode is disabled by clearing LOOP_ENA bit + *pUART_MCR = 0x0000; //Reset value + + uart_set_bitrate(19200);// Set communication baudrate 115200 + + *pUART_IER = ERBFI; + + // Enable UART clock + *pUART_GCTL = UCEN; +} + +int uart_put_char(const char c) +{ + while (!(*pUART_LSR & THRE)) + { + /* wait */ + } + + *pUART_THR = c; + + return c; +} + +void rt_hw_console_output(const char *str) +{ + while (*str != '\0') + { + if (*str == '\n') + uart_put_char('\r'); + uart_put_char(*str++); + } +} + +EX_INTERRUPT_HANDLER(uart_rx_isr) +{ + rt_interrupt_enter(); + + rt_hw_serial_isr(&uart0_device); + + rt_interrupt_leave(); +} + +void rt_hw_isr_install(void) +{ + *pSIC_IWR = 0xFFFFFFFF; + *pSIC_IMASK = 0x00000000; + + *pSIC_IAR1 &= IVG_CLR(IAR1_DMA6_UARTRX_IVG); + *pSIC_IAR1 |= IVG_SET(IAR1_DMA6_UARTRX_IVG,ik_ivg9); + register_handler(ik_ivg9,uart_rx_isr); + *pSIC_IMASK |= DMA6_UART_RX_INT_MASK;/* ¿ªÖÐ¶Ï */ +} + +void rt_hw_board_init(void) +{ + rt_hw_pll_init(); + + rt_hw_ebiu_init(); + + rt_hw_exdram_init(); + + rt_hw_uart_init(); +} diff --git a/bsp/bf533/board.h b/bsp/bf533/board.h new file mode 100644 index 0000000000..01cbf6c954 --- /dev/null +++ b/bsp/bf533/board.h @@ -0,0 +1,94 @@ +/* + * File : board.h + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2012, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2012-02-13 mojingxian first version + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#define CLKIN 33333000LL +#define SPEED_MULTIPLE 16 +#define BUS_DIVISOR 4 +#define CCLKSPEED (CLKIN * SPEED_MULTIPLE) +#define SCLKSPEED (CLKIN * BUS_DIVISOR) +#define CLOCKS_PER_SECD CCLKSPEED +#define SCLOCKS_PER_SEC SCLKSPEED + +//SIC_IMASK¼Ä´æÆ÷ +#define PLL_WAKEUP_INT_MASK 0x00000001 +#define DMA_ERROR_INT_MASK 0x00000002 +#define PPI_ERROR_INT_MASK 0x00000004 +#define SPORT0_ERROR_INT_MASK 0x00000008 +#define SPORT1_ERROR_INT_MASK 0x00000010 +#define SPI_ERROR_INT_MASK 0x00000020 +#define UART_ERROR_INT_MASK 0x00000040 +#define RTC_INT_MASK 0x00000080 +#define DMA0_PPI_INT_MASK 0x00000100 +#define DMA1_SPORT0_RX_INT_MASK 0x00000200 +#define DMA2_SPORT0_TX_INT_MASK 0x00000400 +#define DMA3_SPORT1_RX_INT_MASK 0x00000800 +#define DMA4_SPORT1_TX_INT_MASK 0x00001000 +#define DMA5_SPI_INT_MASK 0x00002000 +#define DMA6_UART_RX_INT_MASK 0x00004000 +#define DMA7_UART_TX_INT_MASK 0x00008000 +#define TIMER0_INT_MASK 0x00010000 +#define TIMER1_INT_MASK 0x00020000 +#define TIMER2_INT_MASK 0x00040000 +#define PF_INTA_MASK 0x00080000 +#define PF_INTB_MASK 0x00100000 +#define MEM_DMA_STREAM0_MASK 0x00200000 +#define MEM_DMA_STREAM1_MASK 0x00400000 +#define SOFT_WATCHDOG_TMER_MASK 0x00800000 + +//SIC_IAR0 +#define IAR0_PLL_WAKEUP_INT_IVG 0x00 +#define IAR0_DMA_ERROR_INT_IVG 0x01 +#define IAR0_PPI_ERROR_INT_IVG 0x02 +#define IAR0_SPORT0_ERROR_INT_IVG 0x03 +#define IAR0_SPORT1_ERROR_INT_IVG 0x04 +#define IAR0_SPI_ERROR_INT_IVG 0x05 +#define IAR0_UART_ERROR_INT_IVG 0x06 +#define IAR0_RTC_INT_IVG 0x07 + +//SIC_IAR1 +#define IAR1_DMA0_PPI_INT_IVG 0x00 +#define IAR1_DMA1_SPORT0RX_IVG 0x01 +#define IAR1_DMA2_SPORT0TX_IVG 0x02 +#define IAR1_DMA3_SPORT1RX_IVG 0x03 +#define IAR1_DMA4_SPORT1TX_IVG 0x04 +#define IAR1_DMA5_SPI_INT_IVG 0x05 +#define IAR1_DMA6_UARTRX_IVG 0x06 +#define IAR1_DMA7_UARTTX_IVG 0x07 + +//SIC_IAR2 +#define IAR2_TIMER0_INT_IVG 0x00 +#define IAR2_TIMER1_INT_IVG 0x01 +#define IAR2_TIMER2_INT_IVG 0x02 +#define IAR2_PF_A_INT_IVG 0x03 +#define IAR2_PF_B_INT_IVG 0x04 +#define IAR2_MEM_DMA_STREAM0_INT_IVG 0x05 +#define IAR2_MEM_DMA_STREAM1_INT_IVG 0x06 +#define IAR2_SWATCHDOG_TIMER_INT_IVG 0x07 + +#ifdef __cplusplus +extern "C" { +#endif + +void rt_hw_core_timer_init(void); +void rt_hw_board_init(void); +void rt_hw_isr_install(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _BSP_H_ */ diff --git a/bsp/bf533/rtconfig.h b/bsp/bf533/rtconfig.h new file mode 100644 index 0000000000..def2b6272c --- /dev/null +++ b/bsp/bf533/rtconfig.h @@ -0,0 +1,243 @@ +/* RT-Thread config file */ +#ifndef __RTTHREAD_CFG_H__ +#define __RTTHREAD_CFG_H__ + +//add by mojingxian.defualt idle stack is too small. +#define IDLE_THREAD_STACK_SIZE 512 + +/* RT_NAME_MAX*/ +#define RT_NAME_MAX 32 + +/* RT_ALIGN_SIZE*/ +#define RT_ALIGN_SIZE 4 + +/* PRIORITY_MAX */ +#define RT_THREAD_PRIORITY_MAX 256 + +/* Tick per Second */ +#define RT_TICK_PER_SECOND 1000 + +/* SECTION: RT_DEBUG */ +/* Thread Debug */ +/* #define RT_DEBUG */ +/* #define RT_THREAD_DEBUG */ + +#define RT_USING_OVERFLOW_CHECK + +/* Using Hook */ +#define RT_USING_HOOK + +/* Using Software Timer */ +//#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 8 +#define RT_TIMER_THREAD_STACK_SIZE 512 +#define RT_TIMER_TICK_PER_SECOND 1000 + +/* SECTION: IPC */ +/* Using Semaphore */ +#define RT_USING_SEMAPHORE + +/* Using Mutex */ +#define RT_USING_MUTEX + +/* Using Event */ +#define RT_USING_EVENT + +/* Using MailBox */ +#define RT_USING_MAILBOX + +/* Using Message Queue */ +#define RT_USING_MESSAGEQUEUE + +/* SECTION: Memory Management */ +/* Using Memory Pool Management*/ +#define RT_USING_MEMPOOL + +/* Using Dynamic Heap Management */ +#define RT_USING_HEAP + +/* Using Small MM */ +#define RT_USING_SMALL_MEM + +/* Using SLAB Allocator */ +//#define RT_USING_SLAB + +/* SECTION: Device System */ +/* Using Device System */ +#define RT_USING_DEVICE + +/* Using Module System */ +//#define RT_USING_MODULE +#define RT_USING_LIBDL + +/* SECTION: Console options */ +#define RT_USING_CONSOLE + +/* the buffer size of console */ +#define RT_CONSOLEBUF_SIZE 128 + +/* SECTION: finsh, a C-Express shell */ +/* Using FinSH as Shell*/ +#define RT_USING_FINSH +/* Using symbol table */ +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_STACK_SIZE 1024 + +/* SECTION: a runtime libc library */ +/* a runtime libc library */ +//#define RT_USING_NEWLIB +//#define RT_USING_PTHREADS + +/* SECTION: C++ support */ +/* Using C++ support */ +/* #define RT_USING_CPLUSPLUS */ + +/* SECTION: Device filesystem support */ +/* using DFS support */ +//#define RT_USING_DFS +#define RT_USING_DFS_ELMFAT +/* use long file name feature */ +#define RT_DFS_ELM_USE_LFN 1 +/* the max number of file length */ +#define RT_DFS_ELM_MAX_LFN 128 +/* #define RT_USING_DFS_YAFFS2 */ +/* #define RT_USING_DFS_UFFS */ +#define RT_USING_DFS_DEVFS + +/* #define RT_USING_DFS_NFS */ +#define RT_NFS_HOST_EXPORT "192.168.1.5:/" + +#define DFS_USING_WORKDIR + +/* the max number of mounted filesystem */ +#define DFS_FILESYSTEMS_MAX 4 +/* the max number of opened files */ +#define DFS_FD_MAX 16 +/* the max number of cached sector */ +#define DFS_CACHE_MAX_NUM 4 + +/* Enable freemodbus protocal stack*/ +/* #define RT_USING_MODBUS */ + +/* SECTION: lwip, a lighwight TCP/IP protocol stack */ +/* Using lighweight TCP/IP protocol stack */ +/* #define RT_USING_LWIP */ +//#define RT_LWIP_DNS + +/* Trace LwIP protocol */ +/* #define RT_LWIP_DEBUG */ + +/* Enable ICMP protocol */ +#define RT_LWIP_ICMP + +/* Enable IGMP protocol */ +#define RT_LWIP_IGMP + +/* Enable UDP protocol */ +#define RT_LWIP_UDP + +/* Enable TCP protocol */ +#define RT_LWIP_TCP + +/* the number of simulatenously active TCP connections*/ +#define RT_LWIP_TCP_PCB_NUM 5 + +/* TCP sender buffer space */ +#define RT_LWIP_TCP_SND_BUF 1024*8 + +/* TCP receive window. */ +#define RT_LWIP_TCP_WND 1024*8 + +/* Enable SNMP protocol */ +/* #define RT_LWIP_SNMP */ + +/* Using DHCP */ +/* #define RT_LWIP_DHCP */ + +/* ip address of target */ +#define RT_LWIP_IPADDR0 192 +#define RT_LWIP_IPADDR1 168 +#define RT_LWIP_IPADDR2 1 +#define RT_LWIP_IPADDR3 30 + +/* gateway address of target */ +#define RT_LWIP_GWADDR0 192 +#define RT_LWIP_GWADDR1 168 +#define RT_LWIP_GWADDR2 1 +#define RT_LWIP_GWADDR3 1 + +/* mask address of target */ +#define RT_LWIP_MSKADDR0 255 +#define RT_LWIP_MSKADDR1 255 +#define RT_LWIP_MSKADDR2 255 +#define RT_LWIP_MSKADDR3 0 + +/* the number of blocks for pbuf */ +#define RT_LWIP_PBUF_NUM 16 + +/* the number of simultaneously queued TCP */ +#define RT_LWIP_TCP_SEG_NUM 40 + +/* thread priority of tcpip thread */ +#define RT_LWIP_TCPTHREAD_PRIORITY 128 + +/* mail box size of tcpip thread to wait for */ +#define RT_LWIP_TCPTHREAD_MBOX_SIZE 32 + +/* thread stack size of tcpip thread */ +#define RT_LWIP_TCPTHREAD_STACKSIZE 4096 + +/* thread priority of ethnetif thread */ +#define RT_LWIP_ETHTHREAD_PRIORITY 144 + +/* mail box size of ethnetif thread to wait for */ +#define RT_LWIP_ETHTHREAD_MBOX_SIZE 32 + +/* thread stack size of ethnetif thread */ +#define RT_LWIP_ETHTHREAD_STACKSIZE 1024 + +/* SECTION: RTGUI support */ +/* using RTGUI support */ +#define RT_USING_RTGUI + +/* name length of RTGUI object */ +#define RTGUI_NAME_MAX 16 +/* support 16 weight font */ +#define RTGUI_USING_FONT16 +/* support 16 weight font */ +#define RTGUI_USING_FONT12 +/* support Chinese font */ +#define RTGUI_USING_FONTHZ +/* use DFS as file interface */ +#define RTGUI_USING_DFS_FILERW +/* use font file as Chinese font */ +/* #define RTGUI_USING_HZ_FILE */ +/* use Chinese bitmap font */ +#define RTGUI_USING_HZ_BMP +/* use small size in RTGUI */ +/* #define RTGUI_USING_SMALL_SIZE */ +/* use mouse cursor */ +/* #define RTGUI_USING_MOUSE_CURSOR */ +/* RTGUI image options */ +//#define RTGUI_IMAGE_XPM +//#define RTGUI_IMAGE_JPEG +//#define RTGUI_IMAGE_PNG +//#define RTGUI_IMAGE_BMP + +/* SECTION: FTK support */ +/* using FTK support */ +/* #define RT_USING_FTK */ + +/* + * Note on FTK: + * + * FTK depends : + * #define RT_USING_NEWLIB + * #define DFS_USING_WORKDIR + * + * And the maximal length must great than 64 + * #define RT_DFS_ELM_MAX_LFN 128 + */ + +#endif diff --git a/bsp/bf533/startup.c b/bsp/bf533/startup.c new file mode 100644 index 0000000000..fd6dae9538 --- /dev/null +++ b/bsp/bf533/startup.c @@ -0,0 +1,102 @@ +/* + * File : startup.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2012, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2012-02-13 mojingxian first version + */ + +#include +#include +#include "application.h" +#include "board.h" +#include "serial.h" +#include "finsh.h" + +extern "asm" int rtt_heap_start; +extern "asm" int rtt_heap_end; +extern struct serial_device uart0; +extern struct rt_device uart0_device; + +void rtthread_startup(void) +{ + /* init hardware interrupt */ + rt_hw_interrupt_init(); + + /* init board */ + rt_hw_board_init(); + + /* show version */ + rt_show_version(); + + /* init tick */ + rt_system_tick_init(); + + /* init kernel object */ + rt_system_object_init(); + + /* init timer system */ + rt_system_timer_init(); + +#ifdef RT_USING_HEAP + rt_system_heap_init((void*)&rtt_heap_start, (void*)&rtt_heap_end); +#endif + +#ifdef RT_USING_MODULE + /* init module system*/ + rt_system_module_init(); +#endif + + /* init scheduler system */ + rt_system_scheduler_init(); + +#ifdef RT_USING_DEVICE + /* register uart0 */ + rt_hw_serial_register(&uart0_device, "uart0", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM, + &uart0); + + /* init all device */ + rt_device_init_all(); + + rt_console_set_device("uart0"); +#endif + + /* init application */ + rt_application_init(); + +#ifdef RT_USING_FINSH + /* init finsh */ + extern void finsh_system_init(void); + finsh_system_init(); + finsh_set_device("uart0"); +#endif + + rt_system_timer_thread_init(); + + /* init idle thread */ + rt_thread_idle_init(); + + /* start scheduler */ + rt_system_scheduler_start(); + + /* never reach here */ + return ; +} + +int main(void) +{ + /* disable interrupt first */ + rt_hw_interrupt_disable(); + + /* startup RT-Thread RTOS */ + rtthread_startup(); + + return 0; +} diff --git a/bsp/bf533/vdsp/bf533.dpj b/bsp/bf533/vdsp/bf533.dpj new file mode 100644 index 0000000000..5d0e8641e8 --- /dev/null +++ b/bsp/bf533/vdsp/bf533.dpj @@ -0,0 +1,740 @@ + + + + + ADSP-BF533 + .ldr + Loader file + + + + + .\Debug + .\Debug + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + .\Release + 12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bsp/bf533/vdsp/bf533.mak b/bsp/bf533/vdsp/bf533.mak new file mode 100644 index 0000000000..b87990da62 --- /dev/null +++ b/bsp/bf533/vdsp/bf533.mak @@ -0,0 +1,244 @@ +# Generated by the VisualDSP++ IDDE + +# Note: Any changes made to this Makefile will be lost the next time the +# matching project file is loaded into the IDDE. If you wish to preserve +# changes, rename this file and run it externally to the IDDE. + +# The syntax of this Makefile is such that GNU Make v3.77 or higher is +# required. + +# The current working directory should be the directory in which this +# Makefile resides. + +# Supported targets: +# bf533_Debug +# bf533_Debug_clean + +# Define this variable if you wish to run this Makefile on a host +# other than the host that created it and VisualDSP++ may be installed +# in a different directory. + +ADI_DSP=C:\Program Files (x86)\Analog Devices\VisualDSP 5.0 + + +# $VDSP is a gmake-friendly version of ADI_DIR + +empty:= +space:= $(empty) $(empty) +VDSP_INTERMEDIATE=$(subst \,/,$(ADI_DSP)) +VDSP=$(subst $(space),\$(space),$(VDSP_INTERMEDIATE)) + +RM=cmd /C del /F /Q + +# +# Begin "bf533_Debug" configuration +# + +ifeq ($(MAKECMDGOALS),bf533_Debug) + +bf533_Debug : ./Debug/bf533.ldr + +./Debug/application.doj :../application.c ../application.h ../board.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h + @echo "..\application.c" + $(VDSP)/ccblkfn.exe -c ..\application.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\application.doj -MM + +./Debug/bf533_basiccrt.doj :./bf533_basiccrt.s $(VDSP)/Blackfin/include/cplb.h $(VDSP)/Blackfin/include/defBF532.h $(VDSP)/Blackfin/include/defBF533.h $(VDSP)/Blackfin/include/def_LPBlackfin.h $(VDSP)/Blackfin/include/sys/_adi_platform.h $(VDSP)/Blackfin/include/sys/anomaly_macros_rtl.h $(VDSP)/Blackfin/include/sys/platform.h + @echo ".\bf533_basiccrt.s" + $(VDSP)/easmblkfn.exe .\bf533_basiccrt.s -proc ADSP-BF533 -file-attr ProjectName=bf533 -g -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -o .\Debug\bf533_basiccrt.doj -MM + +./Debug/bf533_heaptab.doj :bf533_heaptab.c + @echo ".\bf533_heaptab.c" + $(VDSP)/ccblkfn.exe -c .\bf533_heaptab.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\bf533_heaptab.doj -MM + +./Debug/board.doj :../board.c ../board.h ../rtconfig.h ../../../include/rtdef.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rthw.h ../../../include/rtthread.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../libcpu/blackfin/bf53x/serial.h $(VDSP)/Blackfin/include/signal.h $(VDSP)/Blackfin/include/sys/signal_bf.h $(VDSP)/Blackfin/include/sys/platform.h $(VDSP)/Blackfin/include/sys/_adi_platform.h $(VDSP)/Blackfin/include/cdefBF533.h $(VDSP)/Blackfin/include/cdefBF532.h $(VDSP)/Blackfin/include/defBF532.h $(VDSP)/Blackfin/include/def_LPBlackfin.h $(VDSP)/Blackfin/include/cdef_LPBlackfin.h $(VDSP)/Blackfin/include/ccblkfn.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/builtins.h $(VDSP)/Blackfin/include/sys/builtins_support.h $(VDSP)/Blackfin/include/fract_typedef.h $(VDSP)/Blackfin/include/fr2x16_typedef.h $(VDSP)/Blackfin/include/r2x16_typedef.h $(VDSP)/Blackfin/include/raw_typedef.h $(VDSP)/Blackfin/include/sys/anomaly_macros_rtl.h $(VDSP)/Blackfin/include/sys/mc_typedef.h $(VDSP)/Blackfin/include/sysreg.h $(VDSP)/Blackfin/include/string.h $(VDSP)/Blackfin/include/sys/exception.h $(VDSP)/Blackfin/include/stdio.h $(VDSP)/Blackfin/include/sys/stdio_bf.h + @echo "..\board.c" + $(VDSP)/ccblkfn.exe -c ..\board.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\board.doj -MM + +./Debug/clock.doj :../../../src/clock.c ../../../include/rthw.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h + @echo "..\..\..\src\clock.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\clock.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\clock.doj -MM + +./Debug/cmd.doj :../../../components/finsh/cmd.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../components/finsh/finsh.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h + @echo "..\..\..\components\finsh\cmd.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\cmd.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\cmd.doj -MM + +./Debug/context_vdsp.doj :../../../libcpu/blackfin/bf53x/context_vdsp.S + @echo "..\..\..\libcpu\blackfin\bf53x\context_vdsp.S" + $(VDSP)/easmblkfn.exe ..\..\..\libcpu\blackfin\bf53x\context_vdsp.S -proc ADSP-BF533 -file-attr ProjectName=bf533 -g -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -o .\Debug\context_vdsp.doj -MM + +./Debug/cpuport.doj :../../../libcpu/blackfin/bf53x/cpuport.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h + @echo "..\..\..\libcpu\blackfin\bf53x\cpuport.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\libcpu\blackfin\bf53x\cpuport.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\cpuport.doj -MM + +./Debug/device.doj :../../../src/device.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h + @echo "..\..\..\src\device.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\device.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\device.doj -MM + +./Debug/finsh_compiler.doj :../../../components/finsh/finsh_compiler.c ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h ../../../components/finsh/finsh_node.h ../../../components/finsh/finsh_error.h ../../../components/finsh/finsh_var.h ../../../components/finsh/finsh_ops.h ../../../components/finsh/finsh_vm.h + @echo "..\..\..\components\finsh\finsh_compiler.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\finsh_compiler.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\finsh_compiler.doj -MM + +./Debug/finsh_error.doj :../../../components/finsh/finsh_error.c ../../../components/finsh/finsh_error.h ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h + @echo "..\..\..\components\finsh\finsh_error.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\finsh_error.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\finsh_error.doj -MM + +./Debug/finsh_heap.doj :../../../components/finsh/finsh_heap.c ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h ../../../components/finsh/finsh_var.h + @echo "..\..\..\components\finsh\finsh_heap.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\finsh_heap.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\finsh_heap.doj -MM + +./Debug/finsh_init.doj :../../../components/finsh/finsh_init.c ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h ../../../components/finsh/finsh_node.h ../../../components/finsh/finsh_vm.h ../../../components/finsh/finsh_var.h ../../../components/finsh/finsh_parser.h ../../../components/finsh/finsh_error.h ../../../components/finsh/finsh_heap.h + @echo "..\..\..\components\finsh\finsh_init.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\finsh_init.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\finsh_init.doj -MM + +./Debug/finsh_node.doj :../../../components/finsh/finsh_node.c ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h ../../../components/finsh/finsh_node.h ../../../components/finsh/finsh_error.h ../../../components/finsh/finsh_var.h ../../../components/finsh/finsh_heap.h + @echo "..\..\..\components\finsh\finsh_node.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\finsh_node.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\finsh_node.doj -MM + +./Debug/finsh_ops.doj :../../../components/finsh/finsh_ops.c ../../../components/finsh/finsh_ops.h ../../../components/finsh/finsh_vm.h ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h ../../../components/finsh/finsh_var.h + @echo "..\..\..\components\finsh\finsh_ops.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\finsh_ops.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\finsh_ops.doj -MM + +./Debug/finsh_parser.doj :../../../components/finsh/finsh_parser.c ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h ../../../components/finsh/finsh_token.h ../../../components/finsh/finsh_node.h ../../../components/finsh/finsh_error.h ../../../components/finsh/finsh_parser.h ../../../components/finsh/finsh_var.h + @echo "..\..\..\components\finsh\finsh_parser.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\finsh_parser.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\finsh_parser.doj -MM + +./Debug/finsh_token.doj :../../../components/finsh/finsh_token.c ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h ../../../components/finsh/finsh_token.h ../../../components/finsh/finsh_error.h + @echo "..\..\..\components\finsh\finsh_token.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\finsh_token.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\finsh_token.doj -MM + +./Debug/finsh_var.doj :../../../components/finsh/finsh_var.c ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h ../../../components/finsh/finsh_var.h + @echo "..\..\..\components\finsh\finsh_var.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\finsh_var.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\finsh_var.doj -MM + +./Debug/finsh_vm.doj :../../../components/finsh/finsh_vm.c ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h ../../../components/finsh/finsh_vm.h ../../../components/finsh/finsh_var.h ../../../components/finsh/finsh_ops.h + @echo "..\..\..\components\finsh\finsh_vm.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\finsh_vm.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\finsh_vm.doj -MM + +./Debug/idle.doj :../../../src/idle.c ../../../include/rthw.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h + @echo "..\..\..\src\idle.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\idle.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\idle.doj -MM + +./Debug/ipc.doj :../../../src/ipc.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../include/rthw.h + @echo "..\..\..\src\ipc.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\ipc.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\ipc.doj -MM + +./Debug/irq.doj :../../../src/irq.c ../../../include/rthw.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h + @echo "..\..\..\src\irq.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\irq.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\irq.doj -MM + +./Debug/kservice.doj :../../../src/kservice.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../include/rthw.h + @echo "..\..\..\src\kservice.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\kservice.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\kservice.doj -MM + +./Debug/mem.doj :../../../src/mem.c ../../../include/rthw.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../components/finsh/finsh.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h + @echo "..\..\..\src\mem.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\mem.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\mem.doj -MM + +./Debug/mempool.doj :../../../src/mempool.c ../../../include/rthw.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h + @echo "..\..\..\src\mempool.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\mempool.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\mempool.doj -MM + +./Debug/module.doj :../../../src/module.c ../../../include/rthw.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../include/rtm.h $(VDSP)/Blackfin/include/string.h + @echo "..\..\..\src\module.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\module.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\module.doj -MM + +./Debug/object.doj :../../../src/object.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../include/rthw.h + @echo "..\..\..\src\object.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\object.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\object.doj -MM + +./Debug/rtm.doj :../../../src/rtm.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/assert.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h $(VDSP)/Blackfin/include/stdio.h $(VDSP)/Blackfin/include/sys/stdio_bf.h + @echo "..\..\..\src\rtm.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\rtm.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\rtm.doj -MM + +./Debug/scheduler.doj :../../../src/scheduler.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../include/rthw.h + @echo "..\..\..\src\scheduler.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\scheduler.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\scheduler.doj -MM + +./Debug/serial.doj :../../../libcpu/blackfin/bf53x/serial.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../libcpu/blackfin/bf53x/serial.h ../../../include/rthw.h + @echo "..\..\..\libcpu\blackfin\bf53x\serial.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\libcpu\blackfin\bf53x\serial.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\serial.doj -MM + +./Debug/shell.doj :../../../components/finsh/shell.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../include/rthw.h ../../../components/finsh/finsh.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h ../../../components/finsh/shell.h + @echo "..\..\..\components\finsh\shell.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\shell.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\shell.doj -MM + +./Debug/slab.doj :../../../src/slab.c ../../../include/rthw.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h + @echo "..\..\..\src\slab.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\slab.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\slab.doj -MM + +./Debug/startup.doj :../startup.c ../../../include/rthw.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../application.h ../board.h ../../../libcpu/blackfin/bf53x/serial.h ../../../components/finsh/finsh.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h + @echo "..\startup.c" + $(VDSP)/ccblkfn.exe -c ..\startup.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\startup.doj -MM + +./Debug/symbol.doj :../../../components/finsh/symbol.c ../../../components/finsh/finsh.h ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h $(VDSP)/Blackfin/include/ctype.h $(VDSP)/Blackfin/include/stdlib.h $(VDSP)/Blackfin/include/stdlib_bf.h $(VDSP)/Blackfin/include/string.h + @echo "..\..\..\components\finsh\symbol.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\components\finsh\symbol.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\symbol.doj -MM + +./Debug/thread.doj :../../../src/thread.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../include/rthw.h + @echo "..\..\..\src\thread.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\thread.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\thread.doj -MM + +./Debug/timer.doj :../../../src/timer.c ../../../include/rtthread.h ../../../include/rtdef.h ../rtconfig.h $(VDSP)/Blackfin/include/stdarg.h $(VDSP)/Blackfin/include/yvals.h ../../../include/rtdebug.h ../../../include/rtservice.h ../../../include/rthw.h + @echo "..\..\..\src\timer.c" + $(VDSP)/ccblkfn.exe -c ..\..\..\src\timer.c -file-attr ProjectName=bf533 -g -structs-do-not-overlap -no-multiline -I ../../../include -I ../ -I ../../../components/finsh -I ../../../libcpu/blackfin/bf53x -I ../../../src -double-size-64 -decls-strong -warn-protos -proc ADSP-BF533 -o .\Debug\timer.doj -MM + +./Debug/bf533.dxe :./bf533_ram.ldf ./Debug/bf533_basiccrt.doj $(VDSP)/Blackfin/lib/bf532_rev_0.5/libprofile532y.dlb ./Debug/application.doj ./Debug/bf533_heaptab.doj ./Debug/board.doj ./Debug/clock.doj ./Debug/cmd.doj ./Debug/context_vdsp.doj ./Debug/cpuport.doj ./Debug/device.doj ./Debug/finsh_compiler.doj ./Debug/finsh_error.doj ./Debug/finsh_heap.doj ./Debug/finsh_init.doj ./Debug/finsh_node.doj ./Debug/finsh_ops.doj ./Debug/finsh_parser.doj ./Debug/finsh_token.doj ./Debug/finsh_var.doj ./Debug/finsh_vm.doj ./Debug/idle.doj ./Debug/ipc.doj ./Debug/irq.doj ./Debug/kservice.doj ./Debug/mem.doj ./Debug/mempool.doj ./Debug/module.doj ./Debug/object.doj ./Debug/rtm.doj ./Debug/scheduler.doj ./Debug/serial.doj ./Debug/shell.doj ./Debug/slab.doj ./Debug/startup.doj ./Debug/symbol.doj ./Debug/thread.doj ./Debug/timer.doj $(VDSP)/Blackfin/lib/cplbtab533.doj $(VDSP)/Blackfin/lib/bf532_rev_0.5/crtn532y.doj $(VDSP)/Blackfin/lib/bf532_rev_0.5/libsmall532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/libio532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/libc532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/libevent532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/libx532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/libcpp532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/libcpprt532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/libf64ieee532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/libdsp532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/libsftflt532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/libetsi532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/Debug/libssl532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/Debug/libdrv532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/Debug/libusb532y.dlb $(VDSP)/Blackfin/lib/bf532_rev_0.5/idle532mty.doj $(VDSP)/Blackfin/lib/bf532_rev_0.5/librt_fileio532y.dlb + @echo "Linking..." + $(VDSP)/ccblkfn.exe .\Debug\application.doj .\Debug\bf533_basiccrt.doj .\Debug\bf533_heaptab.doj .\Debug\board.doj .\Debug\clock.doj .\Debug\cmd.doj .\Debug\context_vdsp.doj .\Debug\cpuport.doj .\Debug\device.doj .\Debug\finsh_compiler.doj .\Debug\finsh_error.doj .\Debug\finsh_heap.doj .\Debug\finsh_init.doj .\Debug\finsh_node.doj .\Debug\finsh_ops.doj .\Debug\finsh_parser.doj .\Debug\finsh_token.doj .\Debug\finsh_var.doj .\Debug\finsh_vm.doj .\Debug\idle.doj .\Debug\ipc.doj .\Debug\irq.doj .\Debug\kservice.doj .\Debug\mem.doj .\Debug\mempool.doj .\Debug\module.doj .\Debug\object.doj .\Debug\rtm.doj .\Debug\scheduler.doj .\Debug\serial.doj .\Debug\shell.doj .\Debug\slab.doj .\Debug\startup.doj .\Debug\symbol.doj .\Debug\thread.doj .\Debug\timer.doj -map .\Debug\bf533.map.xml -L .\Debug -flags-link -MDUSE_FILEIO,-MD__cplusplus,-MDUSER_CRT=ADI_QUOTEbf533_basiccrt.dojADI_QUOTE,-MDUSE_CACHE,-MDUSE_INSTRUCTION_CACHE -flags-link -e -add-debug-libpaths -flags-link -od,.\Debug -o .\Debug\bf533.dxe -proc ADSP-BF533 -flags-link -T,./bf533_ram.ldf -MM + +./Debug/bf533.ldr :./Debug/bf533.dxe + @echo "Creating loader file..." + $(VDSP)/elfloader.exe .\Debug\bf533.dxe -b Flash -f BINARY -Width 16 -init ./bf533_init.dxe -o .\Debug\bf533.ldr -proc ADSP-BF533 -MM + +endif + +ifeq ($(MAKECMDGOALS),bf533_Debug_clean) + +bf533_Debug_clean: + -$(RM) ".\Debug\application.doj" + -$(RM) ".\Debug\bf533_basiccrt.doj" + -$(RM) ".\Debug\bf533_heaptab.doj" + -$(RM) ".\Debug\board.doj" + -$(RM) ".\Debug\clock.doj" + -$(RM) ".\Debug\cmd.doj" + -$(RM) ".\Debug\context_vdsp.doj" + -$(RM) ".\Debug\cpuport.doj" + -$(RM) ".\Debug\device.doj" + -$(RM) ".\Debug\finsh_compiler.doj" + -$(RM) ".\Debug\finsh_error.doj" + -$(RM) ".\Debug\finsh_heap.doj" + -$(RM) ".\Debug\finsh_init.doj" + -$(RM) ".\Debug\finsh_node.doj" + -$(RM) ".\Debug\finsh_ops.doj" + -$(RM) ".\Debug\finsh_parser.doj" + -$(RM) ".\Debug\finsh_token.doj" + -$(RM) ".\Debug\finsh_var.doj" + -$(RM) ".\Debug\finsh_vm.doj" + -$(RM) ".\Debug\idle.doj" + -$(RM) ".\Debug\ipc.doj" + -$(RM) ".\Debug\irq.doj" + -$(RM) ".\Debug\kservice.doj" + -$(RM) ".\Debug\mem.doj" + -$(RM) ".\Debug\mempool.doj" + -$(RM) ".\Debug\module.doj" + -$(RM) ".\Debug\object.doj" + -$(RM) ".\Debug\rtm.doj" + -$(RM) ".\Debug\scheduler.doj" + -$(RM) ".\Debug\serial.doj" + -$(RM) ".\Debug\shell.doj" + -$(RM) ".\Debug\slab.doj" + -$(RM) ".\Debug\startup.doj" + -$(RM) ".\Debug\symbol.doj" + -$(RM) ".\Debug\thread.doj" + -$(RM) ".\Debug\timer.doj" + -$(RM) ".\Debug\bf533.dxe" + -$(RM) ".\Debug\bf533.ldr" + -$(RM) ".\Debug\*.ipa" + -$(RM) ".\Debug\*.opa" + -$(RM) ".\Debug\*.ti" + -$(RM) ".\Debug\*.pgi" + -$(RM) ".\*.rbld" + +endif + + diff --git a/bsp/bf533/vdsp/bf533.pcf b/bsp/bf533/vdsp/bf533.pcf new file mode 100644 index 0000000000000000000000000000000000000000..dbc0908871152439c52004df4f2468b2196c1963 GIT binary patch literal 48185 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 UanA(G`3~(~qv19Qgi##*e`GXLU;qFB literal 0 HcmV?d00001 diff --git a/bsp/bf533/vdsp/bf533_basiccrt.s b/bsp/bf533/vdsp/bf533_basiccrt.s new file mode 100644 index 0000000000..e48e71bfc6 --- /dev/null +++ b/bsp/bf533/vdsp/bf533_basiccrt.s @@ -0,0 +1,344 @@ +/* MANAGED-BY-SYSTEM-BUILDER */ +/* VisualDSP++ 5.0 Update 6 */ +/* CRT Printer version: 5.6.0.4 */ +/* crtgen.exe version: 5.6.0.4 */ +/* VDSG version: 5.6.0.4 */ + +/* +** bf533_basiccrt.s generated on May 08, 2012 at 10:55:43. +** +** Copyright (C) 2000-2008 Analog Devices Inc., All Rights Reserved. +** This contains Analog Devices Background IP and Development IP as +** defined in the ADI/Intel Collaboration Agreement. +** +** This file is generated automatically based upon the options selected +** in the Startup Code Wizard. Changes to the startup configuration +** should be made by changing the appropriate options rather than +** editing this file. Additional user code to be executed before calling +** main can be inserted between the labels .start_of_user_code1 and +** .end_of_user_code1 or .start_of_user_code2 and .end_of_user_code2. +** This code is preserved if the CRT is re-generated. +** +** Configuration:- +** product_name: VisualDSP++ 5.0 Update 6 +** processor: ADSP-BF533 +** si_revision: automatic +** cplb_init: true +** cplb_ctrl: ( +** CPLB_ENABLE_ICACHE +** CPLB_ENABLE_ICPLBS +** ) +** mem_init: false +** device_init: true +** init_regs: false +** zero_return_regs: false +** use_profiling: false +** use_vdk: false +** set_clock_and_power: false +** +*/ + +///////////////////////////////////////////////////////////////// +// blackfin-edinburgh-core +#include +#include + +///////////////////////////////////////////////////////////////// +// standard +#define IVBh (EVT0 >> 16) +#define IVBl (EVT0 & 0xFFFF) +#define UNASSIGNED_VAL 0x8181 +#define INTERRUPT_BITS 0x400 // just IVG15 +#define SYSCFG_VALUE 0x30 + + .section/DOUBLEANY program; + .file_attr requiredForROMBoot; + .align 2; + +start: + + +/*$VDSG */ +.start_of_user_code_very_beginning: + // Insert additional code to be executed before any other Startup Code here. + // This code is preserved if the CRT is re-generated. +.end_of_user_code_very_beginning: +/*$VDSG */ + +///////////////////////////////////////////////////////////////// +// blackfin-edinburgh-core +#if WA_05000109 + // Avoid Anomaly 05-00-0109 + R1 = SYSCFG_VALUE; + SYSCFG = R1; +#endif + +///////////////////////////////////////////////////////////////// +// standard +#if WA_05000229 + // Avoid Anomaly 05-00-0229: DMA5_CONFIG and SPI_CTL not cleared on reset. + R1 = 0x400; +#if defined(__ADSPBF538__) || defined(__ADSPBF539__) + P0.L = SPI0_CTL & 0xFFFF; + P0.H = SPI0_CTL >> 16; + W[P0] = R1.L; +#else + P0.L = SPI_CTL & 0xFFFF; + P0.H = SPI_CTL >> 16; + W[P0] = R1.L; +#endif + P0.L = DMA5_CONFIG & 0xFFFF; + P0.H = DMA5_CONFIG >> 16; + R1 = 0; + W[P0] = R1.L; +#endif + // Clear loop counters to disable hardware loops + R7 = 0; + LC0 = R7; + LC1 = R7; + + // Clear the DAG Length regs, to force linear addressing + L0 = R7; + L1 = R7; + L2 = R7; + L3 = R7; + + // Clear ITEST_COMMAND and DTEST_COMMAND registers + I0.L = (ITEST_COMMAND & 0xFFFF); + I0.H = (ITEST_COMMAND >> 16); + I1.L = (DTEST_COMMAND & 0xFFFF); + I1.H = (DTEST_COMMAND >> 16); + [I0] = R7; + [I1] = R7; + CSYNC; + + // Initialise the Event Vector table. + P0.H = IVBh; + P0.L = IVBl; + + // Install __unknown_exception_occurred in EVT so that + // there is defined behaviour. + P0 += 2*4; // Skip Emulation and Reset + P1 = 13; + R1.L = __unknown_exception_occurred; + R1.H = __unknown_exception_occurred; + LSETUP (.ivt,.ivt) LC0 = P1; +.ivt: [P0++] = R1; + + // Set IVG15's handler to be the start of the mode-change + // code. Then, before we return from the Reset back to user + // mode, we'll raise IVG15. This will mean we stay in supervisor + // mode, and continue from the mode-change point, but at a + // much lower priority. + P1.H = supervisor_mode; + P1.L = supervisor_mode; + [P0] = P1; + +///////////////////////////////////////////////////////////////// +// cplb-handler +#include "cplb.h" + P1.H = _cplb_hdr; + P1.L = _cplb_hdr; + [P0-48] = P1; // write exception handler +.extern _cplb_hdr; + + +///////////////////////////////////////////////////////////////// +// standard + // Initialise the stack. + // Note: this points just past the end of the section. + // First write should be with [--SP]. + SP.L=ldf_stack_end; + SP.H=ldf_stack_end; + usp = sp; + + // We're still in supervisor mode at the moment, so the FP + // needs to point to the supervisor stack. + FP = SP; + + // Make space for incoming "parameters" for functions + // we call from here: + SP += -12; + + R0 = INTERRUPT_BITS; + R0 <<= 5; // Bits 0-4 not settable. + CALL.X __install_default_handlers; + + R1 = SYSCFG; + R4 = R0; // Save modified list + BITSET(R1,1); + SYSCFG = R1; // Enable the cycle counter + +///////////////////////////////////////////////////////////////// +// blackfin-edinburgh-core +#if WA_05000137 + // Avoid Anomaly 02-00-0137 + // Set the port preferences of DAG0 and DAG1 to be + // different; this gives better performance when + // performing daul-dag operations on SDRAM. + P0.L = DMEM_CONTROL & 0xFFFF; + P0.H = DMEM_CONTROL >> 16; + R0 = [P0]; + BITSET(R0, 12); + BITCLR(R0, 13); + [P0] = R0; + CSYNC; +#endif + + +/*$VDSG */ +.start_of_user_code1: + // Insert additional code to be executed before main here. + // This code is preserved if the CRT is re-generated. +.end_of_user_code1: +/*$VDSG */ + +///////////////////////////////////////////////////////////////// +// cplb-init + // initialise the CPLBs if they're needed. This was not possible + // before we set up the stacks. + R0 = 81; // cplb_ctrl = 81 + CALL.X _cplb_init; +.extern _cplb_init; +.type _cplb_init,STT_FUNC; + + .section/DOUBLEANY data1; +___cplb_ctrl: + .align 4; + .byte4=81; +.global ___cplb_ctrl; +.type ___cplb_ctrl,STT_OBJECT; + .section/DOUBLEANY program; + .align 2; + +///////////////////////////////////////////////////////////////// +// standard + // Enable interrupts + STI R4; // Using the mask from default handlers + RAISE 15; + + // Move the processor into user mode. + P0.L=still_interrupt_in_ipend; + P0.H=still_interrupt_in_ipend; + RETI=P0; + NOP; // Purely to prevent a stall warning + +still_interrupt_in_ipend: + // execute RTI until we've `finished` servicing all + // interrupts of priority higher than IVG15. Normally one + // would expect to only have the reset interrupt in IPEND + // being serviced, but occasionally when debugging this may + // not be the case - if restart is hit when servicing an + // interrupt. + // + // When we clear all bits from IPEND, we'll enter user mode, + // then we'll automatically jump to supervisor_mode to start + // servicing IVG15 (which we will 'service' for the whole + // program, so that the program is in supervisor mode. + // Need to do this to 'finish' servicing the reset interupt. + RTI; + +supervisor_mode: + [--SP] = RETI; // re-enables the interrupt system + R0.L = UNASSIGNED_VAL; + R0.H = UNASSIGNED_VAL; + + // Push a RETS and Old FP onto the stack, for sanity. + [--SP]=R0; + [--SP]=R0; + // Make sure the FP is sensible. + FP = SP; + // Leave space for incoming "parameters" + SP += -12; + + +/*$VDSG */ +.start_of_user_code2: + // Insert additional code to be executed before device initialization here. + // This code is preserved if the CRT is re-generated. +.end_of_user_code2: +/*$VDSG */ + +///////////////////////////////////////////////////////////////// +// device-initialization + // initialise the devices known about for stdio. + CALL.X _init_devtab; +.extern _init_devtab; +.type _init_devtab,STT_FUNC; + +///////////////////////////////////////////////////////////////// +// cplusplus + CALL.X ___ctorloop; // run global scope C++ constructors +.extern ___ctorloop; +.type ___ctorloop,STT_FUNC; + + +/*$VDSG */ +.start_of_user_code3: + // Insert additional code to be executed before main here. + // This code is preserved if the CRT is re-generated. +.end_of_user_code3: +/*$VDSG */ + +///////////////////////////////////////////////////////////////// +// get-args + // Read command-line arguments. + CALL.X __getargv; + r1.l=__Argv; + r1.h=__Argv; + +.extern __getargv; +.type __getargv,STT_FUNC; +.extern __Argv; +.type __Argv,STT_OBJECT; + +///////////////////////////////////////////////////////////////// +// standard + // Call the application program. + CALL.X _main; + +///////////////////////////////////////////////////////////////// +// call-exit + CALL.X _exit; // passing in main's return value +.extern _exit; +.type _exit,STT_FUNC; + +///////////////////////////////////////////////////////////////// +// standard +.start.end: // Required by the linker to know the size of the routine + // that is needed for absolute placement. + +.global start; +.type start,STT_FUNC; +.global .start.end; +.type .start.end,STT_FUNC; +.extern _main; +.type _main,STT_FUNC; +.extern ldf_stack_end; +.extern __unknown_exception_occurred; +.type __unknown_exception_occurred,STT_FUNC; +.extern __install_default_handlers; +.type __install_default_handlers,STT_FUNC; + + +///////////////////////////////////////////////////////////////// +// cplusplus +.section/DOUBLEANY ctor; + .align 4; +___ctor_table: + .byte4=0; +.global ___ctor_table; +.type ___ctor_table,STT_OBJECT; +.section/DOUBLEANY .gdt; + .align 4; +___eh_gdt: +.global ___eh_gdt; + .byte4=0; +.type ___eh_gdt,STT_OBJECT; +.section/DOUBLEANY .frt; + .align 4; +___eh_frt: +.global ___eh_frt; + .byte4=0; +.type ___eh_frt,STT_OBJECT; + diff --git a/bsp/bf533/vdsp/bf533_heaptab.c b/bsp/bf533/vdsp/bf533_heaptab.c new file mode 100644 index 0000000000..d2364a8c74 --- /dev/null +++ b/bsp/bf533/vdsp/bf533_heaptab.c @@ -0,0 +1,85 @@ +/* MANAGED-BY-SYSTEM-BUILDER */ +/* VisualDSP++ 5.0 Update 6 */ +/* LDF Printer version: 5.6.0.4 */ +/* ldfgen.exe version: 5.6.0.4 */ +/* VDSG version: 5.6.0.4 */ + +/* +** User heap source file generated on Feb 23, 2012 at 09:38:46. +** +** Copyright (C) 2000-2008 Analog Devices Inc., All Rights Reserved. +** +** This file is generated automatically based upon the options selected +** in the LDF Wizard. Changes to the LDF configuration should be made by +** changing the appropriate options rather than editing this file. +** +** Configuration:- +** crt_doj: bf533_basiccrt.doj +** processor: ADSP-BF533 +** product_name: VisualDSP++ 5.0 Update 6 +** si_revision: 0.5 +** default_silicon_revision_from_archdef: 0.5 +** cplb_init_cplb_ctrl: 81 +** using_cplusplus: true +** mem_init: false +** use_vdk: false +** use_eh: true +** use_argv: false +** running_from_internal_memory: true +** user_heap_src_file: E:\eclipse\tq2440radio\bsp\bf533\vdsp\bf533_heaptab.c +** libraries_use_stdlib: true +** libraries_use_fileio_libs: false +** libraries_use_ieeefp_emulation_libs: false +** libraries_use_eh_enabled_libs: false +** system_heap: L1 +** system_heap_min_size: 1k +** system_stack: L1 +** system_stack_min_size: 1k +** use_sdram: false +** +*/ + + +#ifdef _MISRA_RULES +#pragma diag(push) +#pragma diag(suppress:misra_rule_1_1) +#pragma diag(suppress:misra_rule_2_2) +#pragma diag(suppress:misra_rule_6_3) +#pragma diag(suppress:misra_rule_8_10) +#pragma diag(suppress:misra_rule_10_1_a) +#pragma diag(suppress:misra_rule_11_3) +#pragma diag(suppress:misra_rule_12_7) +#endif /* _MISRA_RULES */ + + + +extern "asm" int ldf_heap_space; +extern "asm" int ldf_heap_length; + + +struct heap_table_t +{ + void *base; + unsigned long length; + long int userid; +}; + +#pragma file_attr("libData=HeapTable") +#pragma section("constdata") +struct heap_table_t heap_table[2] = +{ + + + { &ldf_heap_space, (int) &ldf_heap_length, 0 }, + + + { 0, 0, 0 } +}; + + + +#ifdef _MISRA_RULES +#pragma diag(pop) +#endif /* _MISRA_RULES */ + + diff --git a/bsp/bf533/vdsp/bf533_init.dxe b/bsp/bf533/vdsp/bf533_init.dxe new file mode 100644 index 0000000000000000000000000000000000000000..25e3d5af41454f58476324467305e2b4ccace0ed GIT binary patch literal 1608 zcmcgs%TE(w5TEH|EhTCzs8vvxgx5hfrKQAx5())v0#XX%Yo*!3wyd;UvbzwC2k;T1 z2MuPbkTu_QdL)~#LO)u44y`t$VNHlJ$Mqx)aOs%HVB5Jv+>Q58xx)5yytc`!AD?5038| zUd1cejTi9(p2tq?!pnFGW7t9M6~zed1t2(p{TP96ssotX5IsVTUszjQNvok6wa+S%cfKguXB=;H_(nMX?zWb8B-`(Z zy> */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME_MT(small532) + ,RT_LIB_NAME_MT(io532) + ,RT_LIB_NAME_MT(c532) + ,RT_LIB_NAME_MT(event532) + ,RT_LIB_NAME_MT(x532) + ,RT_LIB_NAME_EH_MT(cpp532) + ,RT_LIB_NAME_EH_MT(cpprt532) + ,RT_LIB_NAME(f64ieee532) + ,RT_LIB_NAME(dsp532) + ,RT_LIB_NAME(sftflt532) + ,RT_LIB_NAME(etsi532) + ,RT_LIB_NAME(ssl532) + ,RT_LIB_NAME(drv532) + ,RT_LIB_NAME(usb532) + ,RT_OBJ_NAME_MT(idle532) + ,RT_LIB_NAME_MT(rt_fileio532) + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJECTS = + "bf533_basiccrt.doj" + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + , RT_LIB_NAME(profile532) + , $COMMAND_LINE_OBJECTS + , "cplbtab533.doj" + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + , RT_OBJ_NAME(crtn532) + ; + +$OBJS_LIBS_INTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{prefersMem("internal")}, $LIBRARIES{prefersMem("internal")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_NOT_EXTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{!prefersMem("external")}, $LIBRARIES{!prefersMem("external")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + +/*$VDSG */ +/* This code is preserved if the LDF is re-generated. */ + + +#define ASYNC0_MEMTYPE RAM +#define ASYNC1_MEMTYPE RAM +#define ASYNC2_MEMTYPE RAM +#define ASYNC3_MEMTYPE RAM + + +/*$VDSG */ + + +MEMORY +{ +/* +** ADSP-BF533 MEMORY MAP. +** +** The known memory spaces are as follows: +** +** 0xFFE00000 - 0xFFFFFFFF Core MMR registers (2MB) +** 0xFFC00000 - 0xFFDFFFFF System MMR registers (2MB) +** 0xFFB01000 - 0xFFBFFFFF Reserved +** 0xFFB00000 - 0xFFB00FFF Scratch SRAM (4K) +** 0xFFA14000 - 0xFFAFFFFF Reserved +** 0xFFA10000 - 0xFFA13FFF Code SRAM / cache (16K) +** 0xFFA00000 - 0xFFA0FFFF Code SRAM (64K) +** 0xFF908000 - 0xFF9FFFFF Reserved +** 0xFF904000 - 0xFF907FFF Data Bank B SRAM / cache (16K) +** 0xFF900000 - 0xFF903FFF Data Bank B SRAM (16K) +** 0xFF808000 - 0xFF8FFFFF Reserved +** 0xFF804000 - 0xFF807FFF Data Bank A SRAM / cache (16K) +** 0xFF800000 - 0xFF803FFF Data Bank A SRAM (16K) +** 0xEF000000 - 0xFF7FFFFF Reserved +** 0x20400000 - 0xEEFFFFFF Reserved +** 0x20300000 - 0x203FFFFF ASYNC MEMORY BANK 3 (1MB) +** 0x20200000 - 0x202FFFFF ASYNC MEMORY BANK 2 (1MB) +** 0x20100000 - 0x201FFFFF ASYNC MEMORY BANK 1 (1MB) +** 0x20000000 - 0x200FFFFF ASYNC MEMORY BANK 0 (1MB) +** 0x00000000 - 0x07FFFFFF SDRAM MEMORY (16MB - 128MB) +*/ + + MEM_L1_SCRATCH { TYPE(RAM) START(0xFFB00000) END(0xFFB00FFF) WIDTH(8) } + MEM_L1_CODE_CACHE { TYPE(RAM) START(0xFFA10000) END(0xFFA13FFF) WIDTH(8) } + MEM_L1_CODE { TYPE(RAM) START(0xFFA00000) END(0xFFA0FFFF) WIDTH(8) } + MEM_L1_DATA_B { TYPE(RAM) START(0xFF900000) END(0xFF907FFF) WIDTH(8) } + MEM_L1_DATA_A { TYPE(RAM) START(0xFF800000) END(0xFF807FFF) WIDTH(8) } + MEM_ASYNC3 { TYPE(ASYNC3_MEMTYPE) START(0x20300000) END(0x203FFFFF) WIDTH(8) } + MEM_ASYNC2 { TYPE(ASYNC2_MEMTYPE) START(0x20200000) END(0x202FFFFF) WIDTH(8) } + MEM_ASYNC1 { TYPE(ASYNC1_MEMTYPE) START(0x20100000) END(0x201FFFFF) WIDTH(8) } + MEM_ASYNC0 { TYPE(ASYNC0_MEMTYPE) START(0x20000000) END(0x200FFFFF) WIDTH(8) } + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + +} /* MEMORY */ + +PROCESSOR p0 +{ + OUTPUT($COMMAND_LINE_OUTPUT_FILE) + RESOLVE(start, 0xFFA00000) + KEEP(start, _main) + KEEP_SECTIONS(FSymTab,VSymTab,RTMSymTab) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + SECTIONS + { + /* Workaround for hardware errata 05-00-0189 and 05-00-0310 - + ** "Speculative (and fetches made at boundary of reserved memory + ** space) for instruction or data fetches may cause false + ** protection exceptions" and "False hardware errors caused by + ** fetches at the boundary of reserved memory ". + ** + ** Done by avoiding use of 76 bytes from at the end of blocks + ** that are adjacent to reserved memory. Workaround is enabled + ** for appropriate silicon revisions (-si-revision switch). + */ + RESERVE(___wab0=MEMORY_END(MEM_L1_SCRATCH) - 75, ___l0 = 76) + RESERVE(___wab2=MEMORY_END(MEM_L1_CODE) - 75, ___l2 = 76) + RESERVE(___wab4=MEMORY_END(MEM_L1_DATA_B) - 75, ___l4 = 76) + RESERVE(___wab6=MEMORY_END(MEM_L1_DATA_A) - 75, ___l6 = 76) + RESERVE(___wab7=MEMORY_END(MEM_ASYNC3) - 75, ___l7 = 76) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + scratchpad NO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(L1_scratchpad) $LIBRARIES(L1_scratchpad)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_SCRATCH + + L1_code + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(L1_code) $LIBRARIES(L1_code)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(program)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(program)) + INPUT_SECTIONS($OBJECTS(program) $LIBRARIES(program)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE + + L1_code_cache + { + INPUT_SECTION_ALIGN(4) + ___l1_code_cache = 1; + } > MEM_L1_CODE_CACHE + + L1_data_a_1 + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_a = 0; + INPUT_SECTIONS($OBJECTS(L1_data_a) $LIBRARIES(L1_data_a)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length = 1024,4) + } > MEM_L1_DATA_A + + L1_data_a_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + } > MEM_L1_DATA_A + + L1_data_a_tables + { + INPUT_SECTION_ALIGN(4) + FORCE_CONTIGUITY + INPUT_SECTIONS($OBJECTS(vtbl) $LIBRARIES(vtbl)) + INPUT_SECTIONS($OBJECTS(ctor) $LIBRARIES(ctor)) + INPUT_SECTIONS($OBJECTS(ctorl) $LIBRARIES(ctorl)) + INPUT_SECTIONS($OBJECTS(.frt) $LIBRARIES(.frt)) + INPUT_SECTIONS($OBJECTS(.rtti) $LIBRARIES(.rtti)) + INPUT_SECTIONS($OBJECTS(.gdt) $LIBRARIES(.gdt)) + INPUT_SECTIONS($OBJECTS(.gdtl) $LIBRARIES(.gdtl)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt)) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht)) + } > MEM_L1_DATA_A + + L1_data_a + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + bsz_L1_data_a ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + } > MEM_L1_DATA_A + + L1_data_a_stack_heap + { + INPUT_SECTION_ALIGN(4) + RESERVE_EXPAND(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length , 0, 4) + ldf_stack_space = heaps_and_stack_in_L1_data_a; + ldf_stack_end = (ldf_stack_space + (heaps_and_stack_in_L1_data_a_length - 4)) & 0xfffffffc; + } > MEM_L1_DATA_A + + L1_data_b_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + } > MEM_L1_DATA_B + + L1_data_b + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_b = 0; + INPUT_SECTIONS($OBJECTS(L1_data_b) $LIBRARIES(L1_data_b)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_b, heaps_and_stack_in_L1_data_b_length = 1024,4) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt) ) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht) ) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_B + + bsz_L1_data_b ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + } > MEM_L1_DATA_B + + rt_thread_section + { + /* section information for finsh shell */ + INPUT_SECTION_ALIGN(4) + __fsymtab_start = .; + INPUT_SECTIONS($OBJECTS(FSymTab) $LIBRARIES(FSymTab)) + __fsymtab_end = .; + + INPUT_SECTION_ALIGN(4) + __vsymtab_start = .; + INPUT_SECTIONS($OBJECTS(VSymTab) $LIBRARIES(VSymTab)) + __vsymtab_end = .; + + /* section information for modules */ + INPUT_SECTION_ALIGN(4) + __rtmsymtab_start = .; + INPUT_SECTIONS($OBJECTS(RTMSymTab) $LIBRARIES(RTMSymTab)) + __rtmsymtab_end = .; + + RESERVE(heaps_in_L1_data_b_space, heaps_in_L1_data_b_length = 2048,4) + } > MEM_L1_DATA_B + + L1_data_b_stack_heap + { + INPUT_SECTION_ALIGN(4) + ldf_heap_space = heaps_and_stack_in_L1_data_b; + ldf_heap_end = (ldf_heap_space + (heaps_and_stack_in_L1_data_b_length - 4)) & 0xfffffffc; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + + RESERVE_EXPAND(heaps_in_L1_data_b_space, heaps_in_L1_data_b_length , 0, 4) + rtt_heap_start = heaps_in_L1_data_b_space; + rtt_heap_end = (heaps_in_L1_data_b_space + heaps_in_L1_data_b_length - 4) & 0xfffffffc; + rtt_heap_length = rtt_heap_end - rtt_heap_start; + } > MEM_L1_DATA_B + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } /* SECTIONS */ +} /* p0 */ + diff --git a/bsp/bf533/vdsp/bf533_sdram_64M.ldf b/bsp/bf533/vdsp/bf533_sdram_64M.ldf new file mode 100644 index 0000000000..4b23fbfaf6 --- /dev/null +++ b/bsp/bf533/vdsp/bf533_sdram_64M.ldf @@ -0,0 +1,486 @@ +/* MANAGED-BY-SYSTEM-BUILDER */ +/* VisualDSP++ 5.0 Update 6 */ +/* LDF Printer version: 5.6.0.4 */ +/* ldfgen.exe version: 5.6.0.4 */ +/* VDSG version: 5.6.0.4 */ + +/* +** ADSP-BF533 linker description file generated on Feb 22, 2012 at 14:26:29. +** +** Copyright (C) 2000-2008 Analog Devices Inc., All Rights Reserved. +** +** This file is generated automatically based upon the options selected +** in the LDF Wizard. Changes to the LDF configuration should be made by +** changing the appropriate options rather than editing this file. +** +** Configuration:- +** crt_doj: bf533_basiccrt.doj +** processor: ADSP-BF533 +** product_name: VisualDSP++ 5.0 Update 6 +** si_revision: automatic +** default_silicon_revision_from_archdef: 0.5 +** cplb_init_cplb_ctrl: ( +** CPLB_ENABLE_ICACHE +** CPLB_ENABLE_DCACHE +** CPLB_ENABLE_DCACHE2 +** CPLB_ENABLE_CPLBS +** CPLB_ENABLE_ICPLBS +** CPLB_ENABLE_DCPLBS +** ) +** using_cplusplus: true +** mem_init: false +** use_vdk: false +** use_eh: true +** use_argv: false +** running_from_internal_memory: true +** user_heap_src_file: E:\eclipse\3m_dsp\ARZ-3M3B-DSP_base26\rt-thread\bsp\bf533\vdsp\bf533_heaptab.c +** libraries_use_stdlib: true +** libraries_use_fileio_libs: false +** libraries_use_ieeefp_emulation_libs: false +** libraries_use_eh_enabled_libs: false +** system_heap: L1 +** system_heap_min_size: 1k +** system_stack: L1 +** system_stack_min_size: 1k +** use_sdram: true +** use_sdram_size: 64MB +** use_sdram_partitioned: none +** +*/ + +ARCHITECTURE(ADSP-BF533) + +SEARCH_DIR($ADI_DSP/Blackfin/lib) + + +// Workarounds are enabled, exceptions are disabled. +#define RT_LIB_NAME(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH(x) lib ## x ## y.dlb +#define RT_LIB_NAME_MT(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH_MT(x) lib ## x ## y.dlb +#define RT_OBJ_NAME(x) x ## y.doj +#define RT_OBJ_NAME_MT(x) x ## mty.doj + + +$LIBRARIES = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME_MT(small532) + ,RT_LIB_NAME_MT(io532) + ,RT_LIB_NAME_MT(c532) + ,RT_LIB_NAME_MT(event532) + ,RT_LIB_NAME_MT(x532) + ,RT_LIB_NAME_EH_MT(cpp532) + ,RT_LIB_NAME_EH_MT(cpprt532) + ,RT_LIB_NAME(f64ieee532) + ,RT_LIB_NAME(dsp532) + ,RT_LIB_NAME(sftflt532) + ,RT_LIB_NAME(etsi532) + ,RT_LIB_NAME(ssl532) + ,RT_LIB_NAME(drv532) + ,RT_LIB_NAME(usb532) + ,RT_OBJ_NAME_MT(idle532) + ,RT_LIB_NAME_MT(rt_fileio532) + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJECTS = + "bf533_basiccrt.doj" + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + , RT_LIB_NAME(profile532) + , $COMMAND_LINE_OBJECTS + , "cplbtab533.doj" + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + , RT_OBJ_NAME(crtn532) + ; + +$OBJS_LIBS_INTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{prefersMem("internal")}, $LIBRARIES{prefersMem("internal")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_NOT_EXTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{!prefersMem("external")}, $LIBRARIES{!prefersMem("external")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + +/*$VDSG */ +/* This code is preserved if the LDF is re-generated. */ + + +#define ASYNC0_MEMTYPE RAM +#define ASYNC1_MEMTYPE RAM +#define ASYNC2_MEMTYPE RAM +#define ASYNC3_MEMTYPE RAM + + +/*$VDSG */ + + +MEMORY +{ +/* +** ADSP-BF533 MEMORY MAP. +** +** The known memory spaces are as follows: +** +** 0xFFE00000 - 0xFFFFFFFF Core MMR registers (2MB) +** 0xFFC00000 - 0xFFDFFFFF System MMR registers (2MB) +** 0xFFB01000 - 0xFFBFFFFF Reserved +** 0xFFB00000 - 0xFFB00FFF Scratch SRAM (4K) +** 0xFFA14000 - 0xFFAFFFFF Reserved +** 0xFFA10000 - 0xFFA13FFF Code SRAM / cache (16K) +** 0xFFA00000 - 0xFFA0FFFF Code SRAM (64K) +** 0xFF908000 - 0xFF9FFFFF Reserved +** 0xFF904000 - 0xFF907FFF Data Bank B SRAM / cache (16K) +** 0xFF900000 - 0xFF903FFF Data Bank B SRAM (16K) +** 0xFF808000 - 0xFF8FFFFF Reserved +** 0xFF804000 - 0xFF807FFF Data Bank A SRAM / cache (16K) +** 0xFF800000 - 0xFF803FFF Data Bank A SRAM (16K) +** 0xEF000000 - 0xFF7FFFFF Reserved +** 0x20400000 - 0xEEFFFFFF Reserved +** 0x20300000 - 0x203FFFFF ASYNC MEMORY BANK 3 (1MB) +** 0x20200000 - 0x202FFFFF ASYNC MEMORY BANK 2 (1MB) +** 0x20100000 - 0x201FFFFF ASYNC MEMORY BANK 1 (1MB) +** 0x20000000 - 0x200FFFFF ASYNC MEMORY BANK 0 (1MB) +** 0x00000000 - 0x07FFFFFF SDRAM MEMORY (16MB - 128MB) +*/ + + MEM_L1_SCRATCH { TYPE(RAM) START(0xFFB00000) END(0xFFB00FFF) WIDTH(8) } + MEM_L1_CODE_CACHE { TYPE(RAM) START(0xFFA10000) END(0xFFA13FFF) WIDTH(8) } + MEM_L1_CODE { TYPE(RAM) START(0xFFA00000) END(0xFFA0FFFF) WIDTH(8) } + MEM_L1_DATA_B_CACHE { TYPE(RAM) START(0xFF904000) END(0xFF907FFF) WIDTH(8) } + MEM_L1_DATA_B { TYPE(RAM) START(0xFF900000) END(0xFF903FFF) WIDTH(8) } + MEM_L1_DATA_A_CACHE { TYPE(RAM) START(0xFF804000) END(0xFF807FFF) WIDTH(8) } + MEM_L1_DATA_A { TYPE(RAM) START(0xFF800000) END(0xFF803FFF) WIDTH(8) } + MEM_ASYNC3 { TYPE(ASYNC3_MEMTYPE) START(0x20300000) END(0x203FFFFF) WIDTH(8) } + MEM_ASYNC2 { TYPE(ASYNC2_MEMTYPE) START(0x20200000) END(0x202FFFFF) WIDTH(8) } + MEM_ASYNC1 { TYPE(ASYNC1_MEMTYPE) START(0x20100000) END(0x201FFFFF) WIDTH(8) } + MEM_ASYNC0 { TYPE(ASYNC0_MEMTYPE) START(0x20000000) END(0x200FFFFF) WIDTH(8) } + MEM_SDRAM0 { TYPE(RAM) START(0x00000004) END(0x03ffffff) WIDTH(8) } + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + +} /* MEMORY */ + +PROCESSOR p0 +{ + OUTPUT($COMMAND_LINE_OUTPUT_FILE) + RESOLVE(start, 0xFFA00000) + KEEP(start, _main) + KEEP_SECTIONS(FSymTab,VSymTab,RTMSymTab) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + SECTIONS + { + /* Workaround for hardware errata 05-00-0189 and 05-00-0310 - + ** "Speculative (and fetches made at boundary of reserved memory + ** space) for instruction or data fetches may cause false + ** protection exceptions" and "False hardware errors caused by + ** fetches at the boundary of reserved memory ". + ** + ** Done by avoiding use of 76 bytes from at the end of blocks + ** that are adjacent to reserved memory. Workaround is enabled + ** for appropriate silicon revisions (-si-revision switch). + */ + RESERVE(___wab0=MEMORY_END(MEM_L1_SCRATCH) - 75, ___l0 = 76) + RESERVE(___wab2=MEMORY_END(MEM_L1_CODE) - 75, ___l2 = 76) + RESERVE(___wab3=MEMORY_END(MEM_L1_DATA_B_CACHE) - 75, ___l3 = 76) + RESERVE(___wab5=MEMORY_END(MEM_L1_DATA_A_CACHE) - 75, ___l5 = 76) + RESERVE(___wab7=MEMORY_END(MEM_ASYNC3) - 75, ___l7 = 76) + RESERVE(___wab9=MEMORY_END(MEM_SDRAM0) - 75, ___l9 = 76) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + scratchpad NO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(L1_scratchpad) $LIBRARIES(L1_scratchpad)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_SCRATCH + + L1_code + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(L1_code) $LIBRARIES(L1_code)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(program)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(program)) + INPUT_SECTIONS($OBJECTS(program) $LIBRARIES(program)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE + + L1_code_cache + { + INPUT_SECTION_ALIGN(4) + ___l1_code_cache = 1; + } > MEM_L1_CODE_CACHE + + L1_data_a_1 + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(L1_data_a) $LIBRARIES(L1_data_a)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length = 1024,4) + } > MEM_L1_DATA_A + + L1_data_a_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + } > MEM_L1_DATA_A + + L1_data_a_tables + { + INPUT_SECTION_ALIGN(4) + FORCE_CONTIGUITY + INPUT_SECTIONS($OBJECTS(vtbl) $LIBRARIES(vtbl)) + INPUT_SECTIONS($OBJECTS(ctor) $LIBRARIES(ctor)) + INPUT_SECTIONS($OBJECTS(ctorl) $LIBRARIES(ctorl)) + INPUT_SECTIONS($OBJECTS(.frt) $LIBRARIES(.frt)) + INPUT_SECTIONS($OBJECTS(.rtti) $LIBRARIES(.rtti)) + INPUT_SECTIONS($OBJECTS(.gdt) $LIBRARIES(.gdt)) + INPUT_SECTIONS($OBJECTS(.gdtl) $LIBRARIES(.gdtl)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt)) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht)) + } > MEM_L1_DATA_A + + L1_data_a + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + bsz_L1_data_a ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + } > MEM_L1_DATA_A + + L1_data_a_stack_heap + { + INPUT_SECTION_ALIGN(4) + RESERVE_EXPAND(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length , 0, 4) + ldf_stack_space = heaps_and_stack_in_L1_data_a; + ldf_stack_end = (ldf_stack_space + (heaps_and_stack_in_L1_data_a_length - 4)) & 0xfffffffc; + } > MEM_L1_DATA_A + + L1_data_a_cache + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_a = 1; + } > MEM_L1_DATA_A_CACHE + + L1_data_b_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + } > MEM_L1_DATA_B + + L1_data_b + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(L1_data_b) $LIBRARIES(L1_data_b)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_b, heaps_and_stack_in_L1_data_b_length = 1024,4) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt) ) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht) ) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_B + + bsz_L1_data_b ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + } > MEM_L1_DATA_B + + L1_data_b_stack_heap + { + INPUT_SECTION_ALIGN(4) + RESERVE_EXPAND(heaps_and_stack_in_L1_data_b, heaps_and_stack_in_L1_data_b_length , 0, 4) + ldf_heap_space = heaps_and_stack_in_L1_data_b; + ldf_heap_end = (ldf_heap_space + (heaps_and_stack_in_L1_data_b_length - 4)) & 0xfffffffc; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + } > MEM_L1_DATA_B + + L1_data_b_cache + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_b = 1; + } > MEM_L1_DATA_B_CACHE + + sdram + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(sdram0) $LIBRARIES(sdram0)) + INPUT_SECTIONS($OBJECTS(sdram0_bank0) $LIBRARIES(sdram0_bank0)) + INPUT_SECTIONS($OBJECTS(sdram0_bank1) $LIBRARIES(sdram0_bank1)) + INPUT_SECTIONS($OBJECTS(sdram0_bank2) $LIBRARIES(sdram0_bank2)) + INPUT_SECTIONS($OBJECTS(sdram0_bank3) $LIBRARIES(sdram0_bank3)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS($OBJECTS(program) $LIBRARIES(program)) + INPUT_SECTIONS($OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt)) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_SDRAM0 + + bsz_sdram0 ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(sdram_bsz) $LIBRARIES(sdram_bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + } > MEM_SDRAM0 + + rt_thread_section + { + /* section information for finsh shell */ + INPUT_SECTION_ALIGN(4) + __fsymtab_start = .; + INPUT_SECTIONS($OBJECTS(FSymTab) $LIBRARIES(FSymTab)) + __fsymtab_end = .; + + INPUT_SECTION_ALIGN(4) + __vsymtab_start = .; + INPUT_SECTIONS($OBJECTS(VSymTab) $LIBRARIES(VSymTab)) + __vsymtab_end = .; + + /* section information for modules */ + INPUT_SECTION_ALIGN(4) + __rtmsymtab_start = .; + INPUT_SECTIONS($OBJECTS(RTMSymTab) $LIBRARIES(RTMSymTab)) + __rtmsymtab_end = .; + + RESERVE(heaps_in_sdram_space, heaps_in_sdram_length = 2048,4) + } > MEM_SDRAM0 + + sdram_stack_heap + { + RESERVE_EXPAND(heaps_in_sdram_space, heaps_in_sdram_length , 0, 4) + rtt_heap_start = heaps_in_sdram_space; + rtt_heap_end = (heaps_in_sdram_space + heaps_in_sdram_length - 32) & 0xfffffffc; + rtt_heap_length = rtt_heap_end - rtt_heap_start; + } > MEM_SDRAM0 + + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } /* SECTIONS */ +} /* p0 */ + diff --git a/bsp/bf533/vdsp/mine.dxe b/bsp/bf533/vdsp/mine.dxe new file mode 100644 index 0000000000000000000000000000000000000000..93ee3b9da2fd608d9382b01e59d56172c8e81183 GIT binary patch literal 157208 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 literal 0 HcmV?d00001 diff --git a/libcpu/blackfin/bf53x/context_vdsp.S b/libcpu/blackfin/bf53x/context_vdsp.S new file mode 100644 index 0000000000..b955d9ded7 --- /dev/null +++ b/libcpu/blackfin/bf53x/context_vdsp.S @@ -0,0 +1,165 @@ +/* + * File : context_vdsp.S + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2009 - 2012, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2012-02-13 mojingxian First version + */ + +.global _rt_hw_interrupt_disable; +.global _rt_hw_interrupt_enable; +.global _interrupt_thread_switch; + +.extern _rt_interrupt_from_thread; +.extern _rt_interrupt_to_thread; +.extern _rt_thread_switch_interrupt_flag; + +.section/DOUBLE64 program; + +/* + * rt_base_t rt_hw_interrupt_disable(); + * return value in R0. + */ +_rt_hw_interrupt_disable: + CLI R0; + +_rt_hw_interrupt_disable.end: + NOP; + NOP; + NOP; + RTS; + +/* + * void rt_hw_interrupt_enable(rt_base_t level); + * R0->level + */ +_rt_hw_interrupt_enable: + STI R0; + +_rt_hw_interrupt_enable.end: + NOP; + NOP; + NOP; + RTS; + +_interrupt_thread_switch: + /* Save context, interrupts disabled by IPEND[4] bit */ + [ -- SP ] = R0; + [ -- SP ] = P1; + [ -- SP ] = RETS; + [ -- SP ] = R1; + [ -- SP ] = R2; + [ -- SP ] = P0; + [ -- SP ] = P2; + [ -- SP ] = ASTAT; + R1 = RETI; /* IPEND[4] is currently set, globally disabling interrupts */ + /* IPEND[4] will stay set when RETI is saved through R1 */ + + [ -- SP ] = R1; + [ -- SP ] = (R7:3, P5:3); + [ -- SP ] = FP; + [ -- SP ] = I0; + [ -- SP ] = I1; + [ -- SP ] = I2; + [ -- SP ] = I3; + [ -- SP ] = B0; + [ -- SP ] = B1; + [ -- SP ] = B2; + [ -- SP ] = B3; + [ -- SP ] = L0; + [ -- SP ] = L1; + [ -- SP ] = L2; + [ -- SP ] = L3; + [ -- SP ] = M0; + [ -- SP ] = M1; + [ -- SP ] = M2; + [ -- SP ] = M3; + R1.L = A0.x; + [ -- SP ] = R1; + R1 = A0.w; + [ -- SP ] = R1; + R1.L = A1.x; + [ -- SP ] = R1; + R1 = A1.w; + [ -- SP ] = R1; + [ -- SP ] = LC0; + R3 = 0; + LC0 = R3; + [ -- SP ] = LC1; + R3 = 0; + LC1 = R3; + [ -- SP ] = LT0; + [ -- SP ] = LT1; + [ -- SP ] = LB0; + [ -- SP ] = LB1; + + /* Context save done so save SP in the TCB */ + P1.h = _rt_interrupt_from_thread; + P1.l = _rt_interrupt_from_thread; + P2 = [ P1 ]; + [ P2 ] = SP; + + /* clear rt_thread_switch_interrupt_flag to 0 */ + P1.h = _rt_thread_switch_interrupt_flag; + P1.l = _rt_thread_switch_interrupt_flag; + R0 = 0; + [ P1 ] = R0; + + /* Get a pointer to the high ready task's TCB */ + P1.h = _rt_interrupt_to_thread; + P1.l = _rt_interrupt_to_thread; + P2 = [ P1 ]; + SP = [ P2 ]; + + /* Restoring CPU context and return to task */ + LB1 = [ SP ++ ]; + LB0 = [ SP ++ ]; + LT1 = [ SP ++ ]; + LT0 = [ SP ++ ]; + LC1 = [ SP ++ ]; + LC0 = [ SP ++ ]; + R0 = [ SP ++ ]; + A1 = R0; + R0 = [ SP ++ ]; + A1.x = R0.L; + R0 = [ SP ++ ]; + A0 = R0; + R0 = [ SP ++ ]; + A0.x = R0.L; + M3 = [ SP ++ ]; + M2 = [ SP ++ ]; + M1 = [ SP ++ ]; + M0 = [ SP ++ ]; + L3 = [ SP ++ ]; + L2 = [ SP ++ ]; + L1 = [ SP ++ ]; + L0 = [ SP ++ ]; + B3 = [ SP ++ ]; + B2 = [ SP ++ ]; + B1 = [ SP ++ ]; + B0 = [ SP ++ ]; + I3 = [ SP ++ ]; + I2 = [ SP ++ ]; + I1 = [ SP ++ ]; + I0 = [ SP ++ ]; + FP = [ SP ++ ]; + (R7:3, P5:3) = [ SP ++ ]; + RETI = [ SP ++ ]; /* IPEND[4] will stay set when RETI popped from stack */ + ASTAT = [ SP ++ ]; + P2 = [ SP ++ ]; + P0 = [ SP ++ ]; + R2 = [ SP ++ ]; + R1 = [ SP ++ ]; + RETS = [ SP ++ ]; + P1 = [ SP ++ ]; + R0 = [ SP ++ ]; + +_interrupt_thread_switch.end: + RTI; + diff --git a/libcpu/blackfin/bf53x/cpuport.c b/libcpu/blackfin/bf53x/cpuport.c new file mode 100644 index 0000000000..91cfaeb403 --- /dev/null +++ b/libcpu/blackfin/bf53x/cpuport.c @@ -0,0 +1,93 @@ +/* + * File : cpuport.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2012, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2012-02-13 mojingxian first version + */ + +#include + +/* flag in interrupt handling */ +rt_uint32_t rt_interrupt_from_thread; +rt_uint32_t rt_interrupt_to_thread; +rt_uint32_t rt_thread_switch_interrupt_flag; + +/** + * initializes stack of thread + */ +rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, + rt_uint8_t *stack_addr, void *texit) +{ + unsigned char i; + unsigned long *stk; + + stk = (unsigned long *)stack_addr; /* Load stack pointer */ + + /* Simulate a function call to the task with an argument */ + stk -= 3; /* 3 words assigned for incoming args (R0, R1, R2) */ + + /* Now simulating vectoring to an ISR */ + *--stk = (unsigned long)parameter; /* R0 value - caller's incoming argument #1 */ + *--stk = (unsigned long)0; /* P1 value - value irrelevant */ + + *--stk = (unsigned long)texit; /* RETS value - NO task should return with RTS. */ + /* however OS_CPU_Invalid_Task_Return is a safety */ + /* catch-allfor tasks that return with an RTS */ + + *--stk = (unsigned long)parameter; /* R1 value - caller's incoming argument #2 */ + /* (not relevant in current test example) */ + *--stk = (unsigned long)parameter; /* R2 value - caller's incoming argument #3 */ + /* (not relevant in current test example) */ + *--stk = (unsigned long)0; /* P0 value - value irrelevant */ + *--stk = (unsigned long)0; /* P2 value - value irrelevant */ + *--stk = (unsigned long)0; /* ASTAT value - caller's ASTAT value - value */ + /* irrelevant */ + + *--stk = (unsigned long)tentry; /* RETI value- pushing the start address of the task */ + + for (i = 0; i < 35; i++) /* remaining reg values - R7:3, P5:3, */ + { /* 4 words of A1:0(.W,.X), LT0, LT1, */ + *--stk = (unsigned long)0; /* LC0, LC1, LB0, LB1,I3:0, M3:0, L3:0, B3:0, */ + } /* All values irrelevant */ + + return (rt_uint8_t *)stk; /* Return top-of-stack */ +} + +void rt_hw_context_switch(rt_uint32_t from, rt_uint32_t to) +{ + if (rt_thread_switch_interrupt_flag != 1) + { + rt_thread_switch_interrupt_flag = 1; + rt_interrupt_from_thread = from; + } + + rt_interrupt_to_thread = to; + asm("raise 14;"); // Raise Interrupt 14 (trap) +} + +void rt_hw_context_switch_interrupt(rt_uint32_t from, rt_uint32_t to) +{ + if (rt_thread_switch_interrupt_flag != 1) + { + rt_thread_switch_interrupt_flag = 1; + rt_interrupt_from_thread = from; + } + + rt_interrupt_to_thread = to; + asm("raise 14;"); // Raise Interrupt 14 (trap) +} + +void rt_hw_context_switch_to(rt_uint32_t to) +{ + rt_thread_switch_interrupt_flag = 1; + rt_interrupt_from_thread = 0; + rt_interrupt_to_thread = to; + asm("raise 14;"); // Raise Interrupt 14 (trap) +} diff --git a/libcpu/blackfin/bf53x/serial.c b/libcpu/blackfin/bf53x/serial.c new file mode 100644 index 0000000000..e5547fb887 --- /dev/null +++ b/libcpu/blackfin/bf53x/serial.c @@ -0,0 +1,284 @@ +/* + * File : serial.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://openlab.rt-thread.com/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2006-03-13 Bernard first version + * 2009-04-20 yi.qiu modified according bernard's stm32 version + * 2012-02-17 mojingxian modified for bf53x + */ + +#include + +#include "serial.h" + +/** + * @addtogroup BF53X + */ +/*@{*/ + +/* RT-Thread Device Interface */ +/** + * This function initializes serial + */ +static rt_err_t rt_serial_init (rt_device_t dev) +{ + struct serial_device* uart = (struct serial_device*) dev->user_data; + + if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED)) + { + + if (dev->flag & RT_DEVICE_FLAG_INT_RX) + { + rt_memset(uart->int_rx->rx_buffer, 0, + sizeof(uart->int_rx->rx_buffer)); + uart->int_rx->read_index = uart->int_rx->save_index = 0; + } + + if (dev->flag & RT_DEVICE_FLAG_INT_TX) + { + rt_memset(uart->int_tx->tx_buffer, 0, + sizeof(uart->int_tx->tx_buffer)); + uart->int_tx->write_index = uart->int_tx->save_index = 0; + } + + dev->flag |= RT_DEVICE_FLAG_ACTIVATED; + } + + return RT_EOK; +} + +/* save a char to serial buffer */ +static void rt_serial_savechar(struct serial_device* uart, char ch) +{ + rt_base_t level; + + /* disable interrupt */ + level = rt_hw_interrupt_disable(); + + uart->int_rx->rx_buffer[uart->int_rx->save_index] = ch; + uart->int_rx->save_index ++; + if (uart->int_rx->save_index >= UART_RX_BUFFER_SIZE) + uart->int_rx->save_index = 0; + + /* if the next position is read index, discard this 'read char' */ + if (uart->int_rx->save_index == uart->int_rx->read_index) + { + uart->int_rx->read_index ++; + if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE) + uart->int_rx->read_index = 0; + } + + /* enable interrupt */ + rt_hw_interrupt_enable(level); +} + +static rt_err_t rt_serial_open(rt_device_t dev, rt_uint16_t oflag) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_err_t rt_serial_close(rt_device_t dev) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_size_t rt_serial_read (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) +{ + rt_uint8_t* ptr; + rt_err_t err_code; + struct serial_device* uart; + + ptr = buffer; + err_code = RT_EOK; + uart = (struct serial_device*)dev->user_data; + + if (dev->flag & RT_DEVICE_FLAG_INT_RX) + { + rt_base_t level; + + /* interrupt mode Rx */ + while (size) + { + if (uart->int_rx->read_index != uart->int_rx->save_index) + { + *ptr++ = uart->int_rx->rx_buffer[uart->int_rx->read_index]; + size --; + + /* disable interrupt */ + level = rt_hw_interrupt_disable(); + + uart->int_rx->read_index ++; + if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE) + uart->int_rx->read_index = 0; + + /* enable interrupt */ + rt_hw_interrupt_enable(level); + } + else + { + /* set error code */ + err_code = -RT_EEMPTY; + break; + } + } + } + else + { + /* polling mode */ + while ((rt_uint32_t)ptr - (rt_uint32_t)buffer < size) + { + //while (uart->uart_device->ustat & USTAT_RCV_READY) + { + *ptr = uart->uart_device->rbr_thr & 0xff; + ptr ++; + } + } + } + + /* set error code */ + rt_set_errno(err_code); + return (rt_uint32_t)ptr - (rt_uint32_t)buffer; +} + +static rt_size_t rt_serial_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) +{ + rt_uint8_t* ptr; + rt_err_t err_code; + struct serial_device* uart; + + err_code = RT_EOK; + ptr = (rt_uint8_t*)buffer; + uart = (struct serial_device*)dev->user_data; + + if (dev->flag & RT_DEVICE_FLAG_INT_TX) + { + /* interrupt mode Tx */ + while (uart->int_tx->save_index != uart->int_tx->write_index) + { + /* save on tx buffer */ + uart->int_tx->tx_buffer[uart->int_tx->save_index] = *ptr++; + + -- size; + + /* move to next position */ + uart->int_tx->save_index ++; + + /* wrap save index */ + if (uart->int_tx->save_index >= UART_TX_BUFFER_SIZE) + uart->int_tx->save_index = 0; + } + + /* set error code */ + if (size > 0) + err_code = -RT_EFULL; + } + else + { + /* polling mode */ + while (size) + { + /* + * to be polite with serial console add a line feed + * to the carriage return character + */ + if (*ptr == '\n' && (dev->flag & RT_DEVICE_FLAG_STREAM)) + { + while (!(uart->uart_device->lsr & 0x20)); + uart->uart_device->rbr_thr = '\r'; + } + + while (!(uart->uart_device->lsr & 0x20)); + uart->uart_device->rbr_thr = (*ptr & 0xFF); + + ++ptr; --size; + } + } + + /* set error code */ + rt_set_errno(err_code); + + return (rt_uint32_t)ptr - (rt_uint32_t)buffer; +} + +static rt_err_t rt_serial_control (rt_device_t dev, rt_uint8_t cmd, void *args) +{ + RT_ASSERT(dev != RT_NULL); + + switch (cmd) + { + case RT_DEVICE_CTRL_SUSPEND: + /* suspend device */ + dev->flag |= RT_DEVICE_FLAG_SUSPENDED; + break; + + case RT_DEVICE_CTRL_RESUME: + /* resume device */ + dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED; + break; + } + + return RT_EOK; +} + +/* + * serial register + */ +rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct serial_device *serial) +{ + RT_ASSERT(device != RT_NULL); + + device->type = RT_Device_Class_Char; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + device->init = rt_serial_init; + device->open = rt_serial_open; + device->close = rt_serial_close; + device->read = rt_serial_read; + device->write = rt_serial_write; + device->control = rt_serial_control; + device->user_data = serial; + + /* register a character device */ + return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag); +} + +/* ISR for serial interrupt */ +void rt_hw_serial_isr(rt_device_t device) +{ + struct serial_device* uart = (struct serial_device*) device->user_data; + + /* interrupt mode receive */ + RT_ASSERT(device->flag & RT_DEVICE_FLAG_INT_RX); + + /* save on rx buffer */ + //while (uart->uart_device->ustat & USTAT_RCV_READY) + { + rt_serial_savechar(uart, uart->uart_device->rbr_thr & 0xff); + } + + /* invoke callback */ + if (device->rx_indicate != RT_NULL) + { + rt_size_t rx_length; + + /* get rx length */ + rx_length = uart->int_rx->read_index > uart->int_rx->save_index ? + UART_RX_BUFFER_SIZE - uart->int_rx->read_index + uart->int_rx->save_index : + uart->int_rx->save_index - uart->int_rx->read_index; + + device->rx_indicate(device, rx_length); + } +} + +/*@}*/ diff --git a/libcpu/blackfin/bf53x/serial.h b/libcpu/blackfin/bf53x/serial.h new file mode 100644 index 0000000000..8eef14546b --- /dev/null +++ b/libcpu/blackfin/bf53x/serial.h @@ -0,0 +1,56 @@ +#ifndef __RT_HW_SERIAL_H__ +#define __RT_HW_SERIAL_H__ + +#include +#include + +#define USTAT_RCV_READY 0x01 /* receive data ready */ +#define USTAT_TXB_EMPTY 0x02 /* tx buffer empty */ +#define BPS 115200 /* serial baudrate */ + +#define UART_RX_BUFFER_SIZE 64 +#define UART_TX_BUFFER_SIZE 64 + +struct serial_int_rx +{ + rt_uint8_t rx_buffer[UART_RX_BUFFER_SIZE]; + rt_uint32_t read_index, save_index; +}; + +struct serial_int_tx +{ + rt_uint8_t tx_buffer[UART_TX_BUFFER_SIZE]; + rt_uint32_t write_index, save_index; +}; + +typedef struct uartport +{ + volatile rt_uint16_t rbr_thr; //receive buffer register and transmit hold register + volatile rt_uint16_t reserved0; + volatile rt_uint16_t reserved1; + volatile rt_uint16_t reserved2; + volatile rt_uint16_t reserved3; + volatile rt_uint16_t reserved4; + volatile rt_uint16_t reserved5; + volatile rt_uint16_t reserved6; + volatile rt_uint16_t reserved7; + volatile rt_uint16_t reserved8; + volatile rt_uint16_t lsr; //line status register +}uartport; + +struct serial_device +{ + uartport* uart_device; + + /* rx structure */ + struct serial_int_rx* int_rx; + + /* tx structure */ + struct serial_int_tx* int_tx; +}; + +rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct serial_device *serial); + +void rt_hw_serial_isr(rt_device_t device); + +#endif