关于在ARM9开发板上的BMP图片显示源代码和相关的详解!
1、显示器,显示最小的单位:像素点(开发板的分辨率是800X480)
怎么样去表示每一个像素点?
比如说只有一个位,来显示,那只能显示白色和黑色,比如说有 8bit -> 1Byte 有2^8种情况,位数越大,所能表示的颜色就越多
三原色( ARGB ) 8:8:8:8 每一个像素点有32位来表示
ABGR
char buf[4];
int size;
int r;
fd = open("1.bmp",O_RDONLY);
lseek(fd,2,SEEK_SET);
r = read(fd,buf,4);
size = (buf[3] & 0xff) << 24 | (buf[2] & 0xff) << 16 | (buf[1] & 0xff) << 8 | (buf[0] & 0xff) << 0;
头两个字节,分辨率,大小,位深
read(fd,buf,2);
buf[1] << 8 | buf[0]
2、开发环境搭建和使用
安装minicom
sudo apt-get install minicom
网络问题:
vim /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.5.3
netmask 255.255.255.0
gateway 192.168.5.1
dns-nameserver 192.168.5.1
sudo ifconfig eth0 IP
sudo route add default gw 192.168.5.1
ping www.baidu.com
sudo vim /etc/resolv.conf 添加一行 -> nameserver 192.168.5.1
3、minicom的使用
dmesg查看USB转串口是否链接到虚拟机。 /dev/ttyUSB0
配置minicom
sudo minicom -s ---> Serial port setup
+-----------------------------------------------------------------------+
| A - Serial Device : /dev/ttyUSB0 |
| B - Lockfile Location : /var/lock |
| C - Callin Program : |
| D - Callout Program : |
| E - Bps/Par/Bits : 115200 8N1 |
| F - Hardware Flow Control : No |
| G - Software Flow Control : No |
| |
| Change which setting? |
+-----------------------------------------------------------------------+
按对应的字母进入对应的选项来修改设置,修改好之后,回车结束。
然后选择 Save setup as dfl 保存为默认的配置,以后就不需要再进行配置了。
Exit from Minicom
$ sudo minicom -c on
退出 ctrl + a 然后再按q退出
4、LCD的使用
打开对应的设备节点,往framebuffer写入显示的数据
#include <stdio.h>
#include <fcntl.h>
int main()
{
int fd ;
int lcd_buf[800*480];//ARGB -> 4个字节
int i;
for(i=0;i<800*480;i++){
lcd_buf[ i] = 0x00FF0000;
}
fd = open(&quot;/dev/fb0&quot;,O_RDWR);
if(fd < 0)
{
perror(&quot;open fail&quot;);
return -1;
}
write(fd,lcd_buf,800*480*4);
close(fd);
return 0;
}
编译: arm-linux-gcc -o lcd lcd.c
然后通过串口下载到开发板
#rx lcd
#chmod 777 lcd
#./lcd
#ps (查看当前后台运行的iot程序,然后把这个iot程序杀死 ,kill 对应的进程号码)
5、将framebuffer映射到我们进程空间
首先我们要根据显示设备进行映射,就要获取到它的硬件信息,这个信息在这个头文件有定义:vim /usr/include/linux/fb.h
238 struct fb_var_screeninfo {
239 __u32 xres; /* 宽 度 w */
240 __u32 yres; //高度 h
245
246 __u32 bits_per_pixel; /* 每一个像素用多少位来表示 */
}
FBIOGET_VSCREENINFO
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#include <sys/mman.h>
int main()
{
int fd;
int *plcd=NULL;
fd = open(&quot;/dev/fb0&quot;,O_RDWR);
if(fd < 0)
{
perror(&quot;open lcd fail&quot;);
return -1;
}
struct fb_var_screeninfo fbinfo;
ioctl(fd,FBIOGET_VSCREENINFO,&fbinfo);
printf(&quot;x:%d y:%d bit_per_pixel:%d\n&quot;,fbinfo.xres,fbinfo.yres,fbinfo.bits_per_pixel);
plcd = mmap(
NULL ,//表示映射的地址,为空让系统自动分配
fbinfo.xres*fbinfo.yres*fbinfo.bits_per_pixel/8,//分配内存的大小
PROT_WRITE,//对这个内存区域访问的权限
MAP_SHARED,//其他进程访问的权限
fd,
0//偏移量
);
if(plcd == MAP_FAILED)
{
perror(&quot;mmap fail&quot;);
close(fd);
return -1;
}
int x,y;
for(y=0;y<480;y++)
{
for(x=0;x<800;x++)
{
*(plcd + x + y*800) = 0x000000FF;
}
}
close(fd);
munmap(plcd,fbinfo.xres*fbinfo.yres*fbinfo.bits_per_pixel/8);
return 0; |