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

📄 mmu.c

📁 使用Linux ARM GCC编译器来编译
💻 C
字号:
/* * vivi/arch/s3c2440/mmu.c: Simple memory mapping * * Copyriget (C) 2001,2002 MIZI Research, Inc. * * Author: Janghoon Lyu <nandy@mizi.com> * Date  : $Date: 2004/02/04 06:22:24 $ * * $Revision: 1.1.1.1 $ * * Note:  * * * History * * 2002-05-15: Janghoon Lyu <nandy@mizi.com> *    - Initial code *  * 2002-07-15: Janghoon Lyu <nandy@mizi.com> *     */#include "config.h"#include "machine.h"#include "mmu.h"#include "vivi_string.h"static unsigned long *mmu_tlb_base = (unsigned long *) MMU_TABLE_BASE;/* * cpu_arm920_cache_clean_invalidate_all() * * clean and invalidate all cache lines * */static inline void cpu_arm920_cache_clean_invalidate_all(void){__asm__(	"	mov	r1, #0\n"	"	mov	r1, #7 << 5\n"		  /* 8 segments */	"1:	orr	r3, r1, #63 << 26\n"	  /* 64 entries */	"2:	mcr	p15, 0, r3, c7, c14, 2\n" /* clean & invalidate D index */	"	subs	r3, r3, #1 << 26\n"	"	bcs	2b\n"			  /* entries 64 to 0 */	"	subs	r1, r1, #1 << 5\n"	"	bcs	1b\n"			  /* segments 7 to 0 */	"	mcr	p15, 0, r1, c7, c5, 0\n"  /* invalidate I cache */	"	mcr	p15, 0, r1, c7, c10, 4\n" /* drain WB */	);}void cache_clean_invalidate(void){	cpu_arm920_cache_clean_invalidate_all();}/* * cpu_arm920_tlb_invalidate_all() * * Invalidate all TLB entries */static inline void cpu_arm920_tlb_invalidate_all(void){	__asm__(		"mov	r0, #0\n"		"mcr	p15, 0, r0, c7, c10, 4\n"	/* drain WB */		"mcr	p15, 0, r0, c8, c7, 0\n"	/* invalidate I & D TLBs */		);}#if 0/* ARM920T S3C2440, S3C2440 */void MMU_SetFastBusMode(void){	/* R1_nF|R1_iA */	__asm__(		"mrc	p15, 0, r0, c1, c0, #0\n"		"bic 	r0, r0, #( 3 << 30 )\n"		"mcr	p15, 0, r0, c1, c0, 0 \n"	       );}void MMU_SetAsyncBusMode(void){	__asm__(		"mrc	p15, 0, r0, c1, c0, #0\n"		"orr 	r0, r0, #( 3 << 30 )\n"		"mcr	p15, 0, r0, c1, c0, 0 \n"	       );}#endifvoid tlb_invalidate(void){	cpu_arm920_tlb_invalidate_all();}static inline void arm920_setup(void){	unsigned long ttb = MMU_TABLE_BASE;__asm__(	/* Invalidate caches */	"mov	r0, #0\n"	"mcr	p15, 0, r0, c7, c7, 0\n"	/* invalidate I,D caches on v4 */	"mcr	p15, 0, r0, c7, c10, 4\n"	/* drain write buffer on v4 */	"mcr	p15, 0, r0, c8, c7, 0\n"	/* invalidate I,D TLBs on v4 */	/* Load page table pointer */	"mov	r4, %0\n"	"mcr	p15, 0, r4, c2, c0, 0\n"	/* load page table pointer */	/* Write domain id (cp15_r3) */	"mvn	r0, #0\n"			/* Domains 0, 1 = client */	"mcr	p15, 0, r0, c3, c0, 0\n"	/* load domain access register */	/* Set control register v4 */	"mrc	p15, 0, r0, c1, c0, 0\n"	/* get control register v4 */	/* Clear out 'unwanted' bits (then put them in if we need them) */						/* .RVI ..RS B... .CAM */ 	"bic	r0, r0, #0x3000\n"		/* ..11 .... .... .... */	"bic	r0, r0, #0x0300\n"		/* .... ..11 .... .... */	"bic	r0, r0, #0x0087\n"		/* .... .... 1... .111 */	/* Turn on what we want */	/* Fault checking enabled */	"orr	r0, r0, #0x0002\n"		/* .... .... .... ..1. */#ifdef CONFIG_CPU_D_CACHE_ON	"orr	r0, r0, #0x0004\n"		/* .... .... .... .1.. */#endif  #ifdef CONFIG_CPU_I_CACHE_ON 	"orr	r0, r0, #0x1000\n"		/* ...1 .... .... .... */#endif  	/* MMU enabled */	"orr	r0, r0, #0x0001\n"		/* .... .... .... ...1 */	"mcr	p15, 0, r0, c1, c0, 0\n"	/* write control register */	: /* no outputs */	: "r" (ttb) );}void mmu_init(void){	arm920_setup();}#if 0static void copy_vivi_to_ram(void){	putstr_hex("Evacuating 1MB of Flash to DRAM at 0x", VIVI_RAM_BASE);	memcpy((void *)VIVI_RAM_BASE, (void *)VIVI_ROM_BASE, VIVI_RAM_SIZE);}#endifstatic inline void mem_mapping_linear(void){	unsigned long pageoffset, sectionNumber;	putstr_hex("MMU table base address = 0x", (unsigned long)mmu_tlb_base);	/* 4G 康开阑 1:1肺 概俏. not cacacheable, not bufferable */	for (sectionNumber = 0; sectionNumber < 4096; sectionNumber++) {		pageoffset = (sectionNumber << 20);		*(mmu_tlb_base + sectionNumber) = pageoffset | MMU_SECDESC;	}	/* make dram cacheable */	for (pageoffset = DRAM_BASE; pageoffset < (DRAM_BASE+DRAM_SIZE); pageoffset += SZ_1M) {		//DPRINTK(3, "Make DRAM section cacheable: 0x%08lx\n", pageoffset);		*(mmu_tlb_base + (pageoffset >> 20)) = pageoffset | MMU_SECDESC | MMU_CACHEABLE; 	}}#ifdef CONFIG_MTD_AMDSTDstatic inline void nor_flash_mapping(void){	unsigned long offset, cached_addr, uncached_addr;	cached_addr = FLASH_BASE;	uncached_addr = FLASH_UNCACHED_BASE;	/*for (offset = 0; offset < FLASH_SIZE; offset += MMU_SECTION_SIZE) { 		cached_addr += offset;		uncached_addr += offset;		*(mmu_tlb_base + (cached_addr >> 20)) = \				(cached_addr | MMU_SECDESC | MMU_CACHEABLE);		*(mmu_tlb_base + (uncached_addr >> 20)) = \				(cached_addr | MMU_SECDESC);	}*/	for (offset = 0; offset < FLASH_SIZE; offset += MMU_SECTION_SIZE) { 		cached_addr = FLASH_BASE + offset;		uncached_addr = FLASH_UNCACHED_BASE + offset;		*(mmu_tlb_base + (cached_addr >> 20)) = \				(cached_addr | MMU_SECDESC | MMU_CACHEABLE);		*(mmu_tlb_base + (uncached_addr >> 20)) = \				(cached_addr | MMU_SECDESC);	}}#endif#if 0/* * mapping Flash bootloader area to the RAM bootloader area */static inline void nor_flash_remapping(void){	putstr_hex("Map flash virtual section to DRAM at 0x", VIVI_RAM_BASE);	*(mmu_tlb_base + (VIVI_ROM_BASE >> 20)) = \				(VIVI_RAM_BASE | MMU_SECDESC | MMU_CACHEABLE);}#endifvoid mem_map_nand_boot(void){	mem_mapping_linear();#ifdef CONFIG_MTD_AMDSTD	nor_flash_mapping();#endif}#if 0 //#ifndef CONFIG_S3C2440_NAND_BOOTvoid mem_map_nor(void){	copy_vivi_to_ram();	mem_mapping_linear();	nor_flash_mapping();	nor_flash_remapping();}#endifvoid mem_map_init(void){//#ifdef CONFIG_S3C2440_NAND_BOOT	mem_map_nand_boot();//#else//	mem_map_nor();//#endif	cache_clean_invalidate();	tlb_invalidate();}

⌨️ 快捷键说明

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