随着社会的不断发展,人们对于汽车的安全性要求越来越高,而倒车雷达系统就是为了增强汽车驾驶者的安全性而被广泛使用。在这种情况下,我们开发了一个基于Linux设计的倒车雷达系统,该系统可以采用迅为4412主控板,运行Linux3.5内核,使用USB摄像头、TFT真彩显示屏、超声波测距模块和蜂鸣器等硬件。
本项目的创新点包括:
整个系统由以下几个模块组成:
#include
#include /* See NOTES */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/* 图片的象素数据 */
typedef struct PixelDatas {
int iWidth; /* 宽度: 一行有多少个象素 */
int iHeight; /* 高度: 一列有多少个象素 */
int iBpp; /* 一个象素用多少位来表示 */
int iLineBytes; /* 一行数据有多少字节 */
int iTotalBytes; /* 所有字节数 */
unsigned char *VideoBuf; //存放一帧摄像头的数据
//指向了存放摄像头数据的空间地址
}T_PixelDatas;
T_PixelDatas Pixedata; //存放实际的图像数据
/*
USB摄像头相关参数定义
*/
struct v4l2_buffer tV4l2Buf;
int iFd;
int ListNum;
unsigned char* pucVideBuf[4]; // 视频BUFF空间地址
void camera_pthread(void);
//LCD屏相关的参数
unsigned char *lcd_mem=NULL; /*LCD的内存地址*/
struct fb_fix_screeninfo finfo; /*固定形参*/
struct fb_var_screeninfo vinfo; /*可变形参*/
void LCD_Init(void);
void show_pixel(int x,int y,int color);
int main(int argc ,char *argv[])
{
if(argc!=2)
{
printf("./app /dev/videoX
");
return -1;
}
LCD_Init(); //LCD屏初始化
camera_init(argv[1]); //摄像头设备初始化
//开始采集摄像头数据,并实时显示在LCD屏幕上
camera_pthread();
return 0;
}
//LCD屏初始化
void LCD_Init(void)
{
/*1.打开设备文件*/
int fd=open("/dev/fb0",O_RDWR);
if(fd<0)
{
printf("/dev/fb0设备文件打开失败!
");
return;
}
/*2. 读取LCD屏的参数*/
ioctl(fd,FBIOGET_FSCREENINFO,&finfo);//固定参数
printf("映射的长度:%d
",finfo.smem_len);
ioctl(fd,FBIOGET_VSCREENINFO,&vinfo);//可变参数,32位
printf("分辨率:%d*%d,%d
",vinfo.xres,vinfo.yres,vinfo.bits_per_pixel);
/*3. 映射LCD的地址到进程空间*/
lcd_mem=mmap(NULL,finfo.smem_len,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0);
if(lcd_mem==NULL)
{
printf("lcd_mem映射失败!
");
return;
}
memset(lcd_mem,0xFFFFFFFF,finfo.smem_len);
}
/*画点*/
void show_pixel(int x,int y,int color)
{
unsigned long *show32 = NULL;
/* 定位到 LCD 屏上的位置*/
show32 =(unsigned long *)(lcd_mem + y*vinfo.xres*vinfo.bits_per_pixel/8 + x*vinfo.bits_per_pixel/8);
*show32 =color; /*向指向的 LCD 地址赋数据*/
}
//显示摄像头的数据
void Show_VideoData(int w,int h,unsigned char *rgb)
{
int i,j;
int x0,x=0,y=0;
int color; //颜色 值
unsigned char r,g,b;
x0=x;
for(i=0;i
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static int chaoshengbo_irq=0;
#define GPB_CON 0x11400040
#define GPB_DAT 0x11400044
static u32 *gpb_con=NULL;
static u32 *gpb_dat=NULL;
/*
硬件连接:
输出脚: GPX1_0 ---ECHO
输入脚: GPB_7
*/
static void tiny4412_work_func(struct work_struct *work)
{
printk("GPB=%d
",*gpb_dat&1<<7);
ktime_t my_time1,my_time2;
unsigned int i,j;
unsigned int time_cnt=0;
my_time1=ktime_get(); //获取当前时间
i=ktime_to_us(my_time1); //转 us
while(gpio_get_value(EXYNOS4_GPX1(0))){} //高电平卡住
my_time2=ktime_get(); //获取当前时间
j=ktime_to_us(my_time2); //转 us
printk("us:%d
",j-i);
}
static DECLARE_WORK(caoshengbotiny4412_work,tiny4412_work_func);
/*
中断处理函数
*/
irqreturn_t irq_handler_chaoshengbo(int irq, void *dev)
{
schedule_work(&caoshengbotiny4412_work); /*正常情况下: 是在中断服务函数里面*/
return IRQ_HANDLED; /*表示中断已经处理过了*/
}
static void timer_function(unsigned long data);
static DEFINE_TIMER(timer_caoshengbo, timer_function,0,0);
static void timer_function(unsigned long data)
{
static u8 state;
state=!state;
if(state)*gpb_dat|=1<<7;
else *gpb_dat&=~(1<<7);
mod_timer(&timer_caoshengbo,jiffies+msecs_to_jiffies(500));
}
static int __init tiny4412_chaoshengbo_init(void)
{
int i,err;
/*获取中断号*/
chaoshengbo_irq=gpio_to_irq(EXYNOS4_GPX1(0));
printk("中断号:%d
",chaoshengbo_irq);
/*外部中断注册*/
err=request_irq(chaoshengbo_irq,irq_handler_chaoshengbo,IRQ_TYPE_EDGE_RISING,"tiny4412_chaoshengbo",NULL);
if(err!=0)printk("中断注册失败!
");
/*映射内存*/
gpb_con=ioremap(GPB_CON,4);
gpb_dat=ioremap(GPB_DAT,4);
/*配置模式*/
*gpb_con&=~(0xF<<4*7); //输出模式
*gpb_con|=0x1<<4*7;
mod_timer(&timer_caoshengbo,jiffies+msecs_to_jiffies(100));
return 0;
}
static void __exit tiny4412_chaoshengbo_exit(void)
{
free_irq(chaoshengbo_irq,NULL);
iounmap(gpb_con);
iounmap(gpb_dat);
del_timer(&timer_caoshengbo);
}
module_init(tiny4412_chaoshengbo_init); /*指定驱动的入口函数*/
module_exit(tiny4412_chaoshengbo_exit); /*指定驱动的出口函数*/
MODULE_LICENSE("GPL"); /*指定驱动许可证*/
全部0条评论
快来发表一下你的评论吧 !