key_bak

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

TXT
297
字号
#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;#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#undef printf#define printf(x,args...)#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;static 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;	OSSemPost(keysrc.CurEvent);	printf("Key Down %d ! \n",LcdState);#endif	if(DownKey) DownKey(key);}static void key_interrupt_handler(u32 arg){	__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,count1=0;	u32 key,oldkey,key1,oldkey1;	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, 20, &err);	#ifdef USE_MIDWARE		if ( __gpio_get_pin(POWER_OFF_PIN) == 0 )		{			check_poweroff();			goto out;		}#endif		oldkey = Read_Adkey();#if SLCDTYPE == 102		if(!__gpio_get_pin(32*2 + 18))			oldkey |= 0x40; 		if(!__gpio_get_pin(32*2 + 21))				oldkey |= 0x01; #elif SLCDTYPE ==101		if(!__gpio_get_pin(32*2 + 18))			oldkey |= 0x01; #endif					run = 1;		count = 0;		keyrepeat = KEY_DETECT_REPEAT_TIME / KEY_DELAY_TIME;		while(run)		{						OSTimeDly(KEY_DELAY_TIME);			key=Read_Adkey();#if SLCDTYPE == 102 						if(!__gpio_get_pin(32*2 + 18))				key |= 0x40; 			if(!__gpio_get_pin(32*2 + 21))					key |= 0x01; #elif SLCDTYPE == 101			if(!__gpio_get_pin(32*2 + 18))				key |= 0x01; #endif						printf("%s.%s key =0x%x", __FILE__, __func__, key);					             if(key==0 && oldkey==0)					run=0;			if(key ^ oldkey)			{								oldkey = key;				continue;			}						else			{				if(key)				{										if(key & (~upkey) )					{												DownKeyHandle(key & (~upkey));						printf("read adkey = %x\n",key);					}					  					else					{						if((key ^ upkey) & upkey)							UpKeyHandle((key ^ upkey) & upkey);						      printf("UpKeyHandle()\n");					}					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 && key==0)						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);	}	}void KeyInit() {	int i;	key_sem = OSSemCreate(0);#ifdef USE_MIDWARE	keysrc.GetRequest = GetRequest;	keysrc.Response = Response;	keysrc.Name = "KEY";	RegisterMidSrc((PMIDSRC)&keysrc);	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	request_irq(48 + POWER_OFF_PIN, key_interrupt_handler, 0);   	OSTaskCreate(KeyTaskEntry, (void *)0,		     (void *)&KeyTaskStack[KEY_TASK_STK_SIZE - 1],		     KEY_TASK_PRIO);	__gpio_as_irq_fall_edge(POWER_OFF_PIN);		__gpio_unmask_irq(POWER_OFF_PIN);#if SLCDTYPE == 102		__gpio_as_input(32*2 + 18);	//__gpio_enable_pull(32*2 + 18);	__gpio_as_input(32*2 + 21);	//__gpio_enable_pull(32*2 + 21);#elif SLCDTYPE == 101	__gpio_as_input(32*2 + 18);#endif	}

⌨️ 快捷键说明

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