一周前入手了一塊樹莓派,算上配件總共307,按照論壇的方法燒好sd卡,啟動,那麼接下來就要開始折騰了。
鑑於本人是乙個新手驅動的事實,於是著手開始在pi上寫驅動。
那麼按照驅動的基礎知識,編寫linux驅動,必然是先要有相同版本的的核心原始碼。
uname -a看了一下,3.18.5的核心,在github上找了一會,末版本號相同的可以說根本找不到,那麼乾脆重新編譯乙個核心好了,反正也是學習的過程。
於是開始找linux-rpi-3.18.y.tar.gz的核心原始碼,當然了,這個原始碼我再github上只找到linux-rpi-3.18.y.zip格式的,想來沒什麼區別,網上搜尋也說都可以,於是就用unzip命令解壓了一下,然後搞配置檔案,弄環境,交叉編譯器,編譯神馬的網上教程都很全,我就不再多說,但是最後編譯的時候,會發現少檔案,比如fs下面的有個叫local.h的檔案,好像是這個,這個檔案找不到。
問題就來了,解壓有問題嗎? 在目錄下ls -a了一下,發現這個檔案時有的,但是它卻是乙個鏈結檔案,指向一大串**,把這段**複製下來之後,發現就是個程式,也就是說解壓的時候把**解壓成鏈結了,這個現象我完全不明白原理,但是總歸可以改回來,此處希望大神能夠解答。
改好這個檔案後,下乙個檔案也會報錯,檢查檔案後發現是一樣的原因,但這次我沒有改了,我們知道,核心檔案多的看不到邊,看來這種現象不是個例,為它消耗時間完全不值得。於是腦補了一下,著手再去找linux-rpi-3.18.y.tar.gz,因為我一直堅信這個字尾的核心一定好用,但是這個東西輕易是找不到的,用git命令實在太慢了,我的網太渣。
最終,我在github的乙個位址上找到了這個核心,這個位址是我根據一篇前輩的帖子腦補出來的:前輩已經聯絡不上了,但是還是留下鏈結吧。
解壓什麼的就不說了,很簡單,這次編譯成功了,那麼就到了第二個關口。怎麼讓樹莓派去啟動它???
我們必須知道,樹莓派的sd卡的儲存結構,我自己沒有檢視,但是我相信關於這點,網上的資訊是很正確,至少和我的分析相同。
樹莓派sd卡結構如圖:
那麼當我們把sd卡插入電腦時,會發現只能看到boot分割槽,裡面有很多檔案,需要注意的是kernel.img和kernel7.img這兩個檔案,他們就是當前板子使用的核心。
到此,網上的教程就結束了了,他們最後會說移植vc庫,modules,在config.txt裡面加上kernel=kernel.img就好。
但事實上!這樣還沒有結束!!!
我經過了試驗才發現的,我是樹莓派2,我把kernel7.img改個名字,就會啟動失敗,但我把kernel.img改名字,刪除,都沒關係。
也就是說,我的樹莓派事實上是執行的kernel7.img,但這有什麼區別呢?我陷入了沉思。
mkimage能把zimage變成kernel.img這個大家肯定都知道。但為什麼還有個kernel7.img?
很慶幸的是,最終我在wiki上看到了真相:
不知道是國內資訊過時還是怎麼的,這個東西從沒看到國內有提起,好吧,也可能是我孤陋寡聞,總之裡面提到,樹莓派a,b,b+執行的是kernel.img核心映象,而樹莓派2執行的則是kernel7.img,原因就是板子公升級了,核心映象簡化了。
那麼樹莓派2的核心製作方式原來就是把zimage改個名字就行了,於是嘗試,成功了,終於見到新的核心了,用uname -a檢視了一下,確實正確,寫了個hello world的核心模組,編譯之後,插入核心執行成功。
終於見到曙光了
後面還要進行u-boot的製作,以及led除錯燈驅動的編寫,那麼在後面的文章中我會一一提到,有興趣的朋友們可以加關注。
那麼準備繼續研究吧。
樹莓派 Linux 核心驅動編譯
寫好驅動 pin4module.c include include include include include include include include static struct class pin4 class 建立乙個類 static struct device pin4 class...
樹莓派核心驅動編寫 新增與呼叫
各種裝置以檔案的形式存放在 dev目錄,稱裝置檔案。主裝置號,次裝置號 主裝置號 不同的裝置 硬碟,led 次裝置號 同一類的多個裝置 led1,led2 管理所有裝置的驅動 1.新增 驅動插入鍊錶順序由裝置號檢索 編寫驅動,載入到核心 裝置名,裝置號,裝置驅動函式 操作暫存器來驅動i o 2.查詢...
樹莓派核心驅動編寫 控制GPIO的輸出
匯流排位址,實體地址,虛擬位址 參考博文 位址概念 樹莓派 1.bcm2835 樹莓派3b cpu型號,是arm cotexa53架構 2440 2410 cpu型號 是arm9架構 2.樹莓派是32位系統,1g 記憶體,只能識別949m 3.匯流排位址4g,實體地址1g,虛擬位址4g 1.晶元目錄...