一个很直接的问题:S3C6410 KeyPad Interface

时间:2023-01-02 12:24:14
代码是这样:
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


哦,这个在没有按键按下时是悬空的。
引用 2 楼 chinesedragon2010 的回复:
现在问题在红色部分,按理解KEYIFCOL为键盘列输出,当然是可以通过这个寄存器配置高、低的,也就是说这段应该在示波器上能够看到方波才是,但现在却是一直low。
--->楼主要确认有没有在硬件方面直接接地拉低了。

#5


现在发现新的问题:
	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


这个没问题啊,因为读到了默认值!~

引用 6 楼 xu_viper 的回复:
检查下用TSP_RegAlloc()映射出来的地址是否正确

#8


在设置完Key Pad Interface相关的寄存器后,利用上面的代码打印出寄存器的值,发现我不管怎么设置寄存器,打印出的结果都是寄存器的默认值(对照手册察看)。
--->寄存器是可以正常配置的,我觉得你的问题,还是很有可能是硬件导致的。

#9


搞清楚了,PCLK_GATE 这个寄存器也要设置,晕死!~

#10


引用 9 楼 haiou_arm 的回复:
搞清楚了,PCLK_GATE 这个寄存器也要设置,晕死!~

找到问题,是吗?怎么解决的?

#11


你怎么一直在!这么快
~手册里对PCLK_GATE相应位是这么定义的。
PCLK_KEYPAD [11] Gating PCLK for Key PAD (0: mask, 1: pass)
好像是打开KEYPAD的PCLK,然后它才能工作吧。
引用 10 楼 chinesedragon2010 的回复:
引用 9 楼 haiou_arm 的回复:
搞清楚了,PCLK_GATE 这个寄存器也要设置,晕死!~

找到问题,是吗?怎么解决的?

#1


一定要帮忙顶,我也准备弄这个

#2


现在问题在红色部分,按理解KEYIFCOL为键盘列输出,当然是可以通过这个寄存器配置高、低的,也就是说这段应该在示波器上能够看到方波才是,但现在却是一直low。
--->楼主要确认有没有在硬件方面直接接地拉低了。

#3


mark,标记一下

#4


哦,这个在没有按键按下时是悬空的。
引用 2 楼 chinesedragon2010 的回复:
现在问题在红色部分,按理解KEYIFCOL为键盘列输出,当然是可以通过这个寄存器配置高、低的,也就是说这段应该在示波器上能够看到方波才是,但现在却是一直low。
--->楼主要确认有没有在硬件方面直接接地拉低了。

#5


现在发现新的问题:
	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


这个没问题啊,因为读到了默认值!~

引用 6 楼 xu_viper 的回复:
检查下用TSP_RegAlloc()映射出来的地址是否正确

#8


在设置完Key Pad Interface相关的寄存器后,利用上面的代码打印出寄存器的值,发现我不管怎么设置寄存器,打印出的结果都是寄存器的默认值(对照手册察看)。
--->寄存器是可以正常配置的,我觉得你的问题,还是很有可能是硬件导致的。

#9


搞清楚了,PCLK_GATE 这个寄存器也要设置,晕死!~

#10


引用 9 楼 haiou_arm 的回复:
搞清楚了,PCLK_GATE 这个寄存器也要设置,晕死!~

找到问题,是吗?怎么解决的?

#11


你怎么一直在!这么快
~手册里对PCLK_GATE相应位是这么定义的。
PCLK_KEYPAD [11] Gating PCLK for Key PAD (0: mask, 1: pass)
好像是打开KEYPAD的PCLK,然后它才能工作吧。
引用 10 楼 chinesedragon2010 的回复:
引用 9 楼 haiou_arm 的回复:
搞清楚了,PCLK_GATE 这个寄存器也要设置,晕死!~

找到问题,是吗?怎么解决的?