一個簡單的新知識_U-Boot 驅動模型

2021-03-02 嵌入式Hacker

什麼是好文章?

文章要提供新知,創造價值。Andy 老師這篇關於 U-boot 驅動模型的文章就符合這個特點。

量大且密度大,邏輯性強。這是底層軟體開發人員的必備素質了。

容易理解,我希望分享的都是大家只要墊起腳尖就能學到的新知識,如何你覺得哪篇文章太難,請在後臺告訴我。

永遠有效的兩個字——真誠。真誠不是寫作技巧,但也是最好的寫作技巧。

最近公眾號某篇文章被投訴「濫用原創」了,我承認那篇文章確實是不應該標註原創。我當時只想著真誠地分享幾本書給大家,並且以我認為的合理且客觀的描述去推薦那幾本書。

這引起了我的思考:
我分享的東西都是我的讀書筆記 + 自己的理解和思考,並且毫無保留地分享給大家。我只是想做專心學習認真分享這件事,如果這些東西都不能標註原創的話,那我會考慮不標註原創,我享受的是記錄和分享知識這件事。公眾號是一個很好的寫作平臺,但是在公眾號上寫文章是有風險的,最大的風險就是封號。如果到了那一天,封就封吧,我不喜歡被束縛的感覺,沒了我這麼一個積極健康向上的芝麻小號主,是微信公眾號平臺的一大損失~到時大家可以去 知乎或者我的個人網站 (www.es-hacker.com) 找到我,歡迎收藏。

以下是Andy 老師寫的正文。

目錄

一、U-Boot DM 三要素
  1. udevice
  2. uclass
  3. driver
二、設備驅動的使用

最近拿了一塊 Firefly 的開發板,主控是 RK3308,發現上面用的 U-Boot 是 2017 年的,於是想移植一個最新的版本上去,調試驅動的時候,總結了這些經驗。

一、U-Boot DM 三要素

DM 是 U-Boot 中的驅動框架,全稱 Driver Mode。像 Linux Kernel 中的驅動三要素 device 、bus 、driver 一樣,DM 也有自己的三要素:udevice、uclass、driver。

uclass 是同一類設備的抽象,提供管理同一類設備的抽象接口。1. udevice

通過三種途徑生成:

主動調用 device_bind_xxx 系列 API

根據當前 U-Boot 的編程哲學,基本大部分設備都是通過 dts 來描述,還有少部分設備因為特殊原因,可以通過 U_BOOT_DEVICE(_name) 宏申明。

在 UBoot DM 初始化階段(initfdm 和 initrdm),通過調用 dm_init_and_scan(boolpre_reloc_only) 根據名稱 (UBOOT_DEVICE 中和 driver 的 name,或者 dts 和 driver 的 compatible) 匹配到對應的 driver,然後調用 device_bind_common 函數生成 udevice,udevice 會和 driver 綁定,並根據 driver 中的uclass id 找到對應的 uclass driver,並生成相應的 uclass, 並把該設備掛到 uclass 的設備節點之下。最後調用 driver 的 bind 函數。

還有部分特殊的驅動,他們並不存在實際意義上的設備,比如 MMC 子系統中的 mmcblk 驅動,該驅動主要是把所有的 mmc 設備註冊到更上一層的 blk 子系統中,向 blk 層提供操作 mmc 設備的 blkops,向下通過mmc uclass 提供的統一接口控制 mmc 設備。

顯然,這個驅動位於抽象層,它不和具體的硬體設備直接交互,並不適合用一個 dts(dts 是用來描述具體的硬體信息的) 節點或者 UBOOTDEVICE(_name) 宏來為這個驅動顯示的申明設備。這種情形下一般通過主動調用 device_bind_xxx 系列 API 來完成驅動和設備已經更上一層 uclass 之間的 bind。

C:把設備掛到 uclass 的dev_head 鍊表下。

2. uclass

這裡主要的成員是 uclassdriver 和 devhead 鍊表。

dev_head 是一個鍊表頭, 用來連結該類下的所有設備。可以通過 uclass_foreach_dev(dev,uc) 遍歷該class 下的所有設備。

uclass_driver 是針對某一類設備提供的通用操作接口,然後通過 udevice->driver->ops 操作到具體的硬體設備。

uclass_driver 通過 UCLASSDRIVER(name) 宏申明, 在 device_bind_common 中根據設備對應的驅動 driver 中的 uclass id 找到 uclass_driver,並生成相應的 uclass, 並把設備掛到該 uclass 的設備節點 dev_head 下。

通過 UBOOTDRIVER 的 id 可以看出,該設備(pwm backlight)驅動屬於 UCLASSPANELBACKLIGHT 類。

這裡定義了 backlight 的 UCLASS_DRIVER。該 uclass driver 提供了 backlight_enable(structudevicedev) 和 backlight_set_brightness(structudevicedev,intpercent) 兩個通用的 API 供應用調用,可以看到他們都需要傳遞對應設備的 udevice ,然後通過 backlight_get_ops(dev) 拿到對該設備的操作接口。

3. driver

通過 UBOOTDRIVER(__name) 宏聲明。

如果 driver 實現了 bind 接口,該bind 將在 device_bind_common 中 device 和 driver 匹配上後被調用, 而且在 device_bind_common 中會完成 udevice 和 driver 的綁定。

driver 一般都有對應的 probe 接口,通過 device_probe(structudevice*dev) 調用,需要注意的是driver 的 bind 接口調用的比 probe 接口早, 大部分在 dm_init_and_scan 中就被調用了。

driver 一般會提供 ops 操作接口,供上一層調用

需要說明的是,driver 一般都不需要把自己註冊到 uclass 中,而是在 device_bind _common 階段實現driver 、uclass、device 三者的對接,然後 uclass 層通過 udevice->driver->ops 獲取對應 driver 的操作接口

二、設備驅動的使用

一般應用層的代碼要使用某個設備的時候,首先需要通過 uclass_get_device_xxx 系列 API 拿到該設備的 udevice, 然後通過該設備的 uclass 提供的 API 操作該設備。uclass_get_device_xxx 拿到該設備的 udevice 後會調用該設備的 probe 接口。

以前面提到的 pwm backlight 為例:

/**
 * drivers/video/simple_panel.c
 */

struct
 udevice *bldev;

uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev, 
"backlight"
, &bldev);

backlight_enable(bldev);

backlight_set_brightness(bldev, percent);

三、歡迎加入我的微信群

你和我各有一個蘋果,如果我們交換蘋果的話,我們還是只有一個蘋果。但當你和我各有一個想法,我們交換想法的話,我們就都有兩個想法了。如果你也對 嵌入式系統和開源軟體 感興趣,並且想和更多人互相交流學習的話,請關注我的公眾號:嵌入式Hacker,一起來學習吧,無論是 關注或轉發 , 還是賞賜,都是對作者莫大的支持,感謝 各位的大拇指 ,祝工作順利,家庭和睦~

相關焦點

  • U-Boot SPL作為一級bootloader
    board_init_f函數一般完成SoC的基本初始化,如引腳復用、時鐘使能、PLL配置等,當這些基本功能都具備之後,初始化一個串口列印終端,最後返回到start.S中完成其餘的操作。既然數據段位於CPU上電初始化期間不可改寫的外部存儲設備中,那麼可以不使用數據段的內容,當堆棧開闢好之後,自行編寫串口初始化代碼,同時封裝一個串口輸出函數供SPL執行期間的數據輸出。
  • Spring Boot 2.0 Release Notes 中文版
    它們旨在用於事件驅動模型(而不是傳統的每個請求都需要一個線程執行的模型)。讀者可以將Spring框架參考文檔中的「Web on Reactive Stack」部分作為一個很好的入門參考。Spring Boot 2.0通過自動配置和starter-POMs 來全面支持reactive applications。
  • 在Linux上安裝NVIDIA顯卡驅動的詳細教程
    lang=cn2.2 如圖是我的顯卡型號信息,你需要選擇好自己電腦的顯卡版本信息後點擊搜索2.3 點擊 下載3、禁用nouveau驅動3.1 禁用默認的nouveau,據說這是NVIDIA顯卡的開源驅動,默認是使用的這一個,不確定怎麼辦,可以輸入 以下 命令進行查看,
  • 非常不錯的一篇介紹U-boot工作機制的好文
    = 0) {hang ();}}/* armboot_start 在cpu/arm920t/start.S 中被初始化為u-boot.lds連接腳本中的_start */mem_malloc_init (_armboot_start - CONFIG_SYS_MALLOC_LEN,CONFIG_SYS_MALLOC_LEN
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    筆者採用的BootLoader是u-Boot-1.1.16。Uboot是一個眾所周知的開源軟體。讀者僅需了解它起到了BootLoader的作用即可。這裡不多做解釋。僅對串口的連接和程序的下載作簡要說明:將UBOOT目錄下的u-boot.bin下載到開發平臺上。在Windows打開設備管理器。選擇埠。從而找到正確的com口號。
  • Spring Boot集成JDBCTemplate
    程序新視界:一個「軟實力」、「硬技術」同步成長的平臺。JDBCTemplate相對於其他ORM框架來說是極其簡單和極容易上手的一個資料庫連接的封裝。在學習JDBCTemplate之前,我們先來了解一下JDBC相關的概念和操作。
  • Lesson 2音標[ɔ:] [ɔ] [u:] [u]學習
    1.doctor  teacher box  clothes      2.cold  zoo    clock  dog3.love   boss lot  violin            4.watch  beach fox  girlØ  [u:]
  • AM335x(TQ335x)學習筆記——Nand&&網卡驅動移植
    移植完成音效卡驅動之後本想再接再勵,移植網卡驅動,但沒想到的是TI維護的內核太健壯,移植網卡驅動跟之前移植按鍵驅動一樣簡單,Nand驅動也是如此,
  • Spring Boot 2.X 實戰--SQL 資料庫(MyBatis)
    我是小先,一個專注大數據、分布式技術的非斜槓青年,愛Coding,愛閱讀、愛攝影,更愛生活!博客主頁:https://me.csdn.net/u010974701原始碼倉庫:https://github.com/zhshuixian/learn-spring-boot-2考慮到 MyBatis 應用比較廣泛,這裡將會使用 MyBatis 作為主要的 Java 持久層框架,對 MyBatis Plus 感興趣的讀者可以對照本小節內容,參考其官網 https
  • 超詳細Spring Boot面試問題集錦,死角一個不留!
    根據Spring文件:執行器是一個製造術語,指的是移動或控制某物的機械裝置。執行機構可以從一個小的變化中產生大量的運動。眾所周知,Spring Boot提供了許多自動配置特性,幫助開發人員快速開發生產組件。但是,當考慮調試和如何調試,如果出現問題,總是需要分析日誌並挖掘應用程式的數據流,檢查問題出在何處。
  • boot是靴子,那get the boot是什麼意思?
    假設你的朋友小明,最近工作非常不順利,他對你說「 I'm afraid I'll get the boot.」那大家猜猜看,get the boot是什麼意思?get the boot的意思是「be dismissed from one's job」,即「被解僱」。這句短語在口語中,就等同於「be fired」。當某人想用英語表示自己被解僱了,就可以用這個短語來描述。
  • 英語習語習得(6)get the boot 與 put the boot in
    學會一個習語最好是在一個過目不忘的語境中。今天外網上一篇報導有點意思。說是紐西蘭一地方議會建議把貓逐步趕盡殺絕,於是用一個習語寫出一個吸睛的標題 Puss gets the boot。get the boot, 也可以說成be given the boot,具有被動色彩,to be fired, to have one's romantic partner end the relationship with one; to be broken up with.
  • SpringBoot2.x基礎篇:Linux後臺運行Jar以及Jvm參數調優
    04JVM Server模式在JVM內有一個模式的概念,開發環境中一般使用的是client模式,不過生產伺服器上一般都是使用server模式,我們要怎麼選擇呢?設置使用server模式也比較簡單,我們只需要執行java -server命令即可,如下所示:05初始內存(-Xms)JVM在client模式下運行,默認Xms大小為1M,而在server模式下默認Xms大小為128M,可以根據實際情況進行修改分配,
  • 模型壓縮中知識蒸餾技術原理及其發展現狀和展望
    Hinton等人最早在文章「Distilling the knowledge in a neural network」[1]中提出了知識蒸餾這個概念,其核心思想是一旦複雜網絡模型訓練完成,便可以用另一種訓練方法從複雜模型中提取出來更小的模型,因此知識蒸餾框架通常包含了一個大模型(被稱為teacher模型),和一個小模型(被稱為student模型)。
  • 酷家樂以圖搜模型上線 「AI+大數據」雙引擎驅動家居行業
    當無人超市、無人4S店、自動駕駛等進入現實生活,人工智慧技術在全球多個領域掀起一場「智慧革命」,通過技術突破給行業發展提供新的動能。  在家居板塊,酷家樂創造性將AI技術引入家居設計環節,研發上線「以圖搜模型」功能,通過「人工智慧+大數據」雙引擎,驅動家居行業進入智能化和人性化新時代,進一步實現家居行業「所想即所見,所見即所得」。
  • CHIP 2020 | 醫渡雲在數據智能和知識雙驅動下的人工智慧應用與探索
    本屆大會聚焦"數據和知識雙驅動的醫療人工智慧",圍繞智慧醫療發展的趨勢與挑戰,數據智能驅動與知識驅動兩條技術主線的可行和可能的融合方式等話題展開深入探討。醫渡雲首席人工智慧科學家閆峻從醫療數據治理的角度出發,基於機器學習與醫學知識相結合,針對電子病歷結構化,醫學術語標準化、數據分布式計算、數據質控等方面的一些研究和探索展開分享。
  • 使用IntelliJ IDEA創建一個Maven的Spring Boot項目
    需要配置JDK的目錄,如下圖所示:4、然後點擊「Next」,如下圖所示:5、輸入GroupId和ArtifactId,然後點擊「Next」,如下圖所示:6、默認Project name,然後點擊「Finish」,如下圖所示:7、此時右下角會彈出一個提示框