在驱动中使用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");