/* * This gets the keys from keyboard and reports it to input subsystem */ static void matrix_keypad_scan(struct work_struct *work) { struct matrix_keypad *keypad = container_of(work, struct matrix_keypad, work.work); struct input_dev *input_dev = keypad->input_dev; const unsigned short *keycodes = input_dev->keycode; const struct matrix_keypad_platform_data *pdata = keypad->pdata; uint32_t new_state[MATRIX_MAX_COLS]; int row, col, code; /* de-activate all columns for scanning */ activate_all_cols(pdata, false); memset(new_state, 0, sizeof(new_state)); /* assert each column and read the row status out */ for (col = 0; col < pdata->num_col_gpios; col++) { activate_col(pdata, col, true); for (row = 0; row < pdata->num_row_gpios; row++) new_state[col] |= row_asserted(pdata, row) ? (1 << row) : 0; activate_col(pdata, col, false); } for (col = 0; col < pdata->num_col_gpios; col++) { uint32_t bits_changed; bits_changed = keypad->last_key_state[col] ^ new_state[col]; if (bits_changed == 0) continue; for (row = 0; row < pdata->num_row_gpios; row++) { if ((bits_changed & (1 << row)) == 0) continue; code = MATRIX_SCAN_CODE(row, col, keypad->row_shift); input_event(input_dev, EV_MSC, MSC_SCAN, code); input_report_key(input_dev, keycodes[code], new_state[col] & (1 << row)); } } input_sync(input_dev); memcpy(keypad->last_key_state, new_state, sizeof(new_state)); activate_all_cols(pdata, true); /* Enable IRQs again */ spin_lock_irq(&keypad->lock); keypad->scan_pending = false; enable_row_irqs(keypad); spin_unlock_irq(&keypad->lock); }
/* * This gets the keys from keyboard and reports it to input subsystem */ static void matrix_keypad_scan(struct work_struct *work) { struct matrix_keypad *keypad = container_of(work, struct matrix_keypad, work.work); struct input_dev *input_dev = keypad->input_dev; const struct matrix_keypad_platform_data *pdata = keypad->pdata; uint32_t new_state[MATRIX_MAX_COLS]; int row, col, code; /* de-activate all columns for scanning */ activate_all_cols(pdata, false); memset(new_state, 0, sizeof(new_state)); /* assert each column and read the row status out */ for (col = 0; col < pdata->num_col_gpios; col++) { activate_col(pdata, col, true); for (row = 0; row < pdata->num_row_gpios; row++) new_state[col] |= row_asserted(pdata, row) ? (1 << row) : 0; activate_col(pdata, col, false); } for (col = 0; col < pdata->num_col_gpios; col++) { uint32_t bits_changed; bits_changed = keypad->last_key_state[col] ^ new_state[col]; if (bits_changed == 0) continue; for (row = 0; row < pdata->num_row_gpios; row++) { if ((bits_changed & (1 << row)) == 0) continue; code = MATRIX_SCAN_CODE(row, col, keypad->row_shift); input_event(input_dev, EV_MSC, MSC_SCAN, code); #ifdef CONFIG_SEC_PATEK_PROJECT pr_info("%s: [key] [%d:%d] %x, %s\n",__func__,row,col, (new_state[col] & ( 1 << row )), !(!(new_state[col] & (1 << row))) ? "pressed" : "released"); if(!(!(new_state[col] & (1 << row)))){ check_key_press++; }else{ check_key_press--; } #endif input_report_key(input_dev, keypad->keycodes[code], new_state[col] & (1 << row)); } } input_sync(input_dev); memcpy(keypad->last_key_state, new_state, sizeof(new_state)); activate_all_cols(pdata, true); mutex_lock(&keypad->lock); keypad->scan_pending = false; enable_row_irqs(keypad); mutex_unlock(&keypad->lock); }