This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Please clear me about ISR,DSR


Hello,

I have ported eCos 3.0 into SH7705 target,and developing USB drivers.
But I am encountered a unclear question about interrup ISR/DSR,so would you please enlighten me.


SH7705's USB-module has Interrupt Status Register(IFR0) and Interrupt Enable Register(IER0).
When both bits are '1', generates Interrupt signal USI0.


First I coded ISR and DSR like (1) below.
In that case when I inserted USB cable into host PC, only ISR was breaked repeatedly and never entered DSR.
Next I deliberately added the codes to disable Interrupt signal like (2) below into ISR, then went to DSR after ISR.


My question is whether it is necessary I deliberately disable interrupt in ISR.
My image is that when ISR returned to VSR, then soon DSR is called so not necessary to disable Interrupt in ISR.
The point that is making the matter more fathomable is that when I developed ethernet ISR/DSR I did not need to disable interrupt in ISR.
I checked when cyg_drv_interrupt_mask is executed ,SR Register's mask bit4 to bit7 became '1111'.


Would you please teach me what is right ?

Relating to the matter, I am perplexed to find two ways of returning ISR.
   return (CYG_ISR_HANDLED|CYG_ISR_CALL_DSR);
   return CYG_ISR_CALL_DSR;
Would you enlighten me the difference ?

--- (1) ISR,DSR not included deliberate disable
static cyg_uint32
usbs_sh7705mod_isr(cyg_vector_t vector, cyg_addrword_t data)
{
CYG_ASSERT(SH7705MOD_IRQ_USB_SERVICE_REQUEST == vector, "USB ISR should only be invoked for USB interrupts" );
CYG_ASSERT(0 == data, "The SH7705MOD USB ISR needs no global data pointer" );


   cyg_drv_interrupt_mask(SH7705MOD_IRQ_USB_SERVICE_REQUEST);
   cyg_drv_interrupt_acknowledge(SH7705MOD_IRQ_USB_SERVICE_REQUEST);

   return (CYG_ISR_HANDLED|CYG_ISR_CALL_DSR);
}

static void
usbs_sh7705mod_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
{
CYG_ASSERT(SH7705MOD_IRQ_USB_SERVICE_REQUEST == vector, "USB DSR should only be invoked for USB interrupts" );
CYG_ASSERT(0 == data, "The SH7705MOD USB DSR needs no global data pointer");


BranchOfInt();

   // This unmask is likely to cause another interrupt immediately
   cyg_drv_interrupt_unmask(vector);
}
--- (1) end

--- (2) ISR include deliberate disabling
static cyg_uint32
usbs_sh7705mod_isr(cyg_vector_t vector, cyg_addrword_t data)
{
CYG_ASSERT(SH7705MOD_IRQ_USB_SERVICE_REQUEST == vector, "USB ISR should only be invoked for USB interrupts" );
CYG_ASSERT(0 == data, "The SH7705MOD USB ISR needs no global data pointer" );


volatile char *ifr0=(char *)0xa4480018;
volatile char *ier0=(char *)0xa4480034;
char ifr0val;

/* disable interrupt */
ifr0val = *ifr0;
*ier0 &= ~ifr0val;

   cyg_drv_interrupt_mask(SH7705MOD_IRQ_USB_SERVICE_REQUEST);
   cyg_drv_interrupt_acknowledge(SH7705MOD_IRQ_USB_SERVICE_REQUEST);

   return (CYG_ISR_HANDLED|CYG_ISR_CALL_DSR);
}

I am very much obliged your help.

m mariga




-- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]