android 類比IR(續一)---核心

來源:互聯網
上載者:User

在http://blog.csdn.net/cuityanxi/article/details/18413725 中我有給出IR類比的範例程式碼,但是只能作為參考;
若要在android中使用還有諸多問題,比如:android平台中有較多的中斷會導致延時的誤差很大,因此我有做改進,通過實驗證實是很可靠的。

思路:使用者空間:擷取GPIO驅動裝置控制代碼,將要發送的IR CODE write到dev中;

核心空間:利用核心中現有的GPIO驅動輸出高低電平,使用核心非強制中斷防止類比時序時被中斷導致延時誤差大;GPIO裝置讀取資料後引發非強制中斷產生類比IR。

代碼:

1. .h檔案中的資料結構以及宏定義

struct IR_CODE{    U16 uHead;    U8 uScancode;U8 bOutreverse;};typedef struct GPIO_Reg GPIO_Reg_t;typedef struct IR_CODE IR_CODE_t;//add by yanxi for  ir out start  140117#define IR_HEAD0 0#define IR_HEAD1 1#define IR_TIME_BASE 2#define IR_CODE_0  3#define IR_CODE_1  4#define IR_CODE_END  5//38k = 26.315us#define TIMER_9000US  342#define TIMER_4500US  171#define TIMER_560US   21#define TIMER_1680US  63//add by yanxi for  ir out end 140117

2.當使用者空間寫資料到裝置節點時, _MDrv_GPIO_Write被執行,通過copy_from_user 擷取IR資料,並使用_MDrv_GPIO_SendIR發送IR

static ssize_t _MDrv_GPIO_Write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){IR_CODE_t mIR_CODE_t; GPIO_PRINT("%s is invoked\n", __FUNCTION__);copy_from_user(&mIR_CODE_t, (IR_CODE_t __user *) buf, sizeof(IR_CODE_t));printk("\n yanxidebug uHead:%x  uScancode:%x  bOutreverse:%d",mIR_CODE_t.uHead,mIR_CODE_t.uScancode,mIR_CODE_t.bOutreverse);_MDrv_GPIO_SendIR((unsigned int)mIR_CODE_t.uHead,(unsigned int)mIR_CODE_t.uScancode,(BOOL)mIR_CODE_t.bOutreverse); return 0;}

3、主要是通過raise_softirq使能非強制中斷

static void _MDrv_GPIO_SendIR(unsigned int Head, int scancode, BOOL bOutreverse){GPIO_PRINT("\n %s  Head:%d  scancode:%d bOutreverse:%d\n", __FUNCTION__,Head,scancode,bOutreverse);mHead = Head;mscancode = scancode;mbOutreverse = bOutreverse;raise_softirq(SENDIR_SOFTIRQ);}

4、中斷處理函數,依據mscancode發送IR

  int irq_handle_function(int irq, void *device_id)  {    GPIO_PRINT("\n %s  \n", __FUNCTION__);  S8 TranselateBitPos;  U8 Ir_trans_sta;  int mcount = 0;  unsigned int head = 0x007f;  U8 head0 = head >> 8;  U8 head1 = head &0x00ff;  U16 mkeycode = mscancode;  BOOL outreverse = true;  //init state  Ir_trans_sta=IR_HEAD0;  TranselateBitPos=32;  //send ir code  while(TranselateBitPos>=0)  {  mcount = 0; switch(Ir_trans_sta) { case IR_HEAD0:  Ir_trans_sta= IR_HEAD1;   if(outreverse)  {  mcount = TIMER_9000US;  }  else  {    MHal_GPIO_Set_Low(0);  mdelay(9);    }  break; case IR_HEAD1:   Ir_trans_sta= IR_TIME_BASE;   if(!outreverse)//outreverse true  {  mcount = TIMER_4500US;//output high ;38k  }  else  {    MHal_GPIO_Set_High(0);//outreverse false,low vol    mdelay(4);  udelay(500);  }   break; case IR_TIME_BASE: if(TranselateBitPos>24){ if( ((head0>>(32-TranselateBitPos)) & 0x1) == 0x1 ) Ir_trans_sta= IR_CODE_1;  else  Ir_trans_sta= IR_CODE_0;  }else if(TranselateBitPos>16){ if( ((head1>>(24-TranselateBitPos)) & 0x1) == 0x1 ) Ir_trans_sta= IR_CODE_1;  else  Ir_trans_sta= IR_CODE_0;  }else if(TranselateBitPos>8){ if( ((mkeycode>>(16-TranselateBitPos))&0x1) == 0x1 ){ Ir_trans_sta= IR_CODE_1;   } else { Ir_trans_sta= IR_CODE_0;  }}else if(TranselateBitPos>0){ if( ((mkeycode>>(8-TranselateBitPos))&0x1) == 0x1 ) Ir_trans_sta= IR_CODE_0;  else  Ir_trans_sta= IR_CODE_1;  }else{ Ir_trans_sta= IR_CODE_END; }  if(!outreverse)  {    MHal_GPIO_Set_Low(0);  udelay(560);  }  else  {  mcount = TIMER_560US;  }  break; case IR_CODE_0: Ir_trans_sta= IR_TIME_BASE;   if(outreverse)  {    MHal_GPIO_Set_Low(0);  udelay(500);  }else{  mcount = TIMER_560US;}  TranselateBitPos--;break; case IR_CODE_1:Ir_trans_sta= IR_TIME_BASE;   if(outreverse)  {    MHal_GPIO_Set_Low(0);  udelay(1680);  }else{  mcount = TIMER_1680US;}TranselateBitPos--;break;  case IR_CODE_END:Ir_trans_sta= IR_HEAD0; MHal_GPIO_Set_High(0);TranselateBitPos=-1;//force to exit.break; default:break;}//38k generatewhile(mcount-- > 0){MHal_GPIO_Set_High(0);MHal_GPIO_Set_High(0);MHal_GPIO_Set_High(0);MHal_GPIO_Set_High(0);udelay(11);MHal_GPIO_Set_Low(0);MHal_GPIO_Set_Low(0);MHal_GPIO_Set_Low(0);MHal_GPIO_Set_Low(0);udelay(11);}}    return IRQ_NONE;  }  完...   


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.