?? hiddkeyboarddriver.c
字號:
Retrieves the new value of a report from the host and saves it.
Parameters:
type - Report type.
length - Report length.
*/
static void HIDDKeyboardDriver_SetReport(unsigned char type,
unsigned short length)
{
trace_LOG(trace_INFO, "sReport ");
// Check report type
switch (type) {
case HIDReportRequest_INPUT:
// SET_REPORT requests on input reports are ignored
USBD_Stall(0);
break;
case HIDReportRequest_OUTPUT:
// Check report length
if (length != sizeof(HIDDKeyboardOutputReport)) {
USBD_Stall(0);
}
else {
USBD_Read(0, // Endpoint #0
&(hiddKeyboardDriver.outputReport),
length,
(TransferCallback) HIDDKeyboardDriver_ReportReceived,
0); // No argument to the callback function
}
break;
default:
USBD_Stall(0);
}
}
//------------------------------------------------------------------------------
// Optional RequestReceived() callback re-implementation
//------------------------------------------------------------------------------
#if !defined(NOAUTOCALLBACK)
void USBDCallbacks_RequestReceived(const USBGenericRequest *request)
{
HIDDKeyboardDriver_RequestHandler(request);
}
#endif
//------------------------------------------------------------------------------
// ConfigurationChanged() callback re-implementation
//------------------------------------------------------------------------------
void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum)
{
if (cfgnum > 0) {
// Start receiving output reports
USBD_Read(HIDDKeyboardDriverDescriptors_INTERRUPTOUT,
&(hiddKeyboardDriver.outputReport),
sizeof(HIDDKeyboardOutputReport),
(TransferCallback) HIDDKeyboardDriver_ReportReceived,
0); // No argument for callback function
}
}
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
/*
Function: HIDDKeyboardDriver_Initialize
Initializes the HID keyboard device driver.
*/
void HIDDKeyboardDriver_Initialize()
{
hiddKeyboardDriver.inputReportIdleRate = 0;
HIDDKeyboardInputReport_Initialize(&(hiddKeyboardDriver.inputReport));
HIDDKeyboardOutputReport_Initialize(&(hiddKeyboardDriver.outputReport));
USBDDriver_Initialize(&(hiddKeyboardDriver.usbdDriver),
&hiddKeyboardDriverDescriptors,
0); // Multiple interface settings not supported
USBD_Init();
}
/*
Function: HIDDKeyboardDriver_RequestHandler
Handles HID-specific SETUP request sent by the host.
Parameters:
request - Pointer to a USBGenericRequest instance.
*/
void HIDDKeyboardDriver_RequestHandler(const USBGenericRequest *request)
{
trace_LOG(trace_INFO, "NewReq ");
// Check if this is a standard request
if (USBGenericRequest_GetType(request) == USBGenericRequest_STANDARD) {
// This is a standard request
switch (USBGenericRequest_GetRequest(request)) {
case USBGenericRequest_GETDESCRIPTOR:
// Check if this is a HID descriptor, otherwise forward it to
// the standard driver
if (!HIDDKeyboardDriver_GetDescriptor(
USBGetDescriptorRequest_GetDescriptorType(request),
USBGenericRequest_GetLength(request))) {
USBDDriver_RequestHandler(&(hiddKeyboardDriver.usbdDriver),
request);
}
break;
default:
USBDDriver_RequestHandler(&(hiddKeyboardDriver.usbdDriver),
request);
}
}
// Check if this is a class request
else if (USBGenericRequest_GetType(request) == USBGenericRequest_CLASS) {
// This is a class-specific request
switch (USBGenericRequest_GetRequest(request)) {
case HIDGenericRequest_GETIDLE:
HIDDKeyboardDriver_GetIdle();
break;
case HIDGenericRequest_SETIDLE:
HIDDKeyboardDriver_SetIdle(HIDIdleRequest_GetIdleRate(request));
break;
case HIDGenericRequest_GETREPORT:
HIDDKeyboardDriver_GetReport(
HIDReportRequest_GetReportType(request),
USBGenericRequest_GetLength(request));
break;
case HIDGenericRequest_SETREPORT:
HIDDKeyboardDriver_SetReport(
HIDReportRequest_GetReportType(request),
USBGenericRequest_GetLength(request));
break;
default:
trace_LOG(trace_WARNING,
"HIDDKeyboardDriver_RequestHandler: Unknown request 0x%02X\n\r",
USBGenericRequest_GetRequest(request));
USBD_Stall(0);
}
}
else {
// Vendor request ?
USBD_Stall(0);
}
}
/*
Function: HIDDKeyboardDriver_ChangeKeys
Reports a change in which keys are currently pressed or release to the
host.
Parameters:
pressedKeys - Pointer to an array of key codes indicating keys that have
been pressed since the last call to <HIDDKeyboardDriver_ChangeKeys>.
pressedKeysSize - Number of key codes in the pressedKeys array.
releasedKeys - Pointer to an array of key codes indicates keys that have
been released since the last call to <HIDDKeyboardDriver_ChangeKeys>.
releasedKeysSize - Number of key codes in the releasedKeys array.
Returns:
<USBD_STATUS_SUCCESS> if the report has been sent to the host;
otherwise an error code.
*/
unsigned char HIDDKeyboardDriver_ChangeKeys(unsigned char *pressedKeys,
unsigned char pressedKeysSize,
unsigned char *releasedKeys,
unsigned char releasedKeysSize)
{
// Press keys
while (pressedKeysSize > 0) {
// Check if this is a standard or modifier key
if (HIDKeypad_IsModifierKey(*pressedKeys)) {
// Set the corresponding bit in the input report
HIDDKeyboardInputReport_PressModifierKey(
&(hiddKeyboardDriver.inputReport),
*pressedKeys);
}
else {
HIDDKeyboardInputReport_PressStandardKey(
&(hiddKeyboardDriver.inputReport),
*pressedKeys);
}
pressedKeysSize--;
pressedKeys++;
}
// Release keys
while (releasedKeysSize > 0) {
// Check if this is a standard or modifier key
if (HIDKeypad_IsModifierKey(*releasedKeys)) {
// Set the corresponding bit in the input report
HIDDKeyboardInputReport_ReleaseModifierKey(
&(hiddKeyboardDriver.inputReport),
*releasedKeys);
}
else {
HIDDKeyboardInputReport_ReleaseStandardKey(
&(hiddKeyboardDriver.inputReport),
*releasedKeys);
}
releasedKeysSize--;
releasedKeys++;
}
// Send input report through the interrupt IN endpoint
return USBD_Write(HIDDKeyboardDriverDescriptors_INTERRUPTIN,
&(hiddKeyboardDriver.inputReport),
sizeof(HIDDKeyboardInputReport),
0,
0);
}
//------------------------------------------------------------------------------
/// Starts a remote wake-up sequence if the host has explicitely enabled it
/// by sending the appropriate SET_FEATURE request.
//------------------------------------------------------------------------------
void HIDDKeyboardDriver_RemoteWakeUp(void)
{
// Remote wake-up has been enabled
if (USBDDriver_IsRemoteWakeUpEnabled(&(hiddKeyboardDriver.usbdDriver))) {
USBD_RemoteWakeUp();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -