Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1d3b720

Browse files
committed
2016-06-06 for NETMF 4.2.0 QFE2
VC++ 2013/.net framework 4.0.30319/MDK 4.54/GCC 4.6.2
1 parent 027a226 commit 1d3b720

File tree

277 files changed

+49627
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

277 files changed

+49627
-0
lines changed

CLR/Core/Execution.cpp

Lines changed: 3698 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 366 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,366 @@
1+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Portions Copyright (c) Secret Labs LLC.
4+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
5+
6+
#include "..\Core.h"
7+
8+
////////////////////////////////////////////////////////////////////////////////////////////////////
9+
10+
CLR_RT_DblLinkedList CLR_RT_HeapBlock_I2CXAction::m_i2cPorts; //FIX ME -change location
11+
12+
void CLR_RT_HeapBlock_I2CXAction::HandlerMethod_Initialize()
13+
{
14+
NATIVE_PROFILE_CLR_I2C();
15+
CLR_RT_HeapBlock_I2CXAction::m_i2cPorts.DblLinkedList_Initialize();
16+
}
17+
18+
void CLR_RT_HeapBlock_I2CXAction::HandlerMethod_RecoverFromGC()
19+
{
20+
NATIVE_PROFILE_CLR_I2C();
21+
TINYCLR_FOREACH_NODE(CLR_RT_HeapBlock_I2CXAction,i2cPort,CLR_RT_HeapBlock_I2CXAction::m_i2cPorts)
22+
{
23+
i2cPort->RecoverFromGC();
24+
}
25+
TINYCLR_FOREACH_NODE_END();
26+
}
27+
28+
void CLR_RT_HeapBlock_I2CXAction::HandlerMethod_CleanUp()
29+
{
30+
NATIVE_PROFILE_CLR_I2C();
31+
CLR_RT_HeapBlock_I2CXAction* i2cPort;
32+
33+
while(NULL != (i2cPort = (CLR_RT_HeapBlock_I2CXAction*)CLR_RT_HeapBlock_I2CXAction::m_i2cPorts.FirstValidNode()))
34+
{
35+
i2cPort->DetachAll();
36+
i2cPort->ReleaseWhenDeadEx();
37+
}
38+
}
39+
40+
HRESULT CLR_RT_HeapBlock_I2CXAction::CreateInstance( CLR_RT_HeapBlock& owner, CLR_RT_HeapBlock& xActionRef )
41+
{
42+
NATIVE_PROFILE_CLR_I2C();
43+
TINYCLR_HEADER();
44+
45+
CLR_RT_HeapBlock_I2CXAction* xAction = NULL;
46+
47+
xAction = EVENTCACHE_EXTRACT_NODE(g_CLR_RT_EventCache,CLR_RT_HeapBlock_I2CXAction,DATATYPE_I2C_XACTION); CHECK_ALLOCATION(xAction);
48+
49+
{
50+
CLR_RT_ProtectFromGC gc( *xAction );
51+
52+
xAction->Initialize();
53+
54+
xAction->m_HalXAction = NULL;
55+
xAction->m_HalXActionUnits = NULL;
56+
xAction->m_dataBuffers = NULL;
57+
xAction->m_xActionUnits = 0;
58+
59+
m_i2cPorts.LinkAtBack( xAction );
60+
61+
TINYCLR_CHECK_HRESULT(CLR_RT_ObjectToEvent_Source::CreateInstance( xAction, owner, xActionRef ));
62+
}
63+
64+
65+
66+
TINYCLR_CLEANUP();
67+
68+
if(FAILED(hr))
69+
{
70+
if(xAction) xAction->ReleaseWhenDeadEx();
71+
}
72+
73+
TINYCLR_CLEANUP_END();
74+
}
75+
76+
HRESULT CLR_RT_HeapBlock_I2CXAction::ExtractInstance( CLR_RT_HeapBlock& ref, CLR_RT_HeapBlock_I2CXAction*& xAction )
77+
{
78+
NATIVE_PROFILE_CLR_I2C();
79+
TINYCLR_HEADER();
80+
81+
CLR_RT_ObjectToEvent_Source* src = CLR_RT_ObjectToEvent_Source::ExtractInstance( ref ); FAULT_ON_NULL(src);
82+
83+
xAction = (CLR_RT_HeapBlock_I2CXAction*)src->m_eventPtr;
84+
85+
TINYCLR_NOCLEANUP();
86+
}
87+
88+
HRESULT CLR_RT_HeapBlock_I2CXAction::AllocateXAction( CLR_UINT32 numXActionUnits )
89+
{
90+
NATIVE_PROFILE_CLR_I2C();
91+
TINYCLR_HEADER();
92+
93+
CLR_UINT32 index;
94+
95+
if(IsPending())
96+
{
97+
TINYCLR_SET_AND_LEAVE(CLR_E_INVALID_OPERATION);
98+
}
99+
100+
m_xActionUnits = numXActionUnits;
101+
102+
// allocate memory for the transaction
103+
m_HalXAction = (I2C_HAL_XACTION*)CLR_RT_Memory::Allocate_And_Erase( sizeof(I2C_HAL_XACTION) ); CHECK_ALLOCATION(m_HalXAction);
104+
105+
((HAL_CONTINUATION*)m_HalXAction)->Initialize();
106+
107+
::I2C_XAction_SetState( m_HalXAction, I2C_HAL_XACTION::c_Status_Idle );
108+
109+
// initialize pointers to data buffers
110+
m_dataBuffers = (I2C_WORD**)CLR_RT_Memory::Allocate_And_Erase( sizeof(I2C_WORD*) * numXActionUnits ); CHECK_ALLOCATION(m_dataBuffers);
111+
112+
// allocate memory for the transaction units
113+
m_HalXActionUnits = (I2C_HAL_XACTION_UNIT**)CLR_RT_Memory::Allocate_And_Erase( sizeof(I2C_HAL_XACTION_UNIT*) * numXActionUnits ); CHECK_ALLOCATION(m_HalXActionUnits);
114+
115+
for(index = 0; index < numXActionUnits; ++index)
116+
{
117+
m_HalXActionUnits[ index ] = (I2C_HAL_XACTION_UNIT*)CLR_RT_Memory::Allocate_And_Erase( sizeof(I2C_HAL_XACTION_UNIT) ); CHECK_ALLOCATION(m_HalXActionUnits[ index ]);
118+
}
119+
120+
TINYCLR_CLEANUP();
121+
122+
if(FAILED(hr))
123+
{
124+
ReleaseBuffers();
125+
}
126+
127+
TINYCLR_CLEANUP_END();
128+
}
129+
130+
HRESULT CLR_RT_HeapBlock_I2CXAction::PrepareXAction( I2C_USER_CONFIGURATION& config, size_t numXActions )
131+
{
132+
NATIVE_PROFILE_CLR_I2C();
133+
TINYCLR_HEADER();
134+
135+
_ASSERTE(numXActions > 0);
136+
137+
if(IsPending())
138+
{
139+
TINYCLR_SET_AND_LEAVE(CLR_E_INVALID_OPERATION);
140+
}
141+
142+
if(m_HalXAction == NULL || m_HalXActionUnits == NULL)
143+
{
144+
TINYCLR_SET_AND_LEAVE(CLR_E_NULL_REFERENCE);
145+
}
146+
147+
I2C_InitializeTransaction(
148+
m_HalXAction,
149+
config,
150+
m_HalXActionUnits,
151+
numXActions
152+
);
153+
154+
TINYCLR_NOCLEANUP();
155+
}
156+
157+
#if defined(PLATFORM_ARM_Netduino) || defined(PLATFORM_ARM_NetduinoPlus) || defined(PLATFORM_ARM_NetduinoMini)
158+
HRESULT CLR_RT_HeapBlock_I2CXAction::PrepareXActionUnit( CLR_UINT8* src, size_t length, size_t unit, bool fRead, CLR_UINT8 internalAddressSize, CLR_UINT32 internalAddress )
159+
#else
160+
HRESULT CLR_RT_HeapBlock_I2CXAction::PrepareXActionUnit( CLR_UINT8* src, size_t length, size_t unit, bool fRead )
161+
#endif
162+
{
163+
NATIVE_PROFILE_CLR_I2C();
164+
TINYCLR_HEADER();
165+
166+
_ASSERTE(src != NULL);
167+
_ASSERTE(length > 0);
168+
169+
if(IsPending())
170+
{
171+
TINYCLR_SET_AND_LEAVE(CLR_E_INVALID_OPERATION);
172+
}
173+
174+
if(m_HalXActionUnits == NULL || m_dataBuffers == NULL)
175+
{
176+
TINYCLR_SET_AND_LEAVE(CLR_E_NULL_REFERENCE);
177+
}
178+
179+
if(unit > m_xActionUnits-1)
180+
{
181+
TINYCLR_SET_AND_LEAVE(CLR_E_INVALID_PARAMETER);
182+
}
183+
184+
m_dataBuffers[ unit ] = (I2C_WORD*)CLR_RT_Memory::Allocate_And_Erase( length * sizeof(I2C_WORD) ); CHECK_ALLOCATION(m_dataBuffers[ unit ]);
185+
186+
I2C_InitializeTransactionUnit(
187+
m_HalXActionUnits[ unit ],
188+
src,
189+
m_dataBuffers[ unit ],
190+
length,
191+
fRead ? TRUE : FALSE
192+
#if defined(PLATFORM_ARM_Netduino) || defined(PLATFORM_ARM_NetduinoPlus) || defined(PLATFORM_ARM_NetduinoMini)
193+
,
194+
internalAddressSize,
195+
internalAddress
196+
#endif
197+
);
198+
199+
TINYCLR_NOCLEANUP();
200+
}
201+
202+
void CLR_RT_HeapBlock_I2CXAction::CopyBuffer( CLR_UINT8* dst, size_t length, size_t unit )
203+
{
204+
NATIVE_PROFILE_CLR_I2C();
205+
ASSERT(unit<m_xActionUnits);
206+
207+
if(!m_HalXAction || !IsCompleted())
208+
{
209+
return;
210+
}
211+
212+
::I2C_XActionUnit_CopyBuffer( m_HalXActionUnits[ unit ], dst, length );
213+
}
214+
215+
void CLR_RT_HeapBlock_I2CXAction::ReleaseBuffers()
216+
{
217+
NATIVE_PROFILE_CLR_I2C();
218+
CLR_UINT32 index = 0;
219+
220+
if(m_HalXAction != NULL)
221+
{
222+
I2C_Cancel( m_HalXAction, false );
223+
224+
CLR_RT_Memory::Release( m_HalXAction ); m_HalXAction = NULL;
225+
}
226+
227+
if(m_dataBuffers != NULL)
228+
{
229+
for(index = 0; index < m_xActionUnits; ++index)
230+
{
231+
if(m_dataBuffers[ index ] != NULL)
232+
{
233+
CLR_RT_Memory::Release( m_dataBuffers[ index ] ); m_dataBuffers[ index ] = NULL;
234+
}
235+
}
236+
237+
CLR_RT_Memory::Release( m_dataBuffers ); m_dataBuffers = NULL;
238+
}
239+
240+
if(m_HalXActionUnits != NULL)
241+
{
242+
for(index = 0; index < m_xActionUnits; ++index)
243+
{
244+
if(m_HalXActionUnits[ index ] != NULL)
245+
{
246+
CLR_RT_Memory::Release( m_HalXActionUnits[ index ] ); m_HalXActionUnits[ index ] = NULL;
247+
}
248+
}
249+
250+
CLR_RT_Memory::Release( m_HalXActionUnits ); m_HalXActionUnits = NULL;
251+
}
252+
}
253+
254+
HRESULT CLR_RT_HeapBlock_I2CXAction::Enqueue()
255+
{
256+
NATIVE_PROFILE_CLR_I2C();
257+
TINYCLR_HEADER();
258+
259+
if(!m_HalXAction || IsPending())
260+
{
261+
TINYCLR_SET_AND_LEAVE(CLR_E_INVALID_OPERATION);
262+
}
263+
264+
if(!::I2C_Enqueue( m_HalXAction ))
265+
{
266+
TINYCLR_SET_AND_LEAVE(CLR_E_INVALID_OPERATION);
267+
}
268+
269+
TINYCLR_NOCLEANUP();
270+
}
271+
272+
void CLR_RT_HeapBlock_I2CXAction::Cancel( bool signal )
273+
{
274+
NATIVE_PROFILE_CLR_I2C();
275+
if(!m_HalXAction)
276+
{
277+
return;
278+
}
279+
280+
::I2C_Cancel( m_HalXAction, true );
281+
}
282+
283+
bool CLR_RT_HeapBlock_I2CXAction::IsPending()
284+
{
285+
NATIVE_PROFILE_CLR_I2C();
286+
if(!m_HalXAction)
287+
{
288+
return false;
289+
}
290+
291+
return ::I2C_XAction_CheckState( m_HalXAction, I2C_HAL_XACTION::c_Status_Scheduled | I2C_HAL_XACTION::c_Status_Processing ) == TRUE ? true : false;
292+
}
293+
294+
bool CLR_RT_HeapBlock_I2CXAction::IsTerminated()
295+
{
296+
NATIVE_PROFILE_CLR_I2C();
297+
if(!m_HalXAction)
298+
{
299+
return false;
300+
}
301+
302+
return ::I2C_XAction_CheckState( m_HalXAction, I2C_HAL_XACTION::c_Status_Completed | I2C_HAL_XACTION::c_Status_Aborted ) == TRUE ? true : false;
303+
}
304+
305+
bool CLR_RT_HeapBlock_I2CXAction::IsCompleted()
306+
{
307+
NATIVE_PROFILE_CLR_I2C();
308+
if(!m_HalXAction)
309+
{
310+
return false;
311+
}
312+
313+
return ::I2C_XAction_CheckState( m_HalXAction, I2C_HAL_XACTION::c_Status_Completed ) == TRUE ? true : false;
314+
}
315+
316+
bool CLR_RT_HeapBlock_I2CXAction::IsReadXActionUnit( size_t unit )
317+
{
318+
NATIVE_PROFILE_CLR_I2C();
319+
if(m_HalXActionUnits == NULL)
320+
{
321+
return false;
322+
}
323+
324+
return ::I2C_XActionUnit_IsRead( m_HalXActionUnits[ unit ] ) == FALSE ? false : true;
325+
326+
}
327+
328+
size_t CLR_RT_HeapBlock_I2CXAction::TransactedBytes()
329+
{
330+
NATIVE_PROFILE_CLR_I2C();
331+
if(!m_HalXAction || m_HalXAction->CheckState( I2C_HAL_XACTION::c_Status_Idle ))
332+
{
333+
return 0;
334+
}
335+
336+
return ::I2C_XAction_TransactedBytes( m_HalXAction );
337+
}
338+
339+
CLR_UINT8 CLR_RT_HeapBlock_I2CXAction::GetStatus()
340+
{
341+
NATIVE_PROFILE_CLR_I2C();
342+
if(!m_HalXAction)
343+
{
344+
return I2C_HAL_XACTION::c_Status_Idle;
345+
}
346+
347+
return ::I2C_XAction_GetState( m_HalXAction );
348+
}
349+
350+
void CLR_RT_HeapBlock_I2CXAction::RecoverFromGC()
351+
{
352+
NATIVE_PROFILE_CLR_I2C();
353+
CheckAll();
354+
355+
ReleaseWhenDeadEx();
356+
}
357+
358+
bool CLR_RT_HeapBlock_I2CXAction::ReleaseWhenDeadEx()
359+
{
360+
NATIVE_PROFILE_CLR_I2C();
361+
if(!IsReadyForRelease()) return false;
362+
363+
ReleaseBuffers();
364+
365+
return ReleaseWhenDead();
366+
}

0 commit comments

Comments
 (0)