最近淘到一塊東山派7號開發板,基於STM32MP157DAC,因為便宜,買過來玩。
但是韋東山的資料真的有一說一,板子出的挺多,除了賣的最好的板子,其他的資料非常非常少。。(韋老師您看到了別生氣,至少因為資料少引發問題我解決了也算收穫經驗了。。。)
我說的是實話,因為正點原子作為國內銷量最高的學習板研發製造零售一體的公司,你即使去某魚淘一塊幾年前的老版本開發板,你依然能在他的官網找到對應的教程資料。像東山剛出一年的Dongshanpi PicoW,自帶的sigmastar家的sdk很多bug,sdk構建rootfs、burning的過程都很模糊,官網的奶牛快傳也失效好久了。。。雖然定位是最少利潤的,面向高階玩家的板子,但是跟荒漠尋泉一樣的開發體驗真的很讓人勸退你們家的產品。
但是最後還是要說一句,本人在解決問題的過程學到了很多 學習過程一切順利的開發板 上學不到的東西。喜歡不喜歡這種感受因人而異。能接受,東山的板子又便宜效能又好(100塊錢的mp157,白菜價),如果不能接受買正點的板子去。
正片開始
我按照https://github.com/DongshanPI/buildroot-external-dongshanpiseven的方法編譯fs、uboot、kernel,成功boot起來
問題1:uboot螢幕不亮
出現的第一個問題,買了一塊韋東山板子通用的LCD,裝上之後在核心階段成功light up,但是在uboot階段無法點亮,包括背光。
解決過程
核心和uboot都是有對應driver的,既然buildroot主線已經適配了st官方的mp157 evaluation board,很複雜的暫存器定義和boot初始化就不需要我們動了,uboot階段,無顯示那問題肯定是uboot的裝置樹適配問題。
核心的裝置樹適配在東山的倉庫裡面已經做好了,所以核心階段的lcd是正常工作的,那麼接下來我們就修改uboot的dts
很輕鬆,我們就找到了我們想要的東西,stm32mp157c-100ask-512d-v1.dts
,就修改它
不懂怎麼修改和移植?很簡單,上面說到正點原子的資料很全,他們家也有mp157的板子,直接看他們的資料!
下載後開啟【正點原子】STM32MP157開發板(A盤)-基礎資料\09、文件教程(非常重要)\【正點原子】STM32MP1嵌入式Linux驅動開發指南V2.1.pdf
430頁,可以看到如下內容
按照文章寫的來操作,其中有幾個地方不同
正點原子的背光引腳和韋東山的不一樣,一個是PD13,一個是PE11
韋東山:
所以要改成以下:
還有這幾個中斷和gpio,我當初根本不懂具體連線的是啥,但是很重要,我最開始就是沒加,背光亮了但是皮膚死活點不亮,把uboot的debug開啟後重新編譯,啟動會輸出兩分鐘的log才boot。。。
但是我也發現了與gpio未找到相關的錯誤:
simple_panel_ofdata_to_platdata : Warning: cannot get enable GPIO: ret=-5
直接在uboot原始碼裡搜尋這個函式,找到
就懷疑裝置樹pinctrl沒設定導致的,加上就好了。應該是ltdc外設與rgb lcd控制的很重要的引腳
具體的內容是核心的裝置樹複製來的
在正點原子手冊可以看到,這兩個pinctrl設定的是裝置具體的PINMUX,但是正點原子是ltdc_pins_xb,韋東山是ltdc_pins_xa
為什麼是simple-panel?因為uboot裡有這個通用的lcd驅動,位置在drivers/video/simple_panel.c
可以看到compatible字串的數值就是simple-panel,驅動會按照這個去裝置樹內尋找適配的裝置,所以裝置樹裡的名字一定不能錯
再按照正點原子的文件加上時序資訊即可
此時直接編譯會提示找不到ltdc_ep0_out,就從linux原始碼的arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v1.dts
摘抄一段ltdc的節點寫到裝置樹的dts內
再在menuconfig裡配置相關開啟lcd支援的選項,加上自定義logo的bmp,具體的上網搜搜吧我就不贅述了
編譯燒錄直接點亮
問題2:核心啟動階段,console不顯示啟動資訊
我一直覺得啟動過程中顯示一大堆文字很帥(),所以使用每款板子都會把console的log開啟
相關的教程在正點原子的手冊裡可以看到
我設定了,沒用!!!!
要是有用我就不會在這寫東西了。。。
解決過程
我又折騰了兩天,才找到原來正點原子裡手冊寫的
Uboot會在核心啟動的時候把bootargs傳遞給核心
是不一定的!!比如我這種情況
請看下面:我確實設定了console=tty1,但是就是不在lcd上顯示
我很確信我的lcd是正常的,因為執行echo hello linux! > /dev/tty1
可以在lcd上輸出字串,編譯核心的時候開啟了BootUp Logo,還能看到linux的小企鵝logo
那為什麼不會顯示?是核心配置的問題嗎?我替換了正點原子出廠映象的核心到我的板子上,因為設定不同導致啟動到後面會panic,但是依然沒顯示console log。
那肯定就是uboot的問題,我在imx6ull上改動bootargs,核心立馬做出對應反應,在tty1開啟與關閉log
那應該就是uboot沒把我寫的bootargs傳遞給核心
我在東山板子上使用命令dmesg | grep console
,找到了一句
就可以看到在Kernel剛上電的時候顯示了一句[ 0.000000] Kernel command line:
(現在我改好了,當初這一句是沒有console=tty1的)
這就是bootargs傳遞給核心的引數,但是我明明設定的不是這個!!!我的tty1呢,我也沒有寫過什麼root=/dev/mmcblk1p4 rootwait rw c
肯定有東西在背後搗鬼
在buildroot原始碼和韋東山的buildroot配置兩個倉庫的位置使用萬能的grep:
stm32mp157c-100ask-512d-v1_extlinux.conf
這是什麼檔案???是韋東山團隊適配七號開發板時候編寫的!原來是這個檔案裡面的東西覆蓋了我的bootargs
可以看到在uboot上電的時候,解析了這個檔案,把字串傳遞給了核心,怪不得不受我控制
在裡面加入我想要的console=tty1
,重新編譯buildroot,啟動畫面就成功輸出列印資訊了