Reg. RISC Timers in MPC8260

jagannathanjay at aim.com jagannathanjay at aim.com
Tue Jul 4 15:24:25 EST 2006


Hi

Sorry this a repost , as in the earlier post I had wrongly mentioned 
the Target OS as Monta Vista Linux.

We have a requirement of starting a 5 millisecond periodic timer . The 
target OS is Embedded Linux from Embedded Planet for MPC 8260 processor.

when i did a insmod of the module in the Target (MPC8260) it hangs 
while  enabling timer 1?

Can anyone tell me what's wrong with the code?

-------------------------------------------------------------------------
-------------------------------------------------------------------------
----------------

#include <asm/cpm_8260.h>



typedef struct risc_timer_pram {
    unsigned short  tm_base;    /* RISC Timer Table Base Address    */
    unsigned short  tm_ptr;     /* RISC Timer Table Pointer (internal)  */
    unsigned short  r_tmr;      /* RISC Timer Mode Register     */
    unsigned short  r_tmv;      /* RISC Timer Valid Register        */
    unsigned long   tm_cmd;     /* RISC Timer Command Register      */
    unsigned long   tm_cnt;     /* RISC Timer Internal Count        */
} rt_pram_t;


volatile immap_t *immap = (immap_t *)IMAP_ADDR;

void my_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{

 unsigned int i, rter;

 printk("*********** \n");
 /*read RTER to see which timers have caused interrupts.
 */

 rter  = immap->im_cpm.cp_rter ;

 /*The RISC timer event bits are usually cleared
  *by this time
  */
 immap->im_cpm.cp_rter = 0xffff ;


}

int  __init device_init(void)
{
   unsigned int ticks = 0;
   unsigned int interval  = 1000;
   unsigned short prescaler = 0;

   volatile cpm8260_t   *cp;


  /*
    * Write the TIMEP bits of the RCCR with 111111 to generate the 
slowest
    * clock, This value generates a tick every 65,536 clocks, which is 
every
   * 2.6 milliseconds at 25 MHz.
   */

   immap->im_cpm.cp_rccr = ( 0x3f << 8 );

   /*
     * Configure the TM_BASE in the RISC timer table parameter RAM to 
point to a location in the
    * dual-port RAM with 4 bytes available.
    */


   rt_pram_t *rtt_pramp = (rt_pram_t *)&immap->im_dpram1;

   /*
   * Assuming the beginning of dual-port RAM is available,
   * write 0x0000 to TM_BASE.
   */



    rtt_pramp->tm_base = 0x0000;



   /*Write 0x0000 to the TM_CNT field in the RISC timer table
    *parameter RAM to see how many ticks elapsed since the RISC
    *internal timer was enabled.
   */
   rtt_pramp->tm_cnt  = 0x0;

   /*Write 0xFFFF to the RTER to clear any previous events.
    */

   immap->im_cpm.cp_rter = 0xffff;

   /* Write 0x0001 to the RTMR to enable RISC timer 0
    *  and timer 1 to generate an interrupt.
    */
   immap->im_cpm.cp_rtmr |= 0x1 ;

   /* Write 0x0002_0000 to the SIU interrupt mask register (SIMR_L)
    * to allow the RISC timers to generate a system interrupt.
    */

   immap->im_intctl.ic_simrl = 0x00020000;

   /* Initialize the SIU interrupt configuration register */


   immap->im_intctl.ic_sicr = 0;



   if( request_irq(SIU_INT_RISC,my_timer_interrupt,0,0,0) < 0)
   {
     printk("\n unable to register the RISC timer \n");
   }

  /*Write 0xC000_080D to the TM_CMD field of the RISC timer table
     parameter RAM. This enables RISC timer 0 to timeout after 
2,061(decimal)
     ticks of the timer. The timer automatically restarts after it times 
out.    
  */

  rtt_pramp->tm_cmd = 0xC000080D ;

  /* Enter Command:  SET TIMER */

  while (immap->im_cpm.cp_cpcr & CPM_CR_FLG);
         immap->im_cpm.cp_cpcr = 
mk_cr_cmd(CPM_CR_TIMER_PAGE,CPM_CR_TIMER_SBLOCK,0,CPM_CR_SET_GADDR)|CPM_C
R_FLG;
  while (immap->im_cpm.cp_cpcr & CPM_CR_FLG);


  /* Set RCCR[TIME] to enable the RISC timer to
   * begin operation.
   */

  printk(KERN_INFO "enabling timer 1  ");
  immap->im_cpm.cp_rccr = ( 1 << 15 );


  return 0;
}



                                                                         

void cleanup_device(void)
{

  request_irq(SIU_INT_RISC, NULL, 0, 0,
        0);
                                                                         

  printk(KERN_INFO "cleaned up \n");
}
-------------------------------------------------------------------------
-------------------------------------------------------------------------
-------------------

Regards
Jagan
________________________________________________________________________
Check Out the new free AIM(R) Mail -- 2 GB of storage and 
industry-leading spam and email virus protection.




More information about the Linuxppc-embedded mailing list