key.c.svn-base

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· SVN-BASE 代码 · 共 375 行

SVN-BASE
375
字号
/********************** BEGIN LICENSE BLOCK ************************************ * * JZ4740  mobile_tv  Project  V1.0.0 * INGENIC CONFIDENTIAL--NOT FOR DISTRIBUTION IN SOURCE CODE FORM * Copyright (c) Ingenic Semiconductor Co. Ltd 2005. All rights reserved. *  * This file, and the files included with this file, is distributed and made  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.  *  * http://www.ingenic.cn  * ********************** END LICENSE BLOCK ************************************** * *  Author:  <dsqiu@ingenic.cn>  <jgao@ingenic.cn>  * *  Create:   2008-06-26, by dsqiu *             *  Maintain: 2008-06-26, by jgao *             * ******************************************************************************* */#include <bsp.h>#include <jz4740.h>#include <ucos_ii.h>#include <key.h>#include <threadprio.h>#ifdef USE_MIDWARE#include "midware.h"#endif#define KEY_TASK_STK_SIZE	1024#define KEY_TASK_PRIO	KEY_THREAD_PRIO //1static OS_EVENT *key_sem;static OS_STK KeyTaskStack[KEY_TASK_STK_SIZE];extern void KeydownInfo();extern u8 LcdState;PFN_KEYHANDLE UpKey = NULL;PFN_KEYHANDLE DownKey = NULL;//PFN_KEYHANDLE UpKeyHandle = NULL;//PFN_KEYHANDLE DownKeyHandle = NULL;#if (KEYTYPE==3)u32 key_define[KEY_NUM]={(22+2*32),(23+2*32),(21+2*32),(17+2*32),(27+3*32)};u32 key_find[KEY_NUM]={0x01,0x02,0x04,0x08,0x10};#endif#define POWER_OFF_PIN    (29 + 3 * 32)	//GPD29#define POFF_TASK_STK_SIZE       128#define POFF_EACH_TIME    100#define POFF_TRY_TIME     20#define KEY_DETECT_REPEAT_TIME 100#define KEY_REPEAT_TIME 50#define KEY_DELAY_TIME 1#ifdef USE_MIDWAREvolatile static MIDSRC keysrc;volatile static MIDSRCDTA res;volatile static u32 keyid;volatile static MIDSRC poffsrc;volatile static MIDSRCDTA res;//volatile static u8 cardstate ;static u32 poffid;#if (KEYTYPE==2 || KEYTYPE==3 )static u8 key_index[64];#endifstatic int DownKeyHandle();static void UpKeyHandle();static void info_power_off(){	keysrc.Src = SRC_POWER_OFF;	keysrc.Event = EVENT_POWER_OFF;	OSQPost(keysrc.CurEvent1 , (void *)&keyid);	OSSemPost(keysrc.CurEvent);}static void GetRequest(MIDSRCDTA *dat){//	printf("Up layer get :%d \n",res.Val);}static void Response(MIDSRCDTA *dat){	if ( dat->Val == 1 )	{		printf("Check can power off or not ! \n");		ShutLcd(0);		cli();		while(1)		{			while( !(__gpio_get_pin(POWER_OFF_PIN)) );                //wait until key up			mdelay(200);			if ( __gpio_get_pin(POWER_OFF_PIN) == 1 )  //really power off			{								jz_pm_hibernate();			}		}	}	else		printf("Can not power off ! \n");}void check_poweroff(){	int i;	for ( i = 0; i < POFF_TRY_TIME ; i ++ )	{		OSTimeDlyHMSM(0,0,0,POFF_EACH_TIME);		if ( __gpio_get_pin(POWER_OFF_PIN) ==1 )			break;		printf("Power key keep low! \n");	}	if ( i >= POFF_TRY_TIME )  //really power off!	{		info_power_off();	}	else	{		DownKeyHandle( 0x40 );		UpKeyHandle( 0x40 );	}}#endifstatic void UpKeyHandle(int key) {#ifdef USE_MIDWARE	OSQPost(keysrc.CurEvent1 , (void *)&keyid);	keysrc.Src = SRC_KEY;	OSSemPost(keysrc.CurEvent);	printf("Key Up %d ! \n",LcdState);#endif		if(UpKey) UpKey(key);}static int DownKeyHandle(int key) {	u8 err;#ifdef USE_MIDWARE	OSQPost(keysrc.CurEvent1 , (void *)&keyid);	keysrc.Src = SRC_KEY_DOWN;	OSSemPost(keysrc.CurEvent);	printf("Key Down %d ! \n",LcdState);#endif	if(DownKey) DownKey(key);}static void key_interrupt_handler(u32 arg){	for(arg = 0;arg < KEY_NUM;arg++)#if (KEYTYPE==3)	__gpio_mask_irq(key_define[arg]);#else  __gpio_mask_irq(KEY_PIN + arg);#endif		__gpio_mask_irq(POWER_OFF_PIN);	OSTaskChangePrio( KEY_TASK_PRIO + 150, KEY_TASK_PRIO );	OSSemPost(key_sem);}static void KeyTaskEntry(void *arg){	u8 err;	u16 i,run,count = 0;	u32 key,oldkey;	u32 upkey = 0;	u32 keyrepeat = KEY_DETECT_REPEAT_TIME / KEY_DELAY_TIME;		printf("Key Install \r\n");		while(1)	{		OSTaskChangePrio( KEY_TASK_PRIO, KEY_TASK_PRIO + 150 );		OSSemPend(key_sem, 0, &err);#ifdef USE_MIDWARE		if ( __gpio_get_pin(POWER_OFF_PIN) == 0 )		{			check_poweroff();			goto out;		}#endif//		oldkey = (~REG_GPIO_PXPIN(KEY_PIN / 32)) & KEY_MASK;#if (KEYTYPE==3)	for(i = 0;i < KEY_NUM;i++)	{		if ( __gpio_get_pin(key_define[i]) == 0 )			  oldkey = key_find[i];	}		oldkey = key_index[oldkey];#else		oldkey = (~REG_GPIO_PXPIN(KEY_PIN / 32)) & KEY_MASK;#if (KEYTYPE==2)    oldkey = key_index[oldkey];#endif#endif		run = 1;			count = 0;		keyrepeat = KEY_DETECT_REPEAT_TIME / KEY_DELAY_TIME;		while(run)		{						OSTimeDly(KEY_DELAY_TIME);#if (KEYTYPE==3)	for(i = 0;i < KEY_NUM;i++)	{		if ( __gpio_get_pin(key_define[i]) == 0 )			  key = key_find[i];	}			key = key_index[key];#elif (KEYTYPE==2)	    key = ((~REG_GPIO_PXPIN(KEY_PIN / 32)) >> 18) & KEY_MASK;	    key = key_index[key];#else			key = (~REG_GPIO_PXPIN(KEY_PIN / 32))  & KEY_MASK;#endif//			dprintf("reg = 0x%8x key = 0x%x oldkey = 0x%x\r\n",REG_GPIO_PXPIN(KEY_PIN / 32),key,oldkey);						if(key ^ oldkey)			{								oldkey = key;				continue;			}						else			{				if(key)				{										if(key & (~upkey))					{												DownKeyHandle(key & (~upkey));					}										else					{						if((key ^ upkey) & upkey)							UpKeyHandle((key ^ upkey) & upkey);					}					if(key == upkey)					{						count++;											if(count > keyrepeat)						{							count = 0;						    upkey = 0;							keyrepeat = KEY_REPEAT_TIME / KEY_DELAY_TIME;						}					}else					{						count = 0;						//UpKeyHandle(key);					    upkey = key;					}									}else				{					if(upkey)						UpKeyHandle(upkey);					run = 0;					upkey =0;									}											}					}	out:				__gpio_ack_irq(POWER_OFF_PIN);//		ack_irq(48 + POWER_OFF_PIN);		__gpio_unmask_irq(POWER_OFF_PIN);		for(i = 0; i < KEY_NUM; i++)		{#if (KEYTYPE==3)			__gpio_ack_irq(key_define[i]);			__gpio_unmask_irq(key_define[i]);#else						__gpio_ack_irq(KEY_PIN + i);			__gpio_unmask_irq(KEY_PIN + i);#endif					}		}	}void KeyInit(){	int i;	key_sem = OSSemCreate(0);#ifdef USE_MIDWARE	keysrc.GetRequest = GetRequest;	keysrc.Response = Response;	keysrc.Name = "KEY";	RegisterMidSrc((PMIDSRC)&keysrc);	printf("Register Midware SRC Key! %d \n",keysrc.ID);	keyid = keysrc.ID;	__gpio_mask_irq(POWER_OFF_PIN);	__gpio_as_func0(POWER_OFF_PIN);	__gpio_as_input(POWER_OFF_PIN);	__gpio_disable_pull(POWER_OFF_PIN);#endif#if (KEYTYPE==2)printf("11111\n"); 	key_index[0x01] = 0x04; 	key_index[0x02] = 0x02; 	key_index[0x04] = 0x20; 	key_index[0x08] = 0x08; 	key_index[0x10] = 0x01;#endif#if (KEYTYPE==3)printf("11111222222\n");	key_index[0x01] = 0x20;	key_index[0x02] = 0x04;	key_index[0x04] = 0x02;	key_index[0x08] = 0x01;	key_index[0x10] = 0x08;#endif	for(i = 0;i < KEY_NUM;i++)	{#if (KEYTYPE==3)		__gpio_as_irq_fall_edge(key_define[i]);		__gpio_mask_irq(key_define[i]);		request_irq(IRQ_GPIO_0 + key_define[i], key_interrupt_handler, 0);#else		__gpio_as_irq_fall_edge(KEY_PIN + i);		__gpio_mask_irq(KEY_PIN + i);		request_irq(IRQ_GPIO_0 + KEY_PIN + i, key_interrupt_handler, 0);#endif	}	request_irq(IRQ_GPIO_0 + POWER_OFF_PIN, key_interrupt_handler, 0);   	OSTaskCreate(KeyTaskEntry, (void *)0,		     (void *)&KeyTaskStack[KEY_TASK_STK_SIZE - 1],		     KEY_TASK_PRIO);	for(i = 0;i < KEY_NUM;i++)#if (KEYTYPE==3)			__gpio_unmask_irq(key_define[i]);#else    __gpio_unmask_irq(KEY_PIN + i);#endif		__gpio_as_irq_fall_edge(POWER_OFF_PIN);	__gpio_unmask_irq(POWER_OFF_PIN);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?