android 查看gpio状态_神操作!Linux不写驱动控制直接控制GPIO

说到控制硬件,马上就能想到写个内核模块,驱动一下,像gpio_request、open、read、write……一堆API就出来了。

其实,只是想简单的控制一下GPIO输入或者输出,不用这么复杂,系统已经实现相关驱动了,只需要了解怎么用就可以了。

在用户空间通过sysfs控制GPIO,先访问/sys/class/gpio/,向export文件写入要操作的GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO输入或者输出模式,而value可控制GPIO的状态或者读取状态。

/sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号;

/sys/class/gpio/unexport 用于通知系统取消导出;

/sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号,寄存器名称,引脚总数;

/sys/class/gpio/gpioX/direction文件,可以写入in或out设置输入输入方向;

/sys/class/gpio/gpioX/value文件是可以读写GPIO状态;

示例:

1. 导出2号GPIO /sys/class/gpio# echo 2 > export

2. 设置方向为输出 /sys/class/gpio/gpio2# echo out > direction

3. 查看当前方向 /sys/class/gpio/gpio2# cat direction

4. 设置输出高电平 /sys/class/gpio/gpio2# echo 1 > value

5. 查看当前值 /sys/class/gpio/gpio2# cat value

6. 取消导出2号GPIO /sys/class/gpio# echo 2 > unexport

查看当前GPIO使用情况:

cat /sys/kernel/debug/gpio

那么问题来了,在SOC手册上看到的GPIO引脚号都是GPIOA5、GPIOB7、GPH12等这样的名称,哪来的GPIO编号呢?

别急,给你一个shell脚本,肯定是你想要的:

#! /bin/shfor i in /sys/class/gpio/gpiochip*doecho `cat $i/label`: `cat $i/base`done
上面的脚本在开发板上执行,可能会是这样的输出结果:

GPIOA: 0GPIOB: 32GPIOC: 64GPIOD: 96GPIOE: 128GPIOF: 160GPIOG: 192GPIOH: 224
这是什么意思嘞?举个例子:

假设要操作的GPIO是GPE5,那么,对应的GPIO就是133,怎么算的呢?

其实,上面是各个GPIO组的起始编号,GPE的起始编号是128,即GPE0的编号是128,那么GPE5的编号就是GPE0 + 5 = 128 + 5 = 133
————————————————
版权声明:本文为CSDN博主「吹亚吹」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_29359001/article/details/112072285

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设备树中配置GPIO按键驱动需要完成以下几个步骤: 1. 定义GPIO节点 在设备树中需要定义GPIO节点,节点包含GPIO的编号、使用模式、中断类型等信息。例如: gpio-keys { compatible = "gpio-keys"; pinctrl-names = "default"; pinctrl-0 = <&gpio_keys_pins>; #address-cells = <1>; #size-cells = <0>; power { label = "Power button"; gpios = <&gpio1 0 GPIO_ACTIVE_LOW>; linux,code = <KEY_POWER>; debounce-interval = <50>; interrupt-parent = <&gpio1>; interrupts = <0 IRQ_TYPE_EDGE_FALLING>; }; }; 2. 定义中断控制器节点 中断控制器节点是一个必要的节点,它描述了中断控制器的类型、中断号等信息。例如: gpio_keys_pins: gpio_keys_pins { gpio-key1 { gpio-hog; gpios = <&gpio1 0 GPIO_ACTIVE_LOW>; output-low; line-name = "Power Button"; }; }; 3. 配置中断控制器 在设备树中需要配置中断控制器,使其能够正确的处理GPIO中断。例如: gpio1: gpio@4804c000 { compatible = "ti,omap4-gpio"; reg = <0x4804c000 0x1000>; interrupts = <34>; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; interrupt-parent = <&intc>; }; 4. 在驱动中解析设备树 在Linux内核驱动中需要解析设备树,获取GPIO节点的信息,从而正确的控制GPIO。例如: static int gpio_keys_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; struct gpio_keys_drvdata *ddata; struct input_dev *input_dev; struct gpio_desc *desc; int i, err; ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); if (!ddata) return -ENOMEM; input_dev = devm_input_allocate_device(&pdev->dev); if (!input_dev) return -ENOMEM; input_dev->name = "gpio-keys"; input_dev->id.bustype = BUS_GPIO; for_each_child_of_node(np, desc) { const char *label; err = of_property_read_string(desc, "label", &label); if (err) continue; err = of_property_read_u32(desc, "linux,code", &ddata->keycodes[i]); if (err) continue; ddata->key_count++; err = gpiod_direction_input(desc); if (err < 0) continue; ddata->gpio_descs[i] = desc; input_set_capability(input_dev, EV_KEY, ddata->keycodes[i]); i++; } input_dev->keycode = ddata->keycodes; input_dev->keycodesize = sizeof(ddata->keycodes[0]); input_dev->keycodemax = ddata->key_count; ddata->input_dev = input_dev; platform_set_drvdata(pdev, ddata); err = input_register_device(input_dev); if (err) { dev_err(&pdev->dev, "Failed to register input device: %d\n", err); return err; } return 0; } 以上就是在Android系统中配置GPIO按键驱动设备树方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值