forked from PAWPAW-Mirror/lib_xua
Safety commit. Builds but not run.
This commit is contained in:
@@ -18,26 +18,37 @@ static size_t hidReportDescriptorLength = 0;
|
|||||||
static unsigned hidReportDescriptorPrepared = 0;
|
static unsigned hidReportDescriptorPrepared = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the bit position from the location of an Item
|
* @brief Get the bit position from the location of a report element
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
*
|
*
|
||||||
* @param[in] location The \c location field from a \c USB_HID_Short_Item
|
* @param[in] location The \c location field from a \c USB_HID_Report_Element_t
|
||||||
*
|
*
|
||||||
* @return The bit position of the Item
|
* @return The bit position of the report element
|
||||||
*/
|
*/
|
||||||
static unsigned hidGetItemBitLocation( const unsigned char header );
|
static unsigned hidGetElementBitLocation( const unsigned short location );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the byte position from the location of an Item
|
* @brief Get the byte position from the location of a report element
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
*
|
*
|
||||||
* @param[in] location The \c location field from a \c USB_HID_Short_Item
|
* @param[in] location The \c location field from a \c USB_HID_Report_Element_t
|
||||||
*
|
*
|
||||||
* @return The byte position of the Item within the HID Report
|
* @return The byte position of the report element within the HID report
|
||||||
*/
|
*/
|
||||||
static unsigned hidGetItemByteLocation( const unsigned char header );
|
static unsigned hidGetElementByteLocation( const unsigned short location );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the report identifier from the location of a report element
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
*
|
||||||
|
* @param[in] location The \c location field from a \c USB_HID_Report_Element_t
|
||||||
|
*
|
||||||
|
* @return The report id of the report element within the HID report
|
||||||
|
*/
|
||||||
|
static unsigned hidGetElementReportId( const unsigned short location );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the number of data bytes from the header of an Item
|
* @brief Get the number of data bytes from the header of an Item
|
||||||
@@ -98,18 +109,24 @@ static unsigned hidGetUsagePage( const unsigned id );
|
|||||||
static size_t hidTranslateItem( const USB_HID_Short_Item_t* inPtr, unsigned char** outPtrPtr );
|
static size_t hidTranslateItem( const USB_HID_Short_Item_t* inPtr, unsigned char** outPtrPtr );
|
||||||
|
|
||||||
|
|
||||||
static unsigned hidGetItemBitLocation( const unsigned char location )
|
static unsigned hidGetElementBitLocation( const unsigned short location )
|
||||||
{
|
{
|
||||||
unsigned bBit = ( location & HID_REPORT_ITEM_LOC_BIT_MASK ) >> HID_REPORT_ITEM_LOC_BIT_SHIFT;
|
unsigned bBit = ( location & HID_REPORT_ELEMENT_LOC_BIT_MASK ) >> HID_REPORT_ELEMENT_LOC_BIT_SHIFT;
|
||||||
return bBit;
|
return bBit;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned hidGetItemByteLocation( const unsigned char location )
|
static unsigned hidGetElementByteLocation( const unsigned short location )
|
||||||
{
|
{
|
||||||
unsigned bByte = ( location & HID_REPORT_ITEM_LOC_BYTE_MASK ) >> HID_REPORT_ITEM_LOC_BYTE_SHIFT;
|
unsigned bByte = ( location & HID_REPORT_ELEMENT_LOC_BYTE_MASK ) >> HID_REPORT_ELEMENT_LOC_BYTE_SHIFT;
|
||||||
return bByte;
|
return bByte;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned hidGetElementReportId( const unsigned short location )
|
||||||
|
{
|
||||||
|
unsigned bReportId = ( location & HID_REPORT_ELEMENT_LOC_ID_MASK ) >> HID_REPORT_ELEMENT_LOC_ID_SHIFT;
|
||||||
|
return bReportId;
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned hidGetItemSize( const unsigned char header )
|
static unsigned hidGetItemSize( const unsigned char header )
|
||||||
{
|
{
|
||||||
unsigned bSize = ( header & HID_REPORT_ITEM_HDR_SIZE_MASK ) >> HID_REPORT_ITEM_HDR_SIZE_SHIFT;
|
unsigned bSize = ( header & HID_REPORT_ITEM_HDR_SIZE_MASK ) >> HID_REPORT_ITEM_HDR_SIZE_SHIFT;
|
||||||
@@ -145,7 +162,7 @@ size_t hidGetReportDescriptorLength( void )
|
|||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define HID_CONFIGURABLE_ITEM_COUNT ( sizeof hidConfigurableItems / sizeof ( USB_HID_Short_Item_t* ))
|
#define HID_CONFIGURABLE_ELEMENT_COUNT ( sizeof hidConfigurableElements / sizeof ( USB_HID_Report_Element_t* ))
|
||||||
unsigned hidGetReportItem(
|
unsigned hidGetReportItem(
|
||||||
const unsigned id,
|
const unsigned id,
|
||||||
const unsigned byte,
|
const unsigned byte,
|
||||||
@@ -156,17 +173,17 @@ unsigned hidGetReportItem(
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
unsigned retVal = HID_STATUS_BAD_LOCATION;
|
unsigned retVal = HID_STATUS_BAD_LOCATION;
|
||||||
for( unsigned itemIdx = 0; itemIdx < HID_CONFIGURABLE_ITEM_COUNT; ++itemIdx ) {
|
for( unsigned elementIdx = 0; elementIdx < HID_CONFIGURABLE_ELEMENT_COUNT; ++elementIdx ) {
|
||||||
USB_HID_Short_Item_t item = *hidConfigurableItems[ itemIdx ];
|
USB_HID_Report_Element_t element = *hidConfigurableElements[ elementIdx ];
|
||||||
unsigned bBit = hidGetItemBitLocation( item.location );
|
unsigned bBit = hidGetElementBitLocation( element.location );
|
||||||
unsigned bByte = hidGetItemByteLocation( item.location );
|
unsigned bByte = hidGetElementByteLocation( element.location );
|
||||||
|
|
||||||
if(( bit == bBit ) && ( byte == bByte )) {
|
if(( bit == bBit ) && ( byte == bByte )) { // TODO Add check for Report ID
|
||||||
*page = hidGetUsagePage( byte );
|
*page = hidGetUsagePage( byte );
|
||||||
*header = item.header;
|
*header = element.item.header;
|
||||||
|
|
||||||
for( unsigned dataIdx = 0; dataIdx < HID_REPORT_ITEM_MAX_SIZE; ++data, ++dataIdx ) {
|
for( unsigned dataIdx = 0; dataIdx < HID_REPORT_ITEM_MAX_SIZE; ++data, ++dataIdx ) {
|
||||||
*data = item.data[ dataIdx ];
|
*data = element.item.data[ dataIdx ];
|
||||||
}
|
}
|
||||||
|
|
||||||
retVal = HID_STATUS_GOOD;
|
retVal = HID_STATUS_GOOD;
|
||||||
@@ -186,8 +203,8 @@ static unsigned hidGetUsagePage( const unsigned id )
|
|||||||
{
|
{
|
||||||
unsigned retVal = 0U;
|
unsigned retVal = 0U;
|
||||||
for( unsigned idx = 0; idx < 1; ++idx) { // TODO Fix the upper limit!
|
for( unsigned idx = 0; idx < 1; ++idx) { // TODO Fix the upper limit!
|
||||||
if( id == hidUsagePages[ idx ]->id ) {
|
if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
|
||||||
retVal = hidUsagePages[ idx ]->data[ 0 ];
|
retVal = hidReports[ idx ]->item.data[ 0 ];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -234,26 +251,26 @@ unsigned hidSetReportItem(
|
|||||||
( HID_REPORT_ITEM_USAGE_TYPE != bType )) {
|
( HID_REPORT_ITEM_USAGE_TYPE != bType )) {
|
||||||
retVal = HID_STATUS_BAD_HEADER;
|
retVal = HID_STATUS_BAD_HEADER;
|
||||||
} else {
|
} else {
|
||||||
for( unsigned itemIdx = 0; itemIdx < HID_CONFIGURABLE_ITEM_COUNT; ++itemIdx ) {
|
for( unsigned elementIdx = 0; elementIdx < HID_CONFIGURABLE_ELEMENT_COUNT; ++elementIdx ) {
|
||||||
USB_HID_Short_Item_t item = *hidConfigurableItems[ itemIdx ];
|
USB_HID_Report_Element_t element = *hidConfigurableElements[ elementIdx ];
|
||||||
unsigned bBit = hidGetItemBitLocation( item.location );
|
unsigned bBit = hidGetElementBitLocation( element.location );
|
||||||
unsigned bByte = hidGetItemByteLocation( item.location );
|
unsigned bByte = hidGetElementByteLocation( element.location );
|
||||||
|
|
||||||
if(( bit == bBit ) && ( byte == bByte )) {
|
if(( bit == bBit ) && ( byte == bByte )) { // TODO Add check for Report ID
|
||||||
unsigned pg = hidGetUsagePage( byte );
|
unsigned pg = hidGetUsagePage( byte );
|
||||||
|
|
||||||
if( page == pg ) {
|
if( page == pg ) {
|
||||||
item.header = header;
|
element.item.header = header;
|
||||||
|
|
||||||
for( unsigned dataIdx = 0; dataIdx < bSize; ++dataIdx ) {
|
for( unsigned dataIdx = 0; dataIdx < bSize; ++dataIdx ) {
|
||||||
item.data[ dataIdx ] = data[ dataIdx ];
|
element.item.data[ dataIdx ] = data[ dataIdx ];
|
||||||
}
|
}
|
||||||
|
|
||||||
for( unsigned dataIdx = bSize; dataIdx < HID_REPORT_ITEM_MAX_SIZE; ++dataIdx ) {
|
for( unsigned dataIdx = bSize; dataIdx < HID_REPORT_ITEM_MAX_SIZE; ++dataIdx ) {
|
||||||
item.data[ dataIdx ] = 0;
|
element.item.data[ dataIdx ] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*hidConfigurableItems[ itemIdx ] = item;
|
*hidConfigurableElements[ elementIdx ] = element;
|
||||||
retVal = HID_STATUS_GOOD;
|
retVal = HID_STATUS_GOOD;
|
||||||
} else {
|
} else {
|
||||||
retVal = HID_STATUS_BAD_PAGE;
|
retVal = HID_STATUS_BAD_PAGE;
|
||||||
|
|||||||
@@ -18,35 +18,47 @@
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#define HID_REPORT_ITEM_HDR_SIZE_MASK ( 0x03 )
|
#define HID_REPORT_ITEM_HDR_SIZE_MASK ( 0x03 )
|
||||||
#define HID_REPORT_ITEM_HDR_SIZE_SHIFT ( 0 )
|
#define HID_REPORT_ITEM_HDR_SIZE_SHIFT ( 0 )
|
||||||
|
|
||||||
#define HID_REPORT_ITEM_HDR_TAG_MASK ( 0xF0 )
|
#define HID_REPORT_ITEM_HDR_TAG_MASK ( 0xF0 )
|
||||||
#define HID_REPORT_ITEM_HDR_TAG_SHIFT ( 4 )
|
#define HID_REPORT_ITEM_HDR_TAG_SHIFT ( 4 )
|
||||||
|
|
||||||
#define HID_REPORT_ITEM_HDR_TYPE_MASK ( 0x0C )
|
#define HID_REPORT_ITEM_HDR_TYPE_MASK ( 0x0C )
|
||||||
#define HID_REPORT_ITEM_HDR_TYPE_SHIFT ( 2 )
|
#define HID_REPORT_ITEM_HDR_TYPE_SHIFT ( 2 )
|
||||||
|
|
||||||
#define HID_REPORT_ITEM_LOC_BIT_MASK ( 0x70 )
|
#define HID_REPORT_ELEMENT_LOC_BIT_MASK ( 0x0070 )
|
||||||
#define HID_REPORT_ITEM_LOC_BIT_SHIFT ( 4 )
|
#define HID_REPORT_ELEMENT_LOC_BIT_SHIFT ( 4 )
|
||||||
|
|
||||||
#define HID_REPORT_ITEM_LOC_BYTE_MASK ( 0x0F )
|
#define HID_REPORT_ELEMENT_LOC_BYTE_MASK ( 0x000F )
|
||||||
#define HID_REPORT_ITEM_LOC_BYTE_SHIFT ( 0 )
|
#define HID_REPORT_ELEMENT_LOC_BYTE_SHIFT ( 0 )
|
||||||
|
|
||||||
#define HID_REPORT_ITEM_MAX_SIZE ( 2 )
|
#define HID_REPORT_ELEMENT_LOC_ID_MASK ( 0xF000 )
|
||||||
|
#define HID_REPORT_ELEMENT_LOC_ID_SHIFT ( 12 )
|
||||||
|
|
||||||
#define HID_REPORT_ITEM_USAGE_TAG ( 0 )
|
#define HID_REPORT_ELEMENT_LOC_LEN_MASK ( 0x0F00 )
|
||||||
#define HID_REPORT_ITEM_USAGE_TYPE ( 2 )
|
#define HID_REPORT_ELEMENT_LOC_LEN_SHIFT ( 8 )
|
||||||
|
|
||||||
#define HID_STATUS_GOOD ( 0 )
|
#define HID_REPORT_ITEM_MAX_SIZE ( 2 )
|
||||||
#define HID_STATUS_BAD_HEADER ( 1 )
|
|
||||||
#define HID_STATUS_BAD_ID ( 2 )
|
#define HID_REPORT_ITEM_USAGE_TAG ( 0 )
|
||||||
#define HID_STATUS_BAD_LOCATION ( 3 )
|
#define HID_REPORT_ITEM_USAGE_TYPE ( 2 )
|
||||||
#define HID_STATUS_BAD_PAGE ( 4 )
|
|
||||||
#define HID_STATUS_IN_USE ( 5 )
|
#define HID_REPORT_SET_LOC(id, len, byte, bit) (\
|
||||||
|
(( id << HID_REPORT_ELEMENT_LOC_ID_SHIFT ) & HID_REPORT_ELEMENT_LOC_ID_MASK ) | \
|
||||||
|
(( len << HID_REPORT_ELEMENT_LOC_LEN_SHIFT ) & HID_REPORT_ELEMENT_LOC_LEN_MASK ) | \
|
||||||
|
(( byte << HID_REPORT_ELEMENT_LOC_BYTE_SHIFT ) & HID_REPORT_ELEMENT_LOC_BYTE_MASK ) | \
|
||||||
|
(( bit << HID_REPORT_ELEMENT_LOC_BIT_SHIFT ) & HID_REPORT_ELEMENT_LOC_BIT_MASK ))
|
||||||
|
|
||||||
|
#define HID_STATUS_GOOD ( 0 )
|
||||||
|
#define HID_STATUS_BAD_HEADER ( 1 )
|
||||||
|
#define HID_STATUS_BAD_ID ( 2 )
|
||||||
|
#define HID_STATUS_BAD_LOCATION ( 3 )
|
||||||
|
#define HID_STATUS_BAD_PAGE ( 4 )
|
||||||
|
#define HID_STATUS_IN_USE ( 5 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief USB HID Report Descriptor. Short Item
|
* @brief USB HID Report Descriptor Short Item
|
||||||
*
|
*
|
||||||
* @note
|
* @note
|
||||||
* To reduce memory use, this type does not support Short Items with 4 data bytes.
|
* To reduce memory use, this type does not support Short Items with 4 data bytes.
|
||||||
@@ -67,10 +79,14 @@ typedef struct
|
|||||||
{
|
{
|
||||||
unsigned char header;
|
unsigned char header;
|
||||||
unsigned char data[ HID_REPORT_ITEM_MAX_SIZE ];
|
unsigned char data[ HID_REPORT_ITEM_MAX_SIZE ];
|
||||||
unsigned char id;
|
|
||||||
unsigned char location;
|
|
||||||
} USB_HID_Short_Item_t;
|
} USB_HID_Short_Item_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
USB_HID_Short_Item_t item;
|
||||||
|
unsigned short location;
|
||||||
|
} USB_HID_Report_Element_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the HID Report descriptor
|
* @brief Get the HID Report descriptor
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user