volatile S3C6410_GPIO_REG *g_pIOPregs = NULL;
volatile S3C6410_KEYPAD_REG *g_pKpadRegs = NULL;
g_pIOPregs = (volatile S3C6410_GPIO_REG*)TSP_RegAlloc((PVOID)S3C6410_BASE_REG_PA_GPIO, sizeof(S3C6410_GPIO_REG));
if (g_pIOPregs == NULL)
{
RETAILMSG(KEY_DUG, (TEXT("[KEY] For g_pIOPregs: VirtualAlloc failed!\r\n")));
}
RETAILMSG(KEY_MSG, (TEXT("[KEY] g_pIOPregs = 0x%x, Key_Pad_Init()------------haiou------------\r\n"), g_pIOPregs));
g_pIOPregs->GPKCON1 &= ~((0xf<< 0) | (0xf<< 4) | (0xf<< 8) | (0xf<<12) | (0xf<<16)); //GPK8, 9, 10, 11, 12 as Keypad----ROW
g_pIOPregs->GPKCON1 |= ((0x3<< 0) | (0x3<< 4) | (0x3<< 8) | (0x3<<12) | (0x3<<16));
g_pIOPregs->GPKPUD &= ~((0x3<<16) | (0x3<<18) | (0x3<<20) | (0x3<<22) | (0x3<<24)); //GPK8,9,10,11, 12 pull-up/down disabled
//g_pIOPregs->GPKPUD |= ((0x2<<16) | (0x2<<18) | (0x2<<20) | (0x2<<22) | (0x2<<24)); //GPK8,9,10,11,12 pull-up enabled
g_pIOPregs->GPLCON0 &= ~((0xF<< 0) | (0xF<< 4) | (0xF<< 8) | (0xF<<12) | (0xF<<16)); //GPL0,1,2,3,4 as Keypad---colume
g_pIOPregs->GPLCON0 |= ((0x3<< 0) | (0x3<< 4) | (0x3<< 8) | (0x3<<12) | (0x3<<16));
g_pIOPregs->GPLPUD &= ~((0x3<< 0) | (0x3<< 2) | (0x3<< 4) | (0x3<< 6) | (0x3<< 8)); //GPL0,1,2,3,4 pull-up/down disabled
//g_pIOPregs->GPLPUD |= ((0x1<< 0) | (0x1<< 2) | (0x1<< 4) | (0x1<< 6) | (0x1<< 8)); //GPL0,1,2,3,4 pull-down enabled
g_pKpadRegs = (volatile S3C6410_KEYPAD_REG*)TSP_RegAlloc((PVOID)S3C6410_BASE_REG_PA_KEYPAD, sizeof(S3C6410_KEYPAD_REG));
if (g_pKpadRegs == NULL)
{
RETAILMSG(KEY_DUG, (TEXT("[KEY] For g_pKpadRegs: VirtualAlloc failed!\r\n")));
}
RETAILMSG(KEY_MSG, (TEXT("[KEY] g_pKpadRegs = 0x%x, Key_Pad_Init()------------haiou------------\r\n"), g_pKpadRegs));
g_pKpadRegs->KEYIFCON &= ~(0x1F<< 0); //INT_F_EN, INT_R_EN, DF_EN, FC_EN
g_pKpadRegs->KEYIFCON |= (0xF << 0);
g_pKpadRegs->KEYIFFC = KEY_DEBOUNCE_PERIOD;
g_pKpadRegs->KEYIFCOL &= ~(0xFF<< 8);
//g_pKpadRegs->KEYIFCOL |= (0x1F<< 0);
Sleep(1000);
RETAILMSG(KEY_MSG, (TEXT("[KEY] Befor while(1)........\r\n")));
while(1)
{
g_pKpadRegs->KEYIFCOL &= ~(0x1F<< 0);
Sleep(1);
g_pKpadRegs->KEYIFCOL |= (0x1F<< 0);
Sleep(1);
}
现在问题在红色部分,按理解KEYIFCOL为键盘列输出,当然是可以通过这个寄存器配置高、低的,也就是说这段应该在示波器上能够看到方波才是,但现在却是一直low。
注:TSP_RegAlloc这个函数没问题,因为通过g_pIOPregs可正常设置IO口状态;
有没有做过6410的KeyPad Interface的朋友,帮忙处处注意
11 个解决方案
#1
一定要帮忙顶,我也准备弄这个
#2
现在问题在红色部分,按理解KEYIFCOL为键盘列输出,当然是可以通过这个寄存器配置高、低的,也就是说这段应该在示波器上能够看到方波才是,但现在却是一直low。
--->楼主要确认有没有在硬件方面直接接地拉低了。
--->楼主要确认有没有在硬件方面直接接地拉低了。
#3
mark,标记一下
#4
哦,这个在没有按键按下时是悬空的。
#5
现在发现新的问题:
在设置完Key Pad Interface相关的寄存器后,利用上面的代码打印出寄存器的值,发现我不管怎么设置寄存器,打印出的结果都是寄存器的默认值(对照手册察看)。要是我把设置寄存器的代码屏蔽掉,打印的更是默认值——说明我写寄存器没有成功,可是这寄存器都是可以R/W的啊
真是活见鬼了,为什么啊?
1、能读出默认值,说明寄存器的地址映射没有问题;
2、我先读再写也试了下,依然无效。
RETAILMSG(KEY_MSG, (TEXT("[KEY] KEYIFCON = 0x%x, Key_Pad_Init()------------1------------\r\n"), g_pKpadRegs->KEYIFCON));
RETAILMSG(KEY_MSG, (TEXT("[KEY] KEYIFSTSCLR = 0x%x, Key_Pad_Init()------------2------------\r\n"), g_pKpadRegs->KEYIFSTSCLR));
RETAILMSG(KEY_MSG, (TEXT("[KEY] KEYIFCOL = 0x%x, Key_Pad_Init()------------3------------\r\n"), g_pKpadRegs->KEYIFCOL));
RETAILMSG(KEY_MSG, (TEXT("[KEY] KEYIFROW = 0x%x, Key_Pad_Init()------------4------------\r\n"), g_pKpadRegs->KEYIFROW));
RETAILMSG(KEY_MSG, (TEXT("[KEY] KEYIFFC = 0x%x, Key_Pad_Init()------------5------------\r\n"), g_pKpadRegs->KEYIFFC));
在设置完Key Pad Interface相关的寄存器后,利用上面的代码打印出寄存器的值,发现我不管怎么设置寄存器,打印出的结果都是寄存器的默认值(对照手册察看)。要是我把设置寄存器的代码屏蔽掉,打印的更是默认值——说明我写寄存器没有成功,可是这寄存器都是可以R/W的啊
真是活见鬼了,为什么啊?
1、能读出默认值,说明寄存器的地址映射没有问题;
2、我先读再写也试了下,依然无效。
#6
检查下用TSP_RegAlloc()映射出来的地址是否正确
#7
这个没问题啊,因为读到了默认值!~
#8
在设置完Key Pad Interface相关的寄存器后,利用上面的代码打印出寄存器的值,发现我不管怎么设置寄存器,打印出的结果都是寄存器的默认值(对照手册察看)。
--->寄存器是可以正常配置的,我觉得你的问题,还是很有可能是硬件导致的。
--->寄存器是可以正常配置的,我觉得你的问题,还是很有可能是硬件导致的。
#9
搞清楚了,PCLK_GATE 这个寄存器也要设置,晕死!~
#10
找到问题,是吗?怎么解决的?
#11
你怎么一直在!这么快
~手册里对PCLK_GATE相应位是这么定义的。
PCLK_KEYPAD [11] Gating PCLK for Key PAD (0: mask, 1: pass)
好像是打开KEYPAD的PCLK,然后它才能工作吧。
~手册里对PCLK_GATE相应位是这么定义的。
PCLK_KEYPAD [11] Gating PCLK for Key PAD (0: mask, 1: pass)
好像是打开KEYPAD的PCLK,然后它才能工作吧。
#1
一定要帮忙顶,我也准备弄这个
#2
现在问题在红色部分,按理解KEYIFCOL为键盘列输出,当然是可以通过这个寄存器配置高、低的,也就是说这段应该在示波器上能够看到方波才是,但现在却是一直low。
--->楼主要确认有没有在硬件方面直接接地拉低了。
--->楼主要确认有没有在硬件方面直接接地拉低了。
#3
mark,标记一下
#4
哦,这个在没有按键按下时是悬空的。
#5
现在发现新的问题:
在设置完Key Pad Interface相关的寄存器后,利用上面的代码打印出寄存器的值,发现我不管怎么设置寄存器,打印出的结果都是寄存器的默认值(对照手册察看)。要是我把设置寄存器的代码屏蔽掉,打印的更是默认值——说明我写寄存器没有成功,可是这寄存器都是可以R/W的啊
真是活见鬼了,为什么啊?
1、能读出默认值,说明寄存器的地址映射没有问题;
2、我先读再写也试了下,依然无效。
RETAILMSG(KEY_MSG, (TEXT("[KEY] KEYIFCON = 0x%x, Key_Pad_Init()------------1------------\r\n"), g_pKpadRegs->KEYIFCON));
RETAILMSG(KEY_MSG, (TEXT("[KEY] KEYIFSTSCLR = 0x%x, Key_Pad_Init()------------2------------\r\n"), g_pKpadRegs->KEYIFSTSCLR));
RETAILMSG(KEY_MSG, (TEXT("[KEY] KEYIFCOL = 0x%x, Key_Pad_Init()------------3------------\r\n"), g_pKpadRegs->KEYIFCOL));
RETAILMSG(KEY_MSG, (TEXT("[KEY] KEYIFROW = 0x%x, Key_Pad_Init()------------4------------\r\n"), g_pKpadRegs->KEYIFROW));
RETAILMSG(KEY_MSG, (TEXT("[KEY] KEYIFFC = 0x%x, Key_Pad_Init()------------5------------\r\n"), g_pKpadRegs->KEYIFFC));
在设置完Key Pad Interface相关的寄存器后,利用上面的代码打印出寄存器的值,发现我不管怎么设置寄存器,打印出的结果都是寄存器的默认值(对照手册察看)。要是我把设置寄存器的代码屏蔽掉,打印的更是默认值——说明我写寄存器没有成功,可是这寄存器都是可以R/W的啊
真是活见鬼了,为什么啊?
1、能读出默认值,说明寄存器的地址映射没有问题;
2、我先读再写也试了下,依然无效。
#6
检查下用TSP_RegAlloc()映射出来的地址是否正确
#7
这个没问题啊,因为读到了默认值!~
#8
在设置完Key Pad Interface相关的寄存器后,利用上面的代码打印出寄存器的值,发现我不管怎么设置寄存器,打印出的结果都是寄存器的默认值(对照手册察看)。
--->寄存器是可以正常配置的,我觉得你的问题,还是很有可能是硬件导致的。
--->寄存器是可以正常配置的,我觉得你的问题,还是很有可能是硬件导致的。
#9
搞清楚了,PCLK_GATE 这个寄存器也要设置,晕死!~
#10
找到问题,是吗?怎么解决的?
#11
你怎么一直在!这么快
~手册里对PCLK_GATE相应位是这么定义的。
PCLK_KEYPAD [11] Gating PCLK for Key PAD (0: mask, 1: pass)
好像是打开KEYPAD的PCLK,然后它才能工作吧。
~手册里对PCLK_GATE相应位是这么定义的。
PCLK_KEYPAD [11] Gating PCLK for Key PAD (0: mask, 1: pass)
好像是打开KEYPAD的PCLK,然后它才能工作吧。