📄 hi_memmap.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 + -