# HG changeset patch # User heiko # Date 1011295534 -3600 # Node ID ee662c2e14f90c771de30f359fc33803ae648396 # Parent f6a492c6509341f9ffadf575c8acb1d43a9112ad Read (nonblocking) ist jetzt auch ok. Und SUBDEVICE() war etwas quer. Der obere Teil der Minor ist: 0x1_ Subdevice 0 (A) 0x2_ Subdevice 1 (B) 0x3_ Subdevice 2 (Counter) diff -r f6a492c65093 -r ee662c2e14f9 me8100.c --- a/me8100.c Wed Jan 16 20:33:24 2002 +0100 +++ b/me8100.c Thu Jan 17 20:25:34 2002 +0100 @@ -174,7 +174,7 @@ static int me8100_get_int_count(me8100_int_occur_type *, me8100_info_type *); static inline int DEVICE(int i) { return i & 0x0f; } -static inline int SUBDEVICE(int i) { return i >> 4; } +static inline int SUBDEVICE(int i) { return (i >> 4) - 1; } /* File operations provided by the driver */ @@ -611,6 +611,10 @@ } } + if (file_ptr->f_mode & FMODE_READ) { + PDEBUG("*** open for reading\n"); + } + MOD_INC_USE_COUNT; return 0; @@ -2111,8 +2115,29 @@ ssize_t me8100_read(struct file * file_ptr, char *buffer, size_t len, loff_t *offset) { + int err; + unsigned short val; + int minor; + PDEBUG("me8100_read(%d) called\n", len); - return -EINVAL; + + minor = MINOR(file_ptr->f_dentry->d_inode->i_rdev); + + if (len == 0) return 0; /* do we really need this check? */ + if (len < 0) return -EINVAL; /* do we really need this check? */ + + val = inw(info_vec[DEVICE(minor)].subinfo[SUBDEVICE(minor)].regbase + ME8100_DI_REG); + PDEBUG("me8100_read: val=0x%0x\n", val); + + if (len >= sizeof(val)) { + err = put_user(val, (unsigned short*) buffer); + len = sizeof(val); + } else { + err = put_user(val, (char*) buffer); + } + + return len; + } /* Writing: we do only write one word (an unsigned short) and return immediatly. Yes, @@ -2133,9 +2158,9 @@ if (len < 0) return -EINVAL; /* do we need this? */ /* Take care of "short" writes! */ - if (len >= sizeof(unsigned short)) { + if (len >= sizeof(val)) { err = get_user(val, (unsigned short*) buffer); - len = sizeof(unsigned short); + len = sizeof(val); } else { err = get_user(val, (char*) buffer); val &= 0xff; diff -r f6a492c65093 -r ee662c2e14f9 me8100.h --- a/me8100.h Wed Jan 16 20:33:24 2002 +0100 +++ b/me8100.h Thu Jan 17 20:25:34 2002 +0100 @@ -135,6 +135,7 @@ #define ME8100_CTRL_IRQ_MASK 0x60 #define ME8100_CTRL_REG 0x00 //( ,w) +#define ME8100_DI_REG 0x04 //(r, ) #define ME8100_DO_REG 0x06 //( ,w) /* ME8100 Register Set A */ diff -r f6a492c65093 -r ee662c2e14f9 me8100_test_dio/rtest.c --- a/me8100_test_dio/rtest.c Wed Jan 16 20:33:24 2002 +0100 +++ b/me8100_test_dio/rtest.c Thu Jan 17 20:25:34 2002 +0100 @@ -30,7 +30,7 @@ unsigned short value_a; printf("Read test, PID: %d\n", getpid()); - file_handle = open("/dev/me8100_0", O_RDONLY, 0); + file_handle = open("/dev/me8100_0a", O_RDONLY, 0); if(file_handle < 0){ printf("Cannot open path !\n"); diff -r f6a492c65093 -r ee662c2e14f9 me8100_test_dio/wtest.c --- a/me8100_test_dio/wtest.c Wed Jan 16 20:33:24 2002 +0100 +++ b/me8100_test_dio/wtest.c Thu Jan 17 20:25:34 2002 +0100 @@ -38,7 +38,7 @@ #ifdef USE_WRITE printf("Using write()\n"); #endif - file_handle = open("/dev/me8100_0", O_WRONLY, 0); + file_handle = open("/dev/me8100_0a", O_WRONLY, 0); if(file_handle < 0){ printf("Cannot open path !\n");