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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

fireflyAIO-3288C主板GPIO引腳簡(jiǎn)介

firefly ? 來(lái)源:firefly ? 作者:firefly ? 2019-12-16 14:27 ? 次閱讀
GPIO 使用
簡(jiǎn)介

GPIO, 全稱 General-Purpose Input/Output(通用輸入輸出),是一種軟件運(yùn)行期間能夠動(dòng)態(tài)配置和控制的通用引腳。

AIO-3288C 有 9 組 GPIO bank: GPIO0,GPIO1, …, GPIO8。每組又以 A0~A7, B0~B7, C0~C7, D0~D7 作為編號(hào)區(qū)分。 每個(gè) GPIO 口除了通用輸入輸出功能外,還可能有其它復(fù)用功能,例如 GPIO1_C2,可以復(fù)用成以下功能之一:

  • spi0_clk
  • ts0_data4
  • uart4exp_ctsn

每個(gè) GPIO 口的驅(qū)動(dòng)電流、上下拉和重置后的初始狀態(tài)都不盡相同,詳細(xì)情況請(qǐng)參考《RK3288 規(guī)格書(shū)》中的 “RK3288 function IO description” 一章。

AIO-3288C 的 GPIO 驅(qū)動(dòng)是在以下 pinctrl 文件中實(shí)現(xiàn)的:

kernel/drivers/pinctrl/pinctrl-rockchip.c

其核心是填充 GPIO bank 的方法和參數(shù),并調(diào)用 gpiochip_add 注冊(cè)到內(nèi)核中。

使用

開(kāi)發(fā)板有兩個(gè)電源 LED 燈是 GPIO 口控制的,分別是:

輸入輸出

下面以電源 LED 燈的驅(qū)動(dòng)為例,講述如何在內(nèi)核編寫(xiě)代碼控制 GPIO 口的輸出。

首先需要在 firefly-rk3288-aio-3288c.dts 中增加驅(qū)動(dòng)的資源描述:

firefly-led{ compatible = "firefly,led"; led-work = <&gpio8 GPIO_A6 GPIO_ACTIVE_HIGH>; led-power = <&gpio8 GPIO_A1 GPIO_ACTIVE_LOW>; status = "okay"; };

這里定義了兩顆 LED 燈的 GPIO 設(shè)置:

led-power GPIO8_A6 GPIO_ACTIVE_HIGH led-user GPIO8_A1 GPIO_ACTIVE_LOW

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

#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 從設(shè)備樹(shù)中讀取 led-power 的 GPIO 配置編號(hào)和標(biāo)志,gpio_is_valid 判斷該 GPIO 編號(hào)是否有效,gpio_request 則申請(qǐng)占用該 GPIO。如果初始化過(guò)程出錯(cuò),需要調(diào)用 gpio_free 來(lái)釋放之前申請(qǐng)過(guò)且成功的 GPIO 。

調(diào)用 gpio_direction_output 就可以設(shè)置輸出高還是低電平,因?yàn)槭?GPIO_ACTIVE_LOW ,如果要燈亮,需要寫(xiě)入 0 。

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

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);
復(fù)用

如何定義 GPIO 有哪些功能可以復(fù)用,在運(yùn)行時(shí)又如何切換功能呢?以 I2C4 為例作簡(jiǎn)單的介紹。查規(guī)格表可知,I2C4_SDA 與 I2C4_SCL 的功能定義如下:

Pad# func0 func1 I2C4_SDA/GPIO7_C1 gpio7c1 i2c4tp_sda I2C4_SCL/GPIO7_C2 gpio7c2 i2c4tp_scl

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

i2c4: i2c@ff160000 { compatible = "rockchip,rk30-i2c"; reg = <0xff160000 0x1000>; interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>; #address-cells = <1>; #size-cells = <0>; pinctrl-names = "default", "gpio"; pinctrl-0 = <&i2c4_sda &i2c4_scl>; pinctrl-1 = <&i2c4_gpio>; gpios = <&gpio7 GPIO_C1 GPIO_ACTIVE_LOW>, <&gpio7 GPIO_C2 GPIO_ACTIVE_LOW>; clocks = <&clk_gates6 15>; rockchip,check-idle = <1>; status = "disabled"; };

此處,跟復(fù)用控制相關(guān)的是 pinctrl- 開(kāi)頭的屬性:

  • pinctrl-names 定義了狀態(tài)名稱列表: default (i2c 功能) 和 gpio 兩種狀態(tài)。
  • pinctrl-0 定義了狀態(tài) 0 (即 default)時(shí)需要設(shè)置的 pinctrl: i2c4_sda 和 i2c4_scl
  • pinctrl-1 定義了狀態(tài) 1 (即 gpio)時(shí)需要設(shè)置的 pinctrl: i2c4_gpio

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

/ { pinctrl: pinctrl@ff770000 { compatible = "rockchip,rk3288-pinctrl"; ... gpio7_i2c4 { i2c4_sda:i2c4-sda { rockchip,pins = <I2C4TP_SDA>; rockchip,pull = <VALUE_PULL_DISABLE>; rockchip,drive = <VALUE_DRV_DEFAULT>; //rockchip,tristate = <VALUE_TRI_DEFAULT>; }; i2c4_scl:i2c4-scl { rockchip,pins = <I2C4TP_SCL>; rockchip,pull = <VALUE_PULL_DISABLE>; rockchip,drive = <VALUE_DRV_DEFAULT>; //rockchip,tristate = <VALUE_TRI_DEFAULT>; }; i2c4_gpio: i2c4-gpio { rockchip,pins = <FUNC_TO_GPIO(I2C4TP_SDA)>, <FUNC_TO_GPIO(I2C4TP_SCL)>; rockchip,drive = <VALUE_DRV_DEFAULT>; }; }; ... }

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

#define GPIO7_C1 0x7c10 #define I2C4TP_SDA 0x7c11 #define GPIO7_C2 0x7c20 #define I2C4TP_SCL 0x7c21

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

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

也就是說(shuō) FUNC_TO_GPIO(I2C4TP_SDA) == GPIO7_C1, FUNC_TO_GPIO(I2C4TP_SCL) == GPIO7_C2 。 像 0x7c11 這樣的值是有編碼規(guī)則的:

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

0x7c11 就表示 GPIO7_C1 func1, 即 I2C4TP_SDA 。

在復(fù)用時(shí),如果選擇了 “default” (即 i2c 功能),系統(tǒng)會(huì)應(yīng)用 i2c1_sda 和 i2c1_scl 這兩個(gè) pinctrl,最終得將 GPIO0_A3 和 GPIO0_A2 兩個(gè)針腳切換成對(duì)應(yīng)的 i2c 功能;而如果選擇了 “gpio” ,系統(tǒng)會(huì)應(yīng)用 i2c1_gpio 這個(gè) pinctrl,將 GPIO0_A3 和 GPIO0_A2 兩個(gè)針腳還原為 GPIO 功能。我們看看 i2c 的驅(qū)動(dòng)程序 /kernel/drivers/i2c/busses/i2c-rockchip.c 是如何切換復(fù)用功能的:

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); // ... }

首先是調(diào)用 of_get_gpio 取出設(shè)備樹(shù)中 i2c4 結(jié)點(diǎn)的 gpios 屬于所定義的兩個(gè) gpio:

gpios = <&gpio7 GPIO_C1 GPIO_ACTIVE_LOW>, <&gpio7 GPIO_C2 GPIO_ACTIVE_LOW>;

然后是調(diào)用 devm_gpio_request 來(lái)申請(qǐng) gpio,接著是調(diào)用 pinctrl_lookup_state 來(lái)查找 “gpio” 狀態(tài),而默認(rèn)狀態(tài) “default” 已經(jīng)由框架保存到 i2c->dev-pins->default_state 中了。最后調(diào)用 pinctrl_select_state 來(lái)選擇是 “default” 還是 “gpio” 功能。 下面是常用的復(fù)用 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);

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11342

    瀏覽量

    210147
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6086

    瀏覽量

    35529
  • Firefly
    +關(guān)注

    關(guān)注

    2

    文章

    538

    瀏覽量

    7091
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    fireflyAIO-3288C主板安裝指導(dǎo)

    AIO-3288C 的標(biāo)準(zhǔn)套裝包含以下配件
    的頭像 發(fā)表于 11-05 15:58 ?1449次閱讀
    <b class='flag-5'>fireflyAIO-3288C</b><b class='flag-5'>主板</b>安裝指導(dǎo)

    fireflyAIO-3399C主板GPIO簡(jiǎn)介

    GPIO, 全稱 General-Purpose Input/Output(通用輸入輸出),是一種軟件運(yùn)行期間能夠動(dòng)態(tài)配置和控制的通用引腳。
    的頭像 發(fā)表于 12-13 10:15 ?2121次閱讀
    <b class='flag-5'>fireflyAIO-3399C</b><b class='flag-5'>主板</b><b class='flag-5'>GPIO</b><b class='flag-5'>簡(jiǎn)介</b>

    fireflyAIO-3288C主板接口簡(jiǎn)介

    firefly
    的頭像 發(fā)表于 12-16 13:48 ?1824次閱讀
    <b class='flag-5'>fireflyAIO-3288C</b><b class='flag-5'>主板</b>接口<b class='flag-5'>簡(jiǎn)介</b>

    fireflyAIO-3288C PWM 輸出介紹

    AIO-3288C 開(kāi)發(fā)板上有 4 路 PWM 輸出,分別為 PWM0 ~ PWM3, 本章主要描述如何配置 PWM。
    的頭像 發(fā)表于 12-16 15:22 ?1404次閱讀

    fireflyAIO-3288C主板MIPI CSI攝像頭接口簡(jiǎn)介

    AIO-3288C開(kāi)發(fā)板有雙 MIPI 攝像頭接口,攝像頭圖像處理能力達(dá)到 4416x3312 像素,支持 4K 視頻錄制。此外,開(kāi)發(fā)板還支持 USB 攝像頭。
    的頭像 發(fā)表于 12-16 14:16 ?6095次閱讀
    <b class='flag-5'>fireflyAIO-3288C</b><b class='flag-5'>主板</b>MIPI CSI攝像頭接口<b class='flag-5'>簡(jiǎn)介</b>

    fireflyAIO-3288C--LED簡(jiǎn)介

    AIO-3288C 開(kāi)發(fā)板上有 2 個(gè) LED 燈
    的頭像 發(fā)表于 12-16 14:21 ?1776次閱讀

    fireflyAIO-3288C主板IR 簡(jiǎn)介

    AIO-3288C 開(kāi)發(fā)板上可以接紅外收發(fā)傳感器 IR 實(shí)現(xiàn)遙控功能。
    的頭像 發(fā)表于 12-16 14:22 ?1581次閱讀
    <b class='flag-5'>fireflyAIO-3288C</b><b class='flag-5'>主板</b>IR <b class='flag-5'>簡(jiǎn)介</b>

    fireflyAIO-3288C主板I2C簡(jiǎn)介

    AIO-3288C 開(kāi)發(fā)板上有 6 個(gè)片上 I2C 控制器。
    的頭像 發(fā)表于 12-16 14:23 ?1414次閱讀

    fireflyAIO-3288C主板ADC接口介紹

    AIO-3288C 開(kāi)發(fā)板上的 AD 接口分為:高速 ADC 流接口 (High-speed ADC Stream Interface)、溫度傳感器 (Temperature Sensor)、
    的頭像 發(fā)表于 12-16 15:27 ?1845次閱讀

    fireflyAIO-3288C主板編譯Android固件簡(jiǎn)介

    編譯 Android 對(duì)機(jī)器的配置要求較高
    的頭像 發(fā)表于 12-16 14:53 ?1060次閱讀

    fireflyAIO-3288C主板升級(jí)統(tǒng)一固件簡(jiǎn)介

    許多用戶在燒寫(xiě)統(tǒng)一固件時(shí),常常會(huì)出現(xiàn)“測(cè)試設(shè)備失敗”,“燒寫(xiě)固件失敗”等情況,是因?yàn)闆](méi)有選擇對(duì)相應(yīng)的工具,
    的頭像 發(fā)表于 12-16 15:12 ?1998次閱讀
    <b class='flag-5'>fireflyAIO-3288C</b><b class='flag-5'>主板</b>升級(jí)統(tǒng)一固件<b class='flag-5'>簡(jiǎn)介</b>

    fireflyAIO-3288C主板啟動(dòng)模式簡(jiǎn)介

    AIO-3288C 有靈活的啟動(dòng)方式。
    的頭像 發(fā)表于 12-16 15:43 ?1508次閱讀
    <b class='flag-5'>fireflyAIO-3288C</b><b class='flag-5'>主板</b>啟動(dòng)模式<b class='flag-5'>簡(jiǎn)介</b>

    fireflyAIO-3288J主板I2C簡(jiǎn)介

    AIO-3288J 開(kāi)發(fā)板上有 6 個(gè)片上 I2C 控制器。
    的頭像 發(fā)表于 12-20 10:05 ?1390次閱讀

    fireflyAIO-3128C主板GPIO使用簡(jiǎn)介

    GPIO, 全稱 General-Purpose Input/Output(通用輸入輸出),是一種軟件運(yùn)行期間能夠動(dòng)態(tài)配置和控制的通用引腳
    的頭像 發(fā)表于 12-24 08:52 ?1814次閱讀
    <b class='flag-5'>fireflyAIO-3128C</b><b class='flag-5'>主板</b><b class='flag-5'>GPIO</b>使用<b class='flag-5'>簡(jiǎn)介</b>

    fireflyAIO-3288J主板ADC使用簡(jiǎn)介

    AIO-3288J 開(kāi)發(fā)板上的 AD 接口分為:高速 ADC 流接口 (High-speed ADC Stream Interface)、溫度傳感器 (Temperature Sensor)、
    的頭像 發(fā)表于 12-26 14:34 ?1834次閱讀
    主站蜘蛛池模板: 暖暖 免费 高清 日本在线 | 10分钟免费观看视频 | 在线自拍亚洲视频欧美 | 富婆找黑人老外泻火在线播放 | 欧美日韩在线成人看片a | 伊人久久丁香色婷婷啪啪 | 青柠在线视频 | 阿力gv资源 | 妹妹我要操| 亚洲伊人精品综合在合线 | 人性本色联盟 | 久久精品av | 日日碰狠狠躁久久躁综合网 | 国内国外精品影片无人区 | 久久久久久91香蕉国产 | 久久精品亚洲AV无码三区观看 | 亚洲绝美精品一区二区 | 国产黄大片在线视频 | 凹凸精品视频分类视频 | 无码国产精品高潮久久9 | 日韩精品亚洲专区在线电影不卡 | 在线亚洲精品福利网址导航 | 日本十八禁无遮拦啪啪漫画 | 老女老肥熟国产在线视频 | 最近免费中文字幕MV免费高清 | 国产在线aaa片一区二区99 | 国内久经典AAAAA片 | 老头扒开粉缝亲我下面 | 高干紧射H后入 | 99久久人妻无码精品系列性欧美 | 亚洲国产货青视觉盛宴 | 一品探花论坛 | 午夜向日葵视频在线观看 | 欧美A级肉欲大片XXX | 无人区乱码1区2区3区网站 | 久久精品电影久久电影大全 | 99国内精品久久久久久久清纯 | 国产欧美日韩中文视频在线 | 一个人在线观看免费视频 | 2022国产精品不卡a | 一本色道久久综合亚洲精品 |