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 基操之驱动篇相关推荐

  1. linux GPIO模拟PS2 键盘驱动

    背景:公司有一个PS2键盘驱动的项目,没有控制器,需要模拟PS2协议,检测按键并通过input子系统将按键时间上报 一.准备: 1.PS2协议: PS2有两个控制线,时钟线和数据线.当按键按下或抬起, ...

  2. 学习《Linux设备模型浅析之驱动篇》笔记(一)

    原文中说了,内核版本为2.6.29:这里都贴3.15的内核源码: 文件/drivers/rtc/rtc-s3c.c static struct platform_driver s3c_rtc_driv ...

  3. 【Linux】Linux 常用基操和 Java 环境的部署

    文章目录 1. Linux 常用命令 快捷键 ls pwd cd touch echo cat mkdir tree rm mv cp find man less vim date ps grep n ...

  4. Linux服务器基操

    一:ssh连接linux 连接命令是用户名@ip, 1:注意第一次登陆提示时需要输入yes,直接按enter会退出: 2:注意输入密码时光标没有反应,这个是正常的.安全起见这个输入是不显示输入内容的, ...

  5. linux驱动篇之 driver_register 过程分析(二)bus_add_driver

    linux驱动篇之 driver_register 过程分析(二) 个人笔记,欢迎转载,请注明出处,共同分享 共同进步 http://blog.csdn.net/richard_liujh/artic ...

  6. Linux 设备驱动篇之I2c设备驱动

    ******************************************************************************************** 装载声明:希望 ...

  7. Linux设备驱动篇——[I2C设备驱动-1]

    Linux 设备驱动篇之I2c设备驱动 fulinux 一.I2C驱动体系 虽然I2C硬件体系结构和协议都很容易理解,但是Linux I2C驱动体系结构却有相当的复杂度,它主要由3部分组成,即I2C设 ...

  8. 《数字集成电路设计从入门到精通——电路仿真与版图设计篇》 : ① cadence环境配置与基操

    一.cadence 软件安装指导 下载链接:https://pan.baidu.com/s/1Tbcy0y8xSD2OKnpHpFhlUQ 提取码:olt0 文件链接永久有效,若失效请私信联系作者哦. ...

  9. Linux GPIO 驱动 (gpiolib)

    目录 1.简述 2.Gpiolib 相关数据结构分析 2.1 gpio_chip 结构 2.2 gpio_desc 结构 2.3 gpio_device 结构 3.Gpiolib 对接芯片底层 3.1 ...

最新文章

  1. java 匿名内部类
  2. 加快tensorflow模型预测速度
  3. HDU - 2825 Wireless Password (AC自动机 + 状压dp)
  4. 10.java 关键字与保留字
  5. api arx autocad_AutoCAD ObjectARX(VC)开发基础与实例教程 此书是利用ObjectARX对AutoCAD二次开发的教程 - 下载 - 搜珍网...
  6. 怎么用python爬豆瓣_python爬虫16 | 你,快去试试用多进程的方式重新去爬取豆瓣上的电影...
  7. Python自动化(十二):一分钟搞定几百个Excel中查找的数据
  8. python 判断 字串包含_Python变量
  9. Git管理工具SourceTree文件预览乱码问题
  10. 平面设计个人简历模板
  11. e当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过Windows
  12. IBUS-WARNING **: 09:23:08.407: The owner of /home/cl/.config/ibus/bus is not root!
  13. EXCEL中行列转换
  14. 基于双目摄像头SGBM视差图的障碍物提取
  15. 山西省大同市谷歌高清卫星地图下载
  16. 代理IP 有效性检测
  17. C# RabbitMQ: None of the specified endpoints were reachable
  18. 小程序报错修改Expecting 'STRING','NUMBER'
  19. php ean-13,用php生成EAN_13标准的条形码_php
  20. flex 开源项目组件大全

热门文章

  1. 诺基亚手机使用GPS功能费用问题的解释
  2. java 最大递减数_先递增后递减数组查找最大值
  3. 小米游戏本装苹果网卡BCM943224PCIEBT2BX
  4. 国产什么品牌的蓝牙耳机比较好?半入耳式蓝牙耳机排行榜
  5. Js 正则表达式中g的用法
  6. 常见标点符号、排版符号英文表达
  7. 如何在unity中制作塔防游戏
  8. 信捷XC PLC与7台海利普变频器 ,信捷XC系列PLC与7台海利普变频器通讯
  9. 数据放在本地,心里才更踏实,滚雪球学 Python
  10. Android(仿QQ登入+网易新闻)