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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/asm-m68k/raw_io.h 
  3.  *
  4.  * 10/20/00 RZ: - created from bits of io.h and ide.h to cleanup namespace
  5.  *
  6.  */
  7. #ifndef _RAW_IO_H
  8. #define _RAW_IO_H
  9. #ifdef __KERNEL__
  10. /* ++roman: The assignments to temp. vars avoid that gcc sometimes generates
  11.  * two accesses to memory, which may be undesirable for some devices.
  12.  */
  13. #define in_8(addr) 
  14.     ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; })
  15. #define in_be16(addr) 
  16.     ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; })
  17. #define in_be32(addr) 
  18.     ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
  19. #define in_le16(addr) 
  20.     ({ unsigned short __v = le16_to_cpu(*(volatile unsigned short *) (addr)); __v; })
  21. #define in_le32(addr) 
  22.     ({ unsigned int __v = le32_to_cpu(*(volatile unsigned int *) (addr)); __v; })
  23. #define out_8(addr,b) (void)((*(volatile unsigned char *) (addr)) = (b))
  24. #define out_be16(addr,w) (void)((*(volatile unsigned short *) (addr)) = (w))
  25. #define out_be32(addr,l) (void)((*(volatile unsigned int *) (addr)) = (l))
  26. #define out_le16(addr,w) (void)((*(volatile unsigned short *) (addr)) = cpu_to_le16(w))
  27. #define out_le32(addr,l) (void)((*(volatile unsigned int *) (addr)) = cpu_to_le32(l))
  28. #define raw_inb in_8
  29. #define raw_inw in_be16
  30. #define raw_inl in_be32
  31. #define raw_outb(val,port) out_8((port),(val))
  32. #define raw_outw(val,port) out_be16((port),(val))
  33. #define raw_outl(val,port) out_be32((port),(val))
  34. #define raw_insb(port, buf, len) ({    
  35. volatile unsigned char *_port = (volatile unsigned char *) (port);   
  36.         unsigned char *_buf =(unsigned char *)(buf);    
  37.         unsigned int  _i,_len=(unsigned int)(len);    
  38.         for(_i=0; _i< _len; _i++)  
  39.            *_buf++=in_8(_port);      
  40.   })
  41. #define raw_outsb(port, buf, len) ({    
  42. volatile unsigned char *_port = (volatile unsigned char *) (port);   
  43.         unsigned char *_buf =(unsigned char *)(buf);    
  44.         unsigned int  _i,_len=(unsigned int)(len);    
  45.         for( _i=0; _i< _len; _i++)  
  46.            out_8(_port,*_buf++);      
  47.   })
  48.  
  49. #define raw_insw(port, buf, nr) ({
  50. volatile unsigned char *_port = (volatile unsigned char *) (port);
  51. unsigned char *_buf = (unsigned char *)(buf);
  52. unsigned int _nr = (unsigned int)(nr);
  53. unsigned long _tmp;
  54. if (_nr & 15) {
  55. _tmp = (_nr & 15) - 1;
  56. asm volatile (
  57. "1: movew %2@,%0@+; dbra %1,1b"
  58. : "=a" (_buf), "=d" (_tmp)
  59. : "a" (_port), "0" (_buf),
  60.   "1" (_tmp));
  61. }
  62. if (_nr >> 4) {
  63. _tmp = (_nr >> 4) - 1;
  64. asm volatile (
  65. "1: "
  66. "movew %2@,%0@+; "
  67. "movew %2@,%0@+; "
  68. "movew %2@,%0@+; "
  69. "movew %2@,%0@+; "
  70. "movew %2@,%0@+; "
  71. "movew %2@,%0@+; "
  72. "movew %2@,%0@+; "
  73. "movew %2@,%0@+; "
  74. "movew %2@,%0@+; "
  75. "movew %2@,%0@+; "
  76. "movew %2@,%0@+; "
  77. "movew %2@,%0@+; "
  78. "movew %2@,%0@+; "
  79. "movew %2@,%0@+; "
  80. "movew %2@,%0@+; "
  81. "movew %2@,%0@+; "
  82. "dbra %1,1b"
  83. : "=a" (_buf), "=d" (_tmp)
  84. : "a" (_port), "0" (_buf),
  85.   "1" (_tmp));
  86. }
  87. })
  88. #define raw_outsw(port, buf, nr) ({
  89. volatile unsigned char *_port = (volatile unsigned char *) (port);
  90. unsigned char *_buf = (unsigned char *)(buf);
  91. unsigned int _nr = (unsigned int)(nr);
  92. unsigned long _tmp;
  93. if (_nr & 15) {
  94. _tmp = (_nr & 15) - 1;
  95. asm volatile (
  96. "1: movew %0@+,%2@; dbra %1,1b"
  97. : "=a" (_buf), "=d" (_tmp)
  98. : "a" (_port), "0" (_buf),
  99.   "1" (_tmp));
  100. }
  101. if (_nr >> 4) {
  102. _tmp = (_nr >> 4) - 1;
  103. asm volatile (
  104. "1: "
  105. "movew %0@+,%2@; "
  106. "movew %0@+,%2@; "
  107. "movew %0@+,%2@; "
  108. "movew %0@+,%2@; "
  109. "movew %0@+,%2@; "
  110. "movew %0@+,%2@; "
  111. "movew %0@+,%2@; "
  112. "movew %0@+,%2@; "
  113. "movew %0@+,%2@; "
  114. "movew %0@+,%2@; "
  115. "movew %0@+,%2@; "
  116. "movew %0@+,%2@; "
  117. "movew %0@+,%2@; "
  118. "movew %0@+,%2@; "
  119. "movew %0@+,%2@; "
  120. "movew %0@+,%2@; "
  121. "dbra %1,1b"    
  122. : "=a" (_buf), "=d" (_tmp)
  123. : "a" (_port), "0" (_buf),
  124.   "1" (_tmp));
  125. }
  126. })
  127. #define raw_insw_swapw(port, buf, nr) 
  128. ({  if ((nr) % 8) 
  129. __asm__ __volatile__ 
  130.        ("movel %0,%/a0; 
  131.  movel %1,%/a1; 
  132.  movel %2,%/d6; 
  133.  subql #1,%/d6; 
  134.        1:movew %/a0@,%/d0; 
  135.  rolw  #8,%/d0; 
  136.  movew %/d0,%/a1@+; 
  137.  dbra %/d6,1b"  
  138. :               
  139. : "g" (port), "g" (buf), "g" (nr) 
  140. : "d0", "a0", "a1", "d6"); 
  141.     else 
  142. __asm__ __volatile__ 
  143.        ("movel %0,%/a0; 
  144.  movel %1,%/a1; 
  145.  movel %2,%/d6; 
  146.  lsrl  #3,%/d6; 
  147.  subql #1,%/d6; 
  148.        1:movew %/a0@,%/d0; 
  149.  rolw  #8,%/d0; 
  150.  movew %/d0,%/a1@+; 
  151.  movew %/a0@,%/d0; 
  152.  rolw  #8,%/d0; 
  153.  movew %/d0,%/a1@+; 
  154.  movew %/a0@,%/d0; 
  155.  rolw  #8,%/d0; 
  156.  movew %/d0,%/a1@+; 
  157.  movew %/a0@,%/d0; 
  158.  rolw  #8,%/d0; 
  159.  movew %/d0,%/a1@+; 
  160.  movew %/a0@,%/d0; 
  161.  rolw  #8,%/d0; 
  162.  movew %/d0,%/a1@+; 
  163.  movew %/a0@,%/d0; 
  164.  rolw  #8,%/d0; 
  165.  movew %/d0,%/a1@+; 
  166.  movew %/a0@,%/d0; 
  167.  rolw  #8,%/d0; 
  168.  movew %/d0,%/a1@+; 
  169.  movew %/a0@,%/d0; 
  170.  rolw  #8,%/d0; 
  171.  movew %/d0,%/a1@+; 
  172.  dbra %/d6,1b"  
  173.                 :               
  174. : "g" (port), "g" (buf), "g" (nr) 
  175. : "d0", "a0", "a1", "d6"); 
  176. })
  177. #define raw_outsw_swapw(port, buf, nr) 
  178. ({  if ((nr) % 8) 
  179. __asm__ __volatile__ 
  180.        ("movel %0,%/a0; 
  181.  movel %1,%/a1; 
  182.  movel %2,%/d6; 
  183.  subql #1,%/d6; 
  184.        1:movew %/a1@+,%/d0; 
  185.  rolw  #8,%/d0; 
  186.  movew %/d0,%/a0@; 
  187.  dbra %/d6,1b"  
  188.                 :               
  189. : "g" (port), "g" (buf), "g" (nr) 
  190. : "d0", "a0", "a1", "d6"); 
  191.     else 
  192. __asm__ __volatile__ 
  193.        ("movel %0,%/a0; 
  194.  movel %1,%/a1; 
  195.  movel %2,%/d6; 
  196.  lsrl  #3,%/d6; 
  197.  subql #1,%/d6; 
  198.        1:movew %/a1@+,%/d0; 
  199.  rolw  #8,%/d0; 
  200.  movew %/d0,%/a0@; 
  201.  movew %/a1@+,%/d0; 
  202.  rolw  #8,%/d0; 
  203.  movew %/d0,%/a0@; 
  204.  movew %/a1@+,%/d0; 
  205.  rolw  #8,%/d0; 
  206.  movew %/d0,%/a0@; 
  207.  movew %/a1@+,%/d0; 
  208.  rolw  #8,%/d0; 
  209.  movew %/d0,%/a0@; 
  210.  movew %/a1@+,%/d0; 
  211.  rolw  #8,%/d0; 
  212.  movew %/d0,%/a0@; 
  213.  movew %/a1@+,%/d0; 
  214.  rolw  #8,%/d0; 
  215.  movew %/d0,%/a0@; 
  216.  movew %/a1@+,%/d0; 
  217.  rolw  #8,%/d0; 
  218.  movew %/d0,%/a0@; 
  219.  movew %/a1@+,%/d0; 
  220.  rolw  #8,%/d0; 
  221.  movew %/d0,%/a0@; 
  222.  dbra %/d6,1b"  
  223.                 :               
  224. : "g" (port), "g" (buf), "g" (nr) 
  225. : "d0", "a0", "a1", "d6"); 
  226. })
  227. #endif /* __KERNEL__ */
  228. #endif /* _RAW_IO_H */