| 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 |
| 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 |
| 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: %@ |
| 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: %@ |
| 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 |
| 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 |
| 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 |
| 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) |
| 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 |
| 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 |
| 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) |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 %@ %@ |