io.c

来自「内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系」· C语言 代码 · 共 136 行

C
136
字号
/* * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Low level I/O functions for Jazz family machines. * * Copyright (C) 1997 by Ralf Baechle. */#include <linux/string.h>#include <linux/spinlock.h>#include <asm/addrspace.h>#include <asm/system.h>#include <asm/jazz.h>/* * Map an 16mb segment of the EISA address space to 0xe3000000; */static inline void map_eisa_address(unsigned long address){  /* XXX */  /* We've got an wired entry in the TLB.  We just need to modify it.     fast and clean.  But since we want to get rid of wired entries     things are a little bit more complicated ... */}static unsigned char jazz_readb(unsigned long addr){	unsigned char res;	map_eisa_address(addr);	addr &= 0xffffff;	res = *(volatile unsigned char *) (JAZZ_EISA_BASE + addr);	return res;}static unsigned short jazz_readw(unsigned long addr){	unsigned short res;	map_eisa_address(addr);	addr &= 0xffffff;	res = *(volatile unsigned char *) (JAZZ_EISA_BASE + addr);	return res;}static unsigned int jazz_readl(unsigned long addr){	unsigned int res;	map_eisa_address(addr);	addr &= 0xffffff;	res = *(volatile unsigned char *) (JAZZ_EISA_BASE + addr);	return res;}static void jazz_writeb(unsigned char val, unsigned long addr){	map_eisa_address(addr);	addr &= 0xffffff;	*(volatile unsigned char *) (JAZZ_EISA_BASE + addr) = val;}static void jazz_writew(unsigned short val, unsigned long addr){	map_eisa_address(addr);	addr &= 0xffffff;	*(volatile unsigned char *) (JAZZ_EISA_BASE + addr) = val;}static void jazz_writel(unsigned int val, unsigned long addr){	map_eisa_address(addr);	addr &= 0xffffff;	*(volatile unsigned char *) (JAZZ_EISA_BASE + addr) = val;}static void jazz_memset_io(unsigned long addr, int val, unsigned long len){	unsigned long waddr;	waddr = JAZZ_EISA_BASE | (addr & 0xffffff);	while(len) {		unsigned long fraglen;		fraglen = (~addr + 1) & 0xffffff;		fraglen = (fraglen < len) ? fraglen : len;		map_eisa_address(addr);		memset((char *)waddr, val, fraglen);		addr += fraglen;		waddr = waddr + fraglen - 0x1000000;		len -= fraglen;	}}static void jazz_memcpy_fromio(unsigned long to, unsigned long from, unsigned long len){	unsigned long waddr;	waddr = JAZZ_EISA_BASE | (from & 0xffffff);	while(len) {		unsigned long fraglen;		fraglen = (~from + 1) & 0xffffff;		fraglen = (fraglen < len) ? fraglen : len;		map_eisa_address(from);		memcpy((void *)to, (void *)waddr, fraglen);		to += fraglen;		from += fraglen;		waddr = waddr + fraglen - 0x1000000;		len -= fraglen;	}}static void jazz_memcpy_toio(unsigned long to, unsigned long from, unsigned long len){	unsigned long waddr;	waddr = JAZZ_EISA_BASE | (to & 0xffffff);	while(len) {		unsigned long fraglen;		fraglen = (~to + 1) & 0xffffff;		fraglen = (fraglen < len) ? fraglen : len;		map_eisa_address(to);		memcpy((char *)to + JAZZ_EISA_BASE, (void *)from, fraglen);		to += fraglen;		from += fraglen;		waddr = waddr + fraglen - 0x1000000;		len -= fraglen;	}}

⌨️ 快捷键说明

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