久久精品国产精品国产一区,少妇扒开毛毛自慰喷水,国产精品无码电影在线观看 ,久久天天躁夜夜躁狠狠85麻豆

思澈科技軟件開發(fā)工具包  2.20
Touch Screen

簡(jiǎn)介

觸控驅(qū)動(dòng)我們實(shí)現(xiàn)了一個(gè)名為"touch"的rt_device統(tǒng)一對(duì)上的接口,其內(nèi)部有一個(gè)簡(jiǎn)單的框架用于注冊(cè)不同的觸控驅(qū)動(dòng),并自動(dòng)選擇適配的驅(qū)動(dòng)。 本章節(jié)主要介紹Touch device的內(nèi)部框架功能以及如何注冊(cè)一個(gè)新觸控到該框架。

Touch device的實(shí)現(xiàn)分2部分

  • rt_device設(shè)備(drv_touch.c )
    • 注冊(cè)了一個(gè)名為"touch"的device,對(duì)外提供中斷回調(diào)注冊(cè)和讀觸控?cái)?shù)據(jù)接口
    • 創(chuàng)建了一個(gè)task用于和觸控設(shè)備的慢速通信(如初始化、讀取觸控點(diǎn)數(shù)據(jù)等)
    • 對(duì)讀到的觸控?cái)?shù)據(jù)點(diǎn),做緩存、過(guò)濾(過(guò)濾重復(fù)點(diǎn))、緩存溢出丟包處理
  • 具體觸控設(shè)備的驅(qū)動(dòng)實(shí)現(xiàn)
    • 向touch_device注冊(cè)一個(gè)新驅(qū)動(dòng)并提供以下實(shí)現(xiàn):
      • probe 識(shí)別支持設(shè)備
      • init 識(shí)別設(shè)備后的初始化
      • deinit 識(shí)別設(shè)備后的去初始化
      • read_point 讀一個(gè)有效數(shù)據(jù)點(diǎn)(注意:還有未讀走的數(shù)據(jù)點(diǎn)返回RT_EOK, 否則返回其他值)
      • 一個(gè)信號(hào)量 用于阻塞rt_device層的線程
    • 同時(shí)內(nèi)部需要實(shí)現(xiàn):
      • 觸控中斷的檢測(cè)
      • 通信接口的初始化
圖 1: 觸控驅(qū)動(dòng)軟件結(jié)構(gòu)







增加一個(gè)新觸控代碼的流程

1. 選擇example\rt_driver下對(duì)應(yīng)板子的工程

  • 這個(gè)工程里面有一個(gè)讀取觸控?cái)?shù)據(jù)并打印的線程 touch_read_task

2. 將新驅(qū)動(dòng)添加到編譯工程里面

  • 添加新觸控代碼到目錄customer\peripherals內(nèi)
    • 可以從其他已有的驅(qū)動(dòng)復(fù)制一份代碼,然后將名字、Slave_Address、讀取流程等改成自己的
      Note
      注意修改復(fù)制代碼目錄下的Kconfig文件的depend宏
  • 在customer\peripherals\Kconfig內(nèi),為新加的驅(qū)動(dòng)添加一個(gè)隱藏開選項(xiàng),比如:
    config TSC_USING_TMA525B
    bool
    default n
  • 在板級(jí)的配置的屏幕模組的開關(guān)中添加前面添加的隱藏觸控開關(guān):
    config LCD_USING_ED_LB55DSI13902_DSI_LB555
    bool "1.39 round 454RGB*454 DSI LCD(ED-LB55DSI13902)"
    select TSC_USING_TMA525B <-------- 添加的觸控開關(guān)
    select LCD_USING_RM69330
    select BSP_LCDC_USING_DSI
    if LCD_USING_ED_LB55DSI13902_DSI_LB555
    config LCD_RM69330_VSYNC_ENABLE
    bool "Enable LCD VSYNC (TE signal)"
    def_bool n
    endif
  • 若用scons 編譯,則需要進(jìn)入工程的menuconfig選擇菜單,然后選擇前面新增的屏幕模組,最終生成.config和rtconfig.h
  • 若用Keil編譯,也可以直接添加源代碼進(jìn)入(但還是建議和scons編譯添加方法一樣,這樣下次重新生成Keil工程后會(huì)自動(dòng)加入)

3. 檢查新增的觸控用到的pin,以及reset pin 的pinmux是否正確

  • SDK的drv_io.c內(nèi) 函數(shù)BSP_TP_PowerUp&BSP_TP_PowerDown,對(duì)觸控做了上下電和reset的操作





觸控調(diào)試的建議

  • 先檢查供電、reset腳的狀態(tài)是否正常
  • 然后檢查通信接口波形是否正常,比如I2C接口是否有ack





tma525b觸控設(shè)備的驅(qū)動(dòng)實(shí)現(xiàn)示例代碼

tma525b通過(guò)TOUCH_IRQ_PIN的下降沿為觸發(fā)條件,I2C為通信接口速度400KHz, I2C讀寫超時(shí)時(shí)間5ms 該實(shí)現(xiàn)中在中斷中釋放信號(hào)量使touch_device層調(diào)用自己的read_point去獲取觸控?cái)?shù)據(jù) 同時(shí)在中斷中關(guān)閉中斷使能,在進(jìn)read_point后再打開中斷使能,防止中斷太多反復(fù)release太多信號(hào)量

static struct rt_i2c_bus_device *ft_bus = NULL;
static struct touch_drivers tma525b_driver;
static rt_err_t i2c_write(rt_uint8_t *buf, rt_uint16_t len)
{
rt_int8_t res = 0;
struct rt_i2c_msg msgs;
msgs.addr = I2C_ADDR; /* slave address */
msgs.flags = RT_I2C_WR; /* write flag */
msgs.buf = buf; /* Send data pointer */
msgs.len = len;
if (rt_i2c_transfer(ft_bus, &msgs, 1) == 1)
{
res = RT_EOK;
}
else
{
res = -RT_ERROR;
}
return res;
}
static rt_err_t i2c_read(rt_uint8_t *buf, rt_uint16_t len)
{
rt_int8_t res = 0;
struct rt_i2c_msg msgs[2];
msgs[0].addr = I2C_ADDR; /* Slave address */
msgs[0].flags = RT_I2C_RD; /* Read flag */
msgs[0].buf = buf; /* Read data pointer */
msgs[0].len = len; /* Number of bytes read */
if (rt_i2c_transfer(ft_bus, msgs, 1) == 1)
{
res = RT_EOK;
}
else
{
res = -RT_ERROR;
}
return res;
}
void tma525b_irq_handler(void *arg)
{
rt_err_t ret = RT_ERROR;
rt_pin_irq_enable(TOUCH_IRQ_PIN, 0);
ret = rt_sem_release(tma525b_driver.isr_sem);
RT_ASSERT(RT_EOK == ret);
}
static rt_err_t read_point(touch_msg_t p_msg)
{
rt_err_t ret = RT_ERROR;
rt_uint8_t touch_report[16];
rt_pin_irq_enable(TOUCH_IRQ_PIN, 1);
//read touch report
if(RT_EOK == i2c_read((rt_uint8_t *)touch_report, 16))
{
if(touch_report[1] == 1)
{
p_msg->event = TOUCH_EVENT_DOWN;
}
else
{
p_msg->event = TOUCH_EVENT_UP;
}
p_msg->x = touch_report[2];
p_msg->y = touch_report[3];
if(touch_report[4] > 1)
return RT_EOK; //More pending touch data
else
return RT_EEMPTY; //No more touch data to be read
}
p_msg->event = TOUCH_EVENT_NONE; //Read point fail
return RT_ERROR;
}
static rt_err_t init(void)
{
rt_pin_mode(TOUCH_IRQ_PIN, PIN_MODE_INPUT);
rt_pin_attach_irq(TOUCH_IRQ_PIN, PIN_IRQ_MODE_FALLING, tma525b_irq_handler, (void *)(rt_uint32_t)TOUCH_IRQ_PIN);
rt_pin_irq_enable(TOUCH_IRQ_PIN, 1); //Must enable before read I2C
return RT_EOK;
}
static rt_err_t deinit(void)
{
rt_pin_detach_irq(TOUCH_IRQ_PIN);
return RT_EOK;
}
static rt_bool_t probe(void)
{
rt_err_t err;
ft_bus = (struct rt_i2c_bus_device *)rt_device_find(TOUCH_DEVICE_NAME);
if (RT_Device_Class_I2CBUS != ft_bus->parent.type)
{
ft_bus = NULL;
}
if (ft_bus)
{
rt_device_open((rt_device_t)ft_bus, RT_DEVICE_FLAG_RDWR);
}
else
{
LOG_I("bus not find\n");
return RT_FALSE;
}
{
struct rt_i2c_configuration configuration =
{
.mode = 0,
.addr = 0,
.timeout = 5,
.max_hz = 400000,
};
rt_i2c_configure(ft_bus, &configuration);
}
LOG_I("tma525b probe OK");
return RT_TRUE;
}
static struct touch_ops ops =
{
read_point,
init,
deinit
};
static int rt_tma525b_init(void)
{
tma525b_driver.probe = probe;
tma525b_driver.ops = &ops;
tma525b_driver.user_data = RT_NULL;
tma525b_driver.isr_sem = rt_sem_create("tma525b", 0, RT_IPC_FLAG_FIFO);
rt_touch_drivers_register(&tma525b_driver);
return 0;
}
INIT_COMPONENT_EXPORT(rt_tma525b_init);







Touch device上層使用方法的示例代碼

示例通過(guò)注冊(cè)中斷回調(diào)釋放信號(hào)量,然后信號(hào)量再去驅(qū)動(dòng)讀觸控?cái)?shù)據(jù),然后打印觸控點(diǎn)

static struct rt_semaphore tp_sema;
static rt_err_t tp_rx_indicate(rt_device_t dev, rt_size_t size)
{
rt_sem_release(&tp_sema);
return RT_EOK;
}
static void touch_read_task(void *parameter)
{
rt_sem_init(&tp_sema, "tpsem", 0, RT_IPC_FLAG_FIFO);
/*Open touch device*/
rt_device_t touch_device = NULL;
touch_device = rt_device_find("touch");
if (touch_device)
{
if (RT_EOK == rt_device_open(touch_device, RT_DEVICE_FLAG_RDONLY))
{
touch_device->rx_indicate = tp_rx_indicate;
while (1)
{
rt_err_t err;
struct touch_message touch_data;
err = rt_sem_take(&tp_sema, rt_tick_from_millisecond(500));
if (RT_EOK == err)
{
rt_device_read(touch_device, 0, &touch_data, 1);
rt_kprintf("read data %d, [%d,%d]\r\n", touch_data.event, touch_data.x, touch_data.y);
}
}
}
else
{
rt_kprintf("Touch open error!\n");
touch_device = NULL;
}
}
else
{
rt_kprintf("No touch device found!\n");
}
}
len
uint16_t len
Definition: bf0_ble_ancs.h:226