From f2525ffefd28987da4c561fe784139876b5fca55 Mon Sep 17 00:00:00 2001 From: SnickerSun Date: Wed, 21 Feb 2024 11:06:47 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96RotaryEncoder=E9=A9=B1?= =?utf8?q?=E5=8A=A8=EF=BC=8C=E6=9A=82=E6=97=B6=E8=BF=98=E6=B2=A1=E6=9C=89?= =?utf8?q?=E6=89=93=E9=80=9A=E4=B8=8EUI=E7=9A=84=E6=B6=88=E6=81=AF?= =?utf8?q?=E9=80=9A=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../brandy/brandy_standard/input_app.c | 8 +- .../config/target_config/brandy/config.py | 6 +- .../peripheral/rotary_encoder/hx3507.c | 542 ------------------ .../peripheral/rotary_encoder/hx3507.h | 91 --- .../peripheral/rotary_encoder/hx3507/hx3507.c | 9 +- .../rotary_encoder/hx3507/hx3507_hal.c | 5 +- .../rotary_encoder/hx3507/hx3507_hal.h | 6 +- .../peripheral/rotary_encoder/hx3507_at_cmd.c | 92 --- .../peripheral/rotary_encoder/hx3507_at_cmd.h | 32 -- .../rotary_encoder/rotary_encoder_drv.c | 43 +- .../peripheral/touch/touch_screen_def.h | 2 +- .../gui/hal/input/src/input_manager.c | 16 +- 12 files changed, 69 insertions(+), 783 deletions(-) delete mode 100644 code/sdk/drivers/peripheral/rotary_encoder/hx3507.c delete mode 100644 code/sdk/drivers/peripheral/rotary_encoder/hx3507.h delete mode 100644 code/sdk/drivers/peripheral/rotary_encoder/hx3507_at_cmd.c delete mode 100644 code/sdk/drivers/peripheral/rotary_encoder/hx3507_at_cmd.h diff --git a/code/sdk/application/brandy/brandy_standard/input_app.c b/code/sdk/application/brandy/brandy_standard/input_app.c index 5dcee7a29..49db40e54 100755 --- a/code/sdk/application/brandy/brandy_standard/input_app.c +++ b/code/sdk/application/brandy/brandy_standard/input_app.c @@ -511,10 +511,16 @@ static void input_device_task(void const *arg) continue; } + if (mail.comm.app == APP_ENCODER) { + #ifdef ENCODER_SUPPORT + encoder_info_process(); + + // PRINT("[encoder][app] TDO : APP_ENCODER EVENT\n"); + #endif + } if (mail.comm.app == APP_BUTTON) { button_driver_event_handler(&mail); } - if (mail.comm.app == APP_TOUCH) { uapi_pm_add_sleep_veto(PM_ID_TOUCH); touch_info_process(); diff --git a/code/sdk/build/config/target_config/brandy/config.py b/code/sdk/build/config/target_config/brandy/config.py index 611989782..5bc3fcb19 100755 --- a/code/sdk/build/config/target_config/brandy/config.py +++ b/code/sdk/build/config/target_config/brandy/config.py @@ -122,13 +122,14 @@ target = { 'MAG_MMC5603', 'ENABLE_VIBRATOR', 'ENABLE_SLIP', + 'ENCODER_SUPPORT', #'CONFIG_ADC_SUPPORT_AUTO_SCAN','CONFIG_ADC_SUPPORT_LONG_SAMPLE', 'MIPI_ULPS_SUPPORT', 'ENABLE_FONT_VECTOR_GLOBAL', 'ENABLE_SHAPING', 'TPTYPE_FT6X46', - 'SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION' - #'SUPPORT_ALIPAY_SEC' + 'SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION', + 'SUPPORT_ALIPAY_SEC' ], 'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite", "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation', @@ -150,6 +151,7 @@ target = { "vibrator", "vibrator_service", "lwIP", + # "slip", "audio_manager", "custom_utils", "rotary_encoder", diff --git a/code/sdk/drivers/peripheral/rotary_encoder/hx3507.c b/code/sdk/drivers/peripheral/rotary_encoder/hx3507.c deleted file mode 100644 index 92a06fc72..000000000 --- a/code/sdk/drivers/peripheral/rotary_encoder/hx3507.c +++ /dev/null @@ -1,542 +0,0 @@ -/** - * Copyright (c) @CompanyNameMagicTag 2023-2023. All rights reserved. \n - * - * Description: Button driver source file \n - * Author: @CompanyNameTag \n - * History: \n - * 2023-02-24, Create file. \n - */ - -#include "pinctrl.h" -#include "button_porting.h" -#include "platform_core.h" -#include "gpio.h" -#include "gpio_porting.h" -#include "debug_print.h" -#include "rtc.h" -#include "timer.h" -#include "systick.h" -#include "chip_core_irq.h" -#include "tcxo.h" -#include "errcode.h" -#include "pm_veto.h" - -/** - * Copyright (c) 2014 - 2023, 南京天易合芯电子有限公司 - * - * All rights reserved. - * -*/ -/***************************************************************************** - * @file tyhx_crown_custom.c - * @author Jiandang.Dong - * @date 2022-08-09 created - * @Emial Jiandang.Dong@tianyihexin.com - * @brief HX3507 驱动程序 -******************************************************************************/ -/* -整体应用流程, 请见应用文档. -先初始化IO, 执行crown_init 保证通信正确; -在需要HX3507工作的时候, 调用crown_start(), 定时器启动, -定时器周期处理调用crown_data_handler()来读取HX3507的数据; -在HX3507 不需要工作的时候, 调用crown_stop() 让HX3507 进入power down状态 -*/ - - -#include -#include -#include -#include -#include -#include "hx3507.h" - -// #ifdef CHIP_HX3507 - - -#include "cmsis_os2.h" - -osTimerId_t g_hx3507_timer = NULL;//定义一个定时器ID -static uint8_t g_hx3695_timer_installed = 0; - -static int16_t crown_result = 0; - -/*----------------------以下为定时函数相关定义 建立/启动/停止定时器//定时中断处理-------------------------------*/ - - - -/** - * 定时器超时处理函数 - * @param p_context 是对应的定时器; - */ -void crown_timer_handler(void * p_context) -{ - UNUSED(p_context); - crown_data_handler(NULL,0); -} -/** - * 表冠定时器创建函数 - * @param NULL - */ -void crown_timer_creat(void) -{ - if (g_hx3695_timer_installed == 1) - return ; - g_hx3507_timer = osTimerNew((osTimerFunc_t)crown_timer_handler, osTimerPeriodic, NULL, NULL); - g_hx3695_timer_installed = true; - return ; - // app_timer_create(&crown_timer_id, APP_TIMER_MODE_REPEATED, crown_timer_handler); -} - -/** - * 定时器start函数 , 目前定义的定时器是50ms, 用户可以根据需要改为100ms - * @param NULL - */ -void crown_timer_start(void) -{ - if(osTimerIsRunning(g_hx3507_timer)==0) - osTimerStart(g_hx3507_timer, 50); -} - -/** - * 定时器stop函数 - * @param timerid 是对应的定时器; - */ -void crown_timer_stop(void) -{ - if(osTimerIsRunning(g_hx3507_timer)) - osTimerStop(g_hx3507_timer); -} - - - -/*----------------------以上为定时函数相关定义 建立/启动/停止定时器//定时中断处理-------------------------------*/ - - -/*---------------------------以下为表冠的寄存器读写,初始化/开始/结束------------------------*/ - -/** - * 通信重新同步函数, 作用是防止因为其他干扰而引起的错乱 - * @param NULL; - */ -void crown_com_resync(void) -{ - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); - uapi_tcxo_delay_us(5); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - uapi_tcxo_delay_us(5); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); - uapi_tcxo_delay_ms(5); -} - -/** - * 通信读寄存器值函数 - * @param regaddr, hx3507的寄存器地址 - * uapi_tcxo_delay_us(COM_DELAY), 读写函数的delay 按照实际平台调整, HX3507 通信sclk 最高支持1MHZ频率. - * 在最高频率的范围内, 尽量减小delay, 减少定时器周期读取的时间. - */ -uint8_t crown_read_reg(uint8_t regaddr) -{ - uint8_t readvalue = 0; - - regaddr &= 0x7f; - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - uapi_tcxo_delay_us(COM_DELAY); - - for(int i=0; i<8; i++) - { - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - - if(regaddr & 0x80) - { - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); - } - else - { - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - - } - //uapi_tcxo_delay_us(COM_DELAY); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); - - regaddr<<=1; - //uapi_tcxo_delay_us(COM_DELAY); - } - - //开始读操作,HOST要把SDIO从输出端口改为输入端口. - uapi_gpio_set_dir(PIN_TYHX_SDIO,GPIO_DIRECTION_INPUT); - uapi_pin_set_pull(PIN_TYHX_SDIO, (pin_pull_t)HAL_PIO_PULL_UP); - uapi_pin_set_ie(PIN_TYHX_SDIO,HAL_PIO_IE_ENBALE); - uapi_tcxo_delay_us(COM_DELAY); - //nrf_gpio_pin_clear(PIN_TYHX_SCLK); - //uapi_tcxo_delay_us(COM_DELAY); - - for(int i=0; i<8; i++) - { - readvalue<<=1; - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - - //uapi_tcxo_delay_us(COM_DELAY); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); - //uapi_tcxo_delay_us(COM_DELAY); - if(uapi_gpio_get_val(PIN_TYHX_SDIO)) - { - readvalue |= 0x1; - } - //uapi_tcxo_delay_us(COM_DELAY); - } - uapi_gpio_set_dir(PIN_TYHX_SDIO,GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - - return readvalue; -} - -/** - * 通信读寄存器值函数 - * @param regaddr, hx3507的寄存器地址 - * @param regvalue, 要写的值 - */ -void crown_write_reg(uint8_t regaddr, uint8_t regvalue) -{ - - uint16_t writevalue; - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - uapi_tcxo_delay_us(COM_DELAY); - - //写通信协议, 最高位置1, 循环16次依次送出寄存器和值,在SCLK的上升沿前准备好数据 - writevalue= (uint16_t)((regaddr|0x80)<<8) + regvalue; - - for(int i=0; i<16; i++) - { - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - - if(writevalue & 0x8000) - { - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); - } - else - { - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - - } - //uapi_tcxo_delay_us(COM_DELAY); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); - - writevalue<<=1; - } - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - - return; -} - - -/** - * 某些OTS冠轴质量非常差, 这个是防呆处理 - * @param xdata, 当前读到的OTS的有效轴的数据 - * @result = true, 值有效, = false 这个值无效 - */ -static bool crown_data_verify(int16_t xdata) -{ - static int16_t xstore[3] = {0}; - uint16_t diff1, diff2, diff3= 0; - - if(abs(xdata)>=600)//间隔50ms的一次读数 - { - crown_timer_stop(); - crown_start(); - return false; - } - diff1 = abs(xstore[2]-xstore[1]); - diff2 = abs(xstore[1]-xstore[0]); - diff3 = abs(xstore[0]-xdata); - - if((diff1<5) &&(diff2<=5) &&(diff3<=5) &&(abs(xdata)>=100))//连续四次读到接近的值 - { - crown_timer_stop(); - crown_start(); - return false; - } - xstore[2] = xstore[1]; - xstore[1] = xstore[0]; - xstore[0] = xdata; - return true; -} - -/** - * 周期定时器数据读取 - * @param p_event_data, 参数暂时无用 - * @param event_size, 参数暂时无用 - */ -void crown_data_handler(void *p_event_data, uint16_t event_size) -{ - int16_t delatx = 0; - uint8_t sleepstatus = 0; - for(int i=0; i<5; i++)//先读一下芯片ID保证通信正常 - { - if(crown_read_reg(HX3507_DID) == 0x30) - { - break; - } - else - { - crown_com_resync(); - } - } - if(crown_read_reg(Motion_St)&0x80) - { -#if defined(MOT_LOW_LEVEL_MODE) - //如果有使用中断, 需要读取Y的值, 值读完, 中断电平才能恢复 - int16_t delaty = 0; - delaty = crown_read_reg(DeltaY) |(crown_read_reg(DeltaY_Hi)<<8); -#endif - //HX3507 一个方向转动出正值, 另外一个方向就是负值, 正负值跟芯片的摆放方向有关 - delatx = crown_read_reg(DeltaX) |(crown_read_reg(DeltaX_Hi)<<8); - if(crown_data_verify(delatx)) //先判断数据是否合理, - // 主要针对OTS冠轴质量,或者装配摆动幅度大引起的错误, 做的保护程序 - { - //打印读取结果 - TYHX_LOG("DeltaX = %d\r\n",delatx); - //把结果转换为大概的估算角度 - put_crown_result(delatx); - } - } - else //下面这两个参数在产测程序里面需要加上 - { - //冠轴静止的时候, 打印图像的质量和PD的饱和度, 这两个参数读取要放在出货测试的程序里面, - // 图像质量应该>=80, 否则可能代表芯片表面有脏污等或者装配问题或者有漏光 - // PD的饱和度应该>=100 且 <=180, 如果有漏光等问题, 结果>=240以上, 相关漏光等要处理 - TYHX_LOG("pic qulity =%d, pd saturation=%d\r\n",crown_read_reg(Img_Qa),crown_read_reg(PD_SAT)); - } - -#if (defined(MOT_LOW_LEVEL_MODE))//如果低电平中断模式,要读到芯片MOT变高 - if(uapi_gpio_get_val(PIN_TYHX_MOT)) - { - TYHX_LOG("PIN_TYHX_MOT is high \r\n"); - crown_timer_stop(); - } -#endif - -#if (defined(MOT_FALLINGTRI_MODE))//如果是脉冲中断模式,要读到芯片进入sleep - sleepstatus = crown_read_reg(Op_St); - if((sleepstatus & 0x7) == 6) - { - TYHX_LOG("crown is sleep \r\n"); - crown_timer_stop(); - } -#endif -#if (defined(MOT_NO_USE_MODE)) - //如果是MOT_NO_USE_MODE , 一般在屏幕熄掉,不需要HX3507工作的时候, 关闭定时器 -#endif - -} - -//MOT 中断处理程序, 这个是根据平台程序处理, 用户可以自行修改 -//这里加中断发生标志位或者把中断处理推送到其他任务队列, 因为中断函数里面不能加太多程序 -//下面的例子用的是NORDIC标准的程序,中断发生后GPIO的一个处理,并且把中断处理推送到任务队列 -#if (defined(MOT_LOW_LEVEL_MODE) || defined(MOT_FALLINGTRI_MODE)) -static void crown_int_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action) -{ - uint32_t err_code; - bool mothitolow = false; - - nrf_drv_gpiote_in_uninit(PIN_TYHX_MOT); - if (action == NRF_GPIOTE_POLARITY_HITOLO) - { - mothitolow = true; - nrf_drv_gpiote_in_config_t config_crown = GPIOTE_CONFIG_IN_SENSE_LOTOHI(false); - err_code = nrf_drv_gpiote_in_init(PIN_TYHX_MOT, &config_crown, crown_int_handler); - APP_ERROR_CHECK(err_code); - config_crown.pull = NRF_GPIO_PIN_PULLUP; - nrf_drv_gpiote_in_event_enable(PIN_TYHX_MOT, true); - } - else - { - mothitolow = false; - nrf_drv_gpiote_in_config_t config_crown = GPIOTE_CONFIG_IN_SENSE_HITOLO(false); - err_code = nrf_drv_gpiote_in_init(PIN_TYHX_MOT, &config_crown, crown_int_handler); - APP_ERROR_CHECK(err_code); - config_crown.pull = NRF_GPIO_PIN_PULLUP; - nrf_drv_gpiote_in_event_enable(PIN_TYHX_MOT, true); - } - nrf_gpio_pin_latch_clear(PIN_TYHX_MOT); - if(mothitolow) - { - TYHX_LOG("mot interrupt! \r\n"); - mothitolow = false; - crown_timer_start(); - } - -} - -#endif - - -/** - * HX3507 初始化 - * @param NULL - */ -void crown_init(void) -{ - int i; - uapi_gpio_set_dir(PIN_TYHX_SDIO,GPIO_DIRECTION_INPUT); - uapi_gpio_set_dir(PIN_TYHX_SCLK,GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - - uapi_tcxo_delay_us(COM_DELAY); - crown_com_resync(); - for(i=0; i<10; i++) - { - if(crown_read_reg(HX3507_DID) == 0x30) - { - TYHX_LOG("read chip id is 0x30\r\n",i); - break; - } - if(i<7)//读到ID不对, 复位通信 - { - crown_com_resync(); - } - } - if(i==10) - { - TYHX_LOG("HX3507 communication err, please check\r\n"); - return; - } - -#if (defined(MOT_LOW_LEVEL_MODE) || defined(MOT_FALLINGTRI_MODE)) - //中断定义 - nrf_drv_gpiote_in_config_t config_crown = GPIOTE_CONFIG_IN_SENSE_HITOLO(false); - config_crown.pull = NRF_GPIO_PIN_PULLUP; - nrf_drv_gpiote_in_init(PIN_TYHX_MOT, &config_crown, crown_int_handler); - nrf_drv_gpiote_in_event_enable(PIN_TYHX_MOT, true); - -#endif - //定时器创建 - crown_timer_creat(); -} - - -/** - * HX3507 启动 - * @param NULL - */ -void crown_start(void) -{ - int i = 0; - for(int i=0; i<5; i++) - { - crown_write_reg(Config_St,0x89); //RESET - uapi_tcxo_delay_ms(10); - TYHX_LOG("Reset ic, now init ---\r\n"); - -#if defined(MOT_LOW_LEVEL_MODE) - crown_write_reg(Config_St,0x01); //正常工作, MOT低电平中断 - crown_write_reg(Op_Mode,0xb8); //打开Sleep1 和 sleep2 功能 - crown_write_reg(Sleep1_Setting,0xc0); - crown_write_reg(Enter_Time,0xc1); - crown_write_reg(Sleep2_Setting,0xc0); -#elif defined(MOT_FALLINGTRI_MODE) - crown_write_reg(Config_St,0x41); //正常工作, MOT下降沿中断 - crown_write_reg(Op_Mode,0xb8); //打开Sleep1 和 sleep2 功能 - crown_write_reg(Sleep1_Setting,0xc0); - crown_write_reg(Enter_Time,0xc1); - crown_write_reg(Sleep2_Setting,0xc0); - -#elif defined(MOT_NO_USE_MODE) - crown_write_reg(Op_Mode,0xa0); //关闭sleep功能 -#endif - crown_write_reg(Write_Protect,0xc3); //enable all registers - crown_write_reg(Sleep1_Setting,0xc0); //0x70,32ms.loop = 40ms. return 0 slowly - crown_write_reg(Enter_Time,0x0); //sleep1=128*(Enter_Time[7:4]+1) sleep2=20480*(Enter_Time[3:0]+1) - crown_write_reg(DxDy_16bit,0x01); //0:8bit,1:16bit - crown_write_reg(CPI2_Setting,0x88); //800 cpi - crown_write_reg(HX3507_REV,0x00); - if(1 == crown_read_reg(DxDy_16bit) ) - { - break; - } - else - { - crown_com_resync(); - } - } - if(i==5) - { - TYHX_LOG("HX3507 init err, please check\r\n"); - return; - } - - -#if 0 //这里非常关键, 在调试初期, 需要用#if 1 来验证寄存器写入的值和读出来的值是一样的, 通信正确 - TYHX_LOG("Op_Mode = 0x%x\r\n",crown_read_reg(Op_Mode)); - TYHX_LOG("Sleep1_Setting = 0x%x\r\n",crown_read_reg(Sleep1_Setting)); - TYHX_LOG("DxDy_16bit = 0x%x\r\n",crown_read_reg(DxDy_16bit)); - TYHX_LOG("CPI2_Setting = 0x%x\r\n",crown_read_reg(CPI2_Setting)); -#endif - -#ifdef MOT_NO_USE_MODE // 如果是非中断模式, 初始后, 开启定时器; - crown_timer_start(); -#endif - - - -} - - -/** - * HX3507 停止 - * @param NULL - */ -void crown_stop(void) -{ -#ifdef MOT_NO_USE_MODE - crown_timer_stop(); - crown_write_reg(Config_St,0x89); // power down, power down 后芯片功耗9uA - uapi_tcxo_delay_ms(20); - TYHX_LOG("[tyhx_crown_stop]\r\n"); -#endif -} - - -/** - * HX3507 结果转换为角度, 供UI处理 - * @param NULL - */ -void put_crown_result(int16_t x) -{ - if(abs(x)<=FILTER_MIN ) - return; - if(abs(x)>=4 ) - { - crown_result += x/4; //大于4的值除以4, 代表角度, 单位0.5° - } - else - { - if(x>0) - { - crown_result+=1; //2~4 默认一个单位, 0.5° - } - else - { - crown_result-=1; //2~4 默认一个单位, 0.5° - } - } -} - -/** - * 获取表冠的数据结果接口函数 - * @param NULL -*/ -int16_t get_crown_result(void) -{ - int16_t resulttemp; - resulttemp=crown_result; - crown_result = 0; - return resulttemp; -} - -// #endif - diff --git a/code/sdk/drivers/peripheral/rotary_encoder/hx3507.h b/code/sdk/drivers/peripheral/rotary_encoder/hx3507.h deleted file mode 100644 index 647601e28..000000000 --- a/code/sdk/drivers/peripheral/rotary_encoder/hx3507.h +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (c) 2014 - 2023, 南京天易合芯电子有限公司 - * - * All rights reserved. - * -*/ - -/*************************************************************************** - * @file TYHX_CROWN_CUSTOM.h - * @author TYHX team - * @product CROWN - * @version V0.1 - * @date 2022-08-09 - * @modify date 2023-02-17 - -****************************************************************************/ -#ifndef _TYHX_CROWN_CUSTOM_H_ -#define _TYHX_CROWN_CUSTOM_H_ - -#include "debug_print.h" -#define CHIP_HX3507 - - -//三种中断模式的应用具体见“天易合芯表冠产品应用文档.docx"的流程说明,用户也可以定义自己的流程模式 -//#define MOT_LOW_LEVEL_MODE //MOT使用低电平中断 -//#define MOT_FALLINGTRI_MODE //MOT 使用低脉冲中断 -#define MOT_NO_USE_MODE //用户不使用MOT 中断, 这个为常用的推荐模式 - - -//register define , addr, rw, default value, detail -#define HX3507_DID 0x00 //R 0x30 芯片ID -#define Motion_St 0x02 //R 是否有冠轴转动数据产生 -#define DeltaX 0x03 //R 0x30 DeltaX 的低8位数据 -#define DeltaY 0x04 //R 0x30 DeltaY 的低8位数据 -#define Op_Mode 0x05 //W/R 操作模式 -#define Config_St 0x06 //W/R 0x02 閰嶇疆 -#define Img_Qa 0x07 //R 图像质量 -#define Op_St 0x08 //R Sleep 和帧率设置 -#define Write_Protect 0x09 //W扩展寄存器的写使能 -#define Sleep1_Setting 0x0A //W/R Sleep1 的工作频率设置 -#define Enter_Time 0x0B //W/R 进入SLEEP的等待时间设置 -#define Sleep2_Setting 0x0C // W/R Sleep2的工作频率设置 -#define DeltaX_Hi 0x20 //R DeltaX 的高8位数据 -#define DeltaY_Hi 0x21 //R DeltaY的高8位数据 -#define DxDy_16bit 0x22 //数据输出寄存器选择16bit还是8bit格式 -#define CPI2_Setting 0x23 //W/R 扩展CPI 设置 -#define PD_SAT 0x3D //PD 感光的饱和度 -#define HX3507_REV 0x5F //W 保留寄存器 - -#define COM_DELAY 5 // 通信的delay 单位, 用户根据平台实际调整, 最高支持1MHZ CLK -#define FILTER_MIN 1 // 偶尔冠轴被震动等各种意外产生的小的数据, 可根据产品情况把小的出值滤掉 - -//log 打印定义 -#define TYHX_LOG_ENABLE -#ifdef TYHX_LOG_ENABLE -#define TYHX_LOG(fmt, ...) \ - do { \ - PRINT(fmt" ", ##__VA_ARGS__); \ - } while (0) -#else -#define TYHX_LOG(...) -#endif //TYHX_LOG_ENABLE - - -/*----------------------使用的IO定义-------------------------------*/ - -#define PIN_TYHX_SDIO S_AGPIO_L12 //custom to do here -#define PIN_TYHX_SCLK S_AGPIO_L13 //custom to do here -#define PIN_TYHX_MOT S_AGPIO_L17 //custom to do here - -//定时器的 创建/启动/停止/溢出处理函数 -void crown_timer_creat(void); -void crown_timer_start(void); -void crown_timer_stop(void); -void crown_timer_handler(void * p_context); - -//HX3507 初始化,启动,停止, 数据读取, 读寄存器, 写寄存器等, 通信同步 -void crown_init(void); -void crown_start(void); -void crown_stop(void); -void crown_data_handler(void *p_event_data, uint16_t event_size); -uint8_t crown_read_reg(uint8_t regaddr); -void crown_write_reg(uint8_t regaddr, uint8_t regvalue); -void crown_com_resync(void); - -//把读出的数据转换为大概角度函数 -void put_crown_result(int16_t x); - -//把角度结果上报的函数 -int16_t get_crown_result(void); -#endif //_TYHX_CROWN_CUSTOM_H_ diff --git a/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507.c b/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507.c index 74b128913..397d46933 100644 --- a/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507.c +++ b/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507.c @@ -298,7 +298,7 @@ void crown_data_handler(void *p_event_data, uint16_t event_size) // 主要针对OTS冠轴质量,或者装配摆动幅度大引起的错误, 做的保护程序 { //打印读取结果 - TYHX_LOG("DeltaX = %d\r\n",delatx); + // TYHX_LOG("DeltaX = %d\r\n",delatx); //把结果转换为大概的估算角度 put_crown_result(delatx); } @@ -499,8 +499,8 @@ void crown_stop(void) TYHX_LOG("[tyhx_crown_stop]\r\n"); #endif } - - +#include "hx3507_hal.h" +extern encoder_callback g_encoder_callback; /** * HX3507 结果转换为角度, 供UI处理 * @param NULL @@ -524,6 +524,9 @@ void put_crown_result(int16_t x) crown_result-=1; //2~4 默认一个单位, 0.5° } } + + if (g_encoder_callback != NULL) + g_encoder_callback(); } /** diff --git a/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507_hal.c b/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507_hal.c index 670426e1b..a4b6cd6fb 100644 --- a/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507_hal.c +++ b/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507_hal.c @@ -13,6 +13,7 @@ #include "hal_i2c.h" static uint8_t g_hx3507_test_started = 0; +encoder_callback g_encoder_callback = NULL; uint32_t hx3507_start(void) { if (g_hx3507_test_started == 1) @@ -50,7 +51,7 @@ static ext_errno hx3507_encoder_deinit(void) static ext_errno hx3507_encoder_get_encoderinfo(uint8_t *data, uint8_t data_len) { - re_print("hx3507_encoder_get_encoderinfo\r\n"); + // re_print("hx3507_encoder_get_encoderinfo\r\n"); if (data_len != sizeof(re_input_event_info)) return EXT_ERR_NOT_SUPPORT; re_input_event_info *encoder_info = (re_input_event_info*)data; @@ -99,11 +100,13 @@ static ext_errno hx3507_encoder_bus_init(void *private_data) static ext_errno hx3507_register_callback(void *peri_data, encoder_callback func) { re_print("hx3507_register_callback\r\n"); + g_encoder_callback = func; return EXT_ERR_SUCCESS; } static ext_errno hx3507_unregister_callback(void *peri_data) { re_print("hx3507_unregister_callback\r\n"); + g_encoder_callback = NULL; return EXT_ERR_SUCCESS; } diff --git a/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507_hal.h b/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507_hal.h index 74e26339a..f4e6b5fb4 100644 --- a/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507_hal.h +++ b/code/sdk/drivers/peripheral/rotary_encoder/hx3507/hx3507_hal.h @@ -13,15 +13,15 @@ #include #include "errcode.h" #include "soc_osal.h" -#include "at_cmd_api.h" - +#include "rotary_encoder_def.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -at_cmd_table_t *get_mmc5603_cmd_table(uint32_t *cmd_count); +void *rotary_encoder_get_api(void); +void *rotary_encoder_get_peri_attr(void); #ifdef __cplusplus #if __cplusplus diff --git a/code/sdk/drivers/peripheral/rotary_encoder/hx3507_at_cmd.c b/code/sdk/drivers/peripheral/rotary_encoder/hx3507_at_cmd.c deleted file mode 100644 index 064256ed5..000000000 --- a/code/sdk/drivers/peripheral/rotary_encoder/hx3507_at_cmd.c +++ /dev/null @@ -1,92 +0,0 @@ - -// #include "hx3507.h" - - -#include "at_cmd_api.h" -#include "pm_control.h" -#include "hx3507.h" - -#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0])) -#define HX3507_MAX_ARGC 8 -#define HX3507_MAX_ARGV_LEN 64 - -#define HX3507_SUCCESS 0 -#define HX3507_FAILED (-1) - -static int ConvertCmdToParam(uint8_t *para, uint32_t paraLen, - uint8_t argv[HX3507_MAX_ARGC][HX3507_MAX_ARGV_LEN], uint32_t* argc) -{ - uint32_t pos = 0; - *argc = 0; - - for (uint32_t i = 0; i < paraLen; i++) { - if ((para[i] == ' ' || para[i] == '\n') && pos != 0) { - argv[*argc][pos] = '\0'; - *argc += 1; - pos = 0; - if (*argc >= HX3507_MAX_ARGC) { - return HX3507_FAILED; - } - } else { - argv[*argc][pos] = para[i]; - pos++; - if (pos >= HX3507_MAX_ARGV_LEN) { - return HX3507_FAILED; - } - } - } - if (pos != 0) { - *argc += 1; - } - - return HX3507_SUCCESS; -} - -static uint8_t g_hx3507_test_started = 0; -static uint32_t hx3507_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd) -{ - UNUSED(strCommonCmd); - uint8_t argv[HX3507_MAX_ARGC][HX3507_MAX_ARGV_LEN] = { 0 }; - uint32_t argc = 0; - - int ret = ConvertCmdToParam(para, paraLen, argv, &argc); - if (ret != HX3507_SUCCESS) { - PRINT("HX3507TEST ATCMD Convert Command Failed\n"); - return ERRCODE_FAIL; - } - - if (argc != 1) { - PRINT("HX3507TEST ATCMD Set Parameter Failed argc %d\n",argc); - return ERRCODE_FAIL; - } - uint8_t start = (uint8_t)atoi((char*)argv[0]); - if (start == 1) - { - if (g_hx3507_test_started == 1) - { - PRINT("SKIP hx3507test start, already started\r\n"); - return 0; - } - crown_init(); - crown_start(); - g_hx3507_test_started = 1; - }else{ - if (g_hx3507_test_started == 0) - { - PRINT("SKIP hx3507test stop, already stopped\r\n"); - return 0; - } - crown_stop(); - g_hx3507_test_started = 0 ; - } - return ERRCODE_SUCC; -} -static const at_cmd_table_t g_hx3507_cmd[] = { - { (char *)"AT^HX3507TEST", hx3507_test, (char *)"1" }, -}; - -at_cmd_table_t *get_hx3507_cmd_table(uint32_t *cmd_count) -{ - *cmd_count = ARRAY_COUNT(g_hx3507_cmd); - return (at_cmd_table_t *)g_hx3507_cmd; -} diff --git a/code/sdk/drivers/peripheral/rotary_encoder/hx3507_at_cmd.h b/code/sdk/drivers/peripheral/rotary_encoder/hx3507_at_cmd.h deleted file mode 100644 index cb7de8558..000000000 --- a/code/sdk/drivers/peripheral/rotary_encoder/hx3507_at_cmd.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n - * - * Description: Provides at cmd register func \n - * Author: @CompanyNameTag \n - * History: \n - * 2022-07-20, Create file. \n - */ -#ifndef HX3507_AT_PROCESS_H -#define HX3507_AT_PROCESS_H - -#include -#include -#include "errcode.h" -#include "soc_osal.h" -#include "at_cmd_api.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -at_cmd_table_t *get_mmc5603_cmd_table(uint32_t *cmd_count); - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#endif diff --git a/code/sdk/drivers/peripheral/rotary_encoder/rotary_encoder_drv.c b/code/sdk/drivers/peripheral/rotary_encoder/rotary_encoder_drv.c index f90f2c595..bd7ece608 100644 --- a/code/sdk/drivers/peripheral/rotary_encoder/rotary_encoder_drv.c +++ b/code/sdk/drivers/peripheral/rotary_encoder/rotary_encoder_drv.c @@ -28,7 +28,7 @@ #define ROTARY_ENCODER_DEV_NAME_LEN 16 #define ROTARY_ENCODER_DEVNAME "input/event" -#define ROTARY_ENCODER_DYNAMIC_MINOR 65 +#define ROTARY_ENCODER_DYNAMIC_MINOR 66 #define ROTARY_ENCODER_CMDID_MAX 16 #define ROTARY_ENCODER_TASK_PRIO 5 @@ -71,7 +71,8 @@ static void convert_encoder_info(input_dev_data_t* data, re_input_event_info* en { data->x = (int16_t)encoder_info->re_event_info.x_axis[0]; data->y = (int16_t)encoder_info->re_event_info.y_axis[0]; - data->type = INDEV_TYPE_TOUCH; + data->type = INDEV_TYPE_ENCODER; + data->encoderDiff = data->x; data->timestamp = (uint32_t)encoder_info->tv_usec; if ((encoder_info->re_event == MC_RE_PRESS) || (encoder_info->re_event == MC_RE_MOVE)) { data->state = INDEV_STATE_PRESS; @@ -87,11 +88,14 @@ static void report_or_enqueue_event(re_input_event_info* encoder_info, struct re if (g_re_report_event_cb != NULL) { input_dev_data_t data; convert_encoder_info(&data, encoder_info); - if (data.state == INDEV_STATE_UNKNOWN) { - return; - } + // if (data.state == INDEV_STATE_UNKNOWN) { + // return; + // } + re_print("report encoder diff %d ,state %d \n",data.encoderDiff,data.state); g_re_report_event_cb(&data); } else { + // re_print("re_en_queue encoder diff %d \n",encoder_info->re_event_info.x_axis[0]); + int32_t ret = re_en_queue(redd->queue, encoder_info); if (ret != EXT_ERR_SUCCESS) { re_err("Failed to enqueue ts queue! ret=0x%x", ret); @@ -132,7 +136,7 @@ ext_errno encoder_info_process(void) if (ret != EXT_ERR_SUCCESS) { re_err("get encoder info fail! ret=0x%x", ret); } - + // re_print("encoder_info_process\n"); report_or_enqueue_event(&encoder_info, redd); #if defined(SUPPORT_POWER_MANAGER) report_event_to_power_manager(&encoder_info); @@ -160,6 +164,7 @@ static ext_errno re_register_callback(struct re_driver_data *attr) { ext_errno ret = EXT_ERR_FAILURE; g_attr_re = attr; + re_err("re_register_callback ----------succ!!!\n"); if (attr->encoder_api->register_callback != NULL) { ret = attr->encoder_api->register_callback(attr->private_data, re_callback_func); @@ -177,6 +182,7 @@ static ext_errno re_register_callback(struct re_driver_data *attr) static ext_errno re_unregister_callback(struct re_driver_data *attr) { ext_errno ret = EXT_ERR_FAILURE; + re_err("re_unregister_callback ----------succ!!!\n"); if (attr->encoder_api->unregister_callback != NULL) { ret = attr->encoder_api->unregister_callback(attr->private_data); @@ -196,6 +202,8 @@ static int32_t re_dev_open(const void *private_data) { int32_t ret; struct re_driver_data *redd = NULL; + re_err("re_dev_open ----------succ!!!\n"); + if (private_data == NULL) { re_err("re_open: invalid dev or driver_data!\n"); return EXT_ERR_FAILURE; @@ -236,6 +244,7 @@ static int32_t re_dev_open(const void *private_data) re_err("register callback fail! ret=0x%x\r\n", ret); return ret; } + re_err("re_dev_open ----------succ!!!\n"); return EXT_ERR_SUCCESS; } @@ -243,6 +252,8 @@ static int32_t re_dev_open(const void *private_data) static int32_t re_dev_release(const void *private_data) { int32_t ret; + re_err("re_dev_release ----------succ!!!\n"); + struct re_driver_data *redd = NULL; if (private_data == NULL) { re_err("re_dev_release: invalid dev or driver_data!\n"); @@ -266,6 +277,8 @@ static uint32_t re_dev_poll(const osal_poll *osal_poll, const void *private_data // todo: get redd from private_data struct re_driver_data *redd = NULL; redd = rotary_encoder_get_driver_data(); + re_err("re_dev_poll ----------succ!!!\n"); + if (redd == NULL) { re_err("re_driver_data is NULL"); return EXT_ERR_FAILURE; @@ -326,6 +339,7 @@ struct re_ops g_re_status_ops = { static ext_errno rotary_encoder_register_device(void) { ext_errno ret; + re_err("rotary_encoder_register_device ----------succ!!!\n"); g_encoder_drv.private_data = rotary_encoder_get_peri_attr(); g_encoder_drv.encoder_api = rotary_encoder_get_api(); @@ -339,6 +353,7 @@ static ext_errno rotary_encoder_register_device(void) re_err("rotary encoder osal_dev_register --------failed! ret=0x%x\n", ret); return EXT_ERR_FAILURE; } + re_err("rotary_encoder_register_device ----------succ!!!\n"); return EXT_ERR_SUCCESS; } @@ -346,6 +361,7 @@ static ext_errno rotary_encoder_register_device(void) ext_errno rotary_encoder_module_init(void) { ext_errno ret; + re_err("rotary_encoder_module_init ----------succ!!!\n"); ret = rotary_encoder_register_device(); if (ret != EXT_ERR_SUCCESS) { @@ -363,6 +379,7 @@ ext_errno rotary_encoder_module_deinit(void) uint32_t re_register_report_event_cb(report_event_cb callback) { + re_err("re_register_report_event_cb ----------succ!!!\n"); if (g_re_report_event_cb != NULL) { return EXT_ERR_FAILURE; } @@ -372,6 +389,8 @@ uint32_t re_register_report_event_cb(report_event_cb callback) uint32_t re_unregister_report_event_cb(void) { + re_err("re_unregister_report_event_cb ----------succ!!!\n"); + g_re_report_event_cb = NULL; return EXT_ERR_SUCCESS; } @@ -380,6 +399,7 @@ uint32_t re_init(void) { int32_t ret; struct re_driver_data *redd = NULL; + // re_err("re_init ----------1!!!\n"); g_encoder_drv.private_data = rotary_encoder_get_peri_attr(); g_encoder_drv.encoder_api = rotary_encoder_get_api(); @@ -396,18 +416,23 @@ uint32_t re_init(void) re_err("register callback fail! ret=0x%x\r\n", ret); return EXT_ERR_FAILURE; } - + re_err("re_init ----------succ!!!\n"); + rotary_encoder_resume(); return EXT_ERR_SUCCESS; } uint32_t re_read(const input_dev_data_t* data) { unused(data); + re_err("re_read ----------succ!!!\n"); + return EXT_ERR_SUCCESS; } uint32_t re_close(void) { + re_err("re_close ----------succ!!!\n"); + return EXT_ERR_SUCCESS; } @@ -431,11 +456,14 @@ void rotary_encoder_resume(void) void encoder_suspend_for_i2c(void) { + re_err("encoder_suspend_for_i2c ----------succ!!!\n"); // i2c_save_reg(TOUCH_I2C_BUS); } void encoder_resume_for_i2c(void) { + re_err("encoder_resume_for_i2c ----------succ!!!\n"); + // i2c_recovery_reg(TOUCH_I2C_BUS); } @@ -443,5 +471,6 @@ void rotary_encoder_restart(void) { // uapi_i2c_deinit(TOUCH_I2C_BUS); // uapi_i2c_master_init(TOUCH_I2C_BUS, 400000, I2C_SPEED_MODE_FS); /* 400000: 400KHz */ + re_err("rotary_encoder_restart ----------succ!!!\n"); } \ No newline at end of file diff --git a/code/sdk/drivers/peripheral/touch/touch_screen_def.h b/code/sdk/drivers/peripheral/touch/touch_screen_def.h index ad2d184f8..ceda5fa20 100644 --- a/code/sdk/drivers/peripheral/touch/touch_screen_def.h +++ b/code/sdk/drivers/peripheral/touch/touch_screen_def.h @@ -27,7 +27,7 @@ extern "C" { #define CMD_GET_TOUCH_INFO 0 #define TOUCH_SCREEN_GET_EVENT _IOWR(INPUT_TOUCH_MODULE_ID, CMD_GET_TOUCH_INFO, input_event_info) -#define TP_DEBUG +// #define TP_DEBUG /* common definitions */ #define tp_mem_free(sz) \ diff --git a/code/sdk/middleware/services/gui/hal/input/src/input_manager.c b/code/sdk/middleware/services/gui/hal/input/src/input_manager.c index a3bbc9474..752b94a7d 100755 --- a/code/sdk/middleware/services/gui/hal/input/src/input_manager.c +++ b/code/sdk/middleware/services/gui/hal/input/src/input_manager.c @@ -61,20 +61,20 @@ __attribute__((weak)) uint32_t button_close(void) } -__attribute__((weak)) uint32_t encoder_register_report_event_cb(report_event_cb callback) +__attribute__((weak)) uint32_t re_register_report_event_cb(report_event_cb callback) { (void)(callback); return INPUT_FAILURE; } -__attribute__((weak)) uint32_t encoder_unregister_report_event_cb(void) +__attribute__((weak)) uint32_t re_unregister_report_event_cb(void) { return INPUT_FAILURE; } -__attribute__((weak)) uint32_t encoder_init(void) +__attribute__((weak)) uint32_t re_init(void) { return INPUT_FAILURE; } -__attribute__((weak)) uint32_t encoder_close(void) +__attribute__((weak)) uint32_t re_close(void) { return INPUT_FAILURE; } @@ -88,10 +88,10 @@ static void InitInputDevices(void) /* Init Encoder Device */ g_inputDevs[INDEV_TYPE_ENCODER].type = INDEV_TYPE_ENCODER; - g_inputDevs[INDEV_TYPE_ENCODER].funcs.Init = encoder_init; - g_inputDevs[INDEV_TYPE_ENCODER].funcs.Close = encoder_close; - g_inputDevs[INDEV_TYPE_ENCODER].funcs.RegisterReportEventCb = encoder_register_report_event_cb; - g_inputDevs[INDEV_TYPE_ENCODER].funcs.UnregisterReportEventCb = encoder_unregister_report_event_cb; + g_inputDevs[INDEV_TYPE_ENCODER].funcs.Init = re_init; + g_inputDevs[INDEV_TYPE_ENCODER].funcs.Close = re_close; + g_inputDevs[INDEV_TYPE_ENCODER].funcs.RegisterReportEventCb = re_register_report_event_cb; + g_inputDevs[INDEV_TYPE_ENCODER].funcs.UnregisterReportEventCb = re_unregister_report_event_cb; /* Init Touch Device */ g_inputDevs[INDEV_TYPE_TOUCH].type = INDEV_TYPE_TOUCH; -- 2.17.1