88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
'''
|
||
# @Time : 2025/2/18 17:49
|
||
# @Author : hjw
|
||
# @File : export_pin.py
|
||
'''
|
||
|
||
import os
|
||
import time
|
||
|
||
|
||
class GPIOChipController:
|
||
def __init__(self, chip_path="/sys/class/gpio/gpiochip0"): # 注意引脚分组
|
||
# 读取GPIO控制器信息
|
||
self.base = int(self._read_file(os.path.join(chip_path, "base")))
|
||
self.ngpio = int(self._read_file(os.path.join(chip_path, "ngpio")))
|
||
self.label = self._read_file(os.path.join(chip_path, "label"))
|
||
print(f"GPIO控制器信息: {self.label} (base={self.base}, ngpio={self.ngpio})")
|
||
|
||
def _read_file(self, path):
|
||
with open(path, 'r') as f:
|
||
return f.read().strip()
|
||
|
||
def _write_file(self, path, value):
|
||
with open(path, 'w') as f:
|
||
f.write(str(value))
|
||
|
||
def export_gpio(self, offset):
|
||
"""导出指定控制器的GPIO引脚"""
|
||
if offset < 0 or offset >= self.ngpio:
|
||
raise ValueError(f"偏移量必须在0-{self.ngpio - 1}范围内")
|
||
|
||
gpio_number = self.base + offset
|
||
export_path = "/sys/class/gpio/export"
|
||
if not os.path.exists(f"/sys/class/gpio/gpio{gpio_number}"):
|
||
try:
|
||
self._write_file(export_path, gpio_number)
|
||
time.sleep(0.1) # 等待系统创建目录
|
||
except IOError as e:
|
||
if "Device or resource busy" in str(e):
|
||
print(f"GPIO{gpio_number} 已经导出")
|
||
else:
|
||
raise
|
||
return gpio_number
|
||
|
||
def setup_gpio(self, gpio_number, direction='out'):
|
||
"""配置GPIO方向"""
|
||
direction_path = f"/sys/class/gpio/gpio{gpio_number}/direction"
|
||
self._write_file(direction_path, direction)
|
||
|
||
def set_gpio(self, gpio_number, value):
|
||
"""设置GPIO电平"""
|
||
value_path = f"/sys/class/gpio/gpio{gpio_number}/value"
|
||
self._write_file(value_path, 1 if value else 0)
|
||
|
||
def read_gpio(self, gpio_number):
|
||
"""读取GPIO电平"""
|
||
value_path = f"/sys/class/gpio/gpio{gpio_number}/value"
|
||
return int(self._read_file(value_path))
|
||
|
||
|
||
if __name__ == "__main__":
|
||
"""
|
||
rk3506导出引脚
|
||
该脚本导出扩展口引脚 SAI1_SDO0(17) 对应 GPIO0_B4_d 8 + 4 = 12
|
||
"""
|
||
try:
|
||
# 初始化GPIO控制器
|
||
ctrl = GPIOChipController()
|
||
|
||
# 导出并配置GPIO (假设控制器的base=0,偏移量B4即12)
|
||
gpio_num = ctrl.export_gpio(12)
|
||
ctrl.setup_gpio(gpio_num, 'out')
|
||
|
||
# 引脚高低电平测试
|
||
for _ in range(10):
|
||
ctrl.set_gpio(gpio_num, 1)
|
||
print(f"GPIO{gpio_num} 置高")
|
||
time.sleep(10)
|
||
ctrl.set_gpio(gpio_num, 0)
|
||
print(f"GPIO{gpio_num} 置低")
|
||
time.sleep(1)
|
||
|
||
except PermissionError:
|
||
print("需要root权限!请使用sudo运行")
|
||
except Exception as e:
|
||
print(f"发生错误: {str(e)}") |