Hi Markus, and everyone else,

My proposal for changes on our PWM API is on this PR (most recent commit):
https://github.com/apache/mynewt-core/pull/836

I think it takes care of the oversized unorganized datastructure
problem and allows a clean use of basic PWM capabilities (i.e. looping
a duty cycle / playing a dyuty cycle for n cycles) as well as for
interrupts.
Again, I believe all of these features are implementable on most HW
based PWM implementations, however this API interface still allows us
to use a simple PWM device without any interrupts.
I also added the pwm_get_top_value and updated doc, as requested.

> Personally I probably would have combined the ISRs into a single callback 
> function and use an additional enumeration parameter to determine the 
> "trigger". This would allow future extensions, say if a counter supports more 
> than one compare value.

I see, although this would make us have to use an enumeration for the
event type(or "trigger") plus a mechanism to include user data
according to it, I don't know what kind of other feature you want to
see on PWM but I suppose it isn't that standard and will probably be
implementable using pwm_chan_cfg.data.

> As for the nrf52 suggestion, what I meant was that the new api is a super-set 
> of the old api. So once you implement a driver with the new api you can 
> easily implement a driver with the old api by creating an interface layer 
> that just sets all extra pointers and values to dummy values.

Having to maintain 2 APIs for the same driver doesn't make much sense
to me, why not a single scalable API?
We can even have some macros to optimize the internal datastructures'
size(regarding the interrupt related fields) like PWM_CYCLE_INT and
PWM_SEQ_END_INT. Take a look at pwm_test I got on that branch I PRed,
it uses this API with both a fully featured driver and a simpler one.

Best Regards,

Miguel

On Thu, Mar 1, 2018 at 6:42 AM, markus <mar...@bibi.ca> wrote:
> wow - it's an email day for me ....
>
> I like the idea of having a single pointer for the additional values, or 
> changing `data` to a pointer to said structure instead of a `void*` (and move 
> the void* into that structure).
>
> Personally I probably would have combined the ISRs into a single callback 
> function and use an additional enumeration parameter to determine the 
> "trigger". This would allow future extensions, say if a counter supports more 
> than one compare value.
>
>
> As for the nrf52 suggestion, what I meant was that the new api is a super-set 
> of the old api. So once you implement a driver with the new api you can 
> easily implement a driver with the old api by creating an interface layer 
> that just sets all extra pointers and values to dummy values.
>
> Have fun,
> Markus
>
>
> PS: about all the many emails - I got the STM32 port to work yesterday so 
> before going further I wanted to clarify the interface, and then you sent out 
> this email - and I didn't want to mix topics, hijack your thread ..... So if 
> anybody asks, I'll blame you - just so you know ;)
>
>
> On Thu, 1 Mar 2018 01:54:53 -0300
> Miguel Azevedo <miguella...@gmail.com> wrote:
>
>> Hi again Markus,
>>
>> > I think your enhancements should be their own driver. Plain PWM is
>> > such a basic need and feature that I think the interface for it
>> > should be as simple as possible. I'm also concerned about the
>> > memory footprint increase, which is 3x that of the original
>> > interface (and that's just the data structure).
>>
>> Agreed. Although if you re-use the structure it isn't such a dramatic
>> increase in memory footprint.
>> Regarding the datastructure size I believe we can keep the previous
>> interface, without the callback associated fields and the cycle(I
>> don't love this one either) I suggest we have a specific datastructure
>> defined on pwm_nrf52.h or even pwm.h(given these are common features
>> on PWM devices, any driver would be eligible to implement them on a
>> standardized way). This struct could either be a struct containing a
>> pwm_chan_cfg which we would 'upcast' and 'downcast' (like we do with
>> dev and odev) or simply something we pass through the data field.
>>
>> > For the nrf52 specifically you could implement the old interface
>> > driver on top of a driver with the new proposed interface.
>> I don't understand what you mean by using the old interface but I
>> think one of the the ways I described will sort out the pwm_chan_cfg
>> memory footprint problem.
>>
>> Thanks for your feedback! :)
>>
>> Miguel
>>
>> On Wed, Feb 28, 2018 at 9:24 PM, markus <mar...@bibi.ca> wrote:
>> > Hi Miguel,
>> >
>> > I think your enhancements should be their own driver. Plain PWM is
>> > such a basic need and feature that I think the interface for it
>> > should be as simple as possible. I'm also concerned about the
>> > memory footprint increase, which is 3x that of the original
>> > interface (and that's just the data structure).
>> >
>> > For the nrf52 specifically you could implement the old interface
>> > driver on top of a driver with the new proposed interface.
>> >
>> > My 2 cents,
>> > Markus
>> >
>> >
>> >
>> > On Wed, 28 Feb 2018 17:51:50 -0300
>> > Miguel Azevedo <miguella...@gmail.com> wrote:
>> >
>> >> Hi everyone,
>> >>
>> >> I recently implemented a few new features for the nRF52 PWM driver
>> >> and will probably implement them for soft PWM as well.
>> >>
>> >> The features:
>> >> * Interrupts fired every cycle with user handler and parameter
>> >> data;
>> >> * A mode where the device plays for n cycles;
>> >> * Interrupts fired at the end of a sequence of n cycles with user
>> >> handler and parameter data.
>> >>
>> >> These changes are PRed here:
>> >> https://github.com/apache/mynewt-core/pull/836
>> >>
>> >> There is an example (pwm_test) which uses the also PRed easing
>> >> library: https://github.com/apache/mynewt-core/pull/822
>> >>
>> >> These features change the pwm_chan_cfg datastructure on pwm.h,
>> >> wich is general to all drivers.
>> >> I can argue that these features are implementable on virtually any
>> >> PWM device since every hardware PWM implementation I've seen so
>> >> far uses timers and counters, however there might be (and probably
>> >> are) exceptions.
>> >> Anyway a driver which doesn't use these new fields on this
>> >> datastructure is still implementable(well, we have soft PWM using
>> >> the sabe API interface and it works).
>> >>
>> >> The alternative to this would be to write a datastructure on the
>> >> driver's implementation header file (pwm_nrf52.h in this case) with
>> >> the new fields.
>> >>
>> >> What do you think?
>> >>
>> >> Best,
>> >>
>> >> Miguel Azevedo
>> >
>>
>>
>>
>



-- 
--
Miguel Azevedo

Reply via email to