[5.13.0.0]
* Added QueryDriverCalibration for the XUBridgeLib
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.12.0.0]
* Fixed XU stream may not unlock if calibration fails [DELL-898]
* Updated Copyright date range
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.11.0.0]
* Implement --apply-calibration command for sidecars [DRV-6929]
* Block driver from stream creation during run (-c) and apply (-a) calibration [DELL-750]
* PollRegister exits when a successful match is found
  - This fixes a bug with calibration from CalCmd
* Unified sidecar operations with standard ops and harmonized API [DRV-6932]
* Add support to control and update Cohen sidecar FW/tunings [DRV-6477]
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.10.0.0]
* Added definitions for mute and volume registers [DRV-6926]
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.9.0.0]
* Add sidecar calibration access support [DRV-6789]
* Read/WriteRegisters uses in-band data [DELL-781]
* Added support for die temperature sensor as ambient temp for Prince
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.8.0.0]
* Read Jamerson DIE_STS from OTP [HDA-1791, HP-491]
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.7.0.0]
* Updated ConvertRawCalRToOhms to take in a LONG rather than a DWORD [HDA-1785]
  - This resolves issues with negative Ohm values
* Updated load firmware and load tuning sequences to modern sequences for Jamerson [HDA-1788]
* Implemented GetExpectedCalR() [HP-478]
  - This retrieves CAL_R_EXPECTED and CAL_R_DELTA for Prince and Jamerson using
    sequences appropriate to each chip.
* Implemented several functions to enable internal oscillators for Prince
* Error codes from WinError.h are returned unmodified, errno.h as negative values [HP-476]
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.6.0.0]
* Add support for sidecar register access [DRV-6603]
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.5.0.0]
* Added support to run calibration or diagnostics in the XU driver,
 in kernelspace, depending on the passed eTuningType.
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.4.3.1]
* Bugfix: Wakeup functions handle the special case of ALL_AMPS
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.4.3.0]
* Changed chip identification from registry-based to device ID-based query
* Implemented GetJamersonFwVer() to dynamically read firmware version
* Removed support for legacy Jamerson FW
* Exposed IsJamerson() to external callers
* Built with VS 2019 Professional (16.11.28), Platform Toolset v141 (10.0.18362.0)


[5.4.2.0]
* Apply calibration no longer issues a MBOX_PLAY upon completion (DRV-6440)
* For SDCA, requires XUBridge v1.2.0 and XU 06/06/2023,22.53.56.886 or later
* Built with VS 2017 Professional (15.9.54), Platform Toolset v141 (10.0.18362.0)


[5.4.1.0]
* Added ConvertRawCalRToOhms() for XUBridgeLib, to convert raw CAL_R
  values to Ohms for Jamerson.
* Built with VS 2017 Professional (15.9.54), Platform Toolset v141 (10.0.18362.0)


[5.4.0.0]
* Aligned calibration storage format with SPB driver
* Built with VS 2017 Professional (15.9.54), Platform Toolset v141 (10.0.18362.0)


[5.3.0.0]
* Added write sequence to enable calibration after an audio source has played
  or calibration has been applied (JAMRSN-3832)
* Built with VS 2017 Professional (15.9.54), Platform Toolset v141 (10.0.18362.0)


[5.2.0.0]
* Updates for the SDCA XU driver
  - Implemented ReadAudioControl() and WriteAudioControl()
  - Implemented ApplyCalibration()
  - Implemented DeleteStoredCalibration() for registry and UEFI storage locations
  - Implemented QueryStoredCalibration() for registry and UEFI storage locations
  - Implemented StoreCalibration() for registry and UEFI storage locations
* GetAmpCount() implementation is now driver-specific
* Implemented IsValidDriverSource()
  - Callers can use this function to determine if the desired driver is a valid target.
* Return values are no longer converted to negative values
* Updates to XUBridge v1.2.0 IOCTL definitions
* Built with VS 2017 Professional (15.9.54), Platform Toolset v141 (10.0.18362.0)


[5.1.0.0]
* Fixed incorrect DeleteStoredCalibration() return status code
* Fixed QueryCalControls() failing when amp is hibernating
* Built with VS 2017 Professional (15.9.54), Platform Toolset v141 (10.0.18362.0)


[5.0.0.0]
* Adds support for the XUBridge and SDCA XU driver
* Implemented IsDriverSourceAvailable()
  - This function will tell the caller if the specified driver source(s) are available on the system under test.
* Implemented ReadRegisters() for the XUBridge
* Implemented WriteRegisters() for the XUBridge
* Built with VS 2017 Professional (15.9.54), Platform Toolset v141 (10.0.18362.0)


[4.3.0.0]
* Jamerson run cal/diag populates cal target and timestamp
* Removed RTK from Jamerson Cal/Diag sequences
* Removed silence wav from project
* GetDieStatus performs a soft or hard wakeup as needed with Jamerson
* GetDieStatus ensures the amp state is always restored
* Ensures Jamerson diagnostics results are not stale from previous session
* Built with VS 2017 Professional (15.9.51), Platform Toolset v141 (10.0.18362.0)


[4.2.0.0]
* CAL_R value in Ohms now calculated appropriately depending on targeted chip (Prince vs Jamerson)
* Updated copyright date range (2019-2023)
* Built with VS 2017 Professional (15.9.51), Platform Toolset v141 (10.0.18362.0)


[4.1.0.0]
* Jamerson diagnostics MBOX command value now depends on firmware version
  - If Jamerson firmware version is 2.0.6 or 2.0.7, uses 0x0b000008
  - If Jamerson firmware version is 2.0.8+, uses 0x0b00000b
* Built with VS 2017 Professional (15.9.51), Platform Toolset v141 (10.0.18362.0)


[4.0.0.0]
* Modified calibration / diagnostic amp wakeup sequences for Jamerson
* Jamerson hard vs soft wakeup support
  - If Jamerson firmware version is legacy (<2.0.5), performs hard wakeups
  - Otherwise, performs soft wakeups
* Jamerson firmware versions specified in registry use full version info as 0xaabbcc,
  where aa=major, bb=minor, cc=patch
  - Ex: v2.16.3 = 0x021003
* Added configurable support to force breakpoint exceptions
* Implemented Get/Set RTK DDI state
* Implemented private (_PVT) IOCTLs
* Removed RTK from cal / diag sequence for Prince
* Modified SoftWakeup for Prince
* Modified SoftWakeup for Jamerson
* Implemented ApplyCalibration for Jamerson
* Removed RTK from Prince ApplyCalibration
* Built with VS 2017 Professional (15.9.49), Platform Toolset v141 (10.0.18362.0)


[3.4.0.0]
* Implemented load firmware / tunings for Jamerson
* Runs calibration or diagnostics for Jamerson
  - Sequences can target "legacy" (<= 2.0.5) firmware, or newer firmware (> 2.0.5)
  - This is configurable via the Registry key, HKLM\Software\Cirrus: JamersonFwVer : REG_DWORD
* Can target either Jamerson or Prince via Registry key
  - This is configurable via the Registry key, HKLM\Software\Cirrus: IsJamerson : REG_DWORD = (0 | 1)
* Built with VS 2017 Professional (15.9.49), Platform Toolset v141 (10.0.18362.0)


[3.3.0.0]
* Implemented functions to retreive COEFF_DESC_BLOCKs and associated information
* IOCTL implementations for:
    - IOCTL_GET_COEFF_DESC_BLOCK_COUNT
    - IOCTL_GET_COEFF_DESC_INFO
    - IOCTL_GET_COEFF_INFO_EX
* Struct definictions for:
    - COEFF_DESC_BLOCK_COUNT_REQ*
    - COEFF_DESC_BLOCK_COUNT*
    - COEFF_DESC_INFO_REQ
    - COEFF_DESC_INFO_RESP
    - COEFF_INFO_REQ_EX
    - COEFF_INFO
* Built with VS 2017 Professional (15.9.49), Platform Toolset v141 (10.0.18362.0)


[3.2.0.0]
* Added GetActiveTuningType()
* Built with VS 2017 Professional (15.9.48), Platform Toolset v141 (10.0.18362.0)


[3.1.0.0]
* Renamed 'dieSts' UEFI/registry property (chip DIE_STS registers) to 'calTarget'
  - This helps maintain consistency with the field names in UEFI and the driver
* Only issue soft wakeup if amp is sleeping, to optimize coefficient reads
* Deprecated support to read CalPrevious in QueryStoredCalibration
* Updated copyright date range (2019-2022)
* Built with VS 2017 Professional (15.9.48), Platform Toolset v141 (10.0.18362.0)


[3.0.0.0]
* Added support for SoundWire devices
  - Added support for DRIVER_SRC_ANY, indicating to use any driver source type that is found (whichever is enumerated first)
  - Added support for DRIVER_SRC_SNDW, indicating to filter the driver source type to only SoundWire devices
  - Refactored implementation of getUfdDeviceHandle()
    -- Support now exists to specifically request a particular driver instance (UID)
    -- Legacy callers can still call with no arguments, to get the first enumerated device of the specified type
  - Added support for SNDW devices under MAN_01FA:
    -- PART_3546 (Franklin SoundWire)
    -- PART_3556 (Jamerson SoundWire)
    -- PART_4242 (Reed SoundWire)
* Implemented Get/SetDriverSource() which gets or sets a bitfield mask for the following driver types:
  - Codec
  - Amp
  - SoundWire
  - Any (all of the above types)
* Implemented Get/SetDriverInstance() to allow a specific unique ID to optionally be specified
* Implemented DeleteStoredCalibration(), which deletes all stored calibration data from UEFI
* RunCalibration() includes the ambient temperature in the output
* Built with VS 2017 Professional (15.9.41), Platform Toolset v141 (10.0.18362.0)


[2.3.2.0]
* Calibration operations wait up to 5000ms for amp state to change to desired state
  - This is to ensure the codec driver on all platforms have ample time to issue a
    RUN or STOP command to our amp driver. Otherwise, this command may come at a later,
    unexpected time, possibly while the calibraiton routine has moved on to another phase (e.g. 'apply'),
	causing calibration failures.
* Built with VS 2017 Professional (15.9.41), Platform Toolset v141 (10.0.18362.0)


[2.3.1.0]
* SoftWakeup() will always wait at least 2 ms to allow time for the amp to awaken, in case
  a subsequent call (e.g. a register read) happens immediately after the wakeup. Without this delay,
  potentially inconsistent results have been observed (for example, register 0 having value 0x0).
* Built with VS 2017 Professional (15.9.39), Platform Toolset v141 (10.0.18362.0)


[2.3.0.0]
* Polling for RunCalibration() and ApplyCalibration() now uses fast poll with back-off strategy
* Bugfix: Moved location of GetMixerControls() in RunCalibration() after firmware load
* Implemented debug functions to query interrupts and halo heartbeat
* Built with VS 2017 Professional (15.9.38), Platform Toolset v141 (10.0.18362.0)


[2.2.0.0]
* Reading or writing data to the driver now forces direct buffer access. This includes:
  - Generic R/W data
  - Load user firmware
  - Load user tunings
  - Load user delta tunings
* IOCTL struct definitions are modified accordingly for use with amp driver b7.3 or greater.
* Built with VS 2017 Professional (15.9.37), Platform Toolset v141 (10.0.18362.0)


[2.1.2.0]
* PlaySilence() uses back-off strategy to wait for amp state to change.
  This will wait for up to 5000 ms before giving up.
* Debug reads for issue with DIAG finishing but CAL incomplete.
* Built with VS 2017 Professional (15.9.37), Platform Toolset v141 (10.0.18362.0)


[2.1.1.0]
* Fix SoftWakeup() exiting after a single failure on I2C, which may have been
  due to chip being asleep.
* LoadFirmware and LoadTuning ensure the amp and firmware states stay synchronized
* Built with VS 2017 Professional (15.9.37), Platform Toolset v141 (10.0.18362.0)


[2.1.0.0]
* Added support for RTLogger operations
* Improved amp state management
- Calibration and diagnostics fully rely on external codec to handle amp state
- Chip information harvested during calibration and diagnostics now collected while
  amp is guaranteed to be running
- Load firmware and tunings now wake up amp as needed
* Built with VS 2017 Professional (15.9.37), Platform Toolset v141 (10.0.18362.0)


[2.0.0.0]
* Added support to automatically detect and load the correct firmware when given a user tuning file
* Implemented amp wakeup routine which reads the DEVID register, with optional support
  to compare against the desired DEVID value.
* Standardized Windows error codes to be negative values
* Built with VS 2017 Professional (15.9.36), Platform Toolset v141 (10.0.18362.0)


[1.13.0.0]
* Added support to RunCalibration() and RunDiagnostics() to accept custom firmware
  and tuning files and bypass loading integrated firmware / tunings.
* Built with VS 2017 Professional (15.9.36), Platform Toolset v141 (10.0.18362.0)


[1.12.0.0]
* Implemented LoadUserFile()
  - This allows consumers to load any custom firmware, tuning, or delta file.
* Calculation of timestamp now performed during calibration or diagnostics
* Zero'd out PlatformCalibrationData before calling IOCTL_READ_PLATFORM_CAL_DATA
  - This may help prevent random timestamp values from appearing if no UEFI data exists
    and the user tries to query stored calibration.
* Built with VS 2017 Professional (15.9.36), Platform Toolset v141 (10.0.18362.0)


[1.11.0.0]
* Calculation of timestamp now performed during calibration or diagnostics
* Added support to select between the codec and amp driver
  - The default is to search for a matching device instance ID for the codec hardware only
  - Consumers can override to the default via SetDriverSource()
* Built with VS 2017 Professional (15.9.35), Platform Toolset v141 (10.0.18362.0)


[1.10.0.0]
* Implemented delta tuning support
  - Added functionality to load user delta tunings
  - Framework for integrated delta tunings
* Built with VS 2017 Professional (15.9.35), Platform Toolset v141 (10.0.18362.0)


[1.9.1.0]
* Increased amp wakeup time to 1 second (20 polls maximum, 50 ms apart)
* RunCalibration(), ApplyCalibration(), and RunDiagnostics() ensure that the desired firmware type is loaded
  before proceeding.
* Readback of MBOX_CMD register is performed immediately after the command is sent.
  - A negative value will cause an early exit and an error to be returned from SendMailboxCommand().
* Built with VS 2017 Professional (15.9.35), Platform Toolset v141 (10.0.18362.0)


[1.9.0.0]
* LoadFirmware() no longer requires successful STS_PAUSED
* SendMailboxCommand now reads back the MBOX_CMD register
* Built with VS 2017 Professional (15.9.35), Platform Toolset v141 (10.0.18362.0)


[1.8.0.0]
* Added ACPI\CSC vendor ID to the device instance ID discovery matching list
* Clarified device instance discovery for ACPI and HDAUDIO
* Updated Cirrus copyright range to 2021
* Built with VS 2017 Professional (15.9.34), Platform Toolset v141 (10.0.18362.0)


[1.7.2.0]
* StoreCalibration() now ignores a special case of UEFI storage failure where no
  environment variable is found. In this case, the return value will be ERROR_SUCCESS,
  unless a subsequent failure in the procedure is found.
* Built with VS 2017 Professional (15.9.30), Platform Toolset v141 (10.0.18362.0)


[1.7.1.0]
* ApplyCalibration() checks loaded firmware type and ensures it is set to Protect
  before applying calibration results.
* LoadFirmware() ensures FIRMWARE_STATUS and MBOX_STS are in sync after the operation
  is complete. A specific set of conditions could otherwise leave the FIRMWARE_STATUS
  running whereas the MBOX_STS would be PAUSED.
* Mailbox interaction can optionally resend the CMD at the start of each polling loop.
  This can be needed when the DSP is not ready or able to receive commands or respond.
* Minor improvements for firmware / tuning load robustness.
* Increased max poll attempts value for RunCalibration()
* LoadFirmware() ensures DSP state is paused before switching DSPRX sources to ZERO_FILL.
* Built with VS 2017 Professional (15.9.28), Platform Toolset v141 (10.0.18362.0)


[1.7.0.0]
* ApplyCalibration() no longer manages amp / fw wakeup or hibernation.
  - It fully relies on the codec driver to wake up the amps when audio is played.
* RunCalibration(), RunDiagnostic() no longer manage amp / fw wakeup or hibernate states.
* Reduced polling maximum attempts and poll delay for generic driver read / writes
* Built with VS 2017 Professional (15.9.28), Platform Toolset v141 (10.0.18362.0)


[1.6.0.0]
* Implemented GetActiveFirmwareType()
* Addded additional STATUS support for diagnostics to RunCalibrationHelper()
  - Calibration polls for up to 2 seconds until an expected CAL_STATUS is retreived
  - Diagnostics polls for up to 3 seconds until an expected DIAG_STATUS is retreived
* Increased duration of embedded silence wav file to 3.1 seconds
* Unified load tuning / load firmware functions for integrated (built into driver) and
  user (passed from user space) categories
* Added 10ms of sleep delay after STOP_PRE_REINIT mailbox command for loading tunings
* Manages amp & firmware hibernation states for wakeup and hibernate
  - Ensures amps are awake and firmware in a valid state for load before loading
    tunings or firmware
  - Restores original amp state and manages firmware state after load is complete
* Pauses firmware as needed before loading firmware.
* Built with VS 2017 Professional (15.9.28), Platform Toolset v141 (10.0.18362.0)


[1.5.0.0]
* Modified CSPL mailbox polling to a maximum of 5 loops x 10 ms interval
* RunCalibration() now uses an automatic retry mechanism if a fatal error is encountered
* Load integrated tuning now uses an automatic retry mechanism if a fatal error is encountered
* Implemented support to load integrated firmware
* Implemented RunDiagnostics()
* Optimized GetAmpCount()
* Built with VS 2017 Professional (15.9.27), Platform Toolset v141 (10.0.18362.0)


[1.4.2.0]
* Spoofed data now returns amp count = 4
* Spoofed data now returns variable CAL_R value based on ampIndex
* Built with VS 2017 Professional (15.9.25), Platform Toolset v141 (10.0.18362.0)


[1.4.1.0]
* Bugfix - StoreCalibration() would return an error when storing UEFI data if no UEFI
  data previously existed.
* Built with VS 2017 Professional (15.9.25), Platform Toolset v141 (10.0.18362.0)


[1.4.0.0]
* OTP now replaced with UEFI as storage medium
* Removed "slots available" from UEFI storage calibration calls.
  This only made sense in the context of OTP writes, where there was limited hardware storage space.
* Implemented query / store functions for UEFI calibration
* Improved MiscCtrl parameter for driver interaction
* Added CAL_AMBIENT param for calibration calls
* Calibration calls now retreives / stores DIE_STS, cal_time (FILETIME), and cal_ambient
* Modified CAL_TEMPERATURE struct
  - Added 'BOOL check_min_max_bounds' param
    -- If TRUE, cal_ambient will be checked to verify it is within [min, max]
        bounds.
    -- If FALSE, cal_ambient will be accepted without any bounds checking.
	   This is now the default.
  - Changed CAL_TEMPERATURE data types from DWORD to int, to allow
    negative temperature values.
* Built with VS 2017 Professional (15.9.25), Platform Toolset v141 (10.0.18362.0)


[1.3.2.0]
* Bugfix: Fix reset logic for transitioning amp state from sleep -> unknown
* Now searches for "CLSA" (wildcard) for device instance ID
* Built with VS 2017 Professional (15.9.20), Platform Toolset v141 (10.0.18362.0)


[1.3.1.0]
* Implements IOCTL_AMP_SET_STATE_UNKNOWN to put driver into state 'unknown'.
  - Walks the driver through the state graph until final desired state reached
* Built with VS 2017 Professional (15.9.20), Platform Toolset v141 (10.0.17763.0)


[1.3.0.0]
* Implements IOCTL_AMP_RESET when the driver state is 'unknown'.
  - Polls every 100 ms for up to 2000 ms until driver is at state 'sleep'
  - Subsequently walks the driver through the state graph until final desired state reached
* Built with VS 2017 Professional (15.9.20), Platform Toolset v141 (10.0.17763.0)


[1.2.1.0]
* Added device instance ID "CLSA0001" to device search list
* Built with VS 2017 Professional (15.9.19), Platform Toolset v141 (10.0.17763.0)


[1.2.0.0]
* Built with VS 2017 Professional (15.9.17), Platform Toolset v141 (10.0.17763.0)
* Implemented QueryCalControls() and exposed Get/SetAmpState()
  - QueryCalControls() returns CAL_DATA and CAL_RESULT information to the caller
  - Will wake amps if any are sleeping and put them back to sleep upon completion
  - GetAmpState() and SetAmpState() can now be used by apps that import this lib
* Added support for CAL_R_SELECTED control
* RunCalibration() and ApplyCalibration() ensure amp state is 'running' before proceeding
  - Leverages silence wav playback to awaken the amps (if not already awake)
* Implemented MBOX CMD/STS polling to alternate between sending CMD and querying
  for desired STS
* Modified polling delay (40ms) and maximum attempts (50) for a net timeout of 2 seconds.
* ApplyCalibration() ensures that CAL_SET_STATUS has changed (or poll timeout hit)
  before returning the results.
* Bugfix - ApplyCalibration() now resends STOP_PRE_REINIT command to DSP MBOX
  if integrated tuning not found
* Bugfix - ApplyCalibration() not returning actual return code in all code paths.


[1.1.0.0]
* Built with VS 2017 Professional (15.9.15), Platform Toolset v141 (10.0.17763.0)
* Updated documentation for COEFF_VALUE
* Added support for multiple COEFF_TYPE_INTEGER values inside the COEFF_VALUE struct


[1.0.0.0]
* Built with VS 2017 Professional (15.9.11), Platform Toolset v141 (10.0.17763.0)
* Contains build configurations for stand-alone lib variant and for import with a
  calibration dll.
* Exports the following functions via CalibrationAPI.h:
	- ApplyCalibration()
	- ConvertRawCalRToOhms()
	- GetCoeffCount()
	- GetCoeffInfo()
	- QueryAvailableOTP()
	- QueryStoredCalibration()
	- RunCalibration()
	- SetDataSource()
	- StoreCalibration()
