佚名通过本文主要向大家介绍了韦东山视频 百度云,韦东山视频,韦东山视频破解,韦东山视频翻录,韦东山第一期视频等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 韦东山视频第三期之心得体会
描述:
这几天刚开始看韦东山老师的第三期视频,感觉在韦东山老师的帮助下,一场新的旅行又开始了。第一期项目是做一个数码相框,我在看到字符编码这一节,就想起之前LCD驱动那一节了。只是第三期从项目实战的角度出发看问题更加透彻,非常值得学习,在这里,我想分享学习之后的一些心得体会。
我们通常在LCD上显示汉字和字母等各种各样的部分时,都要调用字库,而调用字库之前都先要对汉字或字母进行编码,如然后取它们的ASCII码或者UTF-8码对字库中的对应数据进行检索得到点阵的数据,最后将数据显示在framebuffer中,这样屏幕上就会显示出我们需要的东西了,下面是我参考视频所写的的一个显示的测试程序。
首先我们要准备两个文件,一个汉字库文件,我是百度上找的HZK16文件,用来进行汉字检索;还有一个是ASCII自模文件,它来自于Linux源码,路径为:/drivers/video/console/font_8x16.c。该文件不能复制过来直接使用,要进行修改,如下:
(1).屏蔽无关的头文件
//#include <linux/font.h>
//#include <linux/module.h>
(2).删除无效的数组定义代码,将文件中最后一段代码删除,如下:
/*
const struct font_desc f /> {
.idx=VGA8x16_IDX,
.name="VGA8x16",
.width=8,
.height=16,
.data=fontdata_8x16,
.pref=0,
};
*/
然后开始编写主程序文件:lcd.c
1.首先贴上要用的头文件:
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
2.先从主函数开始看看大体的程序流程吧。
int main(int argc,char **argv)中:
(1)先打开需要的fb0设备文件,并且读取LCD驱动的相关参数信息。在做这一步之前先要确保设备文件存在,也就是LCD的驱动已经存在,所以最好对open函数和ioctl函数的返回值进行判断,便于出错检查。应用层调用open和ioctl函数之后,在驱动中会调用相应的函数来实现各种操作。ioctl函数将LCD设备结构体fb_info中的成员var结构体和fix结构体这两个固定和可变参数参数结构体的内容从驱动层调到应用层,因为之后要根据驱动中配置好的图像宽高、图像深度等重要信息设置一幅图的图像数据。得到var结构体和fix结构体之后得到的数据要注意有些如图像深度、图像宽度和图像的大小的单位都是字节。这一部分具体的代码如下:
fd_fb=open("/dev/fb0",O_RDWR);//打开LCD设备
if(fd_fb<0)
{
printf("can not open /dev/fb0!\n");
return -1;
}
//获取LCD驱动的可变参数信息
if(ioctl(fd_fb,FBIOGET_VSCREENINFO,&var))//0:true else:false
{
printf("can not get var!\n");
return -1;
}
//获取LCD驱动的固定参数信息
if(ioctl(fd_fb,FBIOGET_FSCREENINFO,&fix))
{
printf("can not get fix!\n");
}
printf("像素值是:%d 个字节\n",var.bits_per_pixel/8);
pixel_width=var.bits_per_pixel/8;//像素深度
line_width=var.xres*pixel_width; //一行大小
screen_size=var.yres*line_width; //一场大小
(2)对要操作的文件进行内存映射。
这一步包括对设备文件fb0进行映射,这样将图像数据直接填入映射后的内存就相当于直接写入文件了,也就可以直接显示了;也包括对要读取的HZK16文件进行映射,方便从HZK16文件中读取汉字对应的编码数据。注意,对应内核中的ASCII编码文件这里不需映射。应为我直接将他放在当前目录下,并且通过extern的形式来读取其中存放ASCII编码的结构体。具体的实现代码如下:
fbmem_start=(unsigned char *)mmap(NULL,screen_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd_fb,0);
if(fbmem_start==(unsigned char *)-1)
{
printf("can not mmap!\n");
return -1;
}
fd_hzk16=open("HZK16",O_RDONLY);//打开汉字库文件
if(fd_hzk16<0)
{
printf("can not open HZK16 file!\n");
return -1;
}
//获取文件信息
if(fstat(fd_hzk16,&hzk_stat))
{
printf("can not get fstat!\n");
return -1;
}
//把HZK16文件映射到内存进程空间
hzk_memmap=(unsigned char *)mmap(NULL,hzk_stat.st_size,PROT_READ,MAP_SHARED,fd_hzk16,0);
if(hzk_memmap==(unsigned char *)-1)
{
printf("can not mmap for hzk16!\n");
return -1;
}
(3).做好前面的准备工作之后就可以调用相关的函数来显示东西了。在这里我对一些基本的功能分别实现,在显示之前先通过memset函数将数据00写入显存,也就是做清屏操作,然后开始显示,分别显示字母'A',和汉字,以及汉字和字母的混合。这三部分分别封装成三个函数来实现,下面是对他们的调用。
memset(fbmem_start,0x00,screen_size);//清屏
lcd_show_ascii(fbmem_start,var.xres/2,var.yres/2,'A',forecolor,backcolor);
lcd_show_chinese(fbmem_start,var.xres/2+8,var.yres/2,str,forecolor,backcolor);
lcd_show_chinese(fbmem_start,var.xres/2+24,var.yres/2,str+2,forecolor,backcolor);
lcd_show_chinese(fbmem_start,var.xres/2+40,var.yres/2,str+4,forecolor,backcolor);
lcd_show_chinese(fbmem_start,var.xres/2+56,var.yres/2,str+6,forecolor,backcolor);
lcd_show_chinese(fbmem_start,var.xres/2+72,var.yres/2,str+8,forecolor,backcolor);
描述:
视频
这几天刚开始看韦东山老师的第三期视频,感觉在韦东山老师的帮助下,一场新的旅行又开始了。第一期项目是做一个数码相框,我在看到字符编码这一节,就想起之前LCD驱动那一节了。只是第三期从项目实战的角度出发看问题更加透彻,非常值得学习,在这里,我想分享学习之后的一些心得体会。
我们通常在LCD上显示汉字和字母等各种各样的部分时,都要调用字库,而调用字库之前都先要对汉字或字母进行编码,如然后取它们的ASCII码或者UTF-8码对字库中的对应数据进行检索得到点阵的数据,最后将数据显示在framebuffer中,这样屏幕上就会显示出我们需要的东西了,下面是我参考视频所写的的一个显示的测试程序。
首先我们要准备两个文件,一个汉字库文件,我是百度上找的HZK16文件,用来进行汉字检索;还有一个是ASCII自模文件,它来自于Linux源码,路径为:/drivers/video/console/font_8x16.c。该文件不能复制过来直接使用,要进行修改,如下:
(1).屏蔽无关的头文件
//#include <linux/font.h>
//#include <linux/module.h>
(2).删除无效的数组定义代码,将文件中最后一段代码删除,如下:
/*
const struct font_desc f /> {
.idx=VGA8x16_IDX,
.name="VGA8x16",
.width=8,
.height=16,
.data=fontdata_8x16,
.pref=0,
};
*/
然后开始编写主程序文件:lcd.c
1.首先贴上要用的头文件:
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
2.先从主函数开始看看大体的程序流程吧。
int main(int argc,char **argv)中:
(1)先打开需要的fb0设备文件,并且读取LCD驱动的相关参数信息。在做这一步之前先要确保设备文件存在,也就是LCD的驱动已经存在,所以最好对open函数和ioctl函数的返回值进行判断,便于出错检查。应用层调用open和ioctl函数之后,在驱动中会调用相应的函数来实现各种操作。ioctl函数将LCD设备结构体fb_info中的成员var结构体和fix结构体这两个固定和可变参数参数结构体的内容从驱动层调到应用层,因为之后要根据驱动中配置好的图像宽高、图像深度等重要信息设置一幅图的图像数据。得到var结构体和fix结构体之后得到的数据要注意有些如图像深度、图像宽度和图像的大小的单位都是字节。这一部分具体的代码如下:
fd_fb=open("/dev/fb0",O_RDWR);//打开LCD设备
if(fd_fb<0)
{
printf("can not open /dev/fb0!\n");
return -1;
}
//获取LCD驱动的可变参数信息
if(ioctl(fd_fb,FBIOGET_VSCREENINFO,&var))//0:true else:false
{
printf("can not get var!\n");
return -1;
}
//获取LCD驱动的固定参数信息
if(ioctl(fd_fb,FBIOGET_FSCREENINFO,&fix))
{
printf("can not get fix!\n");
}
printf("像素值是:%d 个字节\n",var.bits_per_pixel/8);
pixel_width=var.bits_per_pixel/8;//像素深度
line_width=var.xres*pixel_width; //一行大小
screen_size=var.yres*line_width; //一场大小
(2)对要操作的文件进行内存映射。
这一步包括对设备文件fb0进行映射,这样将图像数据直接填入映射后的内存就相当于直接写入文件了,也就可以直接显示了;也包括对要读取的HZK16文件进行映射,方便从HZK16文件中读取汉字对应的编码数据。注意,对应内核中的ASCII编码文件这里不需映射。应为我直接将他放在当前目录下,并且通过extern的形式来读取其中存放ASCII编码的结构体。具体的实现代码如下:
fbmem_start=(unsigned char *)mmap(NULL,screen_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd_fb,0);
if(fbmem_start==(unsigned char *)-1)
{
printf("can not mmap!\n");
return -1;
}
fd_hzk16=open("HZK16",O_RDONLY);//打开汉字库文件
if(fd_hzk16<0)
{
printf("can not open HZK16 file!\n");
return -1;
}
//获取文件信息
if(fstat(fd_hzk16,&hzk_stat))
{
printf("can not get fstat!\n");
return -1;
}
//把HZK16文件映射到内存进程空间
hzk_memmap=(unsigned char *)mmap(NULL,hzk_stat.st_size,PROT_READ,MAP_SHARED,fd_hzk16,0);
if(hzk_memmap==(unsigned char *)-1)
{
printf("can not mmap for hzk16!\n");
return -1;
}
(3).做好前面的准备工作之后就可以调用相关的函数来显示东西了。在这里我对一些基本的功能分别实现,在显示之前先通过memset函数将数据00写入显存,也就是做清屏操作,然后开始显示,分别显示字母'A',和汉字,以及汉字和字母的混合。这三部分分别封装成三个函数来实现,下面是对他们的调用。
memset(fbmem_start,0x00,screen_size);//清屏
lcd_show_ascii(fbmem_start,var.xres/2,var.yres/2,'A',forecolor,backcolor);
lcd_show_chinese(fbmem_start,var.xres/2+8,var.yres/2,str,forecolor,backcolor);
lcd_show_chinese(fbmem_start,var.xres/2+24,var.yres/2,str+2,forecolor,backcolor);
lcd_show_chinese(fbmem_start,var.xres/2+40,var.yres/2,str+4,forecolor,backcolor);
lcd_show_chinese(fbmem_start,var.xres/2+56,var.yres/2,str+6,forecolor,backcolor);
lcd_show_chinese(fbmem_start,var.xres/2+72,var.yres/2,str+8,forecolor,backcolor);