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

驱动编程

开发平台:

Unix_Linux

  1. /* 
  2.         epia.c    (c) 1997-8  Grant R. Guenther <grant@torque.net>
  3.                               Under the terms of the GNU General Public License.
  4.         epia.c is a low-level protocol driver for Shuttle Technologies 
  5. EPIA parallel to IDE adapter chip.  This device is now obsolete
  6. and has been replaced with the EPAT chip, which is supported
  7. by epat.c, however, some devices based on EPIA are still
  8. available.
  9. */
  10. /* Changes:
  11.         1.01    GRG 1998.05.06 init_proto, release_proto
  12. 1.02    GRG 1998.06.17 support older versions of EPIA
  13. */
  14. #define EPIA_VERSION      "1.02"
  15. #include <linux/module.h>
  16. #include <linux/init.h>
  17. #include <linux/delay.h>
  18. #include <linux/kernel.h>
  19. #include <linux/types.h>
  20. #include <linux/wait.h>
  21. #include <asm/io.h>
  22. #include "paride.h"
  23. /* mode codes:  0  nybble reads on port 1, 8-bit writes
  24.                 1  5/3 reads on ports 1 & 2, 8-bit writes
  25.                 2  8-bit reads and writes
  26.                 3  8-bit EPP mode
  27. 4  16-bit EPP
  28. 5  32-bit EPP
  29. */
  30. #define j44(a,b)                (((a>>4)&0x0f)+(b&0xf0))
  31. #define j53(a,b)                (((a>>3)&0x1f)+((b<<4)&0xe0))
  32. /* cont =  0   IDE register file
  33.    cont =  1   IDE control registers
  34. */
  35. static int cont_map[2] = { 0, 0x80 };
  36. static int epia_read_regr( PIA *pi, int cont, int regr )
  37. {       int     a, b, r;
  38. regr += cont_map[cont];
  39.         switch (pi->mode)  {
  40.         case 0: r = regr^0x39;
  41.                 w0(r); w2(1); w2(3); w0(r);
  42.                 a = r1(); w2(1); b = r1(); w2(4);
  43.                 return j44(a,b);
  44.         case 1: r = regr^0x31;
  45.                 w0(r); w2(1); w0(r&0x37); 
  46.                 w2(3); w2(5); w0(r|0xf0);
  47.                 a = r1(); b = r2(); w2(4);
  48.                 return j53(a,b);
  49.         case 2: r = regr^0x29;
  50.                 w0(r); w2(1); w2(0X21); w2(0x23); 
  51.                 a = r0(); w2(4);
  52.                 return a;
  53. case 3:
  54. case 4:
  55.         case 5: w3(regr); w2(0x24); a = r4(); w2(4);
  56.                 return a;
  57.         }
  58.         return -1;
  59. }       
  60. static void epia_write_regr( PIA *pi, int cont, int regr, int val)
  61. {       int  r;
  62. regr += cont_map[cont];
  63.         switch (pi->mode)  {
  64.         case 0:
  65.         case 1:
  66.         case 2: r = regr^0x19;
  67.                 w0(r); w2(1); w0(val); w2(3); w2(4);
  68.                 break;
  69. case 3:
  70. case 4:
  71.         case 5: r = regr^0x40;
  72.                 w3(r); w4(val); w2(4);
  73.                 break;
  74.         }
  75. }
  76. #define WR(r,v)         epia_write_regr(pi,0,r,v)
  77. #define RR(r)           (epia_read_regr(pi,0,r))
  78. /* The use of register 0x84 is entirely unclear - it seems to control
  79.    some EPP counters ...  currently we know about 3 different block
  80.    sizes:  the standard 512 byte reads and writes, 12 byte writes and 
  81.    2048 byte reads (the last two being used in the CDrom drivers.
  82. */
  83. static void epia_connect ( PIA *pi  )
  84. {       pi->saved_r0 = r0();
  85.         pi->saved_r2 = r2();
  86.         w2(4); w0(0xa0); w0(0x50); w0(0xc0); w0(0x30); w0(0xa0); w0(0);
  87.         w2(1); w2(4);
  88.         if (pi->mode >= 3) { 
  89.                 w0(0xa); w2(1); w2(4); w0(0x82); w2(4); w2(0xc); w2(4);
  90.                 w2(0x24); w2(0x26); w2(4);
  91.         }
  92.         WR(0x86,8);  
  93. }
  94. static void epia_disconnect ( PIA *pi )
  95. {       /* WR(0x84,0x10); */
  96.         w0(pi->saved_r0);
  97.         w2(1); w2(4);
  98.         w0(pi->saved_r0);
  99.         w2(pi->saved_r2);
  100. static void epia_read_block( PIA *pi, char * buf, int count )
  101. {       int     k, ph, a, b;
  102.         switch (pi->mode) {
  103.         case 0: w0(0x81); w2(1); w2(3); w0(0xc1);
  104.                 ph = 1;
  105.                 for (k=0;k<count;k++) {
  106.                         w2(2+ph); a = r1();
  107.                         w2(4+ph); b = r1();
  108.                         buf[k] = j44(a,b);
  109.                         ph = 1 - ph;
  110.                 } 
  111.                 w0(0); w2(4);
  112.                 break;
  113.         case 1: w0(0x91); w2(1); w0(0x10); w2(3); 
  114.                 w0(0x51); w2(5); w0(0xd1); 
  115.                 ph = 1;
  116.                 for (k=0;k<count;k++) {
  117.                         w2(4+ph);
  118.                         a = r1(); b = r2();
  119.                         buf[k] = j53(a,b);
  120.                         ph = 1 - ph;
  121.                 }
  122.                 w0(0); w2(4);
  123.                 break;
  124.         case 2: w0(0x89); w2(1); w2(0x23); w2(0x21); 
  125.                 ph = 1;
  126.                 for (k=0;k<count;k++) {
  127.                         w2(0x24+ph);
  128.                         buf[k] = r0();
  129.                         ph = 1 - ph;
  130.                 }
  131.                 w2(6); w2(4);
  132.                 break;
  133.         case 3: if (count > 512) WR(0x84,3);
  134. w3(0); w2(0x24);
  135.                 for (k=0;k<count;k++) buf[k] = r4();
  136.                 w2(4); WR(0x84,0);
  137.                 break;
  138.         case 4: if (count > 512) WR(0x84,3);
  139. w3(0); w2(0x24);
  140. for (k=0;k<count/2;k++) ((u16 *)buf)[k] = r4w();
  141.                 w2(4); WR(0x84,0);
  142.                 break;
  143.         case 5: if (count > 512) WR(0x84,3);
  144. w3(0); w2(0x24);
  145.                 for (k=0;k<count/4;k++) ((u32 *)buf)[k] = r4l();
  146.                 w2(4); WR(0x84,0);
  147.                 break;
  148.         }
  149. }
  150. static void epia_write_block( PIA *pi, char * buf, int count )
  151. {       int     ph, k, last, d;
  152.         switch (pi->mode) {
  153.         case 0:
  154.         case 1:
  155.         case 2: w0(0xa1); w2(1); w2(3); w2(1); w2(5);
  156.                 ph = 0;  last = 0x8000;
  157.                 for (k=0;k<count;k++) {
  158.                         d = buf[k];
  159.                         if (d != last) { last = d; w0(d); }
  160.                         w2(4+ph);
  161.                         ph = 1 - ph;
  162.                 }
  163.                 w2(7); w2(4);
  164.                 break;
  165.         case 3: if (count < 512) WR(0x84,1);
  166. w3(0x40);
  167.                 for (k=0;k<count;k++) w4(buf[k]);
  168. if (count < 512) WR(0x84,0);
  169.                 break;
  170.         case 4: if (count < 512) WR(0x84,1);
  171. w3(0x40);
  172.                 for (k=0;k<count/2;k++) w4w(((u16 *)buf)[k]);
  173. if (count < 512) WR(0x84,0);
  174.                 break;
  175.         case 5: if (count < 512) WR(0x84,1);
  176. w3(0x40);
  177.                 for (k=0;k<count/4;k++) w4l(((u32 *)buf)[k]);
  178. if (count < 512) WR(0x84,0);
  179.                 break;
  180.         }
  181. }
  182. static int epia_test_proto( PIA *pi, char * scratch, int verbose )
  183. {       int     j, k, f;
  184. int e[2] = {0,0};
  185.         epia_connect(pi);
  186.         for (j=0;j<2;j++) {
  187.             WR(6,0xa0+j*0x10);
  188.             for (k=0;k<256;k++) {
  189.                 WR(2,k^0xaa);
  190.                 WR(3,k^0x55);
  191.                 if (RR(2) != (k^0xaa)) e[j]++;
  192.                 }
  193.     WR(2,1); WR(3,1);
  194.             }
  195.         epia_disconnect(pi);
  196.         f = 0;
  197.         epia_connect(pi);
  198.         WR(0x84,8);
  199.         epia_read_block(pi,scratch,512);
  200.         for (k=0;k<256;k++) {
  201.             if ((scratch[2*k] & 0xff) != ((k+1) & 0xff)) f++;
  202.             if ((scratch[2*k+1] & 0xff) != ((-2-k) & 0xff)) f++;
  203.         }
  204.         WR(0x84,0);
  205.         epia_disconnect(pi);
  206.         if (verbose)  {
  207.             printk("%s: epia: port 0x%x, mode %d, test=(%d,%d,%d)n",
  208.                    pi->device,pi->port,pi->mode,e[0],e[1],f);
  209.         }
  210.         
  211.         return (e[0] && e[1]) || f;
  212. }
  213. static void epia_log_adapter( PIA *pi, char * scratch, int verbose )
  214. {       char    *mode_string[6] = {"4-bit","5/3","8-bit",
  215.    "EPP-8","EPP-16","EPP-32"};
  216.         printk("%s: epia %s, Shuttle EPIA at 0x%x, ",
  217.                 pi->device,EPIA_VERSION,pi->port);
  218.         printk("mode %d (%s), delay %dn",pi->mode,
  219. mode_string[pi->mode],pi->delay);
  220. }
  221. static struct pi_protocol epia = {
  222. .owner = THIS_MODULE,
  223. .name = "epia",
  224. .max_mode = 6,
  225. .epp_first = 3,
  226. .default_delay = 1,
  227. .max_units = 1,
  228. .write_regr = epia_write_regr,
  229. .read_regr = epia_read_regr,
  230. .write_block = epia_write_block,
  231. .read_block = epia_read_block,
  232. .connect = epia_connect,
  233. .disconnect = epia_disconnect,
  234. .test_proto = epia_test_proto,
  235. .log_adapter = epia_log_adapter,
  236. };
  237. static int __init epia_init(void)
  238. {
  239. return pi_register(&epia)-1;
  240. }
  241. static void __exit epia_exit(void)
  242. {
  243. pi_unregister(&epia);
  244. }
  245. MODULE_LICENSE("GPL");
  246. module_init(epia_init)
  247. module_exit(epia_exit)