成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux 設備和驅動的相遇

系統 Linux
所謂設備信息集合,就是根據不同的外設尋找各自的外設信息,我們知道一個完整的開發板有 CPU 和各種控制器(如 I2C 控制器、SPI 控制器、DMA 控制器等),CPU 和控制器可以統稱為 SOC,除此之外還有各種外設 IP,如 LCD、HDMI、SD、CAMERA 等。

 [[355454]]

本文轉載自微信公眾號「人人都是極客」,作者布道師Peter 。轉載本文請聯系人人都是極客公眾號。  

一個開發板

這一節結合設備信息集合的詳細講解來認識一下設備和驅動是如何綁定的。所謂設備信息集合,就是根據不同的外設尋找各自的外設信息,我們知道一個完整的開發板有 CPU 和各種控制器(如 I2C 控制器、SPI 控制器、DMA 控制器等),CPU 和控制器可以統稱為 SOC,除此之外還有各種外設 IP,如 LCD、HDMI、SD、CAMERA 等,如下圖:

我們看到一個開發板有很多的設備,這些設備是如何一層一層展開的呢?設備和驅動又是如何綁定的呢?我們帶著這些疑問進入本節的主題。

各級設備的展開

內核啟動的時候是一層一層展開地去尋找設備,設備樹之所以叫設備樹也是因為設備在內核中的結構就像樹一樣,從根部一層一層的向外展開,為了更形象的理解來看一張圖:

大的圓圈中就是我們常說的 soc,里面包括 CPU 和各種控制器 A、B、I2C、SPI,soc 外面接了外設 E 和 F。IP 外設有具體的總線,如 I2C 總線、SPI 總線,對應的 I2C 設備和 SPI 設備就掛在各自的總線上,但是在 soc 內部只有系統總線,是沒有具體總線的。

第一節中講了總線、設備和驅動模型的原理,即任何驅動都是通過對應的總線和設備發生聯系的,故雖然 soc 內部沒有具體的總線,但是內核通過 platform 這條虛擬總線,把控制器一個一個找到,一樣遵循了內核高內聚、低耦合的設計理念。下面我們按照 platform 設備、i2c 設備、spi 設備的順序探究設備是如何一層一層展開的。

1.展開 platform 設備

上圖中可以看到紅色字體標注的 simple-bus,這些就是連接各類控制器的總線,在內核里即為 platform 總線,掛載的設備為 platform 設備。下面看下 platform 設備是如何展開的。

還記得上一節講到在內核初始化的時候有一個叫做 init_machine() 的回調函數嗎?如果你在板級文件里注冊了這個函數,那么在系統啟動的時候這個函數會被調用,如果沒有定義,則會通過調用 of_platform_populate() 來展開掛在“simple-bus”下的設備,如圖(分別位于 kernel/arch/arm/kernel/setup.c,kernel/drivers/of/platform.c):

這樣就把 simple-bus 下面的節點一個一個的展開為 platform 設備。

2.展開 i2c 設備

有經驗的小伙伴知道在寫 i2c 控制器的時候肯定會調用 i2c_register_adapter() 函數,該函數的實現如下(kernel/drivers/i2c/i2c-core.c):

注冊函數的最后有一個函數 of_i2c_register_devices(adap),實現如下:

of_i2c_register_devices()函數中會遍歷控制器下的節點,然后通過of_i2c_register_device()函數把 i2c 控制器下的設備注冊進去。

3.展開 spi 設備

spi 設備的注冊和 i2c 設備一樣,在 spi 控制器下遍歷 spi 節點下的設備,然后通過相應的注冊函數進行注冊,只是和 i2c 注冊的 api 接口不一樣,下面看一下具體的代碼(kernel/drivers/spi/spi.c):

當通過 spi_register_master 注冊 spi 控制器的時候會通過 of_register_spi_devices 來遍歷 spi 總線下的設備,從而注冊。這樣就完成了 spi 設備的注冊。

各級設備的展開

學到這里相信應該了解設備的硬件信息是從設備樹里獲取的,如寄存器地址、中斷號、時鐘等等。接下來我們一起看下這些信息在設備樹里是怎么記錄的,為下一節動手定制開發板做好準備。

1.reg 寄存器

我們先看設備樹里的 soc 描述信息,紅色標注的代表著寄存器地址用幾個數據量來表述,綠色標注的代表著寄存器空間大小用幾個數據量來表述。圖中的含義是中斷控制器的基地址是 0xfec00000,空間大小是 0x1000。如果 address-cells 的值是 2 的話表示需要兩個數量級來表示基地址,比如寄存器是 64 位的話就需要兩個數量級來表示,每個代表著 32 位的數。

2.ranges 取值范圍

ranges 代表了 local 地址向 parent 地址的轉換,如果 ranges 為空的話代表著與 cpu 是 1:1 的映射關系,如果沒有 range 的話表示不是內存區域。

 

責任編輯:武曉燕 來源: 人人都是極客
相關推薦

2017-02-10 15:32:47

2017-11-06 17:16:55

Linux設備驅動并發控制

2023-05-15 08:58:41

塊設備驅動Linux

2021-11-29 07:55:45

Linux GPIO Linux 系統

2017-11-16 14:46:58

Linuxplatform總線驅動設備

2023-05-12 07:27:24

Linux內核網絡設備驅動

2022-05-10 08:49:46

設備驅動Linux

2016-12-15 14:55:31

Linux定時延時

2009-12-23 13:17:36

Linux設備驅動

2011-01-10 18:21:38

linux編寫程序

2016-11-11 13:07:18

LinuxWindows設備驅動模型

2021-04-12 12:00:13

Linux運維Linux系統

2009-12-07 09:39:04

Linux設備驅動硬件通信

2022-01-17 11:50:38

Linux CPULinux 系統

2010-07-19 10:05:52

ibmdwLinux

2017-03-01 16:40:12

Linux驅動技術設備阻塞

2017-11-07 20:12:05

Linux音頻設備ALSA

2021-11-16 06:55:36

Linux字符設備

2018-11-26 08:45:29

Linux驅動程序命令

2025-04-11 08:35:00

漏洞網絡安全終端安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区免费视频 | 日韩欧美视频在线 | 日韩欧美在线播放 | 91高清在线视频 | 亚洲久久| 国产精品黄视频 | 欧美在线视频一区二区 | 日韩综合一区 | 精精国产xxxx视频在线播放 | 欧美二区乱c黑人 | 日韩资源 | 亚洲综合在线视频 | 亚洲福利av | 亚洲一二三区av | 日韩成人在线免费视频 | 国产在线一区二区 | 国产视频久久久 | 精品国产鲁一鲁一区二区张丽 | 国产欧美日韩一区二区三区在线观看 | 9999精品视频 | av黄色网| 国产一区欧美一区 | 999国产精品视频 | 偷拍亚洲色图 | 亚洲国产一区二区在线 | 一级大片免费 | 欧美成人精品一区二区三区 | 中文字幕一二三 | 91精品国产综合久久久动漫日韩 | 精品一区精品二区 | 自拍中文字幕 | 日韩手机在线视频 | 亚洲精品888 | 国产成人久久精品一区二区三区 | 亚洲天堂男人的天堂 | 亚洲精品在线看 | 欧美一区二区三区在线观看视频 | 久久久久久久网 | 日韩三级一区 | 美女视频一区 | 国产视频久久久 |