linux驱动开发之应用程序控制LCD屏
2018-02-06 00:51
417 查看
1, 打开设备
int fd = open(“/dev/fb0”, O_RDWR);
2, 获取到lcd屏的信息xres, yres, bpp
3,映射显存(一帧)到用户空间
4, 得到图片数据,将数据写入到addr
程序文件:链接:https://pan.baidu.com/s/1ggeHO1H 密码:yfvz
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/07/854b20818e43a4e022e305465f8553f0)
lcd.test是主程序
jpeg2bmp.o是图片数据格式的解析
framebuffer.o是初始化framebuffer子系统
把lcd_test复制到指定路径中:cp lcd_test *.bmp /opt/rootfs/drv_module/
在开发板执行命令./lcd_test /dev/fb0 logo_girl_800*480.bmp
出现以下调试信息
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/07/41f81bbf85658f5538f0e9140dcb65f8)
程序阻塞在这里,等待用户的输出(输入1显示图片,输入2显示文字)
附录:
readme.txt
int fd = open(“/dev/fb0”, O_RDWR);
2, 获取到lcd屏的信息xres, yres, bpp
struct fb_var_screeninfo var;//var是容器,用来存放数据 ioctl(fd, FBIOGET_VSCREENINFO, &var);//FBIOGET_VSCREENINFO表示获取可变屏幕信息,以后看到GET,一般表示拿东西,这里向驱动拿 | .unlocked_ioctl = fb_ioctl, | struct fb_info *info = file_fb_info(file);// |//从registered_fb数组中得到fb_info struct fb_info *info = registered_fb[fbidx]; do_fb_ioctl(info, cmd, arg); | void __user *argp = (void __user *)arg; switch (cmd) { case FBIOGET_VSCREENINFO: var = info->var; copy_to_user(argp, &var, sizeof(var)) ? -EFAULT : 0; size_t length = var.xres * var.yres * var.bits_per_pixel / 8
3,映射显存(一帧)到用户空间
//返回一个地址 char *addr = mmap(NULL, size_t length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); framebuffer_ptr =(char *)mmap( NULL,//如果此值为NULL,则表示用内核来自动给你分配一块虚拟空间 screensize, //空间大小 PROT_READ|PROT_WRITE,//权限 MAP_SHARED, //是否可以共享 framebuffer_fd, //文件描述符 0); //从哪个地方开始
4, 得到图片数据,将数据写入到addr
/*1.打开一副图片*/ pic_fd =open(argv[2],O_RDWR); printf("pic_fd=%d\n",pic_fd); /*2.获取图片大小*/ len =lseek(pic_fd, 0, SEEK_END);//SEEK_END表示定位到一个文件的末尾 printf("len =%ld\n",len); buffer =(char *)malloc(len); lseek(pic_fd, 0, SEEK_SET); /*3.读取图片数据*/ read(pic_fd,buffer,len); // buffer 存了bmp的图片数据, framebuffer_ptr映射之后的显存位置 draw_bmp(buffer,(unsigned short *) framebuffer_ptr); | bmp_read_file(bmpfilename, &bmpdata);//跳过bmp文件头 bmp2fb16_rgb565(bmpdata, fb); |//bmp2fb16_rgb565(unsigned char *bmpdata,unsigned short *fb16) fb16_buff = fb16; // fb16_buff就是framebuffer_ptr,映射之后的显存位置 for (y = ysize; y > 0 ; y--) { for (x = 0 ; x < xsize; x++) /*copy one line to frame buffer*/ { /*copy one pixel to frame buffer*/ b = *bmpdata; bmpdata++; b >>= 3; g = *bmpdata; bmpdata++; g >>= 2; r = *bmpdata; bmpdata++; r >>= 3; pixel16 = (unsigned short) ((r << 11) | (g << 5) | b); *( fb16_buff + (y* xsize + x) ) = pixel16;//将一个像素填写到显存 } }
程序文件:链接:https://pan.baidu.com/s/1ggeHO1H 密码:yfvz
lcd.test是主程序
jpeg2bmp.o是图片数据格式的解析
framebuffer.o是初始化framebuffer子系统
把lcd_test复制到指定路径中:cp lcd_test *.bmp /opt/rootfs/drv_module/
在开发板执行命令./lcd_test /dev/fb0 logo_girl_800*480.bmp
出现以下调试信息
程序阻塞在这里,等待用户的输出(输入1显示图片,输入2显示文字)
附录:
readme.txt
1.用bmp文件 800*480 2.注意 x,y参数 800 ,480 unsigned int bpp =16; unsigned int xsize =800; unsigned int ysize =480; 在mach-smkv210.c 查看并修改. static struct s3c_fb_pd_win smdkv210_fb_win0 = { /* .win_mode = { .left_margin = 13, .right_margin = 8, .upper_margin = 7, .lower_margin = 5, .hsync_len = 3, .vsync_len = 1, .xres = 800, .yres = 480, }, .max_bpp = 32, .default_bpp = 24, */ .win_mode = { .left_margin = 46, .right_margin = 219, .upper_margin = 23, .lower_margin = 22, .hsync_len = 10, .vsync_len = 10, .xres = 800, .yres = 480, }, .max_bpp = 32, .default_bpp = 16,//这是16bpp }; 3.main()中 buffer =(char *)malloc(1152054); //不要小于bmp文件大小 运行: [root@farsight /]# ./lcd_test /dev/fb0 logo_icer_800x480.bmp pic_fd=3 len =1152054 xres =800 yres =480 screensize =768000 framebuffer_ptr is mmaped ok! 1 test picture! loadjpeg00000!!!! bmpread0000000!!!! bm2fb1600000000000!!!! 2 length1 =23 length =23 length =23
相关文章推荐
- [嵌入式Linux驱动]关于RFID模块的Linux控制应用程序
- Linux设备驱动开发 - LCD设备驱动分析
- linux驱动开发---并发控制
- Linux设备驱动开发详解-Note(15)--- Linux 设备驱动中的并发控制(2)
- Linux驱动开发--通过按键控制led灯
- 【转】Linux驱动修炼之道-LCD背光与gpio控制
- 嵌入式Linux之我行——S3C2440上LCD驱动(FrameBuffer)实例开发讲解(一)
- 进程控制3 守护进程 华清远见-《嵌入式 Linux 应用程序开发标准教程》
- 嵌入式Linux之我行——S3C2440上LCD驱动(FrameBuffer)实例开发讲解(一)
- 嵌入式Linux之我行——S3C2440上LCD驱动(FrameBuffer)实例开发讲解(一)
- [Linux驱动开发] LCD驱动之自定义启动Logo
- 嵌入式Linux之我行——S3C2440上LCD驱动(FrameBuffer)实例开发讲解(一)
- 嵌入式Linux之我行——S3C2440上LCD驱动(FrameBuffer)实例开发讲解(二)
- 嵌入式Linux之我行——S3C2440上LCD驱动(FrameBuffer)实例开发讲解(二)
- linux驱动开发:用户空间操作LCD显示简单的图片
- Linux驱动开发-字符设备控制技术笔记 3
- linux驱动工程师成长之路(五)LCD背光控制RT9379B
- 嵌入式Linux之我行——S3C2440上LCD驱动(FrameBuffer)实例开发讲解(一)
- linux应用程序开发二,进程控制原理——知识要点
- 【嵌入式linux驱动开发】第十节 LCD 背光驱动代码架构分析(1)