日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GSLX680触摸屏驱动移植

發布時間:2025/4/5 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GSLX680触摸屏驱动移植 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • GSLX680 觸摸屏
    觸摸屏按照觸摸屏的工作原理和傳輸信息的介質,可以分為四種,它們分別為電阻式、電容感應式、紅外線式以及表面聲波式。GSLX680 為電容式觸摸屏,掛接在I2C總線上,通過I2C總線來傳輸觸摸屏數據。該芯片的連接方式如所示及與T3板子的I2C連接如所示。
  • SylixOS 電容式觸摸屏分析
    SylixOS下將電容式觸摸屏封裝成一個字符設備,應用程序只需通過read函數讀取觸摸屏設備,即可獲取到填充有觸摸坐標信息的mouse_event_notify 結構體。
    1, 電容屏初始化
    INT touchDrv (VOID)
    {
    struct file_operations fileOper;
    INT iDrvNum;
    lib_memset(&fileOper, 0, sizeof(struct file_operations));
    fileOper.owner = THIS_MODULE;
    fileOper.fo_create = touchOpen;
    fileOper.fo_open = __touchOpen;
    fileOper.fo_close =
    touchClose;
    fileOper.fo_read = touchRead;
    fileOper.fo_lstat = __touchLstat;
    fileOper.fo_ioctl =
    touchIoctl;
    iDrvNum = iosDrvInstallEx2(&fileOper, LW_DRV_TYPE_NEW_1);
    DRIVER_LICENSE(iDrvNum, "Dual BSD/GPL->Ver 1.0");
    DRIVER_AUTHOR(iDrvNum, "Xu.Guizhou");
    DRIVER_DESCRIPTION(iDrvNum, "touch driver.")
    return (iDrvNum);
    }
    創建觸摸屏設備的邏輯如下:
    iError = iosDevAddEx(&pTouchDev->TOUCH_devHdr, pcName, iDrvNum, DT_CHR);
    if (iError) {
    _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
    __SHEAP_FREE(pTouchDev);
    printk(KERN_ERR "touchDevCreate(): failed to create touch device %s!\n", pcName);
    return (PX_ERROR);
    }
  • 2, 電容觸摸屏事件上拋線程
    觸摸事件提交分為上下半程處理,下半程線程會阻塞等待觸摸中斷事件產生。當產生了觸摸中斷時,會調用touchHandleEvents 獲取坐標值,并將獲取到的坐標值填入mouse_event_notify 結構體,最終通過消息隊列傳送到觸摸屏定義的 read 函數中。用戶調用觸摸驅動的 read 函數時,即可獲取到觸摸事件信息。
    static PVOID
    touchThread (PVOID pvArg)
    {
    INT iEventNum;
    PTOUCH_DEV pTouchDev = (PTOUCH_DEV)pvArg;
    while (!pTouchDev->TOUCH_bQuit) {
    API_SemaphoreBPend(pTouchDev->TOUCH_hSignal, LW_OPTION_WAIT_INFINITE);
    if (pTouchDev->TOUCH_bQuit) {
    break;
    }
    iEventNum = __touchHandleEvents(pTouchDev);
    if (iEventNum == PX_ERROR) {
    printk(KERN_ERR "touch: handle touch event fail!\n");
    } else if (iEventNum > 0) {
    SEL_WAKE_UP_ALL(&pTouchDev->TOUCH_selList, SELREAD);
    }
    }
    return (LW_NULL);
    }

    3. 電容觸摸屏觸摸中斷產生
    手指觸摸時中斷處理邏輯如下:
    static irqreturn_t __touchIsr (PTOUCH_DEV pTouchDev, ULONG ulVector)
    {
    irqreturn_t irqreturn;
    irqreturn = API_GpioSvrIrq(pTouchDev->TOUCH_data.T_uiIrq);
    if (irqreturn == LW_IRQ_HANDLED) {
    API_GpioClearIrq(pTouchDev->TOUCH_data.T_uiIrq);
    API_SemaphoreBPost(pTouchDev->TOUCH_hSignal);
    }
    return (irqreturn);
    }

  • 移植GSLX680 觸摸屏
    將Linux下的驅動代碼移植到SylixOS下,需要將硬件初始化動作及獲取觸摸屏坐標值。
    1, 硬件初始化動作放在設備的open動作下,包括創建I2C子設備,GPIO中斷申請,芯片初始化:
    static INT touchHwInit (PTOUCH_DEV pTouchDev, PCHAR pcName)
    {
    INT iError;
    pTouchDev->TOUCH_pI2cDevice =
    API_I2cDeviceCreate(pTouchDev->TOUCH_data.T_pcBusName,
    pcName,
    pTouchDev->TOUCH_data.T_usAddr,
    0);
    if (pTouchDev->TOUCH_pI2cDevice == LW_NULL) {
    printk(KERN_ERR "
    touchHwInit(): failed to create i2c device %s, slave addr 0x%x!\n",
    pTouchDev->TOUCH_data.T_pcBusName,
    pTouchDev->TOUCH_data.T_usAddr);
    goto __error_handle;
    }
    /*

    • 設置觸摸屏中斷
      */

    iError = API_GpioRequestOne(pTouchDev->TOUCH_data.T_uiIrq,
    pTouchDev->TOUCH_data.T_uiIrqCfg,
    "touch_eint");
    if (iError != ERROR_NONE) {
    printk(KERN_ERR "touchHwInit(): failed to request irq gpio!\n");
    goto
    error_handle;
    }
    iError = API_GpioSetupIrq(pTouchDev->TOUCH_data.T_uiIrq, pTouchDev->TOUCH_data.T_uiIrqCfg, 1);
    if (iError == PX_ERROR) {
    printk(KERN_ERR "touchHwInit(): failed to setup gpio irq!\n");
    goto
    error_handle;
    }
    pTouchDev->TOUCH_ulVector = (ULONG)iError;
    printk("__touchHwInit %d\n\r",iError);
    /*

    • 申請觸摸屏復位管腳
      /
      iError = API_GpioRequestOne(pTouchDev->TOUCH_data.T_uiReset,
      pTouchDev->TOUCH_data.T_uiRstVal | LW_GPIOF_DIR_OUT,
      "touch_reset");
      if (iError != ERROR_NONE) {
      printk(KERN_ERR "touchHwInit(): failed to request rst gpio!\n");
      goto
      error_handle;
      }
      __touchReset(pTouchDev); / Reset Touch Screen /
      if (pTouchDev->pDrvFunc->init) { / Init Touch Screen */
      pTouchDev->pDrvFunc->init(pTouchDev);
      }
      return (ERROR_NONE);
      __error_handle:
      API_GpioFree(pTouchDev->TOUCH_data.T_uiIrq);
      API_GpioFree(pTouchDev->TOUCH_data.T_uiReset);

    if (pTouchDev->TOUCH_pI2cDevice) {
    API_I2cDeviceDelete(pTouchDev->TOUCH_pI2cDevice);
    pTouchDev->TOUCH_pI2cDevice = LW_NULL;
    }
    return (PX_ERROR);
    }

  • 2, 獲取坐標事件函數,gslX680GetEvent 將獲取的坐標上報:
    static TOUCH_DRV_FUNC _G_Gsl680DrvFunc = {
    .getevent = gslX680GetEvent,
    .init = gslX680Init,
    .deinit = NULL,
    .reset = NULL,
    };
    INT gslX680GetEvent (PTOUCH_DEV pTouchDev, mouse_event_notify events[])
    {
    INT iError;
    UCHAR ucBuffer[36];
    u8 read_buf[4] = {0};

    iError = gsl_ts_read(pTouchDev, 0x80, ucBuffer, GSL_CONTACT_SIZE); if (iError == PX_ERROR) {printk(KERN_WARNING "touch: get touch point error!\n");return (PX_ERROR); }if(ucBuffer[0] == 0xff) {return (iError); }iError = gsl_ts_read( pTouchDev, 0xbc, read_buf, sizeof(read_buf));if (iError == PX_ERROR) {printk(KERN_WARNING "touch: read 0xbc failed!\n");return (iError); }if (read_buf[3] == 0 && read_buf[2] == 0 && read_buf[1] == 0 && read_buf[0] == 0){iError = process_gslX680_data(pTouchDev,events,ucBuffer); } else {reset_chip(pTouchDev);startup_chip(pTouchDev);iError = 0; }return (iError);

    }

    ?

  • 參考資料
    《SylixOS應用程序開發手冊》
  • 轉載于:https://blog.51cto.com/13927802/2386483

    總結

    以上是生活随笔為你收集整理的GSLX680触摸屏驱动移植的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。