Hi Jan,

Thank you so much for your reply!

In my driver, I wrote:

int map_io( struct gpiodrv_context *dev_context, rtdm_user_info_t
*user_info, struct MAPPED_IO *io )
{
        int ret;

        if ((dev_context == 0) || (user_info == 0) || (io == 0))
                return -EFAULT;

        if (dev_context->mapped_user_info != 0)
        {
                if ((ret = gpio_unmap_io( dev_context )) != 0)
                        return ret;
        }

        dev_context->mapped_user_info = user_info;

        ret = rtdm_iomap_to_user( user_info, MPC52xx_PA(
MPC52xx_GPIO_WKUP_OFFSET + 0x0C ),
                1, PROT_READ | PROT_WRITE, (void
**)&(io->gpio_heart_beat), NULL, NULL );
        
        if (ret != 0)
                goto __ERROR;
        else
                dev_context->mapped_heart_beat = (void
*)io->gpio_heart_beat;

        return 0;

__ERROR:

        gpio_unmap_io( dev_context );
        return ret;
} 

In the application, I wrote:

int main(int argc, char *argv[]) 
{
        int dev_gpio;
        struct MAPPED_IO gpio;

        signal(SIGTERM, clean_exit);    
        signal(SIGINT, clean_exit);     
        
        mlockall( MCL_CURRENT | MCL_FUTURE );

        rt_task_shadow( &mainapp, "mainapp", 1, 0 );

        dev_gpio = rt_dev_open( "gpio", 0 );
        if (dev_gpio < 0)
        {
                return -1;
        }
        
        gpio.gpio_heart_beat = NULL;

        if (rt_dev_ioctl( dev_gpio, 1, &gpio ) != 0)
        {
                return -1;
        }

        gpio.gpio_heart_beat[0] = 0x01;

        ...
}

I also tried another way by opening "/dev/mem" and then using "mmap" to
map the I/O memory addresses in the application. It worked! 
I am very curious about why "rtdm_iomap_to_user" did not work for me. 

Thanks,
Haobo

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
Sent: May 10, 2007 5:40 PM
To: Zhang, Haobo
Cc: [email protected]; [EMAIL PROTECTED]
Subject: Re: [Xenomai-help] rtdm_iomap_to_user question

Zhang, Haobo wrote:
> Hi,
> 
> I am currently working on a project which is running on a PowerPC 
> platform. In my rtdm driver, I use "rtdm_iomap_to_user" to map a few 
> I/O memory locations to be accessed from my application. All the 
> function calls seem to work (no error code returned). But my 
> application fails to use these pointers to manipulate any I/O. Is 
> there any restrictions I have to be aware in order to use those mapped

> I/O mem? I am new to xenomai. I would really appreciate any help to
this.

Maybe you can post code or relevant code snippets so that we can have a
look. As I personally haven't work with this particular service yet, I
put Stelian in CC who contributed it and might already have some
suggestion. But, again, code talks much more.

Jan


_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to