荔枝派Licheepi nano裸機移植ZLG_GUI和3D旋轉立方體
一:前言
以前申請到了荔枝派zero,在發了兩個開箱貼後就放在一邊吃灰了。後來又購買了荔枝派nano,刷了幾個教程中的系統之後又放到一邊吃灰了。雖然有屯板子的習慣,卻沒有使用板子的能力。
後來,經過斷斷續續的摸索和群裡面的新手教程,終於搭建好了Licheepi Nano的交叉編譯環境,自己GCC了一個hellowworld傳輸到了開發板並運行了起來。可是......對,於是又繼續吃灰。
再後來,在大神 @暈哥 的 填坑網 (https://debugdump.com/index.html
為了總結使用過程和方便比我還小點的小白們,特寫了此篇文章,從編譯環境的搭建到程式的修改和下載執行等的全教程。
然後,還是要感謝填坑網,感謝達克羅德大神,也感謝荔枝派的創造者@澤畔無材 和其他創造者和貢獻者,他們的工作和貢獻讓世界變得更加美好(好大的概括)。本教程中的程式碼除個人創造部分,全部來源於網路,移植於網路,最終,也將免費貢獻於網路(如果有侵權行為,請告訴我,我會盡快刪除)。但是,辛苦不能白費。所以,如果你有幸看到了本文,並且使用了本文內容或轉載了本文,請註明出處和保留作者,然後你就可以大方的使用了。謝謝。
好了,正文開始。
二:簡介
Licheepi Nano 是荔枝派推出的一款超高性價比的跨界開發板,支援linux、RTT、裸機等開發環境。
淘寶網:Licheepi Nano
荔枝派社群:http://bbs.lichee.pro/
其他資料在 荔枝派社群 中基本都能找到地址。
當然,你也可以在填坑網看大神的填坑歷程:https://debugdump.com/t_1623.html
注意:當ubuntu中開啟win傳過去的檔案中存在亂碼時,請在win環境下用記事本開啟 .c 或.h檔案,點選檔案->另存為,將下方的 編碼 選擇為UTF-8 的格式,點選儲存並選擇是進行覆蓋儲存,再傳入ubuntu就不會亂碼了。
三:開始
最基本的要求是:一個帶LCD屏的荔枝派,一根USB資料線,一臺電腦。選配:TTL串列埠轉接線。
本文使用VMware+ubuntu16.04的環境。
另外,本帖已經與百度達成深度合作,任何本文未提到但你又不懂的都可以去請教他,絕對知無不言。
1:下載程式碼和編譯器
在F1C100S裸奔framebuffer+PWM+GPIO驅動 帖中下載 minimal_f1c100s_framebuffer.zip 和後來更新的一個.c檔案。當然,這個帖子中還有其他方面的改動,可以詳細看看。
然後,同樣是此帖子,下載大神提供的編譯器:http://pan.baidu.com/s/1dDtssIt ,或是後面有坑友提供的連線:
https://releases.linaro.org/components/toolchain/binaries/5.3-2016.05/arm-eabi/
選擇與電腦相匹配的下載。我的是64位的,就下載了後面那個連結的。
至於周立功的GUIZLG_GUI和3D顯示相關的程式碼,可以在我的另一篇部落格園的文章中找到並下載下來,我很早以前就移植併發在網上了(懷念當年在學校中啃3D顯示程式碼的時光......),或是下載最後的完整程式碼。
將兩個壓縮包和編譯器通過 VMware的 共享資料夾 都放入到ubuntu環境下,或是直接在ubuntu環境中下載。
2:環境搭建
在荔枝派的開源交流群(826307240)中有一篇《基於荔枝派Nano的Linux新手學習筆記》,將它開啟,一步一步的操作。當然,如果只是想實現本帖內容的話,只需要按上面實現:虛擬機器的搭建、sunxi-tool的安裝 這兩個教程就可以了。而且它裡面的交叉編譯鏈在編譯自己的.c檔案時不管用,生成的檔案下載到開發板不能執行,需要重新安裝:
sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
然後使用arm-linux-gnueabi-gcc xx.c -o xx 進行編譯,將剛編譯完的檔案複製到共享資料夾,串列埠軟體(如SecureCRT或新手文件中提到的軟體)連線後輸入 lrz 命令進行檔案傳輸。在開發板的串列埠中輸入chmod 777 xx(剛傳進來的可執行檔案) 來進行賦許可權,然後就可 ./xx 執行了。當然,這個需要TF卡刷群檔案中 Nano_pub_V2/image 資料夾下的 .dd映象。至於TF的燒寫方法在荔枝派社群有。好了,這些都是題外話。以後再寫一個linux的教程,會詳細提到這些。
sunxi-tool 工具的安裝 摘錄如下:
1)用git clone -b f1c100s-spiflash https://github.com/Icenowy/sunxi-tools.git命令下載,用cd sunxi-tools命令切換到sunxi-tools檔案目錄
2)用sudo apt-get install libusb-1.0-0-dev命令安裝libusb,用sudo su命令切換root 使用者,用apt-get install zlib1g-dev命令安裝zlib1g
3)用make && sudo make install命令適配 Nano 的下載工具,通過命令 sudo sunxi-fel ver 來確認有無成功進入fel模式
4)報ERROR: Allwinner USB FEL device not found!,重新燒錄或重進fel模式,先拉低SPI flash的CS引腳1,再將MicoUSB與電腦連線,在Windows下執行 zadig-2.3.exe,點選 Options -> List All Devices,選擇 WinUSB (v6.1.7600.16385),點選 【Install WCID Driver】安裝驅動(教程https://debugdump.com/t_993.html)
5)右擊我的電腦選擇管理->服務和應用程式->服務,在彈出的對話方塊找到VMware USB Arbitration Service 右擊選擇啟動設定為自動啟動,在虛擬機器中的可移動裝置中選擇連線該板(教程https://blog.csdn.net/u013064187/article/details/41894021)
6)用sudo sunxi-fel ver命令測試成功進入fel模式,斷開SPI flash的CS引腳1與GND的連線,用cd u-boot命令切換到u-boot檔案目錄,用sudo su命令切換root 使用者,用sunxi-fel -p spiflash-write 0 ./u-boot-sunxi-with-spl.bin命令下載程式
7)斷電連線LCD和串列埠E0、E1,上電檢視LCD顯示,開啟Xshell 5軟體選擇連線->SERIAL,設定波特率115200,連線後傳送bdinfo,檢視接收資訊
”
3:編譯測試
將三個資料夾分別解壓到合適的目錄下。我的放在Download資料夾下。然後將fb-fc100s.c複製替換到minimal_f1c100s_framebuffer\minimal_f1c100s\driver 資料夾下。至於為什麼,你仔細看一遍帖子就知道了。
將解壓的編譯器 gcc-linaro-5.3.1-2016.05-x86_64_arm-eabi 放到/opt資料夾下(不放也可以,但後邊的路徑自己要改一下)。然後你有兩種選擇,一是參考《基於荔枝派Nano的Linux新手學習筆記》中安裝交叉編譯鏈 的步驟,將其中的編譯鏈替換成自己剛剛解壓的這個,其他照做。或是使用臨時的方法,每次使用前都要執行一次的(我用的就是這個方法):
終端中輸入 sudo su ,然後輸入密碼進入root模式,然後輸入 export PATH=$PATH:/opt/gcc-linaro-5.3.1-2016.05-x86_64_arm-eabi/bin (注意替換為自己下載的編譯鏈的名字和放置的實際地址),既將編譯鏈臨時加入到路徑中。關閉終端後再開啟需要重新輸入。
終端中cd 到minimal_f1c100s_framebuffer\minimal_f1c100s 資料夾下,然後輸入 make ,回車開始編譯。當提示什麼錯誤時,你需要再看看交叉編譯環境的搭建部分。
無誤後,會提示 bootloader size =1800等, 並且當前資料夾目錄下多出一個build資料夾。cd build 到build資料夾下,按照新手學習筆記中的方式進行程式下載:
先將flash的1腳拉低,然後插入usb供電,進入fel下載模式,以後每次下載程式都要這樣。此時VMware的 虛擬機器->可移動裝置 中會多出 onda WINusb Generic Device 的選項,點選連線。然後斷開flash的拉低。
輸入 sunxi-fel -p spiflash-write 0 ./firmware.bin 進行下載。成功後斷電重新供電,可以看到螢幕亮了。說明測試成功。
4:移植ZLG_GUI
ZLG_GUI是周立功公司提供的一套適用於微控制器液晶屏的點陣式GUI,功能豐富,硬體要求低,移植及其簡單。
將ZLG_GUI資料夾複製到minimal_f1c100s 資料夾下。
首先,要進行規範性修改。將下面所有的.h檔案和.c檔案的.H .C統一改寫成小寫的。另外,在.c檔案中將包含的 #include<xxx.h>中統一改寫成和檔名大小寫一致的內容,否則編譯報錯。
對於這個GUI,只要實現 lcmdrv.c中的幾個基本的初始化、畫點、清屏三個函式就夠了。可以直接在此處修改,也可以新建一個Mycommon.c好Mycommon.h來實現。程式碼如下:
1 #include <stdint.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <malloc.h> 5 #include <dma.h> 6 #include <framebuffer.h> 7 8 #include <types.h> 9 #include <common.h> 10 11 12 framebuffer_t fb_f1c100s; 13 render_t* render; 14 15 /*初始化螢幕*/ 16 void Screen_Init(void){ 17 fb_f1c100s_init(&fb_f1c100s); 18 render = fb_f1c100s_create(&fb_f1c100s); 19 } 20 /*畫點函式*/ 21 void Set_Point(int x,int y,uint32_t color){ 22 ((uint32_t*)render->pixels)[x+y*800] = color; 23 } 24 void Fill_Screen(uint32_t color){ //螢幕填充函式 25 for (int i = 0; i < render->pixlen/4;i++) 26 { 27 ((uint32_t*)render->pixels)[i] =color; 28 } 29 } 30 /*點色獲取*/ 31 uint32_t Get_Point(int x ,int y){ 32 return ((uint32_t*)render->pixels)[x+y*800]; 33 } 34 /*將緩衝buf刷到螢幕上顯示*/ 35 void Show_Screen(void){ 36 fb_f1c100s_present(&fb_f1c100s, render); 37 } 38 void Screen_Setbl(void){//背光 39 fb_f1c100s_setbl(&fb_f1c100s, 100); 40 }
都是原來main.c中的函式。
在lcmdrv.c中包含進Mycommon.h,並將上面的程式碼分別移植到lcmdrv.c下對應的函式下。
main.c中加入 #include <config.h>,這個是呼叫ZLG_GUI唯一需要包含的標頭檔案。
main函式中註釋掉不必要的函式,在while 前加入新移植的初始化函式,加入螢幕填充函式,劃線函式,顯示函式:
GUI_Initialize();
GUI_FillSCR(0x00FFFFFFU);
GUI_Line(0,0,800,480,0xF000FF00);
GUI_Exec();
Screen_Setbl();
r然後編輯Makefile檔案:在SRC_C部分加入
SRC_C +=\
ZLG_GUI/ConvertColor.c \
ZLG_GUI/font5_7.c \
ZLG_GUI/FONT8_8.c \
ZLG_GUI/FONT24_32.c \
ZLG_GUI/GUI_BASIC.c \
ZLG_GUI/GUI_StockC.c \
ZLG_GUI/lcmdrv.c \
ZLG_GUI/loadbit.c \
ZLG_GUI/menu.c \
#ZLG_GUI/spline.c \ #此處有 math.h 中函式找不到的報錯,先註釋掉,後面進行解決
ZLG_GUI/windows.c \
INCDIRS下面加入: INCDIRS += -I3Ddisplay -Ilib
儲存。然後終端輸入 cd .. 回到minimal_f1c100s資料夾,make 開始編譯。若還有錯誤,請按照提示進行解決。無誤後,cd build ,並再次拉低flash進行下載。重新上電後可以看到一條斜線,說明移植ZLG_GUI 成功。
5:移植3D立方體程式
我以前花時間整理好了,移植起來也很快,實現了畫點函式基本上就能直接用了。所以包含進 config.h就可以了。同時要修改Makefile,將.c檔案和.和資料夾都寫進去。但是編譯後會發現,cos等函式找不到。所以在 Makefile 檔案中的 -lgcc 後面加上 -lm來連結靜態庫。可是此時又蹦出來很多的錯誤。一番搜尋下,意思是裸機沒有除法造成的(當然,本來來的函式中就有個除法,既然能用,說明是別的問題)。自從與百度達成深度合作後,事情方便了很多,於是一番搜尋加實驗。反正各種處理後的結果是,沒處理好。好吧,此路不通。只好換個方法。
自己建一個Mymath.c,從網上找到純c編寫的三角函式等的實現方法,複製,去掉空白字元(可能會有此類的報錯,只要一個一個刪除掉上面的空白處就好了),將需要math庫的地方加進標頭檔案。編譯。成功!以後再慢慢的修改實現標準math庫的移植。
好了,main函式中加入3D顯示程式,立方體就旋轉起來了。
四:最後
大神的裸機開發包還包含了其他操作,而且貌似大神都移植好了NES,不過沒放出原始碼,以後我得自己移植。可悲的是,人家都能寫出來,咱都不會用......此處只做拋轉,希望板子不要再吃灰了。
我想畫一個一荔枝派Nano為基礎的掌機,或是一個拓展中心,左右能插掌機鍵盤,下面能插全鍵盤或數字鍵盤,就是一個拓展中心的那種。然後開發能夠以linux、RTT、裸機等開發,或是本身為帶python的linux或是拓展螢幕的Micropython,能夠插上全鍵盤後直接離線寫程式的(類似C.H.I.P)。外殼都是3D列印。這麼一想,人生苦短,要學的東西還真多啊!
好了,全部程式碼如下:https://files.cnblogs.com/files/zhinianzhizhan/minimal_f1c100s_framebuffer.rar
本文水平有限,內容很多詞語由於知識水平問題不嚴謹或很離譜,但主要作為記錄作用,能理解就好了,希望以後的自己和路過的大神對必要的錯誤提出批評與指點,對可笑的錯誤不要嘲笑,指出來我會改正的。 -------------隨夢,隨心,隨願,執念執戰,執戰蒼天!