2013-05-09 53 views
1

我正在做一個基於arm的mini6410的簡單項目。我有安裝在mini上的debian軟件包。我的項目是將一個IR運動傳感器和I USB攝像頭與mini6410連接起來。工作將很簡單,只要有紅外傳感器檢測到任何動作,網絡攝像機將會保持30秒鐘的時間(超過前一次寫入),然後熄滅。 我已經交叉使用arm-linux-gcc發送Open CV代碼在mini6410上打開Cv和GPIO的問題

對於IR,我正在使用GPE寄存器。

在這裏,我困住了我無法解決的問題。甚至不知道如何解決。 OpenCv代碼是一個cpp文件camera.cpp,處理I/O端口的文件是一個名爲sensor.c的C文件。現在在這個c文件中,我正在輪詢或檢查GPE寄存器是否爲1的任何機制。如果它是一個,我應該啓動Open CV代碼,它將開始捕捉圖像。進一步講,這個sensor.c文件不是編譯而是製作一個模塊,然後insmod在我的mini6410上。

但是我不知道如何在c文件中編寫C++代碼。你可以說我不知道​​如何從C文件調用OpenCV的東西。因爲它是一個模塊,在這個我不能寫cpp代碼,然後使用名稱空間標準和使用名稱空間cv不工作。

我是新來的嵌入式的東西和Linux自己。所以我想知道是否有一些可能的解決方案。 我附上我的兩個文件的代碼。

這是sensor.c

#include <linux/module.h> 
#include <linux/slab.h> 
#include <linux/input.h> 
#include <linux/init.h> 
#include <linux/errno.h> 
#include <linux/serio.h> 
#include <linux/delay.h> 
#include <linux/clk.h> 
#include <linux/wait.h> 
#include <linux/sched.h> 
#include <linux/cdev.h> 
#include <linux/miscdevice.h> 
#include <asm/io.h> 
#include <asm/irq.h> 
#include <asm/uaccess.h> 
#include <mach/map.h> 
#include <mach/regs-clock.h> 
#include <mach/regs-gpio.h> 
#include <plat/gpio-cfg.h> 
#include <mach/gpio-bank-q.h> 
#include <mach/gpio-bank-e.h> 
#include <mach/map.h> 
#include <plat/regs-timer.h> 
#include <mach/hardware.h> 
#include <linux/kernel.h> 
#include <linux/mm.h> 
#include <linux/fs.h> 
#include <linux/types.h> 
#include <linux/moduleparam.h> 
#include <linux/ioctl.h> 
#include <linux/cdev.h> 
#include <linux/string.h> 
#include <linux/list.h> 
#include <linux/pci.h> 
#include <asm/uaccess.h> 
#include <asm/atomic.h> 
#include <asm/unistd.h> 
#include <mach/gpio-bank-k.h> 

#define RLV 0x0FFF 

unsigned Gpe; 
unsigned sensor_value; 

typedef struct 
{ 
    int delay; 
} TIM_DEV; 
static TIM_DEV TimDev; 

static irqreturn_t INTHandler(int irq,void *TimDev) 
{ 
    Gpe = readl(S3C64XX_GPEDAT); 
    Gpe &= ~(0xF<<1); 
    readl(sensor_value, S3C64XX_GPEDAT); 

    while (sensor_value == 1) 
    {//1 means that IR sensor has detected a motion and given a value of +5 V 

     for (i = 0; i < 30; i++){ 
      //CV_function(); 
      // delay here such that delay(1 s) * 30 = 30 seconds  

     } 
    } 
    return IRQ_HANDLED; 
} 

static struct file_operations dev_fops = { 
    .owner  = THIS_MODULE, 
    .write   = MyWrite, 
}; 

static struct miscdevice misc = { 
    .minor = MISC_DYNAMIC_MINOR, 
    .name = DEVICE_NAME, 
    .fops = &dev_fops, 
}; 

static int __init dev_init(void) 
{ 
    int ret; 
    unsigned TimerControl; 
    unsigned TimerINTControl; 
    unsigned TimerCNTB; 
    unsigned TimerCMPB; 
    unsigned TimerCFG1; 
    unsigned Ge; 

    TimerControl = readl(S3C_TCON); 
    TimerINTControl = readl(S3C_TINT_CSTAT); 
    TimerCNTB = readl(S3C_TCNTB(0)); 
    TimerCMPB = readl(S3C_TCMPB(0)); 
    TimerCFG1 = readl(S3C_TCFG1); 
    TimerCFG1 &= ~(S3C_TCFG1_MUX0_MASK);   
    TimerCNTB = RLV; 
    TimerCMPB = 0; 
    writel(TimerCNTB, S3C_TCNTB(0)); 
    writel(TimerCMPB, S3C_TCMPB(0)); 
    writel(TimerCFG1, S3C_TCFG1);   
    TimerControl |= S3C_TCON_T0MANUALUPD;  
    TimerINTControl |= S3C_TINT_CSTAT_T0INTEN; 
    writel(TimerControl, S3C_TCON);   
    writel(TimerINTControl, S3C_TINT_CSTAT);  
    TimerControl = readl(S3C_TCON); 
    TimerControl |= S3C_TCON_T0RELOAD;  
    TimerControl &= ~S3C_TCON_T0MANUALUPD;  
    TimerControl |= S3C_TCON_T0START;  
    writel(TimerControl, S3C_TCON);   

//////////////Here I am configuring my GPE as input///////////// 
    Ge = readl(S3C64XX_GPECON); 
    Ge &= ~(0xFFFF<<4); 
    Ge |= (0x0000<<4); 
    writel(Ge, S3C64XX_GPECON); 

///////////// 
    misc_register(&misc); 
    ret = request_irq(IRQ_TIMER0, INTHandler, IRQF_SHARED, DEVICE_NAME, &TimDev); 
    if (ret) 
    { 
     return ret; 
    } 
    return ret; 
} 

static void __exit dev_exit(void) 
{ 
    free_irq(IRQ_TIMER0, &TimDev); 
    misc_deregister(&misc); 
} 

module_init(dev_init); 
module_exit(dev_exit); 
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("XYZ"); 

這是camera.cpp

#include <opencv2/objdetect/objdetect.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

#include <iostream> 
#include <stdio.h> 

using namespace std; 
using namespace cv; 


int main(int argc, const char** argv) 
    {CvCapture* capture = 0; 
    Mat frame, frameCopy, image; 
    capture = cvCaptureFromCAM(2); 
    if(!capture) 
    { 
     cout << "No camera detected" << endl; 
    } 
     if(capture) 
     { 
      cout << "In capture ..." << endl; 

      IplImage* iplImg = cvQueryFrame(capture); 
      frame = iplImg; 

      if(frame.empty()) 
       break; 
      if(iplImg->origin == IPL_ORIGIN_TL) 
       frame.copyTo(frameCopy); 
      else 
       flip(frame, frameCopy, 0); 
      cvSaveImage("image.jpg" ,iplImg); 
     } 
    cvReleaseCapture(&capture); 
    return 0; 
} 

的在sensor.c文件迴路應通過某些手段有我這上面的代碼

我希望你明白了, 謝謝

回答

0

t他顯示的代碼是一種機制,通過該機制,上面顯示的用戶空間代碼可以獲得設備驅動程序檢測到的GPIO引腳變化的通知。

有兩個明顯的方式來實現這一目標:

  1. 整合GPIO引腳到平臺的GPIO資源,然後利用從用戶空間的通用sysfs機制。 Linux kernel GPIO documentation描述了內核和用戶空間這一方面。
  2. 您的驅動程序是否暴露了用於GPIO線路的sysfs節點。 sysfs是Linux驅動程序模型的基礎。我建議徹底閱讀Linux Device Drivers 3rd Edition

兩種方法的用戶空間側是相似的:你打開sysfs資源通過您的模塊導出,然後使用poll()select()阻塞,直到事件發生。