国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Linux驅動 | 手寫一個設備樹使用的實例

系統 Linux
設備樹是每一個Linux驅動工程師都必須掌握的一個知識點,有很多之前做單片機的朋友剛接觸Linux驅動時,會一臉懵!

一、前言

設備樹是每一個Linux驅動工程師都必須掌握的一個知識點,有很多之前做單片機的朋友剛接觸Linux驅動時,會一臉懵!

其實設備樹的使用并沒有大家想像的那么復雜,對于大部分工程師來說,只要會修改即可。

很多粉絲留言說,希望彭老師提供一個設備樹到驅動解析的實例。

必須安排!

在學習設備樹之前,大家一定要搞清楚什么是platform總線,請詳細學習下面這篇文章:

《手把手教Linux驅動10-platform總線詳解》

關于設備樹理論部分內容請學習下面這篇文章:

《手把手教linux驅動11-linux設備驅動統一模型》

關于驅動基礎文章,可以去B站學習一口君的入門視頻:

《從學Linux驅動入門視頻》

https://www.bilibili.com/video/BV1d5411A7VJ?spm_id_from=333.999.0.0

有了這些基礎知識后,我們就可以來編寫一個設備樹的實例,

下面彭老師就給大家講解如何自己添加一個設備樹節點,并如何在驅動中提取出設備樹的信息。

老規矩,代碼從0開始編寫,并且全部驗證通過,并分享給大家。

二、測試平臺

本次測試在開發板上操作,操作環境如下:

1. 編譯環境

  1. ubuntu 16.04 

2. 交叉編譯工具

  1. root@ubuntu:/home/peng/linux-3.14# arm-none-linux-gnueabi-gcc -v 
  2. Using built-in specs. 
  3. COLLECT_GCC=arm-none-linux-gnueabi-gcc 
  4. COLLECT_LTO_WRAPPER=/home/peng/toolchain/gcc-4.6.4/bin/../libexec/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/lto-wrapper 
  5. Target: arm-arm1176jzfssf-linux-gnueabi 
  6. ……………… 
  7. gcc version 4.6.4 (crosstool-NG hg+default-2685dfa9de14 - tc0002) 

3. 開發板

  1. 開發板:fs4412 
  2. soc:exynos4412 

4. 內核版本

  1. Linux kernel 3.14.0 

三、內核解析設備樹一般過程

系統啟動后,uboot會從網絡或者flash、sd卡中讀取設備樹文件(具體由uboot命令給出),

引導linux內核啟動后,會把設備樹鏡像保存到的內存地址傳遞給Linux內核,Linux內核會解析設備樹鏡像,從設備樹中提取硬件信息并逐一初始化。

其中設備樹信息會被轉換成struct platform_device類型變量。

而驅動要解析設備樹,必須定義 struct platform_driver類型結構體變量,并通過函數platform_driver_register()注冊。

這兩者都會注冊到platform總線,當驅動和設備樹節點匹配成功后,就調用 struct platform_driver中.probe方法。

其中設備樹節點會封裝在struct device_node結構體變量中 各個屬性信息會封裝在 struct property結構體變量中, 他們與struct platform_device結構體之間關系如下:

四、驅動架構

以下是一口君編寫的驅動架構,

我們只需要將測試代碼填充到hello_probe()中即可:

  1. static int hello_probe(struct platform_device *pdev) 
  2.  printk("match ok \n"); 
  3.   
  4. //解析代碼編寫 
  5.  return 0; 
  6. static  int hello_remove(struct platform_device *pdev) 
  7.  printk("hello_remove \n"); 
  8.  return 0; 
  9. static struct of_device_id beep_table[] = { 
  10.   {.compatible = "yikoulinux"}, 
  11. }; 
  12. static struct platform_driver hello_driver = 
  13.  .probe = hello_probe, 
  14.  .driver.name = "duang"
  15.  .remove = hello_remove, 
  16.  .driver = { 
  17.   .name = "yikoupeng"
  18.   .of_match_table = beep_table, 
  19.  }, 
  20. }; 
  21. static int hello_init(void) 
  22.  printk("hello_init \n"); 
  23.  return platform_driver_register(&hello_driver); 
  24. static void hello_exit(void) 
  25.  printk("hello_exit \n"); 
  26.  platform_driver_unregister(&hello_driver); 
  27.  return
  28. MODULE_LICENSE("GPL"); 
  29. module_init(hello_init); 
  30. module_exit(hello_exit); 

五、設備樹節點

下面是給出的設備樹信息:

  1. yikou_node{ 
  2.        compatible = "yikoulinux"
  3.        reg = <0x114000a0 0x4 0x139D0000 0x20>; 
  4.        reg-names = "peng"
  5.        interrupt-parent=<&gpx1>; 
  6.        interrupts =<1 2>,<2  2>; 
  7.     
  8.        csm_gpios=<&gpx2 3 0 &gpx2 4 0 &gpx2 5 0 &gpx2 6 0>; 
  9.         
  10.        crl0_gpio=<&gpx0 5 0>; 
  11.        crl1_gpio=<&gpx0 6 0>; 
  12.        rst_gpio=<&gpx0 7 0>; 
  13.        cfg_gpio=<&gpx0 4 0>; 
  14.   
  15.  phy_ref_freq = <26000>;  /* kHz */   
  16.  suspend_poweroff; 
  17.   
  18.  clock-names = "xusbxti"
  19.   "otg"
  20.  yikou_node { 
  21.   compatible = "leadcore,dsi-panel"
  22.   panel_name = "lcd_rd_rm67295"
  23.   refresh_en = <1>; 
  24.   bits-per-pixel = <32>;  
  25.  }; 
  26.    }; 

其中包括常見reg、中斷、整型值、bool值、字符串、子節點、時鐘等屬性。

一定要注意,很多屬性的給出會因為使用的SOC平臺的不同有所差異, 下面介紹下GPIO和中斷編寫原理:

1. GPIO

gpio信息的給出有以下兩種方法:

  1. csm_gpios=<&gpx2 3 0 &gpx2 4 0 &gpx2 5 0 &gpx2 6 0>; 
  1. crl0_gpio=<&gpx0 5 0>; 
  2. crl1_gpio=<&gpx0 6 0>; 
  3. rst_gpio=<&gpx0 7 0>; 
  4. cfg_gpio=<&gpx0 4 0>; 

第1種是公用同一個名字,第2種是每一個gpio單獨使用1個名字。

gpio需要指明父節點,關于gpio父節點的說明下說明文檔(通常linux-3.14\Documentation下有關于該內核版本的一些模塊說明,很重要):

  1. linux-3.14\Documentation\devicetree\bindings\gpio.txt 
  1. For example, the following could be used to describe gpios pins to use 
  2. as chip select lines; with chip selects 0, 1 and 3 populated, and chip 
  3. select 2 left empty: 
  4.  
  5.  gpio1: gpio1 { 
  6.   gpio-controller 
  7.    #gpio-cells = <2>; 
  8.  }; 
  9.  gpio2: gpio2 { 
  10.   gpio-controller 
  11.    #gpio-cells = <1>; 
  12.  }; 
  13.  [...] 
  14.   chipsel-gpios = <&gpio1 12 0>, 
  15.     <&gpio1 13 0>, 
  16.     <0>, /* holes are permitted, means no GPIO 2 */ 
  17.     <&gpio2 2>; 
  18. Note that gpio-specifier length is controller dependent.  In the 
  19. above example, &gpio1 uses 2 cells to specify a gpio, while &gpio2 
  20. only uses one. 
  21.  
  22. gpio-specifier may encode: bank, pin position inside the bank, 
  23. whether pin is open-drain and whether pin is logically inverted. 
  24. Exact meaning of each specifier cell is controller specific, and must 
  25. be documented in the device tree binding for the device. 
  26.  
  27. Example of the node using GPIOs: 
  28.  
  29.  node { 
  30.   gpios = <&qe_pio_e 18 0>; 
  31.  }; 
  32.  
  33. In this example gpio-specifier is "18 0" and encodes GPIO pin number, 
  34. and empty GPIO flags as accepted by the "qe_pio_e" gpio-controller. 

翻譯總結成如下幾點:

gpio父節點需要包含屬性

  1. gpio-controller、    表示是gpi控制器 
  2. #gpio-cells = <2>;    表示子節點包括2個屬性 

對于子節點是2個屬性的函數 比如:

  1. gpios = <&qe_pio_e 18 0>; 

父節點是qe_pio_e 其中18表示GPIO pin值,就是gpio下面管理的pin腳序號,該pin值一般就需要查詢用戶手冊&電路圖。

2. 中斷

中斷屬性節點如下:

  1. interrupt-parent=<&gpx1>; 
  2.   interrupts =<1 2>,<2  2>; 

其中

  1. interrupt-parent=<&gpx1>;: 該中斷信號所述的中斷控制器 
  2. interrupts =<1 2>,<2  2>;  :描述中斷屬性,其中<>中第一個值表示該中斷所述中斷控制器index,第二個值表示中斷觸發方式 

中斷子節點格式如下:

  1. linux-3.14\Documentation\devicetree\bindings\gpio.txt 
  1. Example of a peripheral using the GPIO module as an IRQ controller: 
  2.  
  3.  funkyfpga@0 { 
  4.   compatible = "funky-fpga"
  5.   ... 
  6.   interrupt-parent = <&gpio1>;   #父節點 
  7.   interrupts = <4 3>;     #節點屬性 
  8.  }; 

中斷子節點說明文檔如下:

  1. linux-3.14\Documentation\devicetree\bindings\interrupt-controller\interrupts.txt 
  1. b) two cells 
  2. ------------ 
  3. The #interrupt-cells property is set to 2 and the first cell defines the 
  4. index of the interrupt within the controller, while the second cell is used 
  5. to specify any of the following flags: 
  6.   - bits[3:0] trigger type and level flags 
  7.       1 = low-to-high edge triggered          上升沿 
  8.       2 = high-to-low edge triggered    下降沿 
  9.       4 = active high level-sensitive      高電平有效 
  10.       8 = active low level-sensitive          低電平有效 

我們所填寫的中斷父節點gpx1定義如下(該文件由三星廠家出廠定制好):

  1. linux-3.14\arch\arm\boot\dts\exynos4x12-pinctrl.dtsi 
  1. gpx1: gpx1 { 
  2.  gpio-controller;        #gpio控制器 
  3.  #gpio-cells = <2>;      #子節點有2個屬性 
  4.  
  5.  interrupt-controller;  #中斷控制器 
  6.  interrupt-parent = <&gic>;    #父節點gic 
  7.  interrupts = <0 24 0>, <0 25 0>, <0 26 0>, <0 27 0>,   #子節點屬性約束 
  8.        <0 28 0>, <0 29 0>, <0 30 0>, <0 31 0>; 
  9.  #interrupt-cells = <2>; 
  10. }; 

可見三星的exynos4412平臺中gpx1,既可以做gpio控制器又可以做中斷控制器,而gpx1作為中斷控制器則路由到gic上。其中interrupts屬性說明如下:

  1. linux-3.14\Documentation\devicetree\bindings\arm\gic.txt 

  1. Main node required properties: 
  2.  
  3. - compatible : should be one of
  4.  "arm,gic-400" 
  5.  "arm,cortex-a15-gic" 
  6.  "arm,cortex-a9-gic" 
  7.  "arm,cortex-a7-gic" 
  8.  "arm,arm11mp-gic" 
  9. - interrupt-controller : Identifies the node as an interrupt controller 
  10. - #interrupt-cells : Specifies the number of cells needed to encode an 
  11.   interrupt source.  The type shall be a <u32> and the value shall be 3. 
  12.  
  13.   The 1st cell is the interrupt type; 0 for SPI interrupts, 1 for PPI 
  14.   interrupts. 
  15.  
  16.   The 2nd cell contains the interrupt number for the interrupt type. 
  17.   SPI interrupts are in the range [0-987].  PPI interrupts are in the 
  18.   range [0-15]. 
  19.  
  20.   The 3rd cell is the flags, encoded as follows: 
  21.  bits[3:0] trigger type and level flags. 
  22.   1 = low-to-high edge triggered 
  23.   2 = high-to-low edge triggered 
  24.   4 = active high level-sensitive 
  25.   8 = active low level-sensitive 
  26.  bits[15:8] PPI interrupt cpu mask.  Each bit corresponds to each of 
  27.  the 8 possible cpus attached to the GIC.  A bit set to '1' indicated 
  28.  the interrupt is wired to that CPU.  Only valid for PPI interrupts. 

翻譯總結:

  1. interrupts = <0 24 0> 

第1個0 表示該中斷是SPI類型中斷,如果是1表示PPI類型中斷

24表示中斷號(通過查詢電路圖和datasheet獲得)

第三個0表示中斷觸發方式

再強調一遍 不同的平臺gpio、中斷控制器管理可能不一樣,所以填寫方法可能會有差異,不可教條

六、驅動提取設備樹信息方法

驅動解析代碼與設備樹節點之間關系如下,代碼與屬性用相同顏色框出:

of開頭的函數請參考《手把手教linux驅動11-linux設備驅動統一模型》

七、編譯(ubuntu中操作)

驅動編譯:

注意,內核必須提前編譯好

設備樹編譯:

編譯設備樹命令,各個廠家的SDK都不盡相同,本例制作參考。

除此之外驅動模塊文件、設備樹文件如何導入給開發板,差別也比較大,本文不再給出步驟。

八、加載模塊(開發板上操作)

加載模塊后執行結果如下:

  1. [root@peng test]# insmod driver.ko  
  2. [   26.880000] hello_init  
  3. [   26.880000] match ok  
  4. [   26.880000] mem_res1 : [0x114000a0]  mem_res2:[0x139d0000]  
  5. [   26.885000] irq_res1 : [168]  irq_res2:[169]  
  6. [   26.890000] mem_resp:[114000a0] 
  7. [   26.890000]  
  8. [   26.895000] phy_ref_freq:26000 
  9. [   26.900000] suspend_poweroff [true
  10. [   26.900000] suspend_poweroff_test [false
  11. [   26.900000]  
  12. [   26.905000] csm_gpios :[231][232][233][234] 
  13. [   26.910000] CTL0:[217] CTL1:[218] RST:[219] CFG:[216] 
  14. [   26.915000] bits_per_pixel:32 
  15. [   26.920000] panel_name:lcd_rd_rm67295 
  16. [   26.925000] refresh_en [true

其中打印的信息就是最終我們解析出的設備樹里的硬件信息, 我們就可以根據這些信息進行相關資源申請、初始化。

同時設備樹中的信息,會以文件節點形式創建在一下目錄中:

本文轉載自微信公眾號「一口Linux」

 

責任編輯:姜華 來源: 一口Linux
相關推薦

2022-05-10 08:49:46

設備驅動Linux

2022-03-09 09:43:01

工具類線程項目

2021-02-22 17:17:38

Proxy緩存代碼

2022-10-31 08:27:53

Database數據數據庫

2021-10-25 16:01:01

Linux設備樹字符串

2020-12-03 08:59:06

Linux設備驅動

2021-12-07 06:55:17

節流函數Throttle

2021-03-18 08:04:54

AQS工具CAS

2020-11-02 08:19:18

RPC框架Java

2017-10-24 17:03:48

Linux驅動程序編譯

2021-07-30 14:55:06

Linuxkernel設備樹

2022-01-26 15:20:00

配置微服務架構

2009-07-15 13:41:00

JDBC實例

2017-02-10 15:32:47

2023-05-15 08:58:41

塊設備驅動Linux

2017-11-06 17:16:55

Linux設備驅動并發控制

2021-04-12 12:00:13

Linux運維Linux系統

2018-01-22 09:56:24

2017-03-02 13:31:02

監控系統

2021-12-09 10:57:19

防抖函數 Debounce
點贊
收藏

51CTO技術棧公眾號

麻豆av在线免费观看| 欧美日韩一区二区三区| 国产三线在线| 欧美日韩免费精品| 欧美一区二区三区思思人| 丝袜亚洲另类欧美综合| 激情黄产视频在线免费观看| 国产一二三四区在线观看| 亚洲欧美日韩成人| 91在线国产福利| 草草视频在线一区二区| 东北一级毛片| 亚洲iv一区二区三区| 在线不卡中文字幕播放| 美女视频免费一区| 91麻豆精品国产综合久久久| 二区中文字幕| 国产一区二区中文字幕免费看| 亚洲成人激情在线| 波多野结衣中文字幕一区| 国产精品一区二区三区美女| 中文在线资源在线| 欧洲精品在线一区| 亚洲色在线视频| 国产女人aaa级久久久级| 精品视频黄色| 在线观看免费高清完整| 亚洲精品偷拍视频| 97精品国产97久久久久久免费 | 中文字幕欧美国产| 国内精品视频在线观看| 在线看av的网址| 久久久久久久久久久久久国产| 欧美乱妇高清无乱码| 精品久久久一区| 人禽交欧美网站| 五月亚洲婷婷| av在线收看| 欧美激情视频免费看| 日韩av手机在线看| 欧美一卡二卡三卡| 国产人成一区二区三区影院| 国产精品成人一区二区网站软件| 欧美va在线| 在线免费观看av网站| 正在播放国产精品| 日韩美女视频在线观看| 欧美成人精品福利| 中文字幕日韩一区| 老牛国产精品一区的观看方式| 国产精品亚洲一区二区在线观看 | 色在线视频网| 三年中国国语在线播放免费| 国产成人看片| 日韩中文字幕国产精品| 欧美日韩在线一区| 成人精品在线视频观看| 68国产成人综合久久精品| 亚洲欧洲自拍| 99热在线网站| 国产91porn| 亚洲一区久久久| 久久久精品久久久| 911精品国产一区二区在线| 国产欧美精品一区二区色综合 | 亚洲男人的天堂在线观看| 午夜在线视频观看日韩17c| 超碰cao国产精品一区二区| 国产精品扒开做爽爽爽的视频| 美女网站色免费| 午夜精品电影在线观看| 国产精品免费看久久久香蕉| 一区二区亚洲精品国产| 在线中文字幕一区二区| 国产欧美一区二区精品性色 | 深夜福利在线看| 成年网站在线免费观看| 激情小说综合网| 91精品国产777在线观看| 亚洲国产精品一区二区三区| 午夜视频在线观看一区二区| 99re这里只有精品首页| 青青青爽久久午夜综合久久午夜| 色一区二区三区四区| 激情不卡一区二区三区视频在线| 少女频道在线观看高清| 在线电影av| 国产色视频在线播放| 欧美人与动牲交xxxxbbbb| 国产精品嫩草在线观看| 日韩暖暖在线视频| 久久精品久久久久久| 亚洲成人aaa| 欧美午夜一区二区| 亚洲一本大道在线| 久久精品亚洲国产奇米99| 久久精品国产免费看久久精品| 亚洲一本视频| 成人精品中文字幕| 欧美日韩另类图片| av在线成人| 电影亚洲精品噜噜在线观看| 国产黄色在线观看| 国产一级在线| 一个人免费视频www在线观看| 日韩欧美国产片| 免费av手机在线观看| 黄色www在线观看| 日本视频精品一区| 精品国产_亚洲人成在线| 95av在线视频| 成人高清视频观看www| 欧洲亚洲女同hd| 九九热99久久久国产盗摄| 亚洲丝袜一区在线| 精品夜色国产国偷在线| 欧美精品一区二区在线播放 | 国产成人精品日本亚洲11| 成人日韩av在线| 国产精品日韩在线观看| 欧洲中文字幕国产精品| 韩国精品久久久999| 欧美大学生性色视频| 久久艳片www.17c.com| 最近日韩中文字幕中文| 一本色道久久88综合亚洲精品ⅰ| 亚洲精品资源在线| 日韩精品在线视频美女| 亚洲国产一区二区三区四区| 日韩精品一区二区三区在线观看| 欧美男女性生活在线直播观看| 日本韩国欧美一区| 欧美在线观看视频在线| 欧美日韩精品欧美日韩精品| 欧美片网站yy| 日韩精品自拍偷拍| 日韩电影在线观看永久视频免费网站 | 夜夜嗨av一区二区三区四区| 亚洲欧美精品suv| 亚洲天堂网在线观看| 亚洲欧美视频在线| 自拍视频国产精品| 美乳少妇欧美精品| 久久久久中文字幕2018| 欧美在线观看日本一区| 国产精品久久久久久搜索| 91九色视频导航| 精品中文字幕人| 日韩成人在线资源| 大片在线观看网站免费收看| 免费 成 人 黄 色| 天堂在线亚洲| 羞羞视频在线观看| 无遮挡动作视频在线观看免费入口| 欧美日韩视频在线播放| 理论片午夜视频在线观看| 黑人一区二区三区| 狠狠一区二区三区| 日韩系列欧美系列| 亚洲精品精选| 久久精品国产精品亚洲综合| 99久久久精品免费观看国产蜜| 国产精品成人免费精品自在线观看| 亚洲国产精品精华液网站| 欧美熟乱第一页| 精品亚洲一区二区三区四区五区 | 91丨porny丨最新| 国产精品视频一区二区三区不卡| 亚洲成人av电影在线| 欧美精品丝袜中出| 亚洲天堂第一页| 4p变态网欧美系列| 97超级在线观看免费高清完整版电视剧| 蜜桃精品久久久久久久免费影院 | 成人在线观看网站| 成人性生交大片免费看网站| 亚洲网站三级| 成人嘿咻视频免费看| 久久99伊人| 99国内精品久久| 亚洲一区二区高清| 欧美成人精精品一区二区频| 久久五月天综合| 国产欧美在线视频| 亚洲精品国产精品国自产观看| 3d动漫一区二区三区| 日韩黄色动漫| 黄色动漫在线| 福利一区三区| 午夜精品久久久久久久四虎美女版| 日韩在线一区二区| 久久精品视频在线看| 91福利视频网站| 中文字幕欧美国内| 国产日产欧美精品| 天堂а√在线中文在线| 国产无遮挡在线视频免费观看| 97人澡人人添人人爽欧美| 加勒比色综合久久久久久久久| 国产乱码精品|