linux mmap


原文链接: linux mmap

由于在应用层没法用writel,所以参考himm.c写了一个设置,代码如下:

void uart1_rtsn_high(void)
{  
  void * pMem  = NULL;
  pMem = memmap(0x201d0010, DEFAULT_MD_LEN);
  (U32)pMem = 0xff;
}

文件名是rs485.c
————————————————
版权声明:本文为CSDN博主「苏西守护者」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013308744/article/details/77964483

说:HI_MPI_SYS_Mmap 存储映射接口

HI_VOID * HI_MPI_SYS_Mmap(HI_U32 u32PhyAddr, HI_U32 u32Size);
注意:等同于 LINUX 系统 mmap 函数

然后是linux mmap,
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

在开发过程中,我就想实现一个功能:将内核物理地址映射到虚拟地址当中,使得我能够在用户空间里面使用某指定地址。
比方说:
HI_MPI_VB_GetBlock->HI_MPI_VB_Handle2PhysAddr->HI_MPI_SYS_Mmap,这样就可以使用到了。

但应用mmap,看海思sample

HI_VOID* COMM_SYS_Mmap(HI_U32 u32PhyAddr, HI_U32 u32Size)
{

HI_U32 u32Diff;
HI_U32 u32PagePhy;
HI_U32 u32PageSize;
HI_U8* pPageAddr;

/* The mmap address should align with page */
u32PagePhy = u32PhyAddr & 0xfffff000;
u32Diff    = u32PhyAddr - u32PagePhy;

/* The mmap size shuld be mutliples of 1024 */
u32PageSize = ((u32Size + u32Diff - 1) & 0xfffff000) + 0x1000;
pPageAddr   = mmap ((void*)0, u32PageSize, PROT_READ | PROT_WRITE,
                    MAP_SHARED, s_s32MemDev, u32PagePhy);
if (MAP_FAILED == pPageAddr )
{
    perror("mmap error");
    return NULL;
}
return (HI_VOID*) (pPageAddr + u32Diff);

复制代码

`