usbdrv/peripheral/ldd/perildd/src/d_usbc.cpp
changeset 48 21625e5de155
parent 33 089413cdde3c
child 59 bbdce6bffaad
--- a/usbdrv/peripheral/ldd/perildd/src/d_usbc.cpp	Wed Aug 25 15:55:37 2010 +0800
+++ b/usbdrv/peripheral/ldd/perildd/src/d_usbc.cpp	Mon Sep 06 11:27:08 2010 +0800
@@ -127,6 +127,8 @@
                                   KUsbRequestCallbackPriority),
       iOtgFeatureChangePtr(NULL),
       iOtgFeatureCallbackInfo(this, DLddUsbcChannel::OtgFeatureChangeCallback, KUsbRequestCallbackPriority),
+      iChargerTypeChangePtr(NULL),
+      iChargerTypeCallbackInfo(this, DLddUsbcChannel::ChargerTypeChangeCallback, KUsbRequestCallbackPriority),
       iNumberOfEndpoints(0),
       iDeviceState(UsbShai::EUsbPeripheralStateUndefined),
       iOwnsDeviceControl(EFalse),
@@ -157,6 +159,7 @@
         iStatusCallbackInfo.Cancel();
         iEndpointStatusCallbackInfo.Cancel();
         iOtgFeatureCallbackInfo.Cancel();
+        iChargerTypeCallbackInfo.Cancel();
         iCompleteAllCallbackInfo.Cancel();
         AbortInterface();
         DestroyAllInterfaces();
@@ -170,7 +173,7 @@
         Kern::DestroyClientRequest(iStatusChangeReq);
         Kern::DestroyClientRequest(iEndpointStatusChangeReq);
         Kern::DestroyClientRequest(iOtgFeatureChangeReq);
-
+        Kern::DestroyClientRequest(iChargerTypeChangeReq);
         Kern::DestroyVirtualPinObject(iPinObj1);
         Kern::DestroyVirtualPinObject(iPinObj2);
         Kern::DestroyVirtualPinObject(iPinObj3);
@@ -231,29 +234,36 @@
     iStatusCallbackInfo.SetDfcQ(iDfcQ);                        // use the channel's dfcq for this dfc
     iEndpointStatusCallbackInfo.SetDfcQ(iDfcQ);                // use the channel's dfcq for this dfc
     iOtgFeatureCallbackInfo.SetDfcQ(iDfcQ);
-    iMsgQ.Receive();                                        //start up the message q
-    TInt r = iController->RegisterClientCallback(iCompleteAllCallbackInfo);
-    if (r != KErrNone)
-        return r;
-    r = iController->RegisterForStatusChange(iStatusCallbackInfo);
-    if (r != KErrNone)
-        return r;
-    r = iController->RegisterForEndpointStatusChange(iEndpointStatusCallbackInfo);
-    if (r != KErrNone)
-        return r;
-    r = iController->RegisterForOtgFeatureChange(iOtgFeatureCallbackInfo);
+    iChargerTypeCallbackInfo.SetDfcQ(iDfcQ);
+	iMsgQ.Receive();										//start up the message q
+	TInt r = iController->RegisterClientCallback(iCompleteAllCallbackInfo);
+	if (r != KErrNone)
+		return r;
+	r = iController->RegisterForStatusChange(iStatusCallbackInfo);
+	if (r != KErrNone)
+		return r;
+	r = iController->RegisterForEndpointStatusChange(iEndpointStatusCallbackInfo);
+	if (r != KErrNone)
+		return r;
+	r = iController->RegisterForOtgFeatureChange(iOtgFeatureCallbackInfo);
+	if (r != KErrNone)
+		return r;	
+    r = iController->RegisterChargingPortTypeNotify(iChargerTypeCallbackInfo);
     if (r != KErrNone)
-        return r;
-
-    r = Kern::CreateClientDataRequest(iStatusChangeReq);
+        return r;	
+	
+	r = Kern::CreateClientDataRequest(iStatusChangeReq);
+	if (r != KErrNone)
+		return r;
+	r = Kern::CreateClientDataRequest(iEndpointStatusChangeReq);
+	if (r != KErrNone)
+		return r;
+	r = Kern::CreateClientDataRequest(iOtgFeatureChangeReq);
+	if (r != KErrNone)
+		return r;
+    r = Kern::CreateClientDataRequest(iChargerTypeChangeReq);
     if (r != KErrNone)
-        return r;
-    r = Kern::CreateClientDataRequest(iEndpointStatusChangeReq);
-    if (r != KErrNone)
-        return r;
-    r = Kern::CreateClientDataRequest(iOtgFeatureChangeReq);
-    if (r != KErrNone)
-        return r;
+        return r;	
     
     Kern::CreateVirtualPinObject(iPinObj1);
     Kern::CreateVirtualPinObject(iPinObj2);
@@ -344,6 +354,11 @@
                 iOtgFeatureChangeReq->SetStatus(aStatus);
                 iOtgFeatureChangeReq->SetDestPtr(a1);
             break;
+            case RDevUsbcClient::ERequestChargingPortTypeNotify:
+                iChargerTypeChangeReq->Reset();
+                iChargerTypeChangeReq->SetStatus(aStatus);
+                iChargerTypeChangeReq->SetDestPtr(a1);
+            break;	
             case RDevUsbcClient::ERequestAlternateDeviceStatusNotify:
                 iStatusChangeReq->Reset();
                 iStatusChangeReq->SetStatus(aStatus);
@@ -477,6 +492,10 @@
                             iRequestStatus[aReqNo]=NULL;
                             Kern::QueueRequestComplete(iClient,iOtgFeatureChangeReq,r);
                         break;
+                        case RDevUsbcClient::ERequestChargingPortTypeNotify:
+                            iRequestStatus[aReqNo]=NULL;
+                            Kern::QueueRequestComplete(iClient,iChargerTypeChangeReq,r);
+                        break;
                         case RDevUsbcClient::ERequestAlternateDeviceStatusNotify:
                             iRequestStatus[aReqNo]=NULL;
                             Kern::QueueRequestComplete(iClient,iStatusChangeReq,r);
@@ -559,6 +578,24 @@
             r = KErrArgument;
         break;
         }
+    case RDevUsbcClient::ERequestChargingPortTypeNotify:
+        {
+        __KTRACE_OPT(KUSB, Kern::Printf("ERequestChargingPortTypeNotify"));
+        if (a1 != NULL)
+            {
+            iChargerTypeChangePtr = a1;         
+            aNeedsCompletion = iChargerTypeCallbackInfo.PendingNotify();
+            if(aNeedsCompletion)
+                {
+                iChargerTypeChangeReq->Data()= iChargerTypeCallbackInfo.ChargerType();
+                iChargerTypeChangePtr = NULL;
+                iChargerTypeCallbackInfo.SetPendingNotify(EFalse);
+                }
+            }
+        else
+            r = KErrArgument;
+        break;
+        }
     default:
         r = KErrNotSupported;
         }
@@ -839,6 +876,16 @@
             Kern::QueueRequestComplete(iClient, iOtgFeatureChangeReq, KErrCancel);
             }
         }
+    else if (aReqNo == RDevUsbcClient::ERequestChargingPortTypeNotify)
+        {
+        __KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestChargingPortTypeNotify: 0x%x", aReqNo));
+        CancelNotifyChargerType();
+        if (iChargerTypeChangeReq->IsReady())
+            {
+            iRequestStatus[aReqNo] = NULL;
+            Kern::QueueRequestComplete(iClient, iChargerTypeChangeReq, KErrCancel);
+            }
+        }
     else
         {
         __KTRACE_OPT(KUSB, Kern::Printf("DoCancel Unknown! 0x%x", aReqNo));
@@ -881,6 +928,18 @@
         }
     }
 
+void DLddUsbcChannel::CancelNotifyChargerType()
+    {
+    if (iChargerTypeChangePtr)
+        {
+        TUint chargerType;
+        chargerType = iChargerTypeCallbackInfo.ChargerType();
+        iChargerTypeChangeReq->Data()=chargerType;
+        iChargerTypeChangePtr = NULL;
+        iChargerTypeCallbackInfo.SetPendingNotify(EFalse);
+        }
+    }
+
 TInt DLddUsbcChannel::PinMemory(TDesC8 *aDes, TVirtualPinObject *aPinObj)
     {
     TInt r = KErrNone;
@@ -940,6 +999,7 @@
     case RDevUsbcClient::EControlSetOtgDescriptor:
     case RDevUsbcClient::EControlGetOtgDescriptor:
     case RDevUsbcClient::EControlGetOtgFeatures:
+    case RDevUsbcClient::EControlGetChargerDetectorCaps:
         r=PinMemory((TDesC8 *) a1, iPinObj1);
         if(r!=KErrNone)
             {
@@ -1070,6 +1130,7 @@
     case RDevUsbcClient::EControlSetOtgDescriptor:
     case RDevUsbcClient::EControlGetOtgDescriptor:
     case RDevUsbcClient::EControlGetOtgFeatures:
+    case RDevUsbcClient::EControlGetChargerDetectorCaps:		
         if(a1!=NULL)
             {
             Kern::UnpinVirtualMemory(iPinObj1);
@@ -1128,6 +1189,7 @@
     TUsbcIfcInfo ifcInfo;
     TCSDescriptorInfo desInfo;
     TUsbcEndpointResource epRes;
+	TUsbcChargerDetectorProperties chargingPro;	
     TInt bandwidthPriority;
 
     switch (aFunction)
@@ -1514,6 +1576,17 @@
             }
             
         break;
+		
+
+    case RDevUsbcClient::EControlGetChargerDetectorCaps:
+        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetChargerDetectorCaps"));
+		iController->ChargerDetectorCaps(chargingPro);          		
+        r = Kern::ThreadRawWrite(iClient, a1, &chargingPro, sizeof(chargingPro), iClient);
+        if (r != KErrNone)
+        	{
+            PanicClientThread(r);
+            }
+        break;		
 
     case RDevUsbcClient::EControlReleaseInterface:
         __KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseInterface"));
@@ -2246,6 +2319,32 @@
         }
     }
 
+void DLddUsbcChannel::ChargerTypeChangeCallback(TAny* aDLddUsbcChannel)
+    {
+    __KTRACE_OPT(KUSB, Kern::Printf("ChargerTypeChangeCallback"));
+    DLddUsbcChannel* dUsbc = (DLddUsbcChannel*) aDLddUsbcChannel;
+    if (dUsbc->iChannelClosing)
+        return;   
+    const TInt reqNo = (TInt) RDevUsbcClient::ERequestChargingPortTypeNotify;
+    if (dUsbc->iRequestStatus[reqNo])
+        {
+        __KTRACE_OPT(KUSB, Kern::Printf("ChargerTypeChangeCallback Notify status"));        
+        Kern::Printf("ChargerTypeChangeCallback Notify status");        
+        TUint chargerType;
+        chargerType = dUsbc->iChargerTypeCallbackInfo.ChargerType();
+        dUsbc->iChargerTypeChangeReq->Data()=chargerType;
+        dUsbc->iRequestStatus[reqNo] = NULL;
+        Kern::QueueRequestComplete(dUsbc->iClient,dUsbc->iChargerTypeChangeReq,KErrNone);
+        dUsbc->iChargerTypeChangePtr = NULL;
+        dUsbc->iChargerTypeCallbackInfo.SetPendingNotify(EFalse);
+        }    
+    else
+        {
+        Kern::Printf("ChargerTypeChangeCallback Set pending notify");
+        __KTRACE_OPT(KUSB, Kern::Printf("ChargerTypeChangeCallback Set pending notify"));
+        dUsbc->iChargerTypeCallbackInfo.SetPendingNotify(ETrue);
+        }
+    }
 
 TInt DLddUsbcChannel::SelectAlternateSetting(TUint aAlternateSetting)
     {
@@ -2660,6 +2759,25 @@
                     }
 
                 }
+	        else if (i == RDevUsbcClient::ERequestChargingPortTypeNotify)
+	                {
+	                    
+	                if (iChargerTypeChangePtr)
+	                    {
+				        TUint chargerType;
+				        chargerType = iChargerTypeCallbackInfo.ChargerType();
+				        iChargerTypeChangeReq->Data()=chargerType;
+						iChargerTypeChangePtr = NULL;
+	                    }
+	                    
+	                if (iChargerTypeChangeReq->IsReady())
+	                    {
+	                    iRequestStatus[i] = NULL;
+	                    Kern::QueueRequestComplete(iClient, iChargerTypeChangeReq,
+	                            KErrDisconnected);
+	                    }
+
+	                }			
             else
                 {
                 CompleteBufferRequest(iClient, i, KErrDisconnected);
@@ -2671,8 +2789,9 @@
     iStatusCallbackInfo.Cancel();
     iEndpointStatusCallbackInfo.Cancel();
     iOtgFeatureCallbackInfo.Cancel();
-    return KErrNone;
-    }
+    iChargerTypeCallbackInfo.Cancel();
+	return KErrNone;
+	}
 
 
 void DLddUsbcChannel::PanicClientThread(TInt aReason)