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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * mem_op.h 1.13 2000/06/12 21:55:40
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License
  5.  * Version 1.1 (the "License"); you may not use this file except in
  6.  * compliance with the License. You may obtain a copy of the License
  7.  * at http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS"
  10.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  11.  * the License for the specific language governing rights and
  12.  * limitations under the License. 
  13.  *
  14.  * The initial developer of the original code is David A. Hinds
  15.  * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
  16.  * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
  17.  *
  18.  * Alternatively, the contents of this file may be used under the
  19.  * terms of the GNU General Public License version 2 (the "GPL"), in which
  20.  * case the provisions of the GPL are applicable instead of the
  21.  * above.  If you wish to allow the use of your version of this file
  22.  * only under the terms of the GPL and not to allow others to use
  23.  * your version of this file under the MPL, indicate your decision by
  24.  * deleting the provisions above and replace them with the notice and
  25.  * other provisions required by the GPL.  If you do not delete the
  26.  * provisions above, a recipient may use your version of this file
  27.  * under either the MPL or the GPL.
  28.  */
  29. #ifndef _LINUX_MEM_OP_H
  30. #define _LINUX_MEM_OP_H
  31. #include <asm/uaccess.h>
  32. /*
  33.    If UNSAFE_MEMCPY is defined, we use the (optimized) system routines
  34.    to copy between a card and kernel memory.  These routines do 32-bit
  35.    operations which may not work with all PCMCIA controllers.  The
  36.    safe versions defined here will do only 8-bit and 16-bit accesses.
  37. */
  38. #ifdef UNSAFE_MEMCPY
  39. #define copy_from_pc memcpy_fromio
  40. #define copy_to_pc memcpy_toio
  41. static inline void copy_pc_to_user(void *to, const void *from, size_t n)
  42. {
  43.     size_t odd = (n & 3);
  44.     n -= odd;
  45.     while (n) {
  46. put_user(__raw_readl(from), (int *)to);
  47. (char *)from += 4; (char *)to += 4; n -= 4;
  48.     }
  49.     while (odd--)
  50. put_user(readb((char *)from++), (char *)to++);
  51. }
  52. static inline void copy_user_to_pc(void *to, const void *from, size_t n)
  53. {
  54.     int l;
  55.     char c;
  56.     size_t odd = (n & 3);
  57.     n -= odd;
  58.     while (n) {
  59. get_user(l, (int *)from);
  60. __raw_writel(l, to);
  61. (char *)to += 4; (char *)from += 4; n -= 4;
  62.     }
  63.     while (odd--) {
  64. get_user(c, (char *)from++);
  65. writeb(c, (char *)to++);
  66.     }
  67. }
  68. #else /* UNSAFE_MEMCPY */
  69. static inline void copy_from_pc(void *to, const void *from, size_t n)
  70. {
  71.     size_t odd = (n & 1);
  72.     n -= odd;
  73.     while (n) {
  74. *(u_short *)to = __raw_readw(from);
  75. (char *)to += 2; (char *)from += 2; n -= 2;
  76.     }
  77.     if (odd)
  78. *(u_char *)to = readb(from);
  79. }
  80. static inline void copy_to_pc(void *to, const void *from, size_t n)
  81. {
  82.     size_t odd = (n & 1);
  83.     n -= odd;
  84.     while (n) {
  85. __raw_writew(*(u_short *)from, to);
  86. (char *)to += 2; (char *)from += 2; n -= 2;
  87.     }
  88.     if (odd)
  89. writeb(*(u_char *)from, to);
  90. }
  91. static inline void copy_pc_to_user(void *to, const void *from, size_t n)
  92. {
  93.     size_t odd = (n & 1);
  94.     n -= odd;
  95.     while (n) {
  96. put_user(__raw_readw(from), (short *)to);
  97. (char *)to += 2; (char *)from += 2; n -= 2;
  98.     }
  99.     if (odd)
  100. put_user(readb(from), (char *)to);
  101. }
  102. static inline void copy_user_to_pc(void *to, const void *from, size_t n)
  103. {
  104.     short s;
  105.     char c;
  106.     size_t odd = (n & 1);
  107.     n -= odd;
  108.     while (n) {
  109. get_user(s, (short *)from);
  110. __raw_writew(s, to);
  111. (char *)to += 2; (char *)from += 2; n -= 2;
  112.     }
  113.     if (odd) {
  114. get_user(c, (char *)from);
  115. writeb(c, to);
  116.     }
  117. }
  118. #endif /* UNSAFE_MEMCPY */
  119. #endif /* _LINUX_MEM_OP_H */