| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #ifndef KEYCONTROL_ENCODING_H
- #define KEYCONTROL_ENCODING_H
- #include <stdint.h> // uint32_t
- // -----------------------------------------------------------------------------
- // KeySwitch LowLevel Control Word Encoding in 32-bit unsigned integer
- // -----------------------------------------------------------------------------
- // There two modes supported - parallel control and serial control.
- // Only one mode can be selected in single template.
- //
- #define CONTROL_TYPE_REGISTER_1 (1UL<<31)
- #define CONTROL_TYPE_REGISTER_2 (1UL<<30)
- #define CONTROL_TYPE_REGISTER_1_2 (3UL<<30)
- #define CONTROL_TYPE_PARALLEL (0UL<<30)
- // -----------------------------------------------------------------------------
- // Check if the control code uses parallel control
- //
- #define CHECK_CONTROL_TYPE_PARALLEL( u32code ) (! ((u32code) & CONTROL_TYPE_REGISTER_1_2 ))
- // Check if the control code uses serial control
- //
- #define CHECK_CONTROL_TYPE_REGISTER( u32code ) ( ((u32code) & CONTROL_TYPE_REGISTER_1_2 ))
- // -----------------------------------------------------------------------------
- #define CHECK_CONTROL_REGISTER_1( u32code ) ( ((u32code) & CONTROL_TYPE_REGISTER_1 ))
- #define CHECK_CONTROL_REGISTER_2( u32code ) ( ((u32code) & CONTROL_TYPE_REGISTER_2 ))
- // -----------------------------------------------------------------------------
- // Extract the Register 1 control code
- //
- #define GET_CONTROL_REGISTER_1( u32code ) ( ((u32code) & 0x00FF ) >> 0 )
- // Extract the Register 2 control code
- //
- #define GET_CONTROL_REGISTER_2( u32code ) ( ((u32code) & 0xFF00 ) >> 8 )
- // Extract the ENABLE contol pin state
- //
- #define GET_CONTROL_ENABLEPIN( u32code ) ( ((u32code) & 0x10000 ))
- // Packing the control word into the 32-bit unsigned integer
- //
- #define MAKE_KEYSTATE_CONTROL( TYPE, A_8bit, B_8bit, C_8bit, D_6bit ) ((uint32_t)( \
- ((A_8bit) & 0x000000FF) << 0\
- |\
- ((B_8bit) & 0x000000FF) << 8\
- |\
- ((C_8bit) & 0x000000FF) << 16\
- |\
- ((D_6bit) & 0x0000007F) << 24\
- |\
- ((TYPE) & 0x80000000) \
- ))
- // Create KeySwitch control template using serial control (Register 1)
- //
- #define MAKE_KEYSTATE_REGISTER_1( REG1, EN ) \
- MAKE_KEYSTATE_CONTROL( CONTROL_TYPE_REGISTER_1, \
- ((REG1)&0xFF),\
- 0x00,\
- ((EN)&0x1),\
- 0x00 )
- // Create KeySwitch control template using serial control (Register 2)
- //
- #define MAKE_KEYSTATE_REGISTER_2( REG2, EN ) \
- MAKE_KEYSTATE_CONTROL( CONTROL_TYPE_REGISTER_2, \
- 0x00,\
- ((REG2)&0xFF),\
- ((EN)&0x1),\
- 0x00 )
- // Create KeySwitch control template using serial control (Registers 1 and 2)
- //
- #define MAKE_KEYSTATE_REGISTER_1_2( REG1, REG2, EN ) \
- MAKE_KEYSTATE_CONTROL( CONTROL_TYPE_REGISTER_1_2, \
- ((REG1)&0xFF),\
- ((REG2)&0xFF),\
- ((EN)&0x1),\
- 0x00 )
- // Create KeySwitch control template using parallel control
- //
- #define MAKE_KEYSTATE_PARALLEL( REG1, REG2, REG3, REG4 ) \
- MAKE_KEYSTATE_CONTROL( CONTROL_TYPE_PARALLEL, \
- ((REG1)&0xFF),\
- ((REG2)&0xFF),\
- ((REG3)&0xFF),\
- ((REG4)&0x3F) )
- #endif
|