📄 lh7a400_evb_keyboard_driver.c
字号:
if (caps_lock)
scanned_key.decoded.c = 'j';
else
scanned_key.decoded.c = 'J';
else
if (caps_lock)
scanned_key.decoded.c = 'J';
else
scanned_key.decoded.c = 'j';
else if (row & KB_SLASH_KEY)
if (num_lock)
scanned_key.decoded.c = '/';
else if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
scanned_key.decoded.c = '?';
else
scanned_key.decoded.c = '/';
else if (row & KB_LEFT_KEY)
{
if (scanned_key.decoded.fn)
scanned_key.decoded.c = KB_HOME;
else
scanned_key.decoded.c = KB_LEFT;
}
break;
case 5:
if (row & KB_X_KEY)
if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
if (caps_lock)
scanned_key.decoded.c = 'x';
else
scanned_key.decoded.c = 'X';
else
if (caps_lock)
scanned_key.decoded.c = 'X';
else
scanned_key.decoded.c = 'x';
else if (row & KB_C_KEY)
if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
if (caps_lock)
scanned_key.decoded.c = 'c';
else
scanned_key.decoded.c = 'C';
else
if (caps_lock)
scanned_key.decoded.c = 'C';
else
scanned_key.decoded.c = 'c';
else if (row & KB_V_KEY)
if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
if (caps_lock)
scanned_key.decoded.c = 'v';
else
scanned_key.decoded.c = 'V';
else
if (caps_lock)
scanned_key.decoded.c = 'V';
else
scanned_key.decoded.c = 'v';
else if (row & KB_B_KEY)
if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
if (caps_lock)
scanned_key.decoded.c = 'b';
else
scanned_key.decoded.c = 'B';
else
if (caps_lock)
scanned_key.decoded.c = 'B';
else
scanned_key.decoded.c = 'b';
else if (row & KB_N_KEY)
if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
if (caps_lock)
scanned_key.decoded.c = 'n';
else
scanned_key.decoded.c = 'N';
else
if (caps_lock)
scanned_key.decoded.c = 'N';
else
scanned_key.decoded.c = 'n';
else if (row & KB_M_KEY)
if (num_lock)
scanned_key.decoded.c = '0';
else if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
if (caps_lock)
scanned_key.decoded.c = 'm';
else
scanned_key.decoded.c = 'M';
else
if (caps_lock)
scanned_key.decoded.c = 'M';
else
scanned_key.decoded.c = 'm';
else if (row & KB_PERIOD_KEY)
if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
scanned_key.decoded.c = '>';
else
scanned_key.decoded.c = '.';
else if (row & KB_COMMA_KEY)
if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
scanned_key.decoded.c = '<';
else
scanned_key.decoded.c = ',';
else if (row & KB_SPACE_KEY)
scanned_key.decoded.c = ' ';
break;
case 6:
if (row & KB_THREE_KEY)
if (scanned_key.decoded.fn)
scanned_key.decoded.c = KB_PF3;
else if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
scanned_key.decoded.c = '#';
else
scanned_key.decoded.c = '3';
else if (row & KB_FOUR_KEY)
{
if (scanned_key.decoded.fn)
scanned_key.decoded.c = KB_PF4;
else if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
scanned_key.decoded.c = '$';
else
scanned_key.decoded.c = '4';
}
else if (row & KB_FOUR_KEY)
if (scanned_key.decoded.fn)
scanned_key.decoded.c = KB_PF4;
else if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
scanned_key.decoded.c = '$';
else
scanned_key.decoded.c = '4';
else if (row & KB_FIVE_KEY)
if (scanned_key.decoded.fn)
scanned_key.decoded.c = KB_PF5;
else if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
scanned_key.decoded.c = '%';
else
scanned_key.decoded.c = '5';
else if (row & KB_SIX_KEY)
if (scanned_key.decoded.fn)
scanned_key.decoded.c = KB_PF6;
else if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
scanned_key.decoded.c = '^';
else
scanned_key.decoded.c = '6';
else if (row & KB_SEVEN_KEY)
if (scanned_key.decoded.fn)
scanned_key.decoded.c = KB_PF7;
else if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
scanned_key.decoded.c = '&';
else
scanned_key.decoded.c = '7';
else if (row & KB_EIGHT_KEY)
if (scanned_key.decoded.fn)
scanned_key.decoded.c = KB_PF8;
else if (scanned_key.decoded.left_shift ||
scanned_key.decoded.right_shift)
scanned_key.decoded.c = '*';
else
scanned_key.decoded.c = '8';
else if (row & KB_PROG_KEY)
scanned_key.decoded.c = KB_PROG;
else if (row & KB_RIGHT_KEY)
{
if (scanned_key.decoded.fn)
scanned_key.decoded.c = KB_END;
else
scanned_key.decoded.c = KB_RIGHT;
}
break;
default:
/* should never get here */
for (;; )
;
break;
}
if (scanned_key.raw != previous_key.raw)
{
/* then a new button is pressed */
previous_key.raw = scanned_key.raw;
LH7A400_enqueue_key(previous_key);
}
/* else previous key is still being held */
/* start scanning again */
goto_control_button_scan_state();
}
timer_start(KB_KEYBOARD_TIMER);
}
/**********************************************************************
*
* Function: goto_debounce_state
*
* Purpose:
* Set up keyboard driver for debounce state
*
* Processing:
* Set all column drivers high.
* setup timer for polling wait interval. Install debounce state timer
* interrupt handler. start timer.
*
* Parameters: None
*
* Outputs: None
*
* Returns: Nothing
*
* Notes:
* Enter this state with timer stopped and set for periodic mode
*
**********************************************************************/
static void goto_debounce_state(void)
{
/* else still holding previous keys; wait and re-scan */
gpio_keyscan_set(GPIO_KSCAN_ALL_HIGH);
timer_set_delay(KB_KEYBOARD_TIMER, KB_POLL_INTERVAL);
timer_irq_setup(KB_KEYBOARD_TIMER,
KB_KEYBOARD_PRIORITY,
debounce_state_handler);
timer_start(KB_KEYBOARD_TIMER);
}
/**********************************************************************
*
* Function: goto_poll_state
*
* Purpose:
* Set up keyboard driver for poll state
*
* Processing:
* clear previous key state.
* Set all column drivers high.
* setup timer for polling wait interval. Install Poll state timer
* interrupt handler. start timer.
*
* Parameters: None
*
* Outputs: None
*
* Returns: Nothing
*
* Notes:
* Enter this state with timer stopped and set for periodic mode
*
**********************************************************************/
static void goto_poll_state(void)
{
previous_key.raw = 0;
gpio_keyscan_set(GPIO_KSCAN_ALL_HIGH);
timer_set_delay(KB_KEYBOARD_TIMER, KB_POLL_INTERVAL);
timer_irq_setup(KB_KEYBOARD_TIMER,
KB_KEYBOARD_PRIORITY,
poll_state_handler);
timer_start(KB_KEYBOARD_TIMER);
}
/**********************************************************************
*
* Function: LH7A400_init_kb_driver
*
* Purpose:
* Implement Initial State of keyboard driver state machine
*
* Processing:
* see module header
*
* Parameters:
* timer: Must be one of TIMER1, TIMER2 as defined in
* LH7A400_map.h
*
* Outputs: None
*
* Returns: Nothing
*
* Notes:
*
**********************************************************************/
void LH7A400_init_kb_driver(void)
{
num_lock = 0;
caps_lock = 0;
timer_init(KB_KEYBOARD_TIMER);
timer_periodic(KB_KEYBOARD_TIMER);
timer_int_clear(KB_KEYBOARD_TIMER);
timer_int_enable(KB_KEYBOARD_TIMER);
goto_poll_state();
}
/**********************************************************************
*
* Function: LH7A400_evb_kb_set_caps_lock
*
* Purpose:
* Turn caps_lock on or off
*
* Processing:
* set caps_lock to 1 if lock_on is non-zero, to 0 if lock_on is 0
*
* Parameters:
* lock_on: 0 to turn off caps_lock; non-zero to turn it on.
*
* Outputs: None
*
* Returns: Nothing
*
* Notes:
*
**********************************************************************/
void LH7A400_evb_kb_set_caps_lock(INT_32 lock_on)
{
caps_lock = (lock_on != 0);
}
/**********************************************************************
*
* Function: LH7A400_evb_kb_caps_lock_is_on
*
* Purpose:
* return the state of caps_lock
*
* Processing: n/a
*
* Parameters: none
*
* Outputs: None
*
* Returns:
* 1 if caps_lock is on, 0 if caps_lock is off.
*
* Notes:
*
**********************************************************************/
INT_32 LH7A400_evb_kb_caps_lock_is_on(void)
{
return (caps_lock != 0);
}
/**********************************************************************
*
* Function: LH7A400_evb_kb_set_num_lock
*
* Purpose:
* Turn num_lock on or off
*
* Processing:
* set num_lock to 1 if lock_on is non-zero, to 0 if lock_on is 0
*
* Parameters:
* lock_on: 0 to turn off num_lock; non-zero to turn it on.
*
* Outputs: None
*
* Returns: Nothing
*
* Notes:
*
**********************************************************************/
void LH7A400_evb_kb_set_num_lock(INT_32 lock_on)
{
caps_lock = (lock_on != 0);
}
/**********************************************************************
*
* Function: LH7A400_evb_kb_num_lock_is_on
*
* Purpose:
* return the state of num_lock
*
* Processing: n/a
*
* Parameters: none
*
* Outputs: None
*
* Returns:
* 1 if num_lock is on, 0 if num_lock is off.
*
* Notes:
*
**********************************************************************/
INT_32 LH7A400_evb_kb_num_lock_is_on(void)
{
return (caps_lock != 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -