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盘(文件拷贝结束的标志)
⑥按任意键开始烧写
⑦烧写结束后按复位键进入文件系统

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值