luckfox-pico-sdk/sysdrv/source/mcu/rt-thread/applications/pcba_test/pcba_key.c
luckfox-eng29 8f34c2760d project:build.sh: Added fastboot support; custom modifications to U-Boot and kernel implemented using patches.
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between
the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door
for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more
usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp:
Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for
compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem.
sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device
tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately.
sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick
boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades.
sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for
fastboot.

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
2024-10-14 09:47:04 +08:00

252 lines
6.7 KiB
C

/*
* Copyright: Copyright (c) 2020 Fuzhou Rockchip Electronic Co.,Ltd
*
* License: SPDX-License-Identifier: Apache-2.0
*
* @Author: Chad.ma
* @Date: 2020-05-21 11:17:00
* @Company: Rockchip
* @LastEditTime: 2020-06-02 15:47:48
* @LastEditors: Do not edit
* @Description:
*/
#include "pcba_app.h"
#if defined(RT_USING_PCBA_TEST)
#include "drv_keyctrl.h"
#include "math.h"
#define DBG_SECTION_NAME "PCBA_KEY"
#define DBG_LEVEL DBG_INFO
#include "rtdbg.h"
#ifdef RT_USING_KEYCTRL
static rt_device_t keyctrl_dev = RT_NULL;
static char *read_buffer;
static int key_value[] =
{
0, // NONE
KEY_FUNC1, // FUN_1 press:0x01 long press: 0x08
KEY_FUNC2, // FUN_2 press:0x02 long press: 0x09
KEY_FUNC3, // FUN_3 press:0x03 long press: 0x0A
KEY_FUNC4, // FUN_4 press:0x04 long press: 0x0B
KEY_FUNC5, // FUN_5 press:0x05 long press: 0x0C
KEY_FUNC5, // FUN_6 press:0x06 long press: 0x0D
KEY_FUNC5, // FUN_7 press:0x07 long press: 0x0E
};
static int get_key_value(int rv)
{
return key_value[rv];
}
static int pcba_key_device_init()
{
rt_err_t result;
struct rt_keyctrl_info info;
keyctrl_dev = rt_device_find("keyctrl");
RT_ASSERT(keyctrl_dev != RT_NULL);
result = rt_device_control(keyctrl_dev, RT_KEYCTRL_CTRL_GET_INFO, &info);
if (result != RT_EOK)
{
LOG_E("device : %s cmd RT_KEYCTRL_CTRL_GET_INFO failed",
keyctrl_dev->parent.name);
return result;
}
read_buffer = rt_malloc(info.count);
if (read_buffer == RT_NULL)
{
LOG_E("no memory for read_buffer!");
return -RT_ENOMEM;
}
result = rt_device_init(keyctrl_dev);
if (result != RT_EOK)
{
LOG_E("To initialize device:%s failed. The error code is %d",
keyctrl_dev->parent.name, result);
return result;
}
result = rt_device_open(keyctrl_dev, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
if (result != RT_EOK)
{
LOG_E("To open device:%s failed. The error code is %d",
keyctrl_dev->parent.name, result);
return result;
}
return RT_EOK;
}
static int pcba_key_device_deinit()
{
if (read_buffer)
rt_free(read_buffer);
rt_device_close(keyctrl_dev);
return RT_EOK;
}
#endif
static void pcba_key_task(void *arg)
{
struct pcba_app_msg send_msg;
rt_err_t ret;
#ifdef RT_USING_KEYCTRL
uint32_t release_count = 0;
uint32_t key_table = 0;
pcba_key_device_init();
#else
int key_release = 1;
HAL_PINCTRL_SetIOMUX(GPIO_BANK1,
GPIO_PIN_B6,
PIN_CONFIG_MUX_FUNC0);
#endif
while (1)
{
rt_thread_delay(10);
#ifdef RT_USING_KEYCTRL
ret = rt_device_read(keyctrl_dev, 0, read_buffer, 1);
if (ret != 1)
{
/* all key release */
if (!key_table)
continue;
/* WIP the flag release_count is only for long press */
if ((key_table & 0xFF80) > 0)
{
release_count++;
if (release_count < 20)
continue;
}
int value = (int)(log(key_table) / log(2));
if (value > 7)
send_msg.value = get_key_value(value - 7) | KEY_LONG_PRESS_START | KEY_RELEASE;
else
send_msg.value = get_key_value(value) | KEY_RELEASE;
LOG_D("0x%08x release", send_msg.value);
send_msg.type = TYPE_KEY_PRESS;
// rt_mq_send(g_app_info.display_mq, (void *)&send_msg, sizeof(struct recpen_app_msg));
key_table = 0;
release_count = 0;
continue;
}
release_count = 0;
/* check if same key */
if ((key_table & (1 << read_buffer[0])) > 0)
continue;
key_table |= 1 << read_buffer[0];
if (read_buffer[0] > 7)
{
send_msg.value = get_key_value((int)read_buffer[0] - 7) | KEY_LONG_PRESS_START;
LOG_D("0x%08x TYPE_KEY_LONGPRESS", send_msg.value);
}
else
{
send_msg.value = get_key_value((int)read_buffer[0]);
LOG_D("0x%08x TYPE_KEY_PRESS", send_msg.value);
}
if (send_msg.value)
{
send_msg.type = TYPE_KEY_PRESS;
ret = rt_mq_send(g_pcba.display_mq, (void *)&send_msg, sizeof(struct pcba_app_msg));
if (ret != RT_EOK)
{
// todo
}
}
#else
if (HAL_GPIO_GetPinLevel(GPIO1, GPIO_PIN_B6) == GPIO_LOW && key_release)
{
key_release = 0;
send_msg.type = TYPE_KEY_PRESS;
send_msg.value = KEY_RECORD;
ret = rt_mq_send(g_pcba.display_mq, (void *)&send_msg, sizeof(struct pcba_app_msg));
if (ret != RT_EOK)
{
// todo
}
}
else if (HAL_GPIO_GetPinLevel(GPIO1, GPIO_PIN_B6) == GPIO_HIGH)
{
key_release = 1;
}
#endif
}
#ifdef RT_USING_KEYCTRL
pcba_key_device_deinit();
#endif
}
void pcba_key_init(void)
{
rt_thread_t tid;
tid = rt_thread_create("pcba_key",
pcba_key_task,
RT_NULL,
PCBA_APP_KEY_TASK_STACK_SIZE,
PCBA_APP_KEY_TASK_PRIORITY,
10);
if (tid != RT_NULL)
{
LOG_D("Create pcba_key_task OK\n");
rt_thread_startup(tid);
return;
}
LOG_E("Create pcba_key_task failed\n");
RT_ASSERT(0);
}
static void pcba_key_send_usage(char *arg)
{
rt_kprintf("usage:\n\t%s <value>\n", arg);
rt_kprintf("value:\n\tKEY_RECORD: 0x%08x\n", KEY_RECORD);
rt_kprintf("\tKEY_PLAY: 0x%08x\n", KEY_PLAY);
rt_kprintf("\tKEY_DOWN: 0x%08x\n", KEY_DOWN);
rt_kprintf("\tKEY_UP: 0x%08x\n", KEY_UP);
rt_kprintf("\tKEY_MENU: 0x%08x\n", KEY_MENU);
rt_kprintf("\tKEY_OK: 0x%08x\n", KEY_OK);
rt_kprintf("\tKEY_CANCEL: 0x%08x\n", KEY_CANCEL);
rt_kprintf("\tKEY_SELECT: 0x%08x\n", KEY_SELECT);
}
void pcba_key_send(int argc, char *argv[])
{
struct pcba_app_msg send_msg;
if (argc > 1)
{
if (strcmp(argv[1], "-h") == 0)
{
pcba_key_send_usage(argv[0]);
}
else
{
send_msg.type = TYPE_KEY_PRESS;
send_msg.value = strtol(argv[1], NULL, 0);
rt_mq_send(g_pcba.display_mq, (void *)&send_msg, sizeof(struct pcba_app_msg));
}
}
else
{
pcba_key_send_usage(argv[0]);
}
}
#ifdef RT_USING_FINSH
#include <finsh.h>
MSH_CMD_EXPORT(pcba_key_send, send key to pcba test thread);
#endif
#endif