数码相框

本文详细介绍了嵌入式系统中字符编码、点阵显示、freetype库的使用,以及如何在LCD上显示字体和电子书。涉及到字符编码的GBK与UTF-8转换,freetype库的编译与应用,LCD上的矢量字体显示,以及电子书的实现,包括文件显示、指针操作和链表操作。此外,还讨论了多输入支持的框架,如触摸屏、select和多线程方法,以及TCP/IP网络编程的基础知识。
摘要由CSDN通过智能技术生成

文章目录

文件浏览器_数码相框

1、系统框架

设计产品时的思路:
在这里插入图片描述
确定数码相框的基本功能:
在这里插入图片描述
在这里插入图片描述
总结:
在这里插入图片描述

1. 程序框架
1.1 触摸屏:
              主按线程,通过socket发给显示进程

              ---------------------------

              封装事件:ts线程          按键线程

              ---------------------------

                       操作系统

封装的数据有:时间、类型(点击、上下左右移动)、位置、速度、幅度

1.2 显示
放大()  缩小()  左边    右边   当前    显示控制     接收sochket

              libjpeg
              mmap

----------------------------------------
内存      内存      内存    内存    内存
                  framebuffer
                  -----------
                     LCD

2、字符

2.1、字符的编码方式

  1. 显示文字
    2.1 文字编码方式
    源文件用不同的编码方式编写,会导致执行结果不一样。
    怎么解决?编译程序时,要指定charset(字符集)
    man gcc , /charset
    -finput-charset=charset 表示源文件的编码方式, 默认以UTF-8来解析
    -fexec-charset=charset 表示可执行程序里的字符以什么编码方式来表示,默认是UTF-8
    gcc -o a a.c /* 默认是UTF-8 */
    gcc -finput-charset=GBK -fexec-charset=UTF-8 -o utf-8_2 ansi.c

串口发送数据给PC机:
在这里插入图片描述
字符编码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2、字符的点阵显示

2.2 英文字母、汉字的点阵显示
测试:
1、配置、修改内核支持把lcd.c编译进去
cp /work/drivers_and_test_new/10th_lcd/lcd.c drivers/video/

2、修改drivers/video/Makefile
#obj- ( C O N F I G F B S 3 C 2410 ) + = s 3 c 2410 f b . o o b j − (CONFIG_FB_S3C2410) += s3c2410fb.o obj- (CONFIGFBS3C2410)+=s3c2410fb.oobj(CONFIG_FB_S3C2410) += lcd.o

3、启动内核
nfs 32000000 192.168.2.22:/work/nfs_root/uImage_lcd_2.2; bootm 32000000

把tty1也就是lcd当作控制台显示,去掉的话就是显示在串口中:
在这里插入图片描述

set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.123:/work/nfs_root/fs_mini_mdev_new ip=192.168.1.17
nfs 32000000 192.168.1.123:/work/nfs_root/uImage_tq2440; bootm 32000000
nfs 32000000 192.168.1.123:/work/nfs_root/uImage_mini2440; bootm 32000000
  1. 使用新内核启动

2.3、freetype

2.3.1、reetype理论介绍

字体文件:
在这里插入图片描述
freetype库中:
在这里插入图片描述
一个文字的显示过程:
在这里插入图片描述
怎样写代码实现文字的显示过程:
在这里插入图片描述

2.3.2、在PC上测试freetype

在服务器上:

tar xjf freetype-2.4.10.tar.bz2 
cd freetype-2.4.10
./configure
make
sudo make install

gcc -o example1 example1.c  -I /usr/local/include/freetype2 -lfreetype -lm
gcc -finput-charset=GBK -fexec-charset=UTF-8 -o example1 example1.c  -I /usr/local/include/freetype2 -lfreetype -lm

-I (大i):表示指定头文件路径
-l (小l):表示指定库
./example1 ./simsun.ttc abc		/* example1放在有simsun文件的目录下才能运行 */

显示字体:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参考资料:
FreeType 字体引擎分析与指南
http://wenku.baidu.com/view/2d24be10cc7931b765ce155b.html

HZK16应用示例
http://wenku.baidu.com/view/0774d20c52ea551810a68768.html

点阵字库HZK12 HZK16 HZK24 ASC12 ASC16 简介 及 使用方法
http://blog.csdn.net/hongjiujing/article/details/6649618

汉字拼音、五笔、GB2312、GBK、Unicode、BIG5编码速查
http://ipseeker.cn/tools/pywb.php

在线汉字编码查询,一次查询多个汉字输入法编码及内码——快典网.htm
http://bm.kdd.cc/

BIG5编码表
http://wenku.baidu.com/view/9bb3ae01b52acfc789ebc970.html

UNICODE编码表
http://wenku.baidu.com/view/7c667f563c1ec5da50e27069.html

GB2312简体中文编码表
http://wenku.baidu.com/view/0ef57bfb04a1b0717fd5dd1a.html

hzk16的介绍以及简单的使用方法
http://hi.baidu.com/hrman/blog/item/4616bc2675ce13128a82a193.html

UTF-8
http://zh.wikipedia.org/wiki/UTF-8

getopt的用法
http://www.cnitblog.com/zouzheng/archive/2007/04/02/25034.aspx

2.3.3、在LCD上显示一个矢量字体

交叉编译:
tar xjf freetype-2.4.10.tar.bz2
cd freetype-2.4.10
./configure --host=arm-linux
make
su root /* 不切换的话会出错 https://www.veryarm.com/41852.html */
make DESTDIR=$PWD/tmp install

编译出来的头文件应该放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

编译出来的库文件应该放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

把tmp/usr/local/lib/* 复制到 /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
sudo cp * /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib -d -rf
cp so /work/nfs_root/fs_mini_mdev_new/lib -d

把tmp/usr/local/include/* 复制到 /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
cp * /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include -rf

cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
mv freetype2/freetype .

编译example1.c:
arm-linux-gcc -finput-charset=GBK -o example1 example1.c -lfreetype -lm
arm-linux-gcc -finput-charset=GBK -o show_font show_font.c -lfreetype -lm

cp example1 simsun.ttc /work/nfs_root/fs_mini_mdev_new/

freetype/config/ftheader.h
freetype2/freetype/config/ftheader.h

编译show_font_zdy.c:
iconv -f GBK -t UTF-8 show_font_zdy.c /* 删除出错的字符 */
arm-linux-gcc -finput-charset=GBK -fexec-charset=GBK -o show_font show_font.c -lfreetype -lm

旋转字体:
./show_font_zdy ./simsun.ttc
./show_font_zdy ./simsun.ttc 300
./show_font_zdy ./simsun.ttc 0

2.3.4、在LCD上显示几行文字

显示:
百问网gif
www.100ask.net

编译:
arm-linux-gcc -finput-charset=GBK -o show_lines show_lines.c -lfreetype -lm

显示位置:
1、从左边开始显示几行文字
2、居中显示几行文字
在这里插入图片描述

3、额外项目_电子书

3.1、电子书之效果及框架

怎样在LCD上显示文件:
在这里插入图片描述
怎样编写程序:
在这里插入图片描述
程序框架:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
体验用法:
1、在PC上编译:
进入源码目录执行make命令即可生成show_file应用程序
把show_file,MSYH.TTF,hz.txt,utf8.txt,utf16be.txt,utf16le.txt复制到开发板上

2、在开发板上执行下列命令之一,即可在LCD上显示
./show_file -s 16 -h HZK16 -f ./MSYH.TTF hz.txt
./show_file -s 16 -h HZK16 -f ./MSYH.TTF utf8.txt
./show_file -s 16 -h HZK16 -f ./MSYH.TTF utf16be.txt
./show_file -s 16 -h HZK16 -f ./MSYH.TTF utf16le.txt
在这里插入图片描述
其他大小:
./show_file -s 24 -h HZK16 -f ./MSYH.TTF utf8.txt
./show_file -s 32 -h HZK16 -f ./MSYH.TTF utf8.txt

在开发板的串口里输入n并回车可以显示下一页文字,输入u并回车可以显示上一页文字,输入q并回车可以退出

3、注意: 新宋字体simsun不支持16点阵大小的字体,这是它的缺陷

3.2、电子书之代码阅读及编写

整体框架:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3、电子书之指针的操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4、电子书之链表的操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5、电子书之在PC上显示

再ubuntu中Ctrl+Fn+F1+Alt进入界面输入tty1;GUI1
Ctrl+Fn+F2+Alt进入界面输入tty2;GUI2
Ctrl+Fn+F7+Alt回到ubuntu;GUI7

svgalib是一套运行于Linux及FreeBSD下的开放源代码低阶绘图函式库,它允许程式设计人员变更视讯模式及全屏幕图像。它提供了函数接口使得linux的图形显示更容易。
  svga的移植步骤:
  1)下载svgalib
    下载地址:https://launchpad.net/ubuntu/+source/svgalib/1:1.4.3-30
    下载文件:svgalib_1.4.3.orig.tar.gz // svgalib压缩安装文件
     svgalib_1.4.3-30.debian.tar.gz // svgalib压缩补丁文件
     svgalib_1.4.3-30.dsc // 文件描述
  2)解压缩
    解压缩svgalib压缩安装文件:tar xzf svgalib_1.4.3.orig.tar.gz
    解压缩svgalib压缩补丁文件:tar xzf svgalib_1.4.3-30.debian.tar.gz
  3)打补丁
    进入svgalib目录:cd svgalib-1.4.3.orig/
    打补丁:for file in …/debian/patches/*.patch; do patch -p1 < $file; done
  4)编译安装:
    sudo make install
  此时会编译出错,编译出错信息为:未定义libx86.h,需要安装libx86
  5)下载libx86
    下载地址:http://packages.ubuntu.com/lucid/libx86-1
    下载文件:libx86_1.1+ds1.orig.tar.gz // libx86压缩安装文件
         libx86_1.1+ds1-6.diff.gz // libx86压缩补丁文件
  6)解压缩
    解压缩libx86压缩安装文件:tar xzf libx86_1.1+ds1.orig.tar.gz
    解压缩libx86压缩补丁文件:gunzip libx86_1.1+ds1-6.diff.gz
  7)打补丁
    进入libx86目录:cd libx86-1.1/
    打补丁:patch -p1 < …/libx86_1.1+ds1-6.diff
  8)编译安装
    make
  此时又会有一个错误,错误消息提示:“IF_MASK”未定义
  google search搜索得到一个补丁文件,阅读补丁文件得知为向lrmi.c中添加宏定义。
  9)添加宏
    向lrmi.c中添加宏定义如下:
    #if defined(linux) && !defined(TF_MASK)
      #define TF_MASK X86_EFLAGS_TF
      #define IF_MASK X86_EFLAGS_IF
      #define VIF_MASK X86_EFLAGS_VIF
      #define IOPL_MASK X86_EFLAGS_IOPL
    #endif
  10)跳至第8步
    编译:make
    安装:sudo make install
  11)跳至第4步
    安装:sudo make install
  至此,终于将svgalib库函数安装完毕。
  下面来写一个test.c

  #include 
  #include 
  #include 
  int main(void)
  {
    int x, y;

    vga_init();
    vga_setmode(G320x200x256);
    gl_setpalettecolor(4, 0xE7>>2, 0xDB>>2, 0xB5>>2);    // 设置要显示的颜色
    vga_setcolor(4); 
    for (x = 0; x < 320; x++)
    for (y = 0; y < 200; y++)
    vga_drawpixel(x, y); 
    sleep(5);
    vga_setmode(TEXT); 
    return EXIT_SUCCESS;
  } 

编译:gcc test.c -o est -lvga -lvgagl
  运行:sudo ./test
  这里遇到了点错误:libvga.so.1:cannot open shared object file:No such file or directory
  在svgalib安装目录下搜索:find -name “libvga.so.1”
  在网上搜索我得到了以下三种解决办法: 
  1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边
    ln -s /where/you/install/lib/*.so /usr/lib
    sudo ldconfig
  2.修改LD_LIBRARY_PATH
    export LD_LIBRARY_PATH=/where/you/install/lib:$LD_LIBRARY_PATH
    sudo ldconfig
  3.修改/etc/ld.so.conf,然后刷新
    vim /etc/ld.so.conf
    sudo ldconfig

采用第一种办法,将libvga.so.1文件链接到/usr/lib目录下,刷新后重新运行test文件,成功得到一块指定颜色的空间域。
  明明有libvga.so.1共享库文件可是却为找到,这是为什么呢?以下为在网上找到的解释:
  库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使 用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。设置库文件 的搜索路径有下列两种方式,可任选其一使用:
  1、在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。
个别情况下还是不识别,或者就是配置的有问题,写这篇文档就是因为环境变量配置了但是不识别
  2、在 /etc/ld.so.conf 文件中添加库的搜索路径。
  将自己可能存放库文件的路径都加入到/etc/ld.so.conf中是明智的选择
  添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:
   /usr/X11R6/lib
   /usr/local/lib
   /opt/lib
  需要注意的是:第二种搜索路径的设置方式对于程序连接时的库(包括共享库和静 态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不 够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.cache 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。ldconfig ,简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache 以供使用。因此当安装完一些库文件,(例如刚安装好 glib),或者修改ld.so.conf增加新的库路径后,需要运行一下 /sbin/ldconfig使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不 会被使用 的,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂computer蠢猪一个。
  在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。
  前面已经说明过了,库搜索路径的设置有两种方式:在环境变量 LD_LIBRARY_PATH 中设置以及在 /etc/ld.so.conf 文件中设置。其中,第二种设置方式需要 root 权限,以改变 /etc/ld.so.conf 文件并执行 /sbin/ldconfig 命令。而且,当系统重新启动后,所有的基于 GTK2 的程序在运行时都将使用新安装的 GTK 库。不幸的是,由于 GTK 版本的改变,这有时会给应用程序带来兼容性的问题,造成某些程序运行不正常。为了避免出现上面的这些情况,在 GTK 及其依赖库的安装过程中对于库的搜索路径的设置将采用第一种方式进行。这种设置方式不需要 root 权限,设置也简单:

  $ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH 
  可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容: 
  $ echo $LD_LIBRARY_PATH 

至此,库的两种设置就完成了。
在我的机子上sudo make install出错:原因是只能在32位机器上运行。

root@zdy:/work/hardware/5_zdy_project/07_svgalib/svgalib-1.4.3.orig# sudo make install
。。。
make[1]: Leaving directory '/work/hardware/5_zdy_project/07_svgalib/svgalib-1.4.3.orig/sharedlib'
Makefile:381: recipe for target 'sharedlib/libvga.so.1.4.3' failed
make: *** [sharedlib/libvga.so.1.4.3] Error 2

sudo apt-get source libx86

参考资料:
http://www.svgalib.org/

4、编写通用的Makefile

编译test_Makefile的方法:
a. gcc -o test a.c b.c
对于a.c:预处理、编译、汇编
对于b.c:预处理、编译、汇编
最后链接
优点:命令简单
缺点:如果文件多即使只修改了一个文件,但所有的文件都要重新"预处理、编译、汇编",效率低
b. 写Makefile
核心:规则
目标:依赖1 依赖2
命令
命令执行的条件:
i. "依赖"文件 比 "目标"文件 新
ii.没有"目标"这个文件

http://www.groad.net/bbs/simple/?t3959.html
gcc -o example1 example1.c -L/usr/local/lib/ -lfreetype -lm -I /usr/local/include/freetype2
gcc -finput-charset=GBK -fexec-charset=UTF-8 -o example1 example1.c -L/usr/local/lib/ -lfreetype -lm -I /usr/local/include/freetype2
gcc -finput-charset=UTF-8 -fexec-charset=UTF-8 -o example1 example1.c -L/usr/local/lib/ -lfreetype -lm -I /usr/local/include/freetype2
在这里插入图片描述
在这里插入图片描述

5、使用多种方法支持多输入

5.1、框架及轮询方式

使用轮询方法:// CPU占用率高
如果有数据就读取、处理、返回;
如果没有数据, 立刻返回, 不等待实验方法。

5.1.1、安装tslib运行特定插件

1、在线安装

sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool

2、手动安装

解压在usr/local目录下
1、安装m4
wget http://mirrors.kernel.org/gnu/m4/m4-1.4.13.tar.gz \
&& tar -xzvf m4-1.4.13.tar.gz \
&& cd m4-1.4.13 \
&& ./configure -prefix=/usr/local
sudo make
sudo make install

2、安装autoconf
wget http://mirrors.kernel.org/gnu/autoconf/autoconf-2.65.tar.gz \
&& tar -xzvf autoconf-2.65.tar.gz \
&& cd autoconf-2.65 \
&& ./configure -prefix=/usr/local
sudo make
sudo make install

3、安装automake
wget http://mirrors.kernel.org/gnu/automake/automake-1.11.tar.gz \
&& tar xzvf automake-1.11.tar.gz \
&& cd automake-1.11 \
&& ./configure -prefix=/usr/local
sudo make
sudo make install

4、安装libtool
wget http://mirrors.kernel.org/gnu/libtool/libtool-2.2.6b.tar.gz \
&& tar xzvf libtool-2.2.6b.tar.gz \
&& cd libtool-2.2.6b \
&& ./configure -prefix=/usr/local
sudo make
sudo make install

5.1.2、编译、安装tslib

编译:
tar xzf tslib-1.4.tar.gz
cd tslib
./autogen.sh
mkdir tmp
echo “ac_cv_func_malloc_0_nonnull=yes” >arm-linux.cache
./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$(pwd)/tmp
make
make install

安装:
cd tmp
cp * -rf /nfs_root_first_fs

tslib出错:
在这里插入图片描述

5.1.3、使用tslib

1、insmod s3c_ts.ko
确定是哪个设备节点对应触摸屏

2、设置参数
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0

3、较准
ts_calibrate

4、telnetd -l /bin/sh //启动telnet服务,为了登录进去观察CPU占用率

5、./show_file -s 24 -d fb -f ./MSYH.TTF ./utf8_novel.txt

6、telnet上开发板执行top命令观察

5.2、select方式

使用select,poll:CPU占用率低,适用于很多简单场合
参考:UNIX环境高级编程 I/O多路转接
监测多个文件,只要有某一个文件可读/可写/异常或超时,即返回
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
最大文件句柄+1 被监测是否可读的文件 超时时间
被监测是否可写的文件
被监测是否有异常的文件

在input_manager.h中:
在这里插入图片描述
在stdin.c的StdinDevInit函数中:
在这里插入图片描述
在touchscreen.c的TouchScreenDevInit函数中:
在这里插入图片描述
在input_manager.c中:
定义全局变量:
static fd_set g_tRFds;
static int g_iMaxFd = -1;

在AllInputDevicesInit函数中:
在这里插入图片描述
在GetInputEvent函数中:
在这里插入图片描述

5.3、多线程

使用多线程:CPU占用率低,非常灵活
参考 Unix_Linux_Windows_OpenMP多线程编程.pdf P18 3.3.2 条件变量

单线程:
在这里插入图片描述
多线程:
在这里插入图片描述
实现滑动翻页:
触摸点在X方向的位移差值超过x分辨率的5分之1,就翻页
在这里插入图片描述
在input_manager.h中:
在这里插入图片描述
在main函数中:
在这里插入图片描述
在input_manager.c中:
定义全局变量:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在mian函数中:
在这里插入图片描述
在input_manager.c中:
在这里插入图片描述
在stdin.c中:
在这里插入图片描述
在touchscreen.c中:
在这里插入图片描述
在这里插入图片描述
处理滑动翻页:
在touchscreen.c中:
在这里插入图片描述
在这里插入图片描述

6、网络编程

参考文档

网络通信介绍:
在这里插入图片描述

6.1、tcp

TCP涉及系统调用:
在这里插入图片描述

6.1.1、server端程序

1、服务器程序一开始调用socket()函数得到一个iSocketServer(类似于文件句柄),socket()没有任何信息;
2、调用bind()函数来绑定IP的端口,服务器就会监测IP的端口;
3、调用listen()函数来启动监测;
4、调用accept()函数等待客户连接;
5、一旦有客户端连接成功,就会使用fork()函数来创建一个子进程,程序运行到这里,fork复制出一个子进程
if(fork() == 0) 子进程走这条分支
else 原来的进程走这条分支
在这里插入图片描述
6、在子进程中调用recv()函数来接收客户端传来的消息并打印出来。

在子进程退出之后会出现僵死进程:
参考
在这里插入图片描述

6.1.2、client端程序

1、调用socket()函数得到一个句柄
2、调用connect()函数连接到一个服务器上面去
这个connect函数中有一个结构体,其中有IP、端口、协议等等信息
3、连接成功之后调用send()函数来发送数据

6.1.3、测试

./server

./client 192.168.2.22
zdy
1717288

6.2、udp

UDP涉及系统调用:
在这里插入图片描述

6.2.1、server端程序

1、服务器程序一开始调用socket()函数得到一个iSocketServer(类似于文件句柄),socket()没有任何信息;
2、调用bind()函数来绑定IP的端口,服务器就会监测IP的端口;
3、在子进程中调用recvform()函数来接收客户端传来的消息并打印出来。

6.2.2、client端程序

1、调用socket()函数得到一个句柄
2、(可省略此条)调用connect()函数连接到一个服务器上面去
这个connect函数中有一个结构体,其中有IP、端口、协议等等信息
3、连接成功之后调用send()函数来发送数据

6.3、修改电子书源码支持远程打印

6.3.1、框架及程序

要实现的功能:
在这里插入图片描述
程序框架:
在这里插入图片描述
环形缓冲区:
在这里插入图片描述
打印线程:
在这里插入图片描述
打印程序流程
main函数调用debug_manager.c中的函数DebugInit()和InitDebugChanel()进行初始化;
debug_manager.c中调用stdout.c和netprint.c中的函数进行初始化。

服务端程序netprint.c中:
1、NetDbgInit初始化函数中:
1.1、使用socket()函数获得句柄
1.2、bind绑定设置好的网络信息
1.3、创建线程
创建netprint发送线程(4): 用来发送打印信息给客户端
创建netprint接收线程(5): 用来接收控制信息,比如修改打印级别,打开/关闭打印

2、NetDbgExit退出函数中:
关闭socket

3、NetDbgPrint网络打印函数中:
3.1、把数据放入环形缓冲区
3.2、如果已经有客户端连接了,就把数据通过网络发送给客户端,唤醒netprint的发送线程

4、发送线程函数NetDbgSendTreadFunction中:
4.1、休眠
4.2、当有客户端连接之后休眠进程被唤醒
4.2.1、把环形缓冲区的数据取出来
4.2.2、用sendto函数发送打印信息给客户端

5、接收线程函数NetDbgRecvTreadFunction中:
5.1、使用recvfrom来接受数据
5.2、判断接收数据是否成功,若成则解析数据
5.2.1、若为setclient :表示客户端准备接收数据,那么发送线程被唤醒
5.2.2、若为dbglevel= :表示设置了打印级别
5.2.3、若为stdout=和netprint= :表示打开/关闭stdout打印或者打开/关闭netprint打印

客户端程序netprint_client.c中:
1、打印用法
2、使用socket函数获得句柄
3、设置IP地址等信息
4、判断传入的数据是准备发送给服务端;还是准备接收服务端的数据

6.3.2、测试

编译服务端程序:
make

编译客户端程序:
gcc -o netprint_client netprint_client.c

装载触摸屏驱动:
1、insmod s3c_ts.ko
确定是哪个设备节点对应触摸屏

2、设置环境变量
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0

3、较准
ts_calibrate

4、开发板上
./show_file -s 24 -d fb -f ./MSYH.TTF ./utf8.txt

5、ubuntu上
./netprint_client
在这里插入图片描述
在开发板上按下n和u上一页、下一页。

7、libjpeg的使用

7.1、2440显示图片介绍

从jpg图片中得到RGB数据,放入显存中,使用2440在LCD中显示出来
在这里插入图片描述
处理jpg图片:
在这里插入图片描述
JPEG的解压操作:
Allocate and initialize a JPEG decompression object // 1. 分配和初始化一个decompression结构体
Specify the source of the compressed data (eg, a file) // 2. 指定源文件
Call jpeg_read_header() to obtain image info // 3. 用jpeg_read_header获得jpg信息
Set parameters for decompression // 4. 设置解压参数,比如放大、缩小
jpeg_start_decompress(…); // 5. 启动解压:jpeg_start_decompress
while (scan lines remain to be read)
jpeg_read_scanlines(…); // 6. 循环调用jpeg_read_scanlines
jpeg_finish_decompress(…); // 7. jpeg_finish_decompress
Release the JPEG decompression object // 8. 释放decompression结构体

7.2、程序

在这里插入图片描述
在这里插入图片描述

7.3、交叉编译libjpeg

tar xzf libjpeg-turbo-1.2.1.tar.gz
cd libjpeg-turbo-1.2.1
mkdir tmp
./configure --prefix=/home/book/work/5_zdy_project/13_libjpeg/libjpeg-turbo-1.2.1/tmp/ --host=arm-linux
su root
make
make install

7.4、交叉编译jpg2rgb.c

7.4.1、手动指定库的路径

arm-linux-gcc -o jpg2rgb jpg2rgb.c -I /work/hardware/5_zdy_project/13_libjpeg/libjpeg-turbo-1.2.1/tmp/include -L /work/hardware/5_zdy_project/13_libjpeg/libjpeg-turbo-1.2.1/tmp/lib -ljpeg
cp jpg2rgb /work/nfs_root/fs_mini_mdev_new
cp libjpeg-turbo-1.2.1/tmp/lib/so /work/nfs_root/fs_mini_mdev_new/lib/ -d

7.4.2、自动指定库的路径

把编译出来的头文件应该放入:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
cd /work/hardware/5_zdy_project/13_libjpeg/libjpeg-turbo-1.2.1/tmp/include
cp * /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

把编译出来的库文件应该放入:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
cd /work/hardware/5_zdy_project/13_libjpeg/libjpeg-turbo-1.2.1/tmp/lib
cp so -d /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

7.4.3、编译jpg2rgb.c

arm-linux-gcc -o jpg2rgb jpg2rgb.c -ljpeg

7.5、在开发板上运行

./jpg2rgb 1.jpg

8、数码相框

8.1、数码相框功能及程序框架

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.2、程序编写_先写框架

1、main()函数里,先一系列的初始化之后调用MainPageRun()函数。
2、在MainPageRun()函数中:
2.1、显示main页面
2.2、创建Prepare线程
2.3、调用MainPageGetInputEvent获得输入事件,进而处理
2.3.1、保存当前画面StorePage();
2.3.2、如果输入事件是点击进入Explore浏览模式,那么就进入浏览模式显示Explore画面;

		/* 1. 显示ExplorePageRun页面 */
		/* 2. 创建ExplorePagePrepare线程 */
		/* 3. 调用GetInputEvent获得输入事件,进而处理 */
			向上、选择、下一页、上一页等等事件

2.3.3、恢复当前画面RestorePage();

其中MainPageGetInputEvent获得输入事件函数中:
1、获得原始的触摸屏数据,它是调用input_manager.c的函数GetInputEvent();
此函数会让当前线否休眠,当触摸屏线程获得数据后,会把它唤醒。
2、处理数据

8.3、程序编写_图标显示

8.3.1、bmp数据提取

数码相框显示效果图:
在这里插入图片描述
图片为bmp格式的,分辨率比较大,涉及一些问题:
在这里插入图片描述
在这里插入图片描述
bmp格式文件的解析:
参考:https://blog.51cto.com/redwolf/229096

8.3.1.1、在pic_operations.h中

定义图片的像素数据结构体:PixelDatas
在这里插入图片描述
图片的解析函数结构体:PicFileParser
在这里插入图片描述

8.3.1.2、在bmp.c中

定义pic_operation.h中注册的结构体(函数)再把bmp文件中的信息取出来存到定义的buffer中去。
C语言结构体的字节对齐原则:https://blog.csdn.net/shenbin1430/article/details/4292463
#pragma pack(push) /* 将当前pack设置压栈保存 /
#pragma pack(1) /
必须在结构体定义之前使用,这是为了让结构体中各成员按1字节对齐 /
定义文件信息头:typedef struct tagBITMAPFILEHEADER { /
bmfh /
在这里插入图片描述
定义位图信息头:typedef struct tagBITMAPINFOHEADER { /
bmih /
在这里插入图片描述
#pragma pack(pop) /
恢复先前的pack设置 */
定义图片的解析函数结构体:PicFileParser
在这里插入图片描述
在这里插入图片描述
提供注册函数:BMPParserInit
在这里插入图片描述

8.3.2、缩放

图片缩放参考:
http://blog.chinaunix.net/uid-22915173-id-2185545.html
在zoom.c中:
在这里插入图片描述

8.3.3、合并图片

小图合并到大图中:
在这里插入图片描述
把图片的某部分合并到老图片的指定区域:
在这里插入图片描述

8.3.4、测试

./ digitpic 1.bmp

8.4、MainPage

8.4.1、数MainPage显存管理

在main_page.c中:MainPageRun里面显示页面
在这里插入图片描述
在ShowMainPage中
在这里插入图片描述
在这里插入图片描述
在disp_manager.h中: AllocVideoMem中分配显存:
在这里插入图片描述
GetVideoMem中获得显存:
在这里插入图片描述
在PutVideoMem中释放显存:
在这里插入图片描述

8.4.2、MainPage页面规划

8.4.3、MainPage输入功能

8.4.4、MainPage测试

试验:
1. insmod s3c_ts.ko
2. 设置环境变量
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0

3.
在开发板上:mkdir -p /etc/digitpic/icons
把图标文件放到开发板的/etc/digitpic/icons

4.运行测试程序
./digitpic

8.5、完整的数码相框

8.5.1、效果演示及编译使用方法

1. 交叉编译安装freetype
tar xjf freetype-2.4.10.tar.bz2 
./configure --host=arm-linux
make
make DESTDIR=$PWD/tmp install

编译出来的头文件应该放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

把tmp/usr/local/include/*  复制到 /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
cp * /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include -rf
cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
mv freetype2/freetype .

编译出来的库文件应该放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

把tmp/usr/local/lib/*  复制到 /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
sudo cp * /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib -d -rf

//放到根文件系统
cp *so* /work/nfs_root/fs_mini_mdev_new/lib -d

2. 交叉编译安装libjpeg (如果工具链中已经有libjpeg库,这步可省;否则参考前面笔记)

3. 把freetype库, libjpeg库放到根文件系统上去
//放到根文件系统
进入freetype的tmp/usr/local/lib
cp *so* /work/nfs_root/fs_mini_mdev_new/lib -d

4. 交叉编译安装tslib库
修改:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/linux/input.h
#define EV_VERSION       0x010000
改为
#define EV_VERSION		0x010001

然后:参考<tslib编译使用方法.txt>

5. 准备运行:
a. 从windows 得到矢量字体文件MSYH.TTF, 把它放入fs_mini_mdev_new
b. 在根文件系统上建 /etc/digitpic 目录
   把icons复制进去
c. insmod s3c_ts.ko
d. 
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
e. ts_calibrate
f. ./digitpic /MSYH.TTF

8.5.2、完整代码的讲解

8.5.3、改进性能_支持中文

8.5.4、课后作业及思路

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值