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 + -
显示快捷键?