1. GSLX680 触摸屏

触摸屏按照触摸屏的工作原理和传输信息的介质,可以分为四种,它们分别为电阻式、电容感应式、红外线式以及表面声波式。GSLX680 为电容式触摸屏,挂接在I2C总线上,通过I2C总线来传输触摸屏数据。该芯片的连接方式如所示及与T3板子的I2C连接如所示。

  1. 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);

}

  1. 电容触摸屏事件上抛线程

触摸事件提交分为上下半程处理,下半程线程会阻塞等待触摸中断事件产生。当产生了触摸中断时,会调用__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);

}

  1. 移植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);

}

  1. 获取坐标事件函数,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);

}

  1. 参考资料

《SylixOS应用程序开发手册》

SylixOS GSLX680触摸屏驱动移植相关推荐

  1. GSLX680触摸屏驱动移植

    GSLX680 触摸屏 触摸屏按照触摸屏的工作原理和传输信息的介质,可以分为四种,它们分别为电阻式.电容感应式.红外线式以及表面声波式.GSLX680 为电容式触摸屏,挂接在I2C总线上,通过I2C总 ...

  2. 9.触摸屏驱动移植实战

    转自 https://edu.csdn.net/lecturer/505 朱老师物联网大讲堂 <5.linux驱动开发-第9部分-5.9.触摸屏驱动移植实战> 第一部分.章节目录 5.9. ...

  3. 移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植

    移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植的过程记录下来: (1)首先打一个补丁:s3c2410_touchscreen.patch, 在内核解压的根目录下 patch -N ...

  4. NUC972触摸屏驱动移植过程分析(二)

    https://blog.csdn.net/b7376811/article/details/86607529 今天继续分析NUC972的触摸屏驱动移植过程,上一节主要分析了触摸屏需要数据,今天来分析 ...

  5. gslx680触摸屏驱动源码码分析(gslX680.c)

    1.触摸屏代码整体分析 (1)gslx680触摸屏是I2C接口设备,所以驱动代码是利用I2C子系统提供的接口来编写,用I2C核心层提供的I2C驱动注册接口将构建好的I2C驱动结构体向I2C子系统注册: ...

  6. FL2440移植LINUX-3.4.2 -- 按键驱动和触摸屏驱动移植

    (一)先移植按键输入子系统驱动: 拿过去编译,改错,然后insmod: (二)触摸屏驱动拿过去编译,改错,然后insmod: 触摸屏驱动的使用: 编译: tar xzf tslib-1.4.tar.g ...

  7. usb触摸屏驱动移植

    最近公司产品在原有基础上增加一个触摸功能,因电路已经定型,只有usb接口引出来,所以只能选用市面上usb接口的触摸屏,联系了多家触摸屏代理商,移植时都存在问题. 公司产品用的平台是: PXA270 + ...

  8. 2.6.36.2 s3c6410 触摸屏驱动移植。

    CSDN_Acanoe 的博客:http://blog.csdn.net/ACanoe 硬件环境:OK6410 A板,4.3 寸TFT 屏.  移植内核:Linux2.6.36.2 . 参考内核: 飞 ...

  9. mtk6582平台GT9157触摸屏驱动移植

    一.GT9157触摸屏移植 1.在mediatek/config/sanstar82_cwet_kk/ProjectConfig.mk中 CUSTOM_KERNEL_TOUCHPANEL=GT9XX ...

最新文章

  1. Swift 中使用 SQLite——新增数据
  2. 将页面转发到用户登录页面
  3. angularjs解决方案之 递归模板
  4. 第五周课程总结实验报告(三)
  5. 排序算法之冒泡排序(JAVA)
  6. HTML5超链接和多媒体,IT兄弟连 HTML5教程 多媒体应用 创建图像和链接
  7. C# 线程手册 第四章 线程设计原则 对等线程模型
  8. jvm垃圾回收机制_详解JVM内存管理与垃圾回收机制1 - 内存管理
  9. layui表单验证规则
  10. 安卓电子书格式_不用电脑,6招教你把手机上的电子书传输到Kindle上
  11. STM32单片机配置FPGA
  12. 论文阅读 (九):A survey on instance selection for active learning (2012)
  13. 关于BFS和dijkstra(2019.04.20)
  14. c语言自定义标识符do,C语言基础知识习题
  15. 抖音上热门?这几个一定要记住
  16. 基于Labview的信号和噪声频带交错情况下的滤波系统设计
  17. 多人协作开发Axure教程(附Axure RP9的密钥)
  18. 笨方法学Python笔记(6)
  19. 如何通过神经网络实现XNOR函数?
  20. 松下串口PLC远程上下载程序

热门文章

  1. 前端系列三十五:跨域问题及解决方案
  2. 如何在 macOS 下安装 QGIS
  3. shell命令之zip压缩和解压
  4. json2xlsx AND xlsx2json 接口
  5. InVEST模型 | HAbitat quality模块计算生境质量
  6. 陌生QQ号聊天,QQ咨询对话框,QQ临时对话框链接代码
  7. 如何将CAD中的横向文字变成竖向排列?
  8. scrapy爬虫【4】→爬百度美女图
  9. python爬虫进阶-滑块验证码破解(bilibili)
  10. Allure生成测试报告