From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <4D348625.2050607@domain.hid> Date: Mon, 17 Jan 2011 19:10:45 +0100 From: Joerg Mohre MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------080307090605010603050809" Subject: [Xenomai-help] Ext. Interrupt with POSIX skin from user - space List-Id: Help regarding installation and common use of Xenomai List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: xenomai@xenomai.org This is a multi-part message in MIME format. --------------080307090605010603050809 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi all, i am using a MPC52000 and try to handle external interrupts (IRQ1) with linux kernel 2.6.32 and Xenomai 2.5.5.2. I use the POSIX skin functions to setup interrupt and wait for interrupt in user-space. First for testing, i wrote a kernel module to setup and handle the interrupts. This worked well. Now it tried to do the same from user-space with the posix functions. But unfortunately this wasn't successful. I have to load the kernel module before i use my user-space application (see code). Otherwise pthread_intr_control_np will fail with error -1 and errono = -19. static int mpc5200_intr_setup(void) { int iret = 0; int err = 0; pthread_attr_t ThreadAttribute; struct sched_param sched_param; unsigned char byPriority; unsigned int i = 0; byPriority = 90; sched_param.sched_priority = byPriority; memset (&sched_param, 0, sizeof (sched_param)); if ( (pRegsIntCtrl = (int_ctrl_regs*)ioremap( MBAR_VALUE + MBAR_INT_CTRL, REMAP_SIZE )) == NULL) { printf("ioremap failed for MBAR_INT_CTRL\n"); return -1; } //pRegsIntCtrl->irqctl = 0x00201401; //bit 10,21 => 1: IRQ1 rising edge active; enable IRQ1 pRegsIntCtrl->irqctl = 0x00201001; //bit 10 => 1: IRQ1 rising edge active; disbable IRQ1 if (pthread_intr_attach_np (&irq_object, 65, 0)) { printf("Interrupt source not found!\n"); return -1; } else { printf("Interrupt source found!\n"); } printf("pregs->irqctl = %08X\n",pRegsIntCtrl->irqctl); sleep(5); printf("%i\n", i+=1); pthread_attr_init( &ThreadAttribute); printf("%i\n", i+=1); if (pthread_attr_setstacksize(&ThreadAttribute,0x80000)) { printf("Failed to set stack size\n"); return -1; } printf("%i\n", i+=1); if (pthread_create( &Thread, &ThreadAttribute, cyclic_interrupt_receiver, NULL)) { printf("Failed to create thread\n"); return -1; } printf("%i\n", i+=1); if (pthread_setschedparam (Thread,SCHED_FIFO,&sched_param)) { printf("Failed to set scheduling parameter\n"); return -1; } printf("%i\n", i+=1); iret = pthread_intr_control_np (irq_object, PTHREAD_IENABLE); if (iret) { err = errno; printf("Failed to enable interrupt (%i, errno = %i)\n", iret, err); return -1; } printf("%i\n", i+=1); return iret; } If i enable IRQ1 with //pRegsIntCtrl->irqctl = 0x00201401; //bit 10,21 => 1: IRQ1 rising edge active; enable IRQ1 the CPU seams to be blocked. I searched the internet but i couldn't find any help for handling external interrupts with posix skin in user-space. Is it necessary to request an irq with native functions from kernel module? I would expect that all (request, enable setup type ....) is done by the posix functions. Does any one have some ideas? Thanks --------------080307090605010603050809 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Hi all,

i am using a MPC52000 and try to handle external interrupts (IRQ1) with linux kernel 2.6.32 and Xenomai 2.5.5.2.
I use the POSIX skin functions to setup interrupt and wait for interrupt in user-space.

First for testing, i wrote a kernel module to setup and handle the interrupts.
This worked well.

Now it tried to do the same from user-space with the posix functions.
But unfortunately this wasn't successful.

I have to load the kernel module before i use my user-space application (see code).
Otherwise pthread_intr_control_np will fail with error -1 and errono = -19.



static int mpc5200_intr_setup(void)
{
    int                     iret = 0;
        int                                        err = 0;
    pthread_attr_t          ThreadAttribute;
        struct sched_param        sched_param;
        unsigned char                 byPriority;

        unsigned int                i = 0;

        byPriority = 90;
        sched_param.sched_priority = byPriority;
        memset (&sched_param, 0, sizeof (sched_param));

    if ( (pRegsIntCtrl = (int_ctrl_regs*)ioremap( MBAR_VALUE + MBAR_INT_CTRL, REMAP_SIZE )) == NULL) {
                printf("ioremap failed for MBAR_INT_CTRL\n");
        return -1;                
        }

    //pRegsIntCtrl->irqctl =  0x00201401; //bit 10,21 => 1: IRQ1 rising edge active; enable IRQ1
    pRegsIntCtrl->irqctl =  0x00201001; //bit 10 => 1: IRQ1 rising edge active; disbable IRQ1

        if (pthread_intr_attach_np (&irq_object, 65, 0)) {
        printf("Interrupt source not found!\n");
        return -1;
    }
        else {
                printf("Interrupt source found!\n");
        }

        printf("pregs->irqctl = %08X\n",pRegsIntCtrl->irqctl);

        sleep(5);

        printf("%i\n", i+=1);
    pthread_attr_init( &ThreadAttribute);
        printf("%i\n", i+=1);
    if (pthread_attr_setstacksize(&ThreadAttribute,0x80000)) {
                printf("Failed to set stack size\n");
                return -1;
        }
        printf("%i\n", i+=1);
           if (pthread_create( &Thread, &ThreadAttribute, cyclic_interrupt_receiver, NULL)) {
                printf("Failed to create thread\n");
                return -1;
        }
        printf("%i\n", i+=1);
        if (pthread_setschedparam (Thread,SCHED_FIFO,&sched_param)) {
                printf("Failed to set scheduling parameter\n");
                return -1;
        }
        printf("%i\n", i+=1);
        iret = pthread_intr_control_np (irq_object, PTHREAD_IENABLE);
        if (iret)
        {
                err = errno;
                printf("Failed to enable interrupt (%i, errno = %i)\n", iret, err);
                return -1;
        }
       
        printf("%i\n", i+=1);
    return iret;
}

If i enable IRQ1 with
//pRegsIntCtrl->irqctl =  0x00201401; //bit 10,21 => 1: IRQ1 rising edge active; enable IRQ1
the CPU seams to be blocked.


I searched the internet but i couldn't find any help for handling external interrupts with posix skin in user-space.

Is it necessary to request an irq with native functions from kernel module?

I would expect that all (request, enable setup type ....) is done by the posix functions.

Does any one have some ideas?

Thanks



--------------080307090605010603050809--