【驱动】GPIO 作为按键时的 设备树 配置

时间:2021-08-11 19:03:23

【驱动】GPIO作为按键时的 设备树 配置

0、设备树
0.0 别名 imx6ul.dtsi 什么作用???
/*****************************开始****************/
/ {
aliases {……
gpio0 = &gpio1;
gpio1 = &gpio2;
gpio2 = &gpio3;
gpio3 = &gpio4;
gpio4 = &gpio5;
/*****************************结束****************/

0.1 gpio imx6ul.dtsi
/*****************************开始****************/
intc: interrupt-controller@00a01000 {
compatible = “arm,cortex-a7-gic”;
//gic(Global Interrupt Controller):全局中断控制器
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x00a01000 0x1000>,
<0x00a02000 0x100>;
};
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = “simple-bus”;
interrupt-parent = <&intc>;//它的父级中断是intc全局中断控制器
ranges;
aips1: aips-bus@02000000 {
//aips: ARM IP Bus(ARM特有的总线)
//参见芯片手册165页Table 2-2. AIPS-1 memory map

        compatible = "fsl,aips-bus", "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x02000000 0x100000>;
ranges;

gpio1: gpio@0209c000 {
compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
reg = <0x0209c000 0x4000>;

//参见芯片手册165页Table 2-2. AIPS-1 memory map

            interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;

/************************************************
*第一个cell表示中断类型,0代表SPI interrupts,1代表PPI interrupts
*第二个cell表示中断号码,SPI interrupts的中断号范围是0 ~ 987,而PPI
*interrupts的中断号范围是0 ~ 15
*第三个cell表示触发方式,它有4个值,分别为1,2,4,8
*1表示上升沿触发,2表示下降沿触发
*4表示高电平触发,8表示低电平触发.
************************************************/
gpio-controller;//表明自己的身份为gpio控制器
#gpio-cells = <2>;
//第一个cell表示gpio号,第二个cell表示gpio默认电平
interrupt-controller;//表明自己的身份为中断控制器
#interrupt-cells = <2>;
//第一个cell表示中断号,第二个cell表示中断触发方式
};
//gpio2-gpio5与gpio1类似
iomuxc: iomuxc@020e0000 {
compatible = “fsl,imx6ul-iomuxc”;
reg = <0x020e0000 0x4000>;
};
/*****************************结束****************/

0.2 iomux
/*****************************开始****************/
364 &iomuxc {
365 pinctrl-names = “default”;
366 pinctrl-0 = <&pinctrl_hog_1>;
367 imx6ul-evk {
368 pinctrl_hog_1: hoggrp-1 {//gpio控制器的子节点
369 fsl,pins = <
370 MX6UL_PAD_LCD_RESET__WDOG1_WDOG_ANY 0x30b0
371 MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
372 MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059 /* SD1 VSELECT */
373 MX6UL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x80000000 /ACC INT/
374 MX6UL_PAD_LCD_DATA18__GPIO3_IO23 0x10b0
375 >;
376 };
/*****************************结束****************/

1、配置/sys文件系统
1.0 导出GPIO
root@freescale /sys/class/gpio echo87>export1.0.1root@freescale/sys/class/gpio echo 87 > export
sh: write error: Device or resource busy

1.1 查看
root@freescale /sys/class/gpio$ ls
export gpio87 gpiochip128 gpiochip32 gpiochip96
gpio252 gpiochip0 gpiochip248 gpiochip64 unexport

1.2 进入gpio87
root@freescale /sys/class/gpio cdgpio87/root@freescale/sys/devices/soc0/soc.0/2000000.aipsbus/20a4000.gpio/gpio/gpio87 ls
active_low direction power uevent
device edge subsystem value
1.2.1 soc.0/2000000.aips-bus/20a4000.gpio解释
soc.0芯片上地址为2000000的apis的总线上,gpio地址为20a4000

1.3 设置为输出端口
root@freescale /sys/devices/soc0/soc.0/2000000.aips-bus/20a4000.gpio/gpio/gpio87$ echo in > direction

1.4 设置中断类型
// none表示引脚为输入,不是中断引脚
// rising表示引脚为中断输入,上升沿触发
// falling表示引脚为中断输入,下降沿触发
// both表示引脚为中断输入,边沿触发
root@freescale /sys/devices/soc0/soc.0/2000000.aips-bus/20a4000.gpio/gpio/gpio87$ echo falling > edge