157 lines
3.3 KiB
C
157 lines
3.3 KiB
C
|
#include "key_handle.h"
|
||
|
#include <common/bk_kernel_err.h>
|
||
|
#include <common/bk_include.h>
|
||
|
#include <common/bk_typedef.h>
|
||
|
#include "bk_arm_arch.h"
|
||
|
#include "bk_gpio.h"
|
||
|
#include "bk_uart.h"
|
||
|
#include "bk_music_msg.h"
|
||
|
|
||
|
#if(CONFIG_MP3PLAYER == 1)
|
||
|
#define SD_DEBOUNCE_COUNT 50
|
||
|
#define KEY_SCAN_INTERVAL_10MS 10
|
||
|
|
||
|
#if (CONFIG_SOC_BK7251)
|
||
|
#define SD_CARD_DETECT_PIN 31
|
||
|
#else
|
||
|
#define SD_CARD_DETECT_PIN 25
|
||
|
#endif
|
||
|
|
||
|
#define KEY_PLAY_PAUSE_PIN 28
|
||
|
|
||
|
#define SD_CARD_OFFLINE 0
|
||
|
#define SD_CARD_ONLINE 1
|
||
|
|
||
|
#define KEY_SHORTUP_COUNTER 3 //30ms
|
||
|
#define KEY_LONG_COUNTER 80 //800ms
|
||
|
#define KEY_LONGUP_COUNTER 84 //840ms
|
||
|
#define KEY_HOLD_COUNTER 110 //1100ms
|
||
|
|
||
|
static void key_scan_callback(void *arg);
|
||
|
extern void bmsg_music_sender(void *arg);
|
||
|
|
||
|
static UINT16 backup_keyval = MSG_NO_KEY;
|
||
|
static UINT16 keycount = 0;
|
||
|
static UINT16 sd_online = SD_CARD_OFFLINE;
|
||
|
static UINT16 detect_cnt = 0;
|
||
|
static beken_timer_t key_handle_timer = {0};
|
||
|
|
||
|
|
||
|
void key_init(void)
|
||
|
{
|
||
|
UINT32 param;
|
||
|
bk_err_t err;
|
||
|
|
||
|
param = GPIO_CFG_PARAM(SD_CARD_DETECT_PIN, GMODE_INPUT_PULLUP);
|
||
|
sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_CFG, ¶m);
|
||
|
|
||
|
param = GPIO_CFG_PARAM(KEY_PLAY_PAUSE_PIN, GMODE_INPUT_PULLUP);
|
||
|
sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_CFG, ¶m);
|
||
|
|
||
|
|
||
|
err = rtos_init_timer(&key_handle_timer,
|
||
|
KEY_SCAN_INTERVAL_10MS,
|
||
|
key_scan_callback,
|
||
|
(void *)0);
|
||
|
BK_ASSERT(kNoErr == err);
|
||
|
err = rtos_start_timer(&key_handle_timer);
|
||
|
if(kNoErr != err)
|
||
|
{
|
||
|
KEY_PRT("rtos_start_timer fail\r\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
KEY_PRT("==key init==\r\n");
|
||
|
}
|
||
|
|
||
|
uint8 sd_is_attached(void)
|
||
|
{
|
||
|
return (sd_online);
|
||
|
}
|
||
|
|
||
|
static void sd_detect_handle()
|
||
|
{
|
||
|
UINT32 sd_pin_level;
|
||
|
UINT32 sd_detect_pin = SD_CARD_DETECT_PIN;
|
||
|
|
||
|
sd_pin_level = sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_INPUT, &sd_detect_pin);
|
||
|
UINT32 msg;
|
||
|
if (sd_pin_level) {
|
||
|
if (sd_online == SD_CARD_ONLINE) {
|
||
|
detect_cnt = 0;
|
||
|
sd_online = SD_CARD_OFFLINE;
|
||
|
msg = MSG_SD_DETACH;
|
||
|
//?detach???
|
||
|
bmsg_music_sender((void *)msg);
|
||
|
}
|
||
|
} else {
|
||
|
if (sd_online == SD_CARD_OFFLINE) {
|
||
|
if (detect_cnt < SD_DEBOUNCE_COUNT)
|
||
|
detect_cnt++;
|
||
|
else {
|
||
|
sd_online = SD_CARD_ONLINE;
|
||
|
msg = MSG_SD_ATTACH;
|
||
|
//?attach???
|
||
|
bmsg_music_sender((void *)msg);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static UINT16 keyIOdetect(void)
|
||
|
{
|
||
|
UINT16 key_pin_level;
|
||
|
UINT16 keyValue = MSG_NO_KEY;;
|
||
|
UINT32 key_detect_pin = KEY_PLAY_PAUSE_PIN;
|
||
|
|
||
|
key_pin_level = sddev_control(DD_DEV_TYPE_GPIO, CMD_GPIO_INPUT, &key_detect_pin);
|
||
|
if (key_pin_level == 0)
|
||
|
keyValue = MSG_KEY_PLAY;
|
||
|
|
||
|
return keyValue;
|
||
|
}
|
||
|
|
||
|
|
||
|
static void key_detect_handle(void)
|
||
|
{
|
||
|
UINT32 msg;
|
||
|
UINT16 keyval = keyIOdetect();
|
||
|
|
||
|
if (keyval == MSG_NO_KEY) {
|
||
|
if (keycount >= KEY_SHORTUP_COUNTER) {
|
||
|
if (keycount > KEY_LONG_COUNTER)
|
||
|
msg = KEY_LONG_UP | backup_keyval;
|
||
|
else
|
||
|
msg = backup_keyval;
|
||
|
bmsg_music_sender((void *)msg);
|
||
|
}
|
||
|
keycount = 0;
|
||
|
backup_keyval = MSG_NO_KEY;
|
||
|
} else {
|
||
|
if (keyval != backup_keyval) {
|
||
|
keycount = 0;
|
||
|
backup_keyval = keyval;
|
||
|
}
|
||
|
|
||
|
keycount++;
|
||
|
|
||
|
if ((keycount == KEY_LONG_COUNTER) || (keycount == KEY_HOLD_COUNTER)) {
|
||
|
if (keycount == KEY_LONG_COUNTER)
|
||
|
msg = KEY_LONG | keyval;
|
||
|
else {
|
||
|
keycount = KEY_LONGUP_COUNTER;
|
||
|
msg = KEY_HOLD | keyval;
|
||
|
}
|
||
|
bmsg_music_sender((void *)msg);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
static void key_scan_callback(void *arg)
|
||
|
{
|
||
|
sd_detect_handle();
|
||
|
key_detect_handle();
|
||
|
}
|
||
|
#endif
|