📄 ambamse.c
字号:
/* ambaMse.c - ARM AMBA mouse driver routines *//* Copyright 1993-2001 Wind River System, Inc. */#include "copyright_wrs.h"/*modification history--------------------01b,12sep01,m_h fix delays01a,10aug01,m_h created*//*DESCRIPTIONThis is the driver for ARM's AMBA PrimeCell mouse controller chip. This driversupports a PS2 type of pointing device.NOTESThe following macros must be defined in ambakmi.h file: COMMAND_AMBA_MS,DATA_AMBA_MS, STATUS_AMBA_MS. These refer to the I/O base addresses of the various key board controller registers. In addition, the macro MSE_INT_LVL and MSE_INT_VIC must be defined that identifies the interrupt level and vector that is to be used for the mouse interrupts. Also the I/O access method requires that the macros MS_IN and MS_OUT be defined.*//* includes */#include "vxWorks.h"#include "iv.h"#include "ioLib.h"#include "iosLib.h"#include "memLib.h"#include "tyLib.h"#include "errnoLib.h"#include "wdLib.h"#include "sysLib.h"#include "intLib.h"#include "taskLib.h"#include "ambakmi.h"#include "ugl/bspExt/bspUtil.h"#ifndef COMMAND_AMBA_MS#warning "Mouse driver is not initialized for processor"#else/* forward declarations */LOCAL void mseHwInit();LOCAL int mseOpen();LOCAL int mseClose();LOCAL void mseTxStart();LOCAL void ambaMseIntr (MSE_DEVICE *pDev);LOCAL void mseDelay(void);#ifdef USE_BSP_API#include <ugl/sysWindML.h>int ambaMseRegBase, ambaMseRegDelta;#endif/********************************************************************************* ambaPs2DevCreate - PS/2 mouse driver initialization routine** This routine creates a device for a PS/2 mouse. The AMBA hardware is* initialized when the keyboard interface is initialized.** RETURNS: device number, if sucessful; otherwise ERROR.** SEE ALSO: */int ambaPs2DevCreate ( char *name /* name to be associated with device */ ) { int mseDrvNum; /* device number for this driver */ DEV_HDR * pHdr; MSE_DEVICE * pMseDevice; /* device descriptors */ char * pName;#ifdef USE_BSP_API WINDML_DEVICE *pDev;#endif /* if device is already present, do not create again */ pHdr = iosDevFind (name, &pName); if ((pHdr != NULL) && (strcmp (name, pHdr->name) == 0)) return (OK); pMseDevice = (MSE_DEVICE *)malloc (sizeof (MSE_DEVICE)); /* enable the mouse interrupt */ #ifdef USE_BSP_API pDev = sysWindMLDevGet (WINDML_POINTER_DEVICE, 0, 0, 0); ambaMseRegBase = (int)(pDev->pRegBase); ambaMseRegDelta = pDev->regDelta; sysWindMLIntConnect (pDev, ambaMseIntr, (int)pMseDevice);#else /* USE_BSP_API */ (void) intConnect (INT_LVL_MOUSE, ambaMseIntr, (int)pMseDevice);#endif /* USE_BSP_API */ /* Install the driver and return installation status */ mseDrvNum = iosDrvInstall(mseOpen, (FUNCPTR) NULL, mseOpen, (FUNCPTR) mseClose, tyRead, tyWrite, tyIoctl); /* Create the channels for this device */ if (tyDevInit(&pMseDevice->ty_dev, 512, 512, (FUNCPTR)mseTxStart) != OK) return (ERROR); /* initialize the interface */ mseHwInit (); /* enable the pointer interrupt */#ifdef USE_BSP_API sysWindMLIntEnable (pDev);#else /* USE_BSP_API */ intEnable ((int) INT_VEC_MOUSE);#endif /* USE_BSP_API */ /* add the device to the I/O system */ if (iosDevAdd(&pMseDevice->ty_dev.devHdr,name,mseDrvNum) == ERROR) return (ERROR); return (mseDrvNum); }/********************************************************************************* mseHwInit - initialize AMBA hardware for mouse support** This routine initializes the AMBA hardware for a PS/2 mouse.** RETURNS N/A** SEE ALSO: */LOCAL void mseHwInit (void) { /* disable everything */ *KMI_CR(KMI1_BASE) = 0; /* Clock divisor */ *KMI_CR(MOUSE_CLK) = KMI_DIVISOR; /* Enable mouse and interrupts */ *KMI_CR(MOUSE_CR) = KMI_CR_RXIEN | KMI_CR_KMIEN; /* send reset */ *KMI_CR(MOUSE_DATA) = 0xFF; mseDelay(); /* send enable */ *KMI_CR(MOUSE_DATA) = 0xF4; return; }/********************************************************************************* mseOpen - open file** This routine opens the PS2 device.* * RETURNS device structure** SEE ALSO: */LOCAL int mseOpen ( MSE_DEVICE *dev, char *name, int mode ) { return ((int)dev); }/******************************************************************************* mseTxStart - send data to mouse** This routine transmits data to the PS2 device** RETURNS N/A** SEE ALSO: */LOCAL void mseTxStart ( MSE_DEVICE *dev ) { char out_char; while (tyITx(&dev->ty_dev,&out_char) == OK); }/******************************************************************************* mseClose - close file** This routine closes the PS2 device** RETURNS N/A** SEE ALSO: */LOCAL int mseClose ( MSE_DEVICE *dev ) { return((int)dev); }/******************************************************************************* ambaMseIntr - handle interrupts** This routine is the PS2 interrupt handler** RETURNS NA** SEE ALSO: */LOCAL void ambaMseIntr ( MSE_DEVICE *pDev /* device control structure */ ) { unsigned char in_char; if (MS_IN(STATUS_AMBA_MS) & KMI_RXFULL) { in_char = MS_IN(DATA_AMBA_MS); tyIRd (&pDev->ty_dev,in_char); } }/******************************************************************************** ambaMsCommand - write command to the mouse.** Write command to the mouse.** RETURNS: OK or ERROR if timed out*/STATUS ambaMsCommand ( UCHAR command ) { MS_OUT (COMMAND_AMBA_MS, command); return (OK); }/********************************************************************************* mseDelay - pause* * This routine is called to introduce some delay** RETURNS: N/A** NOMANUAL*/LOCAL void mseDelay(void) { taskDelay (sysClkRateGet () >> 3); }#endif /* COMMAND_AMBA_MS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -