1. 程式人生 > >基於Device tree機制的驅動編寫

基於Device tree機制的驅動編寫

前言

Device Tree是一種用來描述硬體的資料結構,類似板級描述語言,起源於OpenFirmware(OF)。在目前廣泛使用的Linux kernel 2.6.x版本中,對於不同平臺、不同硬體,往往存在著大量的不同的、移植性差的板級描述程式碼,以達到對這些不同平臺和不同硬體特殊適配的需求。但是過多的平臺、過的的不同硬體導致了這樣的程式碼越來越多,最終引發了Linux創始人Linus的不滿,以及強烈呼籲改變。Device Tree的引入給驅動適配帶來了很大的方便,一套完整的Device Tree可以將一個PCB擺在你眼前。Device Tree可以描述CPU,可以描述時鐘、中斷控制器、IO控制器、SPI匯流排控制器、I2C控制器、儲存裝置等任何現有驅動單位。對具體器件能夠描述到使用哪個中斷,記憶體對映空間是多少等等。

關於Device Tree的資料結構和詳細使用方法,請大家檢視宋寶華老師的一篇部落格:

1 基於Device Tree機制核心的驅動開發—例項講解

這個章節,作者來講講基於Linux-3.2.X之後使用device tree機制的核心的驅動開發案例。本文的驅動開發案例是作者工作期間親自寫的鍵盤驅動程式碼。CPU平臺使用的是NXP(freescale)的i.MX6ul。概要資訊描述如下:

            硬體平臺:NXP(freescale)—i.MX6ul

            軟體開發平臺:Ubuntu-12.04

           核心版本:Linux-3.14.38

            編譯環境:yocto project

1.1 基於Device Tree機制的驅動開發—系統如何載入和解析dtb檔案

基於Device Tree機制的驅動開發,在驅動當中所使用到的硬體資源都在對應的CPU平臺的dts檔案上進行配置,然後編譯生成dtb檔案,放在u-boot分割槽之後,核心分割槽之前。這裡順便講一下,核心是如何解析dtb檔案的。其大致過程如下:

系統上電啟動之後,u-boot載入dtb,通過u-boot和Linux核心之間的傳參操作將dtb檔案傳給核心,然後核心解析dtb檔案,根據device tree中的配置(dtb檔案)去初始化裝置的CPU管腳、各個外設的狀態。device tree中的配置主要是起到了初始化硬體資源的作用,後期可以在驅動中修改裝置的硬體資源的狀態,比如在device tree中初始化某個GPIO的管腳為上拉狀態,可以在驅動載入之後修改這個管腳的狀態。

1.2 基於Device Tree機制的驅動開發—dts檔案的配置和編譯

本節開始以具體的驅動例子講解如何在驅動開發中配置dts檔案。這裡使用i.MX6ul平臺下的矩陣鍵盤驅動中使用到的幾個GPIO口講解如何配置dts檔案和編譯。本次講解案例用於編譯驅動的核心是Linux-3.14.38。首先我們先來看看如何在核心中找到自己相應CPU平臺的dts檔案:

1.dts檔案位於核心的arch/arm/boot/dts/$(board).dts,其中的$(board)指的是對應的CPU平臺,比如i.MX6ul平臺的dts檔案如下:

imx6ul/linux-3.14.38-v2$ vim arch/arm/boot/dts/imx6ul-14x14-evk.dts(部分內容)

  1. #include <dt-bindings/input/input.h>
  2. #include "imx6ul.dtsi"
  3. / {  
  4.     model = "Freescale i.MX6 UltraLite NewLand Board";  
  5.     compatible = "fsl,imx6ul-14x14-evk""fsl,imx6ul";  
  6.     chosen {  
  7.         stdout-path = &uart1;  
  8.     };  
  9.     memory {  
  10.         reg = <0x800000000x20000000>;  
  11.     };  
  12.     pxp_v4l2 {  
  13.         compatible = "fsl,imx6ul-pxp-v4l2""fsl,imx6sx-pxp-v4l2""fsl,imx6sl-pxp-v4l2";  
  14.         status = "okay";  
  15.     };  
  16.     keyboard {  
  17.               compatible = "max-keypad";  
  18.               pinctrl-names = "default";  
  19.               pinctrl-0 = <&pinctrl_keypad>;  
  20.               in-gpios = <&gpio23 GPIO_ACTIVE_HIGH>,      //key_in0
  21.                          <&gpio24 GPIO_ACTIVE_HIGH>,      //key_in1
  22.                          <&gpio25 GPIO_ACTIVE_HIGH>;      //key_in2
  23.               out-gpios = <&gpio26 GPIO_ACTIVE_HIGH>,    //key_out0
  24.                           <&gpio22 GPIO_ACTIVE_HIGH>,    //key_out1
  25.                           <&gpio27 GPIO_ACTIVE_HIGH>,    //key_out2
  26.                           <&gpio425 GPIO_ACTIVE_HIGH>,   //key_out3
  27.                           <&gpio426 GPIO_ACTIVE_HIGH>;   //key_out4
  28.                           status = "okay";  
  29.           };  
  30. };  
  31. &cpu0 {  
  32.     arm-supply = <&reg_arm>;  
  33.     soc-supply = <&reg_soc>;  
  34. };  
  35. &clks {  
  36.     assigned-clocks = <&clks IMX6UL_CLK_PLL4_AUDIO_DIV>;  
  37.     assigned-clock-rates = <786432000>;  
  38. };  
  39. &tsc {  
  40.     pinctrl-names = "default";  
  41.     pinctrl-0 = <&pinctrl_tsc>;  
  42.     status = "okay";  
  43.     xnur-gpio = <&gpio130>;  
  44.     measure_delay_time = <0xffff>;  
  45.     pre_charge_time = <0xfff>;  
  46. };  
  47. &gpmi {  
  48.     pinctrl-names = "default";  
  49.     pinctrl-0 = <&pinctrl_gpmi_nand_1>;  
  50.     status = "okay";  
  51.     nand-on-flash-bbt;  
  52. };  
  53. &lcdif {  
  54.     pinctrl-names = "default";  
  55.     pinctrl-0 = <&pinctrl_lcdif_dat  
  56.              &pinctrl_lcdif_ctrl>;  
  57.     lcd_reset = <&gpio314 GPIO_ACTIVE_HIGH>;  
  58.     display = <&display0>;  
  59.     status = "okay";  
  60.     display0: display {  
  61.         bits-per-pixel = <16>;  
  62.         bus-width = <8>;  
  63.         display-timings {  
  64.             native-mode = <&timing0>;  
  65.             timing0: timing0 {  
  66.             clock-frequency = <9200000>;  
  67.             hactive = <240>;  
  68.             vactive = <320>;  
  69.             hfront-porch = <8>;  
  70.             hback-porch = <4>;  
  71.             hsync-len = <41>;  
  72.             vback-porch = <2>;  
  73.             vfront-porch = <4>;  
  74.             vsync-len = <10>;  
  75.             hsync-active = <0>;  
  76.             vsync-active = <0>;  
  77.             de-active = <1>;  
  78.             pixelclk-active = <0>;  
  79.             };  
  80.         };  
  81.     };  
  82. };  
  83. &iomuxc {  
  84.     pinctrl-names = "default";  
  85.     pinctrl-0 = <&pinctrl_uart1>;  
  86.     imx6ul-evk {  
  87.         pinctrl_uart1: uart1grp {  
  88.             fsl,pins = <  
  89.                 MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x1b0b1
  90.                 MX6UL_PAD_UART1_RX_DATA__UART1_DCE_RX 0x1b0b1
  91.             >;  
  92.         };  
  93.         pinctrl_tsc: tscgrp {  
  94.             fsl,pins = <  
  95.                 MX

    相關推薦

    i.mx6ul linux驅動開發—基於Device tree機制驅動編寫

    前言 Device Tree是一種用來描述硬體的資料結構,類似板級描述語言,起源於OpenFirmware(OF)。在目前廣泛使用的Linux kernel 2.6.x版本中,對於不同平臺、不同硬體,往往存在著大量的不同的、移植性差的板級描述程式碼,以達到對這些不同平臺和不同硬體特殊適配的需求

    基於Device tree機制驅動編寫

    前言 Device Tree是一種用來描述硬體的資料結構,類似板級描述語言,起源於OpenFirmware(OF)。在目前廣泛使用的Linux kernel 2.6.x版本中,對於不同平臺、不同硬體,往往存在著大量的不同的、移植性差的板級描述程式碼,以達到對這些不同平臺和不同硬體特殊適配的需求。但是

    轉:Linux設備樹(Device Tree)機制

    十六進制 交互 mic 映射 0.0.0.0 內容 14. 字節 讀取 目錄 1. 設備樹(Device Tree)基本概念及作用 2. 設備樹的組成和使用 2.1. DTS和DTSI 2.2. DTC 2.3. DTB 2.4. Bootloader 3

    Device Tree機制

    1. 裝置樹(Device  Tree)基本概念及作用 在核心原始碼中,存在大量對板級細節資訊描述的程式碼。這些程式碼充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目錄,對核心而言這些platform裝置、resource、i2c_board

    linux驅動編寫之poll機制

    linux驅動編寫之poll機制 1. poll情景描述:              以按鍵驅動為例進行說明,用阻塞的方式開啟按鍵驅動檔案/dev/buttons,     應

    基於tiny4412的Linux核心移植(支援device tree)(三)

    https://www.cnblogs.com/pengdonglin137/p/5146791.html 閱讀目錄(Content) 作者資訊 平臺簡介 注意 一、裝置樹反編譯 二、在u-boot列印資訊 三、開啟Linux核心啟動早期的log 四、在核心自解壓時dump記憶體 五、C

    基於tiny4412的Linux核心移植(支援device tree)(二)

    https://www.cnblogs.com/pengdonglin137/p/5143516.html 閱讀目錄(Content) 作者資訊 平臺簡介 步驟 回到頂部(go to top) 作者資訊 作者: 彭東林 郵箱:[email protected] QQ:4

    基於tiny4412的Linux核心移植(支援device tree)(一)

    https://www.cnblogs.com/pengdonglin137/p/5137941.html 閱讀目錄(Content) 作者資訊 平臺簡介 概述 步驟 回到頂部(go to top) 作者資訊 作者: 彭東林 郵箱:[email protected] Q

    Device Tree(八)裝置樹驅動模板

    /* * Copyright (c) 2018 LouisGou <[email protected]> * * This program is free software; you can redistribute it and/or modify * it un

    SPI裝置端驅動編寫----基於linux4.9 driver核心層

    【前序】 linux下寫驅動是站在巨人的肩膀上做開發,不用完全從頭做起,甚至你不需要懂SPI時序,照樣能寫出可用的驅動,原因是:控制器驅動一般晶片商早已寫好(linux4.9中針對xilinx zynqmp系列cpu是 drivers/spi/spi-cade

    vxWorks6.6下基於VxBus架構的Can控制器(sja1000t)驅動編寫

    vxWorks6.6下基於VxBus架構的Can控制器驅動編寫 1       VxBus下驅動的架構 Workbench3.0是VxWorks 6.x 的整合開發環境,而VxWorks 5.5是採用Tornado2.2 來進行開發的。Workbench3.

    linux驅動編寫之中斷處理

    類型 div 應該 urn 處理方式 com pre turn 申請 一、中斷 1、概念 學過單片機的應該非常清楚中斷的概念,也就是CPU在正常執行程序過程中,出現了突發事件(中斷事件),於是CPU暫停當前程序的執行,轉去處理突發事件。處理完畢後,CPU又返回被

    第四課:通過配置文件獲取對象(Spring框架中的IOC和DI的底層就是基於這樣的機制

    ted const dex generate stat clas name 必須 nbsp 首先在D盤創建一個文件hero.txt,內容為:com.hero.Hero(此處必須是Hero的完整路徑) 接下來是Hero類 package com.hero; publi

    設備樹(Device Tree

    輸出 mpat vim ring 開源協議 add kernel 匹配 dev 設備樹介紹: 設備樹是一個描述設備硬件資源的文件,該文件是由節點組成的樹形結構。如下: / { node1 { a-string-property = "A string"; a-string-

    ARM Linux 3.x的設備樹(Device Tree)宋寶華

    3rd else 命名 number 部分 kernel 傳統 rtc trigge 1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux郵件列表宣稱“this whole ARM thing is a f*

    Device Tree常用方法解析

    如何 單獨 範圍 沒有 lds 導致 節點和 nal include http://blog.csdn.net/airk000/article/details/21345159 Device Tree常用方法解析 Device Tree在Linux內核驅動中的使用源於201

    Linux I2C設備驅動編寫(一)

    ive AC ner 解決 args nali smb man lin http://blog.csdn.net/airk000/article/details/21345457 在Linux驅動中I2C系統中主要包含以下幾個成員: I2C adapter 即I2C適配

    Qualcomm platform, the commonly used parameters of charger and battery in device tree file

    inpu res alc max stc sum In nat TE 1 battery charging voltage : qcom,float-voltage-mv = <0x10fe>; 2 battery recharge threshold : qc

    基於 Sphinx 以純文字編寫富媒體專案文件的方法介紹

    文章目錄 簡介 環境 依賴安裝 安裝 Sphinx 安裝 PlantUML Sphinx 關鍵知識總結 使用方式 Sphinx 中的 reStructedText 常用語法 index.r

    DS18B20 驅動編寫

    對驅動工程師而言,時序分析的意思是讓晶片之間的訪問滿足晶片手冊中時序圖訊號的有效的先後順序、取樣建立時間、保持時間的要求,通過時序來達到資料傳輸和硬體控制的目的。 嵌入式開發平臺:mini2440 DS18B20 所用GPIO:S3C2410_GPF(3) 一、DS18B20 時序分析