SylixOS GSLX680触摸屏驱动移植
SylixOS下将电容式触摸屏封装成一个字符设备,应用程序只需通过read函数读取触摸屏设备,即可获取到填充有触摸坐标信息的mouse_event_notify 结构体。
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); } |
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); } |
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); } |
将Linux下的驱动代码移植到SylixOS下,需要将硬件初始化动作及获取触摸屏坐标值。
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); } |
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 GSLX680触摸屏驱动移植相关推荐
- GSLX680触摸屏驱动移植
GSLX680 触摸屏 触摸屏按照触摸屏的工作原理和传输信息的介质,可以分为四种,它们分别为电阻式.电容感应式.红外线式以及表面声波式.GSLX680 为电容式触摸屏,挂接在I2C总线上,通过I2C总 ...
- 9.触摸屏驱动移植实战
转自 https://edu.csdn.net/lecturer/505 朱老师物联网大讲堂 <5.linux驱动开发-第9部分-5.9.触摸屏驱动移植实战> 第一部分.章节目录 5.9. ...
- 移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植
移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植的过程记录下来: (1)首先打一个补丁:s3c2410_touchscreen.patch, 在内核解压的根目录下 patch -N ...
- NUC972触摸屏驱动移植过程分析(二)
https://blog.csdn.net/b7376811/article/details/86607529 今天继续分析NUC972的触摸屏驱动移植过程,上一节主要分析了触摸屏需要数据,今天来分析 ...
- gslx680触摸屏驱动源码码分析(gslX680.c)
1.触摸屏代码整体分析 (1)gslx680触摸屏是I2C接口设备,所以驱动代码是利用I2C子系统提供的接口来编写,用I2C核心层提供的I2C驱动注册接口将构建好的I2C驱动结构体向I2C子系统注册: ...
- FL2440移植LINUX-3.4.2 -- 按键驱动和触摸屏驱动移植
(一)先移植按键输入子系统驱动: 拿过去编译,改错,然后insmod: (二)触摸屏驱动拿过去编译,改错,然后insmod: 触摸屏驱动的使用: 编译: tar xzf tslib-1.4.tar.g ...
- usb触摸屏驱动移植
最近公司产品在原有基础上增加一个触摸功能,因电路已经定型,只有usb接口引出来,所以只能选用市面上usb接口的触摸屏,联系了多家触摸屏代理商,移植时都存在问题. 公司产品用的平台是: PXA270 + ...
- 2.6.36.2 s3c6410 触摸屏驱动移植。
CSDN_Acanoe 的博客:http://blog.csdn.net/ACanoe 硬件环境:OK6410 A板,4.3 寸TFT 屏. 移植内核:Linux2.6.36.2 . 参考内核: 飞 ...
- mtk6582平台GT9157触摸屏驱动移植
一.GT9157触摸屏移植 1.在mediatek/config/sanstar82_cwet_kk/ProjectConfig.mk中 CUSTOM_KERNEL_TOUCHPANEL=GT9XX ...
最新文章
- Swift 中使用 SQLite——新增数据
- 将页面转发到用户登录页面
- angularjs解决方案之 递归模板
- 第五周课程总结实验报告(三)
- 排序算法之冒泡排序(JAVA)
- HTML5超链接和多媒体,IT兄弟连 HTML5教程 多媒体应用 创建图像和链接
- C# 线程手册 第四章 线程设计原则 对等线程模型
- jvm垃圾回收机制_详解JVM内存管理与垃圾回收机制1 - 内存管理
- layui表单验证规则
- 安卓电子书格式_不用电脑,6招教你把手机上的电子书传输到Kindle上
- STM32单片机配置FPGA
- 论文阅读 (九):A survey on instance selection for active learning (2012)
- 关于BFS和dijkstra(2019.04.20)
- c语言自定义标识符do,C语言基础知识习题
- 抖音上热门?这几个一定要记住
- 基于Labview的信号和噪声频带交错情况下的滤波系统设计
- 多人协作开发Axure教程(附Axure RP9的密钥)
- 笨方法学Python笔记(6)
- 如何通过神经网络实现XNOR函数?
- 松下串口PLC远程上下载程序