使用shell脚本控制gpio输出高低电平

基础版

复用了gpio26~gpio37、gpio52,进行测试输出高低电平,
gpio_led.sh:用于点亮led灯

#!/bin/bash

# 设置GPIO Pin编号
PINS=(26 27 28 29 30 31 32 33 34 35 36 37 52)

# 设置GPIO Pin为输出模式
for PIN in ${PINS[@]}
do
    echo $PIN > /sys/class/gpio/export
    echo "out" > /sys/class/gpio/gpio$PIN/direction
done

# 循环控制LED灯闪烁
while true
do
    for PIN in ${PINS[@]}
    do
        echo "1" > /sys/class/gpio/gpio$PIN/value # 设置高电平
    done
    sleep 1 # 延时1for PIN in ${PINS[@]}
    do
        echo "0" > /sys/class/gpio/gpio$PIN/value # 设置低电平
    done
    sleep 1 # 延时1秒
done

gpio_unexport.sh:用于将gpio取消export

#!/bin/bash

# 设置GPIO Pin编号
PINS=(26 27 28 29 30 31 32 33 34 35 36 37 52)

for PIN in ${PINS[@]}
do
    echo $PIN > /sys/class/gpio/unexport
done

升级版

gpio_test.sh
使用方法:./gpio_test.sh d c
其中 d代表每次亮点/熄灭的时长,单位为s,默认0.3s
c为循环测试次数,默认为1W次,比如
./gpio_test.sh 1 100 意思是每次亮点/熄灭时长为1秒,循环测试100次

#!/bin/bash

function clear()
{
# 设置GPIO Pin编号
PINS=(26 27 28 29 30 31 32 33 34 35 36 37 52)

for PIN in ${PINS[@]}
do
    [ -d /sys/class/gpio/gpio$PIN ] && echo $PIN > /sys/class/gpio/unexport
done
}

function light()
{

clear

# 设置GPIO Pin编号
PINS=(26 27 28 29 30 31 32 33 34 35 36 37 52)

# 设置GPIO Pin为输出模式
for PIN in ${PINS[@]}
do
    [ ! -d /sys/class/gpio/gpio$PIN ] &&  echo $PIN > /sys/class/gpio/export
    echo "out" > /sys/class/gpio/gpio$PIN/direction
done

# 循环控制LED灯闪烁
#while true
for _i in $(seq 1 $2)
do
    for PIN in ${PINS[@]}
    do
        echo "1" > /sys/class/gpio/gpio$PIN/value # 设置高电平
    done
    sleep $1 # 延时1for PIN in ${PINS[@]}
    do
        echo "0" > /sys/class/gpio/gpio$PIN/value # 设置低电平
    done
    sleep $1 # 延时1秒
done

}

[ -n "$1" ] && duration=$1 || duration=0.3 # 每次亮灯/熄灯时长(s) 默认0.3[ -n "$2" ] && loop_count=$2 || loop_count=10000 # 循环测试次数,默认(1W次)

light $duration $loop_count

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,用于在Linux内核中使用ioctl接口控制GPIO输出低电平和响应中断。该示例使用GPIO子系统和GPIO键盘驱动程序。 首先,需要定义ioctl命令和相应的结构体: ```c #define GPIO_IOC_MAGIC 'k' #define GPIO_IOC_SET_OUTPUT _IOW(GPIO_IOC_MAGIC, 1, int) #define GPIO_IOC_SET_INPUT _IOW(GPIO_IOC_MAGIC, 2, int) #define GPIO_IOC_SET_VALUE _IOW(GPIO_IOC_MAGIC, 3, int) #define GPIO_IOC_GET_VALUE _IOR(GPIO_IOC_MAGIC, 4, int) #define GPIO_IOC_ENABLE_IRQ _IOW(GPIO_IOC_MAGIC, 5, int) #define GPIO_IOC_DISABLE_IRQ _IOW(GPIO_IOC_MAGIC, 6, int) struct gpio_ioctl_data { int pin; int value; }; ``` 然后,在字符设备驱动程序的ioctl函数中实现这些命令: ```c static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct gpio_chip *chip = filp->private_data; struct gpio_ioctl_data data; int ret; switch (cmd) { case GPIO_IOC_SET_OUTPUT: ret = copy_from_user(&data, (void __user *)arg, sizeof(data)); if (ret) return -EFAULT; gpio_direction_output(chip->base + data.pin, data.value); break; case GPIO_IOC_SET_INPUT: ret = copy_from_user(&data, (void __user *)arg, sizeof(data)); if (ret) return -EFAULT; gpio_direction_input(chip->base + data.pin); break; case GPIO_IOC_SET_VALUE: ret = copy_from_user(&data, (void __user *)arg, sizeof(data)); if (ret) return -EFAULT; gpio_set_value(chip->base + data.pin, data.value); break; case GPIO_IOC_GET_VALUE: ret = copy_from_user(&data, (void __user *)arg, sizeof(data)); if (ret) return -EFAULT; data.value = gpio_get_value(chip->base + data.pin); ret = copy_to_user((void __user *)arg, &data, sizeof(data)); if (ret) return -EFAULT; break; case GPIO_IOC_ENABLE_IRQ: ret = copy_from_user(&data, (void __user *)arg, sizeof(data)); if (ret) return -EFAULT; gpio_direction_input(chip->base + data.pin); ret = request_irq(gpio_to_irq(chip->base + data.pin), gpio_irq_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "gpio_irq_handler", chip); if (ret) return -EINVAL; break; case GPIO_IOC_DISABLE_IRQ: ret = copy_from_user(&data, (void __user *)arg, sizeof(data)); if (ret) return -EFAULT; free_irq(gpio_to_irq(chip->base + data.pin), chip); break; default: return -EINVAL; } return 0; } ``` 最后,需要实现GPIO中断处理程序gpio_irq_handler: ```c static irqreturn_t gpio_irq_handler(int irq, void *dev_id) { struct gpio_chip *chip = dev_id; unsigned long flags; spin_lock_irqsave(&chip->lock, flags); // 处理中断事件 // ... spin_unlock_irqrestore(&chip->lock, flags); return IRQ_HANDLED; } ``` 这样,就可以通过ioctl接口控制GPIO输出低电平和响应中断了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值