最近遇到一个疑惑的问题:、
在我做的东东里有一步是对硬件及其相关进行检测,可是在对芯片的BGA信号(不知道这样说行不行) 进行检测的时候却老是不通过,下面是出错的地方:
BOOL DrvExioBitTstGpio(EXIO_PORTMAP io)
{
PELDIO_GPIO_REG pGPIO = (PELDIO_GPIO_REG)ELDIO_GPIO_A_REGS_UA;
if( GPIO_BIT_TST(pGPIO+GET_EXIO_PHYS_PORT(io), GET_EXIO_PHYS_BIT(io)) ){
return TRUE;
} else {
return FALSE;
}
}
在上面的函数中返回了 FALSE 导致check 不过,也就是说GPIO_BIT_TST(pGPIO+GET_EXIO_PHYS_PORT(io), GET_EXIO_PHYS_BIT(io)) 的返回值为 0
以下是GPIO_BIT_TST() 的相关定义:
#define GPIO_BITS (sizeof(ELDIO_GPIO_DATA_TYPE)*8)
#define GPIO_BIT(N) (1<<(N))
#define GPIO_BIT_0 GPIO_BIT(0)
#define GPIO_BIT_1 GPIO_BIT(1)
#define GPIO_BIT_2 GPIO_BIT(2)
#define GPIO_BIT_3 GPIO_BIT(3)
#define GPIO_BIT_4 GPIO_BIT(4)
#define GPIO_BIT_5 GPIO_BIT(5)
#define GPIO_BIT_6 GPIO_BIT(6)
#define GPIO_BIT_7 GPIO_BIT(7)
#define GPIO_PNUM GPIO_BIT(GPIO_BITS)
#define GPIO_MASK (GPIO_PNUM-1)
#define GPIO_MSK(R,M) (((PELDIO_GPIO_REG)(R))->data[(M)&GPIO_MASK])
#define GPIO_GET_MSK(R,M) ((ELDIO_GPIO_DATA_TYPE)GPIO_MSK(R,M))
#define GPIO_GET(R) GPIO_GET_MSK(R,GPIO_MASK)
#define GPIO_SET_MSK(R,M,D) (GPIO_MSK(R,M)=(D))
#define GPIO_SET(R,D) GPIO_SET_MSK(R,GPIO_MASK,D)
#define GPIO_MSK_CLR(R,M) (GPIO_MSK(R,M)=0)
#define GPIO_MSK_INV(R,M) (GPIO_MSK(R,M)=~GPIO_MSK(R,M))
#define GPIO_MSK_SET(R,M) (GPIO_MSK(R,M)=GPIO_MASK)
#define GPIO_BIT_CLR(R,B) GPIO_MSK_CLR(R,GPIO_BIT(B))
#define GPIO_BIT_INV(R,B) GPIO_MSK_INV(R,GPIO_BIT(B))
#define GPIO_BIT_SET(R,B) GPIO_MSK_SET(R,GPIO_BIT(B))
#define GPIO_BIT_TST(R,B) GPIO_GET_MSK(R,GPIO_BIT(B))
根据定义GPIO_BIT_TST() 的功能是检测某个通用GPIO口的某个BIT位
pGPIO+GET_EXIO_PHYS_PORT(io) 这个应该是没有影响的 我这是E口(通用口为A到 T)
我觉得出错的地方就是 GET_EXIO_PHYS_BIT(io)的值 (io为0x20) (GET_EXIO_PHYS_BIT(io)是0 的话就说明是E0口?硬件就是这么接的,说明算出来是0应该就是对的啊,检测到了E0口是BGA信号,为什么返回FLASE????整不明白)
/*
7 --- 0:ELDIO Port | 1:Extend Port
6 -+- Physical I/O Port | Extend Out Port
5 | (GPIO_A - GPIO_T) | (0 - 1, 15)
4 |
3 -+
2 -+- Physical I/O Bit
1 | (0 - 7)
0 -+
*/
#define EXIO_PORTMAP BYTE
#define EXIO_PHYS_DEF(EX,PORT,BIT) (BYTE)(((EX)<<7)|((PORT)<<3)|(BIT))
#define EXIO_PHYS_ELDIO(PORT,BIT) EXIO_PHYS_DEF(0,PORT,BIT)
#define EXIO_PHYS_EXIO(PORT,BIT) EXIO_PHYS_DEF(1,PORT,BIT)
#define EXIO_PHYS_NOP EXIO_PHYS_DEF(1,15,7)
#if ED_CD1 || ED_CD2
#define EXIO_PHYS_(BIT) EXIO_PHYS_EXIO((BIT)>>3,(BIT)&7)
#define EXIO_PHYS_EQU_VIRT
#endif
#define IS_EXIO_EXTEND(X) ((X)&0x80)
#define GET_EXIO_PHYS_PORT(X) (((X)>>3)&0xF)
#define GET_EXIO_PHYS_BIT(X) ((X)&0x7)
#define GET_EXIO_EXTEND_BIT(X) ((X)&0x7F)