天嵌 ARM开发社区

 找回密码
 注册
查看: 2376|回复: 0

wince6 GPIO底层设置问题6410

[复制链接]
miaomiao2935 发表于 2012-7-23 09:52:03 | 显示全部楼层 |阅读模式
各位好!我是刚接触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就不行,希望各位能指点一下,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-25 05:10 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表