on20.c
上传用户:ajay2009
上传日期:2009-05-22
资源大小:495k
文件大小:3k
源码类别:

驱动编程

开发平台:

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/init.h>
  13. #include <linux/delay.h>
  14. #include <linux/kernel.h>
  15. #include <linux/types.h>
  16. #include <linux/wait.h>
  17. #include <asm/io.h>
  18. #include "paride.h"
  19. #define op(f) w2(4);w0(f);w2(5);w2(0xd);w2(5);w2(0xd);w2(5);w2(4);
  20. #define vl(v) w2(4);w0(v);w2(5);w2(7);w2(5);w2(4);
  21. #define j44(a,b)  (((a>>4)&0x0f)|(b&0xf0))
  22. /* cont = 0 - access the IDE register file 
  23.    cont = 1 - access the IDE command set 
  24. */
  25. static int on20_read_regr( PIA *pi, int cont, int regr )
  26. { int h,l, r ;
  27.         r = (regr<<2) + 1 + cont;
  28.         op(1); vl(r); op(0);
  29. switch (pi->mode)  {
  30.         case 0:  w2(4); w2(6); l = r1();
  31.                  w2(4); w2(6); h = r1();
  32.                  w2(4); w2(6); w2(4); w2(6); w2(4);
  33.  return j44(l,h);
  34. case 1:  w2(4); w2(0x26); r = r0(); 
  35.                  w2(4); w2(0x26); w2(4);
  36.  return r;
  37. }
  38. return -1;
  39. }
  40. static void on20_write_regr( PIA *pi, int cont, int regr, int val )
  41. { int r;
  42. r = (regr<<2) + 1 + cont;
  43. op(1); vl(r); 
  44. op(0); vl(val); 
  45. op(0); vl(val);
  46. }
  47. static void on20_connect ( PIA *pi)
  48. { pi->saved_r0 = r0();
  49.         pi->saved_r2 = r2();
  50. w2(4);w0(0);w2(0xc);w2(4);w2(6);w2(4);w2(6);w2(4); 
  51. if (pi->mode) { op(2); vl(8); op(2); vl(9); }
  52.        else   { op(2); vl(0); op(2); vl(8); }
  53. }
  54. static void on20_disconnect ( PIA *pi )
  55. { w2(4);w0(7);w2(4);w2(0xc);w2(4);
  56.         w0(pi->saved_r0);
  57.         w2(pi->saved_r2);
  58. static void on20_read_block( PIA *pi, char * buf, int count )
  59. { int     k, l, h; 
  60. op(1); vl(1); op(0);
  61. for (k=0;k<count;k++) 
  62.     if (pi->mode) {
  63. w2(4); w2(0x26); buf[k] = r0();
  64.     } else {
  65. w2(6); l = r1(); w2(4);
  66. w2(6); h = r1(); w2(4);
  67. buf[k] = j44(l,h);
  68.     }
  69. w2(4);
  70. }
  71. static void on20_write_block(  PIA *pi, char * buf, int count )
  72. { int k;
  73. op(1); vl(1); op(0);
  74. for (k=0;k<count;k++) { w2(5); w0(buf[k]); w2(7); }
  75. w2(4);
  76. }
  77. static void on20_log_adapter( PIA *pi, char * scratch, int verbose )
  78. {       char    *mode_string[2] = {"4-bit","8-bit"};
  79.         printk("%s: on20 %s, OnSpec 90c20 at 0x%x, ",
  80.                 pi->device,ON20_VERSION,pi->port);
  81.         printk("mode %d (%s), delay %dn",pi->mode,
  82. mode_string[pi->mode],pi->delay);
  83. }
  84. static struct pi_protocol on20 = {
  85. .owner = THIS_MODULE,
  86. .name = "on20",
  87. .max_mode = 2,
  88. .epp_first = 2,
  89. .default_delay = 1,
  90. .max_units = 1,
  91. .write_regr = on20_write_regr,
  92. .read_regr = on20_read_regr,
  93. .write_block = on20_write_block,
  94. .read_block = on20_read_block,
  95. .connect = on20_connect,
  96. .disconnect = on20_disconnect,
  97. .log_adapter = on20_log_adapter,
  98. };
  99. static int __init on20_init(void)
  100. {
  101. return pi_register(&on20)-1;
  102. }
  103. static void __exit on20_exit(void)
  104. {
  105. pi_unregister(&on20);
  106. }
  107. MODULE_LICENSE("GPL");
  108. module_init(on20_init)
  109. module_exit(on20_exit)