前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10_编程_GPIO使用Pinctrl

10_编程_GPIO使用Pinctrl

作者头像
韦东山
发布2021-12-08 10:09:53
6420
发布2021-12-08 10:09:53
举报
文章被收录于专栏:韦东山嵌入式

资料下载

coding无法使用浏览器打开,必须用git工具下载:

代码语言:javascript
复制
git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git

视频观看

百问网驱动大全

编程_GPIO使用Pinctrl

参考资料:

1. 我们要做什么

假设使用这个虚拟的GPIO Controller的pinA来控制LED:

在这里插入图片描述
在这里插入图片描述

如果不想在使用GPIO引脚时,在设备树中设置Pinctrl信息,

如果想让GPIO和Pinctrl之间建立联系,

我们需要做这些事情:

1.1 表明GPIO和Pinctrl间的联系

在GPIO设备树中使用gpio-ranges来描述它们之间的联系:

1.2 解析这些联系

在GPIO驱动程序中,解析跟Pinctrl之间的联系:处理gpio-ranges:

1.3 编程
  • 在GPIO驱动程序中,提供gpio_chip->request
  • 在Pinctrl驱动程序中,提供pmxops->gpio_request_enablepmxops->request

2. 编写设备树

代码语言:javascript
复制
pinctrl_virt: virtual_pincontroller {
	compatible = "100ask,virtual_pinctrl";
};

gpio_virt: virtual_gpiocontroller {
	compatible = "100ask,virtual_gpio";
    gpio-controller;
    #gpio-cells = <2>;
    ngpios = <4>;
    gpio-ranges = <&pinctrl_virt 0 0 4>; 
};

myled {
	compatible = "100ask,leddrv";
	led-gpios = <&gpio_virt 0 GPIO_ACTIVE_LOW>;
};

3. 编程

3.1 GPIO控制器编程

gpio_chip中提供request函数:

代码语言:javascript
复制
chip->request = gpiochip_generic_request;
3.2 Pinctrl编程
代码语言:javascript
复制
static const struct pinmux_ops virtual_pmx_ops = {
	.get_functions_count = virtual_pmx_get_funcs_count,
	.get_function_name = virtual_pmx_get_func_name,
	.get_function_groups = virtual_pmx_get_groups,
	.set_mux = virtual_pmx_set,
    .gpio_request_enable = virtual_pmx_gpio_request_enable,
};

4. 上机实验

4.1 设置工具链
1. STM32MP157

注意:对于STM32MP157,以前说编译内核/驱动、编译APP的工具链不一样,其实编译APP用的工具链也能用来编译内核。

代码语言:javascript
复制
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
2. IMX6ULL
代码语言:javascript
复制
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
4.2 编译、替换设备树
1. STM32MP157
在这里插入图片描述
在这里插入图片描述
2. IMX6ULL
4.3 编译、安装驱动程序

5. 再次开后门

在STM32MP157的内核中,

Pinctrl驱动中并没有提供pmxops->gpio_request_enablepmxops->request

为什么也可一直接使用GPIO功能?

它的gpio_chip结构体中,有direction_inputdirection_output,这2个函数的调用关系如下:

代码语言:javascript
复制
direction_output/direction_input
    pinctrl_gpio_direction
    	ret = pinmux_gpio_direction(pctldev, range, pin, input);
					ret = ops->gpio_set_direction(pctldev, range, pin, input);
								stm32_pmx_gpio_set_direction
                                    stm32_pmx_set_mode  // 它会设置引脚为GPIO功能                  

6. IMX6ULL的特殊情况

IMX6ULL使用GPIO时必须设置Pinctrl,如果不设置,只有那些默认就是GPIO功能的引脚可以正常使用。

原因:

代码语言:javascript
复制
### 6. IMX6ULL的特殊情况

IMX6ULL使用GPIO时必须设置Pinctrl,如果不设置,只有那些默认就是GPIO功能的引脚可以正常使用。

原因:

* GPIO控制器的设备树中,没有`gpio-ranges`
* Pinctrl驱动中并没有提供`pmxops->gpio_request_enable`或`pmxops->request`
* gpio_chip结构体中`direction_input`、`direction_output`,并没有配置引脚为GPIO功能
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 资料下载
  • 视频观看
  • 编程_GPIO使用Pinctrl
    • 1. 我们要做什么
      • 1.1 表明GPIO和Pinctrl间的联系
      • 1.2 解析这些联系
      • 1.3 编程
    • 2. 编写设备树
      • 3. 编程
        • 3.1 GPIO控制器编程
        • 3.2 Pinctrl编程
      • 4. 上机实验
        • 4.1 设置工具链
        • 4.2 编译、替换设备树
        • 4.3 编译、安装驱动程序
      • 5. 再次开后门
        • 6. IMX6ULL的特殊情况
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档