+++ /dev/null
-/**
- * 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 <stdbool.h>
-#include <stdint.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#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
-
+++ /dev/null
-/**
- * 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_
#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
{
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;
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);
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);
{
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);
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);
{
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;
re_err("register callback fail! ret=0x%x\r\n", ret);
return ret;
}
+ re_err("re_dev_open ----------succ!!!\n");
return EXT_ERR_SUCCESS;
}
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");
// 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;
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();
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;
}
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) {
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;
}
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;
}
{
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();
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;
}
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);
}
{
// 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