Zhang, Haobo wrote: > Thanks, Jan. It is fixed after I modified my code as you suggested.
Good to hear. Now just please answer my question below related to /dev/mem so that I can think about a generic solution for the documentation or the code or rtdm_*map_to_user. Jan > > Best Regards, > Haobo Zhang > > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] > Sent: May 11, 2007 12:22 PM > To: Zhang, Haobo > Cc: [email protected]; [EMAIL PROTECTED] > Subject: Re: [Xenomai-help] rtdm_iomap_to_user question > > Zhang, Haobo wrote: >> 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 ); > > Hmm, hmm. Looking at our code and the kernel again I would say we should > catch non-page-aligned requests like this and document this pitfall > better. > > The mapping code always assumes page-alignment and rounds your physical > address down. So what likely happened here is that you got a mapping, > but with unexpected offset (gpio_heart_beat should point to MPC52xx_PA). > >> >> 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. > > When you do precisely the same odd-numbered mapping via mmap on > /dev/mem, you do get the right address at gpio_heart_beat (check if the > start address ends with 0x0b0c)? > > We either have to improve rtdm_iomap/mmap_to_user in this regard or > catch unaligned requests. Probably it's easier to catch it so that the > driver writer also realises that this is always about mapping full > pages... > > Jan >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Xenomai-help mailing list [email protected] https://mail.gna.org/listinfo/xenomai-help
