我正在做一個基於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文件迴路應通過某些手段有我這上面的代碼
我希望你明白了, 謝謝