1. 程式人生 > >Linux核心層和使用者層配置GPIO引腳

Linux核心層和使用者層配置GPIO引腳



Linux BSP 開發的基礎就是和GPIO打交道, 下面總結下這幾天對某家開發板的GPIO控制的知識。公司的開發板用的是 DTB  模式 ,首先,進入 dts,dtsi檔案檢視關於GPIO 的模組。

soc {
                .
                .
                .
        gpio0: [email protected]****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  目錄下如下所示 :

[email protected]:/sys/class/gpio# ls
export         gpiochip361  gpiochip419  gpiochip453  gpiochip496
gpiochip357  gpiochip393  gpiochip437  gpiochip468  unexport

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

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

會對應生成 gpio475 目錄

通過

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

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

相關推薦

Linux核心層使用者配置GPIO

 Linux BSP 開發的基礎就是和GPIO打交道, 下面總結下這幾天對某家開發板的GPIO控制的知識。公司的開發板用的是 DTB  模式 ,首先,進入 dts,dtsi檔案檢視關於GPIO 的模組。 soc {                 .          

Linux之旅-7】Linux使用者組的配置檔案

一、使用者(user)的配置檔案 1.1配置檔案位置 /etc/passwd 1.2作用 記錄使用者的各種資訊。 1.3檔案每行的含義 使用者名稱:口令:使用者標識號:組標識號:註釋性描述:

應用配置GPIO方法

以配置GPIO9為例: 1. 從shell命令列配置: 建立操作節點: echo 9 > /sys/class/gpio/export 設定方向(in/out): echo out >

Android 底層驅動開發步驟——linux核心層、HAL、JNI

1.Linux驅動實現2.Linux核心驅動測試3.Android HAL層實現4.Aidl實現5.Service java實現6.Service jni 實現7.註冊service和jni方法8.Android App呼叫測試1.linux驅動實現。2.Linux核心驅動測

esp接收gpio中斷處理按鍵觸發

20181025w gpio按鍵觸發 –定義變數 –wifi模組旁邊的LED燈D4引腳 ledwifi=4 –設定引腳模式:0(輸入模式) gpio.mode(ledwifi,0) –此時任然可以設定引腳電平輸出高/底(最後引腳1高電平,接低電平觸發) gp

全誌R58平臺的GPIO控制

can conf direct 開發板 oot strong fine 調試 ace 全誌R58平臺的GPIO引腳控制 2017/8/18 15:50 版本:V1.0 開發板:SC5806(全誌R58平臺) SDK:android4.4.4 本文以GPIO引腳P

如何在PIC微控制器的GPIO上生成PWM訊號

轉載於國外課棧(含視訊) PWM訊號生成是每個嵌入式工程師工具庫中的重要工具,它們非常適用於控制伺服電機位置,在轉換器/逆變器中切換少量電源電子積體電路等許多應用,甚至用於簡單的LED亮度控制。在pic 微控制器中, pwm 訊號可以通過設定所需的暫存器使用比較、捕獲和 pwm (ccp)

樹莓派下java對GPIO的引用

2) 安裝Pi4j開啟樹莓派的控制檯輸入下面的命令下載Pi4j檔案: wget http://pi4j.googlecode.com/files/pi4j-0.0.5.deb   複製程式碼 (如果你已經安裝了Pi4j的其他版本,請先執行如下命令將其解除安裝掉:sud

控制樹莓派上gpio

一. 首先下載工具wiringpi,具體操作看資料: 二、 gpio readall  顯示此時樹莓派所有引腳狀態: 2號引腳改為輸出狀態(BCM編號): gpio -g mode 2 output 2號引腳改為高電平 gpio -g write 2 1

Linux深度攻略》一書,講述Linux日常系統管理服務器配置內容

linuxLinux深度攻略 首先從介紹Linux系統的安裝入手,講述了Linux系統管理和服務器配置兩部分的知識。系統管理方面內容有Linux系統簡介和安裝,Linux字符界面,目錄和文件管理,Linux常用命令,Shell編程,用戶和組群賬戶管理,權限、所有者和ACL,歸檔、壓縮和備份,軟件包管理,磁盤和

Microsoft SQL Server for Linux安裝配置

fig fcm zone linux for onf targe 查看 nbsp 客戶端   雖說mssql for linux早已經出來了,但原本沒有打算這麽早就去嘗試的,無奈之下還是得先嘗試用了,這裏分幾篇介紹我在用mssql for linux時遇到的問題,不得不說作

Linux 網卡驅動學習(六)(應用、tcp 、ip 、設備驅動作用解析)

local acc 每次 letter auto sizeof style article inode 本文將介紹網絡連接建立的過程、收發包流程,以及當中應用層、tcp層、ip層、設備層和驅動層各層發揮的作用。 1、應用層 對於使用socket進行網絡連接的serv

學習linux——用戶組的配置文件

幫助 shel 修改時間 改密碼 span tor 時間 刪除 變化 2017-07-21 19:57:10 @惟願此心無怨尤 原創 我有認真寫,你有認真看嗎 linux用戶和組的主要配置文件有四個,如下:   /etc/passwd: 用戶及其屬性信息

Linux chmodchown更改文件目錄的所屬命令的用法

操作 擁有 所有權限 其他 chang 交換 chan chm 訪問權限 一、chown 命令 用途:更改文件的所有者或組。命令由單詞change owner組合而成。 使用示例: 1,更改文件的所有者: chown jim program.c 文件 program.c 的

Mac下使用PF進行端口轉發防火墻配置(類似Linux的iptables)

火墻 get 端口 生效 proto 保護 功能 net inet6 在Mac沒有iptables這些,替代的軟件為PF,命令為pfctl。在早些版本用ipfw(<=10.10),後面改為PF。還有一些可以使用OpenBsd,不過這個不太好用。 網上關於pfctl的

Linux 124課程 9、配置安全OpenSSH服務

數據加密 gen listen 認證 基於 for 公鑰加密 重啟 打開 SSH 基於RSA算法 遠程登錄工具RSA 非對稱加密算法:  公鑰: 對外公開  私鑰: 私有保管  用公鑰加密,私鑰才能打開;用私鑰加密,公鑰才能打開;數據加密的方法,將對方的公鑰用於加密數據

Linux學習命令匯總十——linux網絡管理及配置網絡檢測工具

網絡配置 網絡管理 網絡檢測 ifconfig ip 本章Blog相關Linux知識點CSMA/CD(Carrier Sense Multiple Access with Collision Detection)基帶沖突檢測的載波監聽多路訪問技術(載波監聽多點接入/碰撞檢測),是一種爭用型

5-華為防火墻:二接入的安全策略配置差異

分享 fire static com color vlan rust 技術 -a 一、實驗拓撲: 二、實驗要求:1、內網:連接R2接口G0/0/2是三層接口,其它接口都是二層接口;R1、R2、R3部署默認路由到USG;2、USG上創建VLAN 10、202,並將G0/0/0

Linux 筆記 - 第十三章 Linux 系統日常管理之(四)Linux 數據備份工具 rsync 網絡配置

方法 target speed cnblogs rsync -av html links 布爾值 單個 博客地址:http://www.moonxy.com 一、前言 sync 命令是一個遠程數據同步工具,可通過 LAN/WAN 快速同步多臺主機間的文件,可以理解為 rem

基於Linux系統的網絡配置yum命令及軟件的安裝

network mar 上網 sat ping通 自動 接收 2.4 res 1、相關概念 1.1面向連接的TCP協議(Transmission Control Protocol,傳輸控制協議) ??TCP(Transmission Control Protocol,傳輸控