#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <unistd.h>
#include <termios.h>
#include <linux/kd.h>
#include <sys/ioctl.h>
#include <ctype.h>
#include <string.h>
#include "video.h"
extern unsigned int COLOR;
extern unsigned char PUT_MODE;
extern unsigned int TEXT_FGCOLOR;
extern unsigned int TEXT_BGCOLOR;
int InitFrameBuffer(int* fb)
{
struct fb_fix_screeninfo finfo;
struct fb_var_screeninfo vinfo;
int tty;
//Open framebuffer device
*fb = open ( "/dev/fb0", O_RDWR);
if ( ! (*fb) ){
printf("Can't open framebuffer device.\n");
return -1;
}
//Get framebuffer device infomation
if( ioctl ( *fb, FBIOGET_FSCREENINFO, &finfo ) ){
printf("Error reading fixed framebuffer information.\n");
return -2;
}
fprintf(stderr, "Printing finfo:\n");
fprintf(stderr, "tsmem_start = %p\n", (char *)finfo.smem_start);
fprintf(stderr, "tsmem_len = %d\n", finfo.smem_len);
fprintf(stderr, "ttype = %d\n", finfo.type);
fprintf(stderr, "ttype_aux = %d\n", finfo.type_aux);
fprintf(stderr, "tvisual = %d\n", finfo.visual);
//fprintf(stderr, "txpanstep = %d\n", finfo.panstep);
fprintf(stderr, "typanstep = %d\n", finfo.ypanstep);
fprintf(stderr, "tywrapstep = %d\n", finfo.ywrapstep);
fprintf(stderr, "tline_length = %d\n", finfo.line_length);
fprintf(stderr, "tmmio_start = %p\n", (char *)finfo.mmio_start);
fprintf(stderr, "tmmio_len = %d\n", finfo.mmio_len);
fprintf(stderr, "taccel = %d\n", finfo.accel);
if( ioctl ( *fb, FBIOGET_VSCREENINFO, &vinfo ) ){
printf("Error reading variable framebuffer information.\n");
return -3;
}
fprintf(stderr, "Printing vinfo:\n");
fprintf(stderr, "txres: %d\n", vinfo.xres);
fprintf(stderr, "tyres: %d\n", vinfo.yres);
fprintf(stderr, "txres_virtual: %d\n", vinfo.xres_virtual);
fprintf(stderr, "tyres_virtual: %d\n", vinfo.yres_virtual);
fprintf(stderr, "txoffset: %d\n", vinfo.xoffset);
fprintf(stderr, "tyoffset: %d\n", vinfo.yoffset);
fprintf(stderr, "tbits_per_pixel: %d\n", vinfo.bits_per_pixel);
fprintf(stderr, "tgrayscale: %d\n", vinfo.grayscale);
fprintf(stderr, "tnonstd: %d\n", vinfo.nonstd);
fprintf(stderr, "tactivate: %d\n", vinfo.activate);
fprintf(stderr, "theight: %d\n", vinfo.height);
fprintf(stderr, "twidth: %d\n", vinfo.width);
fprintf(stderr, "taccel_flags: %d\n", vinfo.accel_flags);
fprintf(stderr, "tpixclock: %d\n", vinfo.pixclock);
fprintf(stderr, "tleft_margin: %d\n", vinfo.left_margin);
fprintf(stderr, "tright_margin: %d\n", vinfo.right_margin);
fprintf(stderr, "tupper_margin: %d\n", vinfo.upper_margin);
fprintf(stderr, "tlower_margin: %d\n", vinfo.lower_margin);
fprintf(stderr, "thsync_len: %d\n", vinfo.hsync_len);
fprintf(stderr, "tvsync_len: %d\n", vinfo.vsync_len);
fprintf(stderr, "tsync: %d\n", vinfo.sync);
fprintf(stderr, "tvmode: %d\n", vinfo.vmode);
fprintf(stderr, " length offset\n");
fprintf(stderr, "tred: %d/%d\n", vinfo.red.length, vinfo.red.offset);
fprintf(stderr, "tgreen: %d/%d\n", vinfo.green.length, vinfo.green.offset);
fprintf(stderr, "tblue: %d/%d\n", vinfo.blue.length, vinfo.blue.offset);
fprintf(stderr, "talpha: %d/%d\n", vinfo.transp.length, vinfo.transp.offset);
if( ( vinfo.bits_per_pixel/8 != BYTE_PER_PIXEL ) || \
( vinfo.xres != MAX_X ) || ( vinfo.yres != MAX_Y ) ){
printf( "Display mode error: bits=%d x=%d y=%d\n", vinfo.width/8, vinfo.xres, vinfo.yres );
return -4;
}
if((hzk16fp=fopen("/home/root/hzk16","rb"))==NULL){
printf ( "Can't open hzk16 file\n" );
return -7;
}
if((hzk12fp=fopen("/home/root/hzk12","rb"))==NULL){
printf ( "Can't open hzk12 file\n" );
return -8;
}
if((ascfp=fopen("/home/root/asc1008","rb"))==NULL){
printf ( "Can't open asc1008 file\n" );
return -9;
}
fb_mem = mmap ( NULL, MAX_X*MAX_Y*BYTE_PER_PIXEL, PROT_READ|PROT_WRITE, MAP_SHARED, *fb, 0 );
memset ( fb_mem, 0, MAX_X*MAX_Y*BYTE_PER_PIXEL );//clear screen
return 0;
}
void CloseFrameBuffer(int *fb)
{
int tty;
tty = open ( "/dev/tty", O_RDONLY );
ioctl ( tty, KDSETMODE, KD_TEXT );
close ( tty );
fclose ( hzk16fp );
fclose ( hzk12fp );
fclose ( ascfp );
close ( *fb );
}
void putpixel ( unsigned int x, unsigned int y )
{
unsigned long offset;
int color;
ARRAY4 oldcolor;
if( x >= MAX_X ) {
x=MAX_X-1;
}
if( y >=MAX_Y ) {
y=MAX_Y-1;
}
color=COLOR;
offset = (y*MAX_X*BYTE_PER_PIXEL)+( x*BYTE_PER_PIXEL );
if( PUT_MODE != PUT_SET ){
memcpy ( oldcolor.c, fb_mem+offset, BYTE_PER_PIXEL );
switch( PUT_MODE ){
case PUT_XOR: color^=oldcolor.l; break;
case PUT_OR: color|=oldcolor.l; break;
case PUT_AND: color&=oldcolor.l; break;
case PUT_NOT: color=~color; break;
}
}
memset ( fb_mem+offset, color, BYTE_PER_PIXEL );
}
/*-------------------------------------------------*/
/* */
/*This function draw a horizontal/vertical gap line*/
/* */
/*-------------------------------------------------*/
void putgapline ( unsigned int x1, unsigned int y1, unsigned int x2, unsigned y2 )
{
unsigned long offset;
int i;
unsigned char step;
if ( x1 >= MAX_X ) {
x1 = MAX_X-1;
}
if ( x2 >= MAX_X ) {
x2 = MAX_X-1;
}
if ( y1 >= MAX_Y ) {
y1 = MAX_Y-1;
}
if ( y2 >= MAX_Y ) {
y2 = MAX_Y-1;
}
if ( x1 > x2 ) {
i = x1; x1 = x2; x2 = i;
}
if ( y1 > y2 ) {
i = y1; y1 = y2; y2 = i;
}
offset = ( y1*MAX_X*BYTE_PER_PIXEL ) + ( x1*BYTE_PER_PIXEL );
if( x1 != x2 ) { //horizontal gap line
unsigned char step=3;
unsigned int bytes;
for ( i = 0; i <= x2-x1; i+=step ) {
bytes = step*BYTE_PER_PIXEL;
if ( 3 == step ){
bytes = step*BYTE_PER_PIXEL;
memset ( fb_mem+offset, COLOR, bytes);
offset+=bytes;
step=2;
}else{
offset+=bytes;
step=3;
}
}
}else{ //vertical gap line
unsigned int xbytes;
xbytes=MAX_X*BYTE_PER_PIXEL;
for ( i = 0; i <= y2-y1; i++ ) {
if ( i%5 < 3 ) {
memset ( fb_mem+offset, COLOR, BYTE_PER_PIXEL );
}
offset += xbytes;
}
}
}
void putline ( unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2 )
{
unsigned long offset;
unsigned int i,xbytes;
int dx,dy,dm,dn,m,n,k,u,v,l,sum;
char t;
dx=x2-x1;
dy=y2-y1;
offset = ( y1*MAX_X*BYTE_PER_PIXEL ) + ( x1*BYTE_PER_PIXEL );
if( 0 == dx){
if( dy < 0 ){
i = y1;
y1 = y2;
y2 = y1;
}
xbytes=MAX_X*BYTE_PER_PIXEL;
for(i=y1;i<=y2;i++){
memset ( fb_mem+offset, COLOR, BYTE_PER_PIXEL );
offset += xbytes;
}//--for(l=u..)
return;
}//---end if(dx==0)---
if( 0 == dy ){
if( dx < 0 ){
i = x2;
x1 = x2;
x2 = x1;
}
memset ( fb_mem+offset, COLOR, (x2-x1)*BYTE_PER_PIXEL );
return;
}//---end if(dy==0)---
dm=1;dn=1;
if(dy<0){
dy=-dy; dm=-1;
}
if(dx<0){
dx=-dx; dn=-1;
}
n=dx; m=dy; k=1; v=x1; u=y1;
if(dy<dx){
m=dx; n=dy;
k=dm; dm=dn; dn=k; k=0;
u=x1; v=y1;
}
memset ( fb_mem+offset, COLOR, BYTE_PER_PIXEL );
l=0; sum=m;
while(sum!=0){
sum=sum-1;
l=l+n;
u=u+dm;
if(l>=m){
v=v+dn;
l=l-m;
};
if(k==1){//---putpixel(v,u)---
offset = ( u*MAX_X*BYTE_PER_PIXEL ) + ( v*BYTE_PER_PIXEL );
memset ( fb_mem+offset, COLOR, BYTE_PER_PIXEL );
}else{ //---putpixel(u,v)---
offset = ( v*MAX_X*BYTE_PER_PIXEL ) + ( u*BYTE_PER_PIXEL );
memset ( fb_mem+offset, COLOR, BYTE_PER_PIXEL );
}//--end else
}//--end while(sum!=0)
}
void fillrect ( unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, int color )
{
int i;
int xlen;
unsigned long offset;
if ( x1 >= MAX_X ) {
x1 = MAX_X-1;
}
if ( x2 >= MAX_X ) {
x2 = MAX_X-1;
}
if ( y1 >= MAX_Y ) {
y1 = MAX_Y-1;
}
if ( y2 >= MAX_Y ) {
y2 = MAX_Y-1;
}
if ( x2 - x1 < 0 ) {
i=x2; x2=x1; x1=i;
}
if ( y2 - y1 < 0 ) {
i=y2; x2=x1; x1=i;
}
offset = ( y1*MAX_X*BYTE_PER_PIXEL )+( x1*BYTE_PER_PIXEL );
xlen = ( x2-x1+1 )*BYTE_PER_PIXEL;
for ( i=y1; i<=y2; i++) {
memset ( fb_mem+offset, color, xlen );
offset += MAX_X*BYTE_PER_PIXEL;
}
return;
}
void outtext ( unsigned int x, unsigned int y, unsigned char* str, unsigned c
at91sam9261 串口与usb转串口通讯 lcd显示
3星 · 超过75%的资源 需积分: 9 117 浏览量
2009-08-14
15:08:08
上传
评论 1
收藏 303KB RAR 举报
shengming810615
- 粉丝: 0
- 资源: 5
最新资源
- 2022年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
- Golang:通过Gin框架+Redis+责任链,实现一个简单的钉钉机器人,进行消息处理 ps:多应用版
- 2021年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
- CORRUPT.navicat150-premium-cs-x64.exe
- centos7 ssh 升级至 9.6p1
- DriverMax Pro .exe
- PHP端通过modbus协议跟第三方设备进行数据通信
- navicat安装包亲测可用
- 算法部署-使用OpenVINO部署MobileStyleGAN轻量化高保真图像合成算法-项目源码-优质项目实战.zip
- 基于java实现远程采集华为逆变器使用modbus tcp协议进行通讯的设备数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈