⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 raw_io.h

📁 嵌入式系统设计与实验教材二源码linux内核移植与编译
💻 H
字号:
/* * linux/include/asm-m68k/raw_io.h  * * 10/20/00 RZ: - created from bits of io.h and ide.h to cleanup namespace * */#ifndef _RAW_IO_H#define _RAW_IO_H#ifdef __KERNEL__/* ++roman: The assignments to temp. vars avoid that gcc sometimes generates * two accesses to memory, which may be undesirable for some devices. */#define in_8(addr) \    ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; })#define in_be16(addr) \    ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; })#define in_be32(addr) \    ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })#define out_8(addr,b) (void)((*(volatile unsigned char *) (addr)) = (b))#define out_be16(addr,b) (void)((*(volatile unsigned short *) (addr)) = (b))#define out_be32(addr,b) (void)((*(volatile unsigned int *) (addr)) = (b))#define raw_inb in_8#define raw_inw in_be16#define raw_inl in_be32#define raw_outb(val,port) out_8((port),(val))#define raw_outw(val,port) out_be16((port),(val))#define raw_outl(val,port) out_be32((port),(val))#define raw_insb(port, buf, len) ({	   \	volatile unsigned char *_port = (volatile unsigned char *) (port);   \        unsigned char *_buf =(unsigned char *)(buf);	   \        unsigned int  _i,_len=(unsigned int)(len);	   \        for(_i=0; _i< _len; _i++)  \           *_buf++=in_8(_port);      \  })#define raw_outsb(port, buf, len) ({	   \	volatile unsigned char *_port = (volatile unsigned char *) (port);   \        unsigned char *_buf =(unsigned char *)(buf);	   \        unsigned int  _i,_len=(unsigned int)(len);	   \        for( _i=0; _i< _len; _i++)  \           out_8(_port,*_buf++);      \  }) #define raw_insw(port, buf, nr) ({				\	volatile unsigned char *_port = (volatile unsigned char *) (port);	\	unsigned char *_buf = (unsigned char *)(buf);			\	unsigned int _nr = (unsigned int)(nr);					\	unsigned long _tmp;				\							\	if (_nr & 15) {					\		_tmp = (_nr & 15) - 1;			\		asm volatile (				\			"1: movew %2@,%0@+; dbra %1,1b"	\			: "=a" (_buf), "=d" (_tmp)	\			: "a" (_port), "0" (_buf),	\			  "1" (_tmp));			\	}						\	if (_nr >> 4) {					\		_tmp = (_nr >> 4) - 1;			\		asm volatile (				\			"1: "				\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"movew %2@,%0@+; "		\			"dbra %1,1b"			\			: "=a" (_buf), "=d" (_tmp)	\			: "a" (_port), "0" (_buf),	\			  "1" (_tmp));			\	}						\})#define raw_outsw(port, buf, nr) ({				\	volatile unsigned char *_port = (volatile unsigned char *) (port);	\	unsigned char *_buf = (unsigned char *)(buf);			\	unsigned int _nr = (unsigned int)(nr);					\	unsigned long _tmp;				\							\	if (_nr & 15) {					\		_tmp = (_nr & 15) - 1;			\		asm volatile (				\			"1: movew %0@+,%2@; dbra %1,1b"	\			: "=a" (_buf), "=d" (_tmp)	\			: "a" (_port), "0" (_buf),	\			  "1" (_tmp));			\	}						\	if (_nr >> 4) {					\		_tmp = (_nr >> 4) - 1;			\		asm volatile (				\			"1: "				\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"movew %0@+,%2@; "		\			"dbra %1,1b"	   		\			: "=a" (_buf), "=d" (_tmp)	\			: "a" (_port), "0" (_buf),	\			  "1" (_tmp));			\	}						\})#define raw_insw_swapw(port, buf, nr) \({  if ((nr) % 8) \	__asm__ __volatile__ \	       ("movel %0,%/a0; \		 movel %1,%/a1; \		 movel %2,%/d6; \		 subql #1,%/d6; \	       1:movew %/a0@,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a1@+; \		 dbra %/d6,1b"  \		:               \		: "g" (port), "g" (buf), "g" (nr) \		: "d0", "a0", "a1", "d6"); \    else \	__asm__ __volatile__ \	       ("movel %0,%/a0; \		 movel %1,%/a1; \		 movel %2,%/d6; \		 lsrl  #3,%/d6; \		 subql #1,%/d6; \	       1:movew %/a0@,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a1@+; \		 movew %/a0@,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a1@+; \		 movew %/a0@,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a1@+; \		 movew %/a0@,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a1@+; \		 movew %/a0@,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a1@+; \		 movew %/a0@,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a1@+; \		 movew %/a0@,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a1@+; \		 movew %/a0@,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a1@+; \		 dbra %/d6,1b"  \                :               \		: "g" (port), "g" (buf), "g" (nr) \		: "d0", "a0", "a1", "d6"); \})#define raw_outsw_swapw(port, buf, nr) \({  if ((nr) % 8) \	__asm__ __volatile__ \	       ("movel %0,%/a0; \		 movel %1,%/a1; \		 movel %2,%/d6; \		 subql #1,%/d6; \	       1:movew %/a1@+,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a0@; \		 dbra %/d6,1b"  \                :               \		: "g" (port), "g" (buf), "g" (nr) \		: "d0", "a0", "a1", "d6"); \    else \	__asm__ __volatile__ \	       ("movel %0,%/a0; \		 movel %1,%/a1; \		 movel %2,%/d6; \		 lsrl  #3,%/d6; \		 subql #1,%/d6; \	       1:movew %/a1@+,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a0@; \		 movew %/a1@+,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a0@; \		 movew %/a1@+,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a0@; \		 movew %/a1@+,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a0@; \		 movew %/a1@+,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a0@; \		 movew %/a1@+,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a0@; \		 movew %/a1@+,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a0@; \		 movew %/a1@+,%/d0; \		 rolw  #8,%/d0; \		 movew %/d0,%/a0@; \		 dbra %/d6,1b"  \                :               \		: "g" (port), "g" (buf), "g" (nr) \		: "d0", "a0", "a1", "d6"); \})#endif /* __KERNEL__ */#endif /* _RAW_IO_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -