@@ -70,6 +70,7 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks {
70
70
private static final String NAME_H2W = "h2w" ;
71
71
private static final String NAME_USB_AUDIO = "usb_audio" ;
72
72
private static final String NAME_HDMI_AUDIO = "hdmi_audio" ;
73
+ private static final String NAME_DP_AUDIO = "soc:qcom,msm-ext-disp" ;
73
74
private static final String NAME_HDMI = "hdmi" ;
74
75
75
76
private static final int MSG_NEW_DEVICE_STATE = 1 ;
@@ -416,22 +417,86 @@ private List<UEventInfo> makeObservedUEventList() {
416
417
}
417
418
}
418
419
420
+ // Monitor DisplayPort
421
+ uei = new UEventInfo (NAME_DP_AUDIO , BIT_HDMI_AUDIO , 0 , 0 );
422
+ if (uei .checkSwitchExists ()) {
423
+ retVal .add (uei );
424
+ } else {
425
+ Slog .w (TAG , "This kernel does not have DP audio support" );
426
+ }
427
+
419
428
return retVal ;
420
429
}
421
430
422
431
@ Override
423
432
public void onUEvent (UEventObserver .UEvent event ) {
424
- if (LOG ) Slog .v (TAG , "Headset UEVENT: " + event .toString ());
433
+ String devPath = event .get ("DEVPATH" );
434
+ String name = event .get ("NAME" );
435
+ int state = 0 ;
436
+
437
+ if (name == null ) {
438
+ name = event .get ("SWITCH_NAME" );
439
+ }
425
440
426
441
try {
427
- String devPath = event .get ("DEVPATH" );
428
- String name = event .get ("SWITCH_NAME" );
429
- int state = Integer .parseInt (event .get ("SWITCH_STATE" ));
430
- synchronized (mLock ) {
431
- updateStateLocked (devPath , name , state );
442
+ if (name .equals (NAME_DP_AUDIO )) {
443
+ String stateStr = event .get ("STATE" );
444
+ int offset = 0 ;
445
+ int length = stateStr .length ();
446
+
447
+ // parse DP=1\nHDMI=1\0
448
+ while (offset < length ) {
449
+ int equals = stateStr .indexOf ('=' , offset );
450
+
451
+ if (equals > offset ) {
452
+ String intfName = stateStr .substring (offset , equals );
453
+
454
+ if (intfName .equals ("DP" )) {
455
+ state = Integer .parseInt (
456
+ stateStr .substring (equals + 1 , equals + 2 ));
457
+ break ;
458
+ }
459
+ }
460
+
461
+ offset = equals + 3 ;
462
+ }
463
+ } else {
464
+ state = Integer .parseInt (event .get ("SWITCH_STATE" ));
432
465
}
433
466
} catch (NumberFormatException e ) {
434
- Slog .e (TAG , "Could not parse switch state from event " + event );
467
+ Slog .i (TAG , "couldn't get state from event, checking node" );
468
+
469
+ for (int i = 0 ; i < mUEventInfo .size (); ++i ) {
470
+ UEventInfo uei = mUEventInfo .get (i );
471
+
472
+ if (name .equals (uei .getDevName ())) {
473
+ char [] buffer = new char [1024 ];
474
+ int len = 0 ;
475
+
476
+ try {
477
+ FileReader file = new FileReader (uei .getSwitchStatePath ());
478
+ len = file .read (buffer , 0 , 1024 );
479
+ file .close ();
480
+ } catch (FileNotFoundException e1 ) {
481
+ Slog .e (TAG , "file not found" );
482
+ break ;
483
+ } catch (Exception e11 ) {
484
+ Slog .e (TAG , "onUEvent exception" , e11 );
485
+ }
486
+
487
+ try {
488
+ state = Integer .parseInt ((new String (buffer , 0 , len )).trim ());
489
+ } catch (NumberFormatException e2 ) {
490
+ Slog .e (TAG , "could not convert to number" );
491
+ break ;
492
+ }
493
+ break ;
494
+ }
495
+ }
496
+ }
497
+
498
+ synchronized (mLock ) {
499
+ updateStateLocked (devPath , name , state );
435
500
}
436
501
}
437
502
@@ -450,23 +515,100 @@ private final class UEventInfo {
450
515
private final int mState1Bits ;
451
516
private final int mState2Bits ;
452
517
private final int mStateNbits ;
518
+ private int mDevIndex ;
519
+ private int mCableIndex ;
453
520
454
521
public UEventInfo (String devName , int state1Bits , int state2Bits , int stateNbits ) {
455
522
mDevName = devName ;
456
523
mState1Bits = state1Bits ;
457
524
mState2Bits = state2Bits ;
458
525
mStateNbits = stateNbits ;
526
+
527
+ if (mDevName .equals (NAME_DP_AUDIO )) {
528
+ getDevIndex ();
529
+ getCableIndex ();
530
+ }
531
+ }
532
+
533
+ private void getDevIndex () {
534
+ int index = 0 ;
535
+ char [] buffer = new char [1024 ];
536
+
537
+ while (true ) {
538
+ String devPath = String .format (Locale .US ,
539
+ "/sys/class/switch/extcon%d/name" ,
540
+ index );
541
+
542
+ try {
543
+ FileReader file = new FileReader (devPath );
544
+ int len = file .read (buffer , 0 , 1024 );
545
+ file .close ();
546
+
547
+ String devName = (new String (buffer , 0 , len )).trim ();
548
+ if (devName .equals (mDevName )) {
549
+ mDevIndex = index ;
550
+ break ;
551
+ } else {
552
+ index ++;
553
+ }
554
+ } catch (FileNotFoundException e ) {
555
+ break ;
556
+ } catch (Exception e ) {
557
+ Slog .e (TAG , "getDevIndex exception" , e );
558
+ break ;
559
+ }
560
+ }
561
+ }
562
+
563
+ private void getCableIndex () {
564
+ int index = 0 ;
565
+ char [] buffer = new char [1024 ];
566
+
567
+ while (true ) {
568
+ String cablePath = String .format (Locale .US ,
569
+ "/sys/class/switch/extcon%d/cable.%d/name" ,
570
+ mDevIndex , index );
571
+
572
+ try {
573
+ FileReader file = new FileReader (cablePath );
574
+ int len = file .read (buffer , 0 , 1024 );
575
+ file .close ();
576
+
577
+ String cableName = (new String (buffer , 0 , len )).trim ();
578
+ if (cableName .equals ("DP" )) {
579
+ mCableIndex = index ;
580
+ break ;
581
+ } else {
582
+ index ++;
583
+ }
584
+ } catch (FileNotFoundException e ) {
585
+ break ;
586
+ } catch (Exception e ) {
587
+ Slog .e (TAG , "getCableIndex exception" , e );
588
+ break ;
589
+ }
590
+ }
459
591
}
460
592
461
593
public String getDevName () {
462
594
return mDevName ;
463
595
}
464
596
465
597
public String getDevPath () {
598
+ if (mDevName .equals (NAME_DP_AUDIO )) {
599
+ return String .format (Locale .US ,
600
+ "/devices/platform/soc/%s/extcon/extcon%d" ,
601
+ mDevName , mDevIndex );
602
+ }
466
603
return String .format (Locale .US , "/devices/virtual/switch/%s" , mDevName );
467
604
}
468
605
469
606
public String getSwitchStatePath () {
607
+ if (mDevName .equals (NAME_DP_AUDIO )) {
608
+ return String .format (Locale .US ,
609
+ "/sys/class/switch/extcon%d/cable.%d/state" ,
610
+ mDevIndex , mCableIndex );
611
+ }
470
612
return String .format (Locale .US , "/sys/class/switch/%s/state" , mDevName );
471
613
}
472
614
0 commit comments