feat: skip redundant DAC data writes via shadow registers - #27
Merged
Conversation
5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a per-port shadow of the
REG_DAC_DATAregisters so that writes with an unchanged value skip the SPI transaction entirely, mirroring the existinggpodatshadow pattern for GPOs.This moves DAC write dedup into the driver where it belongs (motivated by the review of faderpunk PR #556, which had implemented it firmware-side with a cross-task dirty-flag race). Inside the driver,
&mut selfserialization makes the dedup race-free by construction, and every consumer of the crate benefits.Changes
dac_data: [Option<u16>; 20]shadow, initialized toNoneso the first write always reaches the chip.write_dac_dataused by all writers of the shared data register:_dac_set_value,_gpo_configure_level, and_gpi_configure_threshold. The shadow is only updated after a successful SPI transfer.write_dac_data_manyforMultiport::set_values: skips the transaction when every value matches its shadow._configure_portinvalidates the port's shadow entry, since a mode transition may clobber or reinterpret the data register. The typedinto_configured_port/into_modepaths now route through_configure_portso they get the same invalidation.