diff options
author | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2003-07-05 18:00:34 +0000 |
---|---|---|
committer | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2003-07-05 18:00:34 +0000 |
commit | c39e312572dbd0769a616c94986d1d935f74807c (patch) | |
tree | 5cd9bc98b5dfee3986cc26900663139a6c370bf1 | |
parent | 1415cc3356fe350ffe8078fb3aa1b27b491336e6 (diff) |
Add register write capability
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@209 5390a7c7-147a-4af0-8ec9-7488f05a26cb
-rwxr-xr-x | fxstest.c | 23 | ||||
-rwxr-xr-x | wcfxs.c | 13 | ||||
-rwxr-xr-x | wcfxs.h | 11 | ||||
-rwxr-xr-x | wctdm.c | 13 | ||||
-rwxr-xr-x | wctdm.h | 11 |
5 files changed, 67 insertions, 4 deletions
@@ -84,6 +84,29 @@ int main(int argc, char *argv[]) } printf("\n\n"); } + } else if (!strcasecmp(argv[2], "setdirect") || + !strcasecmp(argv[2], "setindirect")) { + struct wcfxs_regop regop; + int val; + int reg; + if ((argc < 5) || (sscanf(argv[3], "%i", ®) != 1) || + (sscanf(argv[4], "%i", &val) != 1)) { + fprintf(stderr, "Need a register and value...\n"); + } else { + regop.reg = reg; + regop.val = val; + if (!strcasecmp(argv[2], "setindirect")) { + regop.indirect = 1; + regop.val &= 0xff; + } else { + regop.indirect = 0; + } + res = ioctl(fd, WCFXS_SET_REG, ®op); + if (res) + fprintf(stderr, "Unable to get registers on channel %s\n", argv[1]); + else + printf("Success.\n"); + } } else fprintf(stderr, "Invalid command\n"); close(fd); @@ -843,6 +843,7 @@ static int wcfxs_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long dat { struct wcfxs_stats stats; struct wcfxs_regs regs; + struct wcfxs_regop regop; struct wcfxs *wc = chan->pvt; int x; switch (cmd) { @@ -861,6 +862,18 @@ static int wcfxs_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long dat if (copy_to_user((struct wcfxs_regs *)data, ®s, sizeof(regs))) return -EFAULT; break; + case WCFXS_SET_REG: + if (copy_from_user(®op, (struct wcfxs_regop *)data, sizeof(regop))) + return -EFAULT; + if (regop.indirect) { + printk("Setting indirect %d to 0x%04x on %d\n", regop.reg, regop.val, chan->chanpos); + wcfxs_setreg_indirect(wc, chan->chanpos - 1, regop.reg, regop.val); + } else { + regop.val &= 0xff; + printk("Setting direct %d to %04x on %d\n", regop.reg, regop.val, chan->chanpos); + wcfxs_setreg(wc, chan->chanpos - 1, regop.reg, regop.val); + } + break; default: return -ENOTTY; } @@ -39,6 +39,13 @@ struct wcfxs_regs { unsigned short indirect[NUM_INDIRECT_REGS]; }; -#define WCFXS_GET_STATS _IOW (ZT_CODE, 60, struct wcfxs_stats) -#define WCFXS_GET_REGS _IOW (ZT_CODE, 60, struct wcfxs_regs) +struct wcfxs_regop { + int indirect; + unsigned char reg; + unsigned short val; +}; + +#define WCFXS_GET_STATS _IOR (ZT_CODE, 60, struct wcfxs_stats) +#define WCFXS_GET_REGS _IOR (ZT_CODE, 61, struct wcfxs_regs) +#define WCFXS_SET_REG _IOW (ZT_CODE, 62, struct wcfxs_regop) @@ -843,6 +843,7 @@ static int wcfxs_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long dat { struct wcfxs_stats stats; struct wcfxs_regs regs; + struct wcfxs_regop regop; struct wcfxs *wc = chan->pvt; int x; switch (cmd) { @@ -861,6 +862,18 @@ static int wcfxs_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long dat if (copy_to_user((struct wcfxs_regs *)data, ®s, sizeof(regs))) return -EFAULT; break; + case WCFXS_SET_REG: + if (copy_from_user(®op, (struct wcfxs_regop *)data, sizeof(regop))) + return -EFAULT; + if (regop.indirect) { + printk("Setting indirect %d to 0x%04x on %d\n", regop.reg, regop.val, chan->chanpos); + wcfxs_setreg_indirect(wc, chan->chanpos - 1, regop.reg, regop.val); + } else { + regop.val &= 0xff; + printk("Setting direct %d to %04x on %d\n", regop.reg, regop.val, chan->chanpos); + wcfxs_setreg(wc, chan->chanpos - 1, regop.reg, regop.val); + } + break; default: return -ENOTTY; } @@ -39,6 +39,13 @@ struct wcfxs_regs { unsigned short indirect[NUM_INDIRECT_REGS]; }; -#define WCFXS_GET_STATS _IOW (ZT_CODE, 60, struct wcfxs_stats) -#define WCFXS_GET_REGS _IOW (ZT_CODE, 60, struct wcfxs_regs) +struct wcfxs_regop { + int indirect; + unsigned char reg; + unsigned short val; +}; + +#define WCFXS_GET_STATS _IOR (ZT_CODE, 60, struct wcfxs_stats) +#define WCFXS_GET_REGS _IOR (ZT_CODE, 61, struct wcfxs_regs) +#define WCFXS_SET_REG _IOW (ZT_CODE, 62, struct wcfxs_regop) |