/*****************************************************************************/ /* BOOT.C v4.00 - Initialize the C60 C runtime environment */ /* Copyright (c) 1993-2000 Texas Instruments Incorporated */ /*****************************************************************************/ extern far void main(); /* CALL TO main IS FAR */ extern void exit(), _auto_init(); /* OTHER CALLS ARE NEAR */ /*---------------------------------------------------------------------------*/ /* ALLOCATE THE MEMORY FOR THE SYSTEM STACK. THIS SECTION WILL BE SIZED */ /* BY THE LINKER. */ /*---------------------------------------------------------------------------*/ asm(" .global __STACK_SIZE"); asm(" .global __stack"); asm("__stack: .usect .stack, 0, 8"); /*****************************************************************************/ /* C_INT00() - C ENVIRONMENT ENTRY POINT */ /*****************************************************************************/ #pragma CODE_SECTION(c_int00, "icode"); extern void interrupt c_int00() { /*------------------------------------------------------------------------*/ /* SET UP THE STACK POINTER IN B15. */ /* THE STACK POINTER POINTS 1 WORD PAST THE TOP OF THE STACK, SO SUBTRACT */ /* 1 WORD FROM THE SIZE. */ /*------------------------------------------------------------------------*/ asm(" mvkl __stack,SP"); asm(" mvkh __stack,SP"); asm(" mvkl __STACK_SIZE - 4,B0"); asm(" mvkh __STACK_SIZE - 4,B0"); asm(" add B0,SP,SP"); /*------------------------------------------------------------------------*/ /* THE SP MUST BE ALIGNED ON AN 8-BYTE BOUNDARY. */ /*------------------------------------------------------------------------*/ asm(" and ~7,SP,SP"); /*------------------------------------------------------------------------*/ /* Initialize the EMIF here, to allow auto_init to initialize external */ /* memory. See the Peripherals Ref. Guide for discussion of the various */ /* registers' fields. The values here match the output of the initEmif */ /* routine, which now serves as a reference. */ /*------------------------------------------------------------------------*/ #if (defined(I_AM_MASTER_DSP)) asm(" mvkl 0x01800000, a9"); //Base location of EMIF registers. asm(" mvkh 0x01800000, a9"); //See the Peripherals Reference Guide. //asm(" mvkl 0x80008000, a9"); //test //asm(" mvkh 0x80008000, a9"); asm(" mvkl 0x00000040, a7"); //Global ctrl reg. initialization. asm(" mvkh 0x00000040, a7"); asm(" stw a7, *+a9[0]"); asm(" mvkl 0x17ff1f23, a7"); //CE0 ctrl reg. asm(" mvkh 0x17ff1f23, a7"); asm(" stw a7, *+a9[2]"); asm(" mvkl 0xffff3f03, a7"); //CE1 ctrl reg. asm(" mvkh 0xffff3f03, a7"); asm(" stw a7, *+a9[1]"); asm(" mvkl 0xffff3f33, a7"); //CE2/3 ctrl reg. asm(" mvkh 0xffff3f33, a7"); asm(" stw a7, *+a9[4]"); asm(" stw a7, *+a9[5]"); asm(" mvkl 0x0644c000, a8"); //SDRAM ctrl. w/o initialization (bit 24) asm(" mvkh 0x0644c000, a8"); asm(" stw a8, *+a9[6]"); asm(" mvkl 0x00000400, a7"); //SDRAM timing reg. asm(" stw a7, *+a9[7]"); asm(" set a8, 24, 24, a8"); //Set Initialization bit. asm(" stw a8, *+a9[6]"); #endif /*------------------------------------------------------------------------*/ /* dpsf: Mark the stack. */ /*------------------------------------------------------------------------*/ asm(" mvkl 0x00c0ffee, a7"); asm(" mvkh 0x00c0ffee, a7"); asm(" mvkl __stack, a8"); asm(" mvkh __stack, a8"); asm(" mv SP, a9"); asm("coffee:"); asm(" cmplt a8, a9, a1"); asm(" [a1] b coffee"); asm(" stw a7, *a9--"); asm(" nop 4"); /*------------------------------------------------------------------------*/ /* SET UP THE GLOBAL PAGE POINTER IN B14. */ /*------------------------------------------------------------------------*/ asm(" .global $bss"); asm(" mvkl $bss,DP"); asm(" mvkh $bss,DP"); /*------------------------------------------------------------------------*/ /* SET UP FLOATING POINT REGISTERS FOR C70 ONLY */ /*------------------------------------------------------------------------*/ #ifdef _TMS320C6700 asm(" mvk 0,B3"); /* round to nearest */ asm(" mvc B3,FADCR"); asm(" mvc B3,FMCR"); #endif /*------------------------------------------------------------------------*/ /* GET THE POINTER TO THE AUTOINITIALIZATION TABLES INTO THE FIRST */ /* ARGUMENT REGISTER (A4) */ /*------------------------------------------------------------------------*/ asm(" .global cinit"); asm(" mvkl cinit,A4"); asm(" mvkh cinit,A4"); /*------------------------------------------------------------------------*/ /* PASS THE CURRENT DP TO THE AUTOINITIALIZATION ROUTINE. */ /*------------------------------------------------------------------------*/ asm(" mv DP,B4"); /*------------------------------------------------------------------------*/ /* CALL THE AUTOINITIALIZATION ROUTINE. */ /*------------------------------------------------------------------------*/ asm(" .global __auto_init"); asm(" mvkl $aiRL,B3"); asm(" mvkh $aiRL,B3"); asm(" b __auto_init"); /* near call */ asm(" NOP 5"); asm("$aiRL:"); /*------------------------------------------------------------------------*/ /* CALL THE USER'S PROGRAM. */ /*------------------------------------------------------------------------*/ main(); /*------------------------------------------------------------------------*/ /* CALL EXIT. */ /*------------------------------------------------------------------------*/ exit(1); }