* [Xenomai-help] rtdm_iomap_to_user question
@ 2007-05-10 18:16 Zhang, Haobo
2007-05-10 21:39 ` Jan Kiszka
0 siblings, 1 reply; 6+ messages in thread
From: Zhang, Haobo @ 2007-05-10 18:16 UTC (permalink / raw)
To: xenomai
[-- Attachment #1: Type: text/plain, Size: 521 bytes --]
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.
Best Regards,
Haobo Zhang
[-- Attachment #2: Type: text/html, Size: 1051 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Xenomai-help] rtdm_iomap_to_user question
2007-05-10 18:16 [Xenomai-help] rtdm_iomap_to_user question Zhang, Haobo
@ 2007-05-10 21:39 ` Jan Kiszka
2007-05-11 4:39 ` Zhang, Haobo
0 siblings, 1 reply; 6+ messages in thread
From: Jan Kiszka @ 2007-05-10 21:39 UTC (permalink / raw)
To: Zhang, Haobo; +Cc: xenomai, stelian
[-- Attachment #1: Type: text/plain, Size: 795 bytes --]
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
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Xenomai-help] rtdm_iomap_to_user question
2007-05-10 21:39 ` Jan Kiszka
@ 2007-05-11 4:39 ` Zhang, Haobo
2007-05-11 16:22 ` Jan Kiszka
0 siblings, 1 reply; 6+ messages in thread
From: Zhang, Haobo @ 2007-05-11 4:39 UTC (permalink / raw)
To: jan.kiszka; +Cc: xenomai, stelian
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: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid
Sent: May 10, 2007 5:40 PM
To: Zhang, Haobo
Cc: xenomai@xenomai.org; stelian@domain.hid
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
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Xenomai-help] rtdm_iomap_to_user question
2007-05-11 4:39 ` Zhang, Haobo
@ 2007-05-11 16:22 ` Jan Kiszka
2007-05-12 23:15 ` Zhang, Haobo
0 siblings, 1 reply; 6+ messages in thread
From: Jan Kiszka @ 2007-05-11 16:22 UTC (permalink / raw)
To: Zhang, Haobo; +Cc: xenomai, stelian
[-- Attachment #1: Type: text/plain, Size: 2455 bytes --]
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
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Xenomai-help] rtdm_iomap_to_user question
2007-05-11 16:22 ` Jan Kiszka
@ 2007-05-12 23:15 ` Zhang, Haobo
2007-05-13 10:24 ` Jan Kiszka
0 siblings, 1 reply; 6+ messages in thread
From: Zhang, Haobo @ 2007-05-12 23:15 UTC (permalink / raw)
To: jan.kiszka; +Cc: xenomai, stelian
Thanks, Jan. It is fixed after I modified my code as you suggested.
Best Regards,
Haobo Zhang
-----Original Message-----
From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid
Sent: May 11, 2007 12:22 PM
To: Zhang, Haobo
Cc: xenomai@xenomai.org; stelian@domain.hid
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
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Xenomai-help] rtdm_iomap_to_user question
2007-05-12 23:15 ` Zhang, Haobo
@ 2007-05-13 10:24 ` Jan Kiszka
0 siblings, 0 replies; 6+ messages in thread
From: Jan Kiszka @ 2007-05-13 10:24 UTC (permalink / raw)
To: Zhang, Haobo; +Cc: xenomai, stelian
[-- Attachment #1: Type: text/plain, Size: 3128 bytes --]
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: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid
> Sent: May 11, 2007 12:22 PM
> To: Zhang, Haobo
> Cc: xenomai@xenomai.org; stelian@domain.hid
> 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
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2007-05-13 10:24 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-10 18:16 [Xenomai-help] rtdm_iomap_to_user question Zhang, Haobo
2007-05-10 21:39 ` Jan Kiszka
2007-05-11 4:39 ` Zhang, Haobo
2007-05-11 16:22 ` Jan Kiszka
2007-05-12 23:15 ` Zhang, Haobo
2007-05-13 10:24 ` Jan Kiszka
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.