Witam,

Usiłuję zrozumieć obsługę "Interrupt Transfer"(o co chodzi to wiem).
Objaśnione jest to na tej stronce: http://www.keil.com/forum/docs/thread17034.asp
Do obsługi tego transferu, wykorzystuje się tablicę 32-elementową. Zobrazowane jest to na 14-15 stronie http://documentation.renesas.com/eng/products/mpumcu/apn/rej05b0015_sh7727.pdf
W źródłach wygląda to tak:

/*
**************************************************************************************************************
*    p_HcEDlist[0]-[30] for p_StaticHcED[0]-[30]
*    p_HcEDlist[31]-[62] for HccaIntTable[0]-[31]
*    p_HcEDlist[63] for HcEDCtrl
*    p_HcEDlist[64] for HcEDBulk
**************************************************************************************************************
*/
void Init_HcEDlist(void) {
// HCED  *p_StaticHcED;
// HCED_LIST *p_HcEDlist;
//  U16 *p_list;
  U32 *p_list, *p_hced;
  U32 i, j;

   p_list = (U32*) p_HcEDlist;
   p_hced = (U32*) p_StaticHcED;
   for (i=0; i<31; i++) {
	  p_list[i] = 0;
	  p_hced[(i<<2)+0] = 0;
	  p_hced[(i<<2)+1] = 0;
	  p_hced[(i<<2)+2] = 0;
	  p_hced[(i<<2)+3] = 0;
	  p_StaticHcED[i].Control |= sKip;
	  if (i==0) {
		 p_HcEDlist[i].NextIndex = ED_EOF;
		 p_StaticHcED[i].Next = 0;
	  } else {
		 j = (i-1)/2;                    // e.g., [3] and [4] are followed by [1]
		 p_HcEDlist[i].NextIndex = j;    // e.g., [3] and [4] are followed by [1]
		 p_StaticHcED[i].Next = (U32) &p_StaticHcED[j];
	  }
   }

   for ( i=0; i<25; i+=	0x8) {
    U32 k;
	static U8 balance[8] = { 15, 23, 19, 27, 17, 25, 21, 29};
	 for (k = 0; k<8; k++) {
       j = balance[k]+ ( (i&Bit(3))>>3 );		// i.3 =1 ==> +1, otherwise +0
       p_Hcca->HccaIntTable[k+i] = (U32) &p_StaticHcED[j];
	   p_list[(k+i)+31] = 0;
	   p_HcEDlist[(k+i)+31].NextIndex = j;    // e.g., [31] and [31+16] are followed by [15]
	 }
// i = 0, or 0x10
//       p_Hcca->HccaIntTable[0x00+i] = (U32) &p_StaticHcED[15];
//     p_Hcca->HccaIntTable[0x08+i] = (U32) &p_StaticHcED[16];
//       p_Hcca->HccaIntTable[0x04+i] = (U32) &p_StaticHcED[17];
//     p_Hcca->HccaIntTable[0x0C+i] = (U32) &p_StaticHcED[18];
//       p_Hcca->HccaIntTable[0x02+i] = (U32) &p_StaticHcED[19];
//     p_Hcca->HccaIntTable[0x0A+i] = (U32) &p_StaticHcED[20];
//      p_Hcca->HccaIntTable[0x06+i] = (U32) &p_StaticHcED[21];
//     p_Hcca->HccaIntTable[0x0E+i] = (U32) &p_StaticHcED[22];
//      p_Hcca->HccaIntTable[0x01+i] = (U32) &p_StaticHcED[23];
//     p_Hcca->HccaIntTable[0x09+i] = (U32) &p_StaticHcED[24];
//      p_Hcca->HccaIntTable[0x05+i] = (U32) &p_StaticHcED[25];
//     p_Hcca->HccaIntTable[0x0D+i] = (U32) &p_StaticHcED[26];
//      p_Hcca->HccaIntTable[0x03+i] = (U32) &p_StaticHcED[27];
//     p_Hcca->HccaIntTable[0x0B+i] = (U32) &p_StaticHcED[28];
//      p_Hcca->HccaIntTable[0x07+i] = (U32) &p_StaticHcED[29];
//     p_Hcca->HccaIntTable[0x0F+i] = (U32) &p_StaticHcED[30];
   }
}

Kompletnie nie ogarniam do czego te elementy w tablicy służą i dlaczego to jest połączone z czasami pakietów.
Jeśli chodzi o moją wiedzę, to bardzo dobrze znam C, znam "usb" od strony elektronicznej oraz na poziomie pakietów. Nie rozumiem idei firm które robią układy do wysterowania usb(host). Naszukałem się opisów..... ale zrozumieć to to sam już nie dam rady ;-( Ledwo zrozumiałem komunikacje bulk/control z poziomu "kodu". Pomoże mi ktoś to wyjaśnić? Ma być to oprogramowanie pod lpc17xx w formie jak na linuksie(na razie mam usb_bulk_msg, usb_control_msg, pewnie wszystko sie zmieni jak pojawi się int/iso).