GSLX680触摸屏驱动移植
觸摸屏按照觸摸屏的工作原理和傳輸信息的介質,可以分為四種,它們分別為電阻式、電容感應式、紅外線式以及表面聲波式。GSLX680 為電容式觸摸屏,掛接在I2C總線上,通過I2C總線來傳輸觸摸屏數據。該芯片的連接方式如所示及與T3板子的I2C連接如所示。
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};
}
?
《SylixOS應用程序開發手冊》
轉載于:https://blog.51cto.com/13927802/2386483
總結
以上是生活随笔為你收集整理的GSLX680触摸屏驱动移植的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS版数据结构第三篇(链表)
- 下一篇: git使用:本地分支merge到远程分支