diff options
Diffstat (limited to 'openpicc/os/boot')
| -rw-r--r-- | openpicc/os/boot/Cstartup_SAM7.c | 7 | ||||
| -rw-r--r-- | openpicc/os/boot/boot.s | 78 | 
2 files changed, 67 insertions, 18 deletions
| diff --git a/openpicc/os/boot/Cstartup_SAM7.c b/openpicc/os/boot/Cstartup_SAM7.c index fdcafd3..88af706 100644 --- a/openpicc/os/boot/Cstartup_SAM7.c +++ b/openpicc/os/boot/Cstartup_SAM7.c @@ -17,6 +17,8 @@  // Include the board file description  #include <board.h> +// For memcpy +#include <string.h>  //*----------------------------------------------------------------------------  //* \fn    AT91F_LowLevelInit @@ -26,7 +28,6 @@  //*----------------------------------------------------------------------------  void AT91F_LowLevelInit (void)  { -    char i=0;      AT91PS_PMC pPMC = AT91C_BASE_PMC;      //* Set flash wait state @@ -67,8 +68,8 @@ void AT91F_LowLevelInit (void)      pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;      while (!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); -    /* Copy IRQ vector table to RAM */ -    for(i=0; i<0x24; i++) *((char*)(0x00200000)+i) = *((char*)(0x00100000)+i); +    /* Copy first 0x100 bytes (IRQ vector table and FIQ) to RAM */ +    memcpy((void*)0x00200000, (void*)0x00100000, 0x100);      /* Perform remap FIXME doesn't work*/      // AT91C_BASE_MC->MC_RCR = AT91C_MC_RCB;  } diff --git a/openpicc/os/boot/boot.s b/openpicc/os/boot/boot.s index f75bed1..8faf7f3 100644 --- a/openpicc/os/boot/boot.s +++ b/openpicc/os/boot/boot.s @@ -3,6 +3,7 @@  	.extern main  	.extern exit  	.extern AT91F_LowLevelInit +	.extern ssc_rcmr_on_start  	.text  	.code 32 @@ -43,7 +44,10 @@  .equ AT91C_BASE_MC,   (0xFFFFFF00)  .equ AT91C_BASE_PIOA, 0xFFFFF400  .equ AT91C_BASE_TC0,  0xFFFA0000 +.equ AT91C_BASE_SSC,  0xFFFD4000 +.equ SSC_RCMR,        0x10  .equ AT91C_TC_SWTRG,  (1 << 2) +.equ AT91C_TC_CLKEN,  (1 << 0)  .equ PIO_DATA,        (1 << 27)  .equ PIOA_SODR,       0x30  .equ PIOA_CODR,       0x34 @@ -52,10 +56,15 @@  .equ PIOA_ISR,        0x4c  .equ TC_CCR,          0x00  .equ AIC_EOICR,       (304) -/*.equ PIO_LED1,        (1 << 25)*/ -.equ PIO_LED1,        (1 << 12) +.equ PIO_LED1,        (1 << 25) +.equ PIO_LED2,        (1 << 12)  .equ MC_RCR,          0xFFFFFF00 +/* FIQ latency is approx 1us. At 13.56 MHz carrier frequency this means that  + * 13.56 cycles of the carrier have passed when the FIQ kicks in and this is + * the amount that CV0 should be loaded to. (Round up) */ +.equ TC0_FRAME_OFFSET, 9 +  start:  _start:  _mainCRTStartup: @@ -76,6 +85,7 @@ _mainCRTStartup:      ldr     r12, =AT91C_BASE_TC0      ldr     r8, =AT91C_BASE_AIC      mov     r9, #AT91C_TC_SWTRG +    /*ldr     r9, =AT91C_BASE_SSC*/      mov   sp, r0      sub   r0, r0, #FIQ_STACK_SIZE      msr   CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */ @@ -128,16 +138,6 @@ _mainCRTStartup:  .end_set_loop: -	/* Load absolute address and jump there to get from pc=0x0000... to pc=0x0010... */ -    ldr lr, _here -    bx lr -    -.here: -	/* Perform remap FIXME doesn't work (not even the absolute jump above seems to help)*/ -	/*ldr     r0, =AT91C_BASE_MC -	mov     r1, #0x01 -	str     r1, [r0, #0]*/ -	  	/* call main */  	mov		r0, #0          /* no arguments  */  	mov		r1, #0          /* no argv either */ @@ -145,9 +145,6 @@ _mainCRTStartup:      ldr lr, =main	  	bx	lr -_here: -	.word .here  -  endless_loop:  	b               endless_loop @@ -263,4 +260,55 @@ fiq_handler:          .size   fiq_handler, . - fiq_handler          .endfunc + +        .global my_fiq_handler +        .func my_fiq_handler +my_fiq_handler: +                /* code that uses pre-initialized FIQ reg */ +                /* r8   AT91C_BASE_AIC (dfu init) +                   r9   AT91C_TC_SWTRG +                   //r9   AT91C_BASE_SSC +                   r10  AT91C_BASE_PIOA +                   r11  tmp +                   r12  AT91C_BASE_TC0 +                   r13  stack +                   r14  lr +                 */ + +#ifdef LED_TRIGGER +                mov   r11, #PIO_LED1 +                str   r11, [r10, #PIOA_CODR] /* enable LED */ +#endif +                ldr     r8, [r10, #PIOA_ISR] +                tst     r8, #PIO_DATA           /* check for PIO_DATA change */ +                ldrne   r11, [r10, #PIOA_PDSR] +                tstne   r11, #PIO_DATA          /* check for PIO_DATA == 1 */ +                strne   r9, [r12, #TC_CCR]      /* software trigger */ +                /*movne	r11, #TC0_FRAME_OFFSET +                strne	r11, [r12, #0x10] /* Set TC0_CV to TC0_FRAME_OFFSET */ +                 +                /* Enable SSC Rx clock from RK */ +                /*ldrne   r11, =ssc_rcmr_on_start +                ldrne   r11, [r11] +                strne   r11, [r9, #SSC_RCMR]*/ + +                movne   r11, #PIO_DATA +                strne   r11, [r10, #PIOA_IDR]   /* disable further PIO_DATA FIQ */ + +#ifdef LED_TRIGGER +                mov     r11, #PIO_LED1 +                str     r11, [r10, #PIOA_SODR] /* disable LED */ +#endif +             +                /*- Mark the End of Interrupt on the AIC */ +                ldr     r11, =AT91C_BASE_AIC +                str     r11, [r11, #AIC_EOICR] + +                /*- Restore the Program Counter using the LR_fiq directly in the PC */ +                subs        pc, lr, #4 + +        .size   my_fiq_handler, . - my_fiq_handler +        .endfunc +          .end +         | 
