--- 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)