rt-thread的rt-smart已經發布有段時間了,其實我之前也寫過幾篇關于rt-smart的文章,但是都是關于CMake構建工程的文章。
而對我來說一直想在用戶態操作一下底層硬件的東西。而在前段時間,韋東山老師在他100ask_imx6ull移植了rt-smart,剛好之前拿到一塊imx6ull的板子,所以我也跟這位大佬一起學習了一下rt-smart。
移植的過程我就不再這里說了,大家可以去看一下韋老師的視頻,講的非常好。
這篇文章主要講一下我的點燈大法。
環境
100ask_imx6ull開發板。
兩條micro USB線。
電源。
windows電腦一臺。
適配底層驅動
IMX6ULL的gpio有五組,每組最多有32個,但是實際每組沒有那么多
GPIO1 有 32 個引腳:GPIO1_IO0~GPIO1_IO31;
GPIO2 有 22 個引腳:GPIO2_IO0~GPIO2_IO21;
GPIO3 有 29 個引腳:GPIO3_IO0~GPIO3_IO28;
GPIO4 有 29 個引腳:GPIO4_IO0~GPIO4_IO28;
GPIO5 有 12 個引腳:GPIO5_IO0~GPIO5_IO11;
首先需要看芯片手冊,查找寄存器,在imx6ull的寄存器是比較亂的,每一組GPIO的寄存器都是不是連續的,所以寫的時候,需要對著手冊來寫。可以參考《i.MX 6ULL Applications ProcessorReference Manual》文檔。
根據手冊,我已經把GPIO對接到rt-thread的pin驅動框架了。其實我一開始自己寫好底層寄存器部分的代碼,然后去對接到pin驅動。后面在gitee上看發現了NXP的一套庫,后面我又重新對接了一次,這樣我就不用自己造輪子了。下面自己造的輪子:
這里我把GPIO分為兩組,第一組:GPIO1 ~ GPIO4,第二組:GPIO5。他們的每組基地址分別為:
根據每組的基地址,給每一組做了一個地址偏移的表格這樣就可以通過下面的宏定義等到對應的引腳:
#define GET_PIN(PORTx, PIN) (32 * (PORTx - 1) + (PIN & 31))
在rt-smart中,我不能直接使用物理地址,需要使用虛擬地址。rt-smart提供了相對應的API(rt_hw_kernel_phys_to_virt)供我們將物理地址轉為虛擬地址。我們以pin_write為例:
rt-thread中,imux6ull的gpio寫操作:
rt-smart中,imux6ull的gpio寫操作,需要增加phy addr 到vitr addr的轉換:
對接好pin驅動的ops->rt_pin_ops:
注冊pin設備:
編譯燒錄:
應用開發
在rt-thread中,我們經常使用一組API,rt_pin_mode, rt_pin_write。但是在rt-smart中這套東西是使用不了的。而需要使用設備驅動框架那一套東西,open,write,read.
imx6ull的led燈的GPIO對應第5組第3個引腳。然后定義兩個結構體:pin_mode,pin_status.
寫一個流水燈的代碼。
原文標題:rt-smart的第一個應用程序,imx6ull用戶態點燈
文章出處:【微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
操作系統
+關注
關注
37文章
6747瀏覽量
123204 -
RTThread
+關注
關注
8文章
132瀏覽量
40812
原文標題:rt-smart的第一個應用程序,imx6ull用戶態點燈
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論