Гудвин, волшебник (24.04.2012 21:03, просмотров: 154) ответил Гудвин на Жаба заставила-таки добить гада ;) Душа радОВАеЦЦа: "Program Size: Code=904 RO-data=424 RW-data=16 ZI-data=536". Все пучком - прерывание не дергается, данные шлются только по приказу "партии и правительства"... Вот чо добавил (код ~150 байт):
А вот так еще экономнее (790 байт), но несколько "черезжопно":
#define CCEMTY_INT (0x1<<10)
#define CMD_SEL_EP_CLRI(x) (0x00400500 | ((x) << 16))
void WrCmd (uint32_t cmd) {
LPC_USB->DevIntClr = CCEMTY_INT;
LPC_USB->CmdCode = cmd;
while ((LPC_USB->DevIntSt & CCEMTY_INT) == 0);
}
USB_IRQHandler(void)
{
#define INT_IN_EP 0x10 // это бит прерывания Input Report
uint32_t disr;
disr = LPC_USB->DevIntSt;
/* Device Interrupt Status */
if ((disr & INT_IN_EP) && (!fl_send)) // тут проверим кинунуть гада или таки послать данные
{
LPC_USB->DevIntClr = disr & INT_IN_EP; // сбросим флаг прерывания
WrCmd(CMD_SEL_EP_CLRI(INT_IN_EP>>1)); // в железе тоже
}
else (*rom)->pUSBD->isr();
}
/*
* Get HID Input Report -> InReport
*/
void GetInReport (uint8_t src[], uint32_t length) {
fl_send=0; // сбросим флаг посылки данных
// здесь делаем , что надо
return;
}
void prepare_send (void)
{
fl_send=1; // взведем флаг посылки двнных
LPC_USB->DevIntSet|=INT_IN_EP; // взведем флаг прерывания GetInReport
}
/*
* Set HID Output Report <- OutReport
*/
void SetOutReport (uint8_t dst[], uint32_t length) {
// здесь делаем , что надо...
prepare_send(); // типа тут инициируем посылку данных в ответ...
return;
}