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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  2.         dstr.c    (c) 1997-8  Grant R. Guenther <grant@torque.net>
  3.                               Under the terms of the GNU General Public License.
  4.         dstr.c is a low-level protocol driver for the 
  5.         DataStor EP2000 parallel to IDE adapter chip.
  6. */
  7. /* Changes:
  8.         1.01    GRG 1998.05.06 init_proto, release_proto
  9. */
  10. #define DSTR_VERSION      "1.01"
  11. #include <linux/module.h>
  12. #include <linux/delay.h>
  13. #include <linux/kernel.h>
  14. #include <linux/types.h>
  15. #include <linux/wait.h>
  16. #include <asm/io.h>
  17. #include "paride.h"
  18. /* mode codes:  0  nybble reads, 8-bit writes
  19.                 1  8-bit reads and writes
  20.                 2  8-bit EPP mode
  21. 3  EPP-16
  22. 4  EPP-32
  23. */
  24. #define j44(a,b)  (((a>>3)&0x07)|((~a>>4)&0x08)|((b<<1)&0x70)|((~b)&0x80))
  25. #define P1 w2(5);w2(0xd);w2(5);w2(4);
  26. #define P2 w2(5);w2(7);w2(5);w2(4);
  27. #define P3      w2(6);w2(4);w2(6);w2(4);
  28. /* cont = 0 - access the IDE register file 
  29.    cont = 1 - access the IDE command set 
  30. */
  31. static int  cont_map[2] = { 0x20, 0x40 };
  32. static int dstr_read_regr( PIA *pi, int cont, int regr )
  33. {       int     a, b, r;
  34.         r = regr + cont_map[cont];
  35. w0(0x81); P1;
  36. if (pi->mode) { w0(0x11); } else { w0(1); }
  37. P2; w0(r); P1;
  38.         switch (pi->mode)  {
  39.         case 0: w2(6); a = r1(); w2(4); w2(6); b = r1(); w2(4);
  40.                 return j44(a,b);
  41.         case 1: w0(0); w2(0x26); a = r0(); w2(4);
  42.                 return a;
  43. case 2:
  44. case 3:
  45.         case 4: w2(0x24); a = r4(); w2(4);
  46.                 return a;
  47.         }
  48.         return -1;
  49. }       
  50. static void dstr_write_regr(  PIA *pi, int cont, int regr, int val )
  51. {       int  r;
  52.         r = regr + cont_map[cont];
  53. w0(0x81); P1; 
  54. if (pi->mode >= 2) { w0(0x11); } else { w0(1); }
  55. P2; w0(r); P1;
  56.         switch (pi->mode)  {
  57.         case 0:
  58.         case 1: w0(val); w2(5); w2(7); w2(5); w2(4);
  59. break;
  60. case 2:
  61. case 3:
  62.         case 4: w4(val); 
  63.                 break;
  64.         }
  65. }
  66. #define  CCP(x)  w0(0xff);w2(0xc);w2(4);
  67.  w0(0xaa);w0(0x55);w0(0);w0(0xff);w0(0x87);w0(0x78);
  68.  w0(x);w2(5);w2(4);
  69. static void dstr_connect ( PIA *pi  )
  70. {       pi->saved_r0 = r0();
  71.         pi->saved_r2 = r2();
  72.         w2(4); CCP(0xe0); w0(0xff);
  73. }
  74. static void dstr_disconnect ( PIA *pi )
  75. {       CCP(0x30);
  76.         w0(pi->saved_r0);
  77.         w2(pi->saved_r2);
  78. static void dstr_read_block( PIA *pi, char * buf, int count )
  79. {       int     k, a, b;
  80.         w0(0x81); P1;
  81.         if (pi->mode) { w0(0x19); } else { w0(9); }
  82. P2; w0(0x82); P1; P3; w0(0x20); P1;
  83.         switch (pi->mode) {
  84.         case 0: for (k=0;k<count;k++) {
  85.                         w2(6); a = r1(); w2(4);
  86.                         w2(6); b = r1(); w2(4);
  87.                         buf[k] = j44(a,b);
  88.                 } 
  89.                 break;
  90.         case 1: w0(0);
  91.                 for (k=0;k<count;k++) {
  92.                         w2(0x26); buf[k] = r0(); w2(0x24);
  93.                 }
  94.                 w2(4);
  95.                 break;
  96.         case 2: w2(0x24); 
  97.                 for (k=0;k<count;k++) buf[k] = r4();
  98.                 w2(4);
  99.                 break;
  100.         case 3: w2(0x24); 
  101.                 for (k=0;k<count/2;k++) ((u16 *)buf)[k] = r4w();
  102.                 w2(4);
  103.                 break;
  104.         case 4: w2(0x24); 
  105.                 for (k=0;k<count/4;k++) ((u32 *)buf)[k] = r4l();
  106.                 w2(4);
  107.                 break;
  108.         }
  109. }
  110. static void dstr_write_block( PIA *pi, char * buf, int count )
  111. {       int k;
  112.         w0(0x81); P1;
  113.         if (pi->mode) { w0(0x19); } else { w0(9); }
  114.         P2; w0(0x82); P1; P3; w0(0x20); P1;
  115.         switch (pi->mode) {
  116.         case 0:
  117.         case 1: for (k=0;k<count;k++) {
  118.                         w2(5); w0(buf[k]); w2(7);
  119.                 }
  120.                 w2(5); w2(4);
  121.                 break;
  122.         case 2: w2(0xc5);
  123.                 for (k=0;k<count;k++) w4(buf[k]);
  124. w2(0xc4);
  125.                 break;
  126.         case 3: w2(0xc5);
  127.                 for (k=0;k<count/2;k++) w4w(((u16 *)buf)[k]);
  128.                 w2(0xc4);
  129.                 break;
  130.         case 4: w2(0xc5);
  131.                 for (k=0;k<count/4;k++) w4l(((u32 *)buf)[k]);
  132.                 w2(0xc4);
  133.                 break;
  134.         }
  135. }
  136. static void dstr_log_adapter( PIA *pi, char * scratch, int verbose )
  137. {       char    *mode_string[5] = {"4-bit","8-bit","EPP-8",
  138.    "EPP-16","EPP-32"};
  139.         printk("%s: dstr %s, DataStor EP2000 at 0x%x, ",
  140.                 pi->device,DSTR_VERSION,pi->port);
  141.         printk("mode %d (%s), delay %dn",pi->mode,
  142. mode_string[pi->mode],pi->delay);
  143. }
  144. static void dstr_init_proto( PIA *pi)
  145. {       MOD_INC_USE_COUNT;
  146. }
  147. static void dstr_release_proto( PIA *pi)
  148. {       MOD_DEC_USE_COUNT;
  149. }
  150. struct pi_protocol dstr = {"dstr",0,5,2,1,1,
  151.                            dstr_write_regr,
  152.                            dstr_read_regr,
  153.                            dstr_write_block,
  154.                            dstr_read_block,
  155.                            dstr_connect,
  156.                            dstr_disconnect,
  157.                            0,
  158.                            0,
  159.                            0,
  160.                            dstr_log_adapter,
  161.                            dstr_init_proto,
  162.                            dstr_release_proto
  163.                           };
  164. #ifdef MODULE
  165. int     init_module(void)
  166. {       return pi_register( &dstr ) - 1;
  167. }
  168. void    cleanup_module(void)
  169. {       pi_unregister( &dstr );
  170. }
  171. #endif
  172. /* end of dstr.c */
  173. MODULE_LICENSE("GPL");