|
各位好!我是刚接触wince的底层,现在要做GPIO的设置,我打开天嵌6410的底层程序在原来的基础上修改了,但是发现GPC不能实现高低电平的切换。我修改的部分是这样的:
#define IO_CTL_GPIO_1_ON 0x08
#define IO_CTL_GPIO_2_ON 0x09
#define IO_CTL_GPIO_3_ON 0x0A
#define IO_CTL_GPIO_1_OFF 0x0B
#define IO_CTL_GPIO_2_OFF 0x0C
#define IO_CTL_GPIO_3_OFF 0x0D
#define IO_CTL_GPIO_4_ON 0x0E
#define IO_CTL_GPIO_4_OFF 0x0F
#define IO_CTL_GPIO_5_ON 0x18
#define IO_CTL_GPIO_5_OFF 0x19
#define IO_CTL_GPIO_11_ON 0x10
#define IO_CTL_GPIO_12_ON 0x11
#define IO_CTL_GPIO_13_ON 0x12
#define IO_CTL_GPIO_11_OFF 0x13
#define IO_CTL_GPIO_12_OFF 0x14
#define IO_CTL_GPIO_13_OFF 0x15
#define IO_CTL_GPIO_14_ON 0x16
#define IO_CTL_GPIO_14_OFF 0x17
DWORD GIO_Init(DWORD dwContext)
{
RETAILMSG(1,(TEXT("GPIO Initialize ...")));
if (!InitializeAddresses())
return (FALSE);
v_pGPIORegs->GPBCON = (v_pGPIORegs->GPBCON &~(0xF << 0)) | (1<< 0); // GPB0 == OUTPUT.LED1
v_pGPIORegs->GPBCON = (v_pGPIORegs->GPBCON &~(0xF << 4)) | (1<< 4); // GPB1 == OUTPUT.LED2
v_pGPIORegs->GPBCON = (v_pGPIORegs->GPBCON &~(0xF << 8)) | (1<< 8); // GPB2 == OUTPUT.LED3
v_pGPIORegs->GPBCON = (v_pGPIORegs->GPBCON &~(0xF << 12)) | (1<< 12); // GPB3 == OUTPUT.LED4
v_pGPIORegs->GPCCON = (v_pGPIORegs->GPCCON &~(0xF << 0)) | (1<< 0); // GPC0 == OUTPUT.LED1
v_pGPIORegs->GPCCON = (v_pGPIORegs->GPCCON &~(0xF << 4)) | (1<< 4); // GPC1 == OUTPUT.LED2
v_pGPIORegs->GPCCON = (v_pGPIORegs->GPCCON &~(0xF << 8)) | (1<< 8); // GPC2 == OUTPUT.LED3
v_pGPIORegs->GPCCON = (v_pGPIORegs->GPCCON &~(0xF << 12)) | (1<< 12); // GPC3 == OUTPUT.LED4
v_pGPIORegs->GPKCON0 = (v_pGPIORegs->GPKCON0 &~(0xF << 0)) | (1<< 0); // GPK0 == OUTPUT.LED1
v_pGPIORegs->GPBPUD = (v_pGPIORegs->GPBPUD &~(0x3<< 0)); // GPB0 pull up/down disabled.
v_pGPIORegs->GPBPUD = (v_pGPIORegs->GPBPUD &~(0x3<< 2)); // GPB1 pull up/down disabled.
v_pGPIORegs->GPBPUD = (v_pGPIORegs->GPBPUD &~(0x3<< 4)); // GPB2 pull up/down disabled.
v_pGPIORegs->GPBPUD = (v_pGPIORegs->GPBPUD &~(0x3<< 6)); // GPB3 pull up/down disabled.
v_pGPIORegs->GPCPUD = (v_pGPIORegs->GPCPUD &~(0x3<< 0)); // GPC0 pull up/down disabled.
v_pGPIORegs->GPCPUD = (v_pGPIORegs->GPCPUD &~(0x3<< 2)); // GPC1 pull up/down disabled.
v_pGPIORegs->GPCPUD = (v_pGPIORegs->GPCPUD &~(0x3<< 4)); // GPC2 pull up/down disabled.
v_pGPIORegs->GPCPUD = (v_pGPIORegs->GPCPUD &~(0x3<< 6)); // GPC3 pull up/down disabled.
v_pGPIORegs->GPKPUD = (v_pGPIORegs->GPKPUD &~(0x3<< 0)); // GPK0 pull up/down disabled
mInitialized = TRUE;
RETAILMSG(1,(TEXT("OK !!!\r\n")));
return TRUE;
}
BOOL GIO_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
switch(dwCode)
{
case IO_CTL_GPIO_1_ON:
v_pGPIORegs->GPBDAT=v_pGPIORegs->GPBDAT|(0x1<<0);
break;
case IO_CTL_GPIO_2_ON:
v_pGPIORegs->GPBDAT=v_pGPIORegs->GPBDAT|(0x1<<1);
break;
case IO_CTL_GPIO_3_ON:
v_pGPIORegs->GPBDAT=v_pGPIORegs->GPBDAT|(0x1<<2);
break;
case IO_CTL_GPIO_4_ON:
v_pGPIORegs->GPBDAT=v_pGPIORegs->GPBDAT|(0x1<<3);
break;
case IO_CTL_GPIO_1_OFF:
v_pGPIORegs->GPBDAT=v_pGPIORegs->GPBDAT&~(0x1<<0);
break;
case IO_CTL_GPIO_2_OFF:
v_pGPIORegs->GPBDAT=v_pGPIORegs->GPBDAT&~(0x1<<1);
break;
case IO_CTL_GPIO_3_OFF:
v_pGPIORegs->GPBDAT=v_pGPIORegs->GPBDAT&~(0x1<<2);
break;
case IO_CTL_GPIO_4_OFF:
v_pGPIORegs->GPBDAT=v_pGPIORegs->GPBDAT&~(0x1<<3);
break;
case IO_CTL_GPIO_11_ON:
v_pGPIORegs->GPCDAT=v_pGPIORegs->GPCDAT|(0x1<<0);
break;
case IO_CTL_GPIO_12_ON:
v_pGPIORegs->GPCDAT=v_pGPIORegs->GPCDAT|(0x1<<1);
break;
case IO_CTL_GPIO_13_ON:
v_pGPIORegs->GPCDAT=v_pGPIORegs->GPCDAT|(0x1<<2);
break;
case IO_CTL_GPIO_14_ON:
v_pGPIORegs->GPCDAT=v_pGPIORegs->GPCDAT|(0x1<<3);
break;
case IO_CTL_GPIO_11_OFF:
v_pGPIORegs->GPCDAT=v_pGPIORegs->GPCDAT&~(0x1<<0);
break;
case IO_CTL_GPIO_12_OFF:
v_pGPIORegs->GPCDAT=v_pGPIORegs->GPCDAT&~(0x1<<1);
break;
case IO_CTL_GPIO_13_OFF:
v_pGPIORegs->GPCDAT=v_pGPIORegs->GPCDAT&~(0x1<<2);
break;
case IO_CTL_GPIO_14_OFF:
v_pGPIORegs->GPCDAT=v_pGPIORegs->GPCDAT&~(0x1<<3);
break;
case IO_CTL_GPIO_5_ON:
v_pGPIORegs->GPKDAT=v_pGPIORegs->GPKDAT|(0x1<<0);
break;
case IO_CTL_GPIO_5_OFF:
v_pGPIORegs->GPKDAT=v_pGPIORegs->GPKDAT&~(0x1<<0);
break;
default:
break;
}
RETAILMSG(DEBUG_GPIO,(TEXT("GPIO_Control:Ioctl code = 0x%x\r\n"), dwCode));
return TRUE;
}
现在GPB没有问题,可以实现高低电平切换,但是GPC就不行,希望各位能指点一下,谢谢! |
|