You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
4.2 KiB
134 lines
4.2 KiB
/* vxbFtGpio.h - Driver for GPIO controller*/
|
|
|
|
/*
|
|
*
|
|
* This program is OPEN SOURCE software: you can redistribute it and/or modify it;
|
|
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
*
|
|
*/
|
|
|
|
#ifndef __INCvxbFtGpioh
|
|
#define __INCvxbFtGpioh
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define GPIO_READ_4(pCtrl, addr) \
|
|
vxbRead32 ((pCtrl->gpioHandle), \
|
|
(UINT32 *)((char *)(pCtrl->pInst->pRegBase[0]) + (addr)))
|
|
|
|
#define GPIO_WRITE_4(pCtrl, addr, data) \
|
|
vxbWrite32 ((pCtrl->gpioHandle), \
|
|
(UINT32 *)((char *)(pCtrl->pInst->pRegBase[0]) + (addr)), data)
|
|
|
|
/* gpio mode */
|
|
#define GPIO_MODE_NOT_USED 0
|
|
#define GPIO_MODE_IN 1
|
|
#define GPIO_MODE_OUT 2
|
|
#define GPIO_MODE_INT 3
|
|
|
|
#define FT_GPIO_PORT_WIDTH 8
|
|
|
|
/* Register offset */
|
|
#define GPIO_SW_DR_A 0x00 /* output register for port A*/
|
|
#define GPIO_SW_DDR_A 0x04 /* director register for port A. 0:input; 1:output */
|
|
#define GPIO_EXT_A 0x08 /* input register for port A*/
|
|
#define GPIO_SW_DR_B 0x0c /* output register for port B*/
|
|
#define GPIO_SW_DDR_B 0x10 /* director register for port B. 0:input; 1:output */
|
|
#define GPIO_EXT_B 0x14 /* input register for port B*/
|
|
|
|
#define GPIO_INTEN_A 0x18 /* only Port A support interrupt */
|
|
#define GPIO_INTMASK_A 0x1c
|
|
#define GPIO_INTTYPE_LEVEL_A 0x20
|
|
#define GPIO_INT_POLARITY_A 0x24
|
|
#define GPIO_INTSTATUS_A 0x28
|
|
#define GPIO_RAW_INTSTATUS_A 0x2c
|
|
#define GPIO_LS_SYNC_A 0x30
|
|
#define GPIO_DEBOUNCE 0x34
|
|
#define GPIO_PORTA_EOI_A 0x38
|
|
|
|
/* group index */
|
|
#define GPIO_PORT_A 0
|
|
#define GPIO_PORT_B 1
|
|
#define GPIO_PORT_MUM 2
|
|
|
|
/* gpio direction */
|
|
#define GPIO_DIR_IN 0
|
|
#define GPIO_DIR_OUT 1
|
|
|
|
/* int enable/disable */
|
|
#define GPIO_INT_DIS 0
|
|
#define GPIO_INT_ENA 1
|
|
|
|
/* int mask */
|
|
#define GPIO_INT_NOT_MASK 0
|
|
#define GPIO_INT_MASK 1
|
|
|
|
/* int type */
|
|
#define GPIO_INT_TYPE_LEVEL 0
|
|
#define GPIO_INT_TYPE_EDGE 1
|
|
|
|
/* int polarity */
|
|
#define GPIO_INT_POL_LOW_DOWN 0
|
|
#define GPIO_INT_POL_HIGH_UP 1
|
|
|
|
/* Private context structure */
|
|
|
|
typedef struct ftIsrEntry
|
|
{
|
|
VOIDFUNCPTR pIsr; /* ISR */
|
|
void * pArg; /* parameter */
|
|
} FT_ISR_ENTRY;
|
|
|
|
typedef struct ftGpioDrvCtrl
|
|
{
|
|
VXB_DEVICE_ID pInst; /* pointer to the controller instance */
|
|
void * gpioHandle; /* handle of GPIO vxbRead/vxbWrite */
|
|
FT_ISR_ENTRY isrTable[FT_GPIO_PORT_WIDTH]; /* ISR handler table */
|
|
UINT8 pinMode[GPIO_PORT_MUM][FT_GPIO_PORT_WIDTH]; /* GPIO_MODE_NOT_USED 0
|
|
GPIO_MODE_IN 1
|
|
GPIO_MODE_OUT 2
|
|
GPIO_MODE_INT 3
|
|
*/
|
|
STATUS intEnabled; /*whether have pin of portA used as interrupt mode */
|
|
UINT32 triggerMode; /*Trigger mode*/
|
|
/* set pin mode */
|
|
STATUS (*gpioModeSet)
|
|
(
|
|
VXB_DEVICE_ID pDev,
|
|
UINT32 port,
|
|
UINT32 pin,
|
|
UINT32 mode
|
|
);
|
|
/* get input value of a pin */
|
|
UINT32 (*gpioInput)
|
|
(
|
|
VXB_DEVICE_ID pDev,
|
|
UINT32 port,
|
|
UINT32 pin
|
|
);
|
|
/* output value to a pin */
|
|
STATUS (*gpioOutput)
|
|
(
|
|
VXB_DEVICE_ID pDev,
|
|
UINT32 port,
|
|
UINT32 pin,
|
|
UINT32 value
|
|
);
|
|
/* set ISR for a pin */
|
|
STATUS (*gpioISRSet)
|
|
(
|
|
VXB_DEVICE_ID pDev,
|
|
UINT32 pin,
|
|
VOIDFUNCPTR pIsr, /* ISR */
|
|
void * pArg /* parameter */
|
|
);
|
|
} FT_GPIO_DRVCTRL;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCvxbFtGpioh */
|
|
|