<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>HoppeRx - the cure for your ailing device : KITL</title><link>http://blogs.msdn.com/hopperx/archive/tags/KITL/default.aspx</link><description>Tags: KITL</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>MemoRx incorrectly displaying VM overlap in pre-release Windows Mobile versions</title><link>http://blogs.msdn.com/hopperx/archive/2008/01/11/memorx-incorrectly-displaying-vm-overlap-in-wm6-1.aspx</link><pubDate>Fri, 11 Jan 2008 03:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7064430</guid><dc:creator>shende</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/7064430.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=7064430</wfw:commentRss><description>Many OEM’s have already noticed that Memory Doctor doesn’t correctly represent VM overlap in some pre-release versions of Windows Mobile. There have been some changes in WM VM architecture that contradict an assumption made by MemoRx which results in...(&lt;a href="http://blogs.msdn.com/hopperx/archive/2008/01/11/memorx-incorrectly-displaying-vm-overlap-in-wm6-1.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7064430" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/Virtual+Memory/default.aspx">Virtual Memory</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL/default.aspx">KITL</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/VM/default.aspx">VM</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/WM6/default.aspx">WM6</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/hoppeRx/default.aspx">hoppeRx</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/memoRx/default.aspx">memoRx</category></item><item><title>Passive KITL to the rescue</title><link>http://blogs.msdn.com/hopperx/archive/2007/11/02/passive-kitl-to-the-rescue.aspx</link><pubDate>Fri, 02 Nov 2007 18:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5838922</guid><dc:creator>deanmel</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/5838922.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=5838922</wfw:commentRss><description>I'm sure many of you have been in a situation where your device hangs during field testing. Or sometimes you are trying to track down a problem which only repros at a certain location. The best thing you can have in these situations is, of course, a live...(&lt;a href="http://blogs.msdn.com/hopperx/archive/2007/11/02/passive-kitl-to-the-rescue.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5838922" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL/default.aspx">KITL</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/WM6/default.aspx">WM6</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/jetstream/default.aspx">jetstream</category></item><item><title>Debugging Suspend/Resume Issues</title><link>http://blogs.msdn.com/hopperx/archive/2007/06/11/debugging-suspend-resume-issues.aspx</link><pubDate>Mon, 11 Jun 2007 03:04:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3215836</guid><dc:creator>JeCahill</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/3215836.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=3215836</wfw:commentRss><description>&amp;nbsp; 
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;The blog "Snow White's Poison Apple" describes how to test the most common suspend/resume hang.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Other suspend/resume issues can be debugged over a "Passive KITL" connection.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;A standard KITL connection (a.k.a. "Active KITL") gets dropped when a device suspends, however, Passive KITL doesn't suffer from this problem.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;To enable passive KITL on a device, build a KITL image but change OEMInit() so it calls KitlInit(FALSE).&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The FALSE parameter will tell the kernel to initialize the KITL structures without initializing the hardware.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Since the hardware isn't initialized, KITL won't be affected when the suspend path powers off the hardware.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Check out the CE6.0 documentation for more information about implementing KITL and enabling active or passive KITL.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Once passive KITL is enabled, a trigger is needed to activate KITL and break into the debugger when an issue occurs.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The best way to do this is to modify the keyboard driver so that it calls DebugBreak() when a specific key is pressed.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;With the device configured and the trigger in place, a tester can suspend/resume the device repeatedly until the device hangs, then press the specific button and connect to the device in Platform Builder.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;From this point on, the hang can be debugged using Platform Builder’s debugging tool’s just like any other system hang.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3215836" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL/default.aspx">KITL</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL+Timeout/default.aspx">KITL Timeout</category></item><item><title>Map File Breakpoints</title><link>http://blogs.msdn.com/hopperx/archive/2007/02/14/map-file-breakpoints.aspx</link><pubDate>Wed, 14 Feb 2007 17:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1676674</guid><dc:creator>shende</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/1676674.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=1676674</wfw:commentRss><description>&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;While debugging, I am often faced with trying to set breakpoints in module code that I do not control. Said modules rarely have current symbols and access to source files either not possible or practical. I usually face these issues armed only with a call stack and a [possibly ancient] map file in which to determine the root cause of the error. I like to convince myself that single-stepping through code would be too easy and debugging ASM to find the problem makes things more interesting. Sometimes it works.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;To get started, you need to guess where it is you would like to go – if you have a call stack, this is the function name at the top of the list. First try to set this breakpoint in the breakpoint window using the following format:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE class=Section1&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;{,,ModuleName.dll} FunctionName&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;Please note that the FunctionName &lt;B&gt;&lt;I&gt;&lt;SPAN style="FONT-WEIGHT: bold; FONT-STYLE: italic"&gt;is&lt;/SPAN&gt;&lt;/I&gt;&lt;/B&gt; case sensitive, but the ModuleName is not. If you run through your repro and the debugger did not break, we need to dig a little deeper and make sure we are actually using the correct module name. First, load the Platform Builder “Modules” window (View-&amp;gt;Debug-&amp;gt;Modules) and look for the module name in the list – remember that during makeimg, modules will often be renamed as they are added to the ROM. If you are certain of the module name, lets find the “base” of this module by breaking at DllMain (or WinMain for EXE’s).&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE class=Section1&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;{,,ModuleName.DLL} DllMain&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;Or&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE class=Section1&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;{,,ModuleName.EXE} WinMain&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;DllMain is often a convenient breakpoint since it is called often, not just on load/unload. Once we are stopped at DllMain, the ease of finding other breakpoints within this module will depend on how old your map file is. If the module has undergone significant changes, the below may not work, but in my experience map files are usually “close enough” to get what you need. Open the map file and find the function you are trying to break at:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;
&lt;DIV class=Section1 style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; WORD-BREAK: keep-all; POSITION: relative; BACKGROUND-COLOR: #cccccc" ;&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: 'Courier New'"&gt;...&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;0001:0002fab4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?ParseGetCallerIdSettings@@YAJPBDAAPAXAAI@Z"&gt;?ParseGetCallerIdSettings@@YAJPBDAAPAXAAI@Z&lt;/A&gt; 10030ab4 f&amp;nbsp;&amp;nbsp; supsvc.obj&lt;BR&gt;&amp;nbsp;0001:0002fdd4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?ParseGetHideIdSettings@@YAJPBDAAPAXAAI@Z"&gt;?ParseGetHideIdSettings@@YAJPBDAAPAXAAI@Z&lt;/A&gt; 10030dd4 f&amp;nbsp;&amp;nbsp; supsvc.obj&lt;BR&gt;&amp;nbsp;0001:00030138&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?ParseGetDialedIdSettings@@YAJPBDAAPAXAAI@Z"&gt;?ParseGetDialedIdSettings@@YAJPBDAAPAXAAI@Z&lt;/A&gt; 10031138 f&amp;nbsp;&amp;nbsp; supsvc.obj&lt;BR&gt;&amp;nbsp;0001:000303f8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?ParseGetClosedGroupSettings@@YAJPBDAAPAXAAI@Z"&gt;?ParseGetClosedGroupSettings@@YAJPBDAAPAXAAI@Z&lt;/A&gt; 100313f8 f&amp;nbsp;&amp;nbsp; supsvc.obj&lt;BR&gt;&amp;nbsp;0001:00030810&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?ParseGetCallForwardingSettings@@YAJPBDAAPAXAAI@Z"&gt;?ParseGetCallForwardingSettings@@YAJPBDAAPAXAAI@Z&lt;/A&gt; 10031820&amp;nbsp;&amp;lt;&amp;lt; HERE HERE HERE&lt;BR&gt;&amp;nbsp;0001:00031338&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?ParseGetCallWaitingSettings@@YAJPBDAAPAXAAI@Z"&gt;?ParseGetCallWaitingSettings@@YAJPBDAAPAXAAI@Z&lt;/A&gt; 10032338 f&amp;nbsp;&amp;nbsp; supsvc.obj&lt;BR&gt;&amp;nbsp;0001:00031920&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?BSCompareChars@@YAHPBX0@Z"&gt;?BSCompareChars@@YAHPBX0@Z&lt;/A&gt; 10032920 f&amp;nbsp;&amp;nbsp; util.obj&lt;BR&gt;&amp;nbsp;0001:00033018&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?ParseGetAudioGain@@YAJPBDAAPAXAAI@Z"&gt;?ParseGetAudioGain@@YAJPBDAAPAXAAI@Z&lt;/A&gt; 10034018 f&amp;nbsp;&amp;nbsp; voice.obj&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: 'Courier New'"&gt;...&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P class=MsoNormal style="MARGIN-LEFT: 0.5in"&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=Section1&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;The function I want to stop at is the RIL component ParseGetCallForwardingSettings() and is located at: &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; BACKGROUND: aqua; FONT-FAMILY: 'Courier New'"&gt;10031820&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;. &lt;/SPAN&gt;&lt;/FONT&gt;This number is not an address, but rather an offset that we can use to calculate how much code lies between this function and DllMain. Looking at the same map file, locate DllMain: &lt;/DIV&gt;
&lt;DIV class=Section1&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=Section1&gt;
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; WORD-BREAK: keep-all; POSITION: relative; BACKGROUND-COLOR: #cccccc" ;&gt;&amp;nbsp; 
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'" mce_keep="true"&gt;…&lt;BR&gt;&amp;nbsp;0001:00029914&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?StartReadyStateQuery@CRilHandle@@QAAXXZ"&gt;?StartReadyStateQuery@CRilHandle@@QAAXXZ&lt;/A&gt; 1002a914 f&amp;nbsp;&amp;nbsp; rilhand.obj&lt;BR&gt;&amp;nbsp;0001:00029960&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?Register@CRilEventLog@@QAAJXZ"&gt;?Register@CRilEventLog@@QAAJXZ&lt;/A&gt; 1002a960 f i rilmain.obj&lt;BR&gt;&amp;nbsp;0001:000299c0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DllMain&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1002a9c0 f&amp;nbsp;&amp;nbsp; rilmain.obj&lt;BR&gt;&amp;nbsp;0001:00029a10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?RIL_Deinit@@YAHK@Z"&gt;?RIL_Deinit@@YAHK@Z&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1002aa10 f&amp;nbsp;&amp;nbsp; rilmain.obj&lt;BR&gt;&amp;nbsp;0001:00029aec&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?RIL_Read@@YAKKPAXK@Z"&gt;?RIL_Read@@YAKKPAXK@Z&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1002aaec f&amp;nbsp;&amp;nbsp; rilmain.obj&lt;BR&gt;&amp;nbsp;0001:00029af4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="mailto:?RIL_Write@@YAKKPBXK@Z"&gt;?RIL_Write@@YAKKPBXK@Z&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1002aaf4 f&amp;nbsp;&amp;nbsp; rilmain.obj&lt;BR&gt;…&lt;BR&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;Using calculator, find the amount of code that exists between these two functions. In this case, my function is later in the map file than DllMain so I Subtract:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-LEFT: 0.5in"&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; BACKGROUND: aqua; FONT-FAMILY: 'Courier New'"&gt;10031820&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt; - &lt;SPAN style="BACKGROUND: yellow"&gt;1002a9c0&lt;/SPAN&gt; = 0x6E60&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;To get the code offset between these two functions. Going back to the debugger, locate the instruction address of DllMain and drag this into a watch window.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=Section1&gt;
&lt;TABLE class=MsoTableGrid style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 border=0 class="MsoTableGrid"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; WIDTH: 351pt; PADDING-TOP: 0in" vAlign=top width=468&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;IMG src="http://img.villagephotos.com/p/2005-7/1041592/watch1.jpg" mce_src="http://img.villagephotos.com/p/2005-7/1041592/watch1.jpg"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; WIDTH: 351pt; PADDING-TOP: 0in" vAlign=top width=468&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; WORD-BREAK: keep-all; POSITION: relative; BACKGROUND-COLOR: #cccccc" ;&gt;&amp;nbsp; 
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'" mce_keep="true"&gt;…&lt;BR&gt;0102A9B8&amp;nbsp;&amp;nbsp;&amp;nbsp; bx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lr&lt;BR&gt;0102A9BC&amp;nbsp;&amp;nbsp;&amp;nbsp; andhi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r4, r0, r5&lt;BR&gt;DllMain:&lt;BR&gt;0102A9C0&amp;nbsp;&amp;nbsp;&amp;nbsp; stmdb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sp!, {r4, lr}&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&amp;lt;&amp;lt; HERE&lt;BR&gt;$M46300:&lt;BR&gt;0102A9C4&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r1, #1&lt;BR&gt;0102A9C8&amp;nbsp;&amp;nbsp;&amp;nbsp; bne&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |$M46300+18h (0102a9dc)|&lt;BR&gt;0102A9CC&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r0, [pc, #0x38]&lt;BR&gt;0102A9D0&amp;nbsp;&amp;nbsp;&amp;nbsp; bl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |CRilEventLog::Register (0102a960)|&lt;BR&gt;…&lt;/P&gt;&lt;/DIV&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; WIDTH: 351pt; PADDING-TOP: 0in" vAlign=top width=468&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; WIDTH: 351pt; PADDING-TOP: 0in" vAlign=top width=468&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;Next, use the watch window to help your function by adding your offset value to the instruction address of DllMain. Note: if your function was less than DllMain, you would actually subtract:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=Section1&gt;
&lt;TABLE class=MsoTableGrid style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 border=0 class="MsoTableGrid"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; WIDTH: 351pt; PADDING-TOP: 0in" vAlign=top width=468&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-language: EN-US"&gt;&lt;?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /&gt;&lt;v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"&gt;&amp;nbsp;&lt;IMG src="http://img.villagephotos.com/p/2005-7/1041592/watch2.jpg" mce_src="http://img.villagephotos.com/p/2005-7/1041592/watch2.jpg"&gt;&lt;v:stroke joinstyle="miter"&gt;&lt;/v:stroke&gt;&lt;v:formulas&gt;&lt;v:f eqn="if lineDrawn pixelLineWidth 0"&gt;&lt;/v:f&gt;&lt;v:f eqn="sum @0 1 0"&gt;&lt;/v:f&gt;&lt;v:f eqn="sum 0 0 @1"&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @2 1 2"&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @3 21600 pixelWidth"&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @3 21600 pixelHeight"&gt;&lt;/v:f&gt;&lt;v:f eqn="sum @0 0 1"&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @6 1 2"&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @7 21600 pixelWidth"&gt;&lt;/v:f&gt;&lt;v:f eqn="sum @8 21600 0"&gt;&lt;/v:f&gt;&lt;v:f eqn="prod @7 21600 pixelHeight"&gt;&lt;/v:f&gt;&lt;v:f eqn="sum @10 21600 0"&gt;&lt;/v:f&gt;&lt;/v:formulas&gt;&lt;v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"&gt;&lt;/v:path&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:lock aspectratio="t" v:ext="edit"&gt;&lt;/o:lock&gt;&lt;/v:shapetype&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;Click and drag this resulting value back to the ASM window to find code close to your function. Looking at the ASM, you will see that we are very close to the top of a function and should set a breakpoint here. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;Hint: Look for &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;stmdb&lt;/SPAN&gt;&lt;/FONT&gt; instructions and SP register manipulation to show you the beginning and end of functions.&lt;/P&gt;
&lt;P class=MsoNormal mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; WIDTH: 351pt; PADDING-TOP: 0in" vAlign=top width=468&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; WORD-BREAK: keep-all; POSITION: relative; BACKGROUND-COLOR: #cccccc" ;&gt;... 
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'" mce_keep="true"&gt;010317EC&amp;nbsp;&amp;nbsp;&amp;nbsp; ldmia&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sp!, {r4 - r8, lr}&lt;BR&gt;010317F0&amp;nbsp;&amp;nbsp;&amp;nbsp; bx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lr&lt;BR&gt;010317F4&amp;nbsp;&amp;nbsp;&amp;nbsp; andhi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r4, r0, r5&lt;BR&gt;010317F8&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&lt;BR&gt;010317FC&amp;nbsp;&amp;nbsp;&amp;nbsp; smlabbeq&amp;nbsp;&amp;nbsp;&amp;nbsp; r0, r12, r3, r2&lt;BR&gt;01031800&amp;nbsp;&amp;nbsp;&amp;nbsp; ldreqd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r8, [r0, -r12]&lt;BR&gt;01031804&amp;nbsp;&amp;nbsp;&amp;nbsp; smlatteq&amp;nbsp;&amp;nbsp;&amp;nbsp; r0, r12, r2, r8&lt;BR&gt;01031808&amp;nbsp;&amp;nbsp;&amp;nbsp; andhi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r0, r7, r7, asr r0&lt;BR&gt;0103180C&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&lt;BR&gt;01031810&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r12, sp&amp;nbsp; &amp;lt;&amp;lt; Func begins here&lt;BR&gt;01031814&amp;nbsp;&amp;nbsp;&amp;nbsp; stmdb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sp!, {r0 - r3}&lt;BR&gt;01031818&amp;nbsp;&amp;nbsp;&amp;nbsp; stmdb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sp!, {r4 - r12, lr}&lt;BR&gt;0103181C&amp;nbsp;&amp;nbsp;&amp;nbsp; sub&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sp, sp, #0x86, 30&lt;BR&gt;01031820&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r7, r2&amp;nbsp;&amp;nbsp; &amp;lt;&amp;lt; HERE&lt;BR&gt;01031824&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r8, r1&lt;BR&gt;01031828&amp;nbsp;&amp;nbsp;&amp;nbsp; str&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r0, [sp, #0x240]&lt;BR&gt;0103182C&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [pc, #0x3C4]&lt;BR&gt;01031830&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [r3]&lt;BR&gt;01031834&amp;nbsp;&amp;nbsp;&amp;nbsp; str&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [sp, #0x214]&lt;BR&gt;01031838&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r1, #0&lt;BR&gt;0103183C&amp;nbsp;&amp;nbsp;&amp;nbsp; str&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r1, [r8]&lt;BR&gt;01031840&amp;nbsp;&amp;nbsp;&amp;nbsp; str&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r1, [r7]&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'" mce_keep="true"&gt;...&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;B&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; WIDTH: 351pt; PADDING-TOP: 0in" vAlign=top width=468&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; WIDTH: 351pt; PADDING-TOP: 0in" vAlign=top width=468&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=1&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;The specific case above puts us very close to the top of a function – but is it the function we are looking for? It is hard to say without setting breakpoints and continuing to see if we stop. Don’t be shy about scrolling through the ASM looking for other functions nearby and setting multiply breakpoints (they are free!) on those as well. Function prologs have a certain “look” about them and your eye will train to identify them quickly. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Verdana size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt"&gt;The above steps will not work under all conditions and significant module changes can render older map files useless. But, as the device matures and code churn is reduced – I have found this method very useful. Good Luck!&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1676674" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL/default.aspx">KITL</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/Platform+Builder/default.aspx">Platform Builder</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/breakpoints/default.aspx">breakpoints</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/mapfile/default.aspx">mapfile</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/shende/default.aspx">shende</category></item><item><title>KITL timeouts with USB Serial Part 2</title><link>http://blogs.msdn.com/hopperx/archive/2007/01/14/kitl-timeouts-with-usb-serial-part-2.aspx</link><pubDate>Sun, 14 Jan 2007 08:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1464267</guid><dc:creator>deanmel</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/1464267.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=1464267</wfw:commentRss><description>&amp;nbsp; 
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;In the&lt;SPAN style="FONT-WEIGHT: bold"&gt; &lt;A class="" title="first part" href="http://blogs.msdn.com/hopperx/archive/2006/12/23/kitl-timeouts-with-usb-serial.aspx" mce_href="http://blogs.msdn.com/hopperx/archive/2006/12/23/kitl-timeouts-with-usb-serial.aspx"&gt;first part&lt;/A&gt;&lt;/SPAN&gt; we talked briefly about KITL timeouts. In this article we are going to give you a little bit more details and try to explain why it behaves the way it does.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;How did we run into this issue?&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;It all started with Hopper (apparently Hopper is also good at finding KITL problems as well as all the other problems it usually finds :-). When we ran Hopper on one of the devices, it would behave in a very strange way.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Sometimes it would start spewing a lot of data into the debug output and stop completely, the other times it would keep going, sometimes it would stop for 20 minutes and then continue like nothing happened.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;And when debug output stopped we could still type in Shell window and get the response back from the Shell commands. Most of the time, however, we would see a small hick up (sometimes less then a second) and debugging would continue after that. As you see it was completely random. Obviously if the only thing we saw were hick ups we would have never even noticed the problem.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Everyone knows how frustrating these ambiguous bugs could be when you don't have a consistent repro.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;We got lucky because we saw that it would happen when Hopper tried to print out a 27 character string. &lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Why 27 characters? As it was mentioned in the previous post the way USB Serial KITL indicates the end of the transmission is by sending a partial packet (less then max packet size).&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;However, if the data sent over the wire happens to be a multiple of max packet size then a zero length packet needs to be sent to indicate the end of the transmission. The default packet size that most manufactures use right now is 64 bytes. When you send 27 character text you will get exactly 64 bytes. Let's look at the debug message packet to see why it is 27 character string. Here is how the Debug Message packet looks when sent over the USB Serial:&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;&lt;IMG style="WIDTH: 685px; HEIGHT: 133px" height=133 src="http://blogs.msdn.com/photos/deanmel/images/1464239/original.aspx" width=685 align=left mce_src="http://blogs.msdn.com/photos/deanmel/images/1464239/original.aspx"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;If you look at the header file you'll see the following sizes:&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="DIRECTION: ltr"&gt;
&lt;TABLE class="" style="BORDER-RIGHT: #a3a3a3 1pt solid; BORDER-TOP: #a3a3a3 1pt solid; BORDER-LEFT: #a3a3a3 1pt solid; DIRECTION: ltr; BORDER-BOTTOM: #a3a3a3 1pt solid; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 border=1 valign="top"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT: #a3a3a3 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #a3a3a3 1pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 4pt; VERTICAL-ALIGN: top; BORDER-LEFT: #a3a3a3 1pt solid; WIDTH: 2.629in; PADDING-TOP: 4pt; BORDER-BOTTOM: #a3a3a3 1pt solid"&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;sizeof(OAL_KITL_SERIAL_HEADER) &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT: #a3a3a3 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #a3a3a3 1pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 4pt; VERTICAL-ALIGN: top; BORDER-LEFT: #a3a3a3 1pt solid; WIDTH: 2.629in; PADDING-TOP: 4pt; BORDER-BOTTOM: #a3a3a3 1pt solid"&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;sizeof(KITL_HDR)&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT: #a3a3a3 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #a3a3a3 1pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 4pt; VERTICAL-ALIGN: top; BORDER-LEFT: #a3a3a3 1pt solid; WIDTH: 2.629in; PADDING-TOP: 4pt; BORDER-BOTTOM: #a3a3a3 1pt solid"&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;sizeof(KITL_DBGMSG_INFO) &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Arial" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;That's 34 bytes plus 27 byte string. Which is 61 bytes. Where is the other 3? Let's look at the packet that was sniffed from the line:&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;&amp;nbsp;&lt;IMG style="WIDTH: 547px; HEIGHT: 93px" height=93 src="http://blogs.msdn.com/photos/deanmel/images/1464236/original.aspx" width=547 align=left mce_src="http://blogs.msdn.com/photos/deanmel/images/1464236/original.aspx"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;There are&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;3 extra bytes at the end:&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;0x0D, 0x0A and 0x00. They are \n, \r and \0.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;So that's how the mystery of 27 byte string was solved. &lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;The Explanation &lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;We know that this hick up or hang happens when the data sent by the client is aligned to exactly max packet size. But why in some cases do we see a hick up and in the others a hang? And why would we still be able to type shell commands? That didn't make any sense.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Why would we still be able to type shell commands?&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The answer lies in the KITL Architecture. KITL has a full duplex architecture meaning it has separate channels for sending and receiving data. It also has 16 separate clients (see the picture blow).&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Debug Message is client number 0 and Shell command window is client number 10 then you can bring down client number 0 but client number 10 would still work. The problem we were having was on the Transport level which is below the Client level but since the Transport was still Polling the data underneath it was able to respond to our Shell requests and only the Debug Message Client was stuck.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;&lt;IMG style="WIDTH: 486px; HEIGHT: 270px" height=270 src="http://blogs.msdn.com/photos/deanmel/images/1464246/original.aspx" width=486 align=left mce_src="http://blogs.msdn.com/photos/deanmel/images/1464246/original.aspx"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;But why would it sometimes stop just for a split second and other times it would hang? The answer is simply luck! Let's say the device was trying to send 4 packets which were exactly 64 bytes each. The host would receive all 4 packets however on the last packet it would just stop because it is waiting for a transmission end packet which never comes because there is no more data in the queue on the device. That is the case when the Debug Message output would get stuck. If the device were to send something else at that moment then the data flow would resume and packet number 4 would be flashed out. &lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;There are other ways that would allow the data flow to be resumed. When the host waits for the packet to come but it never does for any reason then the host would send a packet back asking the device to retransmit the data. However if the only thing the device does is retransmit the last packet it will still be aligned at 64 bytes and the host would still think that there is more data. In most cases though the device send something else with the retransmit (echo, acknowledgment etc.)&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;which will generate a partial packet in the end and the data flow will be resumed. I hope now you see why I said "luck" in the beginning.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;The Conclusion&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;In the end this was a very challenging issue and I'm glad that we had USB sniffer that allowed us to look at the raw packets. Some of you might not have the USB sniffers that's why we thought it is important for us to share our finding with you.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1464267" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL/default.aspx">KITL</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL+Timeout/default.aspx">KITL Timeout</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category></item><item><title>KITL timeouts with USB Serial</title><link>http://blogs.msdn.com/hopperx/archive/2006/12/23/kitl-timeouts-with-usb-serial.aspx</link><pubDate>Sun, 24 Dec 2006 01:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1354311</guid><dc:creator>deanmel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/1354311.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=1354311</wfw:commentRss><description>&lt;P&gt;Recently the JDP team investigated a group of KITL timeout failures. Each timeout occurred under similar conditions and seemed to be associated with a single bug. At first we were puzzled as to why we were seeing these failures on different devices with different OS versions. As the investigation progressed it became clear that the bug was located in a section of BSP code that handles KITL packets sent over the USB Serial transport. To indicate a transmission is complete the USB client sends a partial packet (i.e. a packet smaller then the max packet size) to USB host. This means that if the data being sent is equal to the exact size of the USB max packet size, the USB client must send a zero length packet at the end of the transmission. On the BSPs we were using, this zero length packet was never sent, so in some cases KITL would think it was hung waiting for a transmission to complete; in other cases, the debug message flow would simply stop for a split second and then continue. To test for this bug you can write a very simple application that will send 64 byte packets to the debug output. Keep in mind the standard KITL header is 34 bytes (do not worry about these details if they do not make sense right now, I will explain KITL header and transmissions in more detail in a follow-up blog). Also, do not forget that debug messages are sent in ASCII therefore each character will take 1 byte. The following code will detect the KITL packet bug if the bug is present, a hang or a pause will be shown in the debug messages when this code is executed: &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; WORD-BREAK: keep-all; POSITION: relative; BACKGROUND-COLOR: #cccccc" ;&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="COLOR: blue"&gt;char&lt;/SPAN&gt; strng[101];&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="COLOR: blue"&gt;for&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; a = 0; a &amp;lt; 100; a++) &lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;memset&lt;/SPAN&gt;(strng, &lt;SPAN style="COLOR: maroon"&gt;'k'&lt;/SPAN&gt;, a);&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strng[a] = &lt;SPAN style="COLOR: maroon"&gt;'\0'&lt;/SPAN&gt;;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;printf&lt;/SPAN&gt;(&lt;SPAN style="COLOR: maroon"&gt;"%s\n"&lt;/SPAN&gt;, strng);&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;//!!If the bug exists, the second printf should cause a hickup or hang!!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;printf&lt;/SPAN&gt;(&lt;SPAN style="COLOR: maroon"&gt;"%s\n"&lt;/SPAN&gt;, strng); &lt;SPAN style="COLOR: green"&gt;//Remember '\n' is compiled into two characters (CR and LF).&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;B&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;The Fix&lt;/B&gt; &lt;BR&gt;This bug has a simple fix. Find the KITLSend function in your KITL implementation, (it's called USBKitlTxIntHandler in some BSPs), then find the spot right before a packet is sent to USB and insert these 3 lines: &lt;/P&gt;
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; WORD-BREAK: keep-all; POSITION: relative; BACKGROUND-COLOR: #cccccc" ;&gt;&amp;nbsp; 
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// here we split the last trunk of data into 2 short packets(EP1Len - 4) and 4 bytes&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (len == EP1Len) &lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;{&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// if the requested send size happens to be multiple of EP1Len,&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// we should send a zero length packet to indicate end of data,&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// here we split the last trunk of data into 2 short packets(EP1Len - 4) and 4 bytes&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;//, so we never need to send a zero length packet&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: 'Courier New'"&gt;lastPacketLen -= 4;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;}&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1354311" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL/default.aspx">KITL</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL+Timeout/default.aspx">KITL Timeout</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category></item></channel></rss>