当前位置: 技术问答>linux和unix
嵌入式高手:请指教
来源: 互联网 发布时间:2016-12-23
本文导语: 我想对我核心新片的 gpio口进行操作,我在应用程序中写了一个设置函数(网上找的)如下,然后我根据datasheet调用它了 SetRegVal(REG_BASE_ADDR,0x0008,0xffffffff,0x01);//设置GPIO3_0为普通的GPIO口 SetRegVal(REG_BASE_ADDR,0x000C,0xfffffff...
我想对我核心新片的 gpio口进行操作,我在应用程序中写了一个设置函数(网上找的)如下,然后我根据datasheet调用它了
SetRegVal(REG_BASE_ADDR,0x0008,0xffffffff,0x01);//设置GPIO3_0为普通的GPIO口
SetRegVal(REG_BASE_ADDR,0x000C,0xffffffff,0x01););//设置GPIO3_0为普通的GPIO口
SetRegVal(GPIO3_BASE_ADDR,0x0400,0xffffffff,0x03);//设置GPIO3_0 GPIO3_1为输出引脚
SetRegVal(GPIO3_BASE_ADDR,0x00,0xfffffffc,0x00);//设置为 GPIO3_0 GPIO3_1 0 0。
把程序方放到装置里面运行 就是不生效,也就是 GPIO3_0 GPIO3_1还是默认情况下的低电平,但是我打印输出的确是:
00000001
00000001
00000001
00000001
00000003
00000003
00000000
00000000
不知道这个是什么原因???应该怎么排查?? 还有就是这个mem设备是什么啊,网上这么写的,我也照写了,正好我的/dev下面 有这个设备。
static HI_S32 SetRegVal(HI_U32 u32Base, HI_U32 u32Offset, HI_U32 u32ANDVal, HI_U32 u32ORVal)
{
HI_S32 s32MapFd = -1;
HI_U32 *pu32TmpAddr = NULL;
HI_U32 u32TmpVal;
s32MapFd = open("/dev/mem", O_RDWR|O_SYNC);
if (-1 == s32MapFd)
{ return HI_FAILURE;
}
pu32TmpAddr = (HI_U32 *)mmap((void *)0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, s32MapFd, u32Base);
if (MAP_FAILED == pu32TmpAddr)
{
close(s32MapFd);
printf("失败映射n");
return HI_FAILURE;
}
u32TmpVal = *(pu32TmpAddr+(u32Offset>>2));
printf("%08xn",u32TmpVal);
u32TmpVal &= u32ANDVal;
u32TmpVal |= u32ORVal;
*(pu32TmpAddr+(u32Offset>>2)) = u32TmpVal;
printf("%08xn",u32TmpVal);
munmap((HI_VOID *)pu32TmpAddr, 0x1000);
close(s32MapFd);
return HI_SUCCESS;
}
SetRegVal(REG_BASE_ADDR,0x0008,0xffffffff,0x01);//设置GPIO3_0为普通的GPIO口
SetRegVal(REG_BASE_ADDR,0x000C,0xffffffff,0x01););//设置GPIO3_0为普通的GPIO口
SetRegVal(GPIO3_BASE_ADDR,0x0400,0xffffffff,0x03);//设置GPIO3_0 GPIO3_1为输出引脚
SetRegVal(GPIO3_BASE_ADDR,0x00,0xfffffffc,0x00);//设置为 GPIO3_0 GPIO3_1 0 0。
把程序方放到装置里面运行 就是不生效,也就是 GPIO3_0 GPIO3_1还是默认情况下的低电平,但是我打印输出的确是:
00000001
00000001
00000001
00000001
00000003
00000003
00000000
00000000
不知道这个是什么原因???应该怎么排查?? 还有就是这个mem设备是什么啊,网上这么写的,我也照写了,正好我的/dev下面 有这个设备。
static HI_S32 SetRegVal(HI_U32 u32Base, HI_U32 u32Offset, HI_U32 u32ANDVal, HI_U32 u32ORVal)
{
HI_S32 s32MapFd = -1;
HI_U32 *pu32TmpAddr = NULL;
HI_U32 u32TmpVal;
s32MapFd = open("/dev/mem", O_RDWR|O_SYNC);
if (-1 == s32MapFd)
{ return HI_FAILURE;
}
pu32TmpAddr = (HI_U32 *)mmap((void *)0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, s32MapFd, u32Base);
if (MAP_FAILED == pu32TmpAddr)
{
close(s32MapFd);
printf("失败映射n");
return HI_FAILURE;
}
u32TmpVal = *(pu32TmpAddr+(u32Offset>>2));
printf("%08xn",u32TmpVal);
u32TmpVal &= u32ANDVal;
u32TmpVal |= u32ORVal;
*(pu32TmpAddr+(u32Offset>>2)) = u32TmpVal;
printf("%08xn",u32TmpVal);
munmap((HI_VOID *)pu32TmpAddr, 0x1000);
close(s32MapFd);
return HI_SUCCESS;
}
|
感觉你这么做是不对的。
如果要设置GPIO,至少应该先使能吧,也就是配置类似GPIO Controller寄存器吧
如果要设置GPIO,至少应该先使能吧,也就是配置类似GPIO Controller寄存器吧