00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include <HIDDKeyboard.h>
00041 #include <HIDDFunction.h>
00042
00043 #include <USBLib_Trace.h>
00044
00045 #include <USBRequests.h>
00046 #include <HIDDescriptors.h>
00047 #include <HIDRequests.h>
00048 #include <HIDReports.h>
00049 #include <HIDUsages.h>
00050
00051 #include "USBD.h"
00052 #include <USBD_HAL.h>
00053 #include <USBDDriver.h>
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 typedef struct _KBDInputReport {
00064
00065 HIDDReportEventCallback fCallback;
00066
00067 void *pArg;
00068
00069
00070 uint16_t wMaxSize;
00071
00072 uint16_t wTransferred;
00073
00074 uint8_t bIdleRate;
00075
00076 uint8_t bDelay;
00077
00078 uint8_t bID;
00079
00080 HIDDKeyboardInputReport sReport;
00081 } KBDInputReport;
00082
00083
00084
00085
00086
00087 typedef struct _KBDOutputReport {
00088
00089 HIDDReportEventCallback fCallback;
00090
00091 void *pArg;
00092
00093
00094 uint16_t wMaxSize;
00095
00096 uint16_t wTransferred;
00097
00098 uint8_t bIdleRate;
00099
00100 uint8_t bDelay;
00101
00102 uint8_t bID;
00103
00104 HIDDKeyboardOutputReport sReport;
00105 } KBDOutputReport;
00106
00107
00108
00109
00110 typedef struct _HIDDKeyboard {
00111
00112
00113 HIDDFunction hidDrv;
00114
00115 HIDDReport *inputReports[1];
00116
00117 HIDDReport *outputReports[1];
00118 } HIDDKeyboard;
00119
00120
00121
00122
00123
00124
00125 COMPILER_ALIGNED(32) static KBDInputReport inputReport;
00126
00127
00128 COMPILER_ALIGNED(32) static KBDOutputReport outputReport;
00129
00130
00131 COMPILER_ALIGNED(32) static HIDDKeyboard hiddKeyboard;
00132
00133
00134 const uint8_t hiddKeyboardReportDescriptor[] = {
00135
00136 HIDReport_GLOBAL_USAGEPAGE + 1, HIDGenericDesktop_PAGEID,
00137 HIDReport_LOCAL_USAGE + 1, HIDGenericDesktop_KEYBOARD,
00138 HIDReport_COLLECTION + 1, HIDReport_COLLECTION_APPLICATION,
00139
00140
00141 HIDReport_GLOBAL_REPORTSIZE + 1, 1,
00142 HIDReport_GLOBAL_REPORTCOUNT + 1, 8,
00143 HIDReport_GLOBAL_USAGEPAGE + 1, HIDKeypad_PAGEID,
00144 HIDReport_LOCAL_USAGEMINIMUM + 1,
00145 HIDDKeyboardDescriptors_FIRSTMODIFIERKEY,
00146 HIDReport_LOCAL_USAGEMAXIMUM + 1,
00147 HIDDKeyboardDescriptors_LASTMODIFIERKEY,
00148 HIDReport_GLOBAL_LOGICALMINIMUM + 1, 0,
00149 HIDReport_GLOBAL_LOGICALMAXIMUM + 1, 1,
00150 HIDReport_INPUT + 1, HIDReport_VARIABLE,
00151
00152
00153 HIDReport_GLOBAL_REPORTCOUNT + 1, 3,
00154 HIDReport_GLOBAL_REPORTSIZE + 1, 8,
00155 HIDReport_GLOBAL_LOGICALMINIMUM + 1,
00156 HIDDKeyboardDescriptors_FIRSTSTANDARDKEY,
00157 HIDReport_GLOBAL_LOGICALMAXIMUM + 1,
00158 HIDDKeyboardDescriptors_LASTSTANDARDKEY,
00159 HIDReport_GLOBAL_USAGEPAGE + 1, HIDKeypad_PAGEID,
00160 HIDReport_LOCAL_USAGEMINIMUM + 1,
00161 HIDDKeyboardDescriptors_FIRSTSTANDARDKEY,
00162 HIDReport_LOCAL_USAGEMAXIMUM + 1,
00163 HIDDKeyboardDescriptors_LASTSTANDARDKEY,
00164 HIDReport_INPUT + 1, 0 ,
00165
00166
00167 HIDReport_GLOBAL_REPORTCOUNT + 1, 3,
00168 HIDReport_GLOBAL_REPORTSIZE + 1, 1,
00169 HIDReport_GLOBAL_USAGEPAGE + 1, HIDLeds_PAGEID,
00170 HIDReport_GLOBAL_LOGICALMINIMUM + 1, 0,
00171 HIDReport_GLOBAL_LOGICALMAXIMUM + 1, 1,
00172 HIDReport_LOCAL_USAGEMINIMUM + 1, HIDLeds_NUMLOCK,
00173 HIDReport_LOCAL_USAGEMAXIMUM + 1, HIDLeds_SCROLLLOCK,
00174 HIDReport_OUTPUT + 1, HIDReport_VARIABLE,
00175
00176
00177 HIDReport_GLOBAL_REPORTCOUNT + 1, 1,
00178 HIDReport_GLOBAL_REPORTSIZE + 1, 5,
00179 HIDReport_OUTPUT + 1, HIDReport_CONSTANT,
00180
00181 HIDReport_ENDCOLLECTION
00182 };
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 static void HIDDKeyboard_ReportReceived(void)
00194 {
00195 HIDDKeyboardOutputReport *pOut = &outputReport.sReport;
00196
00197
00198 if ((void *)HIDDKeyboardCallbacks_LedsChanged != NULL) {
00199 HIDDKeyboardCallbacks_LedsChanged(
00200 pOut->numLockStatus,
00201 pOut->capsLockStatus,
00202 pOut->scrollLockStatus);
00203 }
00204 }
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 void HIDDKeyboard_Initialize(USBDDriver *pUsbd, uint8_t bInterfaceNb)
00217 {
00218 HIDDKeyboard *pKbd = &hiddKeyboard;
00219 HIDDFunction *pHidd = &pKbd->hidDrv;
00220
00221
00222 pKbd->inputReports[0] = (HIDDReport *)&inputReport;
00223 HIDDFunction_InitializeReport(pKbd->inputReports[0],
00224 sizeof(HIDDKeyboardInputReport),
00225 0,
00226 0, 0);
00227
00228 pKbd->outputReports[0] = (HIDDReport *)&outputReport;
00229 HIDDFunction_InitializeReport(
00230 pKbd->outputReports[0],
00231 sizeof(HIDDKeyboardOutputReport),
00232 0,
00233 (HIDDReportEventCallback)HIDDKeyboard_ReportReceived, 0);
00234
00235
00236 HIDDFunction_Initialize(pHidd,
00237 pUsbd, bInterfaceNb,
00238 hiddKeyboardReportDescriptor,
00239 pKbd->inputReports, 1,
00240 pKbd->outputReports, 1);
00241 }
00242
00243
00244
00245
00246
00247
00248
00249 void HIDDKeyboard_ConfigureFunction(USBGenericDescriptor *pDescriptors,
00250 uint16_t wLength)
00251 {
00252 HIDDKeyboard *pKbd = &hiddKeyboard;
00253 HIDDFunction *pHidd = &pKbd->hidDrv;
00254 pDescriptors = pDescriptors; wLength = wLength;
00255 HIDDFunction_ParseInterface(pHidd,
00256 pDescriptors,
00257 wLength);
00258
00259
00260 HIDDFunction_StartPollingOutputs(pHidd);
00261 }
00262
00263
00264
00265
00266
00267
00268 uint32_t HIDDKeyboard_RequestHandler(const USBGenericRequest *request)
00269 {
00270 HIDDKeyboard *pKbd = &hiddKeyboard;
00271 HIDDFunction *pHidd = &pKbd->hidDrv;
00272
00273 TRACE_INFO_WP("Kbd ");
00274
00275
00276 return HIDDFunction_RequestHandler(pHidd, request);
00277 }
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294 uint32_t HIDDKeyboard_ChangeKeys(uint8_t *pressedKeys,
00295 uint8_t pressedKeysSize,
00296 uint8_t *releasedKeys,
00297 uint8_t releasedKeysSize)
00298 {
00299 HIDDKeyboard *pKbd = &hiddKeyboard;
00300 HIDDFunction *pHidd = &pKbd->hidDrv;
00301 HIDDKeyboardInputReport *pReport =
00302 (HIDDKeyboardInputReport *)pKbd->inputReports[0]->bData;
00303
00304
00305 while (pressedKeysSize > 0) {
00306
00307
00308 if (HIDKeypad_IsModifierKey(*pressedKeys)) {
00309
00310
00311 HIDDKeyboardInputReport_PressModifierKey(
00312 pReport,
00313 *pressedKeys);
00314 } else {
00315
00316 HIDDKeyboardInputReport_PressStandardKey(
00317 pReport,
00318 *pressedKeys);
00319 }
00320
00321 pressedKeysSize--;
00322 pressedKeys++;
00323 }
00324
00325
00326 while (releasedKeysSize > 0) {
00327
00328
00329 if (HIDKeypad_IsModifierKey(*releasedKeys)) {
00330
00331
00332 HIDDKeyboardInputReport_ReleaseModifierKey(
00333 pReport,
00334 *releasedKeys);
00335 } else {
00336
00337 HIDDKeyboardInputReport_ReleaseStandardKey(
00338 pReport,
00339 *releasedKeys);
00340 }
00341
00342 releasedKeysSize--;
00343 releasedKeys++;
00344 }
00345
00346
00347 return USBD_Write(pHidd->bPipeIN,
00348 pReport,
00349 sizeof(HIDDKeyboardInputReport),
00350 0,
00351 0);
00352 }
00353
00354
00355
00356
00357
00358 void HIDDKeyboard_RemoteWakeUp(void)
00359 {
00360 HIDDKeyboard *pKbd = &hiddKeyboard;
00361 HIDDFunction *pHidd = &pKbd->hidDrv;
00362 USBDDriver *pUsbd = pHidd->pUsbd;
00363
00364
00365 if (USBDDriver_IsRemoteWakeUpEnabled(pUsbd))
00366 USBD_RemoteWakeUp();
00367 }
00368
00369