色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Firefly-RK3128主板GPIO引腳介紹

firefly ? 來源:firefly ? 作者:firefly ? 2019-11-28 17:15 ? 次閱讀
GPIO 使用
簡介

GPIO, 全稱 General-Purpose Input/Output(通用輸入輸出),是一種軟件運行期間能夠動態配置和控制的通用引腳。 Firefly-RK3128 有 4 組 GPIO bank: GPIO0,GPIO1, GPIO2, GPIO3。每組又以 A0~A7, B0~B7, C0~C7, D0~D7 作為編號區分。 每個 GPIO 口除了通用輸入輸出功能外,還可能有其它復用功能,例如 GPIO1_C2,可以復用成以下功能之一:

每個 GPIO 口的驅動電流、上下拉和重置后的初始狀態都不盡相同,詳細情況請參考《RK3128 規格書》中的 “RK3128 function IO description” 一章。

Firefly-RK3128 的 GPIO 驅動是在以下 pinctrl 文件中實現的:

kernel/drivers/pinctrl/pinctrl-rockchip.c

其核心是填充 GPIO bank 的方法和參數,并調用 gpiochip_add 注冊到內核中。

使用

開發板有兩個電源 LED 燈是 GPIO 口控制的,分別是:

從電路圖上看,GPIO 口輸出低電平時燈亮,高電平時燈滅。

輸入輸出

下面以電源 LED 燈的驅動為例,講述如何在內核編寫代碼控制 GPIO 口的輸出。

首先需要在 rk3128-firerpime.dts 中增加驅動的資源描述:

firefly-led{ compatible = "firefly,led"; led-work = <&gpio1 GPIO_C6 GPIO_ACTIVE_LOW>; led-power = <&gpio1 GPIO_C7 GPIO_ACTIVE_LOW>; status = "okay"; };

這里定義了兩顆 LED 燈的 GPIO 設置:

led-work GPIO1_C6 GPIO_ACTIVE_LOW led-power GPIO1_C7 GPIO_ACTIVE_LOW

GPIO_ACTIVE_LOW 表示低電平有效(燈亮),如果是高電平有效,需要替換為 GPIO_ACTIVE_HIGH 。 之后在驅動程序中加入對 GPIO 口的申請和控制則可:

#ifdef CONFIG_OF #include #include #endif static int firefly_led_probe(struct platform_device *pdev) { int ret = -1; int gpio, flag; struct device_node *led_node = pdev->dev.of_node; gpio = of_get_named_gpio_flags(led_node, "led-power", 0, &flag); if (!gpio_is_valid(gpio)){ printk("invalid led-power: %d\n",gpio); return -1; } if (gpio_request(gpio, "led_power")) { printk("gpio %d request failed!\n",gpio); return ret; } led_info.power_gpio = gpio; led_info.power_enable_value = (flag == OF_GPIO_ACTIVE_LOW) ? 0 : 1; gpio_direction_output(led_info.power_gpio, !(led_info.power_enable_value)); ... on_error:gpio_free(gpio); }

of_get_named_gpio_flags 從設備樹中讀取 led-power 的 GPIO 配置編號和標志,gpio_is_valid 判斷該 GPIO 編號是否有效,gpio_request 則申請占用該 GPIO。如果初始化過程出錯,需要調用 gpio_free 來釋放之前申請過且成功的 GPIO 。

調用 gpio_direction_output 就可以設置輸出高還是低電平,因為是 GPIO_ACTIVE_LOW ,如果要燈亮,需要寫入 0 。

實際中如果要讀出 GPIO,需要先設置成輸入模式,然后再讀取值:

int val;gpio_direction_input(your_gpio);val = gpio_get_value(your_gpio);

下面是常用的 GPIO API 定義:

#include #include enum of_gpio_flags { OF_GPIO_ACTIVE_LOW = 0x1, }; int of_get_named_gpio_flags(struct device_node *np, const char *propname, int index, enum of_gpio_flags *flags); int gpio_is_valid(int gpio); int gpio_request(unsigned gpio, const char *label); void gpio_free(unsigned gpio); int gpio_direction_input(int gpio); int gpio_direction_output(int gpio, int v);
復用

如何定義 GPIO 有哪些功能可以復用,在運行時又如何切換功能呢?以 I2C1 為例作簡單的介紹。查規格表可知,I2C1_SDA 與 I2C1_SCL 的功能定義如下:

在 /kernel/arch/arm/boot/dts/rk312x.dtsi 里有:

i2c1: i2c@20056000 { compatible = "rockchip,rk30-i2c"; reg = <0x20056000 0x1000>; interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;#address-cells = <1>;#size-cells = <0>; pinctrl-names = "default", "gpio"; pinctrl-0 = <&i2c1_sda &i2c1_scl>; pinctrl-1 = <&i2c1_gpio>; gpios = <&gpio0 GPIO_A3 GPIO_ACTIVE_LOW>, <&gpio0 GPIO_A2 GPIO_ACTIVE_LOW>; clocks = <&clk_gates8 5>; rockchip,check-idle = <1>; status = "disabled"; };

此處,跟復用控制相關的是 pinctrl- 開頭的屬性:

  • pinctrl-names 定義了狀態名稱列表: default (i2c 功能) 和 gpio 兩種狀態。
  • pinctrl-0 定義了狀態 0 (即 default)時需要設置的 pinctrl: i2c1_sda 和 i2c1_scl
  • pinctrl-1 定義了狀態 1 (即 gpio)時需要設置的 pinctrl: i2c1_gpio

這些 pinctrl 在 /kernel/arch/arm/boot/dts/rk312x-pinctrl.dtsi 中定義:

/ { pinctrl: pinctrl@20008000 { compatible = "rockchip,rk312x-pinctrl";... gpio0_i2c1 { i2c1_sda:i2c1-sda { rockchip,pins = <I2C1_SDA>; rockchip,pull = <VALUE_PULL_DEFAULT>; }; i2c1_scl:i2c1-scl { rockchip,pins = <I2C1_SCL>; rockchip,pull = <VALUE_PULL_DEFAULT>; }; i2c1_gpio: i2c1-gpio { rockchip,pins = <FUNC_TO_GPIO(I2C1_SDA)>, <FUNC_TO_GPIO(I2C1_SCL)>; rockchip,pull = <VALUE_PULL_DEFAULT>;};}; ... } }

I2C1_SDA, I2C1_SCL 的定義在 /kernel/arch/arm/boot/dts/include/dt-bindings/pinctrl/rockchip-rk312x.h 中:

#define GPIO0_A3 0x0a30#define I2C1_SDA 0x0a31#define MMC1_CMD 0x0a32 #define GPIO0_A2 0x0a20#define I2C1_SCL 0x0a21

FUN_TO_GPIO 的定義在 /kernel/arch/arm/boot/dts/include/dt-bindings/pinctrl/rockchip.h 中:

#define FUNC_TO_GPIO(m) ((m) & 0xfff0)

也就是說 FUNC_TO_GPIO(I2C1_SDA) == GPIO0_A3, FUNC_TO_GPIO(I2C1_SCL) == GPIO7_A2 。 像 0x0a31 這樣的值是有編碼規則的:

0 a3 1 | | `- func | `---- offset `------ bank

0x0a31 就表示 GPIO0_A3 func1, 即 I2C1_SDA 。

在復用時,如果選擇了 “default” (即 i2c 功能),系統會應用 i2c1_sda 和 i2c1_scl 這兩個 pinctrl,最終得將 GPIO0_A3 和 GPIO0_A2 兩個針腳切換成對應的 i2c 功能;而如果選擇了 “gpio” ,系統會應用 i2c1_gpio 這個 pinctrl,將 GPIO0_A3 和 GPIO0_A2 兩個針腳還原為 GPIO 功能。我們看看 i2c 的驅動程序 /kernel/drivers/i2c/busses/i2c-rockchip.c 是如何切換復用功能的:

static int rockchip_i2c_probe(struct platform_device *pdev){ struct rockchip_i2c *i2c = NULL; struct resource *res; struct device_node *np = pdev->dev.of_node; int ret; // ... i2c->sda_gpio = of_get_gpio(np, 0); if (!gpio_is_valid(i2c->sda_gpio)) { dev_err(&pdev->dev, "sda gpio is invalid\n"); return -EINVAL; } ret = devm_gpio_request(&pdev->dev, i2c->sda_gpio, dev_name(&i2c->adap.dev)); if (ret) { dev_err(&pdev->dev, "failed to request sda gpio\n"); return ret; } i2c->scl_gpio = of_get_gpio(np, 1); if (!gpio_is_valid(i2c->scl_gpio)) { dev_err(&pdev->dev, "scl gpio is invalid\n"); return -EINVAL; } ret = devm_gpio_request(&pdev->dev, i2c->scl_gpio, dev_name(&i2c->adap.dev)); if (ret) { dev_err(&pdev->dev, "failed to request scl gpio\n"); return ret; } i2c->gpio_state = pinctrl_lookup_state(i2c->dev->pins->p, "gpio"); if (IS_ERR(i2c->gpio_state)) { dev_err(&pdev->dev, "no gpio pinctrl state\n"); return PTR_ERR(i2c->gpio_state); } pinctrl_select_state(i2c->dev->pins->p, i2c->gpio_state); gpio_direction_input(i2c->sda_gpio); gpio_direction_input(i2c->scl_gpio); pinctrl_select_state(i2c->dev->pins->p, i2c->dev->pins->default_state); // ... }

首先是調用 of_get_gpio 取出設備樹中 i2c1 結點的 gpios 屬于所定義的兩個 gpio:

gpios = <&gpio0 GPIO_A3 GPIO_ACTIVE_LOW>, <&gpio0 GPIO_A2 GPIO_ACTIVE_LOW>;

然后是調用 devm_gpio_request 來申請 gpio,接著是調用 pinctrl_lookup_state 來查找 “gpio” 狀態,而默認狀態 “default” 已經由框架保存到 i2c->dev-pins->default_state 中了。最后調用 pinctrl_select_state 來選擇是 “default” 還是 “gpio” 功能。 下面是常用的復用 API 定義:

#include struct device { //... #ifdef CONFIG_PINCTRL struct dev_pin_info *pins;#endif//...}; struct dev_pin_info {struct pinctrl *p; struct pinctrl_state *default_state; #ifdef CONFIG_PMstruct pinctrl_state *sleep_state; struct pinctrl_state *idle_state;#endif}; struct pinctrl_state * pinctrl_lookup_state(struct pinctrl *p, const char *name); int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s);

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209331
  • 嵌入式主板
    +關注

    關注

    7

    文章

    6085

    瀏覽量

    35296
  • Firefly
    +關注

    關注

    2

    文章

    538

    瀏覽量

    7027
收藏 人收藏

    評論

    相關推薦

    如何解決firefly rk3128 linux內核適配問題?

    如何解決firefly rk3128 linux內核適配問題?
    發表于 03-04 06:17

    Firefly-RK3128開發板上手教程(上)

    1、Firefly-RK3128開發板入手指南配件Firefly-RK3128 的標準套裝包含以下配件:Core-3128J 核心板一塊Firefly-RK3128 基板一塊WiFi
    發表于 08-12 17:32

    Firefly-RK3128開發板上手教程(下)

    1、如何將主機上的固件文件通過雙公頭USB數據線燒錄到開發板的閃存中準備工作Firefly-RK3128 開發板固件主機良好的 Micro USB OTG 線固件文件一般有兩種:單個統一固件
    發表于 08-12 17:51

    Firefly-RK3128 MIPI DSI使用步驟說明

    screen-type屬性:顯示屏類型,Firefly-RK3128只支持單通道MIPI屏,配置成SCREEN_MIPI即可。lvds-format屬性:無關選項。out-face屬性:配置顏色,可為OUT_P888
    發表于 08-22 17:12

    firefly RK3128開發板介紹

    Firefly-RK3128 采用Cortex-A7架構四核1.3GHz處理器,集成Mali-400MP2 GPU, 擁有優秀的運算與圖形處理能力;板載千兆以太網口、2.4GHz Wi-Fi和藍牙4.0
    的頭像 發表于 11-14 11:27 ?4554次閱讀
    <b class='flag-5'>firefly</b> <b class='flag-5'>RK3128</b>開發板<b class='flag-5'>介紹</b>

    Firefly-RK3128開發板UART接口介紹

    refly-RK3128 開發板內置 3 路 UART,分別為 uart0,uart1,uart2。uart0 用于藍牙數據傳輸,如果要使用 uart0,必須關掉藍牙,才可以使用擴展槽上的 UART0 針腳。
    的頭像 發表于 11-28 16:36 ?3347次閱讀
    <b class='flag-5'>Firefly-RK3128</b>開發板UART接口<b class='flag-5'>介紹</b>

    Firefly-RK3128主板PWM輸出介紹

    Firefly-RK3128 開發板上有 4 路 PWM 輸出,分別為 PWM0 ~ PWM3
    的頭像 發表于 11-28 16:56 ?2381次閱讀
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>PWM輸出<b class='flag-5'>介紹</b>

    Firefly-RK3128主板LED子系統介紹

    Firefly-RK3128 開發板上有 2 個 LED 燈
    的頭像 發表于 11-28 17:01 ?2736次閱讀
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>LED子系統<b class='flag-5'>介紹</b>

    Firefly-RK3128主板I2C控制器

    Firefly-RK3128 開發板上有 4 個片上 I2C 控制器。本文主要描述如何在該開發板上配置 I2C。
    的頭像 發表于 11-29 08:47 ?1478次閱讀
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>I2C控制器

    Firefly-RK3128開發板攝像頭的介紹

    Firefly-RK3128 開發板上有 CIF 接口,支持 CIF 攝像頭。
    的頭像 發表于 11-28 16:48 ?3766次閱讀
    <b class='flag-5'>Firefly-RK3128</b>開發板攝像頭的<b class='flag-5'>介紹</b>

    Firefly-RK3128主板ADC簡介

    Firefly-RK3128 開發板有一個 3 通道(0/1/2)、10 比特精度的 SAR ADC (Successive Approximation Register,逐次逼近寄存器),
    的頭像 發表于 11-28 17:17 ?3509次閱讀
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>ADC簡介

    Firefly-RK3128主板接口定義介紹

    Firefly-RK3128 開發板提供了豐富的接口,主要包括:HDMI、音頻數字光纖、以太網、電源接口、復位按鍵、電源鍵、音頻輸入輸出、硅麥、串口調試接口、紅外接收、OTG接口、TF卡槽、USB Host1~4、
    的頭像 發表于 11-29 08:45 ?3485次閱讀
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>接口定義<b class='flag-5'>介紹</b>

    FireflyRK3128主板外殼介紹

    外殼 Firefly-RK3128 CAD圖 核心板 底板 Firefly-RK3128 外殼亞克力CAD圖
    的頭像 發表于 11-29 09:19 ?1246次閱讀
    FireflyRK<b class='flag-5'>3128</b><b class='flag-5'>主板</b>外殼<b class='flag-5'>介紹</b>

    Firefly-RK3128主板啟動模式簡介

    Firefly-RK3128 有靈活的啟動方式。
    的頭像 發表于 11-29 09:27 ?5255次閱讀

    Firefly-RK3128主板串口調試

    Firefly-RK3128 開發板的調試串口與 TF 卡接口有信號引腳復用,因此無法同時使用
    的頭像 發表于 11-29 09:47 ?3545次閱讀
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>串口調試
    主站蜘蛛池模板: 男生射女生| 十九岁在线观看免费完整版电影| 校花的奶好大好浪| chaopeng 在线视频| 久久精品国产亚洲AV热无遮挡 | 边吃胸边膜下床震免费版视频| 久草热在线| 亚洲国产精品无码中文在线 | 成人动漫bt种子| 男女免费观看在线爽爽爽视频| 一二三区乱码不卡手机版| 国产乱码免费卡1卡二卡3卡四卡| 日韩一区精品视频一区二区| AV无码久久无遮挡国产麻豆| 免费被靠视频动漫| 97精品一区二区视频在线观看| 久久天天躁狠狠躁夜夜呲| 亚洲一区在线视频观看| 精品性影院一区二区三区内射| 亚洲人成电影网站在线观看 | 欧美动物交ideos| CHINSEFUCKGAY无套| 日本888 xxxx| 出租屋交换人妻 全文| 天津相声广播在线收听| 国产乱码二卡3卡四卡| 亚洲成人精品| 久久日本精品国产精品| 自拍偷拍2| 人妻少妇69式99偷拍| 国产成人久久精品AV| 亚洲精品www久久久久久| 久久精品一卡二卡三卡四卡视频版| 116美女写真成人午夜视频| 欧美成人中文字幕在线看| 俄罗斯aaaa一级毛片| 迅雷哥在线观看高清| 久久青草费线频观看国产| qvod小电影| 亚洲AV 日韩 国产 有码| 乱辈通奷XXXXXHD猛交|