Skip to content
Snippets Groups Projects
labcomm_ioctl.h 3.39 KiB
Newer Older
  • Learn to ignore specific revisions
  • Anders Blomdell's avatar
    Anders Blomdell committed
    #ifndef __LABCOMM_IOCTL_H__
    #define __LABCOMM_IOCTL_H__
    
    
    Anders Blomdell's avatar
    Anders Blomdell committed
    /*
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * | |   |                         |               |               |  
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     *  | |   |                         |               |
     *  | |   |                         |               +- number    (8)
     *  | |   |                         +----------------- type      (8)
     *  | |   +------------------------------------------- size      (13)
     *  | +----------------------------------------------- direction (2)
     *  +------------------------------------------------- signature (1)
     *  
     * type 0-31     are reserved for labcomm library use
     */
    
    
    #define LABCOMM_IOC_NRBITS      8
    #define LABCOMM_IOC_TYPEBITS    8
    #define LABCOMM_IOC_SIZEBITS   13
    #define LABCOMM_IOC_DIRBITS     2
    #define LABCOMM_IOC_SIGBITS     1
    #define LABCOMM_IOC_NRMASK     ((1 << LABCOMM_IOC_NRBITS)-1)
    #define LABCOMM_IOC_TYPEMASK   ((1 << LABCOMM_IOC_TYPEBITS)-1)
    #define LABCOMM_IOC_SIZEMASK   ((1 << LABCOMM_IOC_SIZEBITS)-1)
    #define LABCOMM_IOC_DIRMASK    ((1 << LABCOMM_IOC_DIRBITS)-1)
    #define LABCOMM_IOC_SIGMASK    ((1 << LABCOMM_IOC_SIGBITS)-1)
    #define LABCOMM_IOC_NRSHIFT    0
    #define LABCOMM_IOC_TYPESHIFT  (LABCOMM_IOC_NRSHIFT+LABCOMM_IOC_NRBITS)
    #define LABCOMM_IOC_SIZESHIFT  (LABCOMM_IOC_TYPESHIFT+LABCOMM_IOC_TYPEBITS)
    #define LABCOMM_IOC_DIRSHIFT   (LABCOMM_IOC_SIZESHIFT+LABCOMM_IOC_SIZEBITS)
    #define LABCOMM_IOC_SIGSHIFT   (LABCOMM_IOC_DIRSHIFT+LABCOMM_IOC_DIRBITS)
    
    #define LABCOMM_IOC_NOSIG       0U
    #define LABCOMM_IOC_USESIG      1U
    
    #define LABCOMM_IOC_NONE        0U
    #define LABCOMM_IOC_WRITE       1U
    #define LABCOMM_IOC_READ        2U
    
    #define LABCOMM_IOC(signature,dir,type,nr,size)	  \
      (((signature) << LABCOMM_IOC_SIGSHIFT) |	  \
       ((dir)       << LABCOMM_IOC_DIRSHIFT) |	  \
       ((size)      << LABCOMM_IOC_SIZESHIFT) |	  \
       ((type)      << LABCOMM_IOC_TYPESHIFT) |	  \
       ((nr)        << LABCOMM_IOC_NRSHIFT))	  
    
    #define LABCOMM_IOC_SIG(nr) \
      (((nr) >> LABCOMM_IOC_SIGSHIFT) & LABCOMM_IOC_SIGMASK)
    #define LABCOMM_IOC_DIR(nr) \
      (((nr) >> LABCOMM_IOC_DIRSHIFT) & LABCOMM_IOC_DIRMASK)
    #define LABCOMM_IOC_SIZE(nr) \
      (((nr) >> LABCOMM_IOC_SIZESHIFT) & LABCOMM_IOC_SIZEMASK)
    #define LABCOMM_IOC_TYPE(nr) \
      (((nr) >> LABCOMM_IOC_TYPESHIFT) & LABCOMM_IOC_TYPEMASK)
    #define LABCOMM_IOC_NR(nr) \
      (((nr) >> LABCOMM_IOC_NRSHIFT) & LABCOMM_IOC_NRMASK)
    
    #define LABCOMM_IO(type,nr)						\
      LABCOMM_IOC(LABCOMM_IOC_NOSIG,LABCOMM_IOC_NONE,type,nr,0)
    #define LABCOMM_IOR(type,nr,size)					\
      LABCOMM_IOC(LABCOMM_IOC_NOSIG,LABCOMM_IOC_READ,type,nr,sizeof(size))
    #define LABCOMM_IOW(type,nr,size)					\
      LABCOMM_IOC(LABCOMM_IOC_NOSIG,LABCOMM_IOC_WRITE,type,nr,sizeof(size))
    #define LABCOMM_IOS(type,nr)					\
      LABCOMM_IOC(LABCOMM_IOC_USESIG,LABCOMM_IOC_READ,type,nr,0)
    #define LABCOMM_IOSR(type,nr,size)					\
      LABCOMM_IOC(LABCOMM_IOC_USESIG,LABCOMM_IOC_READ,type,nr,sizeof(size))
    #define LABCOMM_IOSW(type,nr,size)					\
      LABCOMM_IOC(LABCOMM_IOC_USESIG,LABCOMM_IOC_WRITE,type,nr,sizeof(size))
    
    
    struct labcomm_ioctl_register_signature {
      int index;
    
      struct labcomm_signature *signature;
    
    Anders Blomdell's avatar
    Anders Blomdell committed
    #define LABCOMM_IOCTL_REGISTER_SIGNATURE \
      LABCOMM_IOW(0,1,struct labcomm_ioctl_register_signature)
    #define LABCOMM_IOCTL_WRITER_GET_BYTES_WRITTEN \
      LABCOMM_IOR(0,2,int)
    #define LABCOMM_IOCTL_WRITER_GET_BYTE_POINTER \
      LABCOMM_IOR(0,3,void*)
    
    #endif