龍芯+RT-Thread+LVGL實(shí)戰(zhàn)筆記(1)——從移植開始

????????過去的大半年時(shí)間,一直帶著學(xué)生備戰(zhàn)全國(guó)職業(yè)院校技能大賽“嵌入式系統(tǒng)應(yīng)用開發(fā)”賽項(xiàng)。由于是首次參加該賽項(xiàng),很多東西都是從0到1的摸索和積累,最后的成績(jī)自然也不甚理想。作為指導(dǎo)教師,備賽期間除了給予學(xué)生必要的指導(dǎo),自己也花了不少精力研究了大賽指定的龍芯1B200嵌入式開發(fā)板,并嘗試使用RT-Thread操作系統(tǒng)和LVGL圖形組件,實(shí)現(xiàn)了樣題的幾十項(xiàng)任務(wù),大大小小的版本也寫了30多個(gè),也算磕出點(diǎn)名堂了,見圖1~圖3。



????????本著分享和開源精神,也為了給以后的參賽學(xué)生循序漸進(jìn)的指導(dǎo),于是就有了這個(gè)實(shí)戰(zhàn)筆記系列。希望自己摸索的過程能給更多的嵌入式學(xué)習(xí)者一些指引,也為國(guó)產(chǎn)嵌入式處理器和國(guó)產(chǎn)嵌入式操作系統(tǒng)的推廣助一點(diǎn)力。
????????由于個(gè)人能力和精力的限制,再加上龍芯嵌入式的開發(fā)資料十分有限,很多問題沒法像STM32那樣深入到庫文件和寄存器的程度,還希望有見解的網(wǎng)友在這些問題上能給與點(diǎn)評(píng)和分享。最后,我想說的是,這個(gè)實(shí)戰(zhàn)筆記不是面向0基礎(chǔ)的朋友,起碼得有龍芯嵌入式裸機(jī)的開發(fā)經(jīng)驗(yàn),了解RT-Thread操作系統(tǒng)的線程、定時(shí)器、信號(hào)量、郵箱等相關(guān)知識(shí),知道LVGL圖形用戶界面開發(fā)的基本套路。
????????好了,開場(chǎng)白說完了,本文是實(shí)戰(zhàn)筆記的第一篇,我們把最基本的文件和代碼添加到工程項(xiàng)目中,形成一個(gè)最原始的工程項(xiàng)目。

一、關(guān)于IDE和工具鏈的版本
????????如圖4和圖5所示,本人使用的IDE版本是目前官網(wǎng)(http://www.loongide.com)最新的1.2 beta3,工具鏈用的是GCC 4.9.2 for MIPS ELF,并選擇了-O1級(jí)別的編譯優(yōu)化(這樣運(yùn)行的UI效果明顯比不優(yōu)化的要流暢的多)。至于低版本的IDE或其他工具鏈,學(xué)生在調(diào)試的時(shí)候多少會(huì)有點(diǎn)莫名其妙的問題,所以建議網(wǎng)友們盡量使用與筆者一致的版本,避免除代碼之外的軟件問題。


二、創(chuàng)建最初的項(xiàng)目
????????這一步?jīng)]啥技術(shù)含量,按照新建項(xiàng)目的向?qū)?,一步步選擇最匹配和最需要的即可,這里把向?qū)У拿恳徊竭M(jìn)行了截圖(圖6~圖9),大家跟著選就行了。




三、觸摸屏驅(qū)動(dòng)的移植和配置
????????由于后續(xù)所有任務(wù)的交互都是依賴觸摸屏來完成,因此移植觸摸屏的驅(qū)動(dòng)就成了當(dāng)務(wù)之急。而且,移植不是簡(jiǎn)單的把驅(qū)動(dòng)文件加進(jìn)工程,還要與LVGL輸入和輸出設(shè)備的相關(guān)代碼結(jié)合起來。下面就是我個(gè)人摸索的移植過程,供各位借鑒和參考。
3.1 準(zhǔn)備橫版屏幕的觸摸輸入驅(qū)動(dòng)文件
????????其實(shí),上面剛創(chuàng)建好的工程已經(jīng)包含了屏幕的顯示輸出驅(qū)動(dòng)文件?ls1x_fb.c?和?ls1x_fb.h(所在目錄如圖10所示),以及觸摸輸入驅(qū)動(dòng)文件?gt1151.c?和?gt1151.h(所在目錄如圖11所示)。但這里有個(gè)很糾結(jié)的問題就是,前者的顯示輸出驅(qū)動(dòng)文件是針對(duì)橫版屏幕(800×480)編寫的,而后者的觸摸輸入驅(qū)動(dòng)文件是針對(duì)豎版屏幕(480×800)編寫的。因此,必須想辦法讓兩者對(duì)屏幕采取一致的驅(qū)動(dòng)方式。


????????好在龍芯官方已經(jīng)寫好了針對(duì)橫版的觸摸輸入驅(qū)動(dòng)文件?gt1151q.c?和?gt1151q.h,放在了開發(fā)板的配套例程?10_LCD_touch?中(如圖12所示),那接下來我們就用這兩個(gè)文件去替換工程里原有的?gt1151.c?和?gt1151.h。

3.2 替換豎版的觸摸輸入驅(qū)動(dòng)文件
????????這一步也很簡(jiǎn)單,把工程里原有的觸摸輸入驅(qū)動(dòng)文件刪除,拷入新的文件,并將其添加進(jìn)當(dāng)前工程即可,如圖13~圖15所示。



3.3 補(bǔ)充頭文件路徑
????????這一點(diǎn)跟?Keil?一個(gè)套路,必須把所有頭文件所在的路徑都添加進(jìn)來,按照當(dāng)前的工程目錄,圖16所示的幾個(gè)路徑是需要手動(dòng)添加的,如果你自己還規(guī)劃了其他目錄放頭文件,也請(qǐng)一并加進(jìn)來。

3.4 修改LVGL的輸入設(shè)備驅(qū)動(dòng)文件
????????我們心里要清楚,所有的GUI效果都是通過LVGL的圖形化組件來實(shí)現(xiàn)的,無論是顯示輸出還是觸摸輸入,就必須讓LVGL知道該調(diào)用哪個(gè)對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)。在這里,顯示輸出應(yīng)該調(diào)用?ls1x_fb.c?驅(qū)動(dòng)文件,打開LVGL顯示輸出的驅(qū)動(dòng)文件
./lvgl-7.0.1/porting/lv_port_disp.c(如圖17所示),可以看到該文件引用的正是所需的硬件驅(qū)動(dòng)文件,因此?lv_port_disp.c?文件不必修改。

????????再來看LVGL輸入的驅(qū)動(dòng)文件
./lvgl-7.0.1/porting/lv_port_indev.c(如圖18所示),很明顯并沒有調(diào)用所需的?gt1151q.c?觸摸輸入驅(qū)動(dòng),因此要對(duì)?lv_port_indev.c?文件進(jìn)行必要的修改才行。一共有6處需要修改,如圖19~圖24所示。為了清晰展示修改前后的代碼差異,這里使用了?Notepad++ 編輯器中的?Compare 插件來對(duì)比。







四、修改龍芯開發(fā)板的板級(jí)支持(BSP)文件
????????配置龍芯開發(fā)板BSP的文件有兩個(gè):一個(gè)是?./include/bsp.h?文件,如圖25所示,這個(gè)文件里的很多宏需要根據(jù)實(shí)際情況進(jìn)行配置,后續(xù)時(shí)常要與之打交道;另一個(gè)是
./ls1x-drv/ls1x_drv_init.c?文件,如圖26所示,這個(gè)文件修改的地方不多。


4.1 修改 bsp.h 文件
????????當(dāng)前對(duì)該文件的修改一共有兩處,如圖27和圖28所示,跟之前一樣,還是把修改前后的差異對(duì)比著看。這兩處修改針對(duì)的是觸摸屏驅(qū)動(dòng)芯片GT1151,以及所占用的I2C0總線。


4.2 修改 ls1x_drv_init.c 文件
????????這個(gè)文件目前只有2處需要修改,如圖29和圖30所示,換成橫屏對(duì)應(yīng)的驅(qū)動(dòng)文件和初始化函數(shù)即可。


五、修改LVGL的全局配置
????????./lvgl-7.0.1/lv_conf.h?是LVGL的全局配置文件,如圖31所示。這里,我們針對(duì)屏幕分辨率、字體大小、中文支持等進(jìn)行了修改,如圖32~圖36所示。






六、編譯和測(cè)試
????????本文的主要目的是搞定與移植有關(guān)的配置,并不打算編寫實(shí)質(zhì)性的代碼。通過上面的步驟,移植工作幾乎全部完成,接下來就可以直接編譯整個(gè)工程來進(jìn)行檢驗(yàn)了。這里就不貼main.c的源碼了,除了修改一下顯示模式,如圖37所示,其他源碼都保留不變。由于工程文件較多,第一次編譯耗費(fèi)的時(shí)間會(huì)比較長(zhǎng)。

????????編譯沒錯(cuò)的話就可以運(yùn)行或下載本程序了,效果上就是一個(gè)線程在運(yùn)行,每0.5s通過串口打印一下運(yùn)行時(shí)間,如圖38所示。至于GUI效果,默認(rèn)的源碼里并沒有添加,所以屏幕上什么也沒有,我們?cè)谙乱话鎭硖砑印?/p>
????????至此,移植的工作就算告一段落了,雖然工作量不大,但網(wǎng)上并沒有針對(duì)龍芯的移植教程,幾乎都是針對(duì)STM32的,移植的大多也是LVGL8,所以上面的移植經(jīng)驗(yàn)也是反復(fù)折騰總結(jié)出來的。大家在移植的時(shí)候有什么問題,歡迎在評(píng)論區(qū)留言。后續(xù)我們就可以在此基礎(chǔ)上添加一個(gè)個(gè)我們想要的效果了。
(本文完)