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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* 
  2.         aten.c  (c) 1997-8  Grant R. Guenther <grant@torque.net>
  3.                             Under the terms of the GNU General Public License.
  4. aten.c is a low-level protocol driver for the ATEN EH-100
  5. parallel port adapter.  The EH-100 supports 4-bit and 8-bit
  6.         modes only.  There is also an EH-132 which supports EPP mode
  7.         transfers.  The EH-132 is not yet supported.
  8. */
  9. /* Changes:
  10. 1.01 GRG 1998.05.05 init_proto, release_proto
  11. */
  12. #define ATEN_VERSION      "1.01"
  13. #include <linux/module.h>
  14. #include <linux/delay.h>
  15. #include <linux/kernel.h>
  16. #include <linux/wait.h>
  17. #include <linux/types.h>
  18. #include <asm/io.h>
  19. #include "paride.h"
  20. #define j44(a,b)                ((((a>>4)&0x0f)|(b&0xf0))^0x88)
  21. /* cont = 0 - access the IDE register file 
  22.    cont = 1 - access the IDE command set 
  23. */
  24. static int  cont_map[2] = { 0x08, 0x20 };
  25. static void  aten_write_regr( PIA *pi, int cont, int regr, int val)
  26. { int r;
  27. r = regr + cont_map[cont] + 0x80;
  28. w0(r); w2(0xe); w2(6); w0(val); w2(7); w2(6); w2(0xc);
  29. }
  30. static int aten_read_regr( PIA *pi, int cont, int regr )
  31. { int  a, b, r;
  32.         r = regr + cont_map[cont] + 0x40;
  33. switch (pi->mode) {
  34.         case 0: w0(r); w2(0xe); w2(6); 
  35. w2(7); w2(6); w2(0);
  36. a = r1(); w0(0x10); b = r1(); w2(0xc);
  37. return j44(a,b);
  38.         case 1: r |= 0x10;
  39. w0(r); w2(0xe); w2(6); w0(0xff); 
  40. w2(0x27); w2(0x26); w2(0x20);
  41. a = r0();
  42. w2(0x26); w2(0xc);
  43. return a;
  44. }
  45. return -1;
  46. }
  47. static void aten_read_block( PIA *pi, char * buf, int count )
  48. { int  k, a, b, c, d;
  49. switch (pi->mode) {
  50. case 0: w0(0x48); w2(0xe); w2(6);
  51. for (k=0;k<count/2;k++) {
  52. w2(7); w2(6); w2(2);
  53. a = r1(); w0(0x58); b = r1();
  54. w2(0); d = r1(); w0(0x48); c = r1();
  55. buf[2*k] = j44(c,d);
  56. buf[2*k+1] = j44(a,b);
  57. }
  58. w2(0xc);
  59. break;
  60. case 1: w0(0x58); w2(0xe); w2(6);
  61. for (k=0;k<count/2;k++) {
  62. w2(0x27); w2(0x26); w2(0x22);
  63. a = r0(); w2(0x20); b = r0();
  64. buf[2*k] = b; buf[2*k+1] = a;
  65. }
  66. w2(0x26); w2(0xc);
  67. break;
  68. }
  69. }
  70. static void aten_write_block( PIA *pi, char * buf, int count )
  71. { int k;
  72. w0(0x88); w2(0xe); w2(6);
  73. for (k=0;k<count/2;k++) {
  74. w0(buf[2*k+1]); w2(0xe); w2(6);
  75. w0(buf[2*k]); w2(7); w2(6);
  76. }
  77. w2(0xc);
  78. }
  79. static void aten_connect ( PIA *pi  )
  80. {       pi->saved_r0 = r0();
  81.         pi->saved_r2 = r2();
  82. w2(0xc);
  83. }
  84. static void aten_disconnect ( PIA *pi )
  85. {       w0(pi->saved_r0);
  86.         w2(pi->saved_r2);
  87. static void aten_log_adapter( PIA *pi, char * scratch, int verbose )
  88. {       char    *mode_string[2] = {"4-bit","8-bit"};
  89.         printk("%s: aten %s, ATEN EH-100 at 0x%x, ",
  90.                 pi->device,ATEN_VERSION,pi->port);
  91.         printk("mode %d (%s), delay %dn",pi->mode,
  92. mode_string[pi->mode],pi->delay);
  93. }
  94. static void aten_init_proto( PIA *pi )
  95. {       MOD_INC_USE_COUNT;
  96. }
  97. static void aten_release_proto( PIA *pi )
  98. {       MOD_DEC_USE_COUNT;
  99. }
  100. struct pi_protocol aten = {"aten",0,2,2,1,1,
  101.                            aten_write_regr,
  102.                            aten_read_regr,
  103.                            aten_write_block,
  104.                            aten_read_block,
  105.                            aten_connect,
  106.                            aten_disconnect,
  107.                            0,
  108.                            0,
  109.                            0,
  110.                            aten_log_adapter,
  111.                            aten_init_proto,
  112.                            aten_release_proto
  113.                           };
  114. #ifdef MODULE
  115. int     init_module(void)
  116. {       return pi_register( &aten ) - 1;
  117. }
  118. void    cleanup_module(void)
  119. {       pi_unregister( &aten );
  120. }
  121. #endif
  122. /* end of aten.c */
  123. MODULE_LICENSE("GPL");