S3C2440通过v4l2采集在lcd上显示
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
#include
#include
#include
#include
#define COLS 320
#define ROWS 240
#define V4L2_DEV_NODE "/dev/video13"
#define FB_DEV_NODE "/dev/fb0"
#define CLEAR(x) memset(&(x),0,sizeof(x))
typedef struct v4l2_format V_FORMAT;
typedef struct fb_var_screeninfo F_VINFO;
struct fb_var_screeninfo fb_var;
struct fb_fix_screeninfo fb_fix;
char * fb_base_addr = NULL;
static void show_rgb565_img(void *scr, __u16 *data_buf)
{
__u16 x, y;
__u16 *fb_buf = (__u16 *)scr;
fb_buf += (320);
for (y = 0; y < ROWS; y++) {
for (x = 0; x < COLS; x++) {
fb_buf[x] = *data_buf++ ;
}
fb_buf += 320;
}
}
int main(void)
{
int v4l2_fd = -1;
int fb_fd = -1;
int n=0;
__u8 *fb_buf;
__u8 *buf;
__u32 screensize;
//unsigned int width = 0;
//unsigned int height = 0;
//unsigned int bpp = 0;
V_FORMAT fmt;
enum v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
printf("Start Main \n");
printf("Before openning video \n");
v4l2_fd = open(V4L2_DEV_NODE, O_RDWR | O_NONBLOCK, 0);
if (v4l2_fd < 0) {
printf(" open video ERR\n");
return 0;
}
printf("Before openning FB \n");
fb_fd = open(FB_DEV_NODE, O_RDWR);
if (fb_fd < 0) {
printf("error open fb_fd\n");
exit(1);
}
/* Get fixed screen information */
if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &fb_fix)) {
printf("Error reading fb fixed information.\n");
exit(1);
}
/* Get variable screen information */
if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &fb_var)) {
printf("Error reading fb variable information.\n");
exit(1);
}
screensize = fb_var.xres * fb_var.yres * fb_var.bits_per_pixel / 8;
//screensize = 480 * 272 * 16 / 8;
fb_buf = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0);
if ((int)fb_buf == -1) {
printf("Error: failed to map framebuffer device to memory.\n");
close(fb_fd);
return -1;
}
CLEAR (fmt);
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 320;
fmt.fmt.pix.height = 240;
//fmt.fmt.pix.depth = 16;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB565;
//printf("VIDIOC_S_FMT is %x\n",VIDIOC_S_FMT);
if ((ioctl(v4l2_fd, VIDIOC_S_FMT, &fmt)) < 0) {
printf("Error: failed to set video format.\n");
return 0;
}
buf = malloc(320 * 240 * 3);
//printf("VIDIOC_STREAMON is %x\n",VIDIOC_STREAMON);
if ((ioctl(v4l2_fd, VIDIOC_STREAMON, &type)) < 0) {
printf("error ioctl streamon\n");
return 0;
}
printf("start to get pic %d\n",(int)fmt.fmt.pix.sizeimage);
while(1) {
n=read(v4l2_fd, buf, 320*240*2);
printf("display %d\n",n);
show_rgb565_img(fb_buf,buf);
}
}
关键字:S3C2440 v4l2采集 lcd
引用地址:
S3C2440通过v4l2采集在lcd上显示
推荐阅读最新更新时间:2024-03-16 14:56
S3C2440的Keil启动文件S3C2440.s添加中断配置
前言 本文主要描述如何在Keil自带的S3C2440.s文件中添加中断配置及中断地址映射,从而可以在中断产生时跳转到用户代码中的中断服务函数。目前在TQ2440开发板是实测可用。 工程源代码下载 本文所有代码都是截取代码,“…”代表其还有上下文。可根据代码中上下文的残缺部分找到该代码添加的位置。 一,添加中断相关寄存器地址符号映射 因为原始S3C2440.s文件中不含中断相关寄存器的地址,所以需要在开头添加: ... ; * RAM_INTVEC: when set the startup code copies exception vectors ; * from execution address to
[单片机]
OpenCV2.0.0移植到ARM9(五)(JZ2440----S3c2440)
Linux系统:Ubuntu9.10 交叉编译器:arm-linux-gcc-4.3.2(已安装) Qt:qt-x11-opensource-src-4.5.3.tar.gz qt-embedded-linux-opensource-src-4.5.3.tar.gz 1、安装Qt Qt下载地址:https://www.qt.io/download-open-source/ 这里下载的安装包为:qt-embedded-linux-opensource-src-4.5.3.tar.gz(大小123MB) 2、安装Qt-x11 将qt-x11-opensource-src-4.5.3.tar.gz包放到U
[单片机]
基于S3C2440的u-boot的移植
1 Bootloader及u-boot简介 Bootloader代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等。Bootloader代码与CPU芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于PC机的BIOS程序。由于Bootloader和CPU及电路板的配置情况有关,因此不可能有通用的bootloader ,开发时需要用户根据具体情况进行移植。嵌入式Linux系统中常用的bootloader有armboot、redboot、blob、u-boot 等,其中u-boot是当前比较流行,功能
[单片机]
受8英寸晶圆产能影响,LCD驱动IC价格Q1或上调10%
集微网消息,随着物联网、车用电子以及智慧家居等需求兴起,带动电源管理与微控制器等芯片用量攀升,已经开始挤压8英寸晶圆厂LCD驱动IC的投片量。集邦咨询光电研究中心(WitsView)最新观察指出,由于晶圆代工厂提高8英寸厂的IC代工费用,IC设计公司第一季可能跟着被迫向面板厂提高IC报价5~10%,以反映成本上升的压力。 WitsView表示,由于上游硅晶圆缺货问题短时间内仍然无解,2017年下半年开始晶圆代工厂纷纷调整8英寸厂的自身产品组合,希望将利润极大化,除了调涨晶圆代工价格,也减少驱动IC投片量。近年来因面板厂的削价竞争,驱动IC价格大幅滑落,早已成为晶圆代工厂心中低毛利产品的代名词,当利润更佳的电源管理芯片或是微控制器的
[手机便携]
节能LCD电视的LED背光区域调光
现在CRT(阴级射线管)电视逐渐被LCD电视取代,同时,家庭购买数量也在稳步增长,如今美国平均每个家庭拥有2.4台LCD电视,远大于1990年每个家庭拥有1台CRT电视的平均数。 虽然每台LCD电视的耗电量在逐年下降,其普及率的提高却逐年增加每个家庭的电视耗电总量,在家用电器中,LCD电视已成为紧随电冰箱之后的主要耗电电器。 因此,一系列的LCD电视节能标准应运而生,其中最严格的当数将于2012年5月1日起生效的EPA能源之星5.0标准,尤其针对50寸以上的超大屏幕LCD电视,强制规定了108瓦的使用模式的能耗上限。 能源之星节能标准也第一次规范了电视的绝对能耗额,有别于以往的与屏幕尺寸对应的相对标准。 图1:
[电源管理]
MINI2440裸机实验之LCD
硬件部分 上诉文章中使用的LCD都是常规液晶显示器,但在查看原理图及液晶数据手册时发现我使用的MINI2440开发板上自带的液晶跟文中的液晶并不一致,区别主要体现在只有DE、CLK和RGB引脚,该液晶型号为TD35-TD035STEB2,其时序图如下。 从时序图中可以看出,DE为该液晶屏的主要控制引脚,通过控制DE引脚的下拉就可以控制液晶屏的刷新,但有一个问题就是如何使用s3c2440的LCD控制器来控制该液晶屏呢? 这里我进行了这样的尝试,认为上图中的Tvdisp = LINEVAL +1 ;Tvblank = VSPW+1+VBPD+1;VFPD+1 = 0;Thdisp = HOZVAL+1; Thbla
[单片机]
STC15系列电压测试+LCD12864显示
最近使用15做电压测试,顺便使用下12864显示,程序如下: #include STC15F2K60S2.H #include intrins.h #include stdio.h #define uchar unsigned char #define uint unsigned int #define ulint unsigned long int #define FOSC 11059200L //系统频率 sbit CS=P0^4; //片选信号 4RS(CS)H/L并行的指令/数据选择信号;串行的片选信号 sbit SID=P0^3; //数据信号 5R/W(
[单片机]
基于ARM与FPGA的LCD控制器设计
随着显示屏技术的不断发展,真彩液晶显示屏以其高分辨率、高对比度及高清晰度等优势逐渐在嵌入式显示系统中占据重要地位。目前,基于嵌入式平台的LCD显控技术的实现主要有两种方式:ARM内嵌LCD控制器和独立的控制器件。但是这两种实现方式都存在着不足之处,内嵌控制器的使用可能增大处理器的负担和限制显示帧率,而外部控制器件不仅成本高,而且专用性比较强,很难适应不同类型的液晶屏。 据此存在的问题,这里提出一种基于ARM与FPGA的LCD控制器设计方案,该设计方案一方面能够通过操作LINUX OS下的Framebuffer设备提高显存的写入速率及减轻处理器的负担,另一方面用FPGA来实现LCD控制器的设计,开发周期短、功耗低,同时具有灵
[单片机]