/* Cleopatre project {{{ * * Copyright (C) 2009 Spidcom * * <<>> * * }}} */ /** * \file afe.c * \brief « brief description » * \ingroup « module » * * « long description » */ #include #include #include #include #include "linux/afe.h" enum modeinfo { READ=0, WRITE }; struct init_info { enum modeinfo mode; unsigned int reg; unsigned int val; }; static void help(char *file) { printf("Usage: %s R/W reg [val]\n",file); printf("R/W read or write in a register.\n"); printf("reg register offset.\n"); printf("val value to write in a register.\n"); } static int parse_args(struct init_info *init, int argc, const char **argv) { int i; int result = 0; if(argc<3 && argc>4) { help((char*)basename(argv[0])); return -1; } if(!strcmp(argv[1],"R")) { init->mode = READ; init->reg = (unsigned int)strtoul(argv[2],NULL,0); } else if (!strcmp(argv[1],"W")) { init->mode = WRITE; init->reg = (unsigned int)strtoul(argv[2],NULL,0); init->val = (unsigned int)strtoul(argv[3],NULL,0); } else { help((char*)basename(argv[0])); return -1; } return result; } int main(int argc, const char **argv) { int fd; struct init_info init; struct afe_info cmd; if(parse_args(&init, argc, argv)) return 0; //Open AFE device if((fd=open("/dev/afe",O_RDWR))<0) { fprintf(stderr,"Unable to open AFE device.\n"); return -1; } //Store init information cmd.reg = init.reg; cmd.val = init.val; // Send command trough ioctl channel if(init.mode == WRITE) { if(ioctl(fd, AFEIOC_SETREG, (unsigned long*)&cmd) < 0) { printf("Shell Error: ioctl SET Error\n"); return -1; } printf("Write: 0x%x=0x%x\n", cmd.reg, cmd.val); } else { if(ioctl(fd, AFEIOC_GETREG, (unsigned long*)&cmd) < 0) { printf("Shell Error: ioctl GET Error\n"); return -1; } printf("Read: 0x%x=0x%x\n", cmd.reg, cmd.val); } //Close AFE device if(close(fd) < 0) { printf("Shell Error: close error\n"); return -1; } return 0; }