Flipkart Product Search

Booting of blackfin BF527

Basic Booting process of Blackfin BF527 processor

  1. Boot kernel resides on the on chip boot ROM
  2. Boot stream is the specially formatted binary file of the project you have just built. Boot stream contains information such as where(SDRAM, internal memory etc) to load the data, what it contains(zero data or code) and the size
  3. Once all the boot stream has been booted, the control is passed to user application code by jumping to the vector stored in the EVT1 register
  4. Before passing the control to the application code, the boot kernel sets the registers to the default settings
  5. During the boot process, boot kernel calls subroutine called Initcode. It helps in speeding up the boot process. Traditionally, Initcode is used to increase/optimize the core clock and system clock frequency, initialize SDRAM controller so that further booting occurs with out error
  6. Software upgrade-ability is one application where the application code will be more than one depending on the need
  7. Immediately after reset the control goes to 0xEF00 0000. It is the place where on chip boot rom resides
  8. The boot kernel initializes the EVT1 register to 0xFFA0 0000. 
  9. The following code snippet shows how the control is passed to lowest priority interrupt from highest priority interrupt 

_reset:
  1. P0.L = LO(EVT15); /* Point to IVG15 in Event Vector Table */
    P0.H = HI(EVT15);
    P1.L = LO(_isr_IVG15); /* Point to start of IVG15 code */
    P1.H = HI(_isr_IVG15);
    [P0] = P1; /* Initialize interrupt vector EVT15 */
    P0.L = LO(IMASK); /* read-modify-write IMASK register */
    R0 = [P0]; /* to enable IVG15 interrupts */
    R1 = EVT_IVG15 (Z);
    R0 = R0 | R1; /* set IVG15 bit */
    [P0] = R0; /* write back to IMASK */
    RAISE 15; /* generate IVG15 interrupt request */
    /* IVG 15 is not served until reset handler returns */
    P0.L = LO(_usercode);
    P0.H = HI(_usercode);
    RETI = P0; /* RETI loaded with return address */
    RTI; /* Return from Reset Event */
    _reset.end:
    _usercode: /* Wait in user mode till IVG15 */
    JUMP _usercode; /* interrupt is serviced */
    _isr_IVG15: /* IVG15 vectors here due to EVT15 */
         ...
The _usercode will be main function normally.

The way adding software upgrade-ability to any user application in code is explained in detail in other post.