5、聯(lián)網更新并安裝最新的樹莓派Raspbian OS,編譯生成PCIe ko驅動文件

?? ?5.1、更新樹莓派系統(tǒng)
?????? ?進入VNC虛擬桌面之后,打開里面的CMD窗口,輸入update指令,將樹莓派系統(tǒng)更新到最新版本,因為出廠的時候,樹莓派核心板里面的系統(tǒng)不一定是最新的,另外,在進行更新的時候,一定要保證樹莓派的Wifi能上網。
?????? 具體操作的指令過程如下:
1)????? 首先通過更新存儲庫軟件包列表:sudo apt update
2)????? 更新完成后,再運行升級命令:sudo apt dist-upgrade
3)????? 按照所有提示進行操作,然后等待樹莓派升級完成后,鍵入:sudo apt clean
這條指令可以將升級過程中已下載的所有不需要的文件清除掉,節(jié)省空間。
4)????? 輸入重啟指令:sudo reboot
樹莓派重新啟動后,即可進入最新版本的Raspbian OS!
?? ?5.2、在樹莓派系統(tǒng)里面添加后續(xù)需要參與編譯的Headers和Build文件夾
?????? ?使用樹莓派編譯Linux驅動時,需要在/lib/moudles/*/ 目錄下存在build文件夾以及相關的頭文件,但是樹莓派為了節(jié)省內存空間,所以出廠原生的Raspbian系統(tǒng)是沒有這個Build文件夾的。此時,我們需要安裝Linux Headers內核相關文件。
?????? ?同理,樹莓派下的Linux Headers安裝不同于其他平臺,需要使用帶管理員權限的命令進行安裝:sudo apt install raspberrypi-kernel-headers
?????? ?安裝完成后,打開樹莓派/lib/modules/5.10.17-v7l+路徑,就有了相應的build文件夾了,如圖9-61所示。這個Build里面包含了很多樹莓派系統(tǒng)所需要的編譯文件。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?? ? ? ? 細心的用戶,發(fā)現(xiàn)了,在modules文件夾里面有4個跟Raspbian系統(tǒng)相關的文件夾,如圖9-62所示,為什么我們選擇的是5.10.17-v7l+?是因為我們買的這個工業(yè)級樹莓派CM4里面的CPU ARM內核是Cortex-A72,對應的版本是V7L,用戶可以通過輸入sudo uname -a查看到,如圖9-63所示。里面還有一個V8的,這個說明Raspbian樹莓派系統(tǒng)支持V8架構的ARM芯片,在后續(xù)Pro6這本書里面,我們重點給用戶介紹國產的RK3399芯片,就是V8架構,支持64位Linux系統(tǒng)。


?? ?5.3、從Xillybus官網上下載Linux系統(tǒng)下的FPGA PCIe接口c文件和makefile文件(通過VNC拷貝到樹莓派里面并進行解壓)
?????? ?首先,在瀏覽器里面輸入Xillybus.com,然后找到PCIe資料的下載鏈接:http://xillybus.com/pcie-download/,在這個頁面的下方找到支持Linux系統(tǒng)的PCIe驅動源文件,如圖9-64所示。下載下來的是一個名為“xillybus.tar.gz”壓縮包,里面主要包含Makefile編譯約束,udev文件和簡單的C語言測試程序。

? ? ? ? 接下來,用戶有兩種方式可以將這個xillybus.tar.gz文件拷貝到樹莓派上,一是用U盤拷貝,二是用VNC遠程虛擬桌面直接傳輸,這里推薦大家用VNC來操作。在VNC虛擬桌面的上方隱藏了一個工具欄,如圖9-65所示。

? ? ? ? 將鼠標移到VNC虛擬桌面中間頂部,出現(xiàn)工具欄之后,點擊中間的“Transfer files”按鈕,在彈出來的對話框里面將我們剛剛從Xillybus官網上下載到本地電腦的壓縮包文件傳輸?shù)綐漭勺烂嫔?,如圖9-66所示。

? ? ? ? 然后點擊樹莓派左上角的“新建文件夾”按鈕,在pi根目錄下,新建一個名為“Xillybus-PCIe”的文件夾,如圖9-67所示。

? ? ? ? 再把樹莓派桌面上的壓縮包文件“xillybus.tar.gz”利用鼠標左鍵按住之后,直接拖拽到剛剛新建的“Xillybus-PCIe”文件夾里面,如圖9-68所示。

? ? ? ? 然后右擊“xillybus.tar.gz”壓縮包,選擇“提取到此處”,如圖9-69所示。相當于將這個壓縮包里面的文件解壓出來,當然,熟悉Linux指令的用戶,也可以通過命令的方式來完成拷貝和解壓,這里選擇利用VNC和鼠標進行操作,可以簡化Linux開發(fā)調試門檻。
?????? ?解壓之后,可以看到里面一共有2個文件夾和1個README.TXT文件,如圖9-70所示。其中,README文件告訴用戶這些文件的含義,比如,里面的兩個文件夾,分別存放的文件是用來做什么的:
?????? ?* module - The kernel module source + udev file
?????? ?* demoapps - Sample C userspace programs for trial and hacking
?????? ?其中,module文件夾里面的是用來編譯生成ko驅動文件所需的makefile和各種c和h文件以及rules文件;demoapps文件夾里面是給用戶參考的PCIe應用程序示例,后續(xù)我們就是基于這些例程進行改寫之后,生成Linux下的so動態(tài)鏈接庫的,類似Windows系統(tǒng)下的DLL。


? ? ? ? 至此,關于Linux系統(tǒng)下的Xillybus源文件準備工作就完成了。
?? 5.4、查看樹莓派Raspbian OS系統(tǒng)位寬
?????? ?在開始編譯Xillybus驅動文件之前,我們還需要確認一下當前樹莓派里面安裝的Linux系統(tǒng)位寬,到底是32位還是64位系統(tǒng),因為這個位寬決定了后續(xù)編譯KO文件時的條件選擇。我們可以在LXterminal終端里面輸入指令:getconf LONG_BIT,然后回車就能看到,如圖9-71所示。返回的是32,說明當前的Linux系統(tǒng)是32位的,如果返回的是64,就是64位系統(tǒng)。

?? 5.5、在Linux系統(tǒng)下編譯Xillybus文件并生成KO驅動文件(神電測控已經提前編譯好了,可以跳過這一步)
?????? ?Xillybus官方提供的Linux系統(tǒng)源文件里面有兩處需要進行修改,否則編譯的時候會報錯。第一處是把/home/pi/Xillybus-PCIe/xillybus/module文件夾里面的xillybus_pcie.c文件里面的這個頭文件“l(fā)inux/pci-aspm.h”聲明給注釋掉,如圖9-72所示。這個aspm里面包含的是一套對PCIe總線進行電源管理的函數(shù),感興趣的用戶可以上網找一下這方面的資料自行研究。

? ? ? ? 另外就是,前面我們獲取的樹莓派Raspbian系統(tǒng)位寬是32位的,而Xillybus官方提供的xillybus_pcie.c源文件里面默認支持的是64位的系統(tǒng),所以我們需要將里面的這段代碼注釋掉,或者添加if條件語句,如圖9-73所示。使其強行支持32位的Linux系統(tǒng),這樣后續(xù)Linux對PCIe板卡進行驅動加載和枚舉的時候,分配的地址和Memory空間就不會錯亂,如果是32的Linux系統(tǒng),這里不做任何處理的話,后續(xù)識別PCIe FPGA板卡的時候,會出現(xiàn)圖9-74所示的錯誤,也就是Memory所需空間無法正常分配,當然了,如果用戶在樹莓派或者RK3399上面移植的是64位Linux系統(tǒng),那么這里就不需要添加if語句了?。?!


? ? ? ? xillybus_pcie.c文件根據(jù)使用環(huán)境修改完成后,保存關閉,然后我們就可以使用Linux gcc編譯器來編譯這些c文件和makefile文件生成ko驅動文件了。具體過程如下:
1)????? 首先判斷一下樹莓派Raspbian系統(tǒng)里面是否存在gcc編譯器,用戶可以通過在LXterminal終端里面輸入指令:sudo gcc,如果返回的是“command not found”,說明這臺樹莓派系統(tǒng)里面沒有安裝過gcc編譯器。則跳入2),如果窗口返回的是“gcc: no input files”,說明Linux系統(tǒng)里面已經安裝了gcc,則跳入3).
2)????? 因此,我們需要在線給樹莓派里面安裝一下gcc編譯器,用戶可以輸入指令:sudo apt-get install gcc make kernel-devel-$(uname -r),安裝成功后,再執(zhí)行sudo gcc可以看到返回的信息變了,如圖9-75所示。

3)????? 接下來,利用cd命令定位到Xillybus-PCIe文件夾里面的module文件夾,也就是這個目錄:Xillybus-PCIe/xillybus/module,如圖9-76所示。

4)????? 然后,我們直接輸入sudo make指令對module文件夾下的所有文件進行編譯,如果編譯過程沒有任何錯誤提示,如圖9-77所示,說明編譯成功了,并且module文件夾里面多出來了很多后綴名為ko的驅動文件,如圖9-78所示。其中,最為重要的兩個ko驅動文件就是xillybus_core.ko和xillybus_pcie.ko,從源文件和PCIe驅動加載過程來看,前者xillybus_core.ko是被后者xillybus_pcie.ko調用的。


5)????? 接下來,我們以管理員權限的命令將上面編譯出來的兩個ko文件拷貝到樹莓派Raspbian OS的內核驅動文件夾里面,具體的路徑可以參考下面的命令,如圖9-79所示。需要注意的是,modules后面的系統(tǒng)版本可以通過uname -a命令查看到。打開命令行里面的路徑,可以看到兩個ko文件成功地拷貝進來了,如圖9-80所示。
sudo cp xillybus_core.ko /lib/modules/5.10.17-v7l+/kernel/drivers/char/
sudo cp xillybus_pcie.ko /lib/modules/5.10.17-v7l+/kernel/drivers/char/


?? 5.6、在樹莓派里面安裝支持Xilinx FPGA PCIe接口的KO驅動(通過lsmod和lspci可以查看插到樹莓派上的PCIe板卡識別狀態(tài),必須要創(chuàng)建出16個文件才算是成功(8上8下))
1)????? 拷貝成功后,我們還需要將ko驅動文件安裝到樹莓派Linux系統(tǒng)里面去,可以輸入指令:depmod -a,來完成靜態(tài)安裝,如圖9-81所示。如果用戶不放心的話,還可以通過sudo make install指令強行安裝ko驅動文件,如圖9-82所示。


2)????? 當通過depmod -a指令獲取到所有的文件依賴關系后,用戶還需要通過sudo modprobe xillybus_pcie指令來加載所有跟Xillybus驅動相關的模塊到系統(tǒng)里面來,如圖9-83所示。

3)????? 為了判斷Xillybus驅動是否成功安裝和加載,用戶可以通過輸入lsmod指令進行查詢,如圖9-84所示??梢钥闯?,兩個xillybus相關的ko驅動都加載和運行了,其中xillybus_core有一個被xillybus_pcie調用的進程。

4)????? 最后一步是,將樹莓派關機,斷電,然后把我們Pro4開發(fā)寶典里面的FPGA bit文件生成bin文件之后固化到黑金的AX7103 FPGA開發(fā)板上,然后利用PCIex8轉PCIex1轉接線接到樹莓派上,實物接線,如圖9-85所示。給樹莓派上電,大約10s之后,F(xiàn)PGA開發(fā)板上的LED1指示燈閃爍起來,說明我們的PCIe FPGA開發(fā)板成功地被樹莓派識別和加載了,這是因為FPGA里面運行的bit文件我們加入了PCIe通信IP核代碼,不熟悉的用戶可以參考我們編寫的Pro4開發(fā)寶典,這里不再贅述了!

5)????? 然后打開VNC進入樹莓派虛擬桌面,在LXterminal命令終端里面輸入lspci指令,查看我們的PCIe FPGA板卡是否被樹莓派成功識別了,如圖9-86所示。

6)????? 上面這個lspci命令無法看到具體的系統(tǒng)識別和加載過程,如果用戶希望能夠看到樹莓派Linux系統(tǒng)對PCIe FPGA設備的完整加載過程,可以輸入這個指令:grep -i xillybus /var/log/syslog | less,如圖9-87所示,它可以將系統(tǒng)日志里面所有關于xillybus關鍵字的信息全部找出來??梢钥闯?,Linux系統(tǒng)識別成功后,一共創(chuàng)建了16個讀寫文件,這是因為我們在FPGA里面下載的bit文件里面包含的PCIe通道是8上8下,共計16個獨立的通道,每個通道對應一個文件名,對PCIe設備的讀寫操作實際上就是對映射出來的文件進行讀寫。
