From cc786d6d82f9759acaedb2f48ef84e651c04e6bc Mon Sep 17 00:00:00 2001 From: David Michaeli Date: Thu, 8 Jun 2023 08:47:58 +0000 Subject: [PATCH] added kernel module runtime parameter change (ioctls) --- driver/smi_stream_dev.c | 70 +++++++++++++++++++++++++++++++++++++++++ driver/smi_stream_dev.h | 6 ++++ 2 files changed, 76 insertions(+) diff --git a/driver/smi_stream_dev.c b/driver/smi_stream_dev.c index a951d4d..5cce78e 100644 --- a/driver/smi_stream_dev.c +++ b/driver/smi_stream_dev.c @@ -421,6 +421,76 @@ static long smi_stream_ioctl(struct file *file, unsigned int cmd, unsigned long break; } + //------------------------------- + case SMI_STREAM_IOC_SET_FIFO_MULT: + { + int temp = (int)arg; + if (temp > 20 || temp < 2) + { + dev_err(inst->dev, "Parameter error: 2dev, "Setting FIFO size multiplier to %d", temp); + fifo_mtu_multiplier = temp; + break; + } + //------------------------------- + case SMI_STREAM_IOC_SET_ADDR_DIR_OFFSET: + { + int temp = (int)arg; + if (temp > 4 || temp < -1) + { + dev_err(inst->dev, "Parameter error: 0<=addr_dir_offset<=4 or (-1 - unused), got %d", temp); + return -EINVAL; + } + dev_info(inst->dev, "Setting address direction indication offset to %d", temp); + addr_dir_offset = temp; + break; + } + //------------------------------- + case SMI_STREAM_IOC_SET_ADDR_CH_OFFSET: + { + int temp = (int)arg; + if (temp > 4 || temp < -1) + { + dev_err(inst->dev, "Parameter error: 0<=addr_ch_offset<=4 or (-1 - unused), got %d", temp); + return -EINVAL; + } + dev_info(inst->dev, "Setting address channel indication offset to %d", temp); + addr_ch_offset = temp; + break; + } + + //------------------------------- + case SMI_STREAM_IOC_GET_FIFO_MULT: + { + dev_dbg(inst->dev, "Reading FIFO size multiplier of %d", fifo_mtu_multiplier); + if (copy_to_user((void *)arg, &fifo_mtu_multiplier, sizeof(fifo_mtu_multiplier))) + { + dev_err(inst->dev, "fifo_mtu_multiplier copy failed."); + } + break; + } + //------------------------------- + case SMI_STREAM_IOC_GET_ADDR_DIR_OFFSET: + { + dev_dbg(inst->dev, "Reading address direction indication offset of %d", addr_dir_offset); + if (copy_to_user((void *)arg, &addr_dir_offset, sizeof(addr_dir_offset))) + { + dev_err(inst->dev, "addr_dir_offset copy failed."); + } + break; + } + //------------------------------- + case SMI_STREAM_IOC_GET_ADDR_CH_OFFSET: + { + dev_dbg(inst->dev, "Reading address channel indication offset of %d", addr_ch_offset); + if (copy_to_user((void *)arg, &addr_ch_offset, sizeof(addr_ch_offset))) + { + dev_err(inst->dev, "addr_ch_offset copy failed."); + } + break; + } //------------------------------- default: dev_err(inst->dev, "invalid ioctl cmd: %d", cmd); diff --git a/driver/smi_stream_dev.h b/driver/smi_stream_dev.h index 087fee5..9bf5310 100644 --- a/driver/smi_stream_dev.h +++ b/driver/smi_stream_dev.h @@ -99,5 +99,11 @@ struct bcm2835_smi_instance { #define SMI_STREAM_IOC_GET_NATIVE_BUF_SIZE _IO(BCM2835_SMI_IOC_MAGIC,(BCM2835_SMI_IOC_MAX+1)) #define SMI_STREAM_IOC_SET_STREAM_STATUS _IO(BCM2835_SMI_IOC_MAGIC,(BCM2835_SMI_IOC_MAX+2)) #define SMI_STREAM_IOC_SET_STREAM_IN_CHANNEL _IO(BCM2835_SMI_IOC_MAGIC,(BCM2835_SMI_IOC_MAX+3)) +#define SMI_STREAM_IOC_SET_FIFO_MULT _IO(BCM2835_SMI_IOC_MAGIC,(BCM2835_SMI_IOC_MAX+4)) +#define SMI_STREAM_IOC_SET_ADDR_DIR_OFFSET _IO(BCM2835_SMI_IOC_MAGIC,(BCM2835_SMI_IOC_MAX+5)) +#define SMI_STREAM_IOC_SET_ADDR_CH_OFFSET _IO(BCM2835_SMI_IOC_MAGIC,(BCM2835_SMI_IOC_MAX+6)) +#define SMI_STREAM_IOC_GET_FIFO_MULT _IO(BCM2835_SMI_IOC_MAGIC,(BCM2835_SMI_IOC_MAX+7)) +#define SMI_STREAM_IOC_GET_ADDR_DIR_OFFSET _IO(BCM2835_SMI_IOC_MAGIC,(BCM2835_SMI_IOC_MAX+8)) +#define SMI_STREAM_IOC_GET_ADDR_CH_OFFSET _IO(BCM2835_SMI_IOC_MAGIC,(BCM2835_SMI_IOC_MAX+9)) #endif /* _SMI_STREAM_DEV_H_ */