÷ÏÔ pÅÛÉÌÓÑ, ÞÔÏ ÐÏpÁ ÎÁ USB ÐÅpÅÂÉpÁÔØÓÑ, ÓËÁÞÁÌ ÐpÉÍÅpÞÉËÉ ÐÏËÁ ÔÏÌØËÏ ÄÌÑ HID, ÎÅÍÎÏÇÏ ÐÅpÅÄÅÌÁÌ É ×ÏÔ ÞÔÏ ÐÏÌÕÞÉÌÏÓØ:
ÎÁ ËÏÍÐÅ XP sp2, C++Builder 6. ðÏÌÕÞÁÀ handle ÎÁ hid ÕÓÔpÏÊÓÔ×Ï, CreateFile(handle,rd|wr,ShaRd|ShaWr,NULL,op_Exist,NULL,NULL) þÔÅÎÉÅ ReadFile(...)
ÄÅ×ÁÊÓ at89s53 ÐÁpÁÌÌÅÌØÎÏ ÎÁ USBN9064. Keil C. hid ÕÓÔpÏÊÓÔ×Ï control pipe + In Interrupt ÐÏ ÎÁÖÁÔÉÀ ËÎÏÐËÉ É ÚÁÐpÏÓÕ Ó ÈÏÓÔÁ ÐÅpÅÄÁÅÔ ÉÎËpÅÍÅÎÔÉpÕÅÍÙÊ int. üÔÏ ×ÓÅ pÁÂÏÔÁÅÔ.
äÁÌÅÅ- ÎÕÖÎÏ × ÄÅ×ÁÊÓ ÐÉÓÁÔØ. ÷pÏÄÅ ÅÓÔØ Ä×Á ÐÕÔÉ:
- ïÓÔÁ×ÉÔØ ÏÄÉÎ In Interrupt Endpoint, Á ËÏÇÄÁ WriteFile(...), ÔÏ ÄÁÎÎÙÅ ÂÕÄÕÔ ÏÔÐpÁ×ÌÑÔØÓÑ × ControlEndpoint
- óÏÚÄÁÔØ Out Interrupt EndPoint.
äÅÌÁÌ ÏÂÁ ×ÁpÉÁÎÔÁ, ÐpÉ WriteFile() Err (ÎÅÐpÁ×ÉÌØÎÙÊ ÐÁpÁÍÅÔp). ÷ ÄÅ×ÁÊÓ ÐpÉ ÜÔÏÍ ÎÉÞÅÇÏ ÎÅ ÄÏÈÏÄÉÔ, Ñ ÐÏ COM ÐÏpÔÕ ×ÓÅ ÓÏÂÙÔÉÑ Ó ÄÅ×ÁÊÓÁ ×ÉÖÕ. ÷ USB ÍÏÎÉÔÏpÁÈ out EndPoint ÐÏÑ×ÌÑÅÔÓÑ. ïÓÔÁ×ÌÑÌ É ÏÄÎÕ out EndPoint, ×ÓÅ pÁ×ÎÏ ÎÅ ÐÉÛÅÔ.
÷ÏÔ ÄÅÓËpÉÐÔÏp É pÅÐÏpÔ, ÍÏÖÅÔ ÏÎÉ ÉÌÉ ÷ þåí ðòïââìåíá?
unsigned char CFG_DESC[] = { CFG_LENGTH, /*÷ÅÌÉÞÉÎÁ ÜÔÏÇÏ ÄÅÓËÒÉÐÔÏÒÁ × ÂÁÊÔÁÈ CONFIGURATION, /*õËÁÚÙ×ÁÅÍ ÎÁ CONFIGURATION descriptor
41,0x00, /*äÌÉÎÁ ÄÅÓËÒÉÐÔÏÒÁ ×ËÌÀÞÁÑ Interface,Endpoint,HID
0x01, /*ëÏÌÉÞÅÓÔ×Ï éÎÔÅÒÆÅÊÓÏ× ÐÏÄÄÅÒÖÉ× ëÏÎÆÉÇÕÒÁÃÉÅÊ
0x01, /*HÏÍÅÒ ÜÔÏÊ ëÏÎÆÉÇÕÒÁÃÉÉ CFG_STR, /*éÎÄÅËÓ ïÐÉÓÁÎÉÑ ëÏÎÆÉÇÕÒÁÃÉÉ × String Descriptor
0x80, /*õËÁÚÙ×ÁÅÍ, ÞÔÏ ÂÅÒÅÍ ÐÉÔÁÎÉÅ Ó USB ÛÉÎÙ
100, /*õËÁÚÙ×ÁÅÍ, ÞÔÏ íÁÈ ÐÏÔÒÅÂÌÅÎÉÅ (200 mA)
INT_LENGTH, /*÷ÅÌÉÞÉÎÁ ÜÔÏÇÏ ÄÅÓËÒÉÐÔÏÒÁ × ÂÁÊÔÁÈ INTERFACE, /*õËÁÚÙ×ÁÅÍ ÎÁ INTERFACE descriptor
0x00, /*HÏÍÅÒ éÎÔÅÒÆÅÓÁ × ÄÁÎÎÏÊ ËÏÎÆÉÇÕÒÁÃÉÉ
0x00, /*áÌØÔÅÒÎÁÔÉ×ÎÙÊ éÎÔÅÒÆÅÊÓ. '0'- HÅÔ ÄÒÕÇÏÇÏ
0x01, /*ëÏÌÉÞÅÓÔ×Ï Endpoints ÉÓÐÏÌØÚÕÅÍÙÈ ÜÔÉÍ éÎÔÅÒÆÅÊÓÏÍ HIDCLASS, /*ëÏÄ ËÌÁÓÓÁ - '3' HID ÕÓÔÒÏÊÓÔ×Ï NOSUBCLASS, /*ëÏÄ ÐÏÄËÌÁÓÓÁ - '0' ÎÅÔ ÐÏÄËÌÁÓÓÁ
0x00, /*ëÏÄ ÐÒÏÔÏËÏÌÁ - ÕÓÔÒÏÊÓÔ×Ï ÎÅ ÉÓÐÏÌØÚÕÅÔ ÐÒÏÔÏËÏÌÁ INT_STR, /*éÎÄÅËÓ ïÐÉÓÁÎÉÑ éÎÔÅÒÆÅÊÓÁ × String Descriptor
HID_LENGTH, /*÷ÅÌÉÞÉÎÁ ÜÔÏÇÏ ÄÅÓËÒÉÐÔÏÒÁ × ÂÁÊÔÁÈ HID, /*õËÁÚÙ×ÁÅÍ ÎÁ HID descriptor - 21
0x00,0x01, /*÷ÅÒÓÉÑ HID ÓÐÅÃÉÆÉËÁÃÉÉ × BCD
0x00, /*óÔÒÁÎÁ ÄÌÑ ËÏÔÏÒÏÊ ÉÚÇÏÔÏ×ÌÅÎÏ ÉÚÄÅÌÉÅ. 0-ÄÌÑ ×ÓÅÈ
1, /*ëÏÌÉÞÅÓÔ×Ï HID ÄÅÓËÒÉÐÔÏÒÏ×. '1'-Report descriptor HIDREPORT, /*ôÉÐ ÄÅÓËÒÉÐÔÏÒÁ ËÌÁÓÓÁ '22'-HID REPORT RPT_DESC_SIZE,0x0, /*÷ÅÌÉÞÉÎÁ Report Descriptort × ÂÁÊÔÁÈ
/*Pipe 1 (endpoint 6) */ END_LENGTH, /*÷ÅÌÉÞÉÎÁ ÜÔÏÇÏ ÄÅÓËÒÉÐÔÏÒÁ × ÂÁÊÔÁÈ ENDPOINT, /*õËÁÚÙ×ÁÅÍ ÎÁ ENDPOINT descriptor
0x06, /*õËÁÚÙ×ÁÅÍ ÞÔÏ ÜÔÏ OUT Endpoint c áÄÒÅÓÏÍ 6
0x03, /*õÓÔÁÎÁ×ÌÉ×ÁÅÍ ôÉÐ ÐÅÒÅÄÁÞÉ ÄÁÎÎÙÈ - Interrupt
8,0x00, /*õÓÔÁÎÁ×ÌÉ×ÁÅÍ ÞÔÏ íax ×ÙÄÁ×ÁÅÍÙÊ ÒÁÚÍÅÒ ÐÁËÅÔÁ 64
0xFF, /*÷ÒÅÍÑ ÏÐÒÏÓÁ ëÏÎÅÞÎÏÊ ÔÏÞËÉ - 255ms
/*Pipe 1 (endpoint 5) */ END_LENGTH, /*÷ÅÌÉÞÉÎÁ ÜÔÏÇÏ ÄÅÓËÒÉÐÔÏÒÁ × ÂÁÊÔÁÈ ENDPOINT, /*õËÁÚÙ×ÁÅÍ ÎÁ ENDPOINT descriptor
0x85, /*õËÁÚÙ×ÁÅÍ ÞÔÏ ÜÔÏ IN Endpoint c áÄÒÅÓÏÍ 5
0x03, /*õÓÔÁÎÁ×ÌÉ×ÁÅÍ ôÉÐ ÐÅÒÅÄÁÞÉ ÄÁÎÎÙÈ - Interrupt
0x40,0x00, /*õÓÔÁÎÁ×ÌÉ×ÁÅÍ ÞÔÏ íax ×ÙÄÁ×ÁÅÍÙÊ ÒÁÚÍÅÒ ÐÁËÅÔÁ 64
0xFF /*÷ÒÅÍÑ ÏÐÒÏÓÁ ëÏÎÅÞÎÏÊ ÔÏÞËÉ - 255ms
};
char ReportDescriptor[23] = {
0x05, 0x02, // USAGE_PAGE (Simulation Controls)
0x09, 0x00, // USAGE (Undefined)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x5a, // LOGICAL_MAXIMUM (90)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x03, // REPORT_COUNT (3)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0x09, 0x00, // USAGE (Undefined)
0x91, 0x00, // OUTPUT (Data,Ary,Abs)
0xc0 // END_COLLECTION };
*/_Sergey_/*