当前位置:网站首页>高通平台中gpio简单操作和调试
高通平台中gpio简单操作和调试
2022-06-10 08:26:00 【bobuddy】
一、gpio的调试方法
在Linux下,通过sysfs,获取gpio状态,也可以操作gpio。
1、获取gpio状态
cd /sys/kernel/debug/
cat gpio
2、操作gpio(以gpio99为例)
cd /sys/class/gpio/
echo 99 > export
cd gpio99
echo in/out > direction //设置gpio输入或输出
cat direction //获取gpio输入输出状态
echo 'value' > value //设置gpio寄存器值
cat value //获取gpio寄存器的值
二、在kernel代码中操作gpio
在代码中有两种方式操作gpio,一种是一次申请单个gpio,成功后操纵该gpio,另一种是使用pinctrl,通过设备树设置,一次操作多个gpio。
1、方法一
设备树设备节点中添加gpio //可选
device_node {
...
gpio_name = <&tlmm 99 0>; //gpio_99
...
}
驱动代码:
int gpio_99 = of_get_named_gpio_flags(dev->of_node, "gpio_name", 0, NULL); //从设备数节点, 可选
gpio_request(gpio_99, "gpio_name"); //通过gpio号申请gpio
gpio_direction_output(gpio_99, 1); //设置gpio_99输出,初始值为1
gpio_set_value(gpio_99, 0); //设置gpio_99值为0
gpio_free(gpio_99); //gpio_99不再使用后应当释放
注:
gpio的申请和设置都可能会出现失败的情况,应该做好异常处理
2、方法二
设备树代码:
平台pinctrl节点下添加如下子节点:
相关文档和设备树配置详解见kernel/Document/pinctrl.txt和Documentation/devicetree/bindings/pinctrl/下多个文件
gpio_group {
gpio_active: gpio_active {
mux {
pins = "gpio99", "gpio98"; //复用引脚99和98
functions = "gpio"; //引脚功能配置为普通gpio
};
config {
pins = "gpio99", "gpio98";
drive-strength = <8>; //最大电流限制为8mA
bias-pull-up; //配置上拉
output-high; //输出高电平
};
};
gpio_sleep: gpio_sleep {
mux {
pins = "gpio99", "gpio98"; //复用引脚99和98
functions = "gpio"; //引脚功能配置为普通gpio
};
config {
pins = "gpio99", "gpio98";
drive-strength = <2>; //最大电流限制为2mA
bias-no-pull; //不上拉也不下拉
output-low; //输出低电平
};
};
设备节点中引用pinctrl:
device_node {
...
pinctrl-names = "gpio_active", "gpio_sleep"; //分别对用pinctrl-0和pinctrl-1
pinctrl-0 = <&gpio_active>; //引用
pinctrl-1 = <&gpio_sleep>; //引用
...
};
内核驱动代码:
struct pinctrl *pinctrl = devm_pinctrl_get(device); //获取device对应节点下的pinctrl
struct pinctrl_state = pinctrl_lookup_state(pinctrl, "gpio_active"); //通过pinctrl名获取pinctrl对应状态
pinctrl_select_state(pinctrl, pinctrl_state); //设置pinctrl的状态为'gpio_active
devm_pinctrl_put(pinctrl); //使用完了释放资源
也可以同时使用方法一和方法二,方法一操作简单,但是只能拉高或拉低,而方法二可全面配置GPIO。在一个设备驱动中同时使用方法一和方法二可保证资源不被其他模块操作。
边栏推荐
- Filter for formatting date and text length
- 世界海洋日 | 徜徉于新泽西海洋生物水族馆,记录趣味纽约旅行
- 测试:杯子
- UE全景图,碰到the outpout directory时的问题
- 2022.06.07学习内容
- 接口测试怎么进行,如何做好接口测试
- How to make internal interfaces visible to MOQ- How to do internal interfaces visible for Moq?
- Industry application saves 5g? Don't think too much. It's still mobile phone users who save 5g
- How is the computer network often disconnected? Start with these questions
- Global industry analysis report of spray drying machinery in 2022
猜你喜欢

光流法浅学

Link Time Optimizations: New Way to Do Compiler Optimizations

盘点新加坡旅游宣传片中不可错过的景点

Grafana启动失败报错:Grafana-server Init Failed: Could not find config defaults, make sure homepath command

Introduction to temporal database incluxdb

浏览器中如何使用 module export import: Uncaught SyntaxError: Cannot use import statement outside a module 问题

How is the computer network often disconnected? Start with these questions

USB TYPE -A -B -C 接口

目前技术圈最全面的 Layer2 研究总结

泰國曼穀大城府被福布斯評為“後疫情時代最值得一去的城市”
随机推荐
How to use mind mapping to design test cases
Online legal aid service 2022 Global Industry Analysis Report
What are the test case design methods?
Service management and communication, basic principle analysis
3775 array completion (ring diagram)
伦敦旅游必去博物馆推荐:伦敦自然历史博物馆
How to use module export import: uncaught syntaxerror: cannot use import statement outside a module
2022.06.04 learning contents
La capitale thaïlandaise de Bangkok a été nommée par Forbes « la ville la plus digne d'être visitée après l'épidémie ».
华为设备配置Hub and Spoke
How to prevent virus in business system
【Lingo】线性规划
HarmonyOS(鸿蒙)全网最全资源汇总,吐血整理,赶紧收藏!
OS Experiment 7 [document management]
Image Classification and Retrieval
Research Report on market supply and demand and strategy of China's water-cooled xenon test chamber industry
[untitled]
泰国曼谷大城府被福布斯评为“后疫情时代最值得一去的城市”
UE全景图,碰到the outpout directory时的问题
Test: Cup