米爾MYS-8MMX開(kāi)發(fā)板試用體驗(yàn)測(cè)評(píng)二
近期,米爾科技發(fā)布新品“MYS-8MMX”開(kāi)發(fā)板的評(píng)測(cè),吸引了廣大開(kāi)發(fā)者的圍觀,上周小編在公眾號(hào)發(fā)布1篇優(yōu)秀的測(cè)評(píng)報(bào)告,后臺(tái)收到了各位小伙伴的留言和咨詢,想必還有很多的疑問(wèn),為加深各位對(duì)米爾MYS-8MMX開(kāi)發(fā)板的了解,再同步一篇電路城優(yōu)秀測(cè)評(píng)者的測(cè)評(píng)報(bào)告,希望能幫助各位開(kāi)發(fā)者縮短開(kāi)發(fā)周期。
01
【米爾MYS-8MMX試用】重新編譯 uboot 添加網(wǎng)絡(luò)功能
筆者想用 nfs 文件系統(tǒng),方便后續(xù)開(kāi)發(fā),試了一下開(kāi)發(fā)板預(yù)裝系統(tǒng)uboot 不支持網(wǎng)絡(luò)功能,編譯前,不支持網(wǎng)絡(luò)
重新編譯 uboot 增加網(wǎng)絡(luò)功能:
編譯 uboot 的過(guò)程廢了點(diǎn)時(shí)間,由于米爾 SDK使用 yocto 作為開(kāi)發(fā)工具,yocto是個(gè)集成的開(kāi)發(fā)工具,功能大而全,好處多多,也有不方便的地方,國(guó)內(nèi)工程師估計(jì)都知道,那就是拉取源碼太難了,筆者沒(méi)用 yocto 而是一個(gè)個(gè)單獨(dú)編譯,然后再手工打包,這個(gè)環(huán)節(jié)廢了點(diǎn)時(shí)間。
02
【米爾MYS-8MMX試用】跑起網(wǎng)絡(luò)文件系統(tǒng)Ubuntu20.04
跑起網(wǎng)絡(luò)服務(wù)器上的 ubuntu 20.04 系統(tǒng),也就是把 uboot 放在 sd 卡上,其他的所有一切包括內(nèi)核、驅(qū)動(dòng)、設(shè)備樹(shù)、文件系統(tǒng)等等所有的東西都放在服務(wù)器上,這種方式好處很明顯,對(duì)開(kāi)發(fā)過(guò)程極其友好,比如修改內(nèi)核,服務(wù)器編譯后,板子重啟搞定,不用自己再把內(nèi)核復(fù)制到板子上,比如修改設(shè)備樹(shù),服務(wù)器編譯后,板子重啟搞定,不用自己復(fù)制,比如調(diào)整驅(qū)動(dòng),比如寫(xiě)個(gè)應(yīng)用程序,只要編譯完,服務(wù)器上有的東西,板子上也能找到,就是這么方便。
比如筆者的 SD 卡,只燒寫(xiě) flash.bin文件,甚至一個(gè)分區(qū)都不存在,因?yàn)楣P者壓根就不用 SD 卡的任何分區(qū),所以 SD 卡有沒(méi)有分區(qū)無(wú)所謂
Uubntu 文件系統(tǒng)在電腦上,在這里:
以下是啟動(dòng)記錄:
boot_log.txt
到此,整個(gè)開(kāi)發(fā)環(huán)境搭建起來(lái)了,所有鏡像和文件重新調(diào)整添加網(wǎng)絡(luò)文件系統(tǒng)支持,并編譯出來(lái),編譯的所有文件全部調(diào)試驗(yàn)證成功了,接下來(lái)可以愉快的開(kāi)發(fā)了筆者整個(gè)編譯過(guò)程是一個(gè)個(gè)手工單獨(dú)編譯的,手工單獨(dú)編譯要對(duì)各個(gè)文件包有所了解,編譯過(guò)程是有點(diǎn)繁瑣,優(yōu)勢(shì)也很明顯,速度很快,非常快,大約 20 分鐘就可以全部編譯一遍,如果是增量編譯,1分鐘內(nèi)搞定,再加上網(wǎng)絡(luò)文件系統(tǒng)加成,1分鐘內(nèi)編譯完重啟完看到驗(yàn)證的結(jié)果;筆者后續(xù)會(huì)頻繁編譯內(nèi)核,調(diào)整設(shè)備樹(shù),編譯速度快就能快速迭代加快開(kāi)發(fā)速度。用 yocto 編譯的話,省事方便,但是速度慢,如果公司配有很牛逼的開(kāi)發(fā)服務(wù)器集群,那可以。
03
【米爾MYS-8MMX試用】修復(fù)WiFi上網(wǎng)功能
適配了自己的 ubuntu 20.04 文件系統(tǒng),WiFi 無(wú)法正常使用,檢查了一下,是因?yàn)閮?nèi)核需要兩個(gè)文件,ubuntu 系統(tǒng)鏡像中沒(méi)有。
一個(gè)文件是 firmware,另一個(gè)文件是 nvram,在 eMMC 中原文件系統(tǒng)如下路徑中:
/lib/firmware/bcmd/fw_bcm43456c5_ag_apsta.bin
/lib/firmware/bcmd/nvram_ap6256.txt
直接從 eMMC 復(fù)制過(guò)來(lái),復(fù)制到 nfs ubuntu 文件系統(tǒng)中同樣的路徑下
重啟生效,就能驅(qū)動(dòng)了,也能連上 WiFi 網(wǎng)絡(luò)
文中提到的內(nèi)容只是需要調(diào)整修改的,其他沒(méi)說(shuō)的不用動(dòng)。
HDMI 顯示器也正常工作
網(wǎng)絡(luò)文件系統(tǒng) ubuntu 20.04 基本就緒,沒(méi)啥大問(wèn)題了
04
【米爾MYS-8MMX試用】如何向設(shè)備樹(shù)添加節(jié)點(diǎn)
本文重點(diǎn)內(nèi)容有三個(gè):1,驅(qū)動(dòng)模型如何建立2,設(shè)備樹(shù)如何被解析3,在理解 1 和 2 基礎(chǔ)上,會(huì)很自然的理解如何向設(shè)備樹(shù)添加節(jié)點(diǎn)platform 驅(qū)動(dòng)模型建立
內(nèi)核驅(qū)動(dòng)模型中有 bus,device,driver,分別對(duì)應(yīng) struct bus_type,struct device,struct device_driver 三個(gè)結(jié)構(gòu)體,或者說(shuō)三個(gè)對(duì)象也行,platform_bus , platform_device, platform_driver 是對(duì) struct bus_type,struct device,struct device_driver 的繼承,可以把 platform 平臺(tái)看作是bus,device,driver的更高一級(jí)對(duì)象。
Platform 驅(qū)動(dòng)中的 bus 和 device 是內(nèi)核創(chuàng)建的,比如以下代碼,注冊(cè)了 platform_bus
有了 platform_bus 之后,需要有 platform_device ,platform_device 也是內(nèi)核模塊的形式注冊(cè)的
of_platform_default_populate_init 這個(gè)函數(shù)解析設(shè)備樹(shù),解析時(shí)有規(guī)則的,結(jié)合imx8mm 平臺(tái)來(lái)說(shuō),解析了以下所有節(jié)點(diǎn)及其一級(jí)子節(jié)點(diǎn),也就是設(shè)備書(shū)中的以下節(jié)點(diǎn)創(chuàng)建了 device 設(shè)備,并且創(chuàng)建他們子節(jié)點(diǎn)的 device 設(shè)備,子節(jié)點(diǎn)再往下的節(jié)點(diǎn),不解析不創(chuàng)建device,留作 platform_driver 去解析創(chuàng)建。(設(shè)備樹(shù)如何被解析)
有了 platform_bus 也創(chuàng)建了 platform_device 設(shè)備,還差 platform_driver,platform_driver 就是驅(qū)動(dòng),并且是 SoC 芯片級(jí)別的驅(qū)動(dòng),這個(gè)有芯片原廠搞定,比如imx8mm 有以下 platform_driver:這個(gè)是 sdma 的驅(qū)動(dòng),以此為例,其他類同。
Platform 平臺(tái) bus,device,driver 幾乎全部有廠商提供,用戶基本是無(wú)感的。他默默在背后工作,但是初學(xué)者根本不知道他的存在。這是platform 平臺(tái)完整的驅(qū)動(dòng)模型。
理解此文基礎(chǔ)上,再繼續(xù)看筆者往期文章才能理解 IIC 總線框架:
【ALINX AXU2CGB試用】從linux 驅(qū)動(dòng)模型的角度看 iic 總線框架
https://www.cirmall.com/bbs/thread-208032-1-1.html
深入看 IIC 設(shè)備樹(shù),i2c1 位于aips3 的一級(jí)子節(jié)點(diǎn),i2c1 會(huì)被創(chuàng)建 platform_device,
I2c 驅(qū)動(dòng)注冊(cè)為platform_driver:
內(nèi)核一開(kāi)始注冊(cè)了 platform_bus,也創(chuàng)建了 i2c1 的 platform_device,也注冊(cè)了i2c1的 platform_driver,組成一個(gè)完整的 platform 驅(qū)動(dòng)模型,他們就會(huì)工作了,i2c 適配器/主機(jī)能正常工作了。
(文章中的 i2c 適配器,就是 i2c 主機(jī),i2c 控制器,對(duì)應(yīng)驅(qū)動(dòng)中的 i2c adapter;文章中的 i2c 設(shè)備,是 i2c 從機(jī),對(duì)應(yīng)驅(qū)動(dòng)中的 i2c client)
i2c 驅(qū)動(dòng)模型建立
I2c 適配器用的 platform 平臺(tái)驅(qū)動(dòng)模型,對(duì)你沒(méi)有看錯(cuò),筆者也么有寫(xiě)錯(cuò),i2c 適配器用的 platform 平臺(tái)驅(qū)動(dòng)模型,和 i2c 總線沒(méi)有半毛錢關(guān)系。
i2c 總線用在哪呢?用在 i2c 設(shè)備上。
I2c 適配器的 platform_driver 會(huì)去注冊(cè) adapter
解析 adapter 所有子節(jié)點(diǎn)注冊(cè)為 i2c client 設(shè)備 (i2c device),現(xiàn)在有了 i2c device
內(nèi)核會(huì)注冊(cè)創(chuàng)建 i2c 總線
內(nèi)核也會(huì)注冊(cè) client 驅(qū)動(dòng)(i2c driver)注冊(cè),如下;
有 i2c 總線,有 i2c device設(shè)備(i2c client 設(shè)備),有 i2c driver (i2c client 驅(qū)動(dòng)),組成一個(gè)完整的 i2c 總線模型,這個(gè)總線主要為 i2c 設(shè)備服務(wù)。
i2c 主機(jī)使用 platform 平臺(tái)總線,i2c 從機(jī)使用 i2c 總線,是不是很難理解?驅(qū)動(dòng)源碼就是這樣的。
linux 內(nèi)核驅(qū)動(dòng)中的總線,并不是硬件中的總線,也不是傳輸信息的,而是為了設(shè)備和驅(qū)動(dòng)更容易的適配的,是設(shè)備和驅(qū)動(dòng)的一種組織形式。
最難理解的地方就是 i2c 主機(jī)和 i2c 從機(jī)沒(méi)使用同一個(gè)總線,分別使用了 platform 總線和 i2c 總線,能問(wèn)出這個(gè)問(wèn)題的根源是用硬件總線的概念去想當(dāng)然的理解驅(qū)動(dòng)中的總線,潛意識(shí)完全錯(cuò)誤,硬件總線和驅(qū)動(dòng)中的總線,完全是兩個(gè)東西,應(yīng)該這么去理解:1,硬件中的總線,是傳輸信息的,硬件上主從機(jī)位于同一條 i2c 總線,主從機(jī)是可以通信的。
2,驅(qū)動(dòng)中的總線僅僅是設(shè)備和驅(qū)動(dòng)的組織形式,方便設(shè)備和驅(qū)動(dòng)適配的。只要 i2c 主機(jī)設(shè)備和驅(qū)動(dòng)適配 ok 主機(jī)就會(huì)工作,i2c 從機(jī)設(shè)備和驅(qū)動(dòng)適配 ok 從機(jī)就會(huì)工作。分別使用了 platform 總線和 i2c 總線,并不影響 i2c 主機(jī)和 i2c 從機(jī)正常適配,正常工作。
結(jié)果就是 linux 驅(qū)動(dòng)讓 i2c 主從機(jī)都可以正常工作,硬件讓主從機(jī)又能相互通信,那就可以了。
linux 驅(qū)動(dòng)僅僅是讓硬件工作起來(lái),別強(qiáng)求 i2c 主從機(jī)必須位于同一條總線,不在同一條總線沒(méi)關(guān)系;硬件的總線是通信的,i2c 主從機(jī)要想通信必須位于同一條總線,沒(méi)的商量。
platform 是 arm linux 驅(qū)動(dòng)中最基礎(chǔ)的平臺(tái),用的多,也最容易追蹤分析,是軟件中驅(qū)動(dòng)模塊部分抽象出來(lái)的一種模型,用于組織設(shè)備和驅(qū)動(dòng)的一種方式,其他 i2c ,spi 總線和 platform 平臺(tái)驅(qū)動(dòng)模型類似各有差異,i2c 和 spi 驅(qū)動(dòng)模型都是在 platform 平臺(tái)驅(qū)動(dòng)中再次建立起來(lái)的,platform 平臺(tái)驅(qū)動(dòng)注冊(cè) i2c / spi 設(shè)備,和內(nèi)核注冊(cè)的 i2c 總線、i2c driver 組成 i2c 驅(qū)動(dòng)模型。
沒(méi)有 設(shè)備樹(shù) 對(duì)應(yīng)的節(jié)點(diǎn),就沒(méi)有 platform device,沒(méi)有 platform device 僅有 platform bus 和 platform driver 不能組成完整的驅(qū)動(dòng)模型,就無(wú)法工作。無(wú)法工作,platform driver 就不能 match 就無(wú)法 probe,無(wú)法 probe 就不能添加 i2c device,僅有 i2c 總線和 i2c driver 不能組成i2c 總線完整的驅(qū)動(dòng)模型,i2c 也就不能工作。所以向設(shè)備樹(shù)添加節(jié)點(diǎn),很重要,相當(dāng)于給驅(qū)動(dòng)模型添加 device。
如何向設(shè)備樹(shù)添加節(jié)點(diǎn)設(shè)備樹(shù),這個(gè)名字說(shuō)明他的數(shù)據(jù)結(jié)構(gòu)是樹(shù),樹(shù)中的每個(gè)節(jié)點(diǎn)是設(shè)備。向設(shè)備樹(shù)中添加節(jié)點(diǎn),就是向 linux 中添加設(shè)備,樹(shù),就要求你添加到合適的位置,合適的層級(jí)。向設(shè)備樹(shù)添加節(jié)點(diǎn)是有規(guī)則的,規(guī)則是由設(shè)備樹(shù)被解析的規(guī)則決定的,內(nèi)核怎么解析設(shè)備樹(shù)你就怎么添加添加設(shè)備節(jié)點(diǎn),必須添加到指定位置添加自己的設(shè)備節(jié)點(diǎn),必須添加到文中圖片列出的節(jié)點(diǎn)的一級(jí)子節(jié)點(diǎn),二級(jí)和再深的節(jié)點(diǎn),添加了也沒(méi)用,因?yàn)閮?nèi)核根本不去創(chuàng)建更深層次節(jié)點(diǎn)設(shè)備。也不是完全不可以,你添加后節(jié)點(diǎn)還是存在的,只存在設(shè)備樹(shù)中,驅(qū)動(dòng)模型中是不存在,需要你自己去建立驅(qū)動(dòng)模型。接下來(lái)筆者運(yùn)用設(shè)備樹(shù)等不同的方法自己創(chuàng)建一條總線,建立起這個(gè)總線的驅(qū)動(dòng)模型,讓設(shè)備和驅(qū)動(dòng)正常適配、probe、正常工作起來(lái)。
米爾電子嵌入式解決方案專家“米爾MYiR”公眾號(hào)?不定期分享產(chǎn)品資料及干貨?第一時(shí)間發(fā)布米爾最新資訊長(zhǎng)按二維碼 關(guān)注我們
原文標(biāo)題:再來(lái)一份關(guān)于米爾MYS-8MMX開(kāi)發(fā)板試用體驗(yàn)測(cè)評(píng)報(bào)告——robe.zhang
文章出處:【微信公眾號(hào):米爾MYiR】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5121瀏覽量
98209
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論