diff options
author | Peter Osterlund <petero2@telia.com> | 2003-05-01 16:41:42 +0200 |
---|---|---|
committer | Peter Osterlund <petero2@telia.com> | 2006-04-09 04:00:52 +0200 |
commit | 3686d0fa73ec40629bf83b1eb1813b92c939aa15 (patch) | |
tree | d0221ad10d831c902d97388a71bcc63af71e666c /test/test-pad.c | |
parent | 1f4f3db66d995f9d5f24f5df14001773684f87ec (diff) |
Merged some stuff from version 0.11.3.
Diffstat (limited to 'test/test-pad.c')
-rw-r--r-- | test/test-pad.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/test/test-pad.c b/test/test-pad.c new file mode 100644 index 0000000..9c6d7ce --- /dev/null +++ b/test/test-pad.c @@ -0,0 +1,121 @@ +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> + +int getbyte(int fd, unsigned char *b) +{ + return(read(fd, b, 1) == 1); +} + +int putbyte(int fd, unsigned char b) +{ + unsigned char ack; + +printf("write %02X\n", b); + if(write(fd, &b, 1) != 1) + { + fprintf(stderr, "error write: %s\n", strerror(errno)); + return 0; + } + + if(!getbyte(fd, &ack)) + { + fprintf(stderr, "error read: %s\n", strerror(errno)); + return 0; + } +printf("read %02X\n", ack); + + if(ack != 0xFA) + { + fprintf(stderr, "error ack\n"); + return 0; + } + + return 1; +} + +int special_cmd(int fd, unsigned char cmd) +{ + int i; + + if(putbyte(fd, 0xE6)) + for(i=0; i<4; i++) + { +printf("special_cmd %i\n", i); + if((!putbyte(fd, 0xE8)) || (!putbyte(fd, (cmd>>6)&0x3))) + return 0; + cmd<<=2; + } + else + return 0; + return 1; +} + +int send_cmd(int fd, unsigned char cmd) +{ + return(special_cmd(fd, cmd) && putbyte(fd, 0xE9)); +} + +int identify(int fd, unsigned long int *ident) +{ + unsigned char id[3]; + + if(send_cmd(fd, 0x00) && getbyte(fd, &id[0]) && getbyte(fd, &id[1]) && getbyte(fd, &id[2])) + { + *ident = (id[0]<<16)|(id[1]<<8)|id[2]; + printf("ident %06X\n", *ident); + return 1; + } else { + fprintf(stderr, "error identify\n"); + return 0; + } +} + +int reset(int fd) +{ + unsigned char r[2]; + + if(!putbyte(fd, 0xFF)) + { + fprintf(stderr, "error reset\n"); + return 0; + } + + sleep(5); + + if(getbyte(fd, &r[0]) && getbyte(fd, &r[1])) + if(r[0] == 0xAA && r[1] == 0x00) + { + fprintf(stderr, "reset done\n"); + return 1; + } + fprintf(stderr, "error reset ack\n"); + return 0; +} + + + + +int main(int argc, char* argv[]) +{ + int fd; + unsigned long int ident; + + fd = open("/dev/psaux", O_RDWR); + if(fd == -1) + { + fprintf(stderr, "error open: %s\n", strerror(errno)); + exit(0); + } + + reset(fd); + identify(fd, &ident); + + close(fd); + + exit(0); +} |