WiFiNetworkLoginSharing

Rule: RequestWiFiConnectionInfoRetried
Version: ATS 2.2
Description: This rule throws an error if an accessory retries the RequestWiFiConnectionInfo command after it receives an iPodACK. (The accessory is allowed to rety RequestWiFiConnectionInfo after receiving WiFiConnectionInfo.)
Specification: MFi Accessory Firmware Specification R46 (3.3.69)
Error: accessory must not retry the RequestWiFiConnectionInfo command after it receives an iPodACK.

Rule: WiFiNetworkLoginSharingRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the WiFiNetworkLoginSharing test if a required WiFiNetworkLoginSharing command was not seen
Specification: N/A
Error: the required command%@ %@ for the Wi-Fi Network Login Sharing test were not seen

AccessoryIdentificationiAP2

Rule: AccessoryIdentificationRequiredMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Fire an error if any of the mandatory messages are not seen during the test
Specification: Accessory Interface Specification R16 (8.2 Accessory Identification Usage)
Error: did not see required identification messages during the Automatic Tests with Apple device

Rule: DuplicateTransportComponentIdentifieriAP2
Version: ATS 3.0
Description: Fire an error if an accessory sends an IdentificationInformation with any of SerialTransportComponent, USBDeviceTransportComponent, USBHostTransportComponent, or BluetoothTransportComponent with the same TransportComponentIdentifier.
Specification: Accessory Interface Specification R16 (Table 48-8 IdentificationInformation message parameters)
Error: accessory sent a duplicate TransportComponentIdentifier of %hu

Rule: IdentificationInformationBeforeStartIdentificationiAP2
Version: ATS 3.0
Description: Fire an error if the accessory sends IdentificationInformation before receiving StartIdentification
Specification: Accessory Interface Specification R16 (8.2 Accessory Identification Usage)
Error: accessory sent IdentificationInformation before receiving StartIdentification from the Apple device

Rule: IdentificationInformationIncorrectSourceForDeclaredReceivedMessageiAP2
Version: ATS 3.2
Description: Fire if accessory declares a message as received which only the Accessory may send
Specification: Accessory Interface Specification R16 (8.2.2 Accessory Identification of Sent/Received iAP2 Control Session Messages)
Error: accessory declared to receive %1$@, but only the accessory may send these messages

Rule: IdentificationInformationIncorrectSourceForDeclaredSentMessageiAP2
Version: ATS 3.2
Description: Fire if accessory declares a message as sent which only the Apple device may send
Specification: Accessory Interface Specification R16 (8.2.2 Accessory Identification of Sent/Received iAP2 Control Session Messages)
Error: accessory declared to send %1$@, but only the Apple device may send these messages

Rule: IdentificationInformationNonUniqueSupportedMessagesListiAP2
Version: ATS 3.9
Description: Fire if accessory declares support for the same message ID more than once in MessagesSentByAccessory or MessagesReceivedFromDevice
Specification: Accessory Interface Specification R16 (48.2 Accessory Identification)
Error: accessory sent IdentificationInformation with a non-unique set of message IDs in the MessagesSentByAccessory and/or MessagesReceivedFromDevice parameters (duplicated message%1$@: %2$@)

Rule: IdentificationInformationUnknownSentOrReceivedMessageiAP2
Version: ATS 3.4
Description: Fire if accessory declares a message as sent or received which has an unknown message ID
Specification: Accessory Interface Specification R16 (8.2.2 Accessory Identification of Sent/Received iAP2 Control Session Messages)
Error: accessory declared to %1$@ unknown message ID%2$@ %3$@

Rule: IdentificationMessageSentAfterIdentificationAcceptediAP2
Version: ATS 3.0
Description: Fire an error if an accessory sends IdentificationInformation or CancelIdentification after receiving IdentificationAccepted from the Apple device.
Specification: Accessory Interface Specification R16 (8.2 Accessory Identification Usage)
Error: accessory sent %@ after already receiving IdentificationAccepted from the Apple device

Rule: MultipleTransportSupportsiAP2ConnectionParametersiAP2
Version: ATS 3.0
Description: Fire an error if an accessory sends multiple TransportComponentIdentifiers with a TransportSupportsiAP2Connection parameter
Specification: Accessory Interface Specification R16 (8.2.4 Accessory Identification of iAP2 Transport Components)
Error: accessory sent multiple TransportComponentIdentifiers with a TransportSupportsiAP2Connection parameter

Rule: NoTimelyResponseToStartIdentificationOrIdentificationRejectedMessageiAP2
Version: ATS 3.0
Description: Fire an error if no IdentificationInformation response is seen to a StartIdentification or IdentificationRejected message within 1 second
Specification: Accessory Interface Specification R16 (8.2 Accessory Identification Usage)
Error: accessory did not send IdentificationInformation within 1 second of receiving %@

Rule: NoTransportSupportsiAP2ConnectionParameteriAP2
Version: ATS 3.0
Description: Fire an error if no transport component containing a TransportSupportsiAP2Connection parameter is found
Specification: Accessory Interface Specification R16 (8.2.4 Accessory Identification of iAP2 Transport Components)
Error: accessory did not send a transport component containing TransportSupportsiAP2Connection parameter

Rule: USBHostHIDComponentUSBHostTransportComponentIdentifierInvalidiAP2
Version: ATS 3.0
Description: Fire an error if USBHostTransportComponentIdentifier in a USBHostHIDComponent does not match previously declared identifier for a USBHostTransportComponent
Specification: Accessory Interface Specification R16 (Table 48-19 USBHostHIDComponent parameter group)
Error: accessory sent a USBHostHIDComponent with a USBHostTransportComponentIdentifier that does not match an identifier in a declared USBHostTransportComponent

Rule: UnsupportedMessageSentiAP2
Version: ATS 3.0
Description: Fire an error when accessory sends a message it did not declare in its MessagesSentByAccessory parameter in IdentificationInformation after IdentificationAccepted
Specification: Accessory Interface Specification R16 (8.2.2 Accessory Identification of Sent/Received iAP2 Control Session Messages)
Error: accessory sent a message that the Apple device did not acknowledge during identification

HIDiAP2

Rule: AccessoryHIDReportPaddingBitSetToOneiAP2
Version: ATS 3.2
Description: Fire an error if any padding bits in any AccessoryHIDReport's HIDReport parameter are set to 1.
Specification: Accessory Interface Specification R16 (25.1.1 HID Report Descriptor Requirements)
Error: accessory sent AccessoryHIDReport with a HIDReport parameter in which some padding bits are set to 1

Rule: AccessoryIdentifiediAP2HIDMessagesWithoutiAP2HIDComponentiAP2
Version: ATS 3.2
Description: Fire an error if the accessory identifies for iAP2 HID messages without iAP2 HID component.
Specification: Accessory Interface Specification R16 (25.1 HID Requirements)
Error: accessory identified for iAP2 HID messages without including an iAP2 HID component

Rule: AssistiveTouchHIDComponentCountInvalidiAP2
Version: ATS 3.2
Description: Fire an error if the accessory's IdentificationInformation USBHostHIDComponents and iAP2HIDComponents contain more than one component that has the AssistiveTouch Pointer HIDComponentFunction.
Specification: Accessory Interface Specification R16 (27.1 HID AssistiveTouch Pointer Requirements)
Error: accessory sent IdentificationInformation with more than one iAP2HIDComponent or USBHostHIDComponent for HID function AssistiveTouch Pointer

Rule: AssistiveTouchRequiredHIDUsagePageMissingNativeUSBiAP2
Version: ATS 3.2
Description: Fire an error if the accessory fails to declare support for both the HID Generic Desktop usage page and Mouse usage for an AssistiveTouch Pointer.
Specification: Accessory Interface Specification R16 (27.1 HID AssistiveTouch Pointer Requirements)
Error: accessory sent an AssistiveTouch Pointer HID report descriptor without both the HID Generic Desktop usage page and the Mouse usage

Rule: AssistiveTouchRequiredHIDUsagePageMissingiAP2
Version: ATS 3.2
Description: Fire an error if the accessory specifies the AssistiveTouch Pointer HID component function in a StartHID's HIDComponentIdentifier but fails to declare support for the Generic Desktop usage page and Mouse usage in the StartHID's HIDReportDescriptor.
Specification: Accessory Interface Specification R16 (27.1 HID AssistiveTouch Pointer Requirements)
Error: accessory sent StartHID for an AssistiveTouch Pointer without including both the HID Generic Desktop usage page and the Mouse usage in the report descriptor

Rule: DuplicateHIDComponentIdentifieriAP2
Version: ATS 3.0
Description: Fire an error if a duplicate HIDComponentIdentifier is detected (across any HIDComponent type)
Specification: Accessory Interface Specification R16 (25.1 HID Requirements)
Error: accessory sent a duplicate HIDComponentIdentifier %hu

Rule: GameControllerDPadOpposingCardinalDirectionsHIDSeeniAP2
Version: ATS 3.4
Description: Fire an error if the accessory sends an AccessoryHIDReport for a Game Controller that has opposing cardinal D-Pad buttons that have non-zero values in the same HID report
Specification: Accessory Interface Specification R16 (28.1.6 Directional Pad)
Error: accessory sent %1$@ for a Gamepad with non-zero directional pad values of opposing cardinal direction

Rule: GameControllerDigitalSwitchHIDInvalidiAP2
Version: ATS 3.4
Description: Fire an error if the accessory sends StartHID with a GameController HID report descriptor that has a digital switch controls, but does not define the field correctly.
Specification: Accessory Interface Specification R16 (28.1.3 Switches and Displacement Triggers)
Error: accessory sent %1$@ for a Gamepad with a pause button digital switch that is not defined as a 1-bit value

Rule: GameControllerExtendedRequiredHIDUsagesNotDefinediAP2
Version: ATS 3.4
Description: Fire an error if the accessory uses Extended Game Contoller but doesn't provide all required usages in the HID report descriptor
Specification: Accessory Interface Specification R16 (28.1.2 Extended Gamepad)
Error: accessory sent %1$@ for a %2$@ Extended Gamepad without the following required usage%3$@ in the HID report descriptor: %4$@

Rule: GameControllerJoystickAxesHIDFieldSizeNotEqualiAP2
Version: ATS 3.4
Description: Fire an error if the accessory sends StartHID with a GameController HID report descriptor that has Joystick controls, but the axes fields aren't the same.
Specification: Accessory Interface Specification R16 (28.1.9 Joystick)
Error: accessory sent %1$@ for a Gamepad with joystick axes that are not defined with equal field sizes

Rule: GameControllerJoystickAxesNativeHIDFieldSizeNotEqualiAP2
Version: ATS 3.4
Description: Fire an error if the accessory sends HID report with a GameController HID report descriptor that has Joystick controls, but the axes fields aren't the same.
Specification: Accessory Interface Specification R16 (28.1.9 Joystick)
Error: accessory sent native HID report for a Gamepad with joystick axes that are not defined with equal field sizes

Rule: GameControllerJoystickHIDInvalidiAP2
Version: ATS 3.4
Description: Fire an error if the accessory sends StartHID with a GameController HID report descriptor that has Joystick controls, but does not define the field correctly.
Specification: Accessory Interface Specification R16 (28.1.9 Joystick)
Error: accessory sent %1$@ for a Gamepad with a joystick axis that is not defined as supporting a range of values between -2^(n-1)+1 and 2^(n-1)-1 with a signed n-bit integer where n is 8 or more

Rule: GameControllerLEDHIDInvalidiAP2
Version: ATS 3.4
Description: Fire an error if the accessory sends StartHID with a GameController HID report descriptor that has LEDs, but they aren't defined correctly
Specification: Accessory Interface Specification R16 (28.1.10 LED Array)
Error: accessory sent %1$@ for a Gamepad with LEDs that are not defined as Output fields

Rule: GameControllerPressureSensitiveSwitchHIDInvalidiAP2
Version: ATS 3.4
Description: Fire an error if the accessory sends StartHID with a GameController HID report descriptor that has Pressure Sensitive controls, but they aren't defined correctly.
Specification: Accessory Interface Specification R16 (28.1.3 Switches and Displacement Triggers)
Error: accessory sent %1$@ for a Gamepad with pressure sensitive control%2$@ %3$@ that %4$@ not defined as supporting a range of values between 0 and 2^n-1 with an unsigned n-bit integer where n is 8 or more

Rule: GameControllerProhibitedUsagesSeeniAP2
Version: ATS 3.4
Description: Fire an error if the accessory sends StartHID with any usages which aren't allowed for the current type of Gamepad. Each section of the spec explicitly lists the control surfaces which map to HID usages
Specification: Accessory Interface Specification R16 (28.1 HID Game Controller Requirements)
Error: accessory sent %1$@ with prohibited %2$@ Gamepad usages %3$@

Rule: GameControllerStandardRequiredHIDUsagesNotDefinediAP2
Version: ATS 3.4
Description: Fire an error if the accessory uses Standard Game Contoller but doesn't provide all required usages in the HID report descriptor
Specification: Accessory Interface Specification R16 (28.1.1 Standard Gamepad)
Error: accessory sent StartHID for a Standard Gamepad without the following required usage%1$@ in the HID report descriptor: %2$@

Rule: HIDFunctionClaimWithoutUSBHostHIDComponentCAiAP2
Version: ATS 3.2
Description: Fire an error if the accessory fails to identify for USBHostHIDComponents with HID functions that were claimed for.
Specification: Accessory Interface Specification R16 (25.1 HID Requirements)
Error: accessory claimed support for HID function%@ %@, but did not send IdentificationInformation with the corresponding USBHostHIDComponent%@

Rule: HIDFunctionClaimWithoutiAP2HIDComponentCAiAP2
Version: ATS 3.2
Description: Fire an error if the accessory fails to identify for iAP2HIDComponents with HID functions that were claimed for.
Specification: Accessory Interface Specification R16 (25.1 HID Requirements)
Error: accessory claimed support for HID function%@ %@, but did not send IdentificationInformation with the corresponding iAP2HIDComponent%@

Rule: HIDNativeUSBHIDReportPaddingBitSetToOneiAP2
Version: ATS 3.2
Description: Fire an error if any padding bits in any HID report sent over native USB transport are set to 1.
Specification: Accessory Interface Specification R16 (25.1.1 HID Report Descriptor Requirements)
Error: accessory sent a HID report in which some padding bits are set to 1

Rule: HIDOveriAP2MessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Fire an error if they identify for an iAP2 HID component but do not send required messages
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature when identified for iAP2 HID

Rule: IAP2HIDComponentWithoutHIDFunctionClaimCAiAP2
Version: ATS 3.2
Description: Fire an error if the accessory identifies for iAP2HIDComponents with HID functions that weren't claimed for.
Specification: Accessory Interface Specification R16 (25.1 HID Requirements)
Error: accessory sent IdentificationInformation with iAP2HIDComponent%@ for HID function%@ %@, but did not claim support

Rule: KeyboardRequiredHIDUsagePageMissingNativeUSBiAP2
Version: ATS 3.2
Description: Fire an error if the accessory fails to declare support for the HID Keyboard/Keypad usage page in a native USB HID report descriptor for a Keyboard.
Specification: Accessory Interface Specification R16 (30.1 HID Keyboard Requirements)
Error: accessory sent a Keyboard HID report descriptor without the HID Keyboard/Keypad usage page

Rule: KeyboardRequiredHIDUsagePageMissingiAP2
Version: ATS 3.2
Description: Fire an error if the accessory specifies the Keyboard HID component function in a StartHID's HIDComponentIdentifier but failes to declare support for the Keyboard HID usage page in the StartHID's HIDReportDescriptor.
Specification: Accessory Interface Specification R16 (30.1 HID Keyboard Requirements)
Error: accessory sent StartHID for a Keyboard without including the HID Keyboard/Keypad usage page in the report descriptor

Rule: KeyboardWithConsumerPageInvalidHIDUsagesiAP2
Version: ATS 3.2
Description: Fire an error if the accessory supplies Consumer Page HID usages in a StartHID's HIDReportDescriptor for keyboard that are not from the list of permitted usages.
Specification: Accessory Interface Specification R16 (Table 30-4 HID Consumer Page controls for use by keyboard components)
Error: accessory sent StartHID with prohibited Consumer Page HID usage%@ %@ in its HIDReportDescriptor for a Keyboard

Rule: MediaPlaybackRemoteInvalidHIDUsagesNativeUSBiAP2
Version: ATS 3.2
Description: Fire an error if the accessory supplies Consumer Page HID usages in a native USB HID report descriptor for Media Playback Remote that are not from the list of permitted usages.
Specification: Accessory Interface Specification R16 (Table 31-1 HID Consumer Page controls for use by media playback remote components)
Error: accessory sent Media Playback Remote HID report descriptor for interface number %hhu with prohibited Consumer Page HID usage%@ %@

Rule: MediaPlaybackRemoteInvalidHIDUsagesiAP2
Version: ATS 3.2
Description: Fire an error if the accessory supplies Consumer Page HID usages in a StartHID's HIDReportDescriptor for Media Playback Remote that are not from the list of permitted usages.
Specification: Accessory Interface Specification R16 (Table 31-1 HID Consumer Page controls for use by media playback remote components)
Error: accessory sent StartHID with prohibited Consumer Page HID usage%@ %@ in its HIDReportDescriptor for a Media Playback Remote

Rule: MediaPlaybackRemoteRequiredHIDUsagePageMissingNativeUSBiAP2
Version: ATS 3.2
Description: Fire an error if the accessory fails to declare support for the HID Consumer usage page in a native USB HID report descriptor for a Media Playback Remote.
Specification: Accessory Interface Specification R16 (31.1 HID Media Playback Remote Requirements)
Error: accessory sent a Media Playback Remote HID report descriptor without the HID Consumer usage page

Rule: MediaPlaybackRemoteRequiredHIDUsagePageMissingiAP2
Version: ATS 3.2
Description: Fire an error if the accessory fails to declare support for the HID Consumer usage page in a StartHID's HIDReportDescriptor for a Media Playback Remote.
Specification: Accessory Interface Specification R16 (31.1 HID Media Playback Remote Requirements)
Error: accessory sent StartHID for a Media Playback Remote without including the HID Consumer usage page in the report descriptor

Rule: NoHIDComponentDuringIdentificationCAiAP2
Version: ATS 3.1
Description: Fire an error if no HID components are identified during identification
Specification: N/A
Error: accessory did not declare any HID components while testing the %1$@/%2$@ feature

Rule: StartHIDHIDComponentIdentifierInvalidiAP2
Version: ATS 3.0
Description: Fire an error if the HIDComponentIdentifier in StartHID doesn't match one sent in an iAP2HIDComponent
Specification: Accessory Interface Specification R16 (25.2.1 HID over iAP2 Usage)
Error: accessory sent StartHID with HIDComponentIdentifier (%hu) that does not match a previously identified iAP2HIDComponent

Rule: StartHIDTooManyReportsDefinediAP2
Version: ATS 3.2
Description: Fire a warning if more than one HID report is defined within a single HID report descriptor.
Specification: Accessory Interface Specification R16 (25.1.1 HID Report Descriptor Requirements)
Warning: accessory sent StartHID with a HIDReportDescriptor that defines more than one HID report

Rule: StopHIDHIDComponentIdentifierInvalidiAP2
Version: ATS 3.0
Description: Fire an error if the HIDComponentIdentifier in StopHID doesn't match one sent in an iAP2HIDComponent
Specification: Accessory Interface Specification R16 (25.2.1 HID over iAP2 Usage)
Error: accessory sent StopHID with HIDComponentIdentifier (%hu) that does not match a previously identified iAP2HIDComponent

Rule: USBHostHIDComponentDuplicateInterfaceNumberiAP2
Version: ATS 3.0
Description: Fire an error if the accessory sends USBHostHIDComponents with duplicate interface numbers
Specification: Accessory Interface Specification R16 (25.1 HID Requirements)
Error: accessory sent USBHostHIDComponent with duplicate interface number of %hhu

Rule: USBHostHIDComponentUndefinedInterfaceiAP2
Version: ATS 3.0
Description: Fire an error if the accessory sends USBHostHIDComponents with an interface number that does not represent a HID USB interface that was enumerated
Specification: Accessory Interface Specification R16 (Table 48-19 USBHostHIDComponent parameter group)
Error: accessory sent USBHostHIDComponent with interface number of %hhu, but no matching HID interface was seen during USB enumeration

Rule: USBHostHIDComponentWithoutHIDFunctionClaimCAiAP2
Version: ATS 3.2
Description: Fire an error if the accessory identifies for USBHostHIDComponents with HID functions that weren't claimed for.
Specification: Accessory Interface Specification R16 (25.1 HID Requirements)
Error: accessory sent IdentificationInformation with USBHostHIDComponent%@ for HID function%@ %@, but did not claim support

Rule: USBNativeHIDTooManyReportsDefinediAP2
Version: ATS 3.2
Description: Fire a warning if the accessory provides a HID report descriptor that defines more than one HID report.
Specification: Accessory Interface Specification R16 (25.1.1 HID Report Descriptor Requirements)
Warning: accessory sent a HID report descriptor that defines more than one HID report

Rule: UsageNotSeenForSupportedHIDUsagesCAiAP2
Version: ATS 3.2
Description: Fire an error if the accessory claims support for the HID iAP2 Session feature and fails to send values for all fields defined in the HID report descriptors for the HID components identified by the accessory.
Specification: Accessory Interface Specification R16 (25.1 HID Requirements)
Error: accessory did not send AccessoryHIDReport messages containing values for the following: %@

Rule: UsageNotSeenForSupportedHIDUsagesNativeUSBCAiAP2
Version: ATS 3.2
Description: Fire an error if the accessory claims support for the HID Native Transport feature and fails to send values for all fields defined in the HID report descriptors for the HID components enumerated by the accessory.
Specification: Accessory Interface Specification R16 (25.1 HID Requirements)
Error: accessory did not send HID reports containing values for the following: %@

ExternalAccessoryProtocoliAP2

Rule: EADatagramForUnopenedSessionIdentifieriAP2
Version: ATS 3.0
Description: Fire an error if the accessory sends an EA datagram for a session identifier not currently opened (never opened by Apple device or opened and then closed)
Specification: Accessory Interface Specification R16 (47.4.1 Setup)
Error: accessory sent External Accessory datagram for unopened session identifier %hu

Rule: EAProtocolParameterSeenDuringIdentificationWithoutEAMessagesDeclarediAP2
Version: ATS 3.0
Description: Fire an error if the accessory sends an ExternalAccessoryProtocol parameter group for an EA session (not EA native transport), but did not declare support for StartExternalAccessoryProtocolSession and StopExternalAccessoryProtocolSession in its MessagesReceivedFromDevice list
Specification: Accessory Interface Specification R16 (21.1.1 iAP2 EA Session Requirements)
Error: accessory is trying to use External Accessory sessions but did not declare support for StartExternalAccessoryProtocolSession and StopExternalAccessoryProtocolSession in MessagesReceivedFromDevice

Rule: EAProtocolParameterSeenDuringIdentificationWithoutEASessionDuringLinkSynchronizationiAP2
Version: ATS 3.0
Description: Fire an error if the accessory sends an ExternalAccessoryProtocol parameter group for an EA session (not EA native transport), but did not set up an EA session during link synchronization
Specification: Accessory Interface Specification R16 (21.1.1 iAP2 EA Session Requirements)
Error: accessory is trying to use External Accessory sessions but did not set up a session during link synchronization

Rule: EASessionDuringLinkSynchronizationWithoutiAP2EASessionProtocolParameterDuringIdentificationiAP2
Version: ATS 3.1
Description: Fire an error if the accessory set up an EA session during link synchronization, but did not send an ExternalAccessoryProtocol parameter group for an EA session (not EA native transport)
Specification: Accessory Interface Specification R16 (47.4.1 Setup)
Error: accessory set up an iAP2 External Accessory session during link synchronization but did not declare any iAP2 External Accessory session protocols during identification

Rule: ExternalAccessoryProtocolIdentifierParametersNotUniqueiAP2
Version: ATS 3.0
Description: Fire an error if any ExternalAccessoryProtocolIdentifier parameters are duplicated
Specification: Accessory Interface Specification R16 (21.1 External Accessory Protocol Requirements)
Error: accessory sent a duplicate ExternalAccessoryProtocolIdentifier %hhu

Rule: ExternalAccessoryProtocolNameParametersNotUniqueiAP2
Version: ATS 3.0
Description: Fire an error if any ExternalAccessoryProtocolName parameters are duplicated
Specification: Accessory Interface Specification R16 (21.1 External Accessory Protocol Requirements)
Error: accessory sent a duplicate ExternalAccessoryProtocolName %@

Rule: ExternalAccessoryProtocolNativeTransportComponentIdentifierInvalidiAP2
Version: ATS 3.0
Description: Fire an error if NativeTransportComponentIdentifier does not match previous declared identifier of a USBHostTransportComponent
Specification: Accessory Interface Specification R16 (Table 48-10 ExternalAccessoryProtocol parameter group)
Error: the NativeTransportComponentIdentifier %hu for ExternalAccessoryProtocolIdentifier %hhu does not match a previously declared TransportComponentIdentifier from a USBHostTransportComponent

Rule: ExternalAccessorySessionMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Fire an error if required messages are not seen during the ExternalAccessory test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

Rule: NoExternalAccessoryProtocolParameterWhileIdentifyingCAiAP2
Version: ATS 3.1
Description: Throw an error if the accessory fails to identify an EA protocol parameter while identifying in the CA
Specification: N/A
Error: accessory did not declare any supported external accessory protocols while testing the %1$@/%2$@ feature

Rule: USBInterfaceDescriptorsIncorrectForEANativeTransportiAP2
Version: ATS 3.0
Description: Validate a number of requirements for the USB interface desciptors associated with EA native transport when seeing an ExternalAccessoryProtocol paramter during identification
Specification: Accessory Interface Specification R16 (21.1.2 EA Native Transport (USB Host Mode) Requirements)
Error: EA native transport USB interface descriptors for protocol %@ failed validation: %@

IPodOut

Rule: EnterExitExtendedInterfaceModeInsteadOfSetUIMode
Version: ATS 2.2
Description: This rule throws an error if the accessory uses EnterExtendedInterfaceMode or ExitExtendedInterfaceMode while identified for iPodOut
Specification: MFi Accessory Firmware Specification R46 (C.4.2)
Error: accessory sent %1$@ instead of SetUIMode while identified for iPod Out

Rule: IPodOutButtonStatusSpacingGreaterThan100ms
Version: ATS 1.5
Description: This rule throws an error if the time between two successive iPodOutButtonStatus commands (without an intervening all-buttons-up packet) is greater than 100 ms. Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.2.11)
Error: more than 100 ms have elapsed since the last iPodOutButtonStatus command without sending another

Rule: IPodOutRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the iPodOut test if an iPodOutButtonStatus command was not seen
Specification: N/A
Error: the required commands were not seen during the iPod Out test

Rule: IPodOutSimpleRemoteCommandWithoutiPodOutMode
Version: ATS 1.5
Description: This rule throws an error if the accessory sends any iPod Out Simple Remote command, such as iPodOutButtonStatus or RotationInputStatus, without first entering iPod Out mode via SetUIMode.
Specification: MFi Accessory Firmware Specification R46 (4.2.12)
Error: accessory sent an iPod Out command without first entering iPod Out mode via SetUIMode

Rule: IdenticalRotationInputStatusSpacingLessThan30ms
Version: ATS 1.5
Description: This rule throws an error if the time between two successive identical RotationInputStatus commands is less than 30 ms. Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.2.12)
Error: accessory sent identical RotationInputStatus commands less than 30 ms apart (actual %1$llu ms)

Rule: IdenticaliPodOutButtonStatusSpacingLessThan30ms
Version: ATS 1.5
Description: This rule throws an error if the time between two successive identical iPodOutButtonStatus commands is less than 30 ms. Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.2.11)
Error: accessory sent identical iPodOutButtonStatus commands within 30 ms of each other

Rule: LineOutPrefNotSetDuringIDPSForiPodOut
Version: ATS 2.2
Description: This rule throws an error if the accessory does not set its line out preference during IDPS but identified for iPod Out lingo
Specification: MFi Accessory Firmware Specification R46 (1.12)
Error: accessory attempted to enter iPod Out mode but did not send an iPodPreferenceToken with its Line Out preference during IDPS

Rule: RestrictedCommandWhileIniPodOutMode
Version: ATS 2.0
Description: Only a subset of SimpleRemote and DisplayRemoteCommands are allowed while in iPodOutMode. This rule will fire an error when a command outside of that subset is sent.
Specification: MFi Accessory Firmware Specification R46 (Table 1-16)
Error: accessory cannot send %1$@ lingo %2$@ command while in iPod Out mode

Rule: RestrictedContextButtonStatusWhileIniPodOutMode
Version: ATS 2.0
Description: The accessory is only allowed to use a subset of the ContextButtonStatus states while in iPod Out mode, so this rule will throw an error if the accessory uses a restricted ContextButtonStatus state. (See section "Supported Simple Remote and Display Remote Commands" R42, p.60).
Specification: MFi Accessory Firmware Specification R46 (Table 1-16)
Error: accessory sent restricted button state in ContextButtonStatus while in iPod Out mode

Rule: RotationInputStatusSpacingGreaterThan100ms
Version: ATS 1.5
Description: This rule throws an error if the time between two successive RotationInputStatus commands (without an intervening Rotation action completed packet) is greater than 100 ms. Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.2.12)
Error: more than 100 ms have elapsed since the last RotationInputStatus command without sending another

Rule: ScreenInfoTokenDeprecated
Version: ATS 2.2
Description: This rule throws a warning if the accessory sends the deprecated ScreenInfoToken
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Warning: ScreenInfoToken is deprecated

Rule: TestPatternProhibitedInProductionFirmware
Version: ATS 2.2
Description: This rule throws an error whenever seeing a request to enable the test pattern. This is because we do not want the request for the test pattern ever making it into production firmware.
Specification: MFi Accessory Firmware Specification R46 (Table 4-262)
Error: The iPod Out test pattern is acceptable to be used only during development. Do not request it in production firmware.

Rule: VideoMonitorAspectRatioNotFullscreenWhenEnteringiPodOutMode
Version: ATS 1.5
Description: This rule throws a warning if the accessory sets the video monitor aspect ratio preference to something other than fullscreen (4:3 aspect ratio) via SetiPodPreferences before entering iPod Out mode via SetUIMode. rdar://problem/11992600 Vet VideoMonitorAspectRatioNotFullscreenWhenEnteringiPodOutMode
Specification: N/A
Warning: recommend setting video monitor aspect ratio to 4:3 (fullscreen) before entering iPod Out mode

Rule: VideoOutConnectionPrefNotSetDuringIDPSForiPodOut
Version: ATS 2.2
Description: This rule throws an error if the accessory identifies for iPod Out lingo but does not set its Video Out Connection preference using an iPodPreferenceToken during IDPS.
Specification: MFi Accessory Firmware Specification R46 (1.12.1)
Error: accessory attempted to enter iPod Out mode but did not send an iPodPreferenceToken with its Video Out Connection preference during IDPS

Rule: VideoOutNotTurnedOnDuringIDPSForiPodOut
Version: ATS 2.2
Description: This rule throws an error if the accessory identifies for iPod Out lingo but does not turn on video out using an iPodPreferenceToken during IDPS.
Specification: MFi Accessory Firmware Specification R46 (1.12.1)
Error: accessory attempted to enter iPod Out mode but did not turn on video out using an iPodPreferenceToken during IDPS

Rule: VideoSignalFormatNotNTSCWhenEnteringiPodOutMode
Version: ATS 2.0
Description: This rule throws a warning if the accessory sets the video signal format preference to something other than NTSC via SetiPodPreferences before entering iPod Out mode via SetUIMode. rdar://problem/11992603 Vet VideoSignalFormatNotNTSCWhenEnteringiPodOutMode
Specification: MFi Accessory Firmware Specification R46 (1.12)
Warning: recommend setting video signal format to NTSC before entering iPod Out mode

Rule: VideoSignalFormatPrefNotSetDuringIDPSForiPodOut
Version: ATS 2.2
Description: This rule throws an error if the accessory identifies for iPod Out lingo but does not set its Video Signal Format preference using an iPodPreferenceToken during IDPS.
Specification: MFi Accessory Firmware Specification R46 (1.12)
Error: accessory attempted to enter iPod Out mode but did not send an iPodPreferenceToken with its Video Signal Format preference during IDPS

StorageLingoAccessory

Rule: FileWriteBeforeOpen
Version: ATS 1.1
Description: This rule throws an error if WriteiPodFileData is used before OpeniPodFeatureFile is sent.
Specification: MFi Accessory Firmware Specification R46 (4.11.7)
Error: accessory sent WriteiPodFileData without sending OpeniPodFeatureFile first

Rule: SecondOpeniPodFeatureFileWithoutCloseiPodFile
Version: ATS 1.1
Description: This rule throws an error if two Storage Lingo OpeniPodFeatureFile commands of the same type are sent without an intervening CloseiPodFile or negative iPodAck.
Specification: MFi Accessory Firmware Specification R46 (4.11.11)
Error: accessory called OpeniPodFeatureFile of the same feature type twice without an intervening CloseiPodFile or negative iPodAck

Rule: StorageRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the Storage test if a required Storage command was not seen
Specification: N/A
Error: the required commands for the Storage test were not seen

Rule: WriteBeforeOpeniPodFeatureFileACK
Version: ATS 1.1
Description: This rule throws an error if an accessory tries to write to a file before OpeniPodFeatureFile is ACKed.
Specification: MFi Accessory Firmware Specification R46 (4.11.7)
Error: accessory sent WriteiPodFileData without waiting for ACK from OpeniPodFeatureFile

Rule: WriteToWrongFileHandle
Version: ATS 1.1
Description: This rule throws an error if an accessory tries to write to a file handle other than the one provided by OpeniPodFeatureFile.
Specification: MFi Accessory Firmware Specification R46 (4.11.7)
Error: accessory attempted to write to a file handle other than the one returned by RetiPodFileHandle

VoiceOveriAP2

Rule: VoiceOverMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if the accessory fails to send mandatory messages during the VoiceOver test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

Rule: VoiceOverOptionalMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if optional but supported messages are not seen during the VoiceOver test
Specification: N/A
Error: did not see supported message%2$@ %1$@ while testing the %3$@ feature

USBChargingPowerSource

Rule: SetAvailableCurrentNotSentAfterAuth
Version: ATS 2.2
Description: This CA-only rule thows an error if the accessory does not send a SetAvailableCurrent command 1 second after authentication completes successfully. (Currently only enabled for USB Host Mode accessories). See rdar://problem/10011965 - Rules: Require use of SetAvailableCurrent over D+/D- resistors and USB Vendor Request when iAP is in use
Specification: MFi Accessory Hardware Specification R9 (pg. 33)
Error: accessory did not send SetAvailableCurrent within 1 second after authentication completes

Rule: SetAvailableCurrentValueIncorrectForSupportedAppleDevicesCA (Product Plan Rule)
Version: ATS 2.3
Description: This CA-only rule fires an error if the accessory sends a SetAvailableCurrent command with a value of less than 1000 mA when an iPod or iPhone is supported by the ProductPlan or less than 2100 mA when an iPad is supported by the ProductPlan
Specification: MFi Accessory Hardware Specification R9 (pg. 33)
Error: accessory sent SetAvailableCurrent with a value of %hu mA, but the accessory's claims indicate support for devices requiring at least %hu mA

Rule: USBChargingPowerSourceType500mADeprecated30Pin
Version: ATS 2.0
Description: This rule throws a warning if the accessory identifies itself as a 500mA charger using the D+/- resistor networks.
Specification: MFi Accessory Hardware Specification R9 (pg. 31)
Warning: accessory presented D+ and D- resistors of the deprecated 500 mA charger

Rule: USBDMinusDrivenWithoutUSBVbus30Pin (Product Plan Rule)
Version: ATS 1.2
Description: This rule throws an error if the accessory drives USB D- but does not drive USB Vbus. It will fire every time the value of D- changes.
Specification: MFi Accessory Hardware Specification R9 (pg. 30)
Error: accessory is not driving USB Vbus, but the accessory's claims indicate that it should drive USB Vbus

Rule: USBDMinusResistorIncorrectFor1A30Pin (Product Plan Rule)
Version: ATS 1.2
Description: This rule throws an error if the accessory does not present a correct resistor for D- for a claimed 1 A USB Vbus power source. It will fire every time the value of D- changes.
Specification: MFi Accessory Hardware Specification R9 (pg. 31)
Error: accessory presented an incorrect D- resistor value for the 1 A USB Vbus power source claims selection

Rule: USBDMinusResistorIncorrectFor2Point1A30Pin (Product Plan Rule)
Version: ATS 1.4
Description: This rule throws an error if the accessory does not present a correct resistor for D- for a claimed 2.1 A USB Vbus power source. It will fire every time the value of D- changes.
Specification: MFi Accessory Hardware Specification R9 (pg. 31)
Error: accessory presented an incorrect D- resistor value for the 2.1 A USB Vbus power source claims selection

Rule: USBDMinusResistorIncorrectFor500mA30Pin (Product Plan Rule)
Version: ATS 1.2
Description: This rule throws an error if the accessory does not present a correct resistor for D- for a claimed 500 mA USB Vbus power source. It will fire every time the value of D- changes.
Specification: MFi Accessory Hardware Specification R9 (pg. 31)
Error: accessory presented an incorrect D- resistor value for the 500 mA USB Vbus power source claims selection

Rule: USBDPlusDrivenWithoutUSBVbus30Pin (Product Plan Rule)
Version: ATS 1.2
Description: This rule throws an error if the accessory drives USB D+ but does not drive USB Vbus. It will fire everytime the value of D+ changes.
Specification: MFi Accessory Hardware Specification R9 (pg. 30)
Error: accessory is not driving USB Vbus, but the accessory's claims indicate that it should drive USB Vbus

Rule: USBDPlusResistorIncorrectFor1A30Pin (Product Plan Rule)
Version: ATS 1.4
Description: This rule throws an error if the accessory does not present a correct resistor for D+ for a claimed 1 A USB Vbus power source. It will fire every time the value of D+ changes.
Specification: MFi Accessory Hardware Specification R9 (pg. 31)
Error: accessory presented an incorrect D+ resistor value for the 1 A USB Vbus power source claims selection

Rule: USBDPlusResistorIncorrectFor2Point1A30Pin (Product Plan Rule)
Version: ATS 1.4
Description: This rule throws an error if the accessory does not present a correct resistor for D+ for a claimed 2.1 A USB Vbus power source. It will fire every time the value of D+ changes.
Specification: MFi Accessory Hardware Specification R9 (pg. 31)
Error: accessory presented an incorrect D+ resistor value for the 2.1 A USB Vbus power source claims selection

Rule: USBDPlusResistorIncorrectFor500mA30Pin (Product Plan Rule)
Version: ATS 1.4
Description: This rule throws an error if the accessory does not present a correct resistor for D+ for a claimed 500 mA USB Vbus Power Source. It will fire every time the value of D+ changes.
Specification: MFi Accessory Hardware Specification R9 (pg. 31)
Error: accessory presented an incorrect D+ resistor value for the 500 mA USB Vbus power source claims selection

Rule: USBVbusVoltageAtAcceptableLevelDuringLoadTest30Pin
Version: ATS 2.0
Description: This rule outputs an informational message if the accessory Vbus voltage is at an acceptable level during a USB Vbus load test.
Specification: MFi Accessory Hardware Specification R9 (pg. 31)
Information: accessory is driving USB Vbus voltage at an acceptable level of %1$1.2lf V while under load

Rule: USBVbusVoltageReturnedToAcceptableLevel30Pin
Version: ATS 2.0
Description: This rule prints an informational message when the USB Vbus voltage returns to an acceptable level between 4.745 V and 5.255 V after momentarily being low or high.
Specification: MFi Accessory Hardware Specification R9 (pg. 32)
Information: <USB Vbus voltage returned to an acceptable level (measured as %1$.2lf V)>

Rule: USBVbusVoltageTooHigh30Pin
Version: ATS 1.2
Description: This rule throws an error if the accessory drives USB Vbus to a value greater than 5.255 V. It will fire every time the value of Vbus changes. If the accessory returns Vbus to within spec, an informative message will be displayed. Note: this threshold value is derived from the general USB spec which requires Vbus voltage to be within +/- 5% of 5 V.
Specification: MFi Accessory Hardware Specification R9 (pg. 32)
Error: accessory is driving USB Vbus voltage too high (measured as %1$.2lf V, threshold is 5.25 V)

Rule: USBVbusVoltageTooLow30Pin
Version: ATS 1.2
Description: This rule throws a warning if the accessory drives USB Vbus to a value less than 4.70 V for 500mA and 1A chargers and less than 4.55 V for 2.1A chargers (this includes both brick chargers and accessories which speak iAP over serial and use SetAvailableCurrent). For iAP over USB accessories which drive USB Vbus, the threshold is set to 4.90 V for both 1A and 2.1A accessories. It will fire the first time Vbus drops below the threshold. Note: For iAP over USB accessories, the hardware rule engine has no way of determining if the accessory is a 1A charger or a 2.1A charger so we default to the lower threshold of 4.90V.
Specification: MFi Accessory Hardware Specification R9 (pg. 32)
Warning: accessory is driving USB Vbus voltage too low (measured as %1$.2lf V, threshold is %2$.2f V)

Rule: USBVbusVoltageTooLowDuringLoadTest30Pin
Version: ATS 2.0
Description: This rule throws an error if the accessory Vbus voltage drops below the required threshold during a USB Vbus load test.
Specification: MFi Accessory Hardware Specification R9 (pg. 31)
Error: accessory is driving USB Vbus voltage too low while under load (measured as %1$1.2lf V, threshold is %2$1.2lf V)

Rule: USBVbusVoltageTooLowExtended30Pin
Version: ATS 1.2
Description: This rule will throw an error if the accessory remains in the USBVbusVoltageTooLow30Pin state for more than 5 seconds. See USBVbusVoltageTooLow30Pin description for more details on the particular state.
Specification: MFi Accessory Hardware Specification R9 (pg. 32)
Error: accessory has been driving USB Vbus voltage too low for more than 5 seconds (measured as %1$.2lf V, threshold is %2$.2lf V)

NowPlayingiAP2

Rule: NowPlaying3rdPartyAppNotSeenCAiAP2
Version: ATS 3.2
Description: Throw an error if NowPlaying updates haven't been seen from at least one 3rd party app
Specification: Accessory Interface Specification R16 (35.1 Now Playing Updates Requirements)
Error: did not see any NowPlayingUpdate messages from a 3rd party app while testing the %1$@ feature

Rule: NowPlayingAppleAppsNotSeenCAiAP2
Version: ATS 3.2
Description: Throw an error if NowPlaying updates haven't been seen from all Apple-developed iOS apps
Specification: Accessory Interface Specification R16 (35.1 Now Playing Updates Requirements)
Error: did not see any NowPlayingUpdate messages from %1$@ while testing the %2$@ feature

Rule: NowPlayingMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if the accessory fails to send mandatory messages during the NowPlaying test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

Authentication

Rule: AuthenticationV2BadIDLDeviceID
Version: ATS 1.0
Description: This rule throws an error if the wrong device ID is seen for authentication V2. rdar://problem/11942362 Vet AuthenticationV2BadIDLDeviceID
Specification: N/A
Error: accessory sent IdentifyDeviceLingoes with wrong device ID for V2 authentication

Rule: AuthenticationV2Timeout150s
Version: ATS 1.0
Description: This rule throws an error if authentication times out. The spec allows 2 retries with a maximum 150 seconds for both retries. We will not count retries here, but just measure the time from the first V2 IDL to the first successful L00_AckAccessoryAuthenticationStatus. This will also be cancelled by a Bad Parameter ACK to the IDL, in the event that the iPod doesn't support authentication.
Specification: MFi Accessory Firmware Specification R46 (2.4.2)
Error: accessory started authentication but did not complete the process successfully within 150 seconds

Rule: DeviceIDNotZeroOrTwoHundred
Version: ATS 2.2
Description: This rule throws an error if the accessory declares a device ID other than 0x00 or 0x0200 rdar://problem/11942374 Vet DeviceIDNotZeroOrTwoHundred
Specification: N/A
Error: invalid accessory device id 0x%1$x

Rule: DidNotWaitAfterAuthenticationFailed
Version: ATS 2.2
Description: This rule throws and error if the accessory does not waith at least 5 seconds after authentication fails before sending StartIDPS or IDL again. See radar rdar://problem/9725508.
Specification: MFi Accessory Firmware Specification R46 (2.4.3)
Error: accessory must wait at least 5 seconds after authentication fails before retrying the identification process

Rule: RetAccessoryAuthInfoNotV2
Version: ATS 2.2
Description: This rule throws an error if RetAccessoryAuthenticationInfo uses anything other than Auth 2.0
Specification: MFi Accessory Firmware Specification R46 (2.4.2)
Error: accessory did not use authentication v2

MisciAP2

Rule: FileTransferWithoutFileTransferSessioniAP2
Version: ATS 3.0
Description: Throw an error if the accessory requests a file transfer but did not negotiate a file transfer session
Specification: Accessory Interface Specification R16 (47.3.1 TransferIdentifier)
Error: accessory requested a file transfer but did not negotiate a file transfer session during link synchronization

Rule: Measured55Or5ABaudRateOutOfRange8PiniAP2
Version: ATS 3.0 (External Only)
Description: Fire an error if the accessory sends a packet with a 0x55 or 0x5A baud rate outside of 57600 +/-2%.
Specification: Accessory Interface Specification R16 (Table 37-1 Serial transport mark and space levels for Apple devices)
Error: accessory baud rate of %u bps (as measured by the 0x55 or 0x5A byte) is outside of the acceptable range (57600 bps +/- 2 percent)

USBHostMode

Rule: DeprecatedRoleSwitchSeen
Version: ATS 4.0
Description: Fire a warning if the accessory uses the deprecated role swap (0x50) command.
Specification: Accessory Interface Specification R8 (33.2)
Warning: accessory used deprecated USB role switch

Rule: DigitalAudioLingoInUSBHostMode30Pin
Version: ATS 2.0
Description: This rule throws an error if the accessory trys to use the Digital Audio lingo while the Apple device is in USB Host Mode. (see p.57 of HWSpec_R6_101029)
Specification: MFi Accessory Firmware Specification R46 (4.10)
Error: accessory cannot use the Digital Audio lingo in USB Host Mode

Rule: NoNotifyUSBModeDevACKWithin500ms
Version: ATS 1.4
Description: This rule throws an error if the accessory does not respond to NotifyUSBMode with a DevACK within 500 ms. Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.6.3)
Error: accessory did not respond within 500 ms to NotifyUSBMode

Rule: USBAudioAccCapWhenNotInUSBDeviceMode30Pin
Version: ATS 2.0
Description: This rule throws an error if the accessory trys to set the USB audio AccCap bit (0x04) when the Apple device is not in USB Device Mode. (Accessories with a USB Audio Class Interface [that work with an iOS device in USB Host Mode] do not need to set this bit)
Specification: MFi Accessory Firmware Specification R46 (Table 3-71)
Error: USB audio bit was set in AccessoryCapsToken when Apple device is not in USB Device Mode

Rule: USBHostModeInterruptInEndpointOptional
Version: ATS 3.4
Description: The Interrupt In endpoint is not used and has been removed from the spec as per rdar://problem/14564578 Update USB Host Mode requirements to make the interrupt IN endpoint optional This rule will warn developers of the change
Specification: Accessory Interface Specification R16 (Table 42-1 USB Host Mode iAP2 interface descriptor)
Warning: interrupt IN endpoint is deprecated for the USB Host Mode iAP Interface

HardwareCommon

Rule: AccTxVoltageLogicHighTooHigh30Pin
Version: ATS 1.0
Description: This rule throws an error if the accessory's Tx-to-iPod (pin 18) logic-high voltage is above 3.465 V.
Specification: MFi Accessory Hardware Specification R9 (pg. 51)
Error: accessory Tx-to-iPod (pin 18) is (%1$.2lf V), higher than the maximum allowed logic high voltage of 3.465 V.

Rule: AccessoryConnectedAtStartOfTrace8Pin
Version: ATS 3.0
Description: Throw a warning if an accessory is connected when the capture begins "Capture Begins" is detected as the first Accessory connection info frame from the R3 box
Specification: N/A
Warning: accessory should not be connected when capture begins

Rule: AccessoryInvalidConnectionLightningTo30PinAdapter8Pin
Version: ATS 3.2
Description: Throw an error if connect a Lightning to 30-pin Adapter to the accessory side of the ATS Lightning Box.
Specification: N/A
Error: %1$@ was connected to the accessory side of the ATS Lightning Box

Rule: AccessoryInvalidConnectionOrientation8Pin
Version: ATS 3.0
Description: Throw an error if the accessory is connected in the wrong orientation
Specification: N/A
Error: accessory was attached in the incorrect orientation

Rule: AppleDeviceConnectedAtStartOfTrace8Pin
Version: ATS 3.0
Description: Throw a warning if an Apple device is connected when the capture begins "Capture Begins" is detected as the first Apple device connection info frame from the R3 box
Specification: N/A
Warning: Apple device should not be connected when capture begins

Rule: AppleDeviceConnectionOutOfOrder8Pin
Version: ATS 3.0
Description: Throw a warning if the Apple device is connected before the Accessory is connected
Specification: N/A
Warning: accessory must be connected to the ATS Lightning Box before the Apple device is connected

Rule: Baud55Not19200Or5760030Pin
Version: ATS 1.0
Description: This rule throws an error if the accessory sends a packet with a 0x55 baud rate outside of 19200 or 57600 +/-2%.
Specification: MFi Accessory Hardware Specification R9 (pg. 52)
Error: accessory baud rate of %u bps (as measured by the 0x55 byte) is outside of the acceptable range (19200 or 57600 bps +/- 2 percent)

Rule: BaudFFNot19200Or5760030Pin
Version: ATS 1.0
Description: This rule throws an error if the accessory sends a packet with a 0xFF baud rate outside of 19200 +/- 2% or 57600 +/- 2%.
Specification: MFi Accessory Hardware Specification R9 (pg. 52)
Error: accessory baud rate of %u bps (as measured by the 0xFF byte) is outside of the acceptable range (19200 or 57600 bps +/- 2 percent)

Rule: DeprecatedFireWirePowerPresent30Pin
Version: ATS 1.4
Description: This rule throws an error if the accessory applies non-zero FireWire voltage to pin 11 or pin 12. (The actual test value is about 0.5 V to allow for some measurement error.) Note: Need to update in Future to allow DisplayPort accessories to drive these pins. (stripped from 1.5)
Specification: MFi Accessory Hardware Specification R9 (pg. 19)
Error: the accessory drives FireWire pins, which is not allowed

Rule: DevicePowerVoltageTooLowExtended8Pin
Version: ATS 3.0
Description: Throw an error if voltage remains too low for 5 seconds. Timeout begins when voltage initially goes too low, and cancels if voltage goes to an acceptable state
Specification: Accessory Interface Specification R16 (36.1.1 Accessory Power Source Requirements)
Error: accessory has been driving device power voltage too low for more than 5 seconds (measured as %1$.2lf V, threshold is %2$.2lf V)

Rule: DevicePowerVoltageTooLowLoadTest8Pin
Version: ATS 3.0
Description: Throw an error if voltage goes too low from not being too low in the previous measurement (eg. doesn't re-throw for multiple too-low measurements)
Specification: Accessory Interface Specification R16 (36.1.1 Accessory Power Source Requirements)
Error: accessory is driving device power voltage too low (measured as %1$.2lf V, threshold is %2$.2f V)

Rule: LightningModuleConfigurationDeprecated8Pin
Version: ATS 3.9
Description: Throw an error if the detected Lightning module configuration is deprecated.
Specification: Accessory Interface Specification R16 (4.3 Connector Pad/Pin Configuration)
Warning: accessory's embedded Lightning module configuration \"%1$@\" is deprecated

Rule: LightningModuleFunctionalVariantIncorrectCA8Pin
Version: ATS 3.1
Description: Throw an error if the detected Lightning module functional variant does not match the one selected in the Product Plan.
Specification: Accessory Interface Specification R16 (4.3 Connector Pad/Pin Configuration)
Error: accessory's embedded Lightning module functional variant \"%1$@\" does not match the functional variant selected in the accessory's MFi Product Plan \"%2$@\"

Rule: MeasuredFFBaudRateOutOfRange8Pin
Version: ATS 3.0 (External Only)
Description: Fire an error if the accessory sends a packet with a 0xFF baud rate outside of 57600 +/-2%.
Specification: Accessory Interface Specification R16 (Table 37-1 Serial transport mark and space levels for Apple devices)
Error: accessory baud rate of %u bps (as measured by the 0xFF byte) is outside of the acceptable range (57600 bps +/- 2 percent)

Rule: ResistorsIncorrectForClaimedCurrentCA8Pin
Version: ATS 3.1
Description: Throw an error if accessory that does not speak iAP presents resistors that do not match those expected for the claimed current
Specification: N/A
Error: accessory is presenting the incorrect D+/D- values for the %1$@ claim selection

VideoOutAccessory

Rule: NoSetOrCheckiPodPreferencesVideoBeforeVideoOutEnabled
Version: ATS 1.3
Description: This rule throws a warning if an accessory turns on video out without first checking or setting video preferences. This is meant to catch accessories that don't even bother checking the video settings (which might have sensible defaults) before turning video on. Notes: Updated with IDPS support
Specification: MFi Accessory Firmware Specification R46 (3.3.34)
Warning: accessory attempted to turn on video out without setting or checking required video preferences first

Rule: VideoOutRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the Video Out test if a required Video Out command was not seen
Specification: N/A
Error: the required commands for the Video Out test were not seen

USBHIDReport

Rule: AccessoryHIDReportNotDevACKed
Version: ATS 2.0
Description: This rule throws an error if the accessory fails to send DevACK in response to AccessoryHIDReport within 500 ms.
Specification: MFi Accessory Firmware Specification R46 (4.2.17)
Error: accessory failed to respond to AccessoryHIDReport with an AccessoryAck within 500 ms

Rule: ClosedDescriptorInUnregisterDescriptor
Version: ATS 2.0
Description: This rule throws an error if the accessory sends UnregisterDescriptor with a descriptor index that has already been unregistered.
Specification: MFi Accessory Firmware Specification R46 (4.2.18)
Error: accessory sent UnregisterDescriptor with a descriptor index that has already been unregistered

Rule: IPodHIDReportBeforeRegisterDescriptorACKed
Version: ATS 2.0
Description: This rule throws an error if the accessory sends iPodHIDReport before RegisterDescriptor is successfully ACKed by the iPod.
Specification: MFi Accessory Firmware Specification R46 (4.2.15)
Error: accessory sent iPodHIDReport before receiving an iPodAck for RegisterDescriptor with descriptor index %1$u

Rule: RegisterDescriptorHasAppleVID
Version: ATS 2.0 (External Only)
Description: Throw an error if an accessory sends RegisterDescriptor with an Apple VID.
Specification: MFi Accessory Firmware Specification R46 (4.2.15)
Error: VID %1$hu (0x%1$04X) is reserved for Apple accessories

Rule: UnknownDescriptorInUnregisterDescriptor
Version: ATS 2.0
Description: This rule throws an error if the accessory sends UnregisterDescriptor with a descriptor index that does not match a descriptor index sent in RegisterDescriptor.
Specification: MFi Accessory Firmware Specification R46 (4.2.18)
Error: accessory sent UnregisterDescriptor with an unknown descriptor index

Rule: UnknownDescriptorIniPodHIDReport
Version: ATS 2.0
Description: This rule throws an error if the accessory sends iPodHIDReport with a descriptor index that does not match a descriptor index sent in RegisterDescriptor.
Specification: MFi Accessory Firmware Specification R46 (4.2.15)
Error: accessory sent iPodHIDReport with an unregistered descriptor index

AuthenticationiAP2

Rule: AccessoryAuthenticationCertificateSerialUnparsableiAP2
Version: ATS 3.0
Description: This rule fires an error when the cert serial number value in the certificate is unparsable, which indirectly means that the certificate is also unparsable.
Specification: Accessory Interface Specification R16 (7.2 Accessory Authentication Usage)
Error: accessory sent unparsable certificate information

Rule: AuthenticationCertificateTimeoutiAP2
Version: ATS 3.0
Description: Fire an error if AuthenticationCertificate is not seen within 1 second of receiving RequestAuthenticationCertificate
Specification: Accessory Interface Specification R16 (7.2 Accessory Authentication Usage)
Error: accessory did not send AuthenticationCertificate within 1 second of receiving RequestAuthenticationCertificate

Rule: AuthenticationRequiredMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if the accessory fails to send mandatory messages during the authentication test
Specification: N/A
Error: did not see %1$@ during the Automatic Tests with Apple device

Rule: AuthenticationResponseTimeoutiAP2
Version: ATS 3.0
Description: Fire an error if AuthenticationResponse is not seen within 2 seconds of receiving RequestAuthenticationChallengeResponse
Specification: Accessory Interface Specification R16 (7.2 Accessory Authentication Usage)
Error: accessory did not send AuthenticationResponse within 2 seconds of receiving RequestAuthenticationChallengeResponse

MediaLibraryiAP2

Rule: MediaLibraryInformationMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if required messages are not seen during the Media Library test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

Rule: MediaLibraryPlaybackOptionalMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if optional but supported messages are not seen during the Media Library test
Specification: N/A
Error: did not see supported message%2$@ %1$@ while testing the %3$@ feature

Rule: MediaLibraryPlaybackUsedWithoutMediaLibraryUpdatesCAiAP2
Version: ATS 3.1
Description: Throw an error if media library playback is used when media library updates have not been This rule uses the test ending as a point to check for usage. It doesn't specifically infer that Media Library Playback were used by the test being run
Specification: N/A
Error: accessory used Media Library Playback without using Media Library Updates while testing the %1$@ feature

Rule: MediaLibraryPlaybackWithoutMediaLibraryUpdatesInDeclarationiAP2
Version: ATS 3.0
Description: Fire an error during identification if the message list includes Media Library Playback-related messages without including Media Library Updates messages
Specification: Accessory Interface Specification R16 (33.1.2 Media Library Updates Requirements)
Error: accessory declared support for MediaLibraryPlayback messages without declaring support for MediaLibraryUpdates message%1$@: %2$@

Rule: MediaLibraryUpdatesMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if required messages are not seen during the Media Library test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

Rule: MediaLibraryUpdatesUsedWithoutMediaLibraryInformationCAiAP2
Version: ATS 3.1
Description: Throw an error if media library updates are used when media library information has not been This rule uses the test ending as a point to check for usage. It doesn't specifically infer that Media Library Updates were used by the test being run
Specification: N/A
Error: accessory used Media Library Updates without using Media Library Information while testing the %1$@ feature

Rule: MediaLibraryUpdatesWithoutMediaLibraryInformationInDeclarationiAP2
Version: ATS 3.0
Description: Fire an error during identification if the message list includes Media Library Updates-related messages without including Media Library Information messages
Specification: Accessory Interface Specification R16 (33.1.2 Media Library Updates Requirements)
Error: accessory declared support for MediaLibraryUpdates messages without declaring support for MediaLibraryInformation messages

Rule: StartMediaLibraryUpdatesWithoutCorrectLastKnownRevisioniAP2
Version: ATS 3.2
Description: Fire an error if a StartMediaLibraryUpdates is seen without a recent MediaLibraryRevision
Specification: Accessory Interface Specification R16 (33.1.2 Media Library Updates Requirements)
Error: accessory must handle incremental media library updates using a recent MediaLibraryRevision

AccessoryIdentifyResistor

Rule: CommandsFromDeviceWithResistor360k30Pin
Version: ATS 1.0.1
Description: This rule throws an error if an an accessory that claims an ID resistor of 360k sends any iAP commands.
Specification: MFi Accessory Hardware Specification R9 (pg. 115)
Error: accessories that claim a 360 kΩ ID resistor may not send iAP commands

Rule: NoTimelyiAPButiAPResistorPresented30Pin
Version: ATS 2.2
Description: This rule throws an error if the accessory uses an ID resistor claming iAP without identifying within 2 seconds
Specification: MFi Accessory Hardware Specification R9 (pg. 37)
Error: accessory did not identify within 2 seconds of indicating support for iAP by presenting a %1$@ ID resistor

Rule: ResistorIDNotValid30Pin
Version: ATS 2.0
Description: This rule generically checks for resistor values that are within +/- 2% of one of the valid ID resistor values. This rule should NOT run while the CA is running, as claim validation rules will take priority.
Specification: MFi Accessory Hardware Specification R9 (pg. 37)
Error: %@ is not a valid resistor ID

Rule: ResistorPresentButNot191k30Pin (Product Plan Rule)
Version: ATS 1.0
Description: This rule throws an error if an ID resistor outside of 191kΩ (+/-2%) is seen, but this value is claimed.
Specification: MFi Accessory Hardware Specification R9 (pg. 37)
Error: accessory presented a %@ ID resistor, but the accessory's claims indicate a 191 kΩ ID resistor

Rule: ResistorPresentButNot255kOrNone30Pin (Product Plan Rule)
Version: ATS 2.2
Description: This rule throws an error if an ID resistor outside of 255k (+/-2%) is seen, but this value is claimed. In 2.2, this rule was modified to also allow no ID resistor, because the claims will only tell us that the accessory supplies USB power and uses no iAP transport. These accessories are allowed to have either 255k or none. See radar 10176734 Update 255kΩ Rules to Allow No Resistor radar 10230898 No way to claim 255 kΩ resistor in test mode
Specification: MFi Accessory Hardware Specification R9 (pg. 37)
Error: accessory presented a %@ ID resistor, but the accessory's claims indicate it should have either a 255 kΩ ID resistor or no ID resistor

Rule: ResistorPresentButNot28k30Pin (Product Plan Rule)
Version: ATS 1.4
Description: This rule throws an error if an ID resistor outside of 28kΩ (+/-2%) is seen, but this value is claimed.
Specification: MFi Accessory Hardware Specification R9 (pg. 37)
Error: accessory presented a %@ ID resistor, but the accessory's claims indicate a 28 kΩ ID resistor

Rule: ResistorPresentButNot549k30Pin (Product Plan Rule)
Version: ATS 1.0
Description: This rule throws an error if an ID resistor outside of 549k (+/-2%) is seen, but this value is claimed.
Specification: MFi Accessory Hardware Specification R9 (pg. 37)
Error: accessory presented a %@ ID resistor, but the accessory's claims indicate a 549 kΩ ID resistor

USBDeviceModeAudioiAP2

Rule: USBDeviceModeAudioMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if the accessory fails to send mandatory messages during the USB Device Mode Audio test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

AppLaunchiAP2

Rule: AppLaunchRequiredMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Fire an error if any of the mandatory messages are not seen during the test
Specification: N/A
Error: did not see required messages while testing the %1$@ feature

GymEquipment

Rule: NoGetiPodCapsForGymEquipment
Version: ATS 1.1
Description: This rule throws an error if Sports Lingo GetiPodCaps is not sent before sending OpeniPodFeatureFile for a workout from Storage Lingo, or GetUserIndex, GetUserData, or SetUserData from Sports Lingo.
Specification: MFi Accessory Firmware Specification R46 (B.1.5.1)
Error: accessory failed to send Sports lingo GetiPodCaps before sending OpeniPodFeatureFile for a workout from Storage lingo, or GetUserIndex, GetUserData, or SetUserData from Sports lingo

Rule: NoRetAccessoryCapsForGymEquipment
Version: ATS 1.1
Description: This rule throws an error if the accessory does not send a RetAccessoryCaps with bit 9 in its capsMask set in response to a GetAccessoryCaps request.
Specification: MFi Accessory Firmware Specification R46 (4.9.7)
Error: Sports lingo accessory sending RetAccessoryCaps without bit 9 in capsMask turned on

Rule: NoRetiPodCapsForGymEquipment
Version: ATS 1.1
Description: This rule throws an error if Sports Lingo RetiPodCaps is not received before sending OpeniPodFeatureFile for a workout from Storage Lingo, or GetUserIndex, GetUserData, or SetUserData from Sports Lingo.
Specification: MFi Accessory Firmware Specification R46 (B.1.5.1)
Error: accessory failed to receive Sports lingo RetiPodCaps before sending OpeniPodFeatureFile for a workout from Storage Lingo, or GetUserIndex, GetUserData, or SetUserData from Sports lingo

Rule: SportsLingoRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the Sports Lingo test if a Sports lingo command was not seen
Specification: N/A
Error: the required commands were not seen during the Sports Lingo test

Rule: UserDataCommandSentButUserDataNotSupported
Version: ATS 1.3
Description: This rule throws an error if the accessory sends GetUserIndex, GetUserData, or SetUserData from Sports Lingo, but the last RetiPodCaps did not advertise support for user data.
Specification: MFi Accessory Firmware Specification R46 (4.9.9)
Error: accessory sent a GetUserIndex, GetUserData, or SetUserData command, but the iPod did not indicate support for user data in its last RetiPodCaps

Rule: WorkoutFeatureDeprecated
Version: ATS 3.0
Description: This rule throws a warning if the accessory uses the workout feature
Specification: MFi Accessory Firmware Specification R46 (1.16)
Warning: workout feature is deprecated

BluetoothiAP2

Rule: BluetoothComponentInformationComponentIdentifierInvalidiAP2
Version: ATS 3.0
Description: Fire an error if the ComponentIdentifier parameter is unknown in BluetoothComponentInformation
Specification: Accessory Interface Specification R16 (14.1 Bluetooth Connection Requirements)
Error: accessory sent BluetoothComponentInformation with an unknown ComponentIdentifier

Rule: BluetoothComponentInformationMissingComponentiAP2
Version: ATS 3.0
Description: Fire an error if component information isn't provided for all declared components Backing: "The accessory must report status for every identified Bluetooth component and not just for the changed component"
Specification: Accessory Interface Specification R16 (14.1 Bluetooth Connection Requirements)
Error: accessory did not report status of all identified Bluetooth transport components

Rule: BluetoothComponentInformationNoNewInformationiAP2
Version: ATS 3.0
Description: Fire an error if component information status update is identical to the previous status without any new information
Specification: Accessory Interface Specification R16 (14.1 Bluetooth Connection Requirements)
Error: accessory reported Bluetooth transport component status with no status change

Rule: BluetoothRequiredMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Fire an error if any of the mandatory messages are not seen during the test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

Rule: NoBluetoothComponentAfterIdentificationiAP2
Version: ATS 3.0
Description: Fire an error if a bluetooth component isn't identified for 2 seconds after identification Backing: "The accessory must send an initial BluetoothComponentInformation message within 2 seconds of receiving an IdentifiationAccepted message."
Specification: Accessory Interface Specification R16 (14.1 Bluetooth Connection Requirements)
Error: accessory did not immediately send BluetoothComponentInformation

Rule: NoBluetoothIdentificationCAiAP2
Version: ATS 3.1
Description: Fire an error if no Bluetooth components are identified during identification
Specification: N/A
Error: accessory did not declare any Bluetooth components while testing the %1$@ feature

Rule: StartBluetoothConnectionUpdatesBluetoothTransportComponentIdentifierInvalidiAP2
Version: ATS 3.0
Description: Fire an error if the BluetoothTransportComponentIdentifier parameter is unknown in StartBluetoothConnectionUpdates
Specification: Accessory Interface Specification R16 (14.2 Bluetooth Connection Usage)
Error: accessory sent StartBluetoothConnectionUpdates with an unknown BluetoothTransportComponentIdentifier

RFTuner

Rule: HDRadioCommandWithoutHDCapableBit
Version: ATS 1.4
Description: throw an error if the accessory sends RetHDProgramServiceCount without setting the HD capable bit in the previous RetTunerCaps command throw an error if the accessory sends RetHDProgramService without setting the HD capable bit in the previous RetTunerCaps command throw an error if the accessory sends RetHDDataReadStatus without setting the HD capable bit in the previous RetTunerCaps command throw an error if the accessory sends RetHDData without setting the HD capable bit in the previous RetTunerCaps command throw an error if the accessory sends RetHDDataNotifyMask without setting the HD capable bit in the previous RetTunerCaps command
Specification: MFi Accessory Firmware Specification R46 (4.7.7)
Error: accessory sent an HD radio command without setting the HD capable bit in the previous RetTunerCaps command

Rule: NoResponseToGetHDData
Version: ATS 1.4
Description: throw an error if the accessory doesn’t respond to GetHDData with RetHDData or NACK within 500 ms Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.7.46)
Error: accessory did not respond within 500 ms to GetHDData with transaction ID %1$hu

Rule: NoResponseToGetHDDataNotifyMask
Version: ATS 1.4
Description: throw an error if the accessory doesn’t respond to GetHDDataNotifyMask with RetHDDataNotifyMask or NACK within 500 ms Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.7.48)
Error: accessory did not respond within 500 ms to GetHDDataNotifyMask with transaction ID %1$hu

Rule: NoResponseToGetHDDataReadyStatus
Version: ATS 1.4
Description: throw an error if the accessory doesn’t respond to GetHDDataReadyStatus with RetHDDataReadyStatus or NACK within 500 ms Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.7.44)
Error: accessory did not respond within 500 ms to GetHDDataReadyStatus with transaction ID %1$hu

Rule: NoResponseToGetHDProgramService
Version: ATS 1.4
Description: throw an error if the accessory doesn’t respond to GetHDPRogramService with RetHDProgramService or NACK within 500 ms Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.7.41)
Error: accessory did not respond within 500 ms to GetHDProgramService with transaction ID %1$hu

Rule: NoResponseToGetHDProgramServiceCount
Version: ATS 1.4
Description: throw an error if the accessory doesn’t respond to GetHDProgramServiceCount with RetHDProgramServiceCount or NACK within 500 ms
Specification: MFi Accessory Firmware Specification R46 (4.7.39)
Error: accessory did not respond within 500 ms to GetHDProgramServiceCount with transaction ID %1$hu

Rule: RFTunerRequestTimedOut
Version: ATS 2.2
Description: This rule throws an error if an RFTuner command takes too long to respond
Specification: MFi Accessory Firmware Specification R46 (4.1)
Error: accessory exceeded response timeout of %1$d ms for command %2$@

Rule: ResponseToGetTunerFreqGreaterThan200ms
Version: ATS 1.4
Description: Throw an error if the accessory doesn't send a RetTunerFreq within 200 ms of GetTunerFreq. Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.7.15)
Error: accessory did not respond within 200 ms to GetTunerFreq with transaction ID %1$hu

Rule: ResponseToSetTunerFreqGreaterThan200ms
Version: ATS 1.4
Description: Throw an error if the accessory doesn't send a RetTunerFreq within 200 ms of SetTunerFreq. Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.7.15)
Error: accessory did not respond within 200 ms to SetTunerFreq with transaction ID %1$hu

Location

Rule: AsyncAccessoryDataLocationTypeNotSupportedByAcc
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AsyncAccessoryData command with a location type that does not match the types supported in the accessory's last RetAccessoryCaps of location type "System".
Specification: MFi Accessory Firmware Specification R46 (4.13.14)
Error: accessory sent AsyncAccessoryData with a location type that does not match the types supported in the last RetAccessoryCaps of location type 'System'

Rule: AsyncAccessoryDataSentWithoutWaitingForiPodACK
Version: ATS 1.3
Description: This rule throws an error if the accessory sends data to the iPod using AsyncAccessoryData while previous data that has been sent has not been ACKed with an iPodACK and has not yet timed out.
Specification: MFi Accessory Firmware Specification R46 (2.7.1)
Error: accessory sent AsyncAccessoryData without first waiting for iPodAck from a previous AsyncAccessoryData or sending an AccessoryAck with 'Command Timeout' status

Rule: CurrentGPSTimeSentTooFrequently
Version: ATS 1.3
Description: This rule throws a warning if the accessory sends GPS time (using AsyncAccessoryData with locType=LocAssist and dataType=GpsTime) more frequently than once every 5 minutes. rdar://problem/11979549 Vet CurrentGPSTimeSentTooFrequently
Specification: N/A
Warning: accessory sent GPS time more frequently than once every 5 minutes

Rule: DevACKCommandOKReturnedForOtherThanLastSection
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AccessoryAck with command OK response to a multisection SetAccessoryData data transfer that is not the last data section instead of sending an AccessoryAck with a status of "section received OK" and the received section index.
Specification: MFi Accessory Firmware Specification R46 (2.7.1)
Error: accessory responded to a multisection SetAccessoryData command with an AccessoryAck with status 'Command OK' instead of 'Section Received OK' for a section other than the last section

Rule: DevACKSectionReceivedReturnedForLastSection
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a DevACK with a "section received OK" status in response to the last section of a multisection SetAccessoryData data transfer instead of a DevACK with a status of "command OK".
Specification: MFi Accessory Firmware Specification R46 (2.7.1)
Error: accessory sent 'Section received' AccessoryAck in response to final section of a multisection SetAccessoryData command

Rule: DevACKWithSectionReceivedOKStatusDuplicateSectionIndex
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a DevACK with a status of "section received OK" with duplicate section index of a multisection SetAccessoryData data transfer.
Specification: MFi Accessory Firmware Specification R46 (2.7.1)
Error: accessory sent 'section received' AccessoryAck for a SetAccessoryData section index (%1$d) it already ACKed

Rule: LocationLingoRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the Location Lingo test if a Location lingo command was not seen
Specification: N/A
Error: the required commands for the Location Lingo test were not seen

Rule: MultisectionAsyncAccessoryDataLocationDataTypeMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AsyncAccessoryData as part of a multisection transfer with matching transaction ID but a different data location type than the first AsyncAccessoryData of the transfer.
Specification: MFi Accessory Firmware Specification R46 (4.13.11)
Error: accessory sent an AsyncAccessoryData as part of a multisection transfer with a different location data type than the first section

Rule: MultisectionAsyncAccessoryDataLocationTypeMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AsyncAccessoryData as part of a multisection transfer with matching transaction ID but a different location type than the first AsyncAccessoryData of the transfer.
Specification: MFi Accessory Firmware Specification R46 (4.13.14)
Error: accessory sent an AsyncAccessoryData as part of a multisection transfer with a different location type than the first section

Rule: MultisectionAsyncAccessoryDataWithDataSectionIndexOutOfRange
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AsyncAccessoryData as part of a multisection transfer whose data section index is greater than the maximum data section index.
Specification: MFi Accessory Firmware Specification R46 (4.13.14)
Error: accessory sent an AsyncAccessoryData as part of a multisection transfer with an out of range data section index

Rule: MultisectionAsyncAccessoryDataWithEmptyPayload
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AsyncAccessoryData as part of a multisection transfer with an empty data payload.
Specification: MFi Accessory Firmware Specification R46 (2.7.1)
Error: accessory sent AsyncAccessoryData section with an empty data payload

Rule: MultisectionAsyncAccessoryDataWithMaximumDataSectionIndexMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AsyncAccessoryData as part of a multisection transfer whose maximum data section index does not match the maximum data section index sent in the first AsyncAccessoryData of the multisection transfer.
Specification: MFi Accessory Firmware Specification R46 (2.7.1)
Error: accessory sent AsyncAccessoryData with a different maximum section index than the first AsyncAccessoryData in this transaction

Rule: MultisectionAsyncAccessoryDataWithNonSequentialDataSectionIndex
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AsyncAccessoryData as part of a multisection transfer whose data section index is not 1 more than the data section index of the last received AsyncAccessoryData.
Specification: MFi Accessory Firmware Specification R46 (2.7.1)
Error: accessory sent AsyncAccessoryData with a non-sequential current section index from the previous AsyncAccessoryData

Rule: MultisectionSetAccessoryDataValidButEmptyNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory does not send an ACK for a SetAccessoryData command sent as part of a multisection data transfer with an empty data payload, which should be accepted by device if all its other parameters are valid.
Specification: MFi Accessory Firmware Specification R46 (2.7.1)
Error: accessory did not send AccessoryAck in response to a valid SetAccessoryData

Rule: MustSetSatEphRequiredBit
Version: ATS 1.3
Description: The spec requires that accessories set Bit 01 of locAsstData within RetAccessoryCaps (location assistance) An error should appear when accessories set any of Bit 02 - 04 of locAsstData without setting Bit 01 (satellite ephemeris required) of locAsstData for RetAccessoryCaps. rdar://problem/7039005 Location Claim: Need rule for MustSetSatEphRequiredBit
Specification: MFi Accessory Firmware Specification R46 (Table 4-275)
Error: accessory indicated support with RetAccessoryCaps for a location assistance capability that requires satellite ephemeris data, without setting satellite ephemeris data required

Rule: NoRetAccessoryCapsForGetAccessoryCapsSystemCaps
Version: ATS 1.3
Description: This rule throws an error if the accessory does not respond to a request for its system capabilities with a RetAccessoryCaps.
Specification: MFi Accessory Firmware Specification R46 (4.13.6)
Error: accessory did not respond to a request for its system capabilities with a RetAccessoryCaps

Rule: NoRetAccessoryCapsReturnedForSupportedLocationType
Version: ATS 1.3
Description: This rule throws an error if the accessory does not return a RetAccessoryCaps response when the iPod requests capabilities for a supported location type.
Specification: MFi Accessory Firmware Specification R46 (4.13.6)
Error: accessory did not send RetAccessoryCaps for supported location type %1$d in response to GetAccessoryCaps

Rule: NoRetAccessoryControlReturnedForSupportedControlType
Version: ATS 1.3
Description: This rule throws an error if the accessory does not return a RetAccessoryControl response when the iPod requests capabilities for a supported control type.
Specification: MFi Accessory Firmware Specification R46 (4.13.8)
Error: accessory did not respond to a GetAccessoryControl with a RetAccessoryControl

Rule: NoTimelyResponseToGetAccessoryCaps
Version: ATS 1.3
Description: This rule throws an error if the accessory does not respond to a GetAccessoryCaps request with RetAccessoryCaps or DevACK within 500 ms.
Specification: MFi Accessory Firmware Specification R46 (Table 4-2)
Error: accessory did not respond within 500 ms to GetAccessoryCaps

Rule: NoTimelyResponseToGetAccessoryControl
Version: ATS 1.3
Description: This rule throws an error if the accessory does not respond to a GetAccessoryControl request with RetAccessoryControl or AccessoryACK within 500 ms.
Specification: MFi Accessory Firmware Specification R46 (4.13.8)
Error: accessory did not respond within 500 ms to GetAccessoryControl

Rule: NoTimelyResponseToGetAccessoryData
Version: ATS 1.3
Description: This rule throws an error if the accessory does not respond to a GetAccessoryData request with a RetAccessoryData or AccessoryACK within 500 ms.
Specification: MFi Accessory Firmware Specification R46 (4.13.11)
Error: accessory did not respond to GetAccessoryData within 500 ms

Rule: NoTimelyResponseToSetAccessoryControl
Version: ATS 1.3
Description: This rule throws an error if the accessory does not respond to a SetAccessoryControl request with an AccessoryAck within 500 ms.
Specification: MFi Accessory Firmware Specification R46 (4.13.10)
Error: accessory did not respond to SetAccessoryControl with an AccessoryAck within 500 ms

Rule: NoTimelyResponseToSetAccessoryData
Version: ATS 1.3
Description: This rule throws an error if the accessory does not respond to a SetAccessoryData request with an AccessoryAck within 500 ms.
Specification: MFi Accessory Firmware Specification R46 (4.13.13)
Error: accessory did not respond to SetAccessoryData with an AccessoryAck within 500 ms

Rule: RetAccessoryCapsLocAsstDataBits1And2DoNotMatch
Version: ATS 2.0
Description: This rule throws an error if RetAccessoryCaps for locAsstData and bits 1 and 2 don't match. See R42 page 391.
Specification: MFi Accessory Firmware Specification R46 (Table 4-275)
Error: locAsstData bits 1 and 2 must match

Rule: RetAccessoryCapsLocationTypeMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a RetAccessoryCaps with the same transaction ID but a different location type in response to a GetAccessoryCaps request.
Specification: MFi Accessory Firmware Specification R46 (4.13.6)
Error: accessory responded to a GetAccessoryCaps request for location type %1$d with a RetAccessoryCaps with location type %2$d

Rule: RetAccessoryCapsSentWithInvalidLocCapsMask
Version: ATS 1.3
Description: This rule throws a warning if the accessory sends RetAccessoryCaps for locType 0, and the locCapsMask has set neither bit 1 nor bit 2.
Specification: MFi Accessory Firmware Specification R46 (Table 4-275)
Warning: accessory sent RetAccessoryCaps for type 'system' with an invalid location capabilities bitmask. You must set at least one of bit 1 (NMEA GPS support) and bit 2 (location assistance support)

Rule: RetAccessoryControlControlTypeMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a RetAccessoryControl with the same transaction ID but a different control type in response to a GetAccessoryControl request.
Specification: MFi Accessory Firmware Specification R46 (4.13.8)
Error: accessory responded to a GetAccessoryControl with a RetAccessoryControl specifying a different control type

Rule: RetAccessoryDataLocationDataTypeMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory returns a RetAccessoryData response with a matching transaction ID but a different location data type than iPod sent in the matching GetAccessoryData command.
Specification: MFi Accessory Firmware Specification R46 (4.13.11)
Error: accessory responded to GetAccessoryData with RetAccessoryData using a different location data type

Rule: RetAccessoryDataLocationTypeMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory replies to a GetAccessoryData with a RetAccessoryData with the same transaction ID but different location type.
Specification: MFi Accessory Firmware Specification R46 (4.13.11)
Error: accessory responded to a GetAccessoryData with a RetAccessoryData whose transaction ID matched but location type was different

Rule: RetAccessoryDataSentWithoutWaitingForiPodACK
Version: ATS 1.3
Description: This rule throws an error if the accessory sends data to the iPod using RetAccessoryData while previous data that has been sent has not been ACKed with an iPodACK and has not yet timed out.
Specification: MFi Accessory Firmware Specification R46 (2.7.1)
Error: accessory sent RetAccessoryData without first waiting for iPodAck from a previous RetAccessoryData

Rule: SatelliteEphemerisRequestedTooFrequently
Version: ATS 1.3
Description: This rule throws an error if the accessory requests satellite ephemeris data (using AsyncAccessoryData with locType=LocAssist and dataType=EphURL) more frequently than once every 5 minutes.
Specification: MFi Accessory Firmware Specification R46 (4.13.14)
Error: accessory requested satellite ephemeris data more frequently than once every 5 minutes

Rule: UnexpectedAsyncAccessoryDataNMEASentence
Version: ATS 1.3
Description: This rule throws a warning if the accessory sends an NMEA sentence (using AsyncAccessoryData with locType=NMEA GPS and dataType=NmeaSentence) when NMEA GPS async or global async notifications are disabled.
Specification: MFi Accessory Firmware Specification R46 (4.13.14)
Warning: accessory sent NMEA sentence while the Apple device has asynchronous notifications disabled

Rule: UnexpectedAsyncAccessoryDataNMEASentenceAfterAccessoryAck
Version: ATS 2.2
Description: This rule throws an error if the accessory sends an NMEA sentence (using AsyncAccessoryData with locType=NMEA GPS and dataType=NmeaSentence) when NMEA GPS async or global async notifications are disabled.
Specification: MFi Accessory Firmware Specification R46 (4.13.14)
Error: accessory sent NMEA sentence while the Apple device has asynchronous notifications disabled and accessory acknowledged that state

LocationiAP2

Rule: LocationMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Fire an error if required Location messages are not seen during the Location test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

Rule: UnwarrantedLocationInformationSentiAP2
Version: ATS 3.0
Description: Fire an error if location information is sent outside of the apple device's start/stop The rule allows for a 2 millisecond grace period after the stop, since the spec does not specify a time but instead says it must cease
Specification: Accessory Interface Specification R16 (32.2 Location Information Usage)
Error: accessory sent location information when the Apple device did not request it

IDPS

Rule: AccCapsVolumeInfoButNoDisplayRemoteLingoIdentify
Version: ATS 1.3
Description: rdar://problem/7071291 Rule Request: AccCapsVolumeInfoButNoDisplayRemoteLingoIdentify Rule should fire if the final AccCaps Token indicates support for bit 11 (Volume Information) and the final Identify Token did not indicate display remote lingo (0x03) support AND if EndIDPS was sent expecting success (If it was sent expecting to not continue to auth, this should not fire).
Specification: MFi Accessory Firmware Specification R46 (4.3)
Error: accessory indicated support for volume information in AccessoryCapsToken without indicating support for Display Remote lingo in IdentifyToken

Rule: AccessoryCapsTokeniPodPreferenceTokenLineOutMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory sets a preference for the line out class via an iPodPreferenceToken but did not claim line out capability via an AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory attempted to set line out preferences without specifying line out capability in an AccessoryCapsToken

Rule: AccessoryCapsTokeniPodPreferenceTokenVideoOutConnectionMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory sets a preference for the video out connection class via an iPodPreferenceToken but did not claim video out capability via an AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory set a preference for video out connection but did not claim video out with AccessoryCapsToken

Rule: AccessoryCapsTokeniPodPreferenceTokenVideoOutMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory sets a preference for the video out class via an iPodPreferenceToken but did not claim video out capability via an AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory set a preference for video out but did not claim video out with AccessoryCapsToken

Rule: AccessoryCapsTokeniPodPreferenceTokenVideoOutMonitorAspectRatioMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory sets a preference for the video out monitor aspect ratio class via an iPodPreferenceToken but did not claim video out capability via an AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (Section 1.2.1)
Error: accessory attempted to set video monitor aspect ratio preference without specifying video out in an AccessoryCapsToken

Rule: AccessoryCapsTokeniPodPreferenceTokenVideoOutSignalFormatMismatch
Version: ATS 1.3
Description: This rule throws an error if the accessory sets a preference for the video out signal format class via an iPodPreferenceToken but did not claim video out capability via an AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory attempted to set video out signal format preferences without specifying video out capability in an AccessoryCapsToken

Rule: AnalogUSBAudioRoutingAccCapWithAVSynchronizationSupported
Version: ATS 2.0
Description: If the iPod returns support for the SetVideoDelay command in RetiPodOptionsForLingo for the Digital Audio Lingo then the accessory cannot use AccessoryCapsToken bit 21 because it should be useing SetVideoDelay instead. The test for this rule only runs when the accessory is USB host because only USB host accessories are allowed to set bit 21 in an AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (4.10.4.2)
Error: accessory must not set AccessoryCapsToken bit 21 since RetiPodOptionsForLingo Digital Audio lingo supports A/V synchronization

Rule: AnalogUSBAudioRoutingAccCapWithoutAnalogUSBAudioRoutingSupport
Version: ATS 2.0
Description: If the iPod does not return support for analog USB audio routing (bit 26) in RetiPodOptionsForLingo for the General Lingo then the accessory cannot use AccessoryCapsToken bit 21. The test for this rule only runs when the accessory is USB host because only USB host accessories are allowed to set bit 21 in an AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (4.10.4.2)
Error: accessory must not set AccessoryCapsToken bit 21 since RetiPodOptionsForLingo General lingo does not support analog USB audio routing

Rule: AnalogUSBAudioRoutingAccCapWithoutIdentifyForDigitalAudioLingo
Version: ATS 2.0
Description: The accessory must identify for the Digital Audio Lingo before sending an AccessoryCapsToken with bit 21 (analog USB audio routing) set to 1. The test for this rule only runs when the accessory is USB host because only USB host accessories are allowed to set bit 21 in an AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (4.10.4)
Error: accessory must identify for the Digital Audio lingo before sending AccessoryCapsToken bit 21

Rule: AnalogUSBAudioRoutingAccCapWithoutUSBHostDevice
Version: ATS 2.0
Description: The accessory must be a USB host, and the Apple device is a USB device, before sending an AccessoryCapsToken with bit 21 (analog USB audio routing) set to 1.
Specification: MFi Accessory Firmware Specification R46 (4.10.4)
Error: accessory must be USB host in order to use AccessoryCapsToken bit 21

Rule: CapsTokenWithoutLingoIdentified
Version: ATS 2.2
Description: This rule throws a warning if the accessory sends a capability token without identifying for the appropriate lingo
Specification: N/A
Warning: accessory sent %1$@ without identifying for the appropriate lingo(s)

Rule: DuplicateTransactionIDDetected
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a duplicate transaction ID without its transaction ID counter rolling over.
Specification: MFi Accessory Firmware Specification R46 (2.6.1.1)
Error: accessory sent transaction ID 0x%1$04X which was sent previously

Rule: EndIDPSRequestingAuthSentWithoutAnySetFIDTokenValues
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an EndIDPS requesting authentication but did not send any SetFIDTokenValues commands.
Specification: MFi Accessory Firmware Specification R46 (3.3.41)
Error: accessory sent EndIDPS without sending a valid SetFIDTokenValues packets during IDPS

Rule: EndIDPSSentWhileAckFIDTokenValuesPending
Version: ATS 1.3
Description: This rule throws an error if an accessory sends an EndIDPS while an AckFIDTokenValues response from the iPod is pending. rdar://problem/11940959 Vet EndIDPSSentWhileAckFIDTokenValuesPending
Specification: N/A
Error: accessory sent EndIDPS before receiving AckFIDTokenValues

Rule: FirstCommandNotStartIDPS
Version: ATS 1.3
Description: This rule throws an error if the first command sent by the accessory is not StartIDPS. Note: Updated in 2.0 to always fire, not just when the IDPS claim has been selected.
Specification: MFi Accessory Firmware Specification R46 (Table 2-5)
Error: the first command from the accessory must be StartIDPS

Rule: FirstTokenNotIdentifyToken
Version: ATS 1.3
Description: This rule throws an error if the first token of the first SetFIDTokenValues command seen after (re)starting IDPS is not an IdentifyToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory did not send IdentifyToken as the first token of the first SetFIDTokenValues command

Rule: GeneralLingoNotInIdentifyToken
Version: ATS 2.0
Description: This rule throws an error if the accessory sends an IdentifyToken that does not identify for Gerneral Lingo.
Specification: MFi Accessory Firmware Specification R46 (Table 3-68)
Error: accessory must identify for General Lingo

Rule: GetiPodOptionsForLingoDigitalAudioBeforeAnalogUSBAudioRoutingAccCap
Version: ATS 2.0
Description: The accessory must send GetiPodOptionsForLingo for the Digital Audio Lingo to make sure the iPod does not support the SetVideoDelay command before sending AccessoryCapsToken bit 21. The test for this rule only runs when the accessory is USB host because only USB host accessories are allowed to set bit 21 in an AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (4.10.4.2)
Error: accessory must send GetiPodOptionsForLingo for the Digital Audio lingo before sending AccessoryCapsToken bit 21

Rule: GetiPodOptionsForLingoGeneralBeforeAnalogUSBAudioRoutingAccCap
Version: ATS 2.0
Description: The accessory must send GetiPodOptionsForLingo for the General Lingo to make sure the iPod supports analog USB audio routing (bit 26) command before sending AccessoryCapsToken bit 21. The test for this rule only runs when the accessory is USB host because only USB host accessories are allowed to set bit 21 in an AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (4.10.4.2)
Error: accessory must send GetiPodOptionsForLingo for the General lingo before sending AccessoryCapsToken bit 21

Rule: IDPSCommandSentBeforeStartIDPSACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory sends SetFIDTokenValues or EndIDPS without first waiting for the iPod to ACK a previously sent StartIDPS.
Specification: MFi Accessory Firmware Specification R46 (2.3.2.1)
Error: accessory sent an IDPS command before iPodAck was sent in response to StartIDPS

Rule: IDPSCommandSentWithoutStartIDPS
Version: ATS 1.3
Description: This rule throws an error if the accessory sends SetFIDTokenValues or EndIDPS without first sending StartIDPS.
Specification: MFi Accessory Firmware Specification R46 (2.3.2)
Error: accessory sent a SetFIDTokenValues or EndIDPS command without sending a StartIDPS first

Rule: IDPSStartedButNotCompletedWithin3Seconds
Version: ATS 2.2
Description: This rule throws a warning if the time between iPodAck for StartIDPS and EndIDPS is greater than 3 seconds
Specification: MFi Accessory Firmware Specification R46 (2.3.2)
Warning: accessory did not complete the IDPS process within 3 seconds

Rule: IdentificationCommandSentTooSoonAfterFirstStartIDPS
Version: ATS 1.3
Description: Complicated, but... Throw an error if the accessory sends IdentifyDeviceLingoes or Identify too soon after the first StartIDPS after device connection. "Too soon" means within 3 seconds of the first StartIDPS being seen, unless: a) the IDPS process completes successfully (IDPSStatus with status 0) b) the iPod sends a Bad Parameter ACK to that StartIDPS c) the accessory cancels the IDPS process (EndIDPS with status 2) d) the iPod responds with a "max connections reached" NACK, indicating that no more commands may be sent e) StartIDPS is NACKed such that NoIAPAfterStartIDPSNACK's error is thrown
Specification: MFi Accessory Firmware Specification R46 (2.3.2)
Error: accessory sent Identify or IdentifyDeviceLingoes within 3 seconds of starting the IDPS process without first completing the IDPS process

Rule: IdentifyingForAccessoryPowerLingoIsDeprecated
Version: ATS 2.2
Description: This rule throws a warning if the accessory tries to identify for Accessory Power lingo using StartIDPS, IDL, or legacy Identify.
Specification: MFi Accessory Firmware Specification R46 (C.8)
Warning: accessory tried to identify for Accessory Power lingo which is deprecated

Rule: IdentifyingForMicrophoneLingoIsDeprecated
Version: ATS 2.0
Description: This rule throws a warning if the accessory trys to Identify for Microphone Lingo using StartIDPS, IDL, or legacy Identify.
Specification: MFi Accessory Firmware Specification R46 (C.5)
Warning: accessory tried to identify for Microphone lingo which is deprecated

Rule: LegacyIdentifyAfterIDPS
Version: ATS 1.5
Description: The purpose of this rule is to catch accessories that try to use IdentifyDeviceLingoes or legacy Identify with iPods that support IDPS. That is, we'll throw an error if IDL or Identify is used after the iPod has send IDPSStatus 0.
Specification: MFi Accessory Firmware Specification R46 (2.3.2)
Error: accessory sent Identify or IdentifyDeviceLingoes after the iPod indicated support for StartIDPS

Rule: LineOutCapsWithoutLineOutPreferences
Version: ATS 1.3
Description: This rule throws a warning if the accessory indicates line out capability via an AccessoryCapsToken but did not set any line out preferences via an iPodPreferenceToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Warning: accessory indicated line out capability in its AccessoryCapsToken but did not set a line out preference

Rule: LineOutDisabledAfterLineOutPreferencesSet
Version: ATS 1.3
Description: Throw an error if we're disabling the line out capability but have already set line out preferences during the IDPS process. rdar://problem/11942207 Vet {Line,Video}OutDisabledAfterLineOutPreferencesSet
Specification: N/A
Error: accessory sent AccessoryCapsToken with line out disabled after setting line out preferences

Rule: MaxConnectionsResponseIgnored
Version: ATS 1.3
Description: This rule throws an error if the accessory sends any command after the iPod NACKs a StartIDPS or IdentifyDeviceLingoes command that no more connections are available.
Specification: MFi Accessory Firmware Specification R46 (2.3.2.1)
Error: accessory sent a command after being notified the iPod has reached its maximum number of connections

Rule: MicrophoneCapsTokenDeprecated
Version: ATS 2.0
Description: This rule throws a warning if the accessory sends the deprecated MicrophoneCapsToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Warning: MicrophoneCapsToken is deprecated

Rule: NoIAPAfterStartIDPSNACK
Version: ATS 1.5
Description: This rule throws an error if the accessory sends any iAP command after receiving an ACK for StartIDPS with a status value other than 0x00 (Success), 0x04 (Bad Parameter), or 0x06 (Command Pending).
Specification: MFi Accessory Firmware Specification R46 (Table 2-4)
Error: accessory sent iAP command after receiving a negative iPodAck for StartIDPS

Rule: NoTimelyIDLAfterStartIDPSNACK
Version: ATS 1.3
Description: This rule throws an error if the accessory does not send an IdentifyDeviceLingoes command indicating unsupported accessory or General Lingo no auth and no Device ID within 800 ms of receiving an ACK with "Bad Parameter" status in response to a StartIDPS command.
Specification: MFi Accessory Firmware Specification R46 (Section 2.3)
Error: accessory did not send an IdentifyDeviceLingoes with General lingo, no options, and a Device ID of 0x0 or all fields set to 0xFF within 800 ms of receiving Bad Parameter iPodAck for StartIDPS

Rule: NoTimelyResponseToRetiPodAuthenticationInfo
Version: ATS 2.2
Description: This rule throws an error if the accessory fails to send AckiPodAuthenticatonInfo within 15 seconds of receiving RetiPodAuthenticationInfo
Specification: MFi Accessory Firmware Specification R46 (3.3.24)
Error: accessory did not respond with AckiPodAuthenticatonInfo within 15 seconds of RetiPodAuthenticationInfo

Rule: ProhibitedCommandSentDuringIDPS
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a command other than GetiPodOptionsForLingo, RequestLingoProtocolVersion, SetFIDTokenValues, EndIDPS, or another StartIDPS during the IDPS process.
Specification: MFi Accessory Firmware Specification R46 (2.3.2)
Error: accessory may only send GetiPodOptionsForLingo, RequestTransportMaxPayloadSize, RequestLingoProtocolVersion, SetFIDTokenValues, EndIDPS, or StartIDPS during the IDPS process

Rule: RFCertificationDeclarationMissing
Version: ATS 1.5 (External Only)
Description: This rule throws an error if the accessory attempts to complete the IDPS process without making a RFCertificationDeclaration.
Specification: MFi Accessory Firmware Specification R46 (Table 3-73)
Error: accessory attempted to complete the IDPS process without sending a valid RFCertificationDeclaration

Rule: RequiredAccessoryCapsTokenNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory does not receive an ACK for the required AccessoryCapsToken before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory sent EndIDPS without first receiving an ACK for required AccessoryCapsToken

Rule: RequiredAccessoryCapsTokenNotSent
Version: ATS 1.3
Description: This rule throws an error if the accessory does not send the required AccessoryCapsToken before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (3.3.41)
Error: accessory sent EndIDPS without first sending required AccessoryCapsToken

Rule: RequiredAccessoryInfoTokenWithFirmwareVersionNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory does not receive an ACK for the required AccessoryInfoToken containing the accessory firmware version before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory sent EndIDPS before iPod accepted required firmware version AccessoryInfoToken

Rule: RequiredAccessoryInfoTokenWithFirmwareVersionNotSent
Version: ATS 1.3
Description: This rule throws an error if the accessory does not send the required AccessoryInfoToken containing the accessory firmware version before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory sent EndIDPS without first sending an AccessoryInfoToken with firmware version

Rule: RequiredAccessoryInfoTokenWithHardwareVersionNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory does not receive an ACK for the required AccessoryInfoToken containing the accessory hardware version before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory sent EndIDPS without first receiving an ACK for required AccessoryInfoToken with hardware version

Rule: RequiredAccessoryInfoTokenWithHardwareVersionNotSent
Version: ATS 1.3
Description: This rule throws an error if the accessory does not send the required AccessoryInfoToken containing the accessory hardware version before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (3.3.41)
Error: accessory sent EndIDPS without first sending required AccessoryInfoToken with hardware version

Rule: RequiredAccessoryInfoTokenWithManufacturerNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory does not receive an ACK for the required AccessoryInfoToken containing the accessory manufacturer before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (3.3.41)
Error: accessory sent EndIDPS before the iPod accepted required manufacturer name AccessoryInfoToken

Rule: RequiredAccessoryInfoTokenWithManufacturerNotSent
Version: ATS 1.3
Description: This rule throws an error if the accessory does not send the required AccessoryInfoToken containing the accessory manufacturer before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory sent EndIDPS without first sending an AccessoryInfoToken with manufacturer name

Rule: RequiredAccessoryInfoTokenWithModelNumberNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory does not receive an ACK for the required AccessoryInfoToken containing the accessory model number before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory sent EndIDPS before iPod accepted required model number AccessoryInfoToken

Rule: RequiredAccessoryInfoTokenWithModelNumberNotSent
Version: ATS 1.3
Description: This rule throws an error if the accessory does not send the required AccessoryInfoToken containing the accessory model number before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory sent EndIDPS without first sending an AccessoryInfoToken with model number

Rule: RequiredAccessoryInfoTokenWithNameNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory does not receive an ACK for the required AccessoryInfoToken containing the accessory name before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (3.3.41)
Error: accessory sent EndIDPS before iPod accepted required accessory name AccessoryInfoToken

Rule: RequiredAccessoryInfoTokenWithNameNotSent
Version: ATS 1.3
Description: This rule throws an error if the accessory does not send the required AccessoryInfoToken containing the accessory name before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory sent EndIDPS without first sending an AccessoryInfoToken with accessory name

Rule: RequiredBundleSeedIDPrefTokenNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory does not receive an ACK for the required BundleSeedIDPrefToken before sending an EndIDPS requesting authentication but indicated "Communication with iOS Applications" support in its AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory indicated caps support for \'Communication with iOS Applications\' in its AccessoryCapsToken but sent EndIDPS without first receiving an ACK for required BundleSeedIDPrefToken

Rule: RequiredBundleSeedIDPrefTokenNotSent
Version: ATS 1.3
Description: This rule throws an error if the accessory does not send the required BundleSeedIDPrefToken before sending an EndIDPS requesting authentication but indicated "Communication with iOS Applications" support in its AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory capabilities included \'Communication with iOS Applications\', but accessory did not send required BundleSeedIDPrefToken

Rule: RequiredEAProtocolTokenNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory does not receive an ACK for the required EAProtocolToken before sending an EndIDPS requesting authentication but indicated "Communication with iOS Applications" support in its AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory indicated caps support for \'Communication with iOS Applications\' in its AccessoryCapsToken but sent EndIDPS without iPod accepting required EAProtocolToken

Rule: RequiredEAProtocolTokenNotSent
Version: ATS 1.3
Description: This rule throws an error if the accessory does not send the required EAProtocolToken before sending an EndIDPS requesting authentication but indicated "Communication with iOS Applications" support in its AccessoryCapsToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory indicated caps support for \'Communication with iOS Applications\' in its AccessoryCapsToken but sent EndIDPS without sending required EAProtocolToken

Rule: RequiredIdentifyTokenNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory does not receive an ACK for the required IdentifyToken before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory sent EndIDPS without first receiving an ACK for required IdentifyToken

Rule: RequiredMicrophoneCapsTokenNotACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory identifies for Microphone Lingo but does not receive an ACK for a MicrophoneLingoToken before sending an EndIDPS requesting auth.
Specification: MFi Accessory Firmware Specification R46 (3.3.41)
Error: accessory identified for Microphone lingo but sent EndIDPS before iPod accepted required MicrophoneCapsToken

Rule: RequiredMicrophoneCapsTokenNotSent
Version: ATS 1.3
Description: This rule throws an error if the accessory identifies for Microphone Lingo but does not send the required MicrophoneCapsToken before sending an EndIDPS requesting authentication.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Error: accessory did not send required MicrophoneCapsToken before sending EndIDPS after identifying for Microphone lingo

Rule: RetriedUnsupportedToken
Version: ATS 1.4
Description: This rule throws an error if the accessory resends a token that the iPod responded to with a RetFIDTokenValues with status 3.
Specification: MFi Accessory Firmware Specification R46 (Table 3-86)
Error: accessory retried setting an unsupported token

Rule: SetFIDTokenValuesSentWhileAckFIDTokenValuesPending
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a SetFIDTokenValues command while a RetFIDTokenValuesACKs response from the iPod is pending.
Specification: MFi Accessory Firmware Specification R46 (3.3.41)
Error: accessory sent another SetFIDTokenValues before receiving an AckFIDTokenValues for a previous one

Rule: SetFIDTokenValuesWithoutGetiPodOptionsForLingo
Version: ATS 2.2
Description: This rule throws a warning if the accessory doesn't attempt to check the iPod's options using GetiPodOptionsForLingo before sending SetFIDTokenValues
Specification: MFi Accessory Firmware Specification R46 (2.3.3)
Warning: accessory should check Apple device capabilities using GetiPodOptionsForLingo before using SetFIDTokenValues

Rule: SetVideoDelayWithoutRetiPodOptionsForLingo
Version: ATS 2.0
Description: Before sending this command, the accessory must verify that RetiPodOptionsForLingo reports that bit 00 for Lingo 0x0A is set. If not set, then this rule will throw an error when SetVideoDelay is used.
Specification: MFi Accessory Firmware Specification R46 (4.10.4.2)
Error: accessory sent SetVideoDelay without first receiving RetiPodOptionsForLingo for Digital Audio lingo with option bit 0x00 set

Rule: StartIDPSRetriedTooQuickly
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a StartIDPS command within 500 ms of a previous StartIDPS that was not ACKed. rdar://problem/11939864 Vet StartIDPSRetriedTooQuickly
Specification: N/A
Error: accessory retried StartIDPS within 500 ms of previous StartIDPS

Rule: StartIDPSSentAfterBadParameterNACK
Version: ATS 1.3
Description: This rule throws an error if the accessory sends another StartIDPS command after receiving an ACK with Bad Parameter status and no transaction ID.
Specification: MFi Accessory Firmware Specification R46 (Table 2-5)
Error: accessory sent another StartIDPS even after receiving an ACK with 'Bad Parameter' status

Rule: StartIDPSSentAfterRejection
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a StartIDPS command after the iPod returns an IDPSStatus indicating that the accessory is no longer eligible to use the IDPS process.
Specification: MFi Accessory Firmware Specification R46 (Table 3-99)
Error: accessory sent StartIDPS after iPod indicated that accessory could not retry the IDPS process

Rule: UnrecognizedTransactionIDInResponse
Version: ATS 1.3
Description: This rule throws an error if the accessory responds to an iPod request without using a valid transaction ID that the iPod provided.
Specification: MFi Accessory Firmware Specification R46 (2.6.1.1)
Error: accessory replied to command sent from iPod with unrecognized transaction ID

Rule: VideoOutCapsWithoutVideoOutPreferences
Version: ATS 1.3
Description: This rule throws a warning if the accessory indicates video capability via an AccessoryCapsToken but did not set any video preferences via an iPodPreferenceToken.
Specification: MFi Accessory Firmware Specification R46 (Table 3-67)
Warning: accessory indicated video out capability in its AccessoryCapsToken but did not set any video out preferences

Rule: VideoOutDisabledAfterVideoOutPreferencesSet
Version: ATS 1.3
Description: Throw an error if we're disabling the video out capability but have already set some video out preferences during the IDPS process. rdar://problem/11942207 Vet {Line,Video}OutDisabledAfterLineOutPreferencesSet
Specification: N/A
Error: accessory sent AccessoryCapsToken with video out disabled after setting video out preferences

Rule: VolumePollingOrInquiryWithoutAccessoryCapsTokenChecksVolume
Version: ATS 1.3
Description: This rule throws an error if the accessory requests volume change notifications via Display Remotes SetRemoteEventNotification or inquires for volume information using GetiPodStateInfo without having finished IDPS successfully with the iPod accepting an AccessoryCapsToken that indicated the accessory checks iPod volume.
Specification: MFi Accessory Firmware Specification R46 (4.3.11)
Error: accessory registered for volume change notifications or inquired about volume levels without indicating that it checks volume in the AccessoryCapsToken it sent during IDPS

HiddenShared

Rule: Deprecated191kResistor30Pin
Version: ATS 2.2
Description: This rule throws a warning if the accessory has a 191kΩ resistor.
Specification: MFi Accessory Hardware Specification R9 (pg. 115)
Warning: 191 kΩ ID resistors are deprecated

Rule: Deprecated1MResistor30Pin
Version: ATS 2.2
Description: This rule throws a warning if the accessory has a 1MΩ resistor.
Specification: MFi Accessory Hardware Specification R9 (pg. 115)
Warning: 1 MΩ ID resistors are deprecated

Rule: Deprecated360kResistor30Pin
Version: ATS 1.5
Description: This rule throws an error if the accessory has a 360kΩ resistor. Changed to an error for radar rdar://problem/9098128
Specification: MFi Accessory Hardware Specification R9 (pg. 115)
Error: 360 kΩ ID resistors are deprecated

Rule: FirstPacket20msDelayViolated
Version: ATS 1.1
Description: This rule throws an error if the delay between the first sync byte and the first full packet is less than 20 ms. (This rule is implemented as Obj-C code in processEvent in RulesetController.)
Specification: MFi Accessory Firmware Specification R46 (2.2.1)
Error: accessory did not wait 20 ms after the first sync byte (packet sent after only %2$llu ms)

Rule: IAPSentWith255kResistor30Pin
Version: ATS 2.2
Description: This rule throws an error if the accessory has a 255kΩ resistor and sends an iAP packet.
Specification: MFi Accessory Hardware Specification R9 (pg. 37)
Error: accessory sent iAP while presenting a 255 kΩ ID resistor

Rule: IPodAttachWhenAccessoryAttached30Pin
Version: ATS 2.0
Description: This rule throws an error if the user attaches the iPod while the accessory is already attached. rdar://problem/8816913 Rules misfire instead of resetting after clear or accessory detach and reattach
Specification: N/A
Error: accessory must be disconnected before connecting an Apple Device

Rule: SecondByteNotSyncByte
Version: ATS 1.1
Description: This rule throws an error if the second byte sent by a connected accessory is not a sync byte (0xFF). This is because the accessory must send a solo sync byte packet first followed by a full packet which starts with a sync byte
Specification: MFi Accessory Firmware Specification R46 (2.2.1)
Error: accessory must send an additional sync byte packet first

Rule: SyncByteSentOverUSB
Version: ATS 2.1
Description: This rule throws a warning if the accessory sends sync bytes (0xFF) before the start of packet byte (0x55) on the USB transport.
Specification: MFi Accessory Hardware Specification R9 (pg. 52)
Warning: accessory should not send sync byte (0xFF) on this transport

Rule: TrafficSentBeforeAccessoryPowerTurnedOn30Pin
Version: ATS 1.1
Description: This rule throws an error if the accessory sends any iAP traffic before accessory power goes high. (This rule is implemented as Objective-C code in processEvent in RulesetController.)
Specification: MFi Accessory Hardware Specification R9 (pg. 35)
Error: accessory sent iAP command before iPod provided accessory power via pin 13

Rule: TrafficSentButPin20NotGrounded30Pin
Version: ATS 1.1
Description: This rule throws an error if the accessory sends iAP traffic while pin 20 is ungrounded. By virtue of the fact that the pin 20 measurement only arrives from the ATS 30-pin Box, this rule only runs on accessories that communicate via iAP-over-UART over the 30-pin connector. It should not and does not apply to USB or BT.
Specification: MFi Accessory Hardware Specification R9 (Table 2-10)
Error: accessory sent data but accessory detect (pin 20) was not grounded

Rule: TrafficSentWithin80msOfAccessoryPower30Pin
Version: ATS 1.1
Description: This rule throws an error if a connected (ACC_DETECT driven low) accessory sends any iAP traffic earlier than 80 ms after Accessory Power goes high. (This rule is implemented as Objective-C code in processEvent in RulesetController.)
Specification: MFi Accessory Hardware Specification R9 (pg. 35)
Error: accessory did not wait 80 ms after seeing Acc Power high before sending the first byte (sent after only %llu ms)

Rule: TrafficSentWithoutUsesiAPClaim (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory sends iAP traffic but the "Uses iAP" claim was not selected. (This rule is implemented as Objective-C code in processEvent in RulesetController.)
Specification: N/A
Error: accessory sent iAP data but the accessory's claims indicate it does not communicate via iAP

Rule: UnexpectedAccResistor30Pin (Product Plan Rule)
Version: ATS 1.0
Description: This rule throws an error if an ID resistor is detected but no resistor has been claimed. Because the claims UI only allows for supported resistor values to be specified, this rule will fire if the accessory resistor is deprecated or reserved.
Specification: N/A
Error: an ID resistor is present, but the accessory's claims do not indicate support

Rule: VbusDrivenWithoutUSBChargingPowerSourceClaim30Pin (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory drives Vbus but the ClaimNameUSBChargingPowerSource claim was not selected. Notes: rdar://problem/6804130
Specification: N/A
Error: accessory is driving Vbus, but the accessory's claims do not indicate support

AssistiveTouch

Rule: AssistiveTouchRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the AssistiveTouch test if AssistiveTouch was not turned on
Specification: N/A
Error: the required commands were not seen during the AssistiveTouch test

Rule: AssistiveTouchWithoutAccessoryCapsToken
Version: ATS 2.2
Description: This rule throws an error if the SetiPodPreferences or an iPodPreference token uses AssistiveTouch without first claiming capability for it during IDPS
Specification: MFi Accessory Firmware Specification R46 (Table 3-71)
Error: accessory sent %1$@ without declaring AssistiveTouch capability during IDPS

Rule: AssistiveTouchWithoutLingoOptions
Version: ATS 2.2
Description: This rule throws an error if SetiPodPreferences or an iPodPreference token uses AssistiveTouch without first verifying iPod support from RetiPodOptionsForLingo
Specification: MFi Accessory Firmware Specification R46 (1.14)
Error: accessory sent %1$@ without receiving RetiPodOptionsForLingo for Simple Remote with AssistiveTouch bit

VoiceOver

Rule: InvalidScaleDisplayFactor
Version: ATS 1.5
Description: This rule throws an error if the accessory sends an event type 0x10 (Scale Display Factor) with a factor of 0.
Specification: MFi Accessory Firmware Specification R46 (Table 4-36)
Error: accessory sent VoiceOverEvent with invalid Scale Display Factor

Rule: VoiceOverEventLastSectionsDiffer
Version: ATS 1.5
Description: This rule throws an error if an accessory sends VoiceOverEvent for event type 0x0A (Input Text) or 0x16 (Speak String) and the last section index differs within a series.
Specification: MFi Accessory Firmware Specification R46 (Table 4-36)
Error: accessory sent VoiceOverEvent for event type %1$u (0x%1$02X) with different last section value

Rule: VoiceOverEventMultipleSectionsOutOfOrder
Version: ATS 1.5
Description: This rule throws an error if an accessory sends VoiceOverEvent for event type 0x0A (Input Text) or 0x16 (Speak String) with multiple sections that are out of order or duplicate.
Specification: MFi Accessory Firmware Specification R46 (Table 4-36)
Error: accessory sent VoiceOverEvent either out of order or duplicated

Rule: VoiceOverEventWithMixedEventTypes
Version: ATS 1.5
Description: This rule throws an error if an accessory sends VoiceOverEvent for event type 0x0A (Input Text) or 0x16 (Speak String) and mixes the event types within a series.
Specification: MFi Accessory Firmware Specification R46 (Table 4-36)
Error: accessory sent VoiceOverEvent and mixed usage of event type 10(0x0A) and event type 22(0x16) within a series

Rule: VoiceOverRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the VoiceOver test if a VoiceOverEvent command was not seen
Specification: N/A
Error: the required commands for the VoiceOver test were not seen

CommunicationwithiOSApplications

Rule: AccessoryDataTransferAfterSessionClosed
Version: ATS 1.3
Description: This rule throws a warning if the accessory sends an AccessoryDataTransfer for a session ID that was closed by the iPod.
Specification: MFi Accessory Firmware Specification R46 (3.3.46)
Warning: accessory sent AccessoryDataTransfer for a session ID which the iPod already closed

Rule: AccessoryDataTransferAfterSessionClosedAndACKed
Version: ATS 2.2
Description: This rule throws an error if the accessory sends an AccessoryDataTransfer for a session ID that was closed by the iPod and ACKed by the accessory.
Specification: MFi Accessory Firmware Specification R46 (3.3.46)
Error: accessory sent AccessoryDataTransfer for a session ID which the iPod already closed and accessory acknowledged closed

Rule: AccessoryDataTransferBeforeOpenDataSessionForProtocolACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AccessoryDataTransfer command before successfully DevACK'ing an OpenDataSessionForProtocol command from the iPod.
Specification: MFi Accessory Firmware Specification R46 (3.3.48)
Error: accessory sent AccessoryDataTransfer before sending an AccessoryAck indicating success in response to OpenDataSessionForProtocol

Rule: CloseDataSessionNotDevACKed30Pin
Version: ATS 1.5
Description: This rule throws an error if the accessory fails to send DevACK in response to CloseDataSession within 500 ms
Specification: MFi Accessory Firmware Specification R46 (3.3.46)
Error: accessory failed to respond to CloseDataSession with an AccessoryAck within 500 ms

Rule: CommWithAppsClaimedWithoutValidAccessoryCapsToken (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory claims support for "Communication with iOS Applications" but does not set the correct bit (bit 9) for this feature in its AccessoryCapsToken.
Specification: N/A
Error: accessory's claims indicate support for iOS applications but the accessory sent an AccessoryCapsToken without the appropriate bit set

Rule: CommWithAppsCommandSentWithoutCommWithAppsAccessoryCapsTokenACKed
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a communication with iOS applications-related command but did not receive an ACK from the iPod for an AccessoryCapsToken with the appropriate bit set.
Specification: MFi Accessory Firmware Specification R46 (1.7.1)
Error: accessory sent an iOS-related command but did not receive acknowledgement for iOS applications in AccessoryCapsToken

Rule: CommunicationWithiOSApplicationsRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the Communication with iOS Applications test if a data transfer (from Apple device or accessory) and the Apple device didn't reject support
Specification: N/A
Error: the required commands were not seen during the Communication with iOS Applications test

Rule: DidNotWaitForSessionSpaceAvailableAfterSessionWriteFailure
Version: ATS 2.0
Description: If the accessory receives an ACK status of SessionWriteFailure (0x17), it must wait for this notification before retrying an AccessoryDataTransfer command in the same session. This rule will fire an error if the accessory trys to send AccessoryDataTransfer before seeing the SessionSpaceAvailable notification
Specification: MFi Accessory Firmware Specification R46 (3.3.54)
Error: accessory must wait for SessionSpaceAvailable notification before sending AccessoryDataTransfer for session ID %1$hu

Rule: EAProtocolTokenOrBundleSeedIDPrefTokenWhenCommunicationWithiOSUnusable
Version: ATS 2.0
Description: This rule throws an error if the accessory sends an EAProtocolToken or BundleSeedIDPrefToken after the iPod has sent RetiPodOptionsForLingo for General Lingo with bit 13 (Communication with iOS applications) set to 0, or after the iPod has responded with a non-zero ACK to GetiPodOptionsForLingo for General Lingo
Specification: MFi Accessory Firmware Specification R46 (Table 3-2)
Error: accessory sent %1$@ without first receiving RetiPodOptionsForLingo for General lingo with option bit 13 (0x0D) set

Rule: FlowControlNotificationIgnored
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AccessoryDataTransfer before waiting the appropriate amount of time specified by a flow control notification from the iPod.
Specification: MFi Accessory Firmware Specification R46 (3.3.48)
Error: accessory sent AccessoryDataTransfer before waiting the amount of time specified by a flow control notification

Rule: IncorrectBadParameterSentForiPodDataTransfer
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a DevACK with "Bad Parameter" status in response to an iPodDataTransfer command with a valid session ID.
Specification: MFi Accessory Firmware Specification R46 (3.3.49)
Error: accessory sent a Bad Parameter AccessoryAck in response to iPodDataTransfer with a valid session ID

Rule: NextAccessoryDataTransferTooSoon
Version: ATS 2.0
Description: The accessory must not send a new AccessoryDataTransfer packet until the previous one has been acknowledged (as successful or not) or a 500 ms timeout has expired. If an accessory tries to send another AccessoryDataTransfer before that condition is met then this rule will fire an error. (This rule is independent of session ID).
Specification: MFi Accessory Firmware Specification R46 (3.3.48)
Error: accessory did not wait for iPodAck of AccessoryDataTransfer or 500 ms timeout before sending next AccessoryDataTransfer

Rule: NoRequestTransportMaxPayloadSizeBeforeAccessoryDataTransfer
Version: ATS 2.0
Description: Before sending the first AccessoryDataTransfer command, the accessory must send a RequestTransportMaxPayloadSize command to determine the maximum packet size that it can stream. This rule will fire an error if ReturnTransportMaxPayloadSize is not seen (because RequestTransportMaxPayloadSize was not sent).
Specification: MFi Accessory Firmware Specification R46 (3.3.48)
Error: accessory must receive a response to RequestTransportMaxPayloadSize before sending first AccessoryDataTransfer

Rule: OpenDataSessionNotDevACKed
Version: ATS 2.2
Description: This rule throws an error if the accessory fails to send DevACK in response to OpenDataSessionForProtocol within 500 ms
Specification: MFi Accessory Firmware Specification R46 (3.3.45)
Error: accessory failed to respond to OpenDataSessionForProtocol with an AccessoryAck within 500 ms

Rule: TooManyRetriesOfAccessoryDataTransfer
Version: ATS 2.0
Description: From spec: - If a 500 ms timeout occurs before an AccessoryDataTransfer command is acknowledged successfully, the accessory may resend the same packet with the same transaction ID. If the accessory retries 10 times without receiving a successful acknowledgement, it must close the session and assume that the transfer failed. - If an AccessoryDataTransfer command is acknowledged with a SessionWriteFailure status (0x17), the accessory may send a packet with the same transaction ID containing the remaining data. If no additional bytes are successfully accepted after 10 such attempts, the accessory must close the session and assume that the transfer failed. See Table 2-16 (page 82). This rule will fire an error if more than 10 AccessoryDataTransfer packets are sent without an intervening ACK (other than SessionWriteFailure) or intervening CloseDataSession. This should cover both cases described above.
Specification: MFi Accessory Firmware Specification R46 (3.3.48)
Error: accessory must close session ID %1$hu due to repeated failure of AccessoryDataTransfer

Rule: UnknownSessionIDInAccessoryDataTransfer
Version: ATS 1.3
Description: This rule throws an error if the accessory sends an AccessoryDataTransfer for a session ID that does not match a session ID returned in an OpenDataSessionForProtocol command sent from the iPod and ACKed by the accessory.
Specification: MFi Accessory Firmware Specification R46 (3.3.48)
Error: accessory sent AccessoryDataTransfer for an unknown session ID

AssistiveTouchiAP2

Rule: AssistiveTouchRequiredMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Fire an error if any of the mandatory messages are not seen during the test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

WiFiiAP2

Rule: WiFiMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if the accessory fails to send mandatory messages during the Wi-Fi test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

AccessoryEqualizer

Rule: NoResponseToGetCurrentEQIndex
Version: ATS 2.1
Description: This rule fires a warning if the accessory doesn't reply to GetCurrentEQIndex with RetCurrentEQIndex within 2.5 seconds.
Specification: MFi Accessory Firmware Specification R46 (4.8.4)
Warning: accessory did not reply to GetCurrentEQIndex with RetCurrentEQIndex within 2.5 seconds

Rule: NoResponseToGetEQIndexName
Version: ATS 2.1
Description: This rule fires a warning if the accessory doesn't reply to GetEQIndexName with RetEQIndexName within 3 seconds.
Specification: MFi Accessory Firmware Specification R46 (4.8.9)
Warning: accessory did not reply to GetEQIndexName with RetEQIndexName within 3 seconds

Rule: NoResponseToGetEQSettingCount
Version: ATS 2.1
Description: This rule fires a warning if the accessory doesn't reply to GetEQSettingCount with RetEQSettingCount within 3 seconds.
Specification: MFi Accessory Firmware Specification R46 (4.8.7)
Warning: accessory did not reply to GetEQSettingCount with RetEQSettingCount within 3 seconds

SimpleRemote

Rule: FirstCameraButtonStatusIsZero
Version: ATS 1.5
Description: Throw an error if the first camera button status is not 1 (down).
Specification: MFi Accessory Firmware Specification R46 (4.2.14)
Error: accessory sent a CameraButtonStatus (up) without first sending a CameraButtonStatus (down)

Rule: IdenticalContextButtonStatusSpacingLessThan30ms
Version: ATS 1.1
Description: This message rule throws an error if the time between two successive identical ContextButtonStatus commands is less than 30 ms. 2 ms tolerance added for rdar://problem/6987507 Timing related rules should have some tolerance to prevent the wormhole effect
Specification: MFi Accessory Firmware Specification R46 (4.2.7)
Error: accessory sent identical ContextButtonStatus commands less than 30 ms apart (actual %1$llu ms)

Rule: IdenticalVideoButtonStatusSpacingLessThan30ms
Version: ATS 2.1
Description: This message rule throws an error if the time between two successive identical VideoButtonStatus commands is less than 30 ms.
Specification: MFi Accessory Firmware Specification R46 (4.2.9)
Error: accessory sent identical VideoButtonStatus commands less than 30 ms apart (actual %1$llu ms)

Rule: MissingContextButtonStatus
Version: ATS 1.1
Description: This rule throws an error if there is no ContextButtonStatus command within 100 ms after another ContextButtonStatus command, except if the last ContextButtonStatus command had a zero payload indicating all buttons were up. 2 ms tolerance added for rdar://problem/6987507 Timing related rules should have some tolerance to prevent the wormhole effect
Specification: MFi Accessory Firmware Specification R46 (4.2.7)
Error: accessory did not send ContextButtonStatus within 100 ms of another ContextButtonStatus whose button status was non-zero

Rule: MissingVideoButtonStatus
Version: ATS 2.1
Description: This rule throws an error if there is no VideoButtonStatus command within 100 ms after another VideoButtonStatus command, except if the last VideoButtonStatus command had a zero payload indicating all buttons were up.
Specification: MFi Accessory Firmware Specification R46 (4.2.9)
Error: accessory did not send VideoButtonStatus within 100 ms of another VideoButtonStatus whose button status was non-zero

Rule: RadioButtonStatusSpacingGreaterThan100ms
Version: ATS 1.4
Description: Throw an error if the accessory doesn't send a RadioButtonStatus within 100 ms of a RadioButtonStatus with a non-zero button status. Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.2.13)
Error: more than 100 ms have elapsed since the last RadioButtonStatus command without sending another

Rule: RadioButtonStatusSpacingLessThan30ms
Version: ATS 1.4
Description: Throw an error if the accessory sends two RadioButtonStatus commands within 30 ms of each other with a non-zero buttonStatus. Note: This rule has a 2 ms tolerance built in due to rdar://problem/6827868
Specification: MFi Accessory Firmware Specification R46 (4.2.13)
Error: accessory sent two RadioButtonStatus commands within 30 ms of each other with a non-zero buttonStatus

Rule: RestrictedContextButtonStatusFromiOSDevice
Version: ATS 2.0
Description: iOS Devices are only allowed to use a subset of the ContextButtonStatus states, so this rule will throw an error if the CA is running with an iOS Device and that device uses a restricted ContextButtonStatus state. (See section "Controlling Applications Using the Simple Remote Lingo" R42, p.52). Note: we are making the assumption that the device is an iOS device if the accessory registers for the NowPlayingFocus notification. See rdar://problem/8145159.
Specification: MFi Accessory Firmware Specification R46 (1.8)
Error: accessory sent restricted button state in ContextButtonStatus when communicating with iOS device

Rule: SimpleRemoteRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the Simple Remote test if a Simple Remote lingo command was not seen
Specification: N/A
Error: the required commands for the Simple Remote test were not seen

Rule: WarnZeroCameraButtonStatusMissing
Version: ATS 1.5
Description: Throw a warning if a camera button status with zero status isn't sent within 200 ms of a camera button status with non-zero status
Specification: MFi Accessory Firmware Specification R46 (4.2.14)
Warning: accessory did not send a CameraButtonStatus (up) within 200 ms of a CameraButtonStatus (down)

Rule: ZeroCameraButtonStatusMissing
Version: ATS 1.5
Description: Throw an error if two successive camera button statuses within 200 ms of each other have non-zero values (i.e. there is no intervening camera button status with zero status)
Specification: MFi Accessory Firmware Specification R46 (4.2.14)
Error: accessory sent two successive CameraButtonStatus (down) commands within 200 ms of each other without an intervening CameraButtonStatus (up) command

UsesiAP

Rule: AccessoryInfoContainsAppleTrademark
Version: ATS 3.0 (External Only)
Description: This rule throws a warning if the Accessory's Product Info contains publicly released trademarks http://www.apple.com/legal/trademark/guidelinesfor3rdparties.html Including but not limited to... "The Apple word mark is not part of the product name" "You may not use or register, in whole or in part, Apple, iPod, iTunes, Macintosh, iMac, or any other Apple trademark, ..."
Specification: N/A
Warning: accessory violated \"%@\" trademark and must not use Apple trademarks in manufacturer or product names

Rule: AccessorySentDeprecatedCommand
Version: ATS 2.0
Description: This rule throws a warning if the accessory sends a deprecated command. Deprecated commands are defined in the lktspec.
Specification: MFi Accessory Firmware Specification R46 (C)
Warning: %1$@ lingo %2$@ command is deprecated

Rule: AccessoryStatusNotificationCommandWithoutAccessoryInfoToken
Version: ATS 1.4
Description: This rule throws an error if the accessory attempts to use an accessory status notification command without first setting the AccessoryInfoToken to indicate that it supports status notifications.
Specification: MFi Accessory Firmware Specification R46 (Table 3-72)
Error: the accessory has not yet indicated support for status notifications with an AccessoryInfoToken

Rule: AccessoryStatusNotificationForSameStatusTypeSentTooFrequently
Version: ATS 1.4
Description: This rule throws an error is the accessory sends AccessoryStatusNotification for the same status type more frequently than once every 500 ms.
Specification: MFi Accessory Firmware Specification R46 (3.3.52)
Error: accessory sent AccessoryStatusNotification for the same status type more frequently than once every 500 ms

Rule: AccessoryStatusNotificationMissing
Version: ATS 1.4
Description: This rule throws an error if an accessory does not send an AccessoryStatusNotification for each status type included in the accessory's RetAccessoryStatusNotification within 500ms.
Specification: MFi Accessory Firmware Specification R46 (3.3.52)
Error: accessory did not send an initial AccessoryStatusNotification for each registered notification within 500 ms

Rule: AccessoryStatusNotificationWithUnrecognizedStatusType
Version: ATS 1.4
Description: This rule throws an error if the accessory sends AccessoryStatusNotification with a status type that wasn't included in the Accessory's RetAccessoryStatusNotification.
Specification: MFi Accessory Firmware Specification R46 (3.3.51)
Error: accessory sent a status type that was not included in RetAccessoryStatusNotification

Rule: AccessoryStatusNotificationWithoutRetAccessoryStatusNotification
Version: ATS 2.0
Description: This rule throws an error if the accessory sends AccessoryStatusNotification without previously sending RetAccessoryStatusNotification.
Specification: MFi Accessory Firmware Specification R46 (3.3.52)
Error: accessory sent an AccessoryStatusNotification without sending a RetAccessoryStatusNotification

Rule: AlarmDeprecated
Version: ATS 2.0
Description: This rule throws a warning if an accessory tries perform any alarm related actions
Specification: MFi Accessory Firmware Specification R46 (Table 4-59)
Warning: accessory attempted to use the alarm, which is deprecated

Rule: AuthCertClassDoesNotMatchIdentifiedLingoes
Version: ATS 1.3
Description: This rule throws an error if the accessory has identified for a lingo not permitted by its authentication certificate class. Notes: Name updated in 1.3 from AuthCertClassDoesNotMatchIDLLingoes in 1.1 and updated with IDPS support
Specification: MFi Accessory Firmware Specification R46 (2.4.1)
Error: device lingoes identified (0x%1$x) do not match the certificate class %2$d

Rule: AuthCertClassDoesNotMatchRFCertificationDeclaration
Version: ATS 2.0
Description: This rule throws an error if the accessory sets any bit in the RF Certifcation Delcaration not permitted by its authentication certificate class. rdar://problem/8817017 Rule Request: RFCertificationAuthenticationInvalid
Specification: MFi Accessory Firmware Specification R46 (Table 3-73)
Error: RF certification cannot be declared with certificate class %1$d

Rule: AuthV2GetSignatureTimeout
Version: ATS 1.0
Description: This rule throws an error if the accessory fails to respond to GetAccessoryAuthenticationSignature within 75 seconds when using V2.
Specification: MFi Accessory Firmware Specification R46 (2.4.2)
Error: accessory failed to respond to GetAccessoryAuthenticationSignature within 75 seconds

Rule: BadSignatureReturned
Version: ATS 1.1
Description: This rule throws a warning if the accessory ever receives an AckAccessoryAuthenticationStatus NACK. Although it is a likely sign of larger problems, this conditions only causes a warning (rather than an error) because it is still posssible for the accessory to complete authentication on the second try. Other rules will catch a complete failure to authenticate successfully.
Specification: MFi Accessory Firmware Specification R46 (3.3.22)
Warning: accessory received AckAccessoryAuthenticationStatus command indicating the accessory returned a bad signature

Rule: CancelCommandBeforeAccessoryCapsToken
Version: ATS 1.5
Description: This rule throws an error if an accessory attempts to use the CancelCommand if option bit 19 was not set in the AccessoryCapsToken when identifying via IDPS.
Specification: MFi Accessory Firmware Specification R46 (Table 3-71)
Error: async process large data (bit 19) was not set in AccessoryCapsToken before using CancelCommand

Rule: CancelCommandForUnsupportedCommandID
Version: ATS 1.5
Description: This rule throws an error if an accessory attempts to use the CancelCommand to cancel a command other than GetTrackArtworkData, GetNumberCategorizedDBRecords, GetDBTrackInfo, GetUIDTrackInfo, or GetPBTrackInfo.
Specification: MFi Accessory Firmware Specification R46 (3.3.60)
Error: cancel not supported for %@ command %@

Rule: CommWithAppsAccessoryCapsTokenWithoutCommWithAppsClaim (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory indicates communication with iOS applications capability in an AccessoryCapsToken but the "Communication with iOS Applications" claim was not selected.
Specification: N/A
Error: accessory declared support for iOS applications in AccessoryCapsToken but the accessory's claims do not indicate support

Rule: CommandFromUnidentifiedLingo
Version: ATS 1.5
Description: This rule throws an error if the accessory uses a command from a lingo that was not included in the identification process. For IDL, only commands from identified lingoes may be used. For legacy Identify, commands from inferred lingoes (e.g., legacy Identify also earns lingoes 2 and 3) may also be used. Notes: Updated with IDPS, iPod Out and USB Host Mode support.
Specification: MFi Accessory Firmware Specification R46 (Table 3-65)
Error: accessory sent a command in a lingo for which it did not successfully identify (check SetFIDTokenValues packet for errors)

Rule: CommandRequiresAuthenticationV2
Version: ATS 1.5
Description: This rule throws an error if a command requiring V2 authentication is sent before authentication is completed and the grace period has expired. Notes: Updated with IDPS support. Updated to support DisplayPort in Wildcat and iPod Out in Apex.
Specification: MFi Accessory Firmware Specification R46 (2.4.2)
Error: accessory sent a command which requires authentication V2 without first authenticating with V2

Rule: CommandSentAfterIdentificationFailed
Version: ATS 2.0
Description: This rule throws an error if the accessory sends a non-identification command after the identification process has failed.
Specification: MFi Accessory Firmware Specification R46 (2.3.2)
Error: accessory sent a non-identification command after identification failed

Rule: CommandSentBeforeIdentificationCompleted
Version: ATS 1.3
Description: This rule throws an error if an accessory sends a command after sending an Identify or IdentifyDeviceLingoes but before receiving an ACK from the iPod, or after sending EndIDPS but before receiving an IDPSStatus from the iPod. Notes: rdar://problem/6893714 Also, 1.x throws a warning. 2.0 should throw an error.
Specification: MFi Accessory Firmware Specification R46 (2.3.2.2)
Error: accessory sent command before identification process completed

Rule: DeprecatedBitsSet
Version: ATS 2.3
Description: This rule throws a warning if the accessory sets a bit that is deprecated or a bitgroup value that is deprecated.
Specification: N/A
Warning: accessory set deprecated %@ in bitfield %@

Rule: DidNotRegisterForBothNowPlayingApplicationNotifications
Version: ATS 2.2
Description: This rule throws an error if an accessory tried to register for only NowPlayingApplicationBundleName or only NowPlayingApplicationDisplayName. It must register for both.
Specification: MFi Accessory Firmware Specification R46 (1.6)
Error: accessory must register for both NowPlayingApplicationBundleName and NowPlayingApplicationDisplayName notifications

Rule: DisplayRemoteRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the DisplayRemote test if a required DisplayRemote command was not seen
Specification: N/A
Error: the required commands for the Display Remote test were not seen

Rule: ExceededMaxPacketPayloadSize
Version: ATS 2.1
Description: This rule fires an error if the accessory sends any command with a packet payload greater than the max packet payload size returned from ReturnTransportMaxPayloadSize. (No error is fired if ReturnTransportMaxPayloadSize has not been seen).
Specification: MFi Accessory Firmware Specification R46 (3.3.15)
Error: accessory sent %1$@ lingo %2$@ command with a packet payload size of %3$d, which is greater than the max packet payload size of %4$d set by ReturnTransportMaxPayloadSize

Rule: GetOrSetiPodPreferencesVideoOutRequiresAuth
Version: ATS 1.1
Description: This rule throws an error if the accessory GetiPodPreferences or SetiPodPreferences command requiring authentication is sent before authentication is completed and the grace period has expired. Notes: Updated with IDPS support
Specification: MFi Accessory Firmware Specification R46 (3.3.36)
Error: using GetiPodPreferences or SetiPodPreferences with the video out class requires authentication

Rule: GetWithoutAttemptedNotificationRegistration
Version: ATS 2.2
Description: This rule throws an error if a Get command is sent without attempting to register for the appropriate notifications. NOTE: Accessories are allowed to send GetPlayStatus when entering Extended Interface mode for the first time without attempting to register for notifications to comply with FirstRemoteUICommandNotGetPlayStatus.
Specification: MFi Accessory Firmware Specification R46 (1.4.1)
Error: accessory sent %1$@ without first attempting %2$@

Rule: GetiPodOptionsWithoutTryingGetiPodOptionsForLingo
Version: ATS 1.3
Description: This rule throws an error if the accessory sends GetiPodOptions without first trying to see if the iPod supports GetiPodOptionsForLingo.
Specification: MFi Accessory Firmware Specification R46 (3.3.30)
Error: accessory sent GetiPodOptions without first trying GetiPodOptionsForLingo

Rule: IAPSentAfterUnsupportedAccessory
Version: ATS 1.4
Description: This rule throws an error if the accessory sends any iAP traffic after it has sent an IDL with all parameters set to 0xFFFFFFFF indicating an unsupported accessory
Specification: MFi Accessory Firmware Specification R46 (1.7)
Error: accessory sent an iAP packet after sending IdentifyDeviceLingoes indicating an unsupported accessory

Rule: IAPSentDuringFlowControlWaitTime
Version: ATS 1.4
Description: This rule throws an error if the accessory sends any iAP packets after receiving a FlowControl notification and before the FlowControl wait time elapses.
Specification: MFi Accessory Firmware Specification R46 (3.3.54)
Error: accessory did not wait for the FlowControl wait time to elapse

Rule: IPodAuthBeforeDeviceAuth
Version: ATS 1.0
Description: This rule throws an error if authentication of the iPod is started before authentication of the device has started. This rule will not fire if the accessory fails CommandRequiresAuthenticationV2.
Specification: MFi Accessory Firmware Specification R46 (2.4.4)
Error: accessory sent iPod authentication-related command before successfully completing accessory authentication

Rule: IPodOutWithoutClaim (Product Plan Rule)
Version: ATS 1.5
Description: This rule throws an error of the accessory attempts to use any iPod Out features without the user first checking the "iPod Out" claim.
Specification: N/A
Error: accessory used an iPod Out command, but the accessory's claims do not indicate support

Rule: Identification
Version: ATS 1.1
Description: This rule throws an error if the iPod sends an iPodAck and there are more than one pending RequestLingoProtocolVersion commands. This is a dubious rule. Where is the spec language for this? rdar://problem/11929863 Vet the Identification rule
Specification: N/A
Error: Got iPodAck for RequestLingoProtocolVersion, but there were %1$lu pending RequestLingoProtocolVersion commands. Do not send new RequestLingoProtocolVersion requests before receiving a reply or a timeout for the previous one

Rule: InsufficientRetryingOfIDL
Version: ATS 1.1
Description: This rule throws an error if the accessory gives up too early in the face of non-response to IDL. Although not a formal spec requirement, we want to encourage accessories to continue to retry IDL even in the absence of a NACK, because iPhone may be non-responsive for a period immediately after boot or wake-up. For the purposes of this rule, the accessory should try sending IDL at least 5 times and for at least 5 seconds before giving up, at which point an accessory that supports 3G iPod may fall back and attempt a legacy Identify. Accessories that don't support 3G iPod should continue trying IDL forever. (Can they really *never* give up?)
Specification: N/A
Error: accessory failed to retry IdentifyDeviceLingoes five times within five seconds after receiving no response to IdentifyDeviceLingoes

Rule: LegacyIdentifyForDigitalAudio
Version: ATS 2.2
Description: This rule throws an error if the accessory sends Identify for Digital Audio Lingo
Specification: MFi Accessory Firmware Specification R46 (4.10)
Error: accessory sent legacy Identify for Digital Audio Lingo

Rule: LineOutPreferencesSeenWithoutLineOutAccessoryClaim (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory sets preferences for line out but the "Line Out Accessory" claim was not selected. Notes: rdar://problem/6804130
Specification: N/A
Error: accessory set line out preferences but the accessory's claims do not indicate support

Rule: LocationLingoIdentificationWithoutLocationClaim (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory identifies as supporting Location lingo but the "Location" claim was not selected. Notes: rdar://problem/6804130
Specification: N/A
Error: accessory identified for Location lingo, but the accessory's claims do not indicate support

Rule: MissingRequestTransportMaxPayloadSizeDuringIDPS
Version: ATS 2.2
Description: This rule throws an error if the accessory fails to send RequestTransportMaxPayloadSize during IDPS
Specification: MFi Accessory Firmware Specification R46 (2.3.2.1)
Error: accessory failed to send RequestTransportMaxPayloadSize during IDPS

Rule: NoIdentificationAfterPowerCycle30Pin
Version: ATS 1.2
Description: This rule throws an error if the accessory does not identify itself using StartIDPS, IdentifyDeviceLingoes, or legacy Identify within five seconds of Accessory Power going high. It is intended to catch accessories that fail to handle iPod sleep/wake cycles.
Specification: MFi Accessory Hardware Specification R9 (pg. 35)
Error: accessory did not identify within 3 seconds of accessory power going high

Rule: NoNewIdentificationBetweenIDLAndACK
Version: ATS 1.1
Description: This rule throws an error if an Identify or IDL or StartIDPS is sent too soon (within 500 ms) after a previous IDL that has not yet been ACK'd. A threshold of 500 ms is used. The purpose of this rule is to catch accessories that time-out too quickly in the face of iPod/iPhone IDL non-response on (say) boot or wake-up.
Specification: MFi Accessory Firmware Specification R46 (2.4)
Error: accessory sent new Identify, IdentifyDeviceLingoes, or StartIDPS less than 500 ms (actual %1$llu ms) after IdentifyDeviceLingoes and before iPodAck

Rule: NoResponseToGetAccessoryAuthenticationInfo
Version: ATS 1.1
Description: This rule throws an error if an accessory fails to respond to GetAccessoryAuthenticationInfo with RetAccessoryAuthenticationInfo within 15 seconds. rdar://problem/11930379 Vet NoResponseToGetAccessoryAuthenticationInfo. Timeout at 15 seconds or 2?
Specification: MFi Accessory Firmware Specification R46 (2.4.2)
Error: accessory failed to respond to GetAccessoryAuthenticationInfo within 15 seconds

Rule: NoResponseToGetAccessoryInfo
Version: ATS 1.5
Description: This rule throws an error if the accessory fails to respond to a GetAccessoryInfo command within 500 ms.
Specification: MFi Accessory Firmware Specification R46 (3.3.33)
Error: accessory did not reply to GetAccessoryInfo for accessory info type %1$u (0x%1$02X) with RetAccessoryInfo within 500 ms

Rule: PendingACK
Version: ATS 1.1
Description: This rule throws a warning if the accessory retries a command before the timeout specified by the iPod
Specification: MFi Accessory Firmware Specification R46 (3.3.2)
Warning: accessory retried command ID 0x%1$x before the %2$llu ms timeout specified by the Apple device

Rule: Power100mAExceeded30Pin
Version: ATS 1.1
Description: This rule throws an error if the average current exceeds 100 mA at any time.
Specification: MFi Accessory Hardware Specification R9 (pg. 48)
Error: average current %1$.1lf mA exceeds 100.0 mA

Rule: RFTunerIdentificationWithoutClaim (Product Plan Rule)
Version: ATS 1.4
Description: This rule throws an error if the accessory identifies as supporting RF Tuner lingo but the "RF Tuner" claim was not selected.
Specification: N/A
Error: accessory identified for RF Tuner lingo but the accessory's claims do not indicate support

Rule: RFTunerWithoutClaim (Product Plan Rule)
Version: ATS 1.4
Description: This rule throws an error of the accessory attempts to use any RF Tuner features without the user first checking the "RF Tuner" claim.
Specification: N/A
Error: accessory used an RF Tuner command, but the accessory's claims do not indicate support

Rule: RedundantGetAfterNotification
Version: ATS 2.2
Description: This rule throws an error if a Get is sent multiple times after registering for a notification for the same information
Specification: MFi Accessory Firmware Specification R46 (1.4.1)
Error: accessory sent multiple Gets after registering for a notification for the same information

Rule: ReferToRetiPodOptionsForLingoGeneralBit27NotUSBHostModeBit0
Version: ATS 2.2.1
Description: This rule issues a warning whenever the iPod sends a RetiPodOptionsForLingo for USB Host Mode lingo with bit 0 set informing the developer that this bit is deprecated and that RetiPodOptionsForLingo General lingo bit 27 should be used to determine if the iPod supports invoking USB Host Mode via hardware.
Specification: MFi Accessory Firmware Specification R46 (Table 3-132)
Warning: RetiPodOptionsForLingo USB Host Mode lingo bit 0 is deprecated. Refer to RetiPodOptionsForLingo General lingo bit 27 to determine USB Host Mode hardware invocation capability.

Rule: RemoteUIIdentificationWithoutRemoteUIClaim (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory identifies as supporting Remote UI but the "Remote UI (Head Unit)" claim was not selected.
Specification: N/A
Error: accessory identified for Extended Interface lingo but the accessory's claims do not indicate support

Rule: RemoteUIModeCommandsRequireLingo4
Version: ATS 1.1
Description: This rule throws an error if the accessory uses any of RequestExtendedInterfaceMode, EnterExtendedInterfaceMode or ExitExtendedInterfaceMode commands without having first identified for Extended Interface (lingo 4). Also throw this error if no identify command has been sent at all. Notes: Updated with IDPS support
Specification: MFi Accessory Firmware Specification R46 (1.11.1)
Error: RequestExtendedInterfaceMode, SetUIMode (Extended Interface mode), or ExitExtendedInterfaceMode may only be used if the accessory successfully identifies for Extended Interface (lingo 0x04)

Rule: RepeatRetAccessoryAuthenticationInfoSentBeforeACK
Version: ATS 1.1
Description: This rule throws an error if another RetAccessoryAuthenticationInfo is sent before the previously sent one has been ACKed, unless a new GetAccessoryAuthenticationInfo has been received.
Specification: MFi Accessory Firmware Specification R46 (2.4.3)
Error: new RetAccessoryAuthenticationInfo sent before the previous one was acknowledged

Rule: RepeatedGetSentTooQuickly
Version: ATS 2.2
Description: This rule throws an error if a Get is sent within 1 second of receiving the Ret after the previous Get. Note, the rule only checks the following commands, as these are the ones explicitly called out by the spec: // ExtendedInterface::GetPlayStatus // ExtendedInterface::GetShuffle // ExtendedInterface::GetRepeat // ExtendedInterface::GetIndexedPlayingTrackInfo // DisplayRemote::GetiPodStateInfo // DisplayRemote::GetPlayStatus
Specification: MFi Accessory Firmware Specification R46 (1.4.1)
Error: accessory sent a %1$@ command less than 1000 ms from the previous response (actual %2$lld ms)

Rule: RequestApplicationLaunchRetriedAfterNACK
Version: ATS 1.5
Description: This rule throws an error if an accessory attempts to use the RequestApplicationLaunch command after the iPod NACK'd with any non-zero status value (other than 0x06 = cmd pending).
Specification: MFi Accessory Firmware Specification R46 (3.3.64)
Error: accessory retried RequestApplicationLaunch after iPod sent iPodAck indicating that it already failed

Rule: RequestApplicationLaunchUnsupported
Version: ATS 1.5
Description: This rule throws an error if an accessory attempts to use the RequestApplicationLaunch command if option bit 24 was not enabled in RetiPodOptionsForLingo.
Specification: MFi Accessory Firmware Specification R46 (Table 3-2)
Error: the iPod did not return support for applications auto-launching in RetiPodOptionsForLingo

Rule: RequestIdentifyNotAnswered
Version: ATS 1.1
Description: This rule throws an error if the accessory fails to respond to a RequestIdentify command with IdentifyDeviceLingoes, StartIDPS, or legacy Identify within 3 seconds. Notes: Updated with IDPS support
Specification: MFi Accessory Firmware Specification R46 (3.3.1)
Error: accessory did not respond to RequestIdentify within 3 seconds

Rule: RequestLingoProtocolVersionWithoutTryingGetiPodOptionsForLingo
Version: ATS 2.2
Description: This rule throws an error if the accessory sends RequestLingoProtocolVersion without first trying GetiPodOptionsForLingo
Specification: MFi Accessory Firmware Specification R46 (3.3.12)
Error: accessory sent RequestLingoProtocolVersion %1$@

Rule: RetAccessoryAuthenticationInfoCertClassUnparsable
Version: ATS 2.0
Description: This rule fires an error when the cert class is unparsable from the cert serial number information.
Specification: MFi Accessory Firmware Specification R46 (3.3.18)
Error: accessory sent unparsable certificate class information

Rule: RetAccessoryAuthenticationInfoCertSerialUnparsable
Version: ATS 2.0
Description: This rule fires an error when the cert serial number value in the certificate is unparsable, which indirectly means that the certificate is also unparsable.
Specification: MFi Accessory Firmware Specification R46 (3.3.18)
Error: accessory sent unparsable certificate information

Rule: RetAccessoryAuthenticationInfoMaxSectionIndexMismatch
Version: ATS 2.0
Description: This rule fires a warning if the accessory sends a multisection RetAccessoryAuthenticationInfo whose certificateMaximumSectionIndex does not match the certificateMaximumSectionIndex of the first RetAccessoryAuthenticationInfo packet.
Specification: MFi Accessory Firmware Specification R46 (3.3.18)
Warning: the accessory sent a certificate section with a maximum section index of %1$d after sending one with a maximum section index of %2$d

Rule: RetAccessoryAuthenticationInfoOutOfRangeSectionIndex
Version: ATS 2.0
Description: This rule fires an error if the accessory sends RetAccessoryAuthenticationInfo with certificateCurrentSectionIndex greater than certificateMaximumSectionIndex.
Specification: MFi Accessory Firmware Specification R46 (3.3.18)
Error: the accessory sent a certificate section with an index (%1$d) greater than the maximum section index (%2$d)

Rule: RetAccessoryAuthenticationInfoWithEmptyCertDataPayload
Version: ATS 2.0
Description: This rule fires an error if the accessory sends RetAccessoryAuthenticationInfo with an empty certificateData payload.
Specification: MFi Accessory Firmware Specification R46 (3.3.18)
Error: accessory sent RetAccessoryAuthenticationInfo with an empty certificate data payload

Rule: RetAccessoryInfoTypeTwoDeprecated
Version: ATS 2.1
Description: This rule throws a warning if the accessory sends RetAccessoryInfo with Accessory Info Type 0x02 (minimum supported iPod firmware version)
Specification: MFi Accessory Firmware Specification R46 (Table 3-46)
Warning: accessory info type 0x02 for command RetAccessoryInfo is deprecated

Rule: RetAccessoryStatusNotificationMissingAfterSetAccessoryStatusNotification
Version: ATS 1.4
Description: This rule throws an error if the accessory does not respond to SetAccessoryStatusNotification with a RetAccessoryStatusNotification within 500 ms.
Specification: MFi Accessory Firmware Specification R46 (3.3.50)
Error: accessory did not respond to SetAccessoryStatusNotification (transaction ID = %hu) with a RetAccessoryStatusNotification within 500 ms

Rule: RetAccessoryStatusNotificationWithUnrecognizedBits
Version: ATS 1.4
Description: This rule throws an error if the accessory sends RetAccessoryStatusNotification that sets a bit that wasn't included in the iPod's SetAccessoryStatusNotification.
Specification: MFi Accessory Firmware Specification R46 (3.3.51)
Error: accessory set a bit that was not included in SetAccessoryStatusNotification

Rule: SetEventNotificationBeforeRetSupportedEventNotification
Version: ATS 1.4
Description: This rule throws an error if the accessory sends SetEventNotification prior to receiving RetSupportedEventNotification or ACK bad parameter of GetSupportedEventNotification from the iPod.
Specification: MFi Accessory Firmware Specification R46 (1.4.2)
Error: accessory sent SetEventNotification prior to receiving RetSupportedEventNotification or ACK bad parameter of GetSupportedEventNotification

Rule: SetEventNotificationWithUnrecognizedBits
Version: ATS 1.4
Description: This rule throws an error if the accessory sends SetEventNotification that sets a bit that wasn't included in the iPod's RetSupportedEventNotification.
Specification: MFi Accessory Firmware Specification R46 (1.4.2)
Error: accessory set a bit that was not included in RetSupportedEventNotification

Rule: SetUIModeSentWheniPodOutUnusable
Version: ATS 1.5
Description: This rule throws an error if the accessory sends SetUIMode attempting to enable iPod Out mode after the iPod has sent RetiPodOptionsForLingo with lingo ID set to 0x0D and bit 0x00 set to 0, or after the iPod has responded with a non-zero ACK to GetiPodOptionsForLingo with a LingoID of 0x0D.
Specification: MFi Accessory Firmware Specification R46 (Table 3-132)
Error: accessory attempted to enter iPod Out mode when iPod Out is unusable

Rule: SimpleRemoteCommandSentWithoutSimpleRemoteClaim (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory sends a Simple Remote command but the "Simple Remote" claim was not selected. Notes: rdar://problem/6804130
Specification: N/A
Error: accessory sent a Simple Remote command, but the accessory's claims do not indicate support

Rule: SimpleRemoteIdentifiedWithoutSimpleRemoteClaim (Product Plan Rule)
Version: ATS 2.1
Description: This rule throws an error if the accessory identifies for Simple Remote command but the "Simple Remote" claim was not selected. Notes: rdar://problem/9137131
Specification: N/A
Error: accessory identified for Simple Remote, but the accessory's claims do not indicate support

Rule: SportsLingoIdentificationWithoutGymEquipmentClaim (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory identifies as supporting Sports lingo but the "Gym Equipment" claim was not selected. Notes: Supersedes existing IDLLingo9WithoutGymEquipmentClaim
Specification: N/A
Error: accessory identified for Sports lingo but the accessory's claims do not indicate support

Rule: StorageLingoIdentificationWithoutStorageLingoAccessoryClaim (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory identifies as supporting Storage lingo but the "Storage Lingo Accessory" claim was not selected. Notes: rdar://problem/6804130
Specification: N/A
Error: accessory identified for Storage lingo but the accessory's claims do not indicate support

Rule: USBHostModeIdentificationWithoutClaim (Product Plan Rule)
Version: ATS 1.4
Description: This rule throws an error if the accessory identifies as supporting USB Host Mode lingo but the "USB Host Mode" claim was not selected.
Specification: N/A
Error: accessory identified for USB Host Mode lingo but the accessory's claims do not indicate support

Rule: USBHostModeWithoutClaim (Product Plan Rule)
Version: ATS 1.4
Description: This rule throws an error of the accessory attempts to use any USB Host Mode features without the user first checking the "USB Host Mode" claim.
Specification: N/A
Error: accessory used a USB Host Mode command but the accessory's claims do not indicate support

Rule: VideoOutPreferencesSeenWithoutVideoOutAccessoryClaim (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws an error if the accessory sets preferences for video out but the "Video Out Accessory" claim was not selected. Notes: rdar://problem/6804130
Specification: N/A
Error: accessory set video out preferences but the accessory's claims do not indicate support

Rule: VideoOutTurnedOnWithoutVideoOutPreferences
Version: ATS 1.3
Description: This rule throws a warning if the accessory turns on video out during IDPS but does not set any video out preferences.
Specification: MFi Accessory Firmware Specification R46 (3.3.36)
Warning: accessory turned on video out during IDPS without setting any video out preferences

Rule: VoiceOverCommandBeforeAccessoryCapsToken
Version: ATS 2.2
Description: This rule throws an error if an accessory attempts to use a VoiceOver command if option bit 0x11 was not set in the AccessoryCapsToken when identifying via IDPS.
Specification: MFi Accessory Firmware Specification R46 (1.13)
Error: accessory sent a VoiceOver command, but the VoiceOver bit was not set in AccessoryCapsToken

Rule: VoiceOverCommandBeforeRetiPodOptionsForLingo
Version: ATS 2.2
Description: This rule throws an error if an accessory attempts to use a VoiceOver command if option bit 0x0A was not enabled for lingo 0x02 in RetiPodOptionsForLingo.
Specification: MFi Accessory Firmware Specification R46 (1.13)
Error: accessory sent a VoiceOver command, but the iPod did not return support in RetiPodOptionsForLingo

Rule: VoiceOverWithoutClaim (Product Plan Rule)
Version: ATS 2.2
Description: This rule throws an error of the accessory attempts to use any VoiceOver command without the user first checking the "VoiceOver" claim.
Specification: N/A
Error: accessory sent a VoiceOver command, but the accessory's claims do not indicate support

Rule: WarnAboutRequestiPodModelNum
Version: ATS 1.0
Description: This rule throws a warning if the accessory ever sends RequestiPodModelNum, as a reminder that this is not a future-proof way to determine iPod capabilities. The command itself is perfectly legal, but many accessory developers have made this mistake.
Specification: MFi Accessory Firmware Specification R46 (Table 3-1)
Warning: do not use RequestiPodModelNum to determine iPod capabilities. Consider using GetiPodOptionsForLingo, GetiPodOptions, or RequestLingoProtocolVersion instead.

Rule: WarnAboutRequestiPodSoftwareVersion
Version: ATS 1.0
Description: This rule throws a warning if the accessory ever sends RequestiPodSoftwareVersion, as a reminder that this is not a future-proof way to determine iPod capabilities. The command itself is perfectly legal, but many accessory developers have made this mistake.
Specification: MFi Accessory Firmware Specification R46 (3.3.8)
Warning: do not use RequestiPodSoftwareVersion to determine iPod capabilities; consider using GetiPodOptionsForLingo, GetiPodOptions, or RequestLingoProtocolVersion instead

RemoteUIHeadUnit

Rule: ExtendedInterfaceModeWithoutRegistrationForDatabaseChangeNotification
Version: ATS 2.2
Description: This rule throws an error if an accessory enters Extended Interface mode but did not attempt to register for Database Changed notifications via General lingo's SetEventNotification command. If the iPod does not support this notification type, the error is not thrown.
Specification: MFi Accessory Firmware Specification R46 (1.11.2.2.5)
Error: accessory entered Extended Interface mode without attempting to register for Database Changed notifications (using General lingo SetEventNotification)

Rule: ExtendedInterfaceRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the Extended Interface test if an Extended Interface lingo command was not seen
Specification: N/A
Error: the required commands for the Extended Interface test were not seen

Rule: GetLyricsRepeatFrequencyTooFast
Version: ATS 1.1
Description: This rule generates a warning if lyrics are being requested faster than every 0.5 seconds. rdar://problem/11979428 Vet GetLyricsRepeatFrequencyTooFast
Specification: N/A
Warning: accessory is sending requests for lyrics faster than once every 0.5 seconds

Rule: GetNumPlayingTracksNotSentBeforeGetPBTrackInfo
Version: ATS 4.1
Description: Fire an error if GetPBTrackInfo is sent and GetNumPlayingTracks has not been sent previously.
Specification: N/A
Error: accessory did not check the number of tracks in playback engine before calling GetPBTrackInfo

Rule: GetPlayStatusBeforePlayControlACK
Version: ATS 1.1
Description: This rule throws an error if the accessory sends a GetPlayStatus command after sending a command that changes the play status but not waiting for an ACK of that command. rdar://problem/11979187 Vet GetPlayStatusBeforePlayControlACK
Specification: N/A
Error: GetPlayStatus sent before iPodAck of PlayControl received

Rule: IncorrectSelectDBRecordFieldLength
Version: ATS 1.1
Description: This rule throws a warning if an accessory sends SelectDBRecord(65535), since this almost certainly was meant to be SelectDBRecord(-1) instead.
Specification: MFi Accessory Firmware Specification R46 (5.1.20)
Warning: accessory sent SelectDBRecord with index of 65535 but likely intended an index of -1

Rule: Lingo4DBSelection
Version: ATS 1.1
Description: This rule throws an error if database reset (via ResetDBSelection or ResetDBSelectionHierarchy) followed by database selection (via SelectDBRecord or SelectSortDBRecord) without an intervening GetNumberCategorizedDBRecords to establish record counts. This rule is implemented in Obj-C.
Specification: MFi Accessory Firmware Specification R46 (5.1.19)
Error: ReturnNumberCategorizedDBRecords for category '%1$@' not received before sending %2$@

Rule: Lingo4OnlyInExtendedInterfaceMode
Version: ATS 1.1
Description: This rule generates an error if a Remote UI command is sent while not in Remote UI mode.
Specification: MFi Accessory Firmware Specification R46 (1.11.2)
Error: extended interface command sent when iPod is not in extended UI mode

Rule: NoGetArtworkFormats
Version: ATS 1.1
Description: This rule generates an error if GetIndexedPlayingTrackInfo with infoType = 7, GetTrackArtworkTimes, or GetTrackArtworkData is sent without sending GetArtworkFormats first. rdar://problem/11979415 Vet NoGetArtworkFormats
Specification: MFi Accessory Firmware Specification R46 (1.11.2.3)
Error: accessory sent GetIndexedPlayingTrackInfo with InfoType=7, GetTrackArtworkTimes, or GetTrackArtworkData without sending GetArtworkFormats first

Rule: NoGetCurrentPlayingTrackChapterInfo
Version: ATS 1.1
Description: This rule generates a warning if GetCurrentPlayingTrackChapterInfo was not sent before sending GetCurrentPlayingTrackChapterPlayStatus, SetCurrentPlayingTrackChapter, GetCurrentPlayingTrackChapterName. Note: If the accessory is signed up for notifications, they may get chapter information from a notification. rdar://problem/11979211 Vet NoGetCurrentPlayingTrackChapterInfo
Specification: N/A
Warning: accessory did not send GetCurrentPlayingTrackChapterInfo before sending GetCurrentPlayingTrackChapterPlayStatus, SetCurrentPlayingTrackChapter, or GetCurrentPlayingTrackChapterName

Rule: NoRequestLingoProtocolVersionForLingo4
Version: ATS 1.5
Description: This rule throws a warning if the Remote UI commands are issued without checking the version or the options for the lingo first.
Specification: N/A
Warning: accessory sent Extended Interface lingo commands before checking Extended Interface protocol version or checking the iPod options for Extended Interface Lingo

Rule: PlayControlCommandCodeDeprecated
Version: ATS 2.0
Description: This rule will throw a warning if a deprecated PlayControl command code is sent by the accessory.
Specification: MFi Accessory Firmware Specification R46 (Table 5-49)
Warning: PlayControl command %1$@ (0x%2$02X) is deprecated please use command %3$@ (0x%4$02X) instead

Rule: PlayControlCommandNotEndFFREWAfterStartFF
Version: ATS 1.5
Description: This rule will throw an error if any PlayControl command is sent after StartFF is sent but before EndFF/REW is sent.
Specification: MFi Accessory Firmware Specification R46 (Table 5-49)
Error: accessory sent a PlayControl command that is not End FF/REW after sending Start FF

Rule: PlayControlCommandNotEndFFREWAfterStartREW
Version: ATS 1.5
Description: This rule will throw an error if any PlayControl command is sent after StartREW is sent but before EndFF/REW is sent.
Specification: MFi Accessory Firmware Specification R46 (Table 5-49)
Error: accessory sent a PlayControl command that is not End FF/REW after sending Start REW

Rule: PlayControlResumeiPodWithoutThirdPartyApplicationCommunication
Version: ATS 3.0
Description: This rule throws an error if the accessory sends PlayControl Resume iPod (0x0E) while not interacting with a third-party application rdar://problem/11769275
Specification: MFi Accessory Firmware Specification R46 (1.8)
Error: accessory sent PlayControl Resume iPod (0x0E) without current interaction with a third-party application

Rule: RecordIndexOutOfBounds
Version: ATS 1.1
Description: This rule throws an error if record index used by SelectDBRecord or SelectSortDBRecord is greater than the record count for that category
Specification: MFi Accessory Firmware Specification R46 (5.1.20)
Error: record index %1$d is out of bounds (there are %2$d records in this category)

Rule: RemoteUIEntryTooSoonAfterExit
Version: ATS 2.0
Description: This rule throws a warning if an accessory re-enters Remote UI mode within 500 milliseconds of leaving it. Although not strictly illegal, this is almost certainly a sign that the accessory is behaving badly.
Specification: N/A
Warning: accessory re-entering Extended Interface mode within 500 ms of exiting (entered after only %1$llu ms)

Rule: RemoteUIExitTooSoonAfterEntry
Version: ATS 1.1
Description: This rule throws a warning if an accessory exits Remote UI mode within 500 milliseconds of entering it. Although not strictly illegal, this is almost certainly a sign that the accessory is behaving badly.
Specification: N/A
Warning: accessory exited Extended Interface mode within 500 ms of entering (exited after only %1$llu ms)

Rule: SetCurrentPlayingTrackChapterBeforeReturnCurrentPlayingTrackChapterInfo
Version: ATS 1.1
Description: This rule throws a warning if SetCurrentPlayingTrackChapter was sent before receiving ReturnCurrentPlayingTrackChapterInfo. rdar://problem/11979219 Vet SetCurrentPlayingTrackChapterBeforeReturnCurrentPlayingTrackChapterInfo
Specification: N/A
Warning: accessory sent SetCurrentPlayingTrackChapter before receiving ReturnCurrentPlayingTrackChapterInfo

Rule: SetCurrentPlayingTrackChapterOutOfBounds
Version: ATS 1.1
Description: This rule throws an error if the chapter index requested to be played by SetCurrentPlayingTrackChapter is out of bounds. rdar://problem/11979406 Vet SetCurrentPlayingTrackChapterOutOfBounds
Specification: N/A
Error: chapter index %u is greater or equal to the chapter count %u

Rule: SetDisplayImageTooLate
Version: ATS 1.1
Description: This rule throws a warning if an accessory sends SetDisplayImage more than 15 seconds after entering Remote UI mode. Although not strictly illegal, this may be a sign that the accessory is attempting to use SetDisplayImage to fake out custom UI.
Specification: MFi Accessory Firmware Specification R46 (5.1.46)
Warning: accessory called SetDisplayImage more than 15 seconds after entering Extended Interface mode (actual %llu ms)

Rule: SetPlayStatusChangeNotificationOneByteFormSentWithoutVerifyingFourByteFormUnsupported
Version: ATS 2.2
Description: This rule throws an error if an accessory sends the SetPlayStatusChangeNotification command in its one-byte form without first receiving an iPodAck to SetPlayStatusChangeNotification in its four-byte form with a status code other than Success
Specification: MFi Accessory Firmware Specification R46 (5.1.35)
Error: accessory sent the one-byte form of SetPlayStatusChangeNotification without first trying the four-byte form

Rule: UnselectingTracksNotAllowed
Version: ATS 1.1
Description: This rule throws an error if the user sends SelectDBRecord or SelectSortDBRecord with the special record index -1 (unselect) for a category other than track.
Specification: MFi Accessory Firmware Specification R46 (5.1.20)
Error: unselecting tracks is not allowed

LineOutAccessory

Rule: AnalogAudioOutRequiredCommandsNotSeenCA
Version: ATS 3.0
Description: Fire an error during the Analog Audio Out test the accessory doesn't set line out prefs (except if the Apple device doesn't support them)
Specification: N/A
Error: the required commands for the Analog Audio Out test were not seen

Rule: NoExplicitSetiPodPreferencesAudio (Product Plan Rule)
Version: ATS 1.3
Description: This rule throws a warning if the accessory does not set its line out preferences within 2 seconds after receiving an ACK to an IdentifyDeviceLingoes. Notes: Timer changed to start from ACK to IDL instead of from authentication completed. No IDPS related changes required.
Specification: N/A
Warning: accessory's claims indicate support for line out but it failed to configure line out via SetiPodPreferences within two seconds of receiving ACK for IdentifyDeviceLingoes

PoweriAP2

Rule: DevicePoweredAccessoryPowerMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if the accessory fails to send required messages and is device powered
Specification: Accessory Interface Specification R16 (36.1.2 Device Powered Accessory Requirements)
Error: did not see %1$@ while testing the %2$@ feature with a device powered accessory

Rule: DevicePoweredAccessoryUpdateMessagesNotDeclarediAP2
Version: ATS 3.2
Description: Throw an error if device powered accessory doesn't send or receive StartPowerUpdates, PowerUpdate and StopPowerUpdates messages
Specification: Accessory Interface Specification R16 (36.1.2 Device Powered Accessory Requirements)
Error: device powered accessory did not declare to send/receive required %1$@ message%2$@ %3$@

Rule: PowerSourceAccessoryInitialPowerSourceUpdateNotSeeniAP2
Version: ATS 3.2
Description: Fire if an initial PowerSourceUpdate isn't seen after identification with required parameters within 1 second after identification accepted
Specification: Accessory Interface Specification R16 (36.2.2 Accessory Power Source Usage)
Error: power source accessory did not send a %1$@ with parameter%2$@ %3$@ within 1 second after identification completed

Rule: PowerSourceAccessoryInitialStartPowerUpdatesNotSeeniAP2
Version: ATS 3.2
Description: Fire if they don't request power updates soon after identification
Specification: Accessory Interface Specification R16 (36.2.2 Accessory Power Source Usage)
Warning: power source accessories should send StartPowerUpdates after identification

Rule: PowerSourceAccessoryRequiredMessagesNotDeclarediAP2
Version: ATS 3.2
Description: Fire if StartPowerUpdates, PowerUpdate, PowerSourceUpdate and StopPowerUpdates aren't declared as sent or received
Specification: Accessory Interface Specification R16 (36.1.2 Device Powered Accessory Requirements)
Error: power source accessory did not declare to send/receive required power source message%1$@ %2$@

Rule: PowerSourceUpdateInsufficientPowerSourceUsageSeenForClaimsCAiAP2
Version: ATS 3.4
Description: Fire if a valid AvailableCurrentForDevice isn't seen with DeviceBatteryShouldChargeIfPowerIsPresent set to YES for a power source accessory during CA tests
Specification: Accessory Interface Specification R16 (36.2 Power Usage)
Error: did not see PowerSourceUpdate message with parameter AvailableCurrentForDevice indicating enough current to support claims and parameter DeviceBatteryShouldChargeIfPowerIsPresent set to YES to demonstrate charging while testing the Power Source feature

Rule: PowerSourcesMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if the accessory fails to send mandatory messages during the power test
Specification: Accessory Interface Specification R16 (36.1.1 Accessory Power Source Requirements)
Error: did not see %1$@ while testing the %2$@ feature with a power source accessory

Rule: SerialNoTimelyExitFromIntermittentHighPowerModeiAP2
Version: ATS 3.0
Description: Fire an error if the accessory does not stop drawing high power within 1 second of receiving a PowerUpdate message NOTE: this rule is serial only because we cannot write a USB rule to take power notifications over USB and correlate them with current readings from the ATS Lightning Box
Specification: Accessory Interface Specification R16 (36.2.3.2 Exiting Intermittent High Power Mode)
Error: accessory did not stop drawing high power within 1 second after being notified to switch from Intermittent High Power mode to Low Power mode

DeviceAuthenticationiAP2

Rule: DeviceAuthenticationRequiredMessagesNotSeenCAiAP2
Version: ATS 3.1
Description: Throw an error if the accessory fails to send mandatory messages during the authentication test
Specification: N/A
Error: did not see %1$@ while testing the %2$@ feature

MessageBasediAP2

Rule: AppleDeviceMessageContainsUnknownParametersiAP2
Version: ATS 3.4
Description: Fire an info message if an Apple device sourced message contains an unknown parameter, notifying developers that they should not rely on that parameter
Specification: Accessory Interface Specification R16 (47.2.2 Message Parsing)
Information: message contains deprecated %@ %@, which the accessory must ignore

Rule: IdentificationInformationFirmwareVersionEmptyiAP2
Version: ATS 3.0
Description: Fire an error if the FirmwareVersion parameter in IdentificationInformation is empty
Specification: Accessory Interface Specification R16 (48.2.2 IdentificationInformation)
Error: The FirmwareVersion parameter in IdentificationInformation cannot be empty.

Rule: IdentificationInformationHardwareVersionEmptyiAP2
Version: ATS 3.0
Description: Fire an error if the HardwareVersion parameter in IdentificationInformation is empty
Specification: Accessory Interface Specification R16 (48.2.2 IdentificationInformation)
Error: The HardwareVersion parameter in IdentificationInformation cannot be empty.

Rule: IdentificationInformationManufacturerEmptyiAP2
Version: ATS 3.0
Description: Fire an error if the Manufacturer parameter in IdentificationInformation is empty
Specification: Accessory Interface Specification R16 (48.2.2 IdentificationInformation)
Error: The Manufacturer parameter in IdentificationInformation cannot be empty.

Rule: IdentificationInformationModelIdentifierEmptyiAP2
Version: ATS 3.0
Description: Fire an error if the ModelIdentifier parameter in IdentificationInformation is empty
Specification: Accessory Interface Specification R16 (48.2.2 IdentificationInformation)
Error: The ModelIdentifier parameter in IdentificationInformation cannot be empty.

Rule: IdentificationInformationNameEmptyiAP2
Version: ATS 3.0
Description: Fire an error if the Name parameter in IdentificationInformation is empty
Specification: Accessory Interface Specification R16 (48.2.2 IdentificationInformation)
Error: The Name parameter in IdentificationInformation cannot be empty.

Rule: IdentificationInformationSerialNumberEmptyiAP2
Version: ATS 3.0
Description: Fire an error if the SerialNumber parameter in IdentificationInformation is empty
Specification: Accessory Interface Specification R16 (48.2.2 IdentificationInformation)
Error: The SerialNumber parameter in IdentificationInformation cannot be empty.

Rule: MessageContainsUnknownParametersiAP2
Version: ATS 3.2
Description: Fire an error if a message or group parameter contains an unknown parameter
Specification: Accessory Interface Specification R16 (48 iAP2 Control Session Messages)
Error: message contains unknown %@ %@