DS90UH940-Q1: HDCP procedure between SER and DES

Part Number: DS90UH940-Q1

Tool/software:

Hello Team,

My customer did test with UH929 and UH940 for HDCP.

I provided attached to customer for their test.

HDCP_Script.txt
## TI Confidential - NDA Restrictions
## 
## Copyright 2018 Texas Instruments Incorporated. All rights reserved.
## 
## IMPORTANT: Your use of this Software is limited to those specific rights
## granted under the terms of a software license agreement between the user who
## downloaded the software, his/her employer (which must be your employer) and
## Texas Instruments Incorporated (the License). You may not use this Software
## unless you agree to abide by the terms of the License. The License limits your
## use, and you acknowledge, that the Software may not be modified, copied or
## distributed unless embedded on a Texas Instruments microcontroller which is
## integrated into your product. Other than for the foregoing purpose, you may
## not use, reproduce, copy, prepare derivative works of, modify, distribute,
## perform, display or sell this Software and/or its documentation for any
## purpose.
## 
## YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
## PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
## INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
## NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS
## INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
## NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL
## EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT
## LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL
## DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS,
## TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT
## LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
## 
## Should you have any questions regarding your right to use this Software,
## contact Texas Instruments Incorporated at www.TI.com

import time 

## *********************************************
## Set up Variables
## *********************************************
serAddr = 0x18

## *********************************************
## Initialize HDCP
## *********************************************
board.WriteI2C(serAddr,0xc3,0x1) #Enable HDCP
time.sleep(0.1)
HDCP_STS = board.ReadI2C(serAddr,0xc4,1)
if (HDCP_STS & 0x22) == 0x22:   #Check if KSV is ready and RX_LOCK_DET is high
  RX_BKSV0 = board.ReadI2C(serAddr,0x80,1)
  RX_BKSV1 = board.ReadI2C(serAddr,0x81,1)
  RX_BKSV2 = board.ReadI2C(serAddr,0x82,1)
  RX_BKSV3 = board.ReadI2C(serAddr,0x83,1)
  RX_BKSV4 = board.ReadI2C(serAddr,0x84,1)
  RX_BCAPS = board.ReadI2C(serAddr,0xa0,1)
  board.WriteI2C(serAddr,0xc3,0x10) #Set KSV_VALID
board.WriteI2C(serAddr,0xc3,0x20) #Set KSV_LIST_VALID
  time.sleep(0.1)
  HDCP_STS = board.ReadI2C(serAddr,0xc4,1)
  if (HDCP_STS & 0x01) == 0x01:   #Check if HDCP is Authenticated
      print "HDCP Authenticated"
  else:
      print "HDCP Authentication Failed"
else:
  print "Error - No KSV received from DES or no RX_LOCK_DET present"

but customer told that HDCP STS register shows 0x00 even though enable HDCP feature on register 0xC3=0x01.

Is there any more register configuration for SerDes??

HDCP STS bit should be high no matter SOC behavior??

Could you pls kindly advise this??

Thank you.

  • Hey Harry,

    The script looks correct. We need to get reg dump during the failure mode and a reg dump for a good run. They might be having some lock/link issues, etc.

    Regards,
    Fadi A.

  • Hello Fadi,

    Thanks for your support.

    Here is dump register both SER and DES.

    They told me that return value always 0x00 even they write 0xC3 to 1 on 929 SER to enable HDCP.

    UH929 dump.txt
    0x0 -> 0x18
    0x1 -> 0x0
    0x2 -> 0x0
    0x3 -> 0xd2
    0x4 -> 0xb0
    0x5 -> 0x0
    0x6 -> 0x70
    0x7 -> 0x0
    0x8 -> 0x0
    0x9 -> 0x0
    0xa -> 0x0
    0xb -> 0x0
    0xc -> 0x5
    0xd -> 0x20
    0xe -> 0x0
    0xf -> 0x0
    0x10 -> 0x0
    0x11 -> 0x0
    0x12 -> 0x0
    0x13 -> 0x8c
    0x14 -> 0x0
    0x15 -> 0x1
    0x16 -> 0x2
    0x17 -> 0x1e
    0x18 -> 0x7f
    0x19 -> 0x7f
    0x1a -> 0x1
    0x1b -> 0x0
    0x1c -> 0xec
    0x1d -> 0x1
    0x1e -> 0x1
    0x1f -> 0x0
    0x20 -> 0xb
    0x21 -> 0x0
    0x22 -> 0x25
    0x23 -> 0x0
    0x24 -> 0x0
    0x25 -> 0x0
    0x26 -> 0x0
    0x27 -> 0x0
    0x28 -> 0x1
    0x29 -> 0x20
    0x2a -> 0x20
    0x2b -> 0xc0
    0x2c -> 0x0
    0x2d -> 0x0
    0x2e -> 0xa5
    0x2f -> 0x5a
    0x30 -> 0x0
    0x31 -> 0x0
    0x32 -> 0x0
    0x33 -> 0x0
    0x34 -> 0x0
    0x35 -> 0x0
    0x36 -> 0x0
    0x37 -> 0x0
    0x38 -> 0x0
    0x39 -> 0x0
    0x3a -> 0x0
    0x3b -> 0x0
    0x3c -> 0x0
    0x3d -> 0x0
    0x3e -> 0x0
    0x3f -> 0x0
    0x40 -> 0x14
    0x41 -> 0x5c
    0x42 -> 0x0
    0x43 -> 0x0
    0x44 -> 0x80
    0x45 -> 0x0
    0x46 -> 0x0
    0x47 -> 0x0
    0x48 -> 0x0
    0x49 -> 0x0
    0x4a -> 0x0
    0x4b -> 0x0
    0x4c -> 0x0
    0x4d -> 0x0
    0x4e -> 0x0
    0x4f -> 0x1
    0x50 -> 0x97
    0x51 -> 0xa1
    0x52 -> 0x1e
    0x53 -> 0x0
    0x54 -> 0x20
    0x55 -> 0xc
    0x56 -> 0x0
    0x57 -> 0x0
    0x58 -> 0x0
    0x59 -> 0x0
    0x5a -> 0xdd
    0x5b -> 0x0
    0x5c -> 0x2
    0x5d -> 0x6
    0x5e -> 0x44
    0x5f -> 0x4b
    0x60 -> 0x22
    0x61 -> 0x2
    0x62 -> 0x0
    0x63 -> 0x0
    0x64 -> 0x10
    0x65 -> 0x0
    0x66 -> 0x0
    0x67 -> 0x0
    0x68 -> 0x0
    0x69 -> 0x0
    0x6a -> 0x0
    0x6b -> 0x0
    0x6c -> 0x0
    0x6d -> 0x0
    0x6e -> 0x0
    0x6f -> 0x0
    0x70 -> 0x0
    0x71 -> 0x0
    0x72 -> 0x0
    0x73 -> 0x0
    0x74 -> 0x0
    0x75 -> 0x0
    0x76 -> 0x0
    0x77 -> 0x0
    0x78 -> 0x0
    0x79 -> 0x0
    0x7a -> 0x0
    0x7b -> 0x0
    0x7c -> 0x0
    0x7d -> 0x0
    0x7e -> 0x0
    0x7f -> 0x0
    0x80 -> 0x0
    0x81 -> 0x0
    0x82 -> 0x0
    0x83 -> 0x0
    0x84 -> 0x0
    0x85 -> 0x0
    0x86 -> 0x0
    0x87 -> 0x0
    0x88 -> 0x0
    0x89 -> 0x0
    0x8a -> 0x0
    0x8b -> 0x0
    0x8c -> 0x0
    0x8d -> 0x0
    0x8e -> 0x0
    0x8f -> 0x0
    0x90 -> 0x0
    0x91 -> 0x0
    0x92 -> 0x0
    0x93 -> 0x0
    0x94 -> 0x0
    0x95 -> 0x0
    0x96 -> 0x0
    0x97 -> 0x0
    0x98 -> 0x0
    0x99 -> 0x0
    0x9a -> 0x0
    0x9b -> 0x0
    0x9c -> 0x0
    0x9d -> 0x0
    0x9e -> 0x0
    0x9f -> 0x0
    0xa0 -> 0x0
    0xa1 -> 0x0
    0xa2 -> 0x0
    0xa3 -> 0x0
    0xa4 -> 0x0
    0xa5 -> 0x0
    0xa6 -> 0x0
    0xa7 -> 0x0
    0xa8 -> 0x0
    0xa9 -> 0x0
    0xaa -> 0x0
    0xab -> 0x0
    0xac -> 0x0
    0xad -> 0x0
    0xae -> 0x0
    0xaf -> 0x0
    0xb0 -> 0x0
    0xb1 -> 0x0
    0xb2 -> 0x0
    0xb3 -> 0x0
    0xb4 -> 0x0
    0xb5 -> 0x0
    0xb6 -> 0x0
    0xb7 -> 0x0
    0xb8 -> 0x0
    0xb9 -> 0x0
    0xba -> 0x0
    0xbb -> 0x0
    0xbc -> 0x0
    0xbd -> 0x0
    0xbe -> 0x0
    0xbf -> 0x0
    0xc0 -> 0x0
    0xc1 -> 0x0
    0xc2 -> 0x0
    0xc3 -> 0x0
    0xc4 -> 0x0
    0xc5 -> 0x0
    0xc6 -> 0x0
    0xc7 -> 0x0
    0xc8 -> 0x0
    0xc9 -> 0x0
    0xca -> 0x0
    0xcb -> 0x0
    0xcc -> 0x0
    0xcd -> 0x0
    0xce -> 0x0
    0xcf -> 0x0
    0xd0 -> 0x0
    0xd1 -> 0x0
    0xd2 -> 0x0
    0xd3 -> 0x0
    0xd4 -> 0x0
    0xd5 -> 0x0
    0xd6 -> 0x0
    0xd7 -> 0x0
    0xd8 -> 0x0
    0xd9 -> 0x0
    0xda -> 0x0
    0xdb -> 0x0
    0xdc -> 0x0
    0xdd -> 0x0
    0xde -> 0x0
    0xdf -> 0x0
    0xe0 -> 0x0
    0xe1 -> 0x0
    0xe2 -> 0x0
    0xe3 -> 0x0
    0xe4 -> 0x0
    0xe5 -> 0x0
    0xe6 -> 0x0
    0xe7 -> 0x0
    0xe8 -> 0x0
    0xe9 -> 0x0
    0xea -> 0x0
    0xeb -> 0x0
    0xec -> 0x0
    0xed -> 0x0
    0xef -> 0x0
    0xf0 -> 0x5f
    0xf1 -> 0x55
    0xf2 -> 0x48
    0xf3 -> 0x39
    0xf4 -> 0x32
    0xf5 -> 0x39
    0xf6 -> 0x0
    0xf7 -> 0x0
    0xf8 -> 0x0
    0xf9 -> 0x0
    0xfa -> 0x0
    0xfb -> 0x0
    0xfc -> 0x0
    0xfd -> 0x0
    0xfe -> 0x0
    0xff -> 0x0
    

    UH948 dump.txt
    0x0 -> 0x70
    0x1 -> 0x0
    0x2 -> 0x0
    0x3 -> 0xf8
    0x4 -> 0xfe
    0x5 -> 0x1e
    0x6 -> 0x0
    0x7 -> 0x18
    0x8 -> 0x0
    0x9 -> 0x0
    0xa -> 0x0
    0xb -> 0x0
    0xc -> 0x0
    0xd -> 0x0
    0xe -> 0x0
    0xf -> 0x0
    0x10 -> 0x0
    0x11 -> 0x0
    0x12 -> 0x0
    0x13 -> 0x0
    0x14 -> 0x0
    0x15 -> 0x0
    0x16 -> 0x0
    0x17 -> 0x0
    0x18 -> 0x0
    0x19 -> 0x1
    0x1a -> 0x0
    0x1b -> 0x0
    0x1c -> 0x2b
    0x1d -> 0x63
    0x1e -> 0x33
    0x1f -> 0x3
    0x20 -> 0x0
    0x21 -> 0x0
    0x22 -> 0x0
    0x23 -> 0x70
    0x24 -> 0x8
    0x25 -> 0x0
    0x26 -> 0x83
    0x27 -> 0x84
    0x28 -> 0x1
    0x29 -> 0x0
    0x2a -> 0x0
    0x2b -> 0x0
    0x2c -> 0x0
    0x2d -> 0x0
    0x2e -> 0x0
    0x2f -> 0x0
    0x30 -> 0x0
    0x31 -> 0x0
    0x32 -> 0x90
    0x33 -> 0x25
    0x34 -> 0x2
    0x35 -> 0x0
    0x36 -> 0x0
    0x37 -> 0xea
    0x38 -> 0x0
    0x39 -> 0x0
    0x3a -> 0x0
    0x3b -> 0x27
    0x3c -> 0x20
    0x3d -> 0x40
    0x3e -> 0x23
    0x3f -> 0x0
    0x40 -> 0x43
    0x41 -> 0x3
    0x42 -> 0x3
    0x43 -> 0x0
    0x44 -> 0x60
    0x45 -> 0x88
    0x46 -> 0x0
    0x47 -> 0x0
    0x48 -> 0xf
    0x49 -> 0x0
    0x4a -> 0x0
    0x4b -> 0x8
    0x4c -> 0x0
    0x4d -> 0x0
    0x4e -> 0x63
    0x4f -> 0x0
    0x50 -> 0x3
    0x51 -> 0x10
    0x52 -> 0x0
    0x53 -> 0x1
    0x54 -> 0x80
    0x55 -> 0x0
    0x56 -> 0x8
    0x57 -> 0x0
    0x58 -> 0x0
    0x59 -> 0x7f
    0x5a -> 0x20
    0x5b -> 0x20
    0x5c -> 0x18
    0x5d -> 0x0
    0x5e -> 0x0
    0x5f -> 0x0
    0x60 -> 0x0
    0x61 -> 0x0
    0x62 -> 0x0
    0x63 -> 0x0
    0x64 -> 0x10
    0x65 -> 0x0
    0x66 -> 0x0
    0x67 -> 0x0
    0x68 -> 0x0
    0x69 -> 0x0
    0x6a -> 0x0
    0x6b -> 0x0
    0x6c -> 0x14
    0x6d -> 0x0
    0x6e -> 0x1
    0x6f -> 0x0
    0x70 -> 0x0
    0x71 -> 0x0
    0x72 -> 0x0
    0x73 -> 0x7
    0x74 -> 0x7
    0x75 -> 0x8
    0x76 -> 0x0
    0x77 -> 0x0
    0x78 -> 0x0
    0x79 -> 0x0
    0x7a -> 0x0
    0x7b -> 0x5d
    0x7c -> 0x2
    0x7d -> 0x0
    0x7e -> 0x0
    0x7f -> 0x0
    0x80 -> 0x6
    0x81 -> 0x65
    0x82 -> 0xc0
    0x83 -> 0x27
    0x84 -> 0xff
    0x85 -> 0x0
    0x86 -> 0x0
    0x87 -> 0x0
    0x88 -> 0x0
    0x89 -> 0x0
    0x8a -> 0x0
    0x8b -> 0x0
    0x8c -> 0x0
    0x8d -> 0x0
    0x8e -> 0x0
    0x8f -> 0x0
    0x90 -> 0x0
    0x91 -> 0x0
    0x92 -> 0x0
    0x93 -> 0x0
    0x94 -> 0x0
    0x95 -> 0x0
    0x96 -> 0x0
    0x97 -> 0x0
    0x98 -> 0x0
    0x99 -> 0x0
    0x9a -> 0x0
    0x9b -> 0x0
    0x9c -> 0x0
    0x9d -> 0x0
    0x9e -> 0x0
    0x9f -> 0x0
    0xa0 -> 0x0
    0xa1 -> 0x0
    0xa2 -> 0x8c
    0xa3 -> 0x0
    0xa4 -> 0x0
    0xa5 -> 0x0
    0xa6 -> 0x0
    0xa7 -> 0x0
    0xa8 -> 0x0
    0xa9 -> 0x0
    0xaa -> 0x0
    0xab -> 0x0
    0xac -> 0x0
    0xad -> 0x0
    0xae -> 0x0
    0xaf -> 0x0
    0xb0 -> 0x0
    0xb1 -> 0x0
    0xb2 -> 0x0
    0xb3 -> 0x0
    0xb4 -> 0x0
    0xb5 -> 0x0
    0xb6 -> 0x0
    0xb7 -> 0x0
    0xb8 -> 0x0
    0xb9 -> 0x0
    0xba -> 0x0
    0xbb -> 0x0
    0xbc -> 0x0
    0xbd -> 0x0
    0xbe -> 0x0
    0xbf -> 0x0
    0xc0 -> 0x0
    0xc1 -> 0x0
    0xc2 -> 0x0
    0xc3 -> 0x0
    0xc4 -> 0x0
    0xc5 -> 0x0
    0xc6 -> 0x0
    0xc7 -> 0x0
    0xc8 -> 0xc0
    0xc9 -> 0x0
    0xca -> 0x0
    0xcb -> 0x0
    0xcc -> 0x0
    0xcd -> 0x0
    0xce -> 0x0
    0xcf -> 0x0
    0xd0 -> 0x0
    0xd1 -> 0x0
    0xd2 -> 0x0
    0xd3 -> 0x0
    0xd4 -> 0x0
    0xd5 -> 0x0
    0xd6 -> 0x0
    0xd7 -> 0x0
    0xd8 -> 0x0
    0xd9 -> 0x0
    0xda -> 0x0
    0xdb -> 0x0
    0xdc -> 0x0
    0xdd -> 0x0
    0xde -> 0x0
    0xdf -> 0x0
    0xe0 -> 0x0
    0xe1 -> 0x0
    0xe2 -> 0x0
    0xe3 -> 0x0
    0xe4 -> 0x0
    0xe5 -> 0x0
    0xe6 -> 0x0
    0xe7 -> 0x0
    0xe8 -> 0x0
    0xe9 -> 0x0
    0xea -> 0x0
    0xeb -> 0x0
    0xec -> 0x0
    0xed -> 0x0
    0xee -> 0x0
    0xef -> 0x0
    0xf0 -> 0x5f
    0xf1 -> 0x55
    0xf2 -> 0x48
    0xf3 -> 0x39
    0xf4 -> 0x34
    0xf5 -> 0x30
    0xf6 -> 0x0
    0xf7 -> 0x0
    0xf8 -> 0x0
    0xf9 -> 0x0
    0xfa -> 0x0
    0xfb -> 0x0
    0xfc -> 0x0
    0xfd -> 0x0
    0xfe -> 0x0
    0xff -> 0x0

    Thank you.

  • Hi Harry,

    I will review and get back to you tomorrow.

    Regards,
    Fadi A.

  • Hi Harry,

    Do you have reg dump for a good vs bad runs? Or does this system never authenticates successfully ?

     

    They told me that return value always 0x00 even they write 0xC3 to 1 on 929 SER to enable HDCP.

    So they can't even write successfully to register 0xC3? Are you sure they not accidently using UB929 ICs?

    Regards,
    Fadi A.

  • Hello Fadi,

    They always failed to write 0xC3 on 929. so we cannot compare between success case and failure case.

    Let me check if they are sure to use UH929 for sure. but dump register shows it is UH 929 in 0xF0~0xF5. you can see 0xF2 is 0x48 while UB is 0x42.

    Thank you.

  • Hi Harry,

    If they always fail this indicates that either Ser or Des is UB device. Have you checked SER and DES top marking?

    Regards,
    Fadi A.

  • Hello Fadi,

    I checked DES is UH940 but cannot check SER side because it has cover which cannot open. LG received this from Nissan.

    Host is located at DES side. So, HDCP should be enabled by MCU at DES side.

    HDCP register of SER can be enabled by DES??

    Can you try this at your lap??

    Thank you.

  • Hey Harry,

    Ignore my previous code. 

    I think I found a bug in the script but let me double check. 

    Let me double confirm this script works I will get back to you by tonight or tomorrow. 

    Regards,
    Fadi A.

  • Hey Harry,

    Please use below script. I tested it and it works. 

    import time
    
    serAddr = 0x18
    
    ## *********************************************
    ## Initialize HDCP1.4
    ## *********************************************
    board.WriteI2C(serAddr,0x2d,0x1) #Select Port 0
    
    board.WriteI2C(serAddr,0xC6,0xFF) #Enable Interrupts in HDCP_ICR
    board.WriteI2C(serAddr,0xC2, 0x92) #Enc_Always
    
    board.WriteI2C(serAddr,0xc3,0x1) #Enable HDCP
    time.sleep(0.1)
    HDCP_STS = board.ReadI2C(serAddr,0xc4,1)
    HDCP_STS= 0x22 #force value
    if (HDCP_STS & 0x22) == 0x22:   #Check if KSV is ready and RX_LOCK_DET is high
      board.WriteI2C(serAddr,0xc3,0x10) #Set KSV_VALID
      time.sleep(0.1)
      HDCP_STS = board.ReadI2C(serAddr,0xc4,1)
      if (HDCP_STS & 0x01) == 0x01:   #Check if HDCP is Authenticated
          print "HDCP Authenticated"
      else:
          print "HDCP Authentication Failed"
    else:
      print "Error - No KSV received from DES or no RX_LOCK_DET present"
    

    Regards,
    Fadi A.

  • Hello Fadi,

    Really appreciate your hard work.

    Can I have one quick question??

    Did you also try to test by Des side?? because HOST is at DES side in customer system.

    Thank you.

  • Hello Harry,

    The team is currently out of office due to the US public holiday and will return on 7/5, so responses will be delayed. Thank you for your patience at this time 

    Best Regards,

    Casey 

  • Hey Harry,

    HDCP is initiated from the Ser side. But can try to enable DES I2C passthrough (Reg 0x3 = 0xF8) run the same script I gave you. Let me know if you still see issue, I'll have it setup back on my bench. 

    Regards,
    Fadi A.

  • Hey Harry,

    I noticed a few mistakes on this script. This was a debug script for 98x so need to remove board.WriteI2C(serAddr,0x2d,0x1) #Select Port 0 , this is only applicable for 98x devices. For 94x devices the port select register is 0x1E which by default is set to port0 so you don't need to write anything. 

    Also there is a bypass HDCP_STS= 0x22 #force value that needs to be removed as well. 

    Here is the correct script. 

    import time
    
    serAddr = 0x18
    
    ## *********************************************
    ## Initialize HDCP1.4
    ## *********************************************
    board.WriteI2C(serAddr,0x1,0x2) # Reset UH949
    time.sleep(0.1)
    board.WriteI2C(serAddr,0xC6,0xFF) #Enable Interrupts in HDCP_ICR
    board.WriteI2C(serAddr,0xC2, 0x92) #Enc_Always
    board.WriteI2C(serAddr,0xc3,0x1) #Enable HDCP
    time.sleep(0.1)
    HDCP_STS = board.ReadI2C(serAddr,0xc4,1)
    if (HDCP_STS & 0x22) == 0x22:   #Check if KSV is ready and RX_LOCK_DET is high
      board.WriteI2C(serAddr,0xc3,0x10) #Set KSV_VALID
      time.sleep(0.1)
      HDCP_STS = board.ReadI2C(serAddr,0xc4,1)
      if (HDCP_STS & 0x01) == 0x01:   #Check if HDCP is Authenticated
          print "HDCP Authenticated"
      else:
          print "HDCP Authentication Failed"
    else:
      print "Error - No KSV received from DES or no RX_LOCK_DET present"

    Regards,
    Fadi A.

  • Hello Fadi

    Thank for your support.

    But My customer told that he still cannot write register on SER reg 0xC3 to1.

    Did you try this from DES side??

    Thank you.

  • Hi Harry,

    I send you the response over email.

    Regards,
    Fadi A.