跳到主要内容

IR-CUT - 内置 IR-CUT 驱动

V821 芯片内置了 IR-CUT 直驱功能,位于 PD22 PD23 引脚,支持直接驱动 IR-CUT 省下独立 IR-CUT 驱动的成本。其他引脚没有直驱能力,需要挂载 IR-CUT 驱动芯片。

其电路连接如下图所示:

image-20241227104329086

驱动配置

内核驱动配置

执行 make kernel_menuconfig 进入内核配置驱动,前往下列路径

Allwinner BSP  --->
Device Drivers --->
Misc Devices Drivers --->
<*> Allwinner ir-cut driver

image-20241227104620047

设备树配置

IR-CUT 设备树配置如下:

&ircut {
ircut_pin_a = <&pio PD 22 GPIO_ACTIVE_HIGH>;
ircut_pin_b = <&pio PD 23 GPIO_ACTIVE_HIGH>;
ircut_pin_drv = <3>;
ircut_open = <GPIO_ACTIVE_HIGH GPIO_ACTIVE_LOW>;
hold_time = <1000>;
status = "okay";
};
字段含义
ircut_pin_a定义了 IR CUT 滤镜控制引脚 A,连接到 PD 22 引脚,GPIO 高电平有效
ircut_pin_b定义了 IR CUT 滤镜控制引脚 B,连接到 PD 23 引脚,GPIO 高电平有效
ircut_pin_drv定义了 IR CUT 滤镜引脚驱动能力,可配置驱动能力 0,1,2,3,根据 IR CUT 物料实际调整
ircut_open定义了 IR CUT 滤镜开启时的电平:
<GPIO_ACTIVE_HIGH GPIO_ACTIVE_LOW> 表示控制引脚 A 高电平,控制引脚 B 低电平会控制 IR CUT 滤镜开启
hold_time定义了 IR CUT 滤镜切换的保持时间,单位是毫秒
status设置设备的状态为 "okay",表示该设备启用

模块使用

IR-CUT 模块启动后会在 sys 中创建控制节点,节点路径如下:

/sys/devices/platform/soc@2002000/42000358.ircut/sunxi_ircut/ircut

image-20241227161257883

节点的含义如下:

节点含义读取写入
ircut_ctr控制是否启用IR-CUT,如果是支持的引脚会启用直驱模式获取当前 ircut 功能启用状态
enable,disable
设置 ircut 功能启用状态
enable,disable
ircut_status设置 IR-CUT 状态,会根据设备树设置的 ircut_open 的电平去操作 IR CUT,然后等待设备树设置的 hold_time 后将双引脚拉低,这个节点是阻塞的以保证操作完成。获取当前 ircut 状态
open,close,unknow
设置 ircut 状态
open,close
ircut_pin_drv设置 IR-CUT 引脚的驱动能力获取当前驱动能力,获取值 0,1,2,3 四个档位设置当前驱动能力,设置值 0,1,2,3 四个档位
ircut_hold_time设置 IR-CUT 的切换保持时间,单位ms获取当前保持时间设置保存时间,单位ms
ircut_pin_a设置 IR-CUT 引脚 A 的电平获取当前电平
0,1
设置电平
0,1
ircut_pin_b设置 IR-CUT 引脚 B 的电平获取当前电平
0,1
设置电平
0,1

使用示例

(1)配置启用 IR-CUT

echo enable > ircut_ctr

(2)设置 IR-CUT 开启

echo open > ircut_status

(3)设置 IR-CUT 关闭

echo close > ircut_status

(4)单独设置 IR-CUT PIN A 的电平为高

echo 1 > ircut_pin_a

(5)单独设置 IR-CUT PIN B 的电平为低

echo 0 > ircut_pin_b

(6)关闭 IR-CUT 驱动功能

echo disable > ircut_ctr

(7)调试 HOLD 时间到 1000ms

echo 1000 > ircut_hold_time

(8)设置引脚驱动能力

echo 3 > ircut_pin_drv

测试程序

#include <stdio.h>
#include <stdlib.h>

#define IRCUT_DIR "/sys/devices/platform/soc@2002000/42000358.ircut/sunxi_ircut/ircut"

// 定义一个函数,用于写入值到指定的文件
void write_to_file(const char *file, const char *value) {
FILE *fp = fopen(file, "w");
if (fp == NULL) {
perror("Failed to open file");
exit(EXIT_FAILURE);
}
fprintf(fp, "%s\n", value);
fclose(fp);
}

int main() {
// 配置启用 IR-CUT
write_to_file(IRCUT_DIR "/ircut_ctr", "enable");
printf("IR-CUT enabled.\n");

// 设置引脚驱动能力
write_to_file(IRCUT_DIR "/ircut_pin_drv", "3");
printf("IR-CUT pin drive strength set to 3.\n");

// 调试 HOLD 时间到 1000ms
write_to_file(IRCUT_DIR "/ircut_hold_time", "1000");
printf("IR-CUT hold time set to 1000ms.\n");

// 设置 IR-CUT 开启
write_to_file(IRCUT_DIR "/ircut_status", "open");
printf("IR-CUT opened.\n");

// 设置 IR-CUT 关闭
write_to_file(IRCUT_DIR "/ircut_status", "close");
printf("IR-CUT closed.\n");

// 单独设置 IR-CUT PIN A 的电平为高
write_to_file(IRCUT_DIR "/ircut_pin_a", "1");
printf("IR-CUT PIN A set to high.\n");

// 单独设置 IR-CUT PIN B 的电平为低
write_to_file(IRCUT_DIR "/ircut_pin_b", "0");
printf("IR-CUT PIN B set to low.\n");

// 关闭 IR-CUT 驱动功能
write_to_file(IRCUT_DIR "/ircut_ctr", "disable");
printf("IR-CUT driver disabled.\n");

return 0;
}