6678-GPIO源码解析(2)
1.寄存器相关的结构体
6678的GPIO0-15共十六个GPIO。这些GPIO的工作模式通过寄存器进行配置。
#define CSL_GPIO_REGS (0x02320000) (cslr_device.h中定义)
CSL_GpioRegs * gpGPIO_regs= (CSL_GpioRegs * )CSL_GPIO_REGS;(keystonecommon中定义,通过结构体指针定义,后续方便赋值配置寄存器)
cslr_gpio.h中对
typedef struct {
volatile Uint32 DIR; /*方向寄存器,0输入,1输出*/
volatile Uint32 OUT_DATA;/*控制相应的GPn引脚驱动状态。这些位不会影响那些配置为输入引脚的状态。读取将返回这些寄存器的值,而不是引脚的状态。*/
volatile Uint32 SET_DATA;/*写 1 置位相应的输出数据寄存器位。读取该寄存器返回输出数据寄存器的内容。写0没有影响。*/
volatile Uint32 CLR_DATA;/*写 1 清除输出数据寄存器相应的位。读取该寄存器返回输出数据寄存器的内容。写0没有影响,*/
volatile Uint32 IN_DATA;/*读取GPIO信号*/
volatile Uint32 SET_RIS_TRIG;/*使能上升沿中断*/
volatile Uint32 CLR_RIS_TRIG;/*写1到CLR_RIS_TRIG清除RIS_TRIG相对应的位。写0无作用。读取CLR_RIS_TRIG返回RIS_TRIG内的值。*/
volatile Uint32 SET_FAL_TRIG;/*使能下降沿中断*/
volatile Uint32 CLR_FAL_TRIG;
volatile Uint32 INTSTAT;
} CSL_GpioBank_registersRegs;
/**************************************************************************\
* Register Overlay Structure
\**************************************************************************/
typedef struct {
volatile Uint32 PID;
volatile Uint32 PCR;
volatile Uint32 BINTEN;/*使能GPIO中断*/
volatile Uint8 RSVD0[4];
CSL_GpioBank_registersRegs BANK_REGISTERS[4];
} CSL_GpioRegs;
GPIO的高低电平变化ns级别。
2. 基于CSL库的函数
这些函数控制引脚的输出,基本都是实现对单个引脚的操作,可进一步在此基础上进行封装。
cslr_gpio.h 声明了打开实例的函数并返回一个实例,未找到函数实现,预计为将gpio寄存器的结构体指向gpio寄存器地址并返回这个实例。
cslr_gpioAux.h其他函数的声明,可以看到详细的实现。
Functions | |
CSL_IDEF_INLINE void | CSL_GPIO_getPID (CSL_GpioHandle hGpio, Uint8 *scheme, Uint16 *function, Uint8 *rtl, Uint8 *major, Uint8 *custom, Uint8 *minor) |
CSL_IDEF_INLINE void | CSL_GPIO_getPCR (CSL_GpioHandle hGpio, Uint8 *soft, Uint8 *free) |
CSL_IDEF_INLINE void | CSL_GPIO_bankInterruptEnable (CSL_GpioHandle hGpio, Uint8 bankNum) |
CSL_IDEF_INLINE void | CSL_GPIO_bankInterruptDisable (CSL_GpioHandle hGpio, Uint8 bankNum) |
CSL_IDEF_INLINE Bool | CSL_GPIO_isBankInterruptEnabled (CSL_GpioHandle hGpio, Uint8 bankNum) |
CSL_IDEF_INLINE void | CSL_GPIO_setPinDirOutput (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE void | CSL_GPIO_setPinDirInput (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE Bool | CSL_GPIO_getPinDirection (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE void | CSL_GPIO_getOutputData (CSL_GpioHandle hGpio, Uint8 pinNum, Uint8 *outData) |
CSL_IDEF_INLINE void | CSL_GPIO_setOutputData (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE void | CSL_GPIO_clearOutputData (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE void | CSL_GPIO_getInputData (CSL_GpioHandle hGpio, Uint8 pinNum, Uint8 *inData) |
CSL_IDEF_INLINE void | CSL_GPIO_setRisingEdgeDetect (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE void | CSL_GPIO_clearRisingEdgeDetect (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE Bool | CSL_GPIO_isRisingEdgeDetect (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE void | CSL_GPIO_setFallingEdgeDetect (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE void | CSL_GPIO_clearFallingEdgeDetect (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE Bool | CSL_GPIO_isFallingEdgeDetect (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE Bool | CSL_GPIO_getInterruptStatus (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_IDEF_INLINE void | CSL_GPIO_clearInterruptStatus (CSL_GpioHandle hGpio, Uint8 pinNum) |
CSL_GpioHandle | CSL_GPIO_open (Int32 instNum)必须首先被调用 ,如 |