Linux 內核層和 用戶層 配置 GPIO 引腳

来源:http://www.cnblogs.com/hutiann/archive/2017/11/03/7780185.html
-Advertisement-
Play Games

Linux BSP 開發的基礎就是和GPIO打交道, 下麵總結下這幾天對某家開發板的GPIO控制的知識。 公司的開發板用的是 DTB 模式 ,首先,進入 dts,dtsi文件查看關於GPIO 的模塊。 可以看到 GPIO 節點 掛在 SOC node 下 ,手上這塊開發板 把GPIO分成了8個 ba ...


  Linux BSP 開發的基礎就是和GPIO打交道, 下麵總結下這幾天對某家開發板的GPIO控制的知識。

  公司的開發板用的是 DTB  模式 ,首先,進入 dts,dtsi文件查看關於GPIO 的模塊。

soc {
                .
                .
                .
        gpio0: gpio@****addr {
            compatible = "**********";
            reg = <0 0x****addr 0 0x50>;
            interrupts = <SPI 4 IRQ_TYPE_LEVEL_HIGH>;
            #gpio-cells = <2>;
            gpio-controller;
            gpio-ranges = <&pfc 0 0 16>;
            #interrupt-cells = <2>;
            interrupt-controller;
            clocks = <&cpg CPG_MOD 912>;
            power-domains = <*****>;
        };
               .
               .
               .

};

  可以看到 GPIO 節點 掛在 SOC node 下 ,手上這塊開發板 把GPIO分成了8個 bank  :  gpio0 - gpio7

    reg =<0 地址 0 長度> 

         #gpio-cells  =<2> 表示 要用2個cell描述一個 GPIO引腳 

    如 I2C中定義 :  pwd-gpios  = <&gpio6 7 GPIO_ACTIVE_HIGH>;

    表示 bank 6 的gpio  用 2個cell 描述  :7,GPIO_ACTIVE_HIGH (7表示bank 6 下的第七個引腳一般是 GP 6_07表示  ;GPIO_ACTIVE_HIGH則為高電平有效)     

    gpio-controller;  interrupt-controller; 表示 bank 0 下的引腳 既可以作為中斷引腳 ,也可以作為 通用的GPIO引腳 

         gpio-ranges = <&pfc 0 0 16>;  表示 bank 0下有16個 GPIO引腳 

 

   GPIO 使用 pinctrl 方式來驅動 ,pin control subsystem 會 :

    1. 枚舉所有可用的pin 腳   ,於是每個引腳就有的唯一的 ID (num) ,這個ID 很關鍵,對於以後的操作。

    

enum {
    PINMUX_RESERVED = 0,

    PINMUX_DATA_BEGIN,
    GP_ALL(DATA), /* add GP_0_1_DATA  ,GP_0_1_DATA..... */
    PINMUX_DATA_END,

#define F_(x, y)

.....
}

    2.管理 這些Pin腳的, 由於pin 可以復用 比如 SPI 和GPIO 復用一個pin腳 如:  GP2_08 / MISO,於是引申出 pin group 和 pin functon 兩個概念:

    i2c2_pins: i2c2 {
        groups = "i2c2_a";
        function = "i2c2";
    };

    在dts 中如上所示 ,其中 i2c2_a 在 pinctl 源碼中 如下所示,i2c的兩根引腳使用 GP5_0 ,GP5_4. 

static const unsigned int i2c2_a_pins[] = {
    /* SDA, SCL */
    GP_PIN(5, 0),GP_PIN(5, 4),
};

    function 如下 : 

struct sh_pfc_function {
    const char *name;
    const char * const *groups;
    unsigned int nr_groups;
};
#define SH_PFC_FUNCTION(n = i2c2)                \
    {                        \
        .name = #n,                \
        .groups = n##_groups,            \
        .nr_groups = ARRAY_SIZE(n##_groups),    \
    }

好了 ,基本概念就先寫這麼多  。

 

內核層配置 GPIO 

在 寫內核驅動的時候 如果希望配置某個GPIO引腳 , 可以在dts中 添加:  pwd-gpios  = <&gpio0 7 GPIO_ACTIVE_HIGH>;

 在 driver 代碼中 ,  需要包含 #include <linux/gpio.h>使用 : 

    gpio_id = of_get_named_gpio(your_driver->dev->of_node,"pwd-gpios", 0);

獲取 GP0_07的 ID號 ,然後申請 一個GPIO 操作對象。

    if (gpio_is_valid(gpio_id))  //判斷一個IO是否合法

      devm_gpio_request_one(&platform_device->dev, gpio_id,GPIOF_OUT_INIT_LOW, name);

設置GPIO的方向,如果是輸出同時設置電平:
    /* set as input or output, returning 0 or negative errno */
    int gpio_direction_input(unsigned gpio);
    int gpio_direction_output(unsigned gpio, int value);

獲取輸入引腳的電平:
    /* GPIO INPUT: return zero or nonzero */
    int gpio_get_value(unsigned gpio);

設置輸出: 
    void gpio_set_value(unsigned gpio, int value);

釋放申請的GPIO對象 

        void gpio_free(unsigned gpio);

將GPIO映射為IRQ中斷:
    /* map GPIO numbers to IRQ numbers */
    int gpio_to_irq(unsigned gpio);

    /* map IRQ numbers to GPIO numbers (avoid using this) */
    int irq_to_gpio(unsigned irq);

 設置GPIO IRQ中斷類型:

    set_irq_type(gpio_to_irq( gpio), IRQ_TYPE_EDGE_FALLING);

用戶層配置 GPIO 

需要確認  內核  menuconfig  中 Device Drivers -》  GPIO Support  設 y .

在 /sys/class/gpio  目錄下如下所示 : 

root@salvator-x:/sys/class/gpio# ls
export         gpiochip361  gpiochip419  gpiochip453  gpiochip496
gpiochip357  gpiochip393  gpiochip437  gpiochip468  unexport

gpiochip 後面的數字 是每個bank 的基地址  也就是  GP0 對應 gpiochip468

那麼  GP0_07 的 ID 就是  468 + 7 ;(可能不同的內核版本,或者 開發板不一樣 )通過 :

root@salvator-x:/sys/class/gpio# echo 475 > export

會對應生成 gpio475 目錄 

root@salvator-x:/sys/class/gpio/gpio475# ls
active_low  device  direction  edge  power  subsystem  uevent  value

通過 

root@salvator-x:/sys/class/gpio/gpio475# echo 1 >value 
root@salvator-x:/sys/class/gpio/gpio475# echo 0 >value
root@salvator-x:/sys/class/gpio/gpio475# echo "in" > direction 
root@salvator-x:/sys/class/gpio/gpio475# echo "out" > direction 

來控制輸出輸入  ,電平高低 。 

 

最後,關於 Pinctrl 的內容還有太多要寫,就先寫到這把。。。。。

來不及寫 參考文檔了,具體是 結合 wowotech 和 公司的設備,要下班了。。。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在select...from...中嵌套select...from... ...
  • phpStudy Linux版&Win版同步上線 支持Apache/Nginx/Tengine/Lighttpd/IIS7/8/6 phpStudy for Linux 支持Apache/Nginx/Tengine/Lighttpd,支持php5.2/5.3/5.4/5.5切換 已經在centos- ...
  • 一、開始安裝 1)新建虛擬機 RHEL7.2 2)成功引導系統--開機出現此畫面 Install Red Hat EnterpriseLinux 7.2 安裝RHLE7.2 操作系統 Test this edia & install RedHat Enterprise Linux 7.2 測試安裝文 ...
  • 一、通過yum安裝vsftpd yum install -y vsftpd 二、修改vsftpd的配置文件 vi /etc/vsftpd/vsftpd.conf 修改配置文件如下:1.不允許匿名訪問 anonymous_enable=NO 2.允許使用本地帳戶進行FTP用戶登錄驗證 local_en ...
  • find ./ -name "*.sql" | awk '{ cmd_str="\""$0"\""; print cmd_str}' | xargs grep -rn IFUSEDESTROUTE dir /v8t/ngtf/server/trade_server:$cdir:$cwdbreak c ...
  • init 6是重啟或者rebootinit 0是關機shutdown三種網路模式:橋接模式:虛擬機和宿主機是兄弟關係,統一由宿主機連接的路由器分發ipNAT模式:虛擬機和宿主機是父子關係,宿主機的vmnet8虛擬網卡充當路由器分發ip 由於虛擬網卡也要占用一個ip所以虛擬網關是從2開始的僅主機模式: ...
  • 問題導讀: 1.zookeeper在kafka的作用是什麼? 2.kafka中幾乎不允許對消息進行“隨機讀寫”的原因是什麼? 3.kafka集群consumer和producer狀態信息是如何保存的? 4.partitions設計的目的的根本原因是什麼? 一、入門 1、簡介 Kafka is a d ...
  • using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;u ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...