在https://blog.youkuaiyun.com/mike8825/article/details/80955992中,介绍了几种红外方案,这里拿spi的方式来diy一个遥控器。
如果内核版本是v4.14,直接编译kernel4.14/drivers/media/rc/ir-spi.c文件,调试下,应该就可以用了。这里稍微改造了ir-spi.c,更加容易移植。
dts参考配置
记的打开平台的dma模式(在https://blog.youkuaiyun.com/mike8825/article/details/80955992已说明原因)
&spi1 {
status = "okay";
sprd,dma-mode = <1>;
sprd,spi-mode = <3>;
irled@0 {
compatible = "ir-spi-led";
reg = <0x0>;
spi-max-frequency = <5000000>;
duty-cycle = /bits/ 8 <60>;
};
};
如果mos管是低电平导通,加上led-active-low;
ir-spi.c
// SPDX-License-Identifier: GPL-2.0
// SPI driven IR LED device driver
//
// Copyright (c) 2016 Samsung Electronics Co., Ltd.
// Copyright (c) Andi Shyti <andi@etezian.org>
#include <linux/delay.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/of_gpio.h>
#include <linux/regulator/consumer.h>
#include <linux/spi/spi.h>
#include <linux/miscdevice.h>
#include <linux/uaccess.h>
//#include <media/rc-core.h>
#define IR_SPI_DRIVER_NAME "ir-spi"
#define IR_SPI_DEFAULT_FREQUENCY 38000
#define IR_SPI_MAX_BUFSIZE 4096*4
#define TX_IR _IOW(0xf5, 0, int)
#define SET_TX_CARRIER _IOW(0xf5, 1, int)
struct ir_spi_data {
u32 freq;
bool negated;
u16 tx_buf[IR_SPI_MAX_BUFSIZE];
u16 pulse;
u16 space;
struct spi_device *spi;
struct regulator *regulator;
};
struct ir_spi_data idata;
static int ir_spi_open(struct inode *inode, struct file *file)
{
return 0;
}
static ssize_t ir_spi_tx(struct file *file,

最低0.47元/天 解锁文章
2122

被折叠的 条评论
为什么被折叠?



