初版
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
#ifdef SUPPORT_MS_EXTENSIONS
|
||||
#pragma bss_seg(".iokey_config.data.bss")
|
||||
#pragma data_seg(".iokey_config.data")
|
||||
#pragma const_seg(".iokey_config.text.const")
|
||||
#pragma code_seg(".iokey_config.text")
|
||||
#endif
|
||||
#include "app_config.h"
|
||||
#include "utils/syscfg_id.h"
|
||||
#include "gpio_config.h"
|
||||
#include "key/iokey.h"
|
||||
#include "key_driver.h"
|
||||
|
||||
|
||||
struct iokey_info {
|
||||
u8 len;
|
||||
u16 key_uuid;
|
||||
u16 io_uuid;
|
||||
u8 detect;
|
||||
u8 long_press_enable;
|
||||
u8 long_press_time;
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
static struct iokey_port iokey_ports[CONFIG_IOKEY_MAX_NUM];
|
||||
static struct iokey_platform_data platform_data;
|
||||
|
||||
static const u16 key_uuid_table[][2] = {
|
||||
{ 0x7684, KEY_IO_NUM0 },
|
||||
{ 0x7685, KEY_IO_NUM1 },
|
||||
{ 0x7686, KEY_IO_NUM2 },
|
||||
{ 0x7687, KEY_IO_NUM3 },
|
||||
{ 0x7688, KEY_IO_NUM4 },
|
||||
{ 0x7689, KEY_IO_NUM5 },
|
||||
{ 0x768A, KEY_IO_NUM6 },
|
||||
{ 0x768B, KEY_IO_NUM7 },
|
||||
{ 0x768C, KEY_IO_NUM8 },
|
||||
{ 0x768D, KEY_IO_NUM9 },
|
||||
{ 0x4755, KEY_IO_NUM10 },
|
||||
{ 0x4756, KEY_IO_NUM11 },
|
||||
{ 0x4757, KEY_IO_NUM12 },
|
||||
{ 0x4758, KEY_IO_NUM13 },
|
||||
{ 0x4759, KEY_IO_NUM14 },
|
||||
};
|
||||
|
||||
static u8 uuid2keyValue(u16 uuid)
|
||||
{
|
||||
for (int i = 0; i < ARRAY_SIZE(key_uuid_table); i++) {
|
||||
if (key_uuid_table[i][0] == uuid) {
|
||||
return key_uuid_table[i][1];
|
||||
}
|
||||
}
|
||||
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
const struct iokey_platform_data *get_iokey_platform_data()
|
||||
{
|
||||
struct iokey_info info[CONFIG_IOKEY_MAX_NUM];
|
||||
|
||||
if (platform_data.enable) {
|
||||
return &platform_data;
|
||||
}
|
||||
|
||||
#if FPGA_DEVELOP_IOKEY
|
||||
printf("[%s] line:%d fpag warn: FIXME", __func__, __LINE__);
|
||||
platform_data.num = 1;
|
||||
platform_data.port = iokey_ports;
|
||||
platform_data.enable = 1;
|
||||
|
||||
/*设置io配置*/
|
||||
iokey_ports[0].connect_way = ONE_PORT_TO_LOW;
|
||||
iokey_ports[0].key_type.one_io.port = IO_PORTB_00;
|
||||
iokey_ports[0].key_value = KEY_IO_NUM0;
|
||||
/* */
|
||||
/* iokey_ports[1].connect_way = ONE_PORT_TO_LOW; */
|
||||
/* iokey_ports[1].key_type.one_io.port = IO_PORTB_02; */
|
||||
/* iokey_ports[1].key_value = KEY_IO_WATCH_UPPER_LEFT; */
|
||||
/* */
|
||||
/* iokey_ports[2].connect_way = ONE_PORT_TO_LOW; */
|
||||
/* iokey_ports[2].key_type.one_io.port = IO_PORTB_03; */
|
||||
/* iokey_ports[2].key_value = KEY_IO_WATCH_UPPER_RIGHT; */
|
||||
|
||||
/*设置io的长按复位功能*/
|
||||
platform_data.long_press_enable = 0;
|
||||
/* platform_data.long_press_time = info[i].long_press_time; */
|
||||
/* platform_data.long_press_port = uuid2gpio(info[i].io_uuid); */
|
||||
/* platform_data.long_press_level = (info[i].detect == 1) ? 0 : 1; */
|
||||
|
||||
#else
|
||||
int len = syscfg_read(CFG_IOKEY_ID, info, sizeof(info));
|
||||
if (len <= 0) {
|
||||
puts("ERR:Can not read the iokey config,total iokeys should <= CONFIG_IOKEY_MAX_NUM\n");
|
||||
return NULL;
|
||||
}
|
||||
printf("iokey_len: %d, %x, %x\n", len, info[0].key_uuid, info[0].io_uuid);
|
||||
|
||||
platform_data.num = len / sizeof(struct iokey_info);
|
||||
platform_data.port = iokey_ports;
|
||||
platform_data.enable = 1;
|
||||
|
||||
printf("iokey numbers: %d\n", platform_data.num);
|
||||
|
||||
for (int i = 0; i < platform_data.num; i++) {
|
||||
if (info[i].detect == 1) {
|
||||
iokey_ports[i].connect_way = ONE_PORT_TO_LOW;
|
||||
} else {
|
||||
iokey_ports[i].connect_way = ONE_PORT_TO_HIGH;
|
||||
}
|
||||
iokey_ports[i].key_type.one_io.port = uuid2gpio(info[i].io_uuid);
|
||||
iokey_ports[i].key_value = uuid2keyValue(info[i].key_uuid);
|
||||
if (info[i].long_press_enable) {
|
||||
platform_data.long_press_enable = 1;
|
||||
platform_data.long_press_time = info[i].long_press_time;
|
||||
platform_data.long_press_port = uuid2gpio(info[i].io_uuid);
|
||||
platform_data.long_press_level = (info[i].detect == 1) ? 0 : 1;
|
||||
}
|
||||
printf("iokey:%d,prot:%d,value:%d,c_way:%d long_press_en:%d time:%ds\n", i, iokey_ports[i].key_type.one_io.port, iokey_ports[i].key_value, iokey_ports[i].connect_way, info[i].long_press_enable, info[i].long_press_time);
|
||||
}
|
||||
#endif
|
||||
|
||||
return &platform_data;
|
||||
}
|
||||
|
||||
bool is_iokey_press_down()
|
||||
{
|
||||
#if TCFG_IOKEY_ENABLE
|
||||
int value = 0;
|
||||
u8 power_key_num = 0; // 默认设置第0个按键为唤醒键,其他请自行更换
|
||||
if (platform_data.enable == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
value = gpio_read(iokey_ports[power_key_num].key_type.one_io.port);
|
||||
if (iokey_ports[power_key_num].connect_way == ONE_PORT_TO_LOW) {
|
||||
return value == 0 ? true : false;
|
||||
}
|
||||
return value == 1 ? true : false;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
int get_iokey_power_io()
|
||||
{
|
||||
#if TCFG_IOKEY_ENABLE
|
||||
if (platform_data.enable) {
|
||||
return iokey_ports[0].key_type.one_io.port;
|
||||
}
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user