ARM实验板移植,linux点阵字库的使用
作者:互联网
不说原理,只讲步骤。包括所有自用包以及实验中遇到问题的解决办法。
想知道HZK16原理的直接搜关键词:HZK16汉字16*16点阵字库的使用
XMware:(14条消息) 小白如何在window电脑上安装Linux系统(虚拟机)超详细_码农邦的博客-CSDN博客_windows安装linux虚拟机
linux虚拟机:http://cdimage.ubuntu.com/ubuntu-mate/releases/18.04.4/release/
自用包(32位):链接:https://pan.baidu.com/s/1xnfhutYjEG0xnzD2KrQB2w
提取码:gqfu
下载32位镜像是因为方便,不然后面实验还要安别的包,很麻烦
1. Linux系统上编写输出自己名字的c程序(目录下要有hzk16文件:链接:https://pan.baidu.com/s/1md5mbE6jA0QXYzici16J0w
提取码:ozp7 )
直接放代码test.c:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE* fphzk = NULL;
int i, j, k, m,offset;
int flag;
unsigned char buffer[32];
//unsigned char word[2] = {0xD3,0xE0};
unsigned char word[6] = {0xB4,0xF3,0xC6,0xAF,0xC1, 0xC1}; // 改成你的转码后的汉字编码,推荐自用转码网站:https://www.qqxiuzi.cn/bianma/zifuji.php 一个字32个字节,比如“猫”的GB2313编码是C3A8,那么拆成俩0xC3以及0xA8。
unsigned char key[8] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };
fphzk = fopen("hzk16", "rb");
if(fphzk == NULL){
fprintf(stderr, "error hzk16\n");
return 1;
}
for(m=0;m<5;m=m+2){
offset = (94*(unsigned int)(word[m]-0xa0-1)+(word[m+1]-0xa0-1))*32;
fseek(fphzk, offset, SEEK_SET);
fread(buffer, 1, 32, fphzk);
for(k=0; k<16; k++){
for(j=0; j<2; j++){
for(i=0; i<8; i++){
flag = buffer[k*2+j]&key[i];
printf("%s", flag?"●":"○");
}
}
printf("\n");
}
}
for(k=0; k<31; k++){
printf("0x%02X,", buffer[k]);
}
printf("\n");
fclose(fphzk);
fphzk = NULL;
return 0;
}
其中:推荐自用汉字转码网站:https://www.qqxiuzi.cn/bianma/zifuji.php
2.在Linux系统中建立交叉编译环境并修改程序
(1)解压交叉编译工具
①将usr-local-arm-gcc.tar.gz(arm-linux 交叉编译工具)复制到 /usr/local 目录
交叉编译工具(下载压缩包里第一个,个人是下了前两个并解压到虚拟机同一目录里):
链接:https://pan.baidu.com/s/14LcEmSphD9mSIEcmp2JGiA
提取码:we73
②终端"cd" 到 /usr/local (意思是所有的命令都要在对应的路径输入,否则会提示找不到文件)
③执行 “tar -xzf usr-local-arm-gcc.tar.gz” 命令解压缩
(2)配置环境变量
①打开环境变量文件:sudo gedit /etc/profile
②增加路径设置,在末尾添加如下:
export PATH=$PATH:/usr/local/bin
export PATH=$PATH:/usr/local/arm/bin
③注册环境变量:source /etc/profile
④测试是否安装成功:在终端里输入arm-linux-gcc -v
如果出现版本信息,就是成功安装了。
(3)修改代码(先编译执行之前的c代码之后再进行这一步,编译执行的命令请看下一步)
要在LCD上显示需要将printf语句改成在对应地址写寄存器值。
代码display.c:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
#define FONT_COLOR 0xf100 //红色
unsigned short *fb = 0;
int main(void)
{
FILE* fphzk = NULL;
int i, j, k, m,offset;
int flag;
int fd_fb = 0;
unsigned char buffer[32];
//unsigned char word[2] = {0xD3,0xE0};
unsigned char word[6] = {0xB4,0xF3,0xC6,0xAF,0xC1, 0xC1}; // 改成你的转码后的汉字编码
unsigned char key[8] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };
fphzk = fopen("hzk16", "rb");
if(fphzk == NULL){
fprintf(stderr, "error hzk16\n");
return 1;
}
fd_fb = open("/dev/fb0", O_RDWR);//打开FrameBuffer驱动
fb = (unsigned short *)mmap(0, 240 * 320 * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);//映射显示存储器,2:2Bytes
memset(fb,0,240 * 320 * 2); //清屏
for(m=0;m<5;m=m+2){
offset = (94*(unsigned int)(word[m]-0xa0-1)+(word[m+1]-0xa0-1))*32;
fseek(fphzk, offset, SEEK_SET);
fread(buffer, 1, 32, fphzk);
for(k=0; k<16; k++){
for(j=0; j<2; j++){
for(i=0; i<8; i++){
if(buffer[k*2+j]&key[i])
*(fb + (k + 100) * 240 + (m/2)*(16+5) + j* 8 + i) = FONT_COLOR;
//printf("%s", flag?"●":"○");
}
}
printf("\n");
}
}
for(k=0; k<31; k++){
printf("0x%02X,", buffer[k]);
}
printf("\n");
fclose(fphzk);
fphzk = NULL;
return 0;
}
(4)交叉编译
(所有命令行均在该文件夹路径下执行)
对于修改前的代码:
①使用gcc编译:gcc -o display display.c 报错则修改,不报错则继续执行下一步
②执行编译文件:./display
对于修改后的代码:
①使用gcc编译:gcc -o display1 display.c 报错则修改,不报错则继续执行下一步
②使用arm-linux-gcc编译:arm-linux-gcc -o display1 display.c(先gcc编译再arm-linux-gcc编译!)
(这里,如果报错arm-linux-gcc找不到,那就再重复一遍上面注册的操作:cd /urs/local/,再输入注册命令:③注册环境变量:source /etc/profile④测试是否安装成功:在终端里输入arm-linux-gcc -v 之后再cd回来arm-linux-gcc -v ,出现版本信息后继续编译arm-linux-gcc -o display1 display.c)
3.制作新的文件系统镜像并烧写
(1)生成root文件系统
①将root文件系统镜像Mount(挂载)到一个空目录(disk)。使用如下命令:mount –t cramfs –o loop root.cramfs disk
如果没有下载cramfs,这里会报错:没有cramfs,需要安装cramfs
在安装cramfs安装包之前,需要下载zlib支持包,
链接:https://pan.baidu.com/s/1ouhHcGFWJJtsvImQjE8qGg
提取码:n5wc
1):解压zlib源码包和cramfs源码包.rar得到zlib-1.2.11.tar和cramfs_1.1.tar.gz压缩包 ,解压源码包 tar -xvf zlib-1.2.11.tar
2):解压源码包 tar -xvf cramfs_1.1.tar.gz
3):进入cramfs-1.1目录: cd cramfs-1.1
4):执行: make
5):编译完成会生成cramfsck与mkcramfs两个工具,mkcramfs工具是用来创建cramfs文件系统,而cramfsck工具则用来对cramfs文件系统的释放和检查。(如果没有出现这两个文件,可以直接解压我已经make好的cramfs-1.1(把下载的cramfs全删掉,复制这个make好的cramfs文件到相应目录):链接:https://pan.baidu.com/s/1-SO5M4I31E-wVcMQaXGHTg
提取码:zq0l )
下载完成后,使用如下命令:mount –t cramfs –o loop root.cramfs disk
②将disk目录内的整个root文件系统复制到一个新文件夹newdisk:将挂载后的文件夹在终端打开,输入sudo nautilus获得最高管理员权限,在弹出的文件窗口中操作即可(否则将没有复制权限)
③确定完整无误地复制了root文件系统后,Unmount(卸载)disk 内的文件系统,使用命令如下:
umount disk
④修改newdisk文件夹下所有文件的权限:
chmod -R 777 newdisk/
⑤将经过交叉编译的目标文件display及HZK16字库文件复制到newdisk的bin文件夹中(确保复制后两文件权限为可读写)
⑥使用如下命令生成一个新的 root 文件系统镜像:
./mkcramfs newdisk newroot.cramfs (如果报错可以尝试把newdisk文件夹全部复制到cramfs1.1/下,即与mkcramfs工具在一个文件夹下)
⑦修改newroot的权限:
chmod 777 newroot.cramfs
(2)烧写
将newroot.cramfs文件拷贝至老师电脑某文件夹下,按照第一个实验的第三步(文件系统镜像烧写)进行烧写
①新建超级终端,恢复默认值,码率选择115200,上电
②输入2(文件系统镜像烧写)
③插拔usb激活
④将文件系统镜像文件拷贝到u盘里
⑤弹出u盘(文件拷贝结束的标志)
⑥按任意键开始烧写
⑦烧写结束后按复位键进入文件系统
标签:gcc,cramfs,文件系统,arm,点阵字库,编译,linux,ARM 来源: https://blog.csdn.net/qq_43652735/article/details/118496984