pinctrl
pinctrl est de résoudre la manière traditionnelle de configurer pin est d'exploiter directement le registre correspondant, mais cette configuration
La méthode est plus lourde et sujette à des problèmes
Le travail principal du sous-système pinctrl
est le suivant :
①. Obtenez
les
informations sur les broches dans l'arborescence des périphériques.
②. Définissez la fonction de multiplexage de la broche en fonction des informations
de broche obtenues
③. Définissez les caractéristiques électriques de la broche en fonction des informations
de broche obtenues, telles que pull-up
/ pull-down, vitesse, capacité d'entraînement, etc.
Pour nos utilisateurs, nous n'avons qu'à définir les propriétés pertinentes d'une certaine broche
dans l'arborescence des appareils
et d'autres initiales.
Le travail de transformation est
effectué par le sous-système
pinctrl , et le répertoire de code source du sous-système
pinctrl est drivers/pinctrl .
Trouver un
nœud appelé
iomuxc
iomuxc
:
iomuxc@020e0000
{
compatible
=
"fsl,imx6ul-iomuxc"
;
reg
= <
0x020e0000 0x4000
>;};
&
iomuxc
ajoute des données au nœud
iomuxc
&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059
MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058
>;
};
..
pinctrl_flexcan1: flexcan1grp{
fsl,pins = <
MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX 0x1b020
MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX 0x1b020
>;
};
..
pinctrl_wdog: wdoggrp {
fsl,pins = <
MX6UL_PAD_LCD_RESET__WDOG1_WDOG_ANY 0x30b0
>;
};
};
};
Le sous-nœud pinctrl_hog_1 est
une collection de codes PIN
liés à l'échange à chaud
Le sous-noeud pinctrl_flexcan1
est
le PIN utilisé par le périphérique
flexcan1
,
Le sous-nœud pinctrl_wdog
est
la broche utilisée par le périphérique
wdog
.
combiné est
示例代码 45.1.2.3 完整的 iomuxc 节点
iomuxc: iomuxc@020e0000 {
compatible = "fsl,imx6ul-iomuxc";
reg = <0x020e0000 0x4000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059
MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058
>;
..
};
};
;
Regardez d'abord
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19
, il s'agit d'une définition de macro, définie dans le fichier
Dans
arch/arm/boot/dts/imx6ul-pinfunc.h ,
imx6ull.dtsi
fera référence au
fichier d'en-tête
imx6ull-pinfunc.h
sous-système gpio
Comme son nom l'indique, le sous-système est utilisé pour initialiser
GPIO
et fournir les fonctions
API correspondantes
, telles que la configuration
de GPIO
Pour l'entrée et la sortie, lisez la valeur de
GPIO
, etc.
L'objectif principal du sous-système gpio
est de faciliter aux développeurs de pilotes l'utilisation
de gpio
, drive
Les développeurs ajoutent des informations liées à gpio
dans l'arborescence des périphériques , puis ils peuvent utiliser l'API fournie par le sous-système gpio
dans le pilote
fonction pour faire fonctionner
GPIO
,
le noyau Linux
protège le développeur du pilote du processus de réglage
GPIO
, ce qui facilite grandement le développement du pilote
L'expéditeur utilise
GPIO
1
pinctrl_led
:
ledgrp
{
2
fsl
,
broches
= <
3
MX6UL_PAD_GPIO1_IO03__GPIO1_IO03
0x10B0
/* LED0 */
4
> ;
5
} ;
1
gpiolé
{
2
#adresse
-
cellules
= <
1
> ;
3
#taille
-
cellules
= <
1
> ;
4
compatible
=
"atkalpha-gpioled"
;
5
pinctrl
-
noms
=
"par défaut"
;
6
pinctrl
-
0
= <&
pinctrl_led
> ;
7
led
-
gpio
= <&
gpio1
3
GPIO_ACTIVE_LOW
> ;
8
statut
=
"d'accord"
;
9
}
;
Ligne
6
,
l'attribut pinctrl-0
définit le noeud
pinctrl correspondant au PIN utilisé par
la lumière LED
.
Ligne
7
,
l'attribut led-gpio
spécifie
le GPIO utilisé par
la lumière LED
, voici IO03 de GPIO1 , niveau bas
efficace. Lors de l'écriture ultérieure du pilote, le contenu de l'attribut
led-gpio
sera obtenu pour obtenir le numéro
GPIO
, car
le
sous-système gpio
Les fonctions d'opération API
traditionnelles
nécessitent des numéros
GPIO
.