设为首页 加入收藏

TOP

hisi mmz模块驱动讲解(一)
2019-08-24 00:05:55 】 浏览:43
Tags:hisi mmz 模块 驱动 讲解

一、概述

如图所示,在海思平台上将内存分为两个部分:os内存和mmz内存。os内存指:由linux操作系统管理的内存;mmz内存:由mmz驱动模块进行管理供媒体业务单独使用的内存,在驱动加载时可以指定该模块管理内存的大小:

insmod hi_osal.ko mmz=anonymous,0,0x4fa00000,6Manony=1 || report_error

image

二、数据结构

1、mmz区域描述符

struct hil_media_memory_zone {

   char name[HIL_MMZ_NAME_LEN+1]; //mmz区域名字:anonymous

       

   unsigned long gfp;   //区域标识:0

 

   unsigned long phys_start; //mmz区域起始物理地址:0x4fa00000

   unsigned long nbytes; //mmz区域大小:6M

       

   struct list_head list; //mmz链表

 

   unsigned char *bitmap; //位图

   struct list_head mmb_list; //mmz区域的mmb链表,存放所有申请到的物理内存

   

   unsigned int alloc_type;

   unsigned long block_align;

   

   void (*destructor)(const void *);

};

2、mmb内存描述符

hil_media_memory_block描述了从mmz区域申请一块内存,同一个mmz区域内的所有mmb通过链表连接。

struct hil_media_memory_block {

   #ifndef MMZ_V2_SUPPORT

   unsigned int id;

   #endif

   char name[HIL_MMB_NAME_LEN+1]; //该mmb模块使用者名字

   struct hil_media_memory_zone *zone; //指向mmb所属的mmz区域

   struct list_head list; //mmb链表

        

   unsigned long phys_addr; //申请到的mmb起始物理地址

   void *kvirt;  //对应内核虚拟地址,从代码看未用

   unsigned long length; //申请的mmb大小

   

   unsigned long flags; //标识

   

   unsigned int order;

 

   int phy_ref; //引用计数

   int map_ref; //引用计数

};

3、mmz_userdev_info

该结构体保存打开该设备文件的进程信息,存放在file结构体的private_data成员里。

struct mmz_userdev_info {

   pid_t pid;         //打开设备文件的进程pid

   pid_t mmap_pid;

   struct semaphore sem; //信号量

   struct list_head list; //指向mmb_info链表

};

4、mmb_info

该结构体描述应用申请到mmb后的相关信息,同进程的mmb_info通过链表形式管理。

struct mmb_info {

   unsigned long phys_addr;    //申请到的物理内存,同mmb.phys.addr

   unsigned long align;        /* ifyou need your phys-memory have special align size */

   unsigned long size;     //申请的物理内存大小

   unsigned int order;

   

    void *mapped;       //指向mmap后的虚拟地址空间

       

   union {

       struct {

           unsigned long prot  :8; /*PROT_READ or PROT_WRITE */

           unsigned long flags :12;/* MAP_SHARED or MAP_PRIVATE */

   

#ifdef __KERNEL__

           unsigned long reserved :8; /* rese
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇3. 海思Hi3519A MPP从入门到精通.. 下一篇使用Minifly打造基于视觉感知的跟..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目