<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                uboot引入了驅動模型(driver model),這種驅動模型為驅動的定義和訪問接口提供了統一的方法;提高了驅動之間的兼容性以及訪問的標準型。 ### uboot的DM主要有四個組成部分: * udevice - 簡單就是指設備對象,可以理解為kernel中的device。 * driver - udevice的驅動,可以理解為kernel中的device\_driver。和底層硬件設備通信,并且為設備提供面向上層的接口。 * uclass - 使用相同方式的操作集的device的組。相當于是一種抽象。uclass為那些使用相同接口的設備提供了統一的接口。 * uclass\_driver - 對應uclass的驅動程序。主要提供uclass操作時,如綁定udevice時的一些操作。 調用關系如下: ![](https://img.kancloud.cn/8d/a3/8da3663a8befe2293d622eea0ab0957b_832x726.png =600x) ### DM的模型支持源碼在:include/dm ![](https://img.kancloud.cn/a6/6d/a66d7378b49867d77933d6a639c4b6e7_832x184.png =600x) ### 幾個關鍵數據結構的說明: ### **1.uclass id** 在uclass-id.h中定義了相關的id,部分列舉如下: ![](https://img.kancloud.cn/fa/18/fa182783cffbeb23c60fa0607cc2aefb_832x612.png =600x) ### 比如我們串口用到uclass的ID就是UCLASS\_SERIAL。 ### **2.uclass** 同一類設備屬于同一個uclass,擁有相同的uclass ID。比如說RTC芯片, 市面上RTC芯片很多,由不同的廠家生產,其內存寄存器定義甚至訪問接口都不一樣,所以RTC的driver肯定是不一樣的,但是從功能的角度來說,他們都是用來記錄時間的,所他們都屬于rtc-class。?uclass從層級結構來講,起到非常好的承上啟下的作用,它既能屏蔽具體設備個體間的差異性,向用戶提供統一的接口,又能為同一類的設備定義統一的處理函數,具體的設備驅動只需要實現這些處理函數即可,從而簡化的設備驅動的開發。 ### 我們可以在uclass.h中找到uclass的定義如下: 從設備的角度來看,同一類的設備(比如RTC)擁有相同的uclass ID,并全部掛在該uclass下;從驅動的角度來看,uclass driver實現通用的處理邏輯。 ### **3.uclass\_driver** 同樣我們可以在uclass.h中找到struct uclass\_driver的定義,這個結構體定義了一組我們訪問uclass的接口: ![](https://img.kancloud.cn/bd/d7/bdd7919e06349a1c1df56d11618aed3f_734x554.png =600x) ``` post_bind // 在udevice被綁定到該uclass之后調用 pre_unbind // 在udevice被解綁出該uclass之前調用 pre_probe // 在該uclass的一個udevice進行probe之前調用 post_probe // 在該uclass的一個udevice進行probe之后調用 pre_remove // 在該uclass的一個udevice進行remove之前調用 child_post_bind // 在該uclass一個udevice的一個子設備被綁定到該udevice之后調用 child_pre_probe // 在該uclass的一個udevice的一個子設備進行probe之前調用 init // 安裝該uclass的時候調用 destroy // 銷毀該uclass的時候調用 ``` ### ### **4.udevice** 我們可以在device.h中找到定義: ![](https://img.kancloud.cn/77/47/77471080a1df814d3e3dda3334c000f3_660x770.png =600x) ### ``` const struct driver *driver; // 該udevice對應的driver const char *name; // 設備名 void *platdata; // 該udevice的平臺數據 void *parent_platdata; // 提供給父設備使用的平臺數據 void *uclass_platdata; // 提供給所屬uclass使用的平臺數據 int of_offset; // 該udevice的dtb節點偏移,代表了dtb里面的這個節點node ulong driver_data; // 驅動數據 struct udevice *parent; // 父設備 void *priv; // 私有數據的指針 struct uclass *uclass; // 所屬uclass void *uclass_priv; // 提供給所屬uclass使用的私有數據指針 void *parent_priv; // 提供給其父設備使用的私有數據指針 struct list_head uclass_node; // 用于連接到其所屬uclass的鏈表上 struct list_head child_head; // 鏈表頭,連接其子設備 struct list_head sibling_node; // 用于連接到其父設備的鏈表上 uint32_t flags; // 標識 ``` ### **5.driver** 同樣我們可以在device.h中找到定義: ![](https://img.kancloud.cn/5f/3e/5f3ec797ba64b628307251d41cafdc2a_760x472.png =600x) ``` char *name; // 驅動名 enum uclass_id id; // 對應的uclass id const struct udevice_id *of_match; //用于和device tree里面的設備節點匹配 (*bind) // 用于綁定目標設備到該driver中 (*probe) // 用于probe目標設備,激活 (*remove) // 用于remove目標設備。禁用 (*unbind) // 用于解綁目標設備到該driver中 (*ofdata_to_platdata) // probe之前,解udevice的dts節點,轉化成udevice的數據 (*child_post_bind) // 如果目標設備的一個子設備被綁定之后,調用 (*child_pre_probe) // 在目標設備的一個子設備被probe之前,調用 (*child_post_remove) // 在目標設備的一個子設備被remove之后,調用 int priv_auto_alloc_size; //需要分配多少空間作為其udevice的私有數據 int platdata_auto_alloc_size; //需要分配多少空間作為其udevice的平臺數據 int per_child_auto_alloc_size; //每個子設備需要多少私有數據 int per_child_platdata_auto_alloc_size; //每個子設備需要多少平臺數據 const void *ops; // 操作集,提供給uclass用,格式具體由uclass決定 uint32_t flags; // 一些標志位 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看