on20.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* 
  2. on20.c (c) 1996-8  Grant R. Guenther <grant@torque.net>
  3.             Under the terms of the GNU General Public License.
  4.         on20.c is a low-level protocol driver for the
  5.         Onspec 90c20 parallel to IDE adapter. 
  6. */
  7. /* Changes:
  8.         1.01    GRG 1998.05.06 init_proto, release_proto
  9. */
  10. #define ON20_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. #define op(f) w2(4);w0(f);w2(5);w2(0xd);w2(5);w2(0xd);w2(5);w2(4);
  19. #define vl(v) w2(4);w0(v);w2(5);w2(7);w2(5);w2(4);
  20. #define j44(a,b)  (((a>>4)&0x0f)|(b&0xf0))
  21. /* cont = 0 - access the IDE register file 
  22.    cont = 1 - access the IDE command set 
  23. */
  24. static int on20_read_regr( PIA *pi, int cont, int regr )
  25. { int h,l, r ;
  26.         r = (regr<<2) + 1 + cont;
  27.         op(1); vl(r); op(0);
  28. switch (pi->mode)  {
  29.         case 0:  w2(4); w2(6); l = r1();
  30.                  w2(4); w2(6); h = r1();
  31.                  w2(4); w2(6); w2(4); w2(6); w2(4);
  32.  return j44(l,h);
  33. case 1:  w2(4); w2(0x26); r = r0(); 
  34.                  w2(4); w2(0x26); w2(4);
  35.  return r;
  36. }
  37. return -1;
  38. }
  39. static void on20_write_regr( PIA *pi, int cont, int regr, int val )
  40. { int r;
  41. r = (regr<<2) + 1 + cont;
  42. op(1); vl(r); 
  43. op(0); vl(val); 
  44. op(0); vl(val);
  45. }
  46. static void on20_connect ( PIA *pi)
  47. { pi->saved_r0 = r0();
  48.         pi->saved_r2 = r2();
  49. w2(4);w0(0);w2(0xc);w2(4);w2(6);w2(4);w2(6);w2(4); 
  50. if (pi->mode) { op(2); vl(8); op(2); vl(9); }
  51.        else   { op(2); vl(0); op(2); vl(8); }
  52. }
  53. static void on20_disconnect ( PIA *pi )
  54. { w2(4);w0(7);w2(4);w2(0xc);w2(4);
  55.         w0(pi->saved_r0);
  56.         w2(pi->saved_r2);
  57. static void on20_read_block( PIA *pi, char * buf, int count )
  58. { int     k, l, h; 
  59. op(1); vl(1); op(0);
  60. for (k=0;k<count;k++) 
  61.     if (pi->mode) {
  62. w2(4); w2(0x26); buf[k] = r0();
  63.     } else {
  64. w2(6); l = r1(); w2(4);
  65. w2(6); h = r1(); w2(4);
  66. buf[k] = j44(l,h);
  67.     }
  68. w2(4);
  69. }
  70. static void on20_write_block(  PIA *pi, char * buf, int count )
  71. { int k;
  72. op(1); vl(1); op(0);
  73. for (k=0;k<count;k++) { w2(5); w0(buf[k]); w2(7); }
  74. w2(4);
  75. }
  76. static void on20_log_adapter( PIA *pi, char * scratch, int verbose )
  77. {       char    *mode_string[2] = {"4-bit","8-bit"};
  78.         printk("%s: on20 %s, OnSpec 90c20 at 0x%x, ",
  79.                 pi->device,ON20_VERSION,pi->port);
  80.         printk("mode %d (%s), delay %dn",pi->mode,
  81. mode_string[pi->mode],pi->delay);
  82. }
  83. static void on20_init_proto( PIA *pi)
  84. {       MOD_INC_USE_COUNT;
  85. }
  86. static void on20_release_proto( PIA *pi)
  87. {       MOD_DEC_USE_COUNT;
  88. }
  89. struct pi_protocol on20 = {"on20",0,2,2,1,1,
  90.                            on20_write_regr,
  91.                            on20_read_regr,
  92.                            on20_write_block,
  93.                            on20_read_block,
  94.                            on20_connect,
  95.                            on20_disconnect,
  96.                            0,
  97.                            0,
  98.                            0,
  99.                            on20_log_adapter,
  100.                            on20_init_proto,
  101.                            on20_release_proto
  102.                           };
  103. #ifdef MODULE
  104. int     init_module(void)
  105. {       return pi_register( &on20 ) - 1;
  106. }
  107. void    cleanup_module(void)
  108. {       pi_unregister( &on20 );
  109. }
  110. #endif
  111. /* end of on20.c */
  112. MODULE_LICENSE("GPL");