zoukankan      html  css  js  c++  java
  • 基于S3C2440数码相框

    【参考】韦东山 教学笔记

    1. 程序框架
    1.1 触摸屏:
    主按线程,通过socket发给显示进程
    ---------------------------
    封装事件:ts线程 按键线程
    ---------------------------
    操作系统

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

    1.2 显示

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

    libjpeg
    mmap
    ----------------------------------------
    内存 内存 内存 内存 内存

    framebuffer
    -----------
    LCD

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

    gcc -o a a.c //

    gcc -finput-charset=GBK -fexec-charset=UTF-8 -o utf-8_2 ansi.c


    2.2 英文字母、汉字的点阵显示
    测试:
    A. 配置、修改内核支持把lcd.c编译进去
    cp /work/drivers_and_test_new/10th_lcd/lcd.c drivers/video/
    修改drivers/video/Makefile
    #obj-$(CONFIG_FB_S3C2410) += s3c2410fb.o
    obj-$(CONFIG_FB_S3C2410) += lcd.o

    nfs 32000000 192.168.1.123:/work/nfs_root/uImage; bootm 32000000

    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_jz2440; bootm 32000000
    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


    B. 使用新内核启动


    2.3 使用freetype来显示任意大小的文字
    2.3.1节_数码相框_freetype理论介绍
    2.3.2节_数码相框_在PC上测试freetype

    在PC:
    tar xjf freetype-2.4.10.tar.bz2
    ./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
    ./example1 ./simsun.ttc abc

    2.3.3节_数码相框_在LCD上显示一个矢量字体

    交叉编译:
    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

    编译出来的库文件应该放入:
    /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 .

    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


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

    arm-linux-gcc -finput-charset=GBK -fexec-charset=GBK -o show_font show_font.c -lfreetype -lm

    2.3.4节_数码相框_在LCD上显示几行文字
    a. 从左边开始显示几行文字
    arm-linux-gcc -finput-charset=GBK -o show_lines show_lines.c -lfreetype -lm


    b. 居中显示几行文字


    百问网gif
    www.100ask.net


    3. 在LCD上显示任意编码的文本文件,做一个电子书

    第1课第3.1节_数码相框_额外项目_电子书之效果及框架

    第1课3.2节_数码相框_额外项目_电子书之代码阅读及编写

    第1课3.3节_数码相框_额外项目_电子书之指针操作

    第1课3.4节_数码相框_额外项目_电子书之链表操作

    第1课3.5节_数码相框_额外项目_电子书之在PC上显示

    ctrl+alt+shift+f1

    下载地址:
    https://launchpad.net/ubuntu/+source/svgalib/1:1.4.3-30
    svgalib_1.4.3.orig.tar.gz
    svgalib_1.4.3-30.debian.tar.gz
    svgalib_1.4.3-30.dsc

    打补丁
    tar xzf svgalib_1.4.3.orig.tar.gz
    tar xzf svgalib_1.4.3-30.debian.tar.gz
    cd svgalib-1.4.3.orig/
    for file in ../debian/patches/*.patch; do patch -p1 < $file; done

    编译安装:
    sudo make install // 编译出错,需要安装libx86
    再 sudo make install


    下载地址
    http://packages.ubuntu.com/lucid/libx86-1

    tar xzf libx86_1.1+ds1.orig.tar.gz
    gunzip libx86_1.1+ds1-6.diff.gz
    cd libx86-1.1/
    patch -p1 < ../libx86_1.1+ds1-6.diff
    make // 出错,修改lrmi.c,添加宏, 参考561491.patch
    make
    sudo make install

        运行pc端程序是报错:error while loading shared libraries:libvga.so.1:cannot open shared object file :No such file or directory 。这是个很普遍的错误,找不到共享库,但是我发现其实这个库已经安装上了,在/usr/local/lib目录下已经存在,但是程序就是没找到它

      那就表示系统不知道xxx.so 放在哪个目录下。
    这个时候就要在/etc/ld.so.conf中加入xxx.so所在的目录。
     一般而言,有很多so文件在/usr/local/lib这个目录下,所以在/etc/ld.so.conf中加入/usr/local/lib这一行,可以解決此问题。加的时候直接在后面补上:/usr/local/lib。保存并退出后,还用用ldconfig命令进行更新。还要注意,这些命令如果说权限的原因的话,可以通过加sudo

    sudo vim /etc/ld.so.conf

       /usr/local/lib

    sudo ldconfig

    这样做之后再运行就没有错误了。

     sudo  ./show_file -s 16 -d crt  -f ./FZYTK.ttf ./utf8.txt

    http://security.ubuntu.com/ubuntu/pool/main//libx/libx86/
    libx86_1.1+ds1.orig.tar.bz2 // 修改

    sudo apt-get source libx86


    4. 编写一个通用的Makefile

    编译test_Makefile的方法:
    a. gcc -o test a.c b.c
    对于a.c: 预处理、编译、汇编
    对于b.c:预处理、编译、汇编
    最后链接
    优点:命令简单
    缺点:如果文件很多,即使你只修改了一个文件,但是所有的文件文件都要重新"预处理、编译、汇编"
    效率低

    b. 写Makefile
    核心:规则

    目标:依赖1 依赖2
    命令

    命令执行的条件:
    i. "依赖"文件 比 "目标"文件 新
    ii.没有"目标"这个文件

    5. 使用多种方法支持多输入
    http://cc.byexamples.com/2007/04/08/non-blocking-user-input-in-loop-without-ncurses/

    http://www.groad.net/bbs/simple/?t3959.html

    5.1 使用轮询方法 // CPU占用率高
    实验方法:
    a. insmod s3c_ts.ko
    确定是哪个设备节点对应触摸屏
    b.
    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

    c. 较准
    ts_calibrate

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

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

    (如果失败,先kill掉冲突的进程)

    f. telnet上开发板执行top命令观察


    5.2 使用select,poll // CPU占用率低,适用于很多简单场合

    参考:UNIX环境高级编程 I/O多路转接

    监测多个文件,只要有某一个文件可读/可写/异常或超时,即返回
    int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
    最大文件句柄+1 被监测是否可读的文件 超时时间
    被监测是否可写的文件
    被监测是否有异常的文件

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

    实现滑动翻页:
    1. 触摸点在X方向的位移差值超过x分辨率的5分之1,就翻页


    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

    6.1 网络编程的简单例子
    6.2 修改电子书源码支持远程打印
    6.3 完善远程打印


    7. libjpeg的使用
    一、交叉编译libjpeg
    tar xzf libjpeg-turbo-1.2.1.tar.gz
    cd libjpeg-turbo-1.2.1
    ./configure --prefix=/work/projects/13.libjpeg/libjpeg-turbo-1.2.1/tmp/ --host=arm-linux
    make
    make install

    二、交叉编译jpg2rgb.c
    2.1
    arm-linux-gcc -o jpg2rgb jpg2rgb.c -I /work/projects/13.libjpeg/libjpeg-turbo-1.2.1/tmp/include -L /work/projects/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

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

    cd /work/projects/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/projects/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

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

    三、在开发板上运行


    8. 大综合:实现数码相框

    8.4.4 试验:
    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.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 改进数码相框: 支持中文
    字符集和编码II: fat/msdos/vfat
    http://gosubi.me/adow/2008/08/charset-coding-2-vfat/

    8.5.4 课后作业及思路
    1. 在"browse页面"里, 对不同后缀名的文件使用不同的图标
    2. 支持其他格式的图片文件, 比如png
    3. 支持鼠标
    4. "manual页面"里,点击"上一张"或"下一张"时所要显示的图片比较大, 速度有点慢: 改进它
    5. 在"browse页面"里点击txt文件时, 能显示文件内容

    BMP文件格式:
    http://redwolf.blog.51cto.com/427621/229096

    C语言结构体对齐
    http://blog.csdn.net/shenbin1430/article/details/4292463

    参考资料:
    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

    http://www.svgalib.org/

  • 相关阅读:
    Android 中类似ModelWindow的一个实现
    DIV的圆角表现和TAB切换
    Android SDK Manager Google Apis 下载
    Android ADT初始化失败
    2层Folder删除问题,父文件夹删不掉
    【转】Android使用Log4j例子
    编译和解释的区别
    局部变量和全局变量
    函数的几种参数
    格式化
  • 原文地址:https://www.cnblogs.com/Hello-words/p/6107231.html
Copyright © 2011-2022 走看看