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

嵌入式Linux

开发平台:

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 out_8(addr,b) (void)((*(volatile unsigned char *) (addr)) = (b))
  20. #define out_be16(addr,b) (void)((*(volatile unsigned short *) (addr)) = (b))
  21. #define out_be32(addr,b) (void)((*(volatile unsigned int *) (addr)) = (b))
  22. #define raw_inb in_8
  23. #define raw_inw in_be16
  24. #define raw_inl in_be32
  25. #define raw_outb(val,port) out_8((port),(val))
  26. #define raw_outw(val,port) out_be16((port),(val))
  27. #define raw_outl(val,port) out_be32((port),(val))
  28. #define raw_insb(port, buf, len) ({    
  29. volatile unsigned char *_port = (volatile unsigned char *) (port);   
  30.         unsigned char *_buf =(unsigned char *)(buf);    
  31.         unsigned int  _i,_len=(unsigned int)(len);    
  32.         for(_i=0; _i< _len; _i++)  
  33.            *_buf++=in_8(_port);      
  34.   })
  35. #define raw_outsb(port, buf, len) ({    
  36. volatile unsigned char *_port = (volatile unsigned char *) (port);   
  37.         unsigned char *_buf =(unsigned char *)(buf);    
  38.         unsigned int  _i,_len=(unsigned int)(len);    
  39.         for( _i=0; _i< _len; _i++)  
  40.            out_8(_port,*_buf++);      
  41.   })
  42.  
  43. #define raw_insw(port, buf, nr) ({
  44. volatile unsigned char *_port = (volatile unsigned char *) (port);
  45. unsigned char *_buf = (unsigned char *)(buf);
  46. unsigned int _nr = (unsigned int)(nr);
  47. unsigned long _tmp;
  48. if (_nr & 15) {
  49. _tmp = (_nr & 15) - 1;
  50. asm volatile (
  51. "1: movew %2@,%0@+; dbra %1,1b"
  52. : "=a" (_buf), "=d" (_tmp)
  53. : "a" (_port), "0" (_buf),
  54.   "1" (_tmp));
  55. }
  56. if (_nr >> 4) {
  57. _tmp = (_nr >> 4) - 1;
  58. asm volatile (
  59. "1: "
  60. "movew %2@,%0@+; "
  61. "movew %2@,%0@+; "
  62. "movew %2@,%0@+; "
  63. "movew %2@,%0@+; "
  64. "movew %2@,%0@+; "
  65. "movew %2@,%0@+; "
  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. "dbra %1,1b"
  77. : "=a" (_buf), "=d" (_tmp)
  78. : "a" (_port), "0" (_buf),
  79.   "1" (_tmp));
  80. }
  81. })
  82. #define raw_outsw(port, buf, nr) ({
  83. volatile unsigned char *_port = (volatile unsigned char *) (port);
  84. unsigned char *_buf = (unsigned char *)(buf);
  85. unsigned int _nr = (unsigned int)(nr);
  86. unsigned long _tmp;
  87. if (_nr & 15) {
  88. _tmp = (_nr & 15) - 1;
  89. asm volatile (
  90. "1: movew %0@+,%2@; dbra %1,1b"
  91. : "=a" (_buf), "=d" (_tmp)
  92. : "a" (_port), "0" (_buf),
  93.   "1" (_tmp));
  94. }
  95. if (_nr >> 4) {
  96. _tmp = (_nr >> 4) - 1;
  97. asm volatile (
  98. "1: "
  99. "movew %0@+,%2@; "
  100. "movew %0@+,%2@; "
  101. "movew %0@+,%2@; "
  102. "movew %0@+,%2@; "
  103. "movew %0@+,%2@; "
  104. "movew %0@+,%2@; "
  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. "dbra %1,1b"    
  116. : "=a" (_buf), "=d" (_tmp)
  117. : "a" (_port), "0" (_buf),
  118.   "1" (_tmp));
  119. }
  120. })
  121. #define raw_insw_swapw(port, buf, nr) 
  122. ({  if ((nr) % 8) 
  123. __asm__ __volatile__ 
  124.        ("movel %0,%/a0; 
  125.  movel %1,%/a1; 
  126.  movel %2,%/d6; 
  127.  subql #1,%/d6; 
  128.        1:movew %/a0@,%/d0; 
  129.  rolw  #8,%/d0; 
  130.  movew %/d0,%/a1@+; 
  131.  dbra %/d6,1b"  
  132. :               
  133. : "g" (port), "g" (buf), "g" (nr) 
  134. : "d0", "a0", "a1", "d6"); 
  135.     else 
  136. __asm__ __volatile__ 
  137.        ("movel %0,%/a0; 
  138.  movel %1,%/a1; 
  139.  movel %2,%/d6; 
  140.  lsrl  #3,%/d6; 
  141.  subql #1,%/d6; 
  142.        1:movew %/a0@,%/d0; 
  143.  rolw  #8,%/d0; 
  144.  movew %/d0,%/a1@+; 
  145.  movew %/a0@,%/d0; 
  146.  rolw  #8,%/d0; 
  147.  movew %/d0,%/a1@+; 
  148.  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.  dbra %/d6,1b"  
  167.                 :               
  168. : "g" (port), "g" (buf), "g" (nr) 
  169. : "d0", "a0", "a1", "d6"); 
  170. })
  171. #define raw_outsw_swapw(port, buf, nr) 
  172. ({  if ((nr) % 8) 
  173. __asm__ __volatile__ 
  174.        ("movel %0,%/a0; 
  175.  movel %1,%/a1; 
  176.  movel %2,%/d6; 
  177.  subql #1,%/d6; 
  178.        1:movew %/a1@+,%/d0; 
  179.  rolw  #8,%/d0; 
  180.  movew %/d0,%/a0@; 
  181.  dbra %/d6,1b"  
  182.                 :               
  183. : "g" (port), "g" (buf), "g" (nr) 
  184. : "d0", "a0", "a1", "d6"); 
  185.     else 
  186. __asm__ __volatile__ 
  187.        ("movel %0,%/a0; 
  188.  movel %1,%/a1; 
  189.  movel %2,%/d6; 
  190.  lsrl  #3,%/d6; 
  191.  subql #1,%/d6; 
  192.        1:movew %/a1@+,%/d0; 
  193.  rolw  #8,%/d0; 
  194.  movew %/d0,%/a0@; 
  195.  movew %/a1@+,%/d0; 
  196.  rolw  #8,%/d0; 
  197.  movew %/d0,%/a0@; 
  198.  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.  dbra %/d6,1b"  
  217.                 :               
  218. : "g" (port), "g" (buf), "g" (nr) 
  219. : "d0", "a0", "a1", "d6"); 
  220. })
  221. #endif /* __KERNEL__ */
  222. #endif /* _RAW_IO_H */