欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

SylixOS里CT365I2C觸控驅動移植

1.適用范圍

    本文檔為移植LCD8000-97C屏幕電容觸控驅動到iMX6平臺過程的總結。提供一些SylixOS觸控相關的框架理解和移植心得。

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供上街網(wǎng)站建設、上街做網(wǎng)站、上街網(wǎng)站設計、上街網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、上街企業(yè)網(wǎng)站模板建站服務,十年上街做網(wǎng)站經驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。

2.原理概述

     如圖21所示:觸控屏通過外部中斷提醒主機從I2C總線上讀取觸控坐標和按壓數(shù)據(jù),主機讀取到觸控數(shù)據(jù)后將數(shù)據(jù)解析并轉換成鼠標事件發(fā)送給系統(tǒng)上層,完成一次觸控。

SylixOS里CT365 I2C觸控驅動移植

圖 2-1  觸控流程

3.技術實現(xiàn)

3.1Touch框架分析

    /driver/touch/touch.c文件主要實現(xiàn)了SylixOS的touch框架。主體框架僅需要關注如圖31所示的四個函數(shù):

SylixOS里CT365 I2C觸控驅動移植

圖 3-1  Touch框架重要函數(shù)

3.1.1函數(shù)__touchHwInit

    該函數(shù)主要完成如下的功能:

    1)創(chuàng)建觸摸屏使用的I2C的總線設備;

    2)注冊設備觸控中斷;

    3)申請設備復位管腳,復位設備;

    4)調用設備Init函數(shù)。

3.1.2函數(shù)__touchIsr

    這是函數(shù)__touchHwInit注冊的中斷響應服務,主要完成接收觸控中斷、清除中斷,并發(fā)出一個touch相關的信號的功能。

3.1.3函數(shù)__touchThread

    該函數(shù)是touch設備的一個線程,其在執(zhí)行過程中等待touch信號,收到信號后調用函數(shù)__touchHandleEvents.

3.1.4函數(shù)__touchHandleEvents 

    該函數(shù)通過觸控芯片驅動提供的getevent回調函數(shù)來獲取數(shù)據(jù)生成的鼠標事件,并向上層發(fā)送相關鼠標事件。

3.1.5框架的流程圖

    整個框架的流程如圖32所示:

SylixOS里CT365 I2C觸控驅動移植

圖 3-2  Touch主體框架流程

3.2數(shù)據(jù)交互流程確認

    移植的觸控屏為英蓓特LCD8000-97c,由于原廠不提供相關觸控芯片的資料支持,只能從支持該屏幕的Linux或者Android的調試信息和源碼來獲得相關IC信息,具體方式不再贅述。這里通過調試信息和源碼確認屏幕觸控芯片型號為CT365。

3.2.1Linux和Android下驅動源碼分析

    在RIotboard官方提供的源碼中關于CT365的驅動是以二進制形式提供的,僅有頭文件/driver/input/touchscreen/generic_ts_rel/ct365.h能作為參考,如程序清單 31所示,根據(jù)該頭文件可以獲取CT365的觸控信息報文結構:

程序清單 3-1  ct365頭文件中關于數(shù)據(jù)結構的描述

struct struct_ct365_pts_data {    unsigned char	xhi;           // X coordinate Hi
    unsigned char	yhi;           // Y coordinate Hi
    unsigned char	ylo : 4;       // Y coordinate Lo
    unsigned char	xlo : 4;       // X coordinate Lo
    unsigned char	status : 3;    // Action information, 1: Down; 2: Move; 3: Up
    unsigned char	id : 5;        // ID information, from 1 to CFG_MAX_POINT_NUM
    unsigned char	area;          // Touch area
    unsigned char	pressure;      // Touch Pressure};

    程序清單 31大致可以判斷出CT365的有效報文為6個字節(jié),其中前三個字節(jié)的觸控坐標信息和第四個字節(jié)前三位的觸控狀態(tài)是最為重要的數(shù)據(jù),這些數(shù)據(jù)最終會解析成鼠標事件。

3.2.2邏輯分析儀采樣

    將觸屏的I2C的兩根線接入邏輯分析儀,觸摸屏幕的時候抓取I2C通信數(shù)據(jù)(由于無法再次進行實驗,不提供抓取的數(shù)據(jù)截圖)。
    根據(jù)邏輯分析儀抓取的數(shù)據(jù),可以分析得出CT365的I2C設備地址為0x01,數(shù)據(jù)傳輸方式如圖3-4所示:

SylixOS里CT365 I2C觸控驅動移植

圖 3-4  CT365的數(shù)據(jù)通信流程

    根據(jù)以上搜集的信息,結合硬件的原理圖基本可以確定CT365的工作方式以及數(shù)據(jù)傳輸流程。
    CT365和主板連接部分只有一個I2C接口和一個中斷管腳,因此不需要初始化和復位,上電之后每次觸控都會產生一個中斷,通過中斷通知系統(tǒng)向CT365數(shù)據(jù)發(fā)送一幀數(shù)據(jù)為0的寫命令,隨后發(fā)送讀命令讀取CT365反饋的觸控信息,解析生產鼠標事件。

3.3代碼實現(xiàn)

    參考BSP包中其他的觸控芯片驅動的實現(xiàn),針對CT365僅需實現(xiàn)讀函數(shù),觸摸數(shù)據(jù)的解析函數(shù)。分解成以下幾個子函數(shù):

  • ct365GetEvent

  • ct365GetTouchPoint

  • ct365GetRxData

  • ct36xRegRead

3.3.1函數(shù)ct365GetEvent

    函數(shù)ct365GetEvent主要是由touch框架回調的,用來獲取觸控數(shù)據(jù)和生成鼠標事件的,所以先調用ct365GetRxData來獲取觸控數(shù)據(jù),在調用ct365GetTouchPoint來解析生成鼠標事件。具體實現(xiàn)如程序清單 32所示:

程序清單 3-2  ct365GetEvent函數(shù)實現(xiàn)

INT  ct365GetEvent (PTOUCH_DEV  pTouchDev, 
                    mouse_event_notify  events[]){
    INT           iError;
    UCHAR         ucBuffer[32];

    iError = ct365GetRxData(pTouchDev, ucBuffer, sizeof(ucBuffer));    if (iError == PX_ERROR) {
        printk(KERN_WARNING "touch: get touch point error!\n");        return  (PX_ERROR);
    }

    iError = ct365GetTouchPoint(pTouchDev, events, ucBuffer);    return  (iError);
}

3.3.2函數(shù)ct365GetTouchPoint

    函數(shù)ct365GetTouchPoint通過傳入的觸控數(shù)據(jù),根據(jù)CT365頭文件的數(shù)據(jù)報文結構分別解析出觸控的坐標和觸控的狀態(tài),封裝出鼠標事件。具體實現(xiàn)如程序清單 3-3所示:

程序清單 3-3  ct365GetTouchPoint函數(shù)實現(xiàn)

static INT  ct365GetTouchPoint (PTOUCH_DEV            pTouchDev,
                                mouse_event_notify    events[],
                                UINT8                *pucData)
{
    INT  iTouchPoint;

    iTouchPoint = pucData[3] & 0x3;    if (iTouchPoint > TOUCH_MAX_INPUT_POINTS) {
        iTouchPoint = TOUCH_MAX_INPUT_POINTS;
    }    if (iTouchPoint == 1) {
        events[0].xmovement = (INT16)((pucData[0] << 4) | (pucData[0]>>4 & 0xf));
        events[0].ymovement = (INT16)((pucData[1] << 4) | (pucData[2] & 0xf));
        events[0].ctype     = MOUSE_CTYPE_ABS;
        events[0].kstat     = MOUSE_LEFT;
        pTouchDev->TOUCH_iLastX = events[0].xmovement;
        pTouchDev->TOUCH_iLastY = events[0].ymovement;
    } else if (iTouchPoint == 2) {
        events[0].xmovement = (INT16)((pucData[0] << 4) | (pucData[0]>>4 & 0xf));
        events[0].ymovement = (INT16)((pucData[1] << 4) | (pucData[2] & 0xf));
        events[0].ctype     = MOUSE_CTYPE_ABS;
        events[0].kstat     = MOUSE_LEFT;
        pTouchDev->TOUCH_iLastX = events[0].xmovement;
        pTouchDev->TOUCH_iLastY = events[0].ymovement;
        iTouchPoint = 1;
    } else if (iTouchPoint == 3) {
        events[0].xmovement = pTouchDev->TOUCH_iLastX;
        events[0].ymovement = pTouchDev->TOUCH_iLastY;
        events[0].ctype     = MOUSE_CTYPE_ABS;
        events[0].kstat     = 0;
        iTouchPoint = TOUCH_RELEASE_NUM;
    }

    pTouchDev->TOUCH_iLastX = events[0].xmovement;
    pTouchDev->TOUCH_iLastY = events[0].ymovement;
    API_InterVectorEnable(pTouchDev->TOUCH_ulVector);    return  (iTouchPoint);
}

3.3.3函數(shù)ct365GetRxData

    函數(shù)ct365GetRxData調用函數(shù)ct36xRegRead去讀取I2C數(shù)據(jù)。具體實現(xiàn)如程序清單 3-4所示:

程序清單 3-4  ct365GetRxData函數(shù)實現(xiàn)

static INT  ct365GetRxData (PTOUCH_DEV  pTouchDev,                            UINT8      *pucBuffer,                            UINT16      usLen)
{
    INT     iError;

    iError = ct36xRegRead(pTouchDev->TOUCH_pI2cDevice,                       0,
                       pucBuffer,
                       usLen);    return  (iError);
}

3.3.4函數(shù)ct36xRegRead

    函數(shù)ct36xRegRead根據(jù)CT365的通訊流程讀取CT365反饋的觸控數(shù)據(jù)。具體實現(xiàn)如程序清單 3-5所示:

程序清單 3-5  ct36xRegRead函數(shù)實現(xiàn)

static INT  ct36xRegRead (PLW_I2C_DEVICE      pI2cDev,                          UINT8               ucReg,                          UINT8              *pucBuffer,                          UINT16              usLen)
{
    INT             iError;
    LW_I2C_MESSAGE  i2cMsgs[] = {
        {
            .I2CMSG_usAddr    = pI2cDev->I2CDEV_usAddr,
            .I2CMSG_usFlag    = 0,
            .I2CMSG_usLen     = 1,
            .I2CMSG_pucBuffer = (PUCHAR)&ucReg,
        },
        {
            .I2CMSG_usAddr    = pI2cDev->I2CDEV_usAddr,
            .I2CMSG_usFlag    = LW_I2C_M_RD,
            .I2CMSG_usLen     = usLen,
            .I2CMSG_pucBuffer = pucBuffer,
        },
    };

    iError = API_I2cDeviceTransfer(pI2cDev, i2cMsgs, 2);    if (iError != 2) {
        printk(KERN_ERR "__ft5x06RxData(): failed to i2c transfer!\n");        return  (PX_ERROR);
    }    return  (ERROR_NONE);
}

3.4BSP中驅動配置

    當觸控驅動完成后,如程序清單 3-6所示,根據(jù)硬件原理圖在BSP文件中配置好CT365的中斷管腳和I2C信息:

程序清單 3-6  配置CT365驅動信息信息

static TOUCH_DATA       _G_Ct365Data = {
        .T_pcBusName    = "/bus/i2c/2",                                 /*  I2C 總線名稱                */
        .T_uiIrq        = IMX6Q_GPIO_NUMR(6, 14),                       /*  IRQ 管腳號                  */
        .T_uiReset      = NULL,                                         /*  Reset 管腳號                */
        .T_uiIrqCfg     = GPIO_FLAG_IN | GPIO_FLAG_TRIG_FALL,           /*  IRQ 中斷模式                */
        .T_uiRstVal     = LW_GPIOF_INIT_LOW,                            /*  Reset 復位電平              */
        .T_usAddr       = 0x01,                                         /*  I2C 從機地址                */
        .T_iWidth       = 1024,                                         /*  分辨率 寬                   */
        .T_iHeight      = 768,                                          /*  分辨率 高                   */
        .T_iTouchNum    = 1,                                            /*  最大觸摸點數(shù)                */};static TOUCH_DRV_FUNC   _G_CT365DrvFunc = {
        .getevent       = ct365GetEvent,
        .init           = NULL,
        .deinit         = NULL,
        .reset          = NULL,
};

    如程序清單 3 7所示,配置完成后需要在函數(shù)boadDevInit里創(chuàng)建觸控設備:

程序清單 3-7  創(chuàng)建CT365觸控設備

touchDevCreate("/dev/input/touch0", _G_touchDrvNum, &_G_Ct365Data, &_G_CT365DrvFunc);

3.5測試

    在系統(tǒng)正常啟動和驅動正常加載的情況下,運行任意一個帶觸摸或者鼠標組件的QT程序,進行觸控操作,如果正確響應觸控事件,說明驅動移植基本完成。

網(wǎng)站名稱:SylixOS里CT365I2C觸控驅動移植
當前路徑:http://aaarwkj.com/article44/gjoiee.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、全網(wǎng)營銷推廣、企業(yè)網(wǎng)站制作、品牌網(wǎng)站建設、ChatGPT、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
激情四射五月天亚洲婷婷| 日本一区二区三区加勒比| 日本在线观看成人大片| 欧美视频综合一级91| 亚洲成人不卡一区二区三区| 中文字幕精品一区二区三| 中文字幕亚洲精品99| 亚洲三级成人一区在线| 免费观看久久久激情片| 国产一区二区黄色录像| 国产麻豆91在线视频| 精品国产一区二区三区卡| 国产乱码精品一区二区蜜臀| 亚洲中文字幕视频在看| 日韩中文字幕在线二区| 国产在线视频不卡福利片| 亚洲激情久热中文字幕| 粗暴蹂躏中文一区二区三区| 日本在线中文字幕乱码| 日韩在线啊啊啊的视频| 亚洲乱码中文字幕久久| 亚洲精品成人午夜av| 夫妻晚上同房太猛视频| 国产精品呻吟久久人妻| 天美传媒剧国产在线观看| 国产福利精品一区二区av| 久久精品一品二品三品| 亚洲午夜精品久久久天堂| 国产成人公开免费视频| 午夜福利精品在线观看| 国产精品偷拍自拍视频| 最新91精品国产自产在线| 日韩国产精品一区二区| 亚洲国产精品中文字幕久久| 国产在线精品不卡一区| 日本av天堂中文字幕| 日本午夜福利视频在线观看| 伊人丁香六月日日操操| 内射小美女阴户毛片在线| 99久久久久国产精品免费 | 欧美一区二区三区午夜|