add -6_Pinctrl/03_Pinctrl子系统使用示例_基于IMX6ULL,STM32MP157

This commit is contained in:
weidongshan
2021-05-02 16:21:47 +08:00
parent 01de071e30
commit 49e542ede6
12 changed files with 199 additions and 0 deletions

View File

@@ -0,0 +1,90 @@
## Pinctrl子系统使用示例_基于IMX6ULL
参考资料:
* Linux 5.x内核文档
* Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt
* Linux 4.x内核文档
* Documentation\pinctrl.txt
* Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt
### 1. 要做什么
以I2C为例
![image-20210502105854634](pic/06_Pinctrl/07_i2c_example.png)
* 查看原理图确定使用哪些引脚比如pinA、pinB
* 生成pincontroller设备树信息
* 选择功能比如把pinA配置为I2C_SCL、把pinB配置为I2C_SDA
* 配置比如把pinA、pinB配置为open drain
* 使用pincontroller设备树信息比如在i2c节点里定义"pinctrl-names"、"pinctrl-0"
### 2. 生成pincontroller设备树信息
生成pincontroller设备树信息有3中方法
* 有些芯片有图形化的工具可以点点鼠标就可以配置引脚信息得到pincontroller中的信息
* 有些芯片,只能看厂家给的设备树文档或者参考设备树的例子
* 最差的就是需要阅读驱动代码才能构造设备树信息。
#### 2.1 安装工具
对于IMX6ULL有引脚配置工具/设备树生成工具:
* 打开http://download.100ask.net/
* 找到开发板:"100ASK_IMX6ULL_PRO开发板"
* 下载开发板配套资料
* 下载完后,工具在如下目录里:
![](pic/06_Pinctrl/08_pins_tools.png)
#### 2.2 根据原理图生成pinctrl信息
```shell
&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <&BOARD_InitPins>;
imx6ull-board {
i2c1_pins: i2c1_pins { /*!< Function assigned for the core: Cortex-A7[ca7] */
fsl,pins = <
MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x000018B0
MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x000018B0
>;
};
};
};
```
### 3. 在client节点使用pinctrl
```shell
&i2c1 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&i2c1_pins>;
status = "okay";
};
```
### 4. 使用过程
这是透明的我们的驱动基本不用管。当设备切换状态时对应的pinctrl就会被调用。
比如在platform_device和platform_driver的枚举过程中流程如下
![](pic/06_Pinctrl/09_pinctrl_really_probe.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View File

@@ -178,6 +178,13 @@ git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
02_使用Pinctrl要掌握的重要概念
```
* 2021.04.30 发布"Pinctrl子系统"
```shell
03_Pinctrl子系统使用示例_基于IMX6ULL
03_Pinctrl子系统使用示例_基于STM32MP157
```

View File

@@ -0,0 +1,102 @@
## Pinctrl子系统使用示例_基于STM32MP157
参考资料:
* Linux 5.x内核文档
* Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt
* Linux 4.x内核文档
* Documentation\pinctrl.txt
* Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt
### 1. 要做什么
以I2C为例
![image-20210502105854634](pic/06_Pinctrl/07_i2c_example.png)
* 查看原理图确定使用哪些引脚比如pinA、pinB
* 生成pincontroller设备树信息
* 选择功能比如把pinA配置为I2C_SCL、把pinB配置为I2C_SDA
* 配置比如把pinA、pinB配置为open drain
* 使用pincontroller设备树信息比如在i2c节点里定义"pinctrl-names"、"pinctrl-0"
### 2. 生成pincontroller设备树信息
生成pincontroller设备树信息有3中方法
* 有些芯片有图形化的工具可以点点鼠标就可以配置引脚信息得到pincontroller中的信息
* 有些芯片,只能看厂家给的设备树文档或者参考设备树的例子
* 最差的就是需要阅读驱动代码才能构造设备树信息。
#### 2.1 安装工具
对于STM32MP157有引脚配置工具/设备树生成工具:
* 打开http://download.100ask.net/
* 找到开发板:"100ASK_STM32MP157_PRO开发板"
* 下载开发板配套资料
* 下载完后,工具在如下目录里:
![](pic/06_Pinctrl/10_pins_tools.png)
#### 2.2 根据原理图生成pinctrl信息
```shell
&pinctrl {
u-boot,dm-pre-reloc;
i2c1_pins_mx: i2c1_mx-0 {
pins {
pinmux = <STM32_PINMUX('F', 14, AF5)>, /* I2C1_SCL */
<STM32_PINMUX('F', 15, AF5)>; /* I2C1_SDA */
bias-disable;
drive-open-drain;
slew-rate = <0>;
};
};
i2c1_sleep_pins_mx: i2c1_sleep_mx-0 {
pins {
pinmux = <STM32_PINMUX('F', 14, ANALOG)>, /* I2C1_SCL */
<STM32_PINMUX('F', 15, ANALOG)>; /* I2C1_SDA */
};
};
}
```
### 3. 在client节点使用pinctrl
```shell
&i2c1{
pinctrl-names = "default", "sleep";
pinctrl-0 = <&i2c1_pins_mx>;
pinctrl-1 = <&i2c1_sleep_pins_mx>;
status = "okay";
/* USER CODE BEGIN i2c1 */
/* USER CODE END i2c1 */
};
```
### 4. 使用过程
这是透明的我们的驱动基本不用管。当设备切换状态时对应的pinctrl就会被调用。
比如在platform_device和platform_driver的枚举过程中流程如下
![](pic/06_Pinctrl/09_pinctrl_really_probe.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB