All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai] RTDM for a GPIO line in RT mode
@ 2013-05-22 22:10 CF
  2013-05-23  7:14 ` Gilles Chanteperdrix
  0 siblings, 1 reply; 5+ messages in thread
From: CF @ 2013-05-22 22:10 UTC (permalink / raw)
  To: xenomai

Hello,

Despite my munerous reading, i'm locked in how to perform a basic RTDM
for a simple ppc board.

This is a simple pin level setting. The linux kernel module i developped
follow theses steps:
-reading DTS for IOCTL et GPIOCTL base adress registers
- out_be32(addr, value) at theses register to set line as an output and
then set the logical level with setbits32(addr, bit) or clrbits32(addr,bit)

Basically, it works but in NRT  ops modes, so i'm unable (or at least i
lack indication) to do this in RT ops mode (i don't think it is
important, but i use ioctl to make my changes). I based my work on
tut01/tut02 drivers, except i end up in using ioctl instead or
read/write in the RTDM driver.

I guess i still could read the DTS in nrt mode (because it is done at
rtdm_dev_register() time and won't interfere with RT task), but how can
i drive the hardware directly in RT op mode ?

Thanks you for your help,
JG


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Xenomai] RTDM for a GPIO line in RT mode
  2013-05-22 22:10 [Xenomai] RTDM for a GPIO line in RT mode CF
@ 2013-05-23  7:14 ` Gilles Chanteperdrix
  2013-05-25 10:28   ` CF
  0 siblings, 1 reply; 5+ messages in thread
From: Gilles Chanteperdrix @ 2013-05-23  7:14 UTC (permalink / raw)
  To: CF; +Cc: xenomai

On 05/23/2013 12:10 AM, CF wrote:

> Hello,
> 
> Despite my munerous reading, i'm locked in how to perform a basic RTDM
> for a simple ppc board.
> 
> This is a simple pin level setting. The linux kernel module i developped
> follow theses steps:
> -reading DTS for IOCTL et GPIOCTL base adress registers
> - out_be32(addr, value) at theses register to set line as an output and
> then set the logical level with setbits32(addr, bit) or clrbits32(addr,bit)
> 
> Basically, it works but in NRT  ops modes, so i'm unable (or at least i
> lack indication) to do this in RT ops mode (i don't think it is
> important, but i use ioctl to make my changes). I based my work on
> tut01/tut02 drivers, except i end up in using ioctl instead or
> read/write in the RTDM driver.
> 
> I guess i still could read the DTS in nrt mode (because it is done at
> rtdm_dev_register() time and won't interfere with RT task), but how can
> i drive the hardware directly in RT op mode ?


Hi,

I am not sure I understand the problem you have. If the board you use
uses gpiolib (I do not know if gpiolib is customary on ppc), you simply
have to check that the gpiolib callbacks do not use any Linux services
which can not be called from RT mode (if it uses a spinlock, the usual
method is to turn the spinlock into an I-pipe spinlock, see:
http://www.xenomai.org/index.php/I-pipe-core:ArmPorting#GPIOs_in_real-time_drivers)

If you are accessing directly the GPIO controller registers, and need a
"read-modify-write" operation, which what you posted seem to suggest,
you probably want to put a spinlock around these operations, but apart
from that, you can do this from an RT driver ioctl callback.

Regards.

-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Xenomai] RTDM for a GPIO line in RT mode
  2013-05-23  7:14 ` Gilles Chanteperdrix
@ 2013-05-25 10:28   ` CF
  2013-05-25 11:22     ` Gilles Chanteperdrix
  0 siblings, 1 reply; 5+ messages in thread
From: CF @ 2013-05-25 10:28 UTC (permalink / raw)
  To: xenomai

Le 23/05/2013 09:14, Gilles Chanteperdrix a écrit :
> On 05/23/2013 12:10 AM, CF wrote:
>
>> Hello,
>>
>> Despite my munerous reading, i'm locked in how to perform a basic RTDM
>> for a simple ppc board.
>>
>> This is a simple pin level setting. The linux kernel module i developped
>> follow theses steps:
>> -reading DTS for IOCTL et GPIOCTL base adress registers
>> - out_be32(addr, value) at theses register to set line as an output and
>> then set the logical level with setbits32(addr, bit) or clrbits32(addr,bit)
>>
>> Basically, it works but in NRT  ops modes, so i'm unable (or at least i
>> lack indication) to do this in RT ops mode (i don't think it is
>> important, but i use ioctl to make my changes). I based my work on
>> tut01/tut02 drivers, except i end up in using ioctl instead or
>> read/write in the RTDM driver.
>>
>> I guess i still could read the DTS in nrt mode (because it is done at
>> rtdm_dev_register() time and won't interfere with RT task), but how can
>> i drive the hardware directly in RT op mode ?
>
> Hi,
>
> I am not sure I understand the problem you have. If the board you use
> uses gpiolib (I do not know if gpiolib is customary on ppc), you simply
> have to check that the gpiolib callbacks do not use any Linux services
> which can not be called from RT mode (if it uses a spinlock, the usual
> method is to turn the spinlock into an I-pipe spinlock, see:
> http://www.xenomai.org/index.php/I-pipe-core:ArmPorting#GPIOs_in_real-time_drivers)
>
> If you are accessing directly the GPIO controller registers, and need a
> "read-modify-write" operation, which what you posted seem to suggest,
> you probably want to put a spinlock around these operations, but apart
> from that, you can do this from an RT driver ioctl callback.
>
> Regards.
>

Thank you Gilles, very much.

Precisely, my main concern is how to know if i use linux services (in
others words, how can i say a function - in my case in_beX() or
out_beX() - is RT compatible ?). If you have some documentations about
this, thank you :)

CF


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Xenomai] RTDM for a GPIO line in RT mode
  2013-05-25 10:28   ` CF
@ 2013-05-25 11:22     ` Gilles Chanteperdrix
  2013-05-25 11:38       ` Gilles Chanteperdrix
  0 siblings, 1 reply; 5+ messages in thread
From: Gilles Chanteperdrix @ 2013-05-25 11:22 UTC (permalink / raw)
  To: CF; +Cc: xenomai

On 05/25/2013 12:28 PM, CF wrote:

> Le 23/05/2013 09:14, Gilles Chanteperdrix a écrit :
>> On 05/23/2013 12:10 AM, CF wrote:
>>
>>> Hello,
>>>
>>> Despite my munerous reading, i'm locked in how to perform a basic RTDM
>>> for a simple ppc board.
>>>
>>> This is a simple pin level setting. The linux kernel module i developped
>>> follow theses steps:
>>> -reading DTS for IOCTL et GPIOCTL base adress registers
>>> - out_be32(addr, value) at theses register to set line as an output and
>>> then set the logical level with setbits32(addr, bit) or clrbits32(addr,bit)
>>>
>>> Basically, it works but in NRT  ops modes, so i'm unable (or at least i
>>> lack indication) to do this in RT ops mode (i don't think it is
>>> important, but i use ioctl to make my changes). I based my work on
>>> tut01/tut02 drivers, except i end up in using ioctl instead or
>>> read/write in the RTDM driver.
>>>
>>> I guess i still could read the DTS in nrt mode (because it is done at
>>> rtdm_dev_register() time and won't interfere with RT task), but how can
>>> i drive the hardware directly in RT op mode ?
>>
>> Hi,
>>
>> I am not sure I understand the problem you have. If the board you use
>> uses gpiolib (I do not know if gpiolib is customary on ppc), you simply
>> have to check that the gpiolib callbacks do not use any Linux services
>> which can not be called from RT mode (if it uses a spinlock, the usual
>> method is to turn the spinlock into an I-pipe spinlock, see:
>> http://www.xenomai.org/index.php/I-pipe-core:ArmPorting#GPIOs_in_real-time_drivers)
>>
>> If you are accessing directly the GPIO controller registers, and need a
>> "read-modify-write" operation, which what you posted seem to suggest,
>> you probably want to put a spinlock around these operations, but apart
>> from that, you can do this from an RT driver ioctl callback.
>>
>> Regards.
>>
> 
> Thank you Gilles, very much.
> 
> Precisely, my main concern is how to know if i use linux services (in
> others words, how can i say a function - in my case in_beX() or
> out_beX() - is RT compatible ?). If you have some documentations about
> this, thank you :)


Anything which relies on a Linux critical section (spinlocks, mutex,
local_irq_save) to ensure some software data coherency can not work when
in xenomai domain, because the Xenomai domain can interrupt Linux at any
point including in the middle of a critical section.


-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Xenomai] RTDM for a GPIO line in RT mode
  2013-05-25 11:22     ` Gilles Chanteperdrix
@ 2013-05-25 11:38       ` Gilles Chanteperdrix
  0 siblings, 0 replies; 5+ messages in thread
From: Gilles Chanteperdrix @ 2013-05-25 11:38 UTC (permalink / raw)
  To: CF; +Cc: xenomai

On 05/25/2013 01:22 PM, Gilles Chanteperdrix wrote:

> On 05/25/2013 12:28 PM, CF wrote:
> 
>> Le 23/05/2013 09:14, Gilles Chanteperdrix a écrit :
>>> On 05/23/2013 12:10 AM, CF wrote:
>>>
>>>> Hello,
>>>>
>>>> Despite my munerous reading, i'm locked in how to perform a basic RTDM
>>>> for a simple ppc board.
>>>>
>>>> This is a simple pin level setting. The linux kernel module i developped
>>>> follow theses steps:
>>>> -reading DTS for IOCTL et GPIOCTL base adress registers
>>>> - out_be32(addr, value) at theses register to set line as an output and
>>>> then set the logical level with setbits32(addr, bit) or clrbits32(addr,bit)
>>>>
>>>> Basically, it works but in NRT  ops modes, so i'm unable (or at least i
>>>> lack indication) to do this in RT ops mode (i don't think it is
>>>> important, but i use ioctl to make my changes). I based my work on
>>>> tut01/tut02 drivers, except i end up in using ioctl instead or
>>>> read/write in the RTDM driver.
>>>>
>>>> I guess i still could read the DTS in nrt mode (because it is done at
>>>> rtdm_dev_register() time and won't interfere with RT task), but how can
>>>> i drive the hardware directly in RT op mode ?
>>>
>>> Hi,
>>>
>>> I am not sure I understand the problem you have. If the board you use
>>> uses gpiolib (I do not know if gpiolib is customary on ppc), you simply
>>> have to check that the gpiolib callbacks do not use any Linux services
>>> which can not be called from RT mode (if it uses a spinlock, the usual
>>> method is to turn the spinlock into an I-pipe spinlock, see:
>>> http://www.xenomai.org/index.php/I-pipe-core:ArmPorting#GPIOs_in_real-time_drivers)
>>>
>>> If you are accessing directly the GPIO controller registers, and need a
>>> "read-modify-write" operation, which what you posted seem to suggest,
>>> you probably want to put a spinlock around these operations, but apart
>>> from that, you can do this from an RT driver ioctl callback.
>>>
>>> Regards.
>>>
>>
>> Thank you Gilles, very much.
>>
>> Precisely, my main concern is how to know if i use linux services (in
>> others words, how can i say a function - in my case in_beX() or
>> out_beX() - is RT compatible ?). If you have some documentations about
>> this, thank you :)
> 
> 
> Anything which relies on a Linux critical section (spinlocks, mutex,
> local_irq_save) to ensure some software data coherency can not work when
> in xenomai domain, because the Xenomai domain can interrupt Linux at any
> point including in the middle of a critical section.
> 
> 

So, to answer your question, yes, you can use the in_beX out_beX since
they only perform read/write to mmio registers. The only thing you have
to pay attention to, is to make sure that Linux could not have been
interrupted while writing to the same register, for this you use an
ipipe_spinlock.

-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-05-25 11:38 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-22 22:10 [Xenomai] RTDM for a GPIO line in RT mode CF
2013-05-23  7:14 ` Gilles Chanteperdrix
2013-05-25 10:28   ` CF
2013-05-25 11:22     ` Gilles Chanteperdrix
2013-05-25 11:38       ` Gilles Chanteperdrix

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.