更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_vm_iomap.h 文件参考

浏览源代码.

枚举

enum  DmaMemType { DMA_CACHE , DMA_NOCACHE }
 

函数

VOID * LOS_DmaMemAlloc (DMA_ADDR_T *dmaAddr, size_t size, size_t align, enum DmaMemType type)
 分配DMA空间 更多...
 
VOID LOS_DmaMemFree (VOID *vaddr)
 释放 DMA指针 更多...
 
DMA_ADDR_T LOS_DmaVaddrToPaddr (VOID *vaddr)
 将DMA虚拟地址转成物理地址 更多...
 

枚举类型说明

◆ DmaMemType

enum DmaMemType
   DMA,全称Direct Memory Access,即直接存储器访问。
   DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
   DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,
   但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)
* 
枚举值
DMA_CACHE 

有缓存的DMA

DMA_NOCACHE 

无缓存的DMA

在文件 los_vm_iomap.h54 行定义.

54 {
55 DMA_CACHE, ///< 有缓存的DMA
56 DMA_NOCACHE ///< 无缓存的DMA
57};
@ DMA_CACHE
有缓存的DMA
Definition: los_vm_iomap.h:55
@ DMA_NOCACHE
无缓存的DMA
Definition: los_vm_iomap.h:56

函数说明

◆ LOS_DmaMemAlloc()

VOID * LOS_DmaMemAlloc ( DMA_ADDR_T dmaAddr,
size_t  size,
size_t  align,
enum DmaMemType  type 
)

分配DMA空间

在文件 los_vm_iomap.c86 行定义.

87{
88 VOID *kVaddr = NULL;
89
90 if (size == 0) {
91 return NULL;
92 }
93
94 if ((type != DMA_CACHE) && (type != DMA_NOCACHE)) {
95 VM_ERR("The dma type = %d is not supported!", type);
96 return NULL;
97 }
98
99#ifdef LOSCFG_KERNEL_VM
100 kVaddr = LOS_KernelMallocAlign(size, align);//不走内存池方式, 直接申请物理页
101#else
102 kVaddr = LOS_MemAllocAlign(OS_SYS_MEM_ADDR, size, align);//从内存池中申请
103#endif
104 if (kVaddr == NULL) {
105 VM_ERR("failed, size = %u, align = %u", size, align);
106 return NULL;
107 }
108
109 if (dmaAddr != NULL) {
110 *dmaAddr = (DMA_ADDR_T)LOS_PaddrQuery(kVaddr);//查询物理地址, DMA直接将数据灌到物理地址
111 }
112
113 if (type == DMA_NOCACHE) {//无缓存模式 , 计算新的虚拟地址
114 kVaddr = (VOID *)VMM_TO_UNCACHED_ADDR((UINTPTR)kVaddr);
115 }
116
117 return kVaddr;
118}
VOID * LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundary)
从指定内存池中申请size长度的内存且地址按boundary字节对齐的内存
Definition: los_memory.c:1150
unsigned long DMA_ADDR_T
Definition: los_typedef.h:210
unsigned long UINTPTR
Definition: los_typedef.h:68
PADDR_T LOS_PaddrQuery(VOID *vaddr)
通过虚拟地址查询映射的物理地址
Definition: los_vm_map.c:550
VOID * LOS_KernelMallocAlign(UINT32 size, UINT32 boundary)
函数调用图:

◆ LOS_DmaMemFree()

VOID LOS_DmaMemFree ( VOID *  vaddr)

释放 DMA指针

在文件 los_vm_iomap.c120 行定义.

121{
122 UINTPTR addr;
123
124 if (vaddr == NULL) {
125 return;
126 }
127 addr = (UINTPTR)vaddr;
128 // 未缓存区
129 if ((addr >= UNCACHED_VMM_BASE) && (addr < UNCACHED_VMM_BASE + UNCACHED_VMM_SIZE)) {
130 addr = UNCACHED_TO_VMM_ADDR(addr); //转换成未缓存区地址
131#ifdef LOSCFG_KERNEL_VM
132 LOS_KernelFree((VOID *)addr);//
133#else
134 LOS_MemFree(OS_SYS_MEM_ADDR, (VOID *)addr);//内存池方式释放
135#endif
136 } else if ((addr >= KERNEL_VMM_BASE) && (addr < KERNEL_VMM_BASE + KERNEL_VMM_SIZE)) {
137#ifdef LOSCFG_KERNEL_VM
138 LOS_KernelFree((VOID *)addr);
139#else
140 LOS_MemFree(OS_SYS_MEM_ADDR, (VOID *)addr);
141#endif
142 } else {
143 VM_ERR("addr %#x not in dma area!!!", vaddr);
144 }
145 return;
146}
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
Definition: los_memory.c:1369
VOID LOS_KernelFree(VOID *ptr)
函数调用图:

◆ LOS_DmaVaddrToPaddr()

DMA_ADDR_T LOS_DmaVaddrToPaddr ( VOID *  vaddr)

将DMA虚拟地址转成物理地址

在文件 los_vm_iomap.c148 行定义.

149{
150 return (DMA_ADDR_T)LOS_PaddrQuery(vaddr);
151}
函数调用图: