<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.arm.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>Smartcard USB driver - Bulk IN message problem</title><link>https://community.arm.com/developer/tools-software/tools/f/keil-forum/24805/smartcard-usb-driver---bulk-in-message-problem</link><description> 
Hello, 
Writing a an USB smartcard driver, I choose to start a new thread
instead of continue the last thread i ve initiated. 
I have written the configuration for the LPC2368. Here the
configuration: 

 
const BYTE USB_ConfigDescriptor[] = {

/* Configuration</description><dc:language>en-US</dc:language><generator>Telligent Community 10</generator><item><title>RE: Smartcard USB driver - Bulk IN message problem</title><link>https://community.arm.com/thread/125758?ContentTypeID=1</link><pubDate>Tue, 06 Oct 2009 04:42:38 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:5698472c-361e-44c5-b0b6-e7afabe0bac9</guid><dc:creator>Chinzei Tsuneo</dc:creator><description>&lt;p&gt;&lt;p&gt;
In the first place, is smcDispatchMessage() called from the main
line (or timered) polling loop?&lt;br /&gt;
Or USB_EndPoint2( USB_EVT_OUT ) (ie. EP2 ISR) calls the routine?&lt;/p&gt;

&lt;p&gt;
Either will do,&lt;br /&gt;
But depending on the strategy you apply, the code flow differs
significantly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This isn&amp;#39;t directly concerned to current problem, but this code has
another problem.&lt;/p&gt;

&lt;pre&gt;
void USB_DataInStage2 (void) {
  ...
  if (EP2DataSnd.Count &amp;gt; USB_MAX_PACKET0)
  {
        while(temp&amp;gt;USB_MAX_PACKET0)
        {
                temp-=USB_MAX_PACKET0;
                cnt = USB_WriteEP(0x82, EP2DataSnd.pData,USB_MAX_PACKET0);
                EP2DataSnd.pData += cnt;
        }
        cnt = USB_WriteEP(0x82, EP2DataSnd.pData,temp);
  }
&lt;/pre&gt;

&lt;p&gt;
In above code, the large data is split into packets of endpoint
wMaxPacketSize.&lt;br /&gt;
So far, so good.&lt;br /&gt;
But USB_WriteEP() is repeatedly called without checking buffer
empty.&lt;br /&gt;
It may cause overwrite to the EP buffer.&lt;/p&gt;

&lt;p&gt;
When USB_EndPoint2( USB_EVT_IN ) is called, it shows the timing in
which the EP2 IN buffer goes empty.&lt;br /&gt;
Raise a flag in USB_EndPoint2(), and poll this flag.&lt;/p&gt;

&lt;p&gt;
Tsuneo&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Smartcard USB driver - Bulk IN message problem</title><link>https://community.arm.com/thread/125759?ContentTypeID=1</link><pubDate>Mon, 05 Oct 2009 08:21:25 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:73822803-e203-4cb2-85cc-dbe461a0bb6b</guid><dc:creator>Hakan Hakan</dc:creator><description>&lt;p&gt;&lt;p&gt;
Oh sorry, USB_MAX_PACKET0 ist of course 64 (as configured) and not
1024.&lt;br /&gt;
I slightly changed USB_DataInStage2 for Data greater as 64:&lt;/p&gt;

&lt;pre&gt;
void USB_DataInStage2 (void) {
  BYTE cnt;
  BYTE temp;
  temp = EP2DataSnd.Count;

  if (EP2DataSnd.Count &amp;gt; USB_MAX_PACKET0)
  {
        while(temp&amp;gt;USB_MAX_PACKET0)
        {
                temp-=USB_MAX_PACKET0;
                cnt = USB_WriteEP(0x82, EP2DataSnd.pData,USB_MAX_PACKET0);
                EP2DataSnd.pData += cnt;
        }
        cnt = USB_WriteEP(0x82, EP2DataSnd.pData,temp);
  }
  else
  {
    cnt = EP2DataSnd.Count;
        cnt = USB_WriteEP(0x82, EP2DataSnd.pData,cnt);
  }

  /********* this is for debugging purpose ************/
  if ((*EP2DataSnd.pData == 0x80)&amp;amp;&amp;amp;(cnt&amp;gt;1))
  {
        Result[0] = *(EP2DataSnd.pData);
        Result[1] = *(EP2DataSnd.pData+1);
        Result[2] = *(EP2DataSnd.pData+2);
        Result[3] = *(EP2DataSnd.pData+3);
        Result[4] = *(EP2DataSnd.pData+4);
        Result[5] = *(EP2DataSnd.pData+5);
        Result[6] = *(EP2DataSnd.pData+6);
        Result[7] = *(EP2DataSnd.pData+7);
        Result[8] = *(EP2DataSnd.pData+8);
        Result[9] = *(EP2DataSnd.pData+9);;
          set_cursor (0, 1);
          lcd_print (&amp;quot;RDR_to_PC_DataBlock sent&amp;quot;);
  }
  /****************** reinitialyze EP2DataSnd.Count  ***********************/
  EP2DataSnd.Count = 0;
}
&lt;/pre&gt;

&lt;p&gt;
and here the while loop in the main.c:&lt;/p&gt;

&lt;pre&gt;
while (1)                           // Loop forever
        {
                ///*****************USB******************
        if (EP2DataSnd.Count&amp;gt;2)
         USB_DataInStage2();

         smcDispatchMessage();

        }
&lt;/pre&gt;

&lt;p&gt;
Well the problem still remains...&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Smartcard USB driver - Bulk IN message problem</title><link>https://community.arm.com/thread/115272?ContentTypeID=1</link><pubDate>Mon, 05 Oct 2009 05:03:19 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:5612e97a-8c6f-4fcd-80e2-f022d39ffecf</guid><dc:creator>Hakan Hakan</dc:creator><description>&lt;p&gt;&lt;p&gt;
Ah after analysing the Sniffer I remark The URB IN at the Bulk IN
0x82 , Its the URB &amp;quot;down&amp;quot; one: &amp;quot;URB Bulk Transfer issued&amp;quot;&lt;br /&gt;
But there is no &amp;quot;Reply&amp;quot; URB to this.&lt;/p&gt;

&lt;p&gt;
The particularity is this urb occurs after the host send the bytes
{63, 00, 00, 00, 00, 00, 03, 00, 00, 00} (PC_to_RDR_ICCPowerOff).&lt;/p&gt;

&lt;p&gt;
So here the explanation of what is been displayed on the
sniffer:&lt;br /&gt;
1- The host sends {62, 00, 00, 00, 00, 00, 02, 00, 00, 00}
(PC_to_RDR_ICCPowerOn)&lt;/p&gt;

&lt;p&gt;
2- Then the device sends a URB &amp;quot;down&amp;quot; with a reply failure (4
bytes datas, nothing inside the data filed) &lt;b&gt;URB Bulk Transfer
failed&lt;/b&gt; (there is a successfull 74 bytes bulk IN tranfer
before)&lt;/p&gt;

&lt;p&gt;
3- Then the host send the bytes {63, 00, 00, 00, 00, 00, 03, 00,
00, 00} (PC_to_RDR_ICCPowerOff).&lt;/p&gt;

&lt;p&gt;
4- Then I see my 10 bytes BULK IN transfer issue but with no reply
URB.&lt;/p&gt;

&lt;p&gt;
It seems to be a timing problem maybe!&lt;/p&gt;

&lt;p&gt;
Do you have any idea on it?&lt;/p&gt;

&lt;p&gt;
Thanks&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Smartcard USB driver - Bulk IN message problem</title><link>https://community.arm.com/thread/115273?ContentTypeID=1</link><pubDate>Mon, 05 Oct 2009 02:06:23 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:156a7033-e7c4-4c00-93e0-9d9b637308be</guid><dc:creator>Hakan Hakan</dc:creator><description>&lt;p&gt;&lt;p&gt;
Hello,&lt;br /&gt;
Thanks for replying Tsuneo&lt;/p&gt;

&lt;p&gt;
&lt;i&gt;Looking in the sniffer log closely, you&amp;#39;ll be aware that URBs
(USB Request Blocks) are shown in a pair.&lt;br /&gt;
In some sniffer, the pair is called down and up.&lt;br /&gt;
If you see the first one, but don&amp;#39;t see the second one, the device
doesn&amp;#39;t put the packet into the IN EP.&lt;br /&gt;
It suggests an error on the firmware side.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;
Well this is the case for me since the &amp;quot;down&amp;quot; URb says: &amp;quot;URB Bulk
or Interrupt Transfer issued&amp;quot; and then the next URB says &amp;quot;URB Bulk or
Interrupt Transfer failed&amp;quot;&lt;/p&gt;

&lt;p&gt;
This is the and the (I assume) unique tranfer failure I get from
the USBlyzer! URB status is: &amp;quot;USBD_STATUS_BUFFER_OVERRUN&amp;quot;, It a bit
weird because its about 4 byte data even though Im trying to send at
least 10 bytes data on the Bulk IN EP.&lt;/p&gt;

&lt;p&gt;
&lt;i&gt;Send back just 2 byte of RDR_to_PC_NotifySlotChange message,
{0x50, 0x03}&lt;/i&gt;&lt;br /&gt;
I changed it but still get the same problem: BYTE FirstDataBlock[10]
= {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, bSeqByte, 0x40, 0xFE, 0x00};
cannot be sent!&lt;/p&gt;

&lt;p&gt;
Here the definitions of USB_DataInStage1() and
USB_DataInStage2():&lt;/p&gt;

&lt;pre&gt;
void USB_DataInStage1 (void) {
  DWORD cnt;

  /*if the number of bytes is more than 1024, then cut it */
  if (EP1DataSnd.Count &amp;gt; USB_MAX_PACKET0) {
    cnt = USB_MAX_PACKET0;
  } else {
    cnt = EP1DataSnd.Count;
  }

  cnt = USB_WriteEP(0x81, EP1DataSnd.pData,cnt);
  EP1DataSnd.pData += cnt; //increment the pointer to the datas to be transfered
  EP1DataSnd.Count -= cnt;      //actualize the number of datas left to be transfered
}

void USB_DataInStage2 (void) {
  BYTE cnt;

  if (EP2DataSnd.Count &amp;gt; USB_MAX_PACKET0) {
    cnt = USB_MAX_PACKET0;
  } else {
    cnt = EP2DataSnd.Count;
  }

  cnt = USB_WriteEP(0x82, EP2DataSnd.pData,cnt);
/********* this is for debugging purpose ************/
  if ((*EP2DataSnd.pData == 0x80)&amp;amp;&amp;amp;(cnt&amp;gt;1))
  {
        Result[0] = *(EP2DataSnd.pData);
        Result[1] = *(EP2DataSnd.pData+1);
        Result[2] = *(EP2DataSnd.pData+2);
        Result[3] = *(EP2DataSnd.pData+3);
        Result[4] = *(EP2DataSnd.pData+4);
        Result[5] = *(EP2DataSnd.pData+5);
        Result[6] = *(EP2DataSnd.pData+6);
        Result[7] = *(EP2DataSnd.pData+7);
        Result[8] = *(EP2DataSnd.pData+8);
        Result[9] = *(EP2DataSnd.pData+9);;
          set_cursor (0, 1);
          lcd_print (&amp;quot;RDR_to_PC_DataBlock sent&amp;quot;);
  }
/******************  ***********************/
  EP2DataSnd.pData += cnt;
  EP2DataSnd.Count -= cnt;
}
&lt;/pre&gt;

&lt;p&gt;
Well I can&amp;#39;t see any bug in these function definitions.&lt;br /&gt;
By debbugging, I could see the datas to be sent in the Result array
(USB_DataInStage2) and Im struggling to see where is the problem in
the code!&lt;/p&gt;

&lt;p&gt;
I change the USB_writeEP as a SWI just exactly according to your
recommendations in &lt;a href="http://www.keil.com/forum/docs/thread15613.asp"&gt;http://www.keil.com/forum/docs/thread15613.asp&lt;/a&gt;
, IN VAIN!&lt;/p&gt;

&lt;p&gt;
I assume there is no problem in the bIntervals of the EP
Configuration since the Full-Speed mode simply ignores these
points.&lt;br /&gt;
See &lt;a href="http://www.usb.org/developers/.../DWG_Smart-Card_CCID_Rev110.pdf"&gt;www.usb.org/.../DWG_Smart-Card_CCID_Rev110.pdf&lt;/a&gt;&lt;br /&gt;

page 21&lt;/p&gt;

&lt;p&gt;
Do you have any Idea on how to fix the problem?&lt;/p&gt;

&lt;p&gt;
Thank you very much&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Smartcard USB driver - Bulk IN message problem</title><link>https://community.arm.com/thread/103481?ContentTypeID=1</link><pubDate>Sat, 03 Oct 2009 03:12:12 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:d42778b5-2009-4bea-a145-eae4bf4c5655</guid><dc:creator>Chinzei Tsuneo</dc:creator><description>&lt;p&gt;&lt;p&gt;
&lt;i&gt;&amp;gt; I choose to start a new thread instead of continue the
last thread i ve initiated.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;
It&amp;#39;s better to show the original thread for reference,&lt;br /&gt;
&lt;a href="http://www.keil.com/forum/docs/thread15614.asp"&gt;http://www.keil.com/forum/docs/thread15614.asp&lt;/a&gt;&lt;br /&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&amp;gt; but the Host does&amp;#39;nt take it! I can&amp;#39;t see it on the
USBLYzer!&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;
Looking in the sniffer log closely, you&amp;#39;ll be aware that URBs (USB
Request Blocks) are shown in a pair.&lt;br /&gt;
In some sniffer, the pair is called down and up.&lt;br /&gt;
The first one, down, shows a request to lower system driver, and the
second one, up, is the reply to the request.&lt;br /&gt;
For IN endpoint, the reply holds the transfer (packets) from the
device.&lt;/p&gt;

&lt;p&gt;
If you don&amp;#39;t see the first one, the host doesn&amp;#39;t read the IN
endpoint, actually.&lt;br /&gt;
In most case, the device driver doesn&amp;#39;t like the last response from
the device.&lt;/p&gt;

&lt;p&gt;
If you see the first one, but don&amp;#39;t see the second one, the device
doesn&amp;#39;t put the packet into the IN EP.&lt;br /&gt;
It suggests an error on the firmware side.&lt;/p&gt;

&lt;p&gt;
Which one is your case?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
smcSlotStatusChange()&lt;br /&gt;
In the Smartcard Class Descriptor, single slot is declared
(bMaxSlotIndex = 0).&lt;br /&gt;
Send back just 2 byte of RDR_to_PC_NotifySlotChange message, {0x50,
0x03}&lt;br /&gt;
What is USB_DataInStage1() ? Isn&amp;#39;t just USB_WriteEP() call
enough?&lt;/p&gt;

&lt;p&gt;
#define CCID_EVENT_EP 0x81&lt;br /&gt;
USB_WriteEP( CCID_EVENT_EP, msg, 2);&lt;/p&gt;

&lt;p&gt;
Also, what is USB_DataInStage2() in smcSlotStatus() ?&lt;br /&gt;
USB_WriteEP() is enough, too&lt;/p&gt;

&lt;p&gt;
If USB_WriteEP() and USB_ReadEP() are called in main line
code,&lt;br /&gt;
guard these calls with disabling USB interrupt around these calls
temporarily,&lt;br /&gt;
or apply SWI. It is discussed recently on this topic.&lt;/p&gt;

&lt;p&gt;
&amp;quot;No HID interrupt IN transfers&amp;quot;&lt;br /&gt;
&lt;a href="http://www.keil.com/forum/docs/thread15613.asp"&gt;http://www.keil.com/forum/docs/thread15613.asp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Tsuneo&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Smartcard USB driver - Bulk IN message problem</title><link>https://community.arm.com/thread/77809?ContentTypeID=1</link><pubDate>Fri, 02 Oct 2009 04:44:09 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:e0a12f6a-d794-4b10-8b7f-42077fd44352</guid><dc:creator>Hakan Hakan</dc:creator><description>&lt;p&gt;&lt;p&gt;
Oh sorry I ve forgotten the manual Im using:&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://www.usb.org/developers/.../DWG_Smart-Card_CCID_Rev110.pdf"&gt;www.usb.org/.../DWG_Smart-Card_CCID_Rev110.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
Thanks&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Smartcard USB driver - Bulk IN message problem</title><link>https://community.arm.com/thread/56983?ContentTypeID=1</link><pubDate>Fri, 02 Oct 2009 04:40:23 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:47f06813-224e-4efd-899e-c5d1dc428102</guid><dc:creator>Hakan Hakan</dc:creator><description>&lt;p&gt;&lt;p&gt;
Here the functions:&lt;/p&gt;

&lt;pre&gt;
void smcSlotStatus(BYTE Err, BYTE* Mess)         //cnt = 10
{
    *(UsbInMessageBuffer+OFFSET_BMESSAGETYPE) = Mess[0];
        *(UsbInMessageBuffer+OFFSET_BSTATUS) = CRD_GetSlotStatus();     //0x00
        *(UsbInMessageBuffer+OFFSET_BERROR) = Mess[OFFSET_BERROR];
        if(Err != SLOT_NO_ERROR)
        {
        *(UsbInMessageBuffer+OFFSET_BSTATUS) += 0x40;
        *(UsbInMessageBuffer+OFFSET_DWLENGTH) = 0x00;
        *(UsbInMessageBuffer+OFFSET_DWLENGTH+1) = 0x00;
        *(UsbInMessageBuffer+OFFSET_DWLENGTH+2) = 0x00;
        *(UsbInMessageBuffer+OFFSET_DWLENGTH+3) = 0x00;
        *(UsbInMessageBuffer+OFFSET_BERROR) = Err;
        };
        *(UsbInMessageBuffer+OFFSET_BSEQ)   =  *(UsbMessageBuffer+OFFSET_BSEQ);
        *(UsbInMessageBuffer+OFFSET_BSEQ+1) = Mess[OFFSET_BSEQ+1];
        *(UsbInMessageBuffer+OFFSET_BCLOCKSTATUS) = Mess[OFFSET_BCLOCKSTATUS];
        //UsbInMessageBuffer[OFFSET_BCLOCKSTATUS] = CRD_GetClockStatus();       */
        /* Copy the bytes and the size to the send buffer */
        EP2DataSnd.pData = UsbInMessageBuffer;
        EP2DataSnd.Count = OFFSET_BCLOCKSTATUS + 1;
        USB_DataInStage2();
        //Put the pointer to the start position
        UsbInMessageBuffer -= OFFSET_BCLOCKSTATUS;
}

void smcDataBlock(BYTE Err, BYTE* Mess)
{
        *(UsbInMessageBuffer+OFFSET_BMESSAGETYPE) = Mess[0];
        *(UsbInMessageBuffer+OFFSET_BSTATUS) = CRD_GetSlotStatus();
        *(UsbInMessageBuffer+OFFSET_DWLENGTH) = Mess[OFFSET_DWLENGTH];
        *(UsbInMessageBuffer+OFFSET_DWLENGTH+1) = Mess[OFFSET_DWLENGTH+1];
        *(UsbInMessageBuffer+OFFSET_DWLENGTH+2) = Mess[OFFSET_DWLENGTH+2];
        *(UsbInMessageBuffer+OFFSET_DWLENGTH+3) = Mess[OFFSET_DWLENGTH+3];
        *(UsbInMessageBuffer+OFFSET_BSEQ)   =  *(UsbMessageBuffer+OFFSET_BSEQ);
        *(UsbInMessageBuffer+OFFSET_BSEQ+1) = Mess[OFFSET_BSEQ+1];
        *(UsbInMessageBuffer+OFFSET_BSEQ+2) = Mess[OFFSET_BSEQ+2];
        *(UsbInMessageBuffer+OFFSET_BCHAINPARAMETER) = Mess[OFFSET_BCHAINPARAMETER];

        for(index = 0; index&amp;lt;10; index++)
                Result[index] = *(UsbInMessageBuffer+index);
        /* Copy the bytes and the size to the send buffer */
        EP2DataSnd.pData = UsbInMessageBuffer;
        EP2DataSnd.Count = OFFSET_BCHAINPARAMETER + 5;
        USB_DataInStage2();

        //Put the pointer to the start position
        UsbInMessageBuffer += OFFSET_BCHAINPARAMETER;
}

BYTE PC_to_RDR_IccPowerOFF(void)
{
        if(*(UsbMessageBuffer+OFFSET_BSLOT) != 0)
                return SLOTERROR_BAD_SLOT;
        if(*(UsbMessageBuffer+OFFSET_DWLENGTH) != 0 || *(UsbMessageBuffer+OFFSET_DWLENGTH+1) != 0
                || *(UsbMessageBuffer+OFFSET_DWLENGTH+2) != 0 || *(UsbMessageBuffer+OFFSET_DWLENGTH+3) != 0)
                return SLOTERROR_BAD_LENTGH;
        if( *(UsbMessageBuffer+OFFSET_ABRFU_3B) != 0 || *(UsbMessageBuffer+OFFSET_ABRFU_3B+1) != 0
                ||*(UsbMessageBuffer+OFFSET_ABRFU_3B+2) != 0)
                return SLOTERROR_BAD_ABRFU_3B;

  return SLOT_NO_ERROR;
}

BYTE PC_to_RDR_IccPowerON (void)
{
        //BYTE ErrorCode;
//      BYTE Voltage;

        if(*(UsbMessageBuffer+OFFSET_BSLOT) != 0)
                return SLOTERROR_BAD_SLOT;
        if(*(UsbMessageBuffer+OFFSET_DWLENGTH) != 0 || *(UsbMessageBuffer+OFFSET_DWLENGTH+1) != 0
           || *(UsbMessageBuffer+OFFSET_DWLENGTH+2) != 0 || *(UsbMessageBuffer+OFFSET_DWLENGTH+3) != 0)
                return SLOTERROR_BAD_LENTGH;
        if(*(UsbMessageBuffer+OFFSET_BPOWERSELECT) &amp;gt;= 0x04)
                return SLOTERROR_BAD_POWERSELECT;
        if(*(UsbMessageBuffer+OFFSET_ABRFU_3B) != 0 || *(UsbMessageBuffer+OFFSET_ABRFU_3B+1) != 0)
                return SLOTERROR_BAD_ABRFU_2B;

        return SLOT_NO_ERROR;
}
&lt;/pre&gt;

&lt;p&gt;
Thanks&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>