static void blinkCapsLockLED(void) { static int gCounter = 0; static int gDelayCounter = 0; static uint8_t gLEDState = 1; const uint8_t gCountMAX = 200; uint8_t led = LEDCAPS; uint8_t gIsOn = 0; #ifdef ENABLE_BOOTMAPPER if(isBootMapper()){ gIsOn = 1; } #endif if(gIsOn == 1){ ++gDelayCounter; if(gDelayCounter > blinkLedCountDelay){ gCounter++; if(gCounter > gCountMAX){ if(getLEDState() & LED_STATE_CAPS){ // Caps Lock이 켜져 있을때는 커졌다 켜지고; if(gLEDState == 1){ turnOffLED(led); }else{ turnOnLED(led); gDelayCounter = 0; } }else{ // Caps Lock이 꺼져 있을 때는 켜졌다 꺼진다. if(gLEDState == 1){ turnOnLED(led); }else{ turnOffLED(led); gDelayCounter = 0; } } gLEDState ^= 1; gCounter = 0; } } }else{ gCounter = 0; gLEDState = 1; } }
/** * This function is called whenever we receive a setup request via USB. * \param data[8] eight bytes of data we received * \return number of bytes to use, or 0xff if usbFunctionWrite() should be * called */ usbMsgLen_t usbFunctionSetup(uint8_t data[8]) { delegateInterfaceReadyUsb(); static uint8_t readyForNext = 0; usbRequest_t *rq = (void *)data; // DBG1(0xCC, data, 8); if ((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) { // class request type if (rq->bRequest == USBRQ_HID_GET_REPORT) { if (rq->wValue.word == HID_REPORT_KEBOARD) { // wValue: ReportType (highbyte), ReportID (lowbyte) usbMsgPtr = (usbMsgPtr_t)&reportKeyboard; return sizeof(reportKeyboard); }else if(rq->wValue.word == HID_REPORT_BOOT){ if(rq->wLength.word == OPTION_GET_REPORT_LENGTH_RAINBOW){ // ready for rainbow color setting; readyForNext = NEXT_RAINBOW; }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_QUICK_MACRO1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_QUICK_MACRO12){ readyForNext = rq->wLength.word; } }else if(rq->wValue.word == HID_REPORT_OPTION){ // length : rq->wLength.word 필요한 리포트를 length로 구분한다. if(rq->wLength.word == OPTION_GET_REPORT_LENGTH_INFO){ // report led2 info static option_info_t optionsBuffer; getOptions(&optionsBuffer); usbMsgPtr = (usbMsgPtr_t)&optionsBuffer; return sizeof(optionsBuffer); //OPTION_GET_REPORT_LENGTH_INFO; }else if(rq->wLength.word == OPTION_GET_REPORT_LENGTH_TOGGLE_BOOTMAPPER){ static bool gIsBootloader; if(isBootMapper()){ setToBootMapper(false); gIsBootloader = false; }else{ setToBootMapper(true); gIsBootloader = true; } usbMsgPtr = (usbMsgPtr_t)&gIsBootloader; return 1; #if HAS_OPTIONS }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER4){ // keymap usbMsgFlags = USB_FLG_MSGPTR_IS_ROM; usbMsgPtr = (usbMsgPtr_t)(KEYMAP_ADDRESS + (ROWS * COLUMNS * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER1))); return OPTION_GET_REPORT_LENGTH_KEYMAP; }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_MACRO1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_MACRO12){ // cst macro usbMsgFlags = USB_FLG_MSGPTR_IS_ROM; usbMsgPtr = (usbMsgPtr_t)(CUSTOM_MACRO_ADDRESS+(CUSTOM_MACRO_SIZE_MAX * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_MACRO1))); return CUSTOM_MACRO_SIZE_MAX; }else if(rq->wLength.word == OPTION_GET_OPTION_INDEX_DUALACTION){ // dual action usbMsgFlags = USB_FLG_MSGPTR_IS_ROM; usbMsgPtr = (usbMsgPtr_t)(DUALACTION_ADDRESS); return DUALACTION_BYTES; }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_QUICK_MACRO1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_QUICK_MACRO12){ usbMsgFlags = USB_FLG_USE_USER_RW; usbMsgPtr = (usbMsgPtr_t)(EEPROM_MACRO+(MACRO_SIZE_MAX * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_QUICK_MACRO1))); return MACRO_SIZE_MAX; #else }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER4){ // keymap usbMsgFlags = USB_FLG_MSGPTR_IS_ROM; usbMsgPtr = (usbMsgPtr_t)(KEYMAP_ADDRESS + (ROWS * COLUMNS * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_KEYMAP_LAYER1))); return OPTION_GET_REPORT_LENGTH_KEYMAP; }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_MACRO1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_MACRO12){ // cst macro usbMsgFlags = USB_FLG_MSGPTR_IS_ROM; usbMsgPtr = (usbMsgPtr_t)(CUSTOM_MACRO_ADDRESS+(CUSTOM_MACRO_SIZE_MAX * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_MACRO1))); return CUSTOM_MACRO_SIZE_MAX; }else if(rq->wLength.word == OPTION_GET_OPTION_INDEX_DUALACTION){ // dual action usbMsgFlags = USB_FLG_MSGPTR_IS_ROM; usbMsgPtr = (usbMsgPtr_t)(DUALACTION_ADDRESS); return DUALACTION_BYTES; }else if(rq->wLength.word >= OPTION_GET_REPORT_LENGTH_QUICK_MACRO1 && rq->wLength.word <= OPTION_GET_REPORT_LENGTH_QUICK_MACRO12){ usbMsgFlags = USB_FLG_USE_USER_RW; usbMsgPtr = (usbMsgPtr_t)(EEPROM_MACRO+(MACRO_SIZE_MAX * (rq->wLength.word - OPTION_GET_REPORT_LENGTH_QUICK_MACRO1))); return MACRO_SIZE_MAX; #endif }else { return rq->wLength.word; } } } else if (rq->bRequest == USBRQ_HID_SET_REPORT) { // DBG1(0xAA, (uchar *)&rq->wValue.word, 2); // 02 03 : Report Type: 0x03, ReportID: 0x02 // 01 03 : Report Type: 0x03, ReportID: 0x01 // Report Type: 0x02(Out)/ReportID: 0x00(none) && Interface: 0(keyboard) if (rq->wValue.word == HID_REPORT_KEBOARD && rq->wIndex.word == 0) { // We expect one byte reports expectReport = 1; return USB_NO_MSG; // Call usbFunctionWrite with data }else if(rq->wValue.word == HID_REPORT_BOOT){ // boot // isStart = 1; if(readyForNext == NEXT_RAINBOW){ data[1] = OPTION_INDEX_COLOR_RAINBOW_INIT; // init setting; setOptions((uint8_t *)data); expectReport = 4; }else if(readyForNext >= OPTION_GET_REPORT_LENGTH_QUICK_MACRO1 && readyForNext <= OPTION_GET_REPORT_LENGTH_QUICK_MACRO12){ // write quick macro IsAddressHead = true; quickMacroAddress = EEPROM_MACRO + (MACRO_SIZE_MAX * (readyForNext - OPTION_GET_REPORT_LENGTH_QUICK_MACRO1)); expectReport = 5; } readyForNext = 0; return USB_NO_MSG; // Call usbFunctionWrite with data }else if(rq->wValue.word == HID_REPORT_OPTION){ // options expectReport = 2; return USB_NO_MSG; // Call usbFunctionWrite with data } } else if (rq->bRequest == USBRQ_HID_GET_IDLE) { usbMsgPtr = idleRate; // DBG1(0x71, (uchar *)&idleRate, 1); return 1; } else if (rq->bRequest == USBRQ_HID_SET_IDLE) { delegateInitInterfaceUsb(); idleRate = rq->wValue.bytes[1]; // DBG1(0x70, (uchar *)&idleRate, 1); } else if (rq->bRequest == USBRQ_HID_GET_PROTOCOL) { if (rq->wValue.bytes[1] < 1) { protocolVer = rq->wValue.bytes[1]; } } else if(rq->bRequest == USBRQ_HID_SET_PROTOCOL) { usbMsgPtr = protocolVer; return 1; } } else { // no vendor specific requests implemented } return 0; }