国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

6.2物聯(lián)網(wǎng)RK3399項目開發(fā)實錄-驅(qū)動開發(fā)之GPIO使用(wulianjishu666)

這篇具有很好參考價值的文章主要介紹了6.2物聯(lián)網(wǎng)RK3399項目開發(fā)實錄-驅(qū)動開發(fā)之GPIO使用(wulianjishu666)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

物聯(lián)網(wǎng)嵌入式開發(fā)源碼例程:

鏈接:https://pan.baidu.com/s/1B3oqq5QBhN-VmTFt9CI-7A?pwd=2ihg?

*******************************************************************************************

GPIO 使用

簡介

GPIO, 全稱 General-Purpose Input/Output(通用輸入輸出),是一種軟件運行期間能夠動態(tài)配置和控制的通用引腳。 RK3399 有 5 組 GPIO bank:GPIO0~GPIO4,每組又以 A0~A7, B0~B7, C0~C7, D0~D7 作為編號區(qū)分。所有的 GPIO 在上電后的初始狀態(tài)都是輸入模式,可以通過軟件設(shè)為上拉或下拉,也可以設(shè)置為中斷腳,驅(qū)動強度都是可編程的。 每個 GPIO 口除了通用輸入輸出功能外,還可能有其它復(fù)用功能,例如 GPIO2_A2,可以利用成以下功能:

  • GPIO2_A2

  • GIF_D2

每個 GPIO 口的驅(qū)動電流、上下拉和重置后的初始狀態(tài)都不盡相同,詳細情況請參考《RK3399 規(guī)格書》中的 “Chapter 10 GPIO” 一章。 RK3399 的 GPIO 驅(qū)動是在以下 pinctrl 文件中實現(xiàn)的:

kernel/drivers/pinctrl/pinctrl-rockchip.c

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

AIO-3399J 開發(fā)板為方便用戶開發(fā)使用,并沒有引出通用的 GPIO 口,但是可以將其他接口用作 GPIO,例如 LED 擴展接口,在不用的情況可以將其當作一般的 GPIO 口使用,其對應(yīng)引腳如下圖:

6.2物聯(lián)網(wǎng)RK3399項目開發(fā)實錄-驅(qū)動開發(fā)之GPIO使用(wulianjishu666),RK3399實戰(zhàn)開發(fā),物聯(lián)網(wǎng),android,arm開發(fā),linux,人工智能,計算機視覺

本文以 TP_RST(GPIO0_B4) 和 LCD_RST(GPIO4_D5) 這兩個通用 GPIO 口為例寫了一份簡單操作 GPIO 口的驅(qū)動,在 SDK 的路徑為:

kernel/drivers/gpio/gpio-firefly.c

以下就以該驅(qū)動為例介紹 GPIO 的操作。

輸入輸出

首先在 DTS 文件中增加驅(qū)動的資源描述:

kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-demo.dtsi
gpio_demo: gpio_demo {
            status = "okay";
            compatible = "firefly,rk3399-gpio";
            firefly-gpio = <&gpio0 12 GPIO_ACTIVE_HIGH>;          /* GPIO0_B4 */
            firefly-irq-gpio = <&gpio4 29 IRQ_TYPE_EDGE_RISING>;  /* GPIO4_D5 */
            };

這里定義了一個腳作為一般的輸出輸入口:

firefly-gpio GPIO0_B4

AIO-3399J 的 dts 對引腳的描述與 Firefly-RK3288 有所區(qū)別,GPIO0_B4 被描述為:<&gpio0 12 GPIO_ACTIVE_HIGH>,這里的 12 來源于:8+4=12,其中 8 是因為 GPIO0_B4 是屬于 GPIO0 的 B 組,如果是 A 組的話則為 0,如果是 C 組則為 16,如果是 D 組則為 24,以此遞推,而 4 是因為 B4 后面的 4。

GPIO_ACTIVE_HIGH?表示高電平有效,如果想要低電平有效,可以改為:GPIO_ACTIVE_LOW,這個屬性將被驅(qū)動所讀取。

然后在 probe 函數(shù)中對 DTS 所添加的資源進行解析,代碼如下:

static int firefly_gpio_probe(struct platform_device *pdev)
{
	int ret;
    	int gpio;
    	enum of_gpio_flags flag;
	struct firefly_gpio_info *gpio_info;
    	struct device_node *firefly_gpio_node = pdev->dev.of_node;

	printk("Firefly GPIO Test Program Probe\n");
   	gpio_info = devm_kzalloc(&pdev->dev,sizeof(struct firefly_gpio_info *), GFP_KERNEL);
   	if (!gpio_info) {
        return -ENOMEM;
        }
	gpio = of_get_named_gpio_flags(firefly_gpio_node, "firefly-gpio", 0, &flag);
	if (!gpio_is_valid(gpio)) {
    	printk("firefly-gpio: %d is invalid\n", gpio); return -ENODEV;
        }
	if (gpio_request(gpio, "firefly-gpio")) {
        printk("gpio %d request failed!\n", gpio);
        gpio_free(gpio);
        return -ENODEV;
        }
	gpio_info->firefly_gpio = gpio;
    	gpio_info->gpio_enable_value = (flag == OF_GPIO_ACTIVE_LOW) ? 0:1;
   	gpio_direction_output(gpio_info->firefly_gpio, gpio_info->gpio_enable_value);
    	printk("Firefly gpio putout\n");
    ...
}

of_get_named_gpio_flags?從設(shè)備樹中讀取?firefly-gpio?和?firefly-irq-gpio?的 GPIO 配置編號和標志,gpio_is_valid?判斷該 GPIO 編號是否有效,gpio_request?則申請占用該 GPIO。如果初始化過程出錯,需要調(diào)用?gpio_free?來釋放之前申請過且成功的 GPIO 。在驅(qū)動中調(diào)用?gpio_direction_output?就可以設(shè)置輸出高還是低電平,這里默認輸出從 DTS 獲取得到的有效電平?GPIO_ACTIVE_HIGH,即為高電平,如果驅(qū)動正常工作,可以用萬用表測得對應(yīng)的引腳應(yīng)該為高電平。實際中如果要讀出 GPIO,需要先設(shè)置成輸入模式,然后再讀取值:

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

下面是常用的 GPIO API 定義:

#include <linux/gpio.h>
#include <linux/of_gpio.h>

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);

中斷

在 Firefly 的例子程序中還包含了一個中斷引腳,GPIO 口的中斷使用與 GPIO 的輸入輸出類似,首先在 DTS 文件中增加驅(qū)動的資源描述:

kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-port.dtsi
gpio {
	compatible = "firefly-gpio";
	firefly-irq-gpio = <&gpio4 29 IRQ_TYPE_EDGE_RISING>;  /* GPIO4_D5 */
};

IRQ_TYPE_EDGE_RISING 表示中斷由上升沿觸發(fā),當該引腳接收到上升沿信號時可以觸發(fā)中斷函數(shù)。 這里還可以配置成如下:

IRQ_TYPE_NONE         //默認值,無定義中斷觸發(fā)類型
IRQ_TYPE_EDGE_RISING  //上升沿觸發(fā)
IRQ_TYPE_EDGE_FALLING //下降沿觸發(fā)
IRQ_TYPE_EDGE_BOTH    //上升沿和下降沿都觸發(fā)
IRQ_TYPE_LEVEL_HIGH   //高電平觸發(fā)
IRQ_TYPE_LEVEL_LOW    //低電平觸發(fā)

然后在 probe 函數(shù)中對 DTS 所添加的資源進行解析,再做中斷的注冊申請,代碼如下:

static int firefly_gpio_probe(struct platform_device *pdev)
{
	int ret;
   	int gpio;
   	enum of_gpio_flags flag;
    	struct firefly_gpio_info *gpio_info;
    	struct device_node *firefly_gpio_node = pdev->dev.of_node;
    	...

    	gpio_info->firefly_irq_gpio = gpio;
    	gpio_info->firefly_irq_mode = flag;
   	gpio_info->firefly_irq = gpio_to_irq(gpio_info->firefly_irq_gpio);
   	if (gpio_info->firefly_irq) {
       		if (gpio_request(gpio, "firefly-irq-gpio")) {
          	printk("gpio %d request failed!\n", gpio); gpio_free(gpio); return IRQ_NONE;
        }
        ret = request_irq(gpio_info->firefly_irq, firefly_gpio_irq, flag, "firefly-gpio", gpio_info);
        if (ret != 0) free_irq(gpio_info->firefly_irq, gpio_info);
           dev_err(&pdev->dev, "Failed to request IRQ: %d\n", ret);
    	}
    	return 0;
}
static irqreturn_t firefly_gpio_irq(int irq, void *dev_id) //中斷函數(shù)
{
   	printk("Enter firefly gpio irq test program!\n");
    	return IRQ_HANDLED;
}

調(diào)用?gpio_to_irq?把 GPIO 的 PIN 值轉(zhuǎn)換為相應(yīng)的 IRQ 值,調(diào)用?gpio_request?申請占用該 IO 口,調(diào)用?request_irq?申請中斷,如果失敗要調(diào)用?free_irq?釋放,該函數(shù)中?gpio_info-firefly_irq?是要申請的硬件中斷號,firefly_gpio_irq?是中斷函數(shù),gpio_info->firefly_irq_mode?是中斷處理的屬性,firefly-gpio?是設(shè)備驅(qū)動程序名稱,gpio_info?是該設(shè)備的?device?結(jié)構(gòu),在注冊共享中斷時會用到。

復(fù)用

如何定義 GPIO 有哪些功能可以復(fù)用,在運行時又如何切換功能呢?以 I2C4 為例作簡單的介紹。

查規(guī)格表可知,I2C4_SDA 與 I2C4_SCL 的功能定義如下:

Pad# 	                 func0 	         func1
I2C4_SDA/GPIO1_B3 	gpio1b3 	i2c4_sda
I2C4_SCL/GPIO1_B4 	gpio1b4 	i2c4_scl

在?kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi?里有:

i2c4: i2c@ff3d0000{
	compatible = "rockchip,rk3399-i2c";
	reg = <0x0 0xff3d0000 0x0 0x1000>;
	clocks = <&pmucru SCLK_I2C4_PMU>, <&pmucru PCLK_I2C4_PMU>;
	clock-names = "i2c", "pclk";
	interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH 0>;
	pinctrl-names = "default", "gpio";
	pinctrl-0 = <&i2c4_xfer>;
	pinctrl-1 = <&i2c4_gpio>;   //此處源碼未添加
	#address-cells = <1>;
	#size-cells = <0>;
	status = "disabled";
};

跟復(fù)用控制相關(guān)的是?pinctrl-?開頭的屬性:

  • pinctrl-names 定義了狀態(tài)名稱列表: default (i2c 功能) 和 gpio 兩種狀態(tài)。

  • pinctrl-0 定義了狀態(tài) 0 (即 default)時需要設(shè)置的 pinctrl: &i2c4_xfer

  • pinctrl-1 定義了狀態(tài) 1 (即 gpio)時需要設(shè)置的 pinctrl: &i2c4_gpio

這些 pinctrl 在?kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi?中這樣定義:

pinctrl: pinctrl {
	compatible = "rockchip,rk3399-pinctrl";
	rockchip,grf = <&grf>;
	rockchip,pmu = <&pmugrf>;
	#address-cells = <0x2>;
	#size-cells = <0x2>;
	ranges;
	i2c4{
    		i2c4_xfer: i2c4-xfer{
    			rockchip,pins = <1 12 RK_FUNC_1 &pcfg_pull_none>, <1 11 RK_FUNC_1 &pcfg_pull_none>;
        	};
		i2c4_gpio: i2c4-gpio {
			rockchip,pins = <1 12 RK_FUNC_GPIO &pcfg_pull_none>, <1 11 RK_FUNC_GPIO &pcfg_pull_none>;
        };
};

RK_FUNC_1,RK_FUNC_GPIO 的定義在?kernel/include/dt-bindings/pinctrl/rk.h?中:

 #define RK_FUNC_GPIO    0
 #define RK_FUNC_1   1
 #define RK_FUNC_2   2
 #define RK_FUNC_3   3
 #define RK_FUNC_4   4
 #define RK_FUNC_5   5
 #define RK_FUNC_6   6
 #define RK_FUNC_7   7

另外,像 “1 11”,”1 12” 這樣的值是有編碼規(guī)則的,編碼方式與上一小節(jié) “輸入輸出” 描述的一樣,”1 11” 代表 GPIO1_B3,”1 12” 代表 GPIO1_B4。

在復(fù)用時,如果選擇了?default?(即 i2c 功能),系統(tǒng)會應(yīng)用 i2c4_xfer 這個 pinctrl,最終將 GPIO1_B3 和 GPIO1_B4 兩個針腳切換成對應(yīng)的 i2c 功能;而如果選擇了?gpio?,系統(tǒng)會應(yīng)用 i2c4_gpio 這個 pinctrl,將 GPIO1_B3 和 GPIO1_B4 兩個針腳還原為 GPIO 功能。

我們看看 i2c 的驅(qū)動程序?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è)備樹中 i2c4 結(jié)點的 gpios 屬于所定義的兩個 gpio:

gpios = <&gpio1 GPIO_B3 GPIO_ACTIVE_LOW>, <&gpio1 GPIO_B4 GPIO_ACTIVE_LOW>;

然后是調(diào)用 devm_gpio_request 來申請 gpio,接著是調(diào)用 pinctrl_lookup_state 來查找 gpio 狀態(tài),而默認狀態(tài)?default?已經(jīng)由框架保存到 i2c->dev-pins->default_state 中了。

最后調(diào)用 pinctrl_select_state 來選擇是?default?還是?gpio?功能。

下面是常用的復(fù)用 API 定義:

#include <linux/pinctrl/consumer.h>
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_PM
   	struct 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);

IO-Domain

在復(fù)雜的片上系統(tǒng)(SOC)中,設(shè)計者一般會將系統(tǒng)的供電分為多個獨立的 block,這稱作電源域(Power Domain),這樣做有很多好處,例如:

  • 在 IO-Domain 的 DTS 節(jié)點統(tǒng)一配置電壓域,不需要每個驅(qū)動都去配置一次,便于管理;

  • 依照的是 Upstream 的做法,以后如果需要 Upstream 比較方便;

  • IO-Domain 的驅(qū)動支持運行過程中動態(tài)調(diào)整電壓域,例如 PMIC 的某個 Regulator 可以 1.8v 和 3.3v 的動態(tài)切換,一旦 Regulator 電壓發(fā)生改變,會通知 IO-Domain 驅(qū)動去重新設(shè)置電壓域。

AIO-3399J 原理圖上的 Power Domain Map 表以及配置如下表所示:

6.2物聯(lián)網(wǎng)RK3399項目開發(fā)實錄-驅(qū)動開發(fā)之GPIO使用(wulianjishu666),RK3399實戰(zhàn)開發(fā),物聯(lián)網(wǎng),android,arm開發(fā),linux,人工智能,計算機視覺

通過 RK3399 SDK 的原理圖可以看到 bt656-supply 的電壓域連接的是 vcc18_dvp, vcc_io 是從 PMIC RK808 的 VLDO1 出來的;

在 DTS 里面可以找到 vcc1v8_dvp, 將 bt656-supply = <&vcc18_dvp>。

其他路的配置也類似,需要注意的是如果這里是其他 PMIC,所用的 Regulator 也不一樣,具體以實際電路情況為標準。

調(diào)試方法

IO指令

GPIO 調(diào)試有一個很好用的工具,那就是 IO 指令,AIO-3399J 的 Android 系統(tǒng)默認已經(jīng)內(nèi)置了 IO 指令,使用 IO 指令可以實時讀取或?qū)懭朊總€ IO 口的狀態(tài),這里簡單介紹 IO 指令的使用。首先查看 IO 指令的幫助:

#io --help
Unknown option: ?
Raw memory i/o utility - $Revision: 1.5 $

io -v -1|2|4 -r|w [-l <len>] [-f <file>] <addr> [<value>]

   -v         Verbose, asks for confirmation
   -1|2|4     Sets memory access size in bytes (default byte)
   -l <len>   Length in bytes of area to access (defaults to
              one access, or whole file length)
   -r|w       Read from or Write to memory (default read)
   -f <file>  File to write on memory read, or
              to read on memory write
   <addr>     The memory address to access
   <val>      The value to write (implies -w)

Examples:
   io 0x1000                  Reads one byte from 0x1000
   io 0x1000 0x12             Writes 0x12 to location 0x1000
   io -2 -l 8 0x1000          Reads 8 words from 0x1000
   io -r -f dmp -l 100 200    Reads 100 bytes from addr 200 to file
   io -w -f img 0x10000       Writes the whole of file to memory

Note access size (-1|2|4) does not apply to file based accesses.

從幫助上可以看出,如果要讀或者寫一個寄存器,可以用:

io -4 -r 0x1000 //讀從0x1000起的4位寄存器的值
io -4 -w 0x1000 //寫從0x1000起的4位寄存器的值

使用示例:

  • 查看GPIO1_B3引腳的復(fù)用情況

  • 從主控的datasheet查到GPIO1對應(yīng)寄存器基地址為:0xff320000

  • 從主控的datasheet查到GPIO1B_IOMUX的偏移量為:0x00014

  • GPIO1_B3的iomux寄存器地址為:基址(Operational Base) + 偏移量(offset)=0xff320000+0x00014=0xff320014

  • 用以下指令查看GPIO1_B3的復(fù)用情況:

# io -4 -r 0xff320014
ff320014:  0000816a
  • 從datasheet查到[7:6]:

gpio1b3_sel
GPIO1B[3] iomux select
2'b00: gpio
2'b01: i2c4sensor_sda
2'b10: reserved
2'b11: reserved

因此可以確定該 GPIO 被復(fù)用為 i2c4sensor_sda。

  • 如果想復(fù)用為 GPIO,可以使用以下指令設(shè)置:

# io -4 -w 0xff320014 0x0000812a

GPIO 調(diào)試接口

Debugfs 文件系統(tǒng)目的是為開發(fā)人員提供更多內(nèi)核數(shù)據(jù),方便調(diào)試。 這里 GPIO 的調(diào)試也可以用 Debugfs 文件系統(tǒng),獲得更多的內(nèi)核信息。GPIO 在 Debugfs 文件系統(tǒng)中的接口為?/sys/kernel/debug/gpio,可以這樣讀取該接口的信息:

# cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/pinctrl, gpio0:
 gpio-2   (                    |vcc3v3_3g           ) out hi
 gpio-4   (                    |bt_default_wake_host) in  lo
 gpio-5   (                    |power               ) in  hi
 gpio-9   (                    |bt_default_reset    ) out lo
 gpio-10  (                    |reset               ) out lo
 gpio-13  (                    |?                   ) out lo

GPIOs 32-63, platform/pinctrl, gpio1:
 gpio-32  (                    |vcc5v0_host         ) out hi
 gpio-34  (                    |int-n               ) in  hi
 gpio-35  (                    |vbus-5v             ) out lo
 gpio-45  (                    |pmic-hold-gpio      ) out hi
 gpio-49  (                    |vcc3v3_pcie         ) out hi
 gpio-54  (                    |mpu6500             ) out hi
 gpio-56  (                    |pmic-stby-gpio      ) out hi

GPIOs 64-95, platform/pinctrl, gpio2:
 gpio-83  (                    |bt_default_rts      ) in  hi
 gpio-90  (                    |bt_default_wake     ) in  lo
 gpio-91  (                    |?                   ) out hi

GPIOs 96-127, platform/pinctrl, gpio3:
 gpio-111 (                    |mdio-reset          ) out hi

GPIOs 128-159, platform/pinctrl, gpio4:
 gpio-149 (                    |hp-con-gpio         ) out lo

從讀取到的信息中可以知道,內(nèi)核把 GPIO 當前的狀態(tài)都列出來了,以 GPIO0 組為例,gpio-2(GPIO0_A2) 作為 3G 模塊的電源控制腳 (vcc3v3_3g),輸出高電平 (out hi)。

FAQs

Q1: 如何將 PIN 的 MUX 值切換為一般的 GPIO?

A1: 當使用 GPIO request 時候,會將該 PIN 的 MUX 值強制切換為 GPIO,所以使用該 PIN 腳為 GPIO 功能的時候確保該 PIN 腳沒有被其他模塊所使用。

Q2: 為什么我用 IO 指令讀出來的值都是 0x00000000?

A2: 如果用 IO 命令讀某個 GPIO 的寄存器,讀出來的值異常,如 0x00000000 或 0xffffffff 等,請確認該 GPIO 的 CLK 是不是被關(guān)了,GPIO 的 CLK 是由 CRU 控制,可以通過讀取 datasheet 下面 CRU_CLKGATE_CON* 寄存器來查到 CLK 是否開啟,如果沒有開啟可以用 io 命令設(shè)置對應(yīng)的寄存器,從而打開對應(yīng)的 CLK,打開 CLK 之后應(yīng)該就可以讀到正確的寄存器值了。

Q3: 測量到 PIN 腳的電壓不對應(yīng)該怎么查?

A3: 測量該 PIN 腳的電壓不對時,如果排除了外部因素,可以確認下該 PIN 所在的 IO 電壓源是否正確,以及 IO-Domain 配置是否正確。

Q4: gpio_set_value() 與 gpio_direction_output() 有什么區(qū)別?

A4: 如果使用該 GPIO 時,不會動態(tài)的切換輸入輸出,建議在開始時就設(shè)置好 GPIO 輸出方向,后面拉高拉低時使用 gpio_set_value() 接口,而不建議使用 gpio_direction_output(), 因為 gpio_direction_output 接口里面有 mutex 鎖,對中斷上下文調(diào)用會有錯誤異常,且相比 gpio_set_value,gpio_direction_output 所做事情更多,浪費。文章來源地址http://www.zghlxwxcb.cn/news/detail-860487.html

到了這里,關(guān)于6.2物聯(lián)網(wǎng)RK3399項目開發(fā)實錄-驅(qū)動開發(fā)之GPIO使用(wulianjishu666)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • RK3399驅(qū)動開發(fā) | 21 -Marvell交換機芯片88E6390X調(diào)試(基于linux主線5.4.32內(nèi)核)

    RK3399驅(qū)動開發(fā) | 21 -Marvell交換機芯片88E6390X調(diào)試(基于linux主線5.4.32內(nèi)核)

    88E6390X芯片是Marvell的一款11端口交換器芯片,有1個CPU端口、8個10/100/1000Mbsp以太網(wǎng)端口、兩個XAUI/RXAUI/2500光口。 RK3399只有一個MAC控制器,所以只能外接一個PHY芯片作為網(wǎng)口,但有了外部的交換機芯片后,連接架構(gòu)如下:

    2024年02月13日
    瀏覽(23)
  • RK3399之8250串口驅(qū)動

    RK3399之8250串口驅(qū)動

    前言 內(nèi)核版本4.4 平臺 瑞芯微RK3399 8250串口 一、驅(qū)動整體框架 二、驅(qū)動結(jié)構(gòu)體對象 關(guān)系如下圖所示 三、驅(qū)動代碼流程 驅(qū)動加載由以下入口 1.8250_core.c的serial8250_init 個人理解代碼里有三套串口設(shè)備注冊代碼, 方式一,嵌入式常用的方式,驅(qū)動通過與dts硬件信息匹配注冊uart

    2024年02月09日
    瀏覽(21)
  • RK3588平臺開發(fā)系列講解(項目篇)YOLOv5部署測試

    RK3588平臺開發(fā)系列講解(項目篇)YOLOv5部署測試

    平臺 內(nèi)核版本 安卓版本 RK3588 Linux 5.10 Android 12 沉淀、分享、成長,讓自己和他人都能有所收獲!??

    2024年02月06日
    瀏覽(27)
  • 安卓RK3399編譯驅(qū)動MPU6050,實現(xiàn)內(nèi)核層與HAL層驅(qū)動

    安卓RK3399編譯驅(qū)動MPU6050,實現(xiàn)內(nèi)核層與HAL層驅(qū)動

    今天我們一起學(xué)習(xí)一下如何實現(xiàn)對一款有驅(qū)動代碼的傳感器適配安卓系統(tǒng) 開發(fā)板:某AR眼鏡公司的開發(fā)板RK3399 1. 什么是設(shè)備樹(.dts) DTS即Device Tree Source 設(shè)備樹源碼, Device Tree是一種描述硬件的數(shù)據(jù)結(jié)構(gòu),它起源于 OpenFirmware (OF)。 其主要目的是定義MCU各個引腳的接線功能,通過

    2024年02月04日
    瀏覽(59)
  • RK3588平臺開發(fā)系列講解(項目篇)基于yolov5的物體識別

    RK3588平臺開發(fā)系列講解(項目篇)基于yolov5的物體識別

    平臺 內(nèi)核版本 安卓版本 RK3588 Linux 5.10 Android 12 沉淀、分享、成長,讓自己和他人都能有所收獲!?? ?? 本篇將給大家介紹,如

    2024年02月06日
    瀏覽(21)
  • RK3399_PCIe_Host驅(qū)動分析_地址映射

    RK3399_PCIe_Host驅(qū)動分析_地址映射

    《PCI Express Technology 3.0》,Mike Jackson, Ravi Budruk; MindShare, Inc. 《PCIe掃盲系列博文》,作者Felix,這是對《PCI Express Technology》的理解與翻譯 《PCI EXPRESS體系結(jié)構(gòu)導(dǎo)讀 (王齊)》 《PCI Express_ Base Specification Revision 4.0 Version 0.3 ( PDFDrive )》 《NCB-PCI_Express_Base_5.0r1.0-2019-05-22》 SOC中AXI總線是

    2024年02月06日
    瀏覽(29)
  • QT學(xué)習(xí)開發(fā)筆記(項目實戰(zhàn)之智能家居物聯(lián)網(wǎng)項目1 )

    QT學(xué)習(xí)開發(fā)筆記(項目實戰(zhàn)之智能家居物聯(lián)網(wǎng)項目1 )

    本章介紹使用 Qt 開發(fā)智能家居中的一個物聯(lián)應(yīng)用。簡單直白的說就是通過云服務(wù)器遠程控 制設(shè)備(與設(shè)備通信等)。本章可以直接做畢設(shè),是畢設(shè)物聯(lián)網(wǎng)項目的一大福音!本章將實現(xiàn)遠 程點亮開發(fā)板 LED 作為一個項目實例。 在生活中,我們可能使用過 WIFI 智能插座這款產(chǎn)品

    2023年04月13日
    瀏覽(88)
  • ESP32物聯(lián)網(wǎng)項目開發(fā)1-ESP32簡介

    ESP32物聯(lián)網(wǎng)項目開發(fā)1-ESP32簡介

    第1章,ESP32入門,向你介紹一般的物聯(lián)網(wǎng)技術(shù)、ESP32硬件和開發(fā)環(huán)境選項。 第2章,與地球?qū)υ?-傳感器和執(zhí)行器,討論了不同類型的傳感器和執(zhí)行器,以及如何將它們與ESP32連接。 第3章,令人印象深刻的顯示輸出,解釋了如何在ESP32項目中選擇和使用不同的顯示類型。FreeRT

    2024年02月08日
    瀏覽(20)
  • 工業(yè)互聯(lián)網(wǎng)項目開發(fā)工作流程及核心問題

    工業(yè)互聯(lián)網(wǎng)項目開發(fā)工作流程及核心問題

    工業(yè)互聯(lián)網(wǎng)項目開發(fā)全流程V3.0 ? 工業(yè)互聯(lián)網(wǎng)項目開發(fā)工作流程及核心問題 一、需求分析 1、共享平臺需求分析 這個平臺要解決什么問題? 這個平臺的用戶群體是誰? 這個平臺應(yīng)該具備哪些主要功能? 這個平臺的使用場景是什么? 這個平臺如何與現(xiàn)有的系統(tǒng)集成? 2、需求

    2024年02月09日
    瀏覽(94)
  • 4.物聯(lián)網(wǎng)射頻識別,RFID開發(fā)【智能門禁項目】

    4.物聯(lián)網(wǎng)射頻識別,RFID開發(fā)【智能門禁項目】

    補充:學(xué)習(xí)路徑 一。項目介紹及需求分析 1.酒店智能門禁使用場景介紹 1.客人入住 ????????客人在前臺辦理入住手續(xù),前臺管理員通過門禁管理系統(tǒng)為客戶開一張門禁卡 ????????客戶持卡到相應(yīng)客房,用IC 卡刷卡開門 ????????客人過了入住時間后,卡自動失效,刷

    2024年02月07日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包