LINUX GPIO 基操之驱动篇
LINUX GPIO 基操之驱动篇
- GPIO 子系统操作GPIO
- GPIO子系统接口简介
- 单个GPIO
- GPIO数组
- PINCTRL 子系统操作GPIO
- pinctrl 子系统相关接口
- 使用例子
- probe自动配置pinctrl
注:所有文章基于linux-3.13 以上,本系列主要介绍 GPIO的一些基本知识,驱动操作GPIO的接口,应用层通过sysfs操作GPIO的接口,GPIO一些debug信息查看,以及对高通相关GPIO的寄存器操作。分享给刚刚接触外设bsp的小伙伴们。当然后面有时间还会分享GPIO子系统框架和pinctrl子系统框架,先知道黑盒怎么使用,然后咱再打开仔细瞅瞅。有错误不正当点,勿喷,还请指出,一起修改,谢谢!!
本篇为驱动申请GPIO和操作GPIO接口篇,分别介绍驱动通过GPIO子系统和PINCTRL 子系统提供的接口对GPIO的操作
GPIO 子系统操作GPIO
GPIO子系统接口简介
相关实现在driver/gpio/gpiolib.c 下
1)gpio_request
申请GPIO
int gpio_request(unsigned gpio, const char *label)
参数解析:
gpio: gpio编号
label: 名称
返回值: 成功返回0,失败返回负值
gpio_request_one
申请GPIO,同时制定配置方式 输出或输入模式
int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
2)gpio_free
释放GPIO
void gpio_free(unsigned gpio)
参数解析:
gpio: gpio编号
3)gpio_direction_input
设置GPIO为输入模式
int gpio_direction_input(unsigned gpio)
参数解析:
gpio: gpio编号
返回值: 成功返回0,失败返回负值
4)gpio_direction_output
设置GPIO为输出模式
/* linux/gpio.h */
int gpio_direction_output(unsigned gpio, int value)
参数解析:
gpio: gpio编号
value: 设置为输出模式时的初始值
返回值: 成功返回0,失败返回负值
5) gpio_set_value
设置(写)GPIO的值
/* linux/gpio.h */
void __gpio_set_value(unsigned gpio, int value)
#define gpio_set_value __gpio_set_value
gpio: gpio编号
value: 设置的值
返回值: 成功返回0,失败返回负值
6) gpio_get_value
获取(读)GPIO的值
int __gpio_get_value(unsigned gpio)
#define gpio_get_value __gpio_get_value
gpio: gpio编号
返回值: 获取的值
7) gpio_to_irq
内核通过调用该函数将gpio端口转换为中断
int gpio_to_irq(unsigned gpio);
gpio: gpio编号
返回值:中断编号可以传给request_irq()和free_irq()
单个GPIO
申请gpio4,输出模式,输出高(从设备树配置)
设备树设置
gpio_test{status="ok";gpio_req=<&tlmn 4 0>;
}
代码实现
struct device dev;
gpio4 = of_get_named_gpio(dev.of_node,"gpio_req", 0);
err = gpio_request(gpio4, "qti-can-reset");if (err < 0) {return err;}
gpio_direction_output(gpio4, 0);
gpio_set_value(gpio4,1);
GPIO数组
申请一个gpio数组 [36,42,132],主要是设备树
设备树
gpios = <&tlmm 36 0>,<&tlmm 42 0>,<&tlmm 132 0>;qcom,gpio-reset = <1>;qcom,gpio-standby = <2>;qcom,gpio-req-tbl-num = <0 1 2>; //numqcom,gpio-req-tbl-flags = <1 0 0>; //1 输 入,0 输出qcom,gpio-req-tbl-label = "CAMIF_MCLK2", // 每个gpio对应的名字"CAM_RESET2","CAM_STANDBY2";
解析:
PINCTRL 子系统操作GPIO
pinctrl 子系统相关接口
1) devm_pinctrl_get
解析对应的设备树,获取pinctrl资源
struct pinctrl *devm_pinctrl_get(struct device *dev)
dev: 驱动设备结构体
返回值:pinctrl节点
2)pinctrl_lookup_state
获取各种state的gpio配置
struct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p, const char *name)
p: pinctrl节点
name:gpio配置的名字
3)pinctrl_select_state
.将上面获取的指定state状态设置到硬件中*/
int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
使用例子
高通的配置为例子
在pinctrl设备树添加一个节点
&tlmn{pin_teset_default:pin_teset_default{mux {pins = "gpio0", "gpio1"; //复用的gpiofunction = "qup00";//复用成什么功能};config {pins = "gpio0", "gpio1"; //配置的默认状态drive-strength = <2>;bias-disable;};}
}
在xxx.dtsi中添加一个设备 使用
pinctrl_test{status="ok";pinctrl-name="default";pinctrl-0=<&pin_teset_default>;
}
代码实现
/*1.获取pinctrl节点*/
dev->pins->p = devm_pinctrl_get(dev);
/*2.获取各种state下的pin*/dev->pins->default_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_DEFAULT); /*default的必须要/*3.选中进行设置*/pinctrl_select_state(dev->pins->p, dev->pins->default_state);
probe自动配置pinctrl
如上个例子中,我们是不需要自己进行pinctrl适配的,device和驱动在匹配之后会进行适配。调用我们驱动的probe时,pinctrl相关已经初始化好了。获取相关状态和设置相关状态
__device_attachbus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver);__device_attach_driver driver_match_device(drv, dev); //只有驱动和设备树节点匹配上了才会继续往下走driver_probe_device(struct device_driver *drv, struct device *dev)really_probepinctrl_bind_pins //执行到这里了,一定是驱动和设备匹配上后的。 drv->probe(dev)//然后再probe我们的驱动
int pinctrl_bind_pins(struct device *dev)
{/*1.先get*/dev->pins->p = devm_pinctrl_get(dev);/*2.获取各种state下的pin*/dev->pins->default_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_DEFAULT); /*default的必须要有,否则直接退出*/dev->pins->init_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_INIT);/*3.选中一个state进行设置*/if (IS_ERR(dev->pins->init_state)) {/*这里对clent的gpio设备树节点进行解析,并对硬件进行了设置*/ret = pinctrl_select_state(dev->pins->p, dev->pins->default_state); /*如果有init state,就设置为init state,否则设置为default state, Qcom没有定义sleep state*/} else {ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);}#ifdef CONFIG_PM //R上也定义了这个值dev->pins->sleep_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_SLEEP);dev->pins->idle_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_IDLE);
#endifreturn 0;
}
LINUX GPIO 基操之驱动篇相关推荐
- linux GPIO模拟PS2 键盘驱动
背景:公司有一个PS2键盘驱动的项目,没有控制器,需要模拟PS2协议,检测按键并通过input子系统将按键时间上报 一.准备: 1.PS2协议: PS2有两个控制线,时钟线和数据线.当按键按下或抬起, ...
- 学习《Linux设备模型浅析之驱动篇》笔记(一)
原文中说了,内核版本为2.6.29:这里都贴3.15的内核源码: 文件/drivers/rtc/rtc-s3c.c static struct platform_driver s3c_rtc_driv ...
- 【Linux】Linux 常用基操和 Java 环境的部署
文章目录 1. Linux 常用命令 快捷键 ls pwd cd touch echo cat mkdir tree rm mv cp find man less vim date ps grep n ...
- Linux服务器基操
一:ssh连接linux 连接命令是用户名@ip, 1:注意第一次登陆提示时需要输入yes,直接按enter会退出: 2:注意输入密码时光标没有反应,这个是正常的.安全起见这个输入是不显示输入内容的, ...
- linux驱动篇之 driver_register 过程分析(二)bus_add_driver
linux驱动篇之 driver_register 过程分析(二) 个人笔记,欢迎转载,请注明出处,共同分享 共同进步 http://blog.csdn.net/richard_liujh/artic ...
- Linux 设备驱动篇之I2c设备驱动
******************************************************************************************** 装载声明:希望 ...
- Linux设备驱动篇——[I2C设备驱动-1]
Linux 设备驱动篇之I2c设备驱动 fulinux 一.I2C驱动体系 虽然I2C硬件体系结构和协议都很容易理解,但是Linux I2C驱动体系结构却有相当的复杂度,它主要由3部分组成,即I2C设 ...
- 《数字集成电路设计从入门到精通——电路仿真与版图设计篇》 : ① cadence环境配置与基操
一.cadence 软件安装指导 下载链接:https://pan.baidu.com/s/1Tbcy0y8xSD2OKnpHpFhlUQ 提取码:olt0 文件链接永久有效,若失效请私信联系作者哦. ...
- Linux GPIO 驱动 (gpiolib)
目录 1.简述 2.Gpiolib 相关数据结构分析 2.1 gpio_chip 结构 2.2 gpio_desc 结构 2.3 gpio_device 结构 3.Gpiolib 对接芯片底层 3.1 ...
最新文章
- java 匿名内部类
- 加快tensorflow模型预测速度
- HDU - 2825 Wireless Password (AC自动机 + 状压dp)
- 10.java 关键字与保留字
- api arx autocad_AutoCAD ObjectARX(VC)开发基础与实例教程 此书是利用ObjectARX对AutoCAD二次开发的教程 - 下载 - 搜珍网...
- 怎么用python爬豆瓣_python爬虫16 | 你,快去试试用多进程的方式重新去爬取豆瓣上的电影...
- Python自动化(十二):一分钟搞定几百个Excel中查找的数据
- python 判断 字串包含_Python变量
- Git管理工具SourceTree文件预览乱码问题
- 平面设计个人简历模板
- e当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过Windows
- IBUS-WARNING **: 09:23:08.407: The owner of /home/cl/.config/ibus/bus is not root!
- EXCEL中行列转换
- 基于双目摄像头SGBM视差图的障碍物提取
- 山西省大同市谷歌高清卫星地图下载
- 代理IP 有效性检测
- C# RabbitMQ: None of the specified endpoints were reachable
- 小程序报错修改Expecting 'STRING','NUMBER'
- php ean-13,用php生成EAN_13标准的条形码_php
- flex 开源项目组件大全