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

📄 hi_memmap.c

📁 华为 HI3510 BOOTLOADER HIBOOT 源码包
💻 C
字号:
/************************************************************//* file name : memmap.c                                     *//* linux /dev/mem mmap support func							*//* 															*//* 															*//* Copyright 2005 huawei com.                               *//* Author :zhouaidi(42136)									*//* Create date: 2005-04-07									*//* Modify history											*//* 2005-06-12: 对映射成功空间建立管理链表,可以防止对重叠   *//*             空间的重复映射                               *//************************************************************/#include <config.h>#if defined(CONFIG_HI3510_LOGO)/*#include <stdio.h>*/#include "hi_common/hi.h"#include "hi_inc.h"#ifdef OS_LINUX#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/mman.h>typedef struct tag_MMAP_Node{	unsigned int Start_P;	unsigned int Start_V;	unsigned int length;	struct tag_MMAP_Node * next;}MMAP_Node_t;MMAP_Node_t * pMMAPNode = NULL;#define PAGE_SIZE 0x1000#define PAGE_SIZE_MASK 0xfffff000static int fd = -1;static const char dev[]="/dev/mem";#endif/* no need considering page_size of 4K */void * memmap(unsigned int phy_addr, unsigned int size){#ifndef OS_LINUX	return (void *)phy_addr;#else	unsigned int phy_addr_in_page;	unsigned int page_diff;	unsigned int size_in_page;	unsigned int size_diff;	MMAP_Node_t * pTmp;	MMAP_Node_t * pNew;		void *addr=NULL;	if(size == 0)	{		printf("memmap(): size can't be zero!\n");		return NULL;	}	/* check if the physical memory space have been mmaped */	pTmp = pMMAPNode;	while(pTmp != NULL)	{		if( (phy_addr >= pTmp->Start_P) && 			( (phy_addr + size) <= (pTmp->Start_P + pTmp->length) ) )		{			return (void *)(pTmp->Start_V + phy_addr - pTmp->Start_P);		}		pTmp = pTmp->next;	}	/* not mmaped yet */	if(fd < 0)	{		/* dev not opened yet, so open it */		fd = open (dev, O_RDWR);		//printf("fd=%d\n", fd);		if (fd < 0)		{			printf("open %s error!\n", dev);			return NULL;		}	}	/* addr align in page_size(4K) */	phy_addr_in_page = phy_addr & PAGE_SIZE_MASK;	page_diff = phy_addr - phy_addr_in_page;	/* size in page_size */	size_in_page =((size + page_diff - 1) & PAGE_SIZE_MASK) + PAGE_SIZE;	addr = mmap ((void *)0, size_in_page, PROT_READ|PROT_WRITE, MAP_SHARED, fd, phy_addr_in_page);	if (addr == MAP_FAILED)	{		printf("mmap @ 0x%x error!\n", phy_addr_in_page);		return NULL;	}	printf("Mapped %s (%lu @ %lx) at 0x%x\n", dev, size_in_page, phy_addr_in_page, addr);	/* add this mmap to MMAP Node */	pNew = (MMAP_Node_t *)malloc(sizeof(MMAP_Node_t));	pNew->Start_P = phy_addr_in_page;	pNew->Start_V = (unsigned int)addr;	pNew->length = size_in_page;	pNew->next = NULL;		if(pMMAPNode == NULL)	{		pMMAPNode = pNew;	}	else	{		pTmp = pMMAPNode;		while(pTmp->next != NULL)		{			pTmp = pTmp->next;		}		pTmp->next = pNew;	}	return (void *)(addr+page_diff);#endif}#endif

⌨️ 快捷键说明

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