[PATCH 1/1] Adding QEP driver to Beaglebone bsp
Chris Johns
chrisj at rtems.org
Mon Aug 24 01:23:25 UTC 2020
On 23/8/20 7:51 pm, James Fitzsimons wrote:
> On Sat, 22 Aug 2020 at 20:41, Chris Johns <chrisj at rtems.org
> <mailto:chrisj at rtems.org>> wrote:
>
> On 21/8/20 8:01 pm, James Fitzsimons wrote:
> ...
> > +
> > +
> > +typedef void (*bbb_eqep_timer_callback)(BBB_PWMSS);
>
> What is BBB_PWMSS used for as an argument?
>
> The BBB_PWMSS argument is provided to the user call back function so that the
> user knows which QEP module raised the interrupt.
Great, please add a comment to say this.
> It is quite likely that a user
> would have multiple QEP modules configured. Thinking about this now, the call
> back could also have the count provided as an argument so the user doesn't need
> to call the "int32_t beagle_qep_get_position(BBB_PWMSS pwmss_id);" function from
> their call back handler.
Sounds good. Adding something like this as a comment helps new users to the code.
> Could a `void* user` be passed back? It helps if the interrupt provides a user
> specific data pointer.
>
> I'm sorry I don't understand what you mean here. Do you mean the argument to the
> call back should be "void* user" which presumably would be a pointer to an
> arbitrary data structure?
Add another argument that is a 'void*' that is a transparent user set value. A
user provides a pointer or NULL when configuring the QEP module and it is
returned here as an argument. The driver does not touch the value.
> > +/**
> > + * @brief This structure represents an eQEP module instance.
> > + *
> > + * The members are closely modelled on the FDT structure. *
> > + */
> > +typedef struct {
> > + const BBB_PWMSS pwmss_id;
> > + const uint32_t mmio_base;
> > + const rtems_vector_number irq;
> > + bbb_eqep_timer_callback timer_callback;
>
> Is this part of the FDT? I think some extra documentation here would be good to
> have.
>
> Good catch - that comment needs updating. When I first added the bbb_eqep
> structure it did closely resemble the structure used in the FDT configuration
> (at least for Linux). However, I then added additional members such as the
> rtems_vector_number and the bbb_eqep_timer_callback which have no relationship
> to the FDT. I can update the comment to more accurately reflect the current state.
Thank you.
> Can we have a `void* user;`?
>
> Are you suggesting replacing "bbb_eqep_timer_callback timer_callback;" with
> "void* user;"? If so yes I can do that. Is there a convention for passing
> arguments to that function from the interrupt handler?
No it is additional. I can then provide a private pointer to some private data I
have that is transparently passed back as an argument to the callback handler.
For example I may 2 or more separate pieces of code controlling separate QEP
modules each with a different set of data held in different type structures.
Configuing a pointer per QEP modules means I do not need to collect and hold
these pointers in global data structures I need to lock somehow to access from
the callback handler. I simply cast the `void*` to my data and then use it.
>
> Many thanks for your review and comments!
>
No problem and thank you. It is close.
Chris
More information about the devel
mailing list