Hello Jan,

First of all, thanks for your quick answer. 

Yes, you're completely right. My user application called rt_dev_ioctl, which 
eventually called rtdm_iomap_to_user, after rt_task_shadow. Now, I call it just 
after mlockall and rt_dev_open, and before rt_task_shadow. The 
rtdm_iomap_to_user function now seems to be working correctly, and dmesg no 
longer shows the previous errors. [By the way, it could be interesting to add a 
rtdm_in_rt_context() check in the rtdm_iomap_to_user function, which would 
return an error if in RT]

However, when I later try to write to the device, nothing is written. The mmap 
seems not to be correct. The following lines may show the problem:
        rtdm_printk("location %lx --> base %p --> iomap_to_user %p --> 
virt_to_phys %lx \n", 
                my_context->location, my_context->base_address, new_iomap, 
virt_to_phys(new_iomap));

gives the following result:
        location  20000000 -> base e0a00000 --> iomap_to_user b5f6f000 --> 
virt_to_phys f5f6f000

where the variables are:
        [unsigned long] xen_mydriver->location = pci_resource_start(dev,0);
        [void __iomem*] xen_mydriver->base_address = 
ioremap(xen_mydriver->location, xen_mydriver->mem_size);
        [void __iomem*] new_iomap
        rtdm_iomap_to_user(user_info,my_context->location, 300, 
PROT_READ|PROT_WRITE, &new_iomap, NULL, NULL);

If I execute in my RTDM driver:
        *(unsigned short*)(my_context->base_address + 0x100) = 0xAAAA;

I can see that the address is written. However, if I execute (either in the 
driver or from the RT task):
        *(unsigned short*)(new_iomap + 0x100) = 0xAAAA;
It doesn't work.

Does anybody know what is wrong? I'm sure I must be missing something 
important, but I can't see what.


Best regards,

Asier



> -----Original Message-----
> From: Jan Kiszka [mailto:[email protected]]
> Sent: Thursday, April 14, 2011 9:34 AM
> To: Asier Tamayo
> Cc: [email protected]
> Subject: Re: FW: rtdm_iomap_to_user() I-pipe error
> 
> 
> On 2011-04-14 08:14, Asier Tamayo wrote:
> > 
> > Hello,
> > 
> > I'm porting a PCI driver to a RTDM. Until now, I have 
> successfully done most of the job.
> > 
> > I'm using Xenomai version 2.4.7 and Linux 2.6.27, from the 
> ELinOS 5.0 distribution.
> > 
> > My problem appears with the rtdm_iomap_to_user() function. 
> I want to allow a RT task to access the PCI memory directly, 
> via mmap. As the RTDM has no mmap() function, I'm trying to 
> use rtdm_iomap_to_user, but it always gives me the following error:
> > 
> >     I-pipe: Detected illicit call from domain 'Xenomai'
> >             into a service reserved for domain 'Linux' and below.
> 
> This is also documented: rtdm_iomap_to_user is not supposed 
> to be called
> from RT task context. This means your driver should only call it from
> handlers registered for *_nrt entry points.
> 
> Jan
> 
> -- 
> Siemens AG, Corporate Technology, CT T DE IT 1
> Corporate Competence Center Embedded Linux
> 

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

Reply via email to