Files
AC707N/SDK/apps/watch/board/adkey_config.c
T
2025-12-03 11:12:34 +08:00

253 lines
7.7 KiB
C

#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".adkey_config.data.bss")
#pragma data_seg(".adkey_config.data")
#pragma const_seg(".adkey_config.text.const")
#pragma code_seg(".adkey_config.text")
#endif
#include "app_config.h"
#include "utils/syscfg_id.h"
#include "gpio_config.h"
#include "key/adkey.h"
#include "key_driver.h"
struct _cfg_adkey {
u8 len;
u16 uuid_key_value;
u16 res;
} __attribute__((packed));
struct adkey_info {
u16 io_uuid;
u16 pull_up_type;
u16 pull_up_value;
u16 max_ad_value;
u8 long_press_enable;
u8 long_press_time;
struct _cfg_adkey cfg_key_list[CONFIG_ADKEY_MAX_NUM];
};
static struct adkey_platform_data platform_data;
static const u16 key_uuid_table[][2] = {
{ 0xD191, KEY_AD_NUM0 },
{ 0xD192, KEY_AD_NUM1 },
{ 0xD193, KEY_AD_NUM2 },
{ 0xD194, KEY_AD_NUM3 },
{ 0xD195, KEY_AD_NUM4 },
{ 0xD196, KEY_AD_NUM5 },
{ 0xD197, KEY_AD_NUM6 },
{ 0xD198, KEY_AD_NUM7 },
{ 0xD199, KEY_AD_NUM8 },
{ 0xD19A, KEY_AD_NUM9 },
{ 0x0402, KEY_AD_NUM10 },
{ 0x0403, KEY_AD_NUM11 },
{ 0x0404, KEY_AD_NUM12 },
{ 0x0405, KEY_AD_NUM13 },
{ 0x0406, KEY_AD_NUM14 },
{ 0x0407, KEY_AD_NUM15 },
{ 0x0408, KEY_AD_NUM16 },
{ 0x0409, KEY_AD_NUM17 },
{ 0x040a, KEY_AD_NUM18 },
{ 0x040b, KEY_AD_NUM19 },
};
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 adkey_platform_data *get_adkey_platform_data()
{
struct adkey_info info;
u16 key_numbers;
if (platform_data.enable) {
return &platform_data;
}
#if 0
key_numbers = 2;
info.cfg_key_list[0].res = 100; // adkey1电阻值
info.cfg_key_list[1].res = 330; // adkey2电阻值
info.max_ad_value = 4096; // adc最大值
info.pull_up_value = 1000; // 上拉电阻值
platform_data.adkey_pin = IO_PORTB_07;
platform_data.extern_up_en = 0;
platform_data.ad_channel = adc_io2ch(platform_data.adkey_pin);
platform_data.long_press_enable = 1;
platform_data.long_press_time = 8;
platform_data.key_value[0] = KEY_AD_NUM0;
platform_data.key_value[1] = KEY_AD_NUM1;
platform_data.enable = 1;
printf("adkey_pin: %d\n", platform_data.adkey_pin);
printf("extern_up_en: %d\n", platform_data.extern_up_en);
printf("ad_channel: %d\n", platform_data.ad_channel);
printf("long_press_enable:%d time:%ds\n", platform_data.long_press_enable, platform_data.long_press_time);
u16 i, j, tmp;
u16 ordering_res[CONFIG_ADKEY_MAX_NUM][2];
//记录电阻与序号
for (i = 0; i < key_numbers; i++) {
ordering_res[i][0] = info.cfg_key_list[i].res;
ordering_res[i][1] = i;
/* printf("ordering_res:%d,s_number:%d\n", ordering_res[i][0], ordering_res[i][1]); */
}
//按电阻从小到大排序,序号要跟随电阻值
for (i = 0; i < key_numbers - 1; i++) {
for (j = 0; j < key_numbers - 1 - i; j++) {
if (ordering_res[j][0] > ordering_res[j + 1][0]) {
tmp = ordering_res[j][0];
ordering_res[j][0] = ordering_res[j + 1][0];
ordering_res[j + 1][0] = tmp;
tmp = ordering_res[j][1];
ordering_res[j][1] = ordering_res[j + 1][1];
ordering_res[j + 1][1] = tmp;
}
}
}
/*for test查看排序后的数据*/
/* for (i = 0; i < key_numbers; i++) { */
/* printf("after ordering res:%d,s_number:%d\n", ordering_res[i][0], ordering_res[i][1]); */
/* } */
//配置 ad判断值与key值
u16 tmp_value1, tmp_value2;
for (i = 0; i < key_numbers; i++) {
tmp_value1 = info.max_ad_value * ordering_res[i][0] / (ordering_res[i][0] + info.pull_up_value);
if (i == key_numbers - 1) {
tmp_value2 = info.max_ad_value;
} else {
tmp_value2 = info.max_ad_value * ordering_res[i + 1][0] / (ordering_res[i + 1][0] + info.pull_up_value);
}
platform_data.ad_value[i] = (tmp_value1 + tmp_value2) / 2;
printf("ADkey:%d,judge_advalue:%d,key_value:%d\n", i, platform_data.ad_value[i], platform_data.key_value[i]);
}
#else
int len = syscfg_read(CFG_ADKEY_ID, &info, sizeof(struct adkey_info));
if (len <= 0) {
puts("ERR:Can not read the adkey config,total adkeys should <= CONFIG_ADKEY_MAX_NUM\n");
return NULL;
}
printf("adkey info len: %d\n", len);
key_numbers = CONFIG_ADKEY_MAX_NUM - ((sizeof(info) - len) / sizeof(struct _cfg_adkey));
platform_data.adkey_pin = uuid2gpio(info.io_uuid);
platform_data.extern_up_en = info.pull_up_type;
platform_data.ad_channel = adc_io2ch(platform_data.adkey_pin);
platform_data.long_press_enable = info.long_press_enable;
platform_data.long_press_time = info.long_press_time;
if (platform_data.ad_channel == 0xff) {
puts("ERR:Please check that the ad key is correct\n");
return NULL;
}
printf("key_numbers: %d\n", key_numbers);
printf("adkey_pin: %d\n", platform_data.adkey_pin);
printf("extern_up_en: %d\n", platform_data.extern_up_en);
printf("pull_up_value: %d\n", info.pull_up_value);
printf("ad_channel: %d\n", platform_data.ad_channel);
printf("long_press_enable:%d time:%ds\n", platform_data.long_press_enable, platform_data.long_press_time);
u16 i, j, tmp;
u16 ordering_res[CONFIG_ADKEY_MAX_NUM][2];
//记录电阻与序号
for (i = 0; i < key_numbers; i++) {
ordering_res[i][0] = info.cfg_key_list[i].res;
ordering_res[i][1] = i;
/* printf("ordering_res:%d,s_number:%d\n", ordering_res[i][0], ordering_res[i][1]); */
}
//按电阻从小到大排序,序号要跟随电阻值
for (i = 0; i < key_numbers - 1; i++) {
for (j = 0; j < key_numbers - 1 - i; j++) {
if (ordering_res[j][0] > ordering_res[j + 1][0]) {
tmp = ordering_res[j][0];
ordering_res[j][0] = ordering_res[j + 1][0];
ordering_res[j + 1][0] = tmp;
tmp = ordering_res[j][1];
ordering_res[j][1] = ordering_res[j + 1][1];
ordering_res[j + 1][1] = tmp;
}
}
}
/*for test查看排序后的数据*/
/* for (i = 0; i < key_numbers; i++) { */
/* printf("after ordering res:%d,s_number:%d\n", ordering_res[i][0], ordering_res[i][1]); */
/* } */
//配置 ad判断值与key值
u16 tmp_value1, tmp_value2;
for (i = 0; i < key_numbers; i++) {
tmp_value1 = info.max_ad_value * ordering_res[i][0] / (ordering_res[i][0] + info.pull_up_value);
if (i == key_numbers - 1) {
tmp_value2 = info.max_ad_value;
} else {
tmp_value2 = info.max_ad_value * ordering_res[i + 1][0] / (ordering_res[i + 1][0] + info.pull_up_value);
}
platform_data.ad_value[i] = (tmp_value1 + tmp_value2) / 2;
platform_data.key_value[i] = uuid2keyValue(info.cfg_key_list[ordering_res[i][1]].uuid_key_value);
printf("ADkey:%d,judge_advalue:%d,key_value:%d\n", i, platform_data.ad_value[i], platform_data.key_value[i]);
}
platform_data.enable = 1;
#endif
return &platform_data;
}
bool is_adkey_press_down()
{
#if TCFG_ADKEY_ENABLE
if (platform_data.enable == 0) {
return false;
}
#ifdef TCFG_COLOR_SCREEN_CHARGING_CASE_ENABLE
if (adc_get_value(platform_data.ad_channel) < 300) {
#else
if (adc_get_value(platform_data.ad_channel) < 10) {
#endif
return true;
}
#endif
return false;
}
int get_adkey_io()
{
#if TCFG_ADKEY_ENABLE
if (platform_data.enable) {
return platform_data.adkey_pin;
}
#endif
return -1;
}