OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_47/] [or1ksim/] [pic/] [pic.c] - Diff between revs 167 and 188

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 167 Rev 188
Line 45... Line 45...
   It does internal functional PIC simulation. */
   It does internal functional PIC simulation. */
void pic_clock()
void pic_clock()
{
{
  unsigned long picsr;
  unsigned long picsr;
  unsigned long picpr;
  unsigned long picpr;
 
  unsigned long sr;
 
 
  picsr = mfspr(SPR_PICSR);
  /* CZ 020901: Someone had previously noted that this routine was
  picpr = mfspr(SPR_PICPR);
     wrong, and there were 2 sets of code, one commented out, and
 
     both were broken. I have rewritten this so it works as I think
 
     it should. Someone needs to correct this if there is something
 
     I am missing... */
 
 
 
  /* From Sections 16.3 & 16.4, bits 0 & 1 are reserved */
 
  picsr = mfspr(SPR_PICSR) & 0xFFFFFFFC;
 
  picpr = mfspr(SPR_PICPR) & 0xFFFFFFFC;
 
  sr = mfspr(SPR_SR);
 
 
 
 
 
  /* Don't do anything if interrupts not currently enabled */
 
  if((sr & (SPR_SR_EIR | SPR_SR_EXR)) != (SPR_SR_EIR | SPR_SR_EXR))
 
    return;
 
 
 
  if(picsr & picpr) /* Report High Priority Interrupts first */
 
    except_handle(EXCEPT_HPINT, 0);
 
  else if(picsr)    /* Report a Low Priority Interrupt otherwise */
 
    except_handle(EXCEPT_LPINT, 0);
 
 
 
#if 0  /* CZ -- both of these routines are broken */
  /* SIMON: This is a bug */
  /* SIMON: This is a bug */
  /*    if (picsr & picpr) {
  /*    if (picsr & picpr) {
        if ((mfspr(SPR_SR) & (SPR_SR_EIR | SPR_SR_EXR)) == (SPR_SR_EIR | SPR_SR_EXR))
    if ((mfspr(SPR_SR) & (SPR_SR_EIR | SPR_SR_EXR)) == (SPR_SR_EIR | SPR_SR_EXR)
 
)
        except_handle(EXCEPT_HPINT, 0);
        except_handle(EXCEPT_HPINT, 0);
        } else
        } else
        if ((mfspr(SPR_SR) & (SPR_SR_EIR | SPR_SR_EXR)) == (SPR_SR_EIR | SPR_SR_EXR))
    if ((mfspr(SPR_SR) & (SPR_SR_EIR | SPR_SR_EXR)) == (SPR_SR_EIR | SPR_SR_EXR)
 
)
        except_handle(EXCEPT_LPINT, 0);
        except_handle(EXCEPT_LPINT, 0);
  */
  */
  if ((mfspr(SPR_SR) & (SPR_SR_EIR | SPR_SR_EXR)) == (SPR_SR_EIR | SPR_SR_EXR)) {
  if ((picsr & (SPR_SR_EIR | SPR_SR_EXR)) == (SPR_SR_EIR | SPR_SR_EXR)) {
    picsr = mfspr(SPR_PICSR);
    if (picsr & picpr) {
    picpr = mfspr(SPR_PICPR);
 
    if (picsr & picpr)
 
      except_handle(EXCEPT_HPINT, 0);
      except_handle(EXCEPT_HPINT, 0);
    else if(picsr)
    } else if(picsr) {
      except_handle(EXCEPT_LPINT, 0);
      except_handle(EXCEPT_LPINT, 0);
  }
  }
}
}
 
#endif
 
 
 
}
 
 
/* Asserts interrupt to the PIC. */
/* Asserts interrupt to the PIC. */
void report_interrupt(int line)
void report_interrupt(int line)
{
{
        setsprbits(SPR_PMR, SPR_PMR_DME, 0); /* Disable doze mode */
        setsprbits(SPR_PMR, SPR_PMR_DME, 0); /* Disable doze mode */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.