1 /* |
1 /* |
2 * Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies). |
2 * Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). |
3 * All rights reserved. |
3 * All rights reserved. |
4 * This component and the accompanying materials are made available |
4 * This component and the accompanying materials are made available |
5 * under the terms of "Eclipse Public License v1.0" |
5 * under the terms of "Eclipse Public License v1.0" |
6 * which accompanies this distribution, and is available |
6 * which accompanies this distribution, and is available |
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
19 /** |
19 /** |
20 @file |
20 @file |
21 */ |
21 */ |
22 |
22 |
23 #include <e32svr.h> |
23 #include <e32svr.h> |
24 #include <usb/usblogger.h> |
|
25 #include "UsbSettings.h" |
24 #include "UsbSettings.h" |
26 #include "CUsbServer.h" |
25 #include "CUsbServer.h" |
27 #include "CUsbSession.h" |
26 #include "CUsbSession.h" |
28 #include "CUsbDevice.h" |
27 #include "CUsbDevice.h" |
29 |
28 |
30 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
29 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
31 #include <e32property.h> //Publish & Subscribe header |
|
32 #include "CUsbOtg.h" |
30 #include "CUsbOtg.h" |
33 #include "cusbhost.h" |
31 #include "cusbhost.h" |
|
32 #include <e32property.h> //Publish & Subscribe header |
34 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
33 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
35 |
34 |
|
35 #include <usb/usblogger.h> |
36 #include "UsbmanServerSecurityPolicy.h" |
36 #include "UsbmanServerSecurityPolicy.h" |
37 #include "OstTraceDefinitions.h" |
37 #include <usb/usblogger.h> |
38 #ifdef OST_TRACE_COMPILER_IN_USE |
38 |
39 #include "CUsbServerTraces.h" |
39 #ifdef __FLOG_ACTIVE |
40 #endif |
40 _LIT8(KLogComponent, "USBSVR"); |
41 |
41 #endif |
42 |
|
43 |
42 |
44 /** |
43 /** |
45 * The CUsbServer::NewL method |
44 * The CUsbServer::NewL method |
46 * |
45 * |
47 * Constructs a Usb Server |
46 * Constructs a Usb Server |
50 * |
49 * |
51 * @return A new Usb Server object |
50 * @return A new Usb Server object |
52 */ |
51 */ |
53 CUsbServer* CUsbServer::NewLC() |
52 CUsbServer* CUsbServer::NewLC() |
54 { |
53 { |
55 OstTraceFunctionEntry0( CUSBSERVER_NEWLC_ENTRY ); |
54 LOG_STATIC_FUNC_ENTRY |
56 |
55 |
57 CUsbServer* self = new(ELeave) CUsbServer; |
56 CUsbServer* self = new(ELeave) CUsbServer; |
58 CleanupStack::PushL(self); |
57 CleanupStack::PushL(self); |
59 self->StartL(KUsbServerName); |
58 self->StartL(KUsbServerName); |
60 self->ConstructL(); |
59 self->ConstructL(); |
61 OstTraceFunctionExit0( CUSBSERVER_NEWLC_EXIT ); |
|
62 return self; |
60 return self; |
63 } |
61 } |
64 |
62 |
65 |
63 |
66 /** |
64 /** |
70 * |
68 * |
71 * @internalComponent |
69 * @internalComponent |
72 */ |
70 */ |
73 CUsbServer::~CUsbServer() |
71 CUsbServer::~CUsbServer() |
74 { |
72 { |
75 OstTraceFunctionEntry0( CUSBSERVER_CUSBSERVER_DES_ENTRY ); |
73 LOG_FUNC |
76 |
74 |
77 delete iShutdownTimer; |
75 delete iShutdownTimer; |
78 delete iUsbDevice; |
76 delete iUsbDevice; |
79 |
77 |
80 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
78 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
81 delete iUsbHost; |
79 delete iUsbHost; |
82 |
80 |
83 #ifndef __OVER_DUMMYUSBDI__ |
81 #ifndef __OVER_DUMMYUSBDI__ |
84 // Check that this is A-Device |
82 // Check that this is A-Device |
85 OstTrace0( TRACE_NORMAL, CUSBSERVER_CUSBSERVER, "CUsbServer::~CUsbServer; Checking Id-Pin state..." ); |
83 LOGTEXT(_L8("Checking Id-Pin state...")); |
86 TInt value = 0; |
84 TInt value = 0; |
87 TInt err = RProperty::Get(KUidUsbManCategory, KUsbOtgIdPinPresentProperty,value); |
85 TInt err = RProperty::Get(KUidUsbManCategory, KUsbOtgIdPinPresentProperty,value); |
88 if (err == 0 && value == 1) |
86 if (err == 0 && value == 1) |
89 { |
87 { |
90 // Ensure VBus is dropped when Usb server exits |
88 // Ensure VBus is dropped when Usb server exits |
91 OstTrace0( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP1, "CUsbServer::~CUsbServer; Checking VBus state..." ); |
89 LOGTEXT(_L8("Checking VBus state...")); |
92 err = RProperty::Get(KUidUsbManCategory, KUsbOtgVBusPoweredProperty,value); |
90 err = RProperty::Get(KUidUsbManCategory, KUsbOtgVBusPoweredProperty,value); |
93 if ( err == KErrNone && value != 0 ) |
91 if ( err == KErrNone && value != 0 ) |
94 { |
92 { |
95 if ( iUsbOtg ) |
93 if ( iUsbOtg ) |
96 { |
94 { |
97 err = iUsbOtg->BusDrop(); |
95 err = iUsbOtg->BusDrop(); |
98 OstTrace1( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP2, "CUsbServer::~CUsbServer;BusDrop() returned err = %d", err ); |
96 LOGTEXT2(_L8("BusDrop() returned err = %d"),err); |
99 OstTrace0( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP3, "CUsbServer::~CUsbServer; USBMAN will wait until VBus is actually dropped" ); |
97 LOGTEXT(_L8("USBMAN will wait until VBus is actually dropped")); |
100 // Wait 1 second for Hub driver to perform VBus drop |
98 // Wait 1 second for Hub driver to perform VBus drop |
101 RTimer timer; |
99 RTimer timer; |
102 err = timer.CreateLocal(); |
100 err = timer.CreateLocal(); |
103 if ( err == KErrNone ) |
101 if ( err == KErrNone ) |
104 { |
102 { |
107 User::WaitForRequest(tstatus); |
105 User::WaitForRequest(tstatus); |
108 timer.Close(); |
106 timer.Close(); |
109 } |
107 } |
110 else |
108 else |
111 { |
109 { |
112 OstTrace1( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP4, "CUsbServer::~CUsbServer;Failed to create local timer: err = %d", err ); |
110 LOGTEXT2(_L8("Failed to create local timer: err = %d"),err); |
113 } |
111 } |
114 } |
112 } |
115 else |
113 else |
116 { |
114 { |
117 OstTrace0( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP5, "CUsbServer::~CUsbServer; Unexpected: OTG object is NULL" ); |
115 LOGTEXT(_L8("Unexpected: OTG object is NULL")); |
118 } |
116 } |
119 } |
117 } |
120 else |
118 else |
121 { |
119 { |
122 OstTraceExt2( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP6, "CUsbServer::~CUsbServer;VBus is already dropped or an error occured: err = %d, value =%d", err, value ); |
120 LOGTEXT3(_L8("VBus is already dropped or an error occured: err = %d, value =%d"),err,value); |
123 } |
121 } |
124 } |
122 } |
125 else |
123 else |
126 { |
124 { |
127 OstTraceExt2( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP7, "CUsbServer::~CUsbServer;No Id-Pin is found or an error occured: err = %d, value = %d", err, value ); |
125 LOGTEXT3(_L8("No Id-Pin is found or an error occured: err = %d, value = %d"), err, value); |
128 } |
126 } |
129 |
127 |
130 delete iUsbOtg; |
128 delete iUsbOtg; |
131 #endif |
129 #endif |
132 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
130 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
133 |
131 |
134 OstTraceFunctionExit0( CUSBSERVER_CUSBSERVER_DES_EXIT ); |
132 #ifdef __FLOG_ACTIVE |
|
133 CUsbLog::Close(); |
|
134 #endif |
135 } |
135 } |
136 |
136 |
137 |
137 |
138 /** |
138 /** |
139 * The CUsbServer::CUsbServer method |
139 * The CUsbServer::CUsbServer method |
154 * |
154 * |
155 * @internalComponent |
155 * @internalComponent |
156 */ |
156 */ |
157 void CUsbServer::ConstructL() |
157 void CUsbServer::ConstructL() |
158 { |
158 { |
159 |
159 #ifdef __FLOG_ACTIVE |
|
160 // Set the logger up so that everything in this thread that logs using it |
|
161 // will do so 'connectedly' (i.e. quickly). If this fails, we don't care- |
|
162 // logging will still work, just 'statically' (i.e. slowly). |
|
163 static_cast<void>(CUsbLog::Connect()); |
|
164 #endif |
160 |
165 |
161 iShutdownTimer = new(ELeave) CShutdownTimer; |
166 iShutdownTimer = new(ELeave) CShutdownTimer; |
162 iShutdownTimer->ConstructL(); |
167 iShutdownTimer->ConstructL(); |
163 |
168 |
164 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
169 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
167 iUsbOtg->StartL(); |
172 iUsbOtg->StartL(); |
168 #endif |
173 #endif |
169 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
174 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
170 |
175 |
171 iUsbDevice = CUsbDevice::NewL(*this); |
176 iUsbDevice = CUsbDevice::NewL(*this); |
172 OstTrace0( TRACE_NORMAL, CUSBSERVER_CONSTRUCTL, "CUsbServer::ConstructL; About to load USB classes" ); |
177 LOGTEXT(_L8("About to load USB classes")); |
173 iUsbDevice->EnumerateClassControllersL(); |
178 iUsbDevice->EnumerateClassControllersL(); |
174 |
179 |
175 #ifndef USE_DUMMY_CLASS_CONTROLLER |
180 #ifndef USE_DUMMY_CLASS_CONTROLLER |
176 iUsbDevice->ReadPersonalitiesL(); |
181 iUsbDevice->ReadPersonalitiesL(); |
177 if (iUsbDevice->isPersonalityCfged()) |
182 if (iUsbDevice->isPersonalityCfged()) |
181 #endif |
186 #endif |
182 iUsbDevice->SetDefaultPersonalityL(); |
187 iUsbDevice->SetDefaultPersonalityL(); |
183 } |
188 } |
184 else |
189 else |
185 { |
190 { |
186 OstTrace0( TRACE_NORMAL, CUSBSERVER_CONSTRUCTL_DUP1, "CUsbServer::ConstructL;Personalities unconfigured, so using fallback CCs" ); |
191 LOGTEXT(_L8("Personalities unconfigured, so using fallback CCs")); |
187 iUsbDevice->LoadFallbackClassControllersL(); |
192 iUsbDevice->LoadFallbackClassControllersL(); |
188 } |
193 } |
189 #else // USE_DUMMY_CLASS_CONTROLLER |
194 #else // USE_DUMMY_CLASS_CONTROLLER |
190 OstTrace0( TRACE_NORMAL, CUSBSERVER_CONSTRUCTL_DUP2, "CUsbServer::ConstructL; Using Dummy Class Controller, so using fallback CCs" ); |
195 LOGTEXT(_L8("Using Dummy Class Controller, so using fallback CCs")); |
191 iUsbDevice->LoadFallbackClassControllersL(); |
196 iUsbDevice->LoadFallbackClassControllersL(); |
192 #endif // USE_DUMMY_CLASS_CONTROLLER |
197 #endif // USE_DUMMY_CLASS_CONTROLLER |
193 |
198 |
194 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
199 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
195 iUsbHost = CUsbHost::NewL(); |
200 iUsbHost = CUsbHost::NewL(); |
197 //But it will cause the loading of personality longer. |
202 //But it will cause the loading of personality longer. |
198 //So it is moved back here. |
203 //So it is moved back here. |
199 iUsbHost->StartL(); |
204 iUsbHost->StartL(); |
200 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
205 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV |
201 |
206 |
202 OstTrace0( TRACE_NORMAL, CUSBSERVER_CONSTRUCTL_DUP3, "CUsbServer::ConstructL; CUsbServer constructed" ); |
207 LOGTEXT(_L8("CUsbServer constructed")); |
203 } |
208 } |
204 |
209 |
205 |
210 |
206 /** |
211 /** |
207 * The CUsbServer::NewSessionL method |
212 * The CUsbServer::NewSessionL method |
214 * |
219 * |
215 * @return A new USB session to be used for the client |
220 * @return A new USB session to be used for the client |
216 */ |
221 */ |
217 CSession2* CUsbServer::NewSessionL(const TVersion &aVersion, const RMessage2& aMessage) const |
222 CSession2* CUsbServer::NewSessionL(const TVersion &aVersion, const RMessage2& aMessage) const |
218 { |
223 { |
219 OstTraceFunctionEntry0( CUSBSERVER_NEWSESSIONL_ENTRY ); |
224 LOG_LINE |
|
225 LOG_FUNC |
220 |
226 |
221 (void)aMessage;//Remove compiler warning |
227 (void)aMessage;//Remove compiler warning |
222 |
228 |
223 TVersion v(KUsbSrvMajorVersionNumber,KUsbSrvMinorVersionNumber,KUsbSrvBuildVersionNumber); |
229 TVersion v(KUsbSrvMajorVersionNumber,KUsbSrvMinorVersionNumber,KUsbSrvBuildVersionNumber); |
224 |
230 |
225 OstTrace0( TRACE_NORMAL, CUSBSERVER_NEWSESSIONL, "CUsbServer::NewSessionL; CUsbServer::NewSessionL - creating new session..." ); |
231 LOGTEXT(_L8("CUsbServer::NewSessionL - creating new session...")); |
226 if (!User::QueryVersionSupported(v, aVersion)) |
232 if (!User::QueryVersionSupported(v, aVersion)) |
227 { |
233 { |
228 OstTrace1( TRACE_NORMAL, CUSBSERVER_NEWSESSIONL_DUP1, "CUsbServer::NewSessionL;leave reason=%d", KErrNotSupported ); |
234 LEAVEL(KErrNotSupported); |
229 User::Leave(KErrNotSupported); |
|
230 } |
235 } |
231 |
236 |
232 CUsbServer* ncThis = const_cast<CUsbServer*>(this); |
237 CUsbServer* ncThis = const_cast<CUsbServer*>(this); |
233 |
238 |
234 CUsbSession* sess = CUsbSession::NewL(ncThis); |
239 CUsbSession* sess = CUsbSession::NewL(ncThis); |
235 |
240 |
236 OstTraceFunctionExit0( CUSBSERVER_NEWSESSIONL_EXIT ); |
|
237 return sess; |
241 return sess; |
238 } |
242 } |
239 |
243 |
240 |
244 |
241 /** |
245 /** |
256 * |
260 * |
257 * @post the number of open sessions is incremented by one |
261 * @post the number of open sessions is incremented by one |
258 */ |
262 */ |
259 void CUsbServer::IncrementSessionCount() |
263 void CUsbServer::IncrementSessionCount() |
260 { |
264 { |
261 OstTraceFunctionEntry0( CUSBSERVER_INCREMENTSESSIONCOUNT_ENTRY ); |
265 LOGTEXT2(_L8(">CUsbServer::IncrementSessionCount %d"), iSessionCount); |
262 OstTrace1( TRACE_NORMAL, CUSBSERVER_INCREMENTSESSIONCOUNT, "CUsbServer::IncrementSessionCount;iSessionCount=%d", iSessionCount ); |
266 __ASSERT_DEBUG(iSessionCount >= 0, _USB_PANIC(KUsbSvrPncCat, EICSInvalidCount)); |
263 if(iSessionCount < 0) |
|
264 { |
|
265 OstTrace1( TRACE_FATAL, CUSBSERVER_INCREMENTSESSIONCOUNT_DUP1, "CUsbServer::IncrementSessionCount;panic code=%d", EICSInvalidCount ); |
|
266 __ASSERT_DEBUG(EFalse, User::Panic(KUsbSvrPncCat, EICSInvalidCount)); |
|
267 } |
|
268 |
267 |
269 ++iSessionCount; |
268 ++iSessionCount; |
270 iShutdownTimer->Cancel(); |
269 iShutdownTimer->Cancel(); |
271 |
270 |
272 OstTraceFunctionExit0( CUSBSERVER_INCREMENTSESSIONCOUNT_EXIT ); |
271 LOGTEXT(_L8("<CUsbServer::IncrementSessionCount")); |
273 } |
272 } |
274 |
273 |
275 /** |
274 /** |
276 * Decrement the open session count (iSessionCount) by one. |
275 * Decrement the open session count (iSessionCount) by one. |
277 * |
276 * |
278 * @post the number of open sessions is decremented by one |
277 * @post the number of open sessions is decremented by one |
279 */ |
278 */ |
280 void CUsbServer::DecrementSessionCount() |
279 void CUsbServer::DecrementSessionCount() |
281 { |
280 { |
282 OstTraceExt2( TRACE_NORMAL, CUSBSERVER_DECREMENTSESSIONCOUNT, "CUsbServer::DecrementSessionCount;iSessionCount=%d;Device().ServiceState()=%d", iSessionCount, Device().ServiceState() ); |
281 LOGTEXT3(_L8("CUsbServer::DecrementSessionCount %d, %d"), iSessionCount, Device().ServiceState()); |
283 if(iSessionCount <= 0) |
282 __ASSERT_DEBUG(iSessionCount > 0, _USB_PANIC(KUsbSvrPncCat, EDCSInvalidCount)); |
284 { |
|
285 OstTrace1( TRACE_FATAL, CUSBSERVER_DECREMENTSESSIONCOUNT_DUP1, "CUsbServer::DecrementSessionCount;panic code=%d", EDCSInvalidCount ); |
|
286 __ASSERT_DEBUG(EFalse, User::Panic(KUsbSvrPncCat, EDCSInvalidCount)); |
|
287 } |
|
288 |
283 |
289 --iSessionCount; |
284 --iSessionCount; |
290 |
285 |
291 if (iSessionCount == 0 && Device().ServiceState() == EUsbServiceIdle) |
286 if (iSessionCount == 0 && Device().ServiceState() == EUsbServiceIdle) |
292 { |
287 { |
303 * @pre the services have been stopped. |
298 * @pre the services have been stopped. |
304 * @see CUsbDevice::SetServiceStateIdle |
299 * @see CUsbDevice::SetServiceStateIdle |
305 */ |
300 */ |
306 void CUsbServer::LaunchShutdownTimerIfNoSessions() |
301 void CUsbServer::LaunchShutdownTimerIfNoSessions() |
307 { |
302 { |
308 OstTraceFunctionEntry0( CUSBSERVER_LAUNCHSHUTDOWNTIMERIFNOSESSIONS_ENTRY ); |
303 LOGTEXT(_L8("CUsbServer::LaunchShutdownTimerIfNoSessions")); |
309 #ifdef _DEBUG |
304 __ASSERT_DEBUG(Device().ServiceState() == EUsbServiceIdle, _USB_PANIC(KUsbSvrPncCat, ELSTNSNotIdle)); |
310 if(Device().ServiceState() != EUsbServiceIdle) |
305 |
311 { |
|
312 OstTrace1( TRACE_FATAL, CUSBSERVER_LAUNCHSHUTDOWNTIMERIFNOSESSIONS, "CUsbServer::LaunchShutdownTimerIfNoSessions;panic code=%d", ELSTNSNotIdle ); |
|
313 User::Panic(KUsbSvrPncCat, ELSTNSNotIdle); |
|
314 } |
|
315 #endif |
|
316 if (iSessionCount == 0) |
306 if (iSessionCount == 0) |
317 iShutdownTimer->After(KShutdownDelay); |
307 iShutdownTimer->After(KShutdownDelay); |
318 OstTraceFunctionExit0( CUSBSERVER_LAUNCHSHUTDOWNTIMERIFNOSESSIONS_EXIT ); |
|
319 } |
308 } |
320 |
309 |
321 /** |
310 /** |
322 * Initialize this shutdown timer as a normal-priority |
311 * Initialize this shutdown timer as a normal-priority |
323 * (EPriorityStandard) active object. |
312 * (EPriorityStandard) active object. |