Linux驱动GPIO编程入门

这篇博客详细介绍了如何在Linux系统中使用GPIO来控制设备,包括请求GPIO、设置方向、改变值以及最后释放GPIO。通过示例代码展示了在I2C驱动中初始化和移除设备时的操作流程,涉及设备树配置和GPIO操作函数。
摘要由CSDN通过智能技术生成

在驱动中使用GPIO的步骤如下:

1 请求要使用的GPIO

ret = gpio_request(reset, "GTP_RST_PORT");

如上,reset是一个整数,是要申请的gpio的编码(注意这个是GPIO的CPU编码,在树莓派和TinkerBoard 开发板上可以使用 gpio readall 来查看某一个gpio对应的CPU编码)。
如果系统中当前没有其他模块在使用此GPIO,则可以申请成功返回0,否则返回错误码 设备忙。

2 设置GPIO的方向

设置为输入:

gpio_direction_input(reset);

设置为输出:

gpio_direction_output(reset, 0);

注意这里的第二个参数表示设置为输出,并且设置初始值为0,即低电压。

下面的表示设置为输出并且初始值是高电压

gpio_direction_output(reset, 1);

3 设置GPIO的值

设置为1或者0:

 gpio_set_value(reset, 1);

4 释放GPIO

不再使用的时候要释放GPIO:

gpio_free(reset);

以下是一个完整的示例,
使用了设备树如下:

gt9xx@19 {
		reg = <0x19>;
		compatible = "mygt911";
		reset-gpios= <&gpio3 31 GPIO_ACTIVE_HIGH>;
		status = "okay";
	};
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/kernel.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/of_gpio.h>

int reset;

static int gt911_probe(struct i2c_client *client,
		const struct i2c_device_id *id) {
	int ret;
	enum of_gpio_flags rst_flags;
	struct device_node *np;
	np = client->dev.of_node;
	reset = of_get_named_gpio_flags(np, "reset-gpios", 0, &rst_flags);
	if (reset <= 0)
		return reset;
	ret = gpio_request(reset, "GTP_RST_PORT");
	if (ret < 0) {
		pr_err("gpio_request failed\n");
		return ret;
	}
	gpio_direction_output(reset, 0);
	msleep(1000);
	gpio_set_value(reset, 1);
	msleep(1000);
	gpio_set_value(reset, 0);
	msleep(1000);
	gpio_set_value(reset, 1);
	return 0;
}

static int gt911_remove(struct i2c_client *client) {
	pr_err("mygt911 gt911_remove\n");
	gpio_free(reset);
	return 0;
}

static const struct i2c_device_id bmp280_id[] = { { "mygt911", 0 }, { }, };
MODULE_DEVICE_TABLE(i2c, bmp280_id);

static struct i2c_driver bmp280_driver = { .driver = { .name = "mygt911", },
		.probe = gt911_probe, .id_table = bmp280_id, .remove = gt911_remove };

module_i2c_driver( bmp280_driver);

MODULE_AUTHOR("Vlad Dogaru <vlad.dogaru@intel.com>");
MODULE_DESCRIPTION(
		"Driver for Bosch Sensortec BMP280 pressure and temperature sensor");
MODULE_LICENSE("GPL v2");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值