Use of copyin/copyout in device drivers

Glen Foster gfoster%ibm-sj.csnet at CSNET-RELAY.ARPA
Wed Nov 28 19:45:28 AEST 1984


I'm very new to the wizards forum and relatively new to UNIX.  However
I have as much experience as anyone in our group so I have been given
the task of writing a simple device driver.  We are more or less trying
to simulate pty's in XENIX on a PC-AT (4.2 is not currently an alternative).
I have written a first pass device driver that works correctly, but is
too slow.  It uses the kernel routines passc and cpass to transfer data.
I tried to use copyout and copyin, but they do not seem to be working
correctly.  Basically, I have replaced the code
     while (passc(c) != -1) {  c = next char, etc... }
with
     copyout(ptr_to_start_of_data, (char *) u.u_base, u.u_count);
My device driver stopped working.
 
Next, I wrote a simple device driver that used copyin on a write, and
copyout on a static string for a read.  These routines do not seem to
work.  Also, the returned value of copyin/copyout is -1 (actually, 65535).
Here is the code that I tried.
 
 
extern struct user u;
 
vikwrite(dev)
   int dev;
 
   char buff[255];
   int len = 0;
   int l;
 
   l = u.u_count;
   len = copyin((char *) u.u_base, buff, l);
   buff[l] = '?0';
   u.u_r.r_reg.r_val1 = l;
   u.u_count -= l;
   printf("copyin returned len = %d ?n", len);
   printf("%s ?n", buff);
 
}
 
 
char buff[] = "0aaaaaaaaa1aaaaaaaaa2aaaaaaaaa3aaaaaaaaa4aaaaaaaa5";
 
 
vikread(dev)
   int dev;
{
   int len = 0;
   int l;
 
   l = u.u_count;
   len = copyout(buff, (char *) u.u_base, l);
   u.u_r.r_reg.r_val1 = l;
   u.u_count -= l;
   printf("copyout returned len = %d ?n", len);
}
 
 
 
We do not have a source liscense so I cannot not look at the code for
copyin and copyout.  All I have is a brief description I found in a
manual called "Writing UNIX Device Drivers" by Bob Nystrom from Momentum
Computer Systems, International.  I don't even know if the routines are
supposed to return the number of bytes transfered.  Has anyone out there
used these routines and do you have any ideas what I am doing wrong ?
I am really operating quite blindly and it can be very frustrating.
 
I am also using tty structures and the standard line switch routines.
Again, I don't have the source code.  I would like to put data in the
raw queue directly and not use ttin.  However, when I do this, canon
never seems to be called after a newline character is placed in the
rawq.  Thus, I never have data in canq.  Whom does ttin wakeup
when he recognizes a newline (or carriage return) ?  I assume he does
a wakeup on either the canq or rawq, but I don't know.  Also, could
someone give me a little better idea what else ttin does.  What will
I lose if I do not use ttin ?
 
Thanks for listening to the plight of a novice UNIX hack.
 
Glen



More information about the Comp.unix.wizards mailing list