Linux驱动GPIO编程入门

在驱动中使用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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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 ");
MODULE_DESCRIPTION(
		"Driver for Bosch Sensortec BMP280 pressure and temperature sensor");
MODULE_LICENSE("GPL v2");

你可能感兴趣的:(内核4.4.194,linux)