找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5941|回復: 2
收起左側(cè)

MCU驅(qū)動GEC6818程序開發(fā)記錄

[復制鏈接]
ID:442604 發(fā)表于 2019-5-24 19:18 | 顯示全部樓層 |閱讀模式
在GEC6818開發(fā)平臺上可以顯示JPG格式的圖片

一. 任務(wù):顯示RGB顏色LCD液晶屏幕中   --> 例如: 填充紫色到LCD上。
1. 分析技術(shù)點
1)了解LCD液晶屏幕組成架構(gòu)?
2)在嵌入式平臺如何處理LCD屏幕?
3)如何在工程訪問LCD液晶屏?
4)如何寫入數(shù)據(jù)到LCD屏幕中?數(shù)據(jù)是什么?該如何表示顏色?

二. 研究LCD液晶屏幕參數(shù)
1. 什么是分辨率?GEC6818平臺LCD屏幕分辨率是多少?
分辨率指的是設(shè)備總像素點數(shù)是多少,例如:電視機1080*720 -> 一共有1080*720這么多個像素點
GEC6818平臺分辨率->800*480

2. 什么是像素點?
像素,就是圖像元素,指的是由RGB顏色組成一個點。

3. 究竟每個像素點如何組成?
像素點占多少個字節(jié)數(shù)?  --> 通過在GEC6818平臺輸入命令知道
[root@GEC6818 /]#cat /sys/class/graphics/fb0/bits_per_pixel
32

---> 1個像素點  -->  32位
已知:1個字節(jié) = 8位
---> 1個像素點  --> 4個字節(jié)

結(jié)論: 每一個像素點  --> 透明度,紅色,綠色,藍色

三. 在嵌入式平臺如何處理LCD屏幕?
原理:在linux下,一切都是文件。  --->在linux下,LCD液晶屏是被看作是一個文件。
LCD液晶屏幕對應(yīng)的文件名是什么?
--->規(guī)律:嵌入式平臺硬件設(shè)備文件名存放dev目錄  dev->device

1. 切換到/dev目錄下
[root@GEC6818 /]#cd /dev/
[root@GEC6818 /dev]#

2. 查看當前目錄下所有的文件名是什么?
[root@GEC6818 /dev]#ls
fb0  --> 就是LCD液晶屏幕的文件名

四. 如何在工程訪問/關(guān)閉LCD液晶屏?  --> 新的函數(shù):open
1. 在Ubuntu中,輸入命令查看open函數(shù)用法
gec@ubuntu:~$ man 2 open   --> 結(jié)束查詢->按‘q’

頭文件是什么?
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

函數(shù)原型是什么?
int open(const char *pathname, int flags);

參數(shù)填什么?
pathname:需要打開的文件的路徑名  -> 文件在哪里?
flags:操作文件的權(quán)限
O_RDONLY  --> read only   -> 只讀
O_WRONLY  --> write only  -> 只寫
O_RDWR    --> read write  -> 可讀可寫

返回值是什么?
成功:new file descriptor  -> 新的文件描述符  --> 其實是大于等于0  >=0
失。-1

2. 如何關(guān)閉?
在Ubuntu中,輸入命令查看close函數(shù)使用方法:
頭文件是什么?
#include <unistd.h>

函數(shù)原型是什么?
int close(int fd);

參數(shù)填什么?
fd: -> file descriptor  -> 文件描述符

返回值是什么?
成功:0
失。-1

  練習: 寫一個程序   --> LCD設(shè)備名字: /dev/fb0
     1. 首先訪問LCD屏幕
            如果訪問成功,則在終端打印open lcd ok!
        如果訪問失敗,則在終端打印open lcd error!
         2. 然后關(guān)閉LCD屏幕
        如果關(guān)閉成功,則在終端打印close lcd ok!
        如果關(guān)閉失敗,則在終端打印close lcd error!

參考代碼:
------------------------------------------
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()  //->函數(shù)頭
{      
    //->函數(shù)體,寫一些可執(zhí)行的內(nèi)容
    //->使用了printf才需要包含頭文件
    printf("this is first program!\n");

    int lcd_fd;//關(guān)于LCD液晶屏幕的文件描述符
    lcd_fd = open("/dev/fb0",O_RDWR);
    if(lcd_fd >= 0)
    {
        printf("open lcd ok!\n");
    }
    else{
        printf("open lcd error!\n");
    }
   
    int ret;
    ret = close(lcd_fd);
    if(ret == 0)
    {
        printf("close lcd ok!\n");
    }
    else{
        printf("close lcd error!\n");
    }
   
    return 0; //->返回值  成功:0  失敗:非0
}
---------------------------------------

五. 如何寫入數(shù)據(jù)到LCD屏幕中?數(shù)據(jù)是什么?該如何表示顏色?
1. 如何寫入? --> 新函數(shù):write()
在Ubuntu中輸入查詢命令:
gec@ubuntu:/mnt/hgfs/zdnf/02$ man 2 write

頭文件是什么?
#include <unistd.h>

函數(shù)原型是什么?
ssize_t write(int fd, const void *buf, size_t count);

參數(shù)填什么?
fd: -> file descriptor  -> 文件描述符
buf:-> buffer  --> 寫入的數(shù)據(jù)的緩沖區(qū)  --> RGB顏色
count: --> 寫入的總字節(jié)數(shù)

返回值是什么?
成功:已經(jīng)寫入的字節(jié)數(shù)
失。-1

2. 數(shù)據(jù)是什么?
既然任務(wù)是填充RGB顏色到LCD屏幕,數(shù)據(jù)就應(yīng)該RGB顏色。

      write()
    顏色 --------> LCD液晶

3. 該如何表示顏色?
結(jié)論: 每一個像素點  --> 透明度,紅色,綠色,藍色

例子:紅色如何表示?
一個像素點=32位
00000000111111110000000000000000  --> 紅色
0x00FF0000   --> 紅色
0x00FF00FF   --> 紫色
0x00FFFF00   --> 黃色

---------------------填充紅色示例代碼-------------------------------
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()  //->函數(shù)頭
{      
    //->函數(shù)體,寫一些可執(zhí)行的內(nèi)容
    //->使用了printf才需要包含頭文件
    printf("this is first program!\n");

    int lcd_fd;//關(guān)于LCD液晶屏幕的文件描述符
    lcd_fd = open("/dev/fb0",O_RDWR);
    if(lcd_fd >= 0)
    {
        printf("open lcd ok!\n");
    }
    else{
        printf("open lcd error!\n");
    }
   
    int color = 0x00FF0000;

    int i;
    for(i=0;i<800*480;i++)
    {
        write(lcd_fd,&color,4);
    }
   
    int ret;
    ret = close(lcd_fd);
    if(ret == 0)
    {
        printf("close lcd ok!\n");
    }
    else{
        printf("close lcd error!\n");
    }
   
    return 0; //->返回值  成功:0  失。悍0
}
-----------------------------------------------

  練習:填充紫色到LCD屏幕。


一. 項目: 基于網(wǎng)絡(luò)遠程控制多媒體系統(tǒng)
          socket通信
   客戶端   <------------>   服務(wù)器
   UI界面            播放視頻
   觸摸屏           控制視頻狀態(tài)

二. UI界面如何設(shè)計?JPG格式圖形特點?JPG圖片如何顯示LCD液晶屏幕?
1. UI界面如何設(shè)計?
已知GEC6818平臺LCD液晶屏幕分辨率->800*480  -->橫:800個像素點  豎:480個像素點
想在LCD液晶上全屏顯示JPG格式圖片-> UI界面->分辨率:800*480

2. 根據(jù)項目要求設(shè)計UI界面
1)按鈕內(nèi)容
控制視頻狀態(tài):快進、快退、音量+、音量-、暫停/繼續(xù)、靜音/恢復、退出。

2)按鈕大小 -> 由于在客戶端中觸摸屏控制按鈕,所以必須清楚知道按鈕的范圍!
畫圖軟件:
重新調(diào)整大小->像素->把"保持縱橫比"選項去掉
水平:800
垂直:480

3. 為什么選擇使用jpg格式圖片?
由于jpg格式文件經(jīng)過壓縮的,所以文件大小相對其它格式圖片較小,方便開發(fā)時進行數(shù)據(jù)傳輸。
而且顯示jpg圖片編譯移植jpg庫,然后jpg源碼調(diào)用庫里面的接口就可以。

三. JPG圖片如何顯示LCD液晶屏幕?
任務(wù): UI.jpg  --> 顯示在GEC6818平臺
首先拿到兩個文件:
jpeg_show.c  --> 顯示jpg圖片的源碼
jpegsrc.v9a.tar.gz  --> jpg庫

1. 在Ubuntu中,切換到源碼所在的路徑
gec@ubuntu:~$ cd /mnt/hgfs/zdnf/02/

2. 嘗試在Ubuntu Linux系統(tǒng)編譯源碼:
gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show
編譯出錯:
error: jpeglib.h: No such file or directory  -> 找不到j(luò)peglib.h這個頭文件。

jpeglib.h->其實是存在于jpg庫中,所以編譯之前,首先要編譯移植jpg庫。

四. 編譯移植jpg庫?
1. 什么是編譯移植?
其實就是安裝jpg庫的文件到Ubuntu linux系統(tǒng)中。

2. 如何編譯移植?
jpegsrc.v9a.tar.gz  --> jpg庫: 開源免費

1)先把jpg庫放置在共享目錄下
2)在linux中,切換到j(luò)pg庫所在的路徑下
gec@ubuntu:~$ cd /mnt/hgfs/zdnf/02/

3)在linux中解壓jpg庫,一般地解壓到家目錄下  --> 因為在家目錄下,擁有一切權(quán)限。
gec@ubuntu:/mnt/hgfs/zdnf/02$ tar zxvf jpegsrc.v9a.tar.gz -C ~

  tar: 解壓/壓縮的linux命令
  z: 處理以.gz結(jié)尾的壓縮包
  x: 解壓   c:壓縮
  v: 以可見的方式進行解壓,這個參數(shù)不是必須。
  f: 文件
  -C: 指定解壓之后的路徑
  ~: 家目錄

如果有v選項,則會打印解壓的過程
jpeg-9a/
jpeg-9a/wrppm.c
jpeg-9a/wrrle.c
jpeg-9a/maketdsp.vc6
jpeg-9a/jdinput.c

4)回到家目錄下,看看有沒有一個新的目錄叫jpeg-9a/
gec@ubuntu:/mnt/hgfs/zdnf/02$ cd ~
gec@ubuntu:~$ ls   --> 看到j(luò)peg-9a/目錄

5)在家目錄下創(chuàng)建一個新的目錄,作為安裝之后的目錄,并給予權(quán)限
創(chuàng)建目錄linux命令:mkdir  --> make diretcory

gec@ubuntu:~$ mkdir jpgbuf   --> 創(chuàng)建目錄
gec@ubuntu:~$ chmod 777 jpgbuf  --> 修改目錄權(quán)限

為什么要修改目錄權(quán)限?
因為在windows中,創(chuàng)建了一個新的文件夾,我們可以直接把文件丟進去。
但是在linux下,創(chuàng)建一個新的目錄,是默認沒有寫的權(quán)限,我們不能丟文件進去,所以就沒辦法安裝到目錄中

--> 結(jié)論: 創(chuàng)建完目錄后,通過chmod命令給予權(quán)限。

6)切換到解壓之后的目錄下
gec@ubuntu:~$ cd ~/jpeg-9a/
gec@ubuntu:~/jpeg-9a$ ls   --> 看到一個文件,叫configure  -> 配置文件。

7)配置
gec@ubuntu:~/jpeg-9a$ ./configure --host=arm-linux --prefix=/home/gec/jpgbuf

其中:
./configure  --> 執(zhí)行當前目錄下的configure文件
--host=arm-linux  --> 指定是交叉編譯
--prefix=/home/gec/jpgbuf   -->指定安裝路徑

8)編譯
gec@ubuntu:~/jpeg-9a$ make
make  all-am
make[1]: Entering directory `/home/gec/jpeg-9a'
make[1]: Leaving directory `/home/gec/jpeg-9a'  --> 則需要清除鏈接文件

gec@ubuntu:~/jpeg-9a$ make clean  -> 清除鏈接文件
rm -f cjpeg djpeg jpegtran rdjpgcom wrjpgcom
test -z "testout.ppm testout.bmp testout.jpg testoutp.ppm testoutp.jpg testoutt.jpg" || rm -f testout.ppm testout.bmp testout.jpg testoutp.ppm testoutp.jpg testoutt.jpg
test -z "libjpeg.la" || rm -f libjpeg.la
rm -f ./so_locations
rm -rf .libs _libs
rm -f *.o
rm -f *.lo

gec@ubuntu:~/jpeg-9a$ make   --> 重新編譯
  CC       jaricom.lo
  CC       jcapimin.lo
  CC       jcapistd.lo   --> 正在編譯

9)安裝
gec@ubuntu:~/jpeg-9a$ make install

安裝結(jié)果:切換到j(luò)pgbuf路徑看看
gec@ubuntu:~/jpeg-9a$ cd ~/jpgbuf
gec@ubuntu:~/jpgbuf$ ls
bin  include  lib  share   --> 如果看到有4個目錄,則編譯移植jpg庫成功!

五. 分析jpg庫編譯移植之后文件有哪些?
bin:  
cjpeg  djpeg  jpegtran  rdjpgcom  wrjpgcom  --> 二進制文件

include:
jconfig.h  jerror.h  jmorecfg.h  jpeglib.h   --> jpg庫頭文件

lib:
libjpeg.a  libjpeg.la  libjpeg.so  libjpeg.so.9  libjpeg.so.9.1.0  --> 庫文件

share:
man  --> 幫助文檔

六. 已經(jīng)編譯移植完,接下來讓源碼調(diào)用庫里面的內(nèi)容。
1. 切換到源碼的位置
gec@ubuntu:~/jpgbuf/share$ cd /mnt/hgfs/zdnf/02/

2. 重新編譯
gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show
編譯出錯:error: jpeglib.h: No such file or directory

為什么編譯移植之后,還是找不到?
因為用戶編譯移植完jpg庫之后,編譯器是不知道已經(jīng)編譯完成了,所以我們需要告訴編譯器,頭文件在哪里。

如何告訴編譯器,頭文件在哪里? --> 使用編譯器選項: -I 頭文件的路徑

gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show -I /home/gec/jpgbuf/include
編譯出錯:
/tmp/cc2O0oBN.o: In function `main':
jpeg_show.c:(.text+0x440): undefined reference to `jpeg_std_error'
jpeg_show.c:(.text+0x45c): undefined reference to `jpeg_CreateDecompress'
jpeg_show.c:(.text+0x474): undefined reference to `jpeg_mem_src'

原因:找不到對應(yīng)的函數(shù)的定義,函數(shù)的定義其實在庫文件中,找不到函數(shù)的定義,其實就是找不到庫文件,庫文件就是lib中。

如何告訴編譯器,庫文件在哪里? --> 使用編譯器選項: -L 庫文件的路徑 -l庫的名字

gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show -I /home/gec/jpgbuf/include -L /home/gec/jpgbuf/lib
編譯出錯:
/tmp/cc2O0oBN.o: In function `main':
jpeg_show.c:(.text+0x440): undefined reference to `jpeg_std_error'
jpeg_show.c:(.text+0x45c): undefined reference to `jpeg_CreateDecompress'
jpeg_show.c:(.text+0x474): undefined reference to `jpeg_mem_src'

-l庫的名字  --> -l后面是沒有空格的
libjpeg.so.9.1.0  --> 庫的名字是lib與.so中間的名字
--> -ljpeg

gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show -I /home/gec/jpgbuf/include -L /home/gec/jpgbuf/lib -ljpeg
編譯通過,生成一個新的文件:jpeg_show
  
七. 燒寫程序到開發(fā)板中
1. 燒寫可執(zhí)行程序,輸入燒寫命令
[root@GEC6818 /]#cd /
[root@GEC6818 /]#rx jpeg_show
C

2. 傳輸->發(fā)送Xmodom->選擇jpeg_show文件->發(fā)送
3. 修改權(quán)限
[root@GEC6818 /]#chmod 777 jpeg_show

4. 執(zhí)行
[root@GEC6818 /]#./jpeg_show
./jpeg_show: error while loading shared libraries: libjpeg.so.9: cannot open shared object file: No such file or directory

解決方案:將缺少的庫libjpeg.so.9下載到開發(fā)板的/lib中

5. 下載libjpeg.so.9到開發(fā)板中
[root@GEC6818 /]#cd /lib
[root@GEC6818 /lib]#rx libjpeg.so.9
C

傳輸->發(fā)送Xmodom->選擇libjpeg.so.9文件->發(fā)送

6. 回到根目錄,再下載圖片到開發(fā)板中
[root@GEC6818 /]#cd /
[root@GEC6818 /]#rx UI.jpg
C

傳輸->發(fā)送Xmodom->選擇UI.jpg文件->發(fā)送

7. 最后一步
[root@GEC6818 /]#./jpeg_show UI.jpg

全部資料51hei下載地址:
02.zip (1.38 MB, 下載次數(shù): 38)
回復

使用道具 舉報

ID:245437 發(fā)表于 2019-6-5 14:42 | 顯示全部樓層
很全,真的很謝謝,但是請問我用了新的烏班圖,出現(xiàn)沒有arm-linux-gcc指令和make沒有相應(yīng)指令怎么搞呢,剛學習linux感覺很復雜,不是缺這個文件就是那個文件,而且網(wǎng)上搜的教程也沒有你說的這么詳細,因為你會解釋語句的作用,那些教程沒有往往因為不明白意思而出現(xiàn)出現(xiàn)一些教程上沒有出現(xiàn)的問題
回復

使用道具 舉報

ID:564887 發(fā)表于 2019-6-21 15:08 | 顯示全部樓層
尋魚尋漁 發(fā)表于 2019-6-5 14:42
很全,真的很謝謝,但是請問我用了新的烏班圖,出現(xiàn)沒有arm-linux-gcc指令和make沒有相應(yīng)指令怎么搞呢,剛 ...

下載啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表