paride.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __DRIVERS_PARIDE_H__
  2. #define __DRIVERS_PARIDE_H__
  3. /* 
  4. paride.h (c) 1997-8  Grant R. Guenther <grant@torque.net>
  5.                         Under the terms of the GPL.
  6.    This file defines the interface between the high-level parallel
  7.    IDE device drivers (pd, pf, pcd, pt) and the adapter chips.
  8. */
  9. /* Changes:
  10. 1.01 GRG 1998.05.05 init_proto, release_proto
  11. 1.01ac AGC 2002.04.03  added privptr
  12. */
  13. #define PARIDE_H_VERSION  "1.01ac"
  14. /* Some adapters need to know what kind of device they are in
  15.    Values for devtype:
  16. */
  17. #define PI_PD 0 /* IDE disk */
  18. #define PI_PCD 1 /* ATAPI CDrom */
  19. #define PI_PF   2 /* ATAPI disk */
  20. #define PI_PT 3 /* ATAPI tape */
  21. #define PI_PG   4       /* ATAPI generic */
  22. /* The paride module contains no state, instead the drivers allocate
  23.    a pi_adapter data structure and pass it to paride in every operation.
  24. */
  25. struct pi_adapter  {
  26. struct pi_protocol *proto;   /* adapter protocol */
  27. int port;      /* base address of parallel port */
  28. int mode;      /* transfer mode in use */
  29. int     delay;      /* adapter delay setting */
  30. int devtype;      /* device type: PI_PD etc. */
  31. char    *device;      /* name of driver */
  32. int     unit;      /* unit number for chained adapters */
  33. int saved_r0;      /* saved port state */
  34. int saved_r2;      /* saved port state */
  35. int reserved;      /* number of ports reserved */
  36. int private;      /* for protocol module */
  37. void *privptr;      /* private pointer for protocol module */
  38.      /* For 2.5 just make private a ulong but
  39.       for 2.4 fixups thats a bit risky.. */
  40. wait_queue_head_t parq;     /* semaphore for parport sharing */
  41. void *pardev;      /* pointer to pardevice */
  42. char *parname;      /* parport name */
  43. int claimed;      /* parport has already been claimed */
  44. void (*claim_cont)(void);    /* continuation for parport wait */
  45. };
  46. typedef struct pi_adapter PIA;
  47. /* functions exported by paride to the high level drivers */
  48. extern int pi_init(PIA *pi, 
  49. int autoprobe, /* 1 to autoprobe */
  50. int port,  /* base port address */
  51. int mode,  /* -1 for autoprobe */
  52. int unit, /* unit number, if supported */
  53. int protocol,  /* protocol to use */
  54. int delay,  /* -1 to use adapter specific default */
  55. char * scratch,  /* address of 512 byte buffer */
  56. int devtype, /* device type: PI_PD, PI_PCD, etc ... */
  57. int verbose, /* log verbose data while probing */
  58. char *device /* name of the driver */
  59. ); /* returns 0 on failure, 1 on success */
  60. extern void pi_release(PIA *pi);
  61. /* registers are addressed as (cont,regr)
  62.         cont: 0 for command register file, 1 for control register(s)
  63. regr: 0-7 for register number.
  64. */
  65. extern void pi_write_regr(PIA *pi, int cont, int regr, int val);
  66. extern int pi_read_regr(PIA *pi, int cont, int regr);
  67. extern void pi_write_block(PIA *pi, char * buf, int count);
  68. extern void pi_read_block(PIA *pi, char * buf, int count);
  69. extern void pi_connect(PIA *pi);
  70. extern void pi_disconnect(PIA *pi);
  71. extern void pi_do_claimed(PIA *pi, void (*cont)(void));
  72. /* macros and functions exported to the protocol modules */
  73. #define delay_p (pi->delay?udelay(pi->delay):0)
  74. #define out_p(offs,byte) outb(byte,pi->port+offs); delay_p;
  75. #define in_p(offs) (delay_p,inb(pi->port+offs))
  76. #define w0(byte)                {out_p(0,byte);}
  77. #define r0()                    (in_p(0) & 0xff)
  78. #define w1(byte)                {out_p(1,byte);}
  79. #define r1()                    (in_p(1) & 0xff)
  80. #define w2(byte)                {out_p(2,byte);}
  81. #define r2()                    (in_p(2) & 0xff)
  82. #define w3(byte)                {out_p(3,byte);}
  83. #define w4(byte)                {out_p(4,byte);}
  84. #define r4()                    (in_p(4) & 0xff)
  85. #define w4w(data)      {outw(data,pi->port+4); delay_p;}
  86. #define w4l(data)      {outl(data,pi->port+4); delay_p;}
  87. #define r4w()          (delay_p,inw(pi->port+4)&0xffff)
  88. #define r4l()          (delay_p,inl(pi->port+4)&0xffffffff)
  89. static inline u16 pi_swab16( char *b, int k)
  90. {  union { u16 u; char t[2]; } r;
  91. r.t[0]=b[2*k+1]; r.t[1]=b[2*k];
  92.         return r.u;
  93. }
  94. static inline u32 pi_swab32( char *b, int k)
  95. {  union { u32 u; char f[4]; } r;
  96. r.f[0]=b[4*k+1]; r.f[1]=b[4*k];
  97. r.f[2]=b[4*k+3]; r.f[3]=b[4*k+2];
  98.         return r.u;
  99. }
  100. struct pi_protocol {
  101. char name[8]; /* name for this protocol */
  102. int index; /* index into protocol table */
  103. int max_mode; /* max mode number */
  104. int epp_first; /* modes >= this use 8 ports */
  105. int default_delay;  /* delay parameter if not specified */
  106. int max_units; /* max chained units probed for */
  107. void (*write_regr)(PIA *,int,int,int);
  108. int  (*read_regr)(PIA *,int,int);
  109. void (*write_block)(PIA *,char *,int);
  110. void (*read_block)(PIA *,char *,int);
  111. void (*connect)(PIA *);
  112. void (*disconnect)(PIA *);
  113. int  (*test_port)(PIA *);
  114. int  (*probe_unit)(PIA *);
  115. int  (*test_proto)(PIA *,char *,int);
  116. void (*log_adapter)(PIA *,char *,int);
  117. void (*init_proto)(PIA *);
  118. void (*release_proto)(PIA *);
  119. };
  120. typedef struct pi_protocol PIP;
  121. extern int pi_register( PIP * );
  122. extern void pi_unregister ( PIP * );
  123. #endif /* __DRIVERS_PARIDE_H__ */
  124. /* end of paride.h */