2.GPIO =========== 2.1 **GPIO介绍** -------------- GPIO是General Purpose I/O的缩写,即通用输入输出端口,简单来说就是MCU/CPU可控制的引脚, 这些引脚通常有多种功能,最基本的是高低电平输入检测和输出,部分引脚还会与主控器的片上外设绑定, 如作为串口、I2C、网络、电压检测的通讯引脚。 2.2 **GPIO命名** -------------- Rockchip Pin的ID按照 控制器(bank)+端口(port)+索引序号(pin) 组成。 + 控制器和GPIO控制器数量⼀致 + 端口固定 A、B、C和D,每个端口仅有8个索引号,(a=0,b=1,c=2,d=3) + 索引序号固定 0、1、2、3、4、5、6、7 RK3568具有5个GPIO控制器,每个控制器可以控制32个IO,作为GPIO功能时, 端口⾏为由GPIO控制器寄存器配置。 .. tip:: GPIO1_A4表达的意思为第1组控制器,端口号为A,索引号为4。该引脚号的计算公式为32 x 1 + 0 x 8 + 4 = 36 2.3 **使用GPIO sysfs接口控制IO** -------------- 2.3.1 **命令行的方式** >>>>>>>>>>>>>> 在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface, 是通过操作 /sys/class/gpio 目录下的 export 、 unexport 、gpio{N}/direction, gpio{N} /value (用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。 在kernel 4.8开始,加入了libgpiod的支持;而原有基于sysfs的访问方式,将被逐渐放弃。 以SC-3568HA举例,在40PIN引脚上挑选3个GPIO |GPIO| +----------+------------+------------+------------+---------------------------------+---------+ | **引脚** | **控制器** | **端口号** | **索引号** | **计算结果** | **PIN** | +==========+============+============+============+=================================+=========+ | GPIO4_D2 | 4 | D | 2 | 154 (32 x 4 + 8 x 3 + 2) | 7 | +----------+------------+------------+------------+---------------------------------+---------+ | GPIO2_D7 | 2 | D | 7 | 95 (32 x 2 + 8 x 3 + 7) | 18 | +----------+------------+------------+------------+---------------------------------+---------+ | GPIO0_C5 | 0 | C | 5 | 21 (32 x 0 + 8 x 2 + 5) | 29 | +----------+------------+------------+------------+---------------------------------+---------+ .. code-block:: bash :linenos: #以下所有操作均需要打开管理者权限使用(鸿蒙系统默认就是管理者权限) #使能引脚GPIO4_D2 echo 154 > /sys/class/gpio/export #设置引脚为输入模式 echo in > /sys/class/gpio/gpio154/direction #读取引脚的值 cat /sys/class/gpio/gpio154/value #设置引脚为输出模式 echo out > /sys/class/gpio/gpio154/direction #设置引脚为低电平 echo 0 > /sys/class/gpio/gpio154/value #设置引脚为高电平 echo 1 > /sys/class/gpio/gpio154/value #复位引脚 echo 154 > /sys/class/gpio/unexport 2.4 **拓展GPIO口** -------------- SC-3568HA上带有NCA9555芯片,NCA9555是一款24引脚CMOS器件,提供16位通用并行I2C总线数输入/输出GPIO扩展功能 2.4.1 **拓展GPIO口引脚** >>>>>>>>>>>>>> 目前从该芯片引出了5个IO出来使用,连接到了40PIN引脚上 |GPIO_1| |GPIO_2| .. |GPIO| image:: picture/GPIO.png :width: 7in :height: 3.92708in .. |GPIO_1| image:: picture/GPIO_1.png :width: 7in :height: 3.92708in .. |GPIO_2| image:: picture/GPIO_2.png :width: 7in :height: 3.92708in +---------+--------+ | NCA9555 | 40PIN | +=========+========+ | IO1_1 | 35 | +---------+--------+ | IO1_2 | 37 | +---------+--------+ | IO1_3 | 38 | +---------+--------+ | IO1_4 | 40 | +---------+--------+ | IO1_5 | 31 | +---------+--------+ 2.4.1 **拓展GPIO口使用** >>>>>>>>>>>>>> 该芯片为I2C通讯,挂载在I2C3下,驱动文件已添加,DTS配置如下: + /arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0-linux.dts .. code-block:: c :linenos: &i2c3{ nca9555:nca9555@20{ reg=<0x20>; compatible = "novosense,nca9555"; status="okay"; gpio-controller; #gpio-cells = <2>; }; }; .. note:: 在内核中使用NCA9555的IO口,其方式与普通的GPIO使用方式基本一致 例如: .. code-block:: c :linenos: //使用普通GPIO &vcc3v3_lcd0_n { gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; enable-active-high; }; //使用NCA9555的IO &vcc3v3_lcd1_n { gpio = <&nca9555 3 GPIO_ACTIVE_HIGH>; //对应NCA9555 IO0_3 enable-active-high; }; &vcc3v3_lcd2_n { gpio = <&nca9555 10 GPIO_ACTIVE_HIGH>; //对应NCA9555 IO1_2 enable-active-high; };