hi3516 mmz


原文链接: hi3516 mmz

海思DDR内存空间分配

0x8000_0000 - 0xFFFF_FFFF DDR 存储空间 s2GB
0x9000_0000 // 256M
0xA000_0000 // 512M // MMZ
0xB000_0000
0xC000_0000 // 1G

0xD000_0000
0xE000_0000
0xF000_0000
0xFFFF_FFFF // 2G

HI3516DV300 1G == OS.512M + MMZ.512M

bootargs=mem=512M console=ttyAMA0,115200 root=/dev/mtdblock2 rw rootfstype=jffs2 mtdparts=hi_sfc:1024K(Uboot),3072K(kernel),28672K(rootfs)
bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000

###################Variables Definition##########################

SNS_TYPE0=imx327; # sensor type
SNS_TYPE1=NULL; # sensor type
YUV_TYPE0=0; # 0 -- raw, 1 -- bt1120/DC, 2 --bt656
CHIP_TYPE=hi3516dv300; # chip type
#DDR start:0x80000000, kernel start:0x80000000, OS(128M); MMZ start:0x88000000
mem_total=1024 # 512M, total mem
mem_start=0x80000000 # phy mem start
os_mem_size=512 # 128M, os mem
mmz_start=0x88000000; # mmz start addr
mmz_size=512M; # 384M, mmz size
##################################################################

HI35xx 系列os及mmz内存设置 128+384 =512M

  我的DDR是512M的,256M分配给了系统使用,256M分配给了多媒体mmz。

  1. 系统内存设置:
        系统内存分配,也就是分配给linux系统使用的,也包括用户的应用程序,这部分的参数设置是在uboot中完成,然后uboot传递给kernel。如下命令,mem设置的就是系统内存。

    setenv bootargs 'mem=256M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),8M(rootfs),4M(app&data),4M(data),2M(parameter),8M(updatefs)'

mem=128M console=ttyAMA0,115200 coherent_pool=2M root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),27M(rootfs)

  1. 多媒体内存设置:
       多媒体内存是在海思平台用来编码解码操作是使用的内存,他的设置是在文件系统 /lib/modules/driver_ko 目录下的load文件中完成。
    vi load3516dv300
    SNS_TYPE0=imx327; # sensor type
    SNS_TYPE1=NULL; # sensor type
    YUV_TYPE0=0; # 0 -- raw, 1 -- bt1120/DC, 2 --bt656
    CHIP_TYPE=hi3516dv300; # chip type
    #DDR start:0x80000000, kernel start:0x80000000, OS(128M); MMZ start:0x88000000
    mem_total=512 # 512M, total mem
    mem_start=0x80000000 # phy mem start
    os_mem_size=128 # 128M, os mem
    mmz_start=0x88000000; # mmz start addr
    mmz_size=384M; # 384M, mmz size

insmod hi_osal.ko anony=1 mmz_allocator=hisi mmz=anonymous,0,$mmz_start,$mmz_size || report_error

##################################################################
    mmz_size 设置的就是多媒体内存。这里需要多注意一点,系统内存os_mem_size在这里是不能设置成功的,需要在到boot里面设置。系统内存+多媒体内存=物理内存。设置小了浪费内存,设置大了易出现异常。
————————————————
版权声明:本文为CSDN博主「li_wen01」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/li_wen01/article/details/86547859

主控型号:3518e 传感器:ov9712
以挂载形式 运行sample中venc 各个例程实现拍照、h26视频流没问题
现在想要使用在线调试工具查看isp参数
在运行load3518e时出现报错
insmod: can't insert 'mmz.ko': File exists
******* Error: There's something wrong, please check! *****

根据论坛以及sdk中的txt文本的说法 3518e的内存有限 需要重新分配内存 来执行load3518
查看了一些资料:
1) 以容量为128MBytes的DDR内存为例,以下为根据本文档和SDK默认配置得到的内存管理示意图:

-----|-------|  0x80000000   # Memory managed by OS.              
 64M  | OS    |                                                
      |       |                                                
 -----|-------|  0x84000000   # Memory managed by MMZ block anonymous.         
 64M  | MMZ   |                                                
      |       |                                                
 -----|-------|  0x88000000   # End of DDR.         

注意:

    (1)用户在配置启动参数时需要设置OS的管理内存为64M,“setenv bootargs 'mem=64M ...”。         
     (2)系统启动后,配置load3518的脚本中mmz的管理内存为64M,“insmod mmz.ko mmz=anonymous,0,0x84000000,64M”。   

目前理解:
对于我使用的64M内存的板子来说 初始配置为 os内存(系统内存)32M mmz内存为32M
现在需要修改为 os内存38m mmz内存26m
按照sdk中说法 需要进行如下修改:

1、调整OS内存和MMZ内存

1)推荐修改OS内存为38M:OS内存大小可通过bootargs进行配置
    所有DDR内存中,一部分由操作系统管理,称为OS内存;另一部分由MMZ模块管理,供媒体业务单独使用,称为MMZ内存。工具需要调整这两块内存大小。
配置方式:单板上电后,敲任意键进入u-boot,设置启动参数
setenv bootargs 'mem=38M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs)'
setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000'
save
reset

2)推荐修改MMZ内存为26M
修改load3518e脚本,替换
    insmod mmz.ko mmz=anonymous,0,0x82000000,32M anony=1 || report_error   #for 3518E use
为:insmod mmz.ko mmz=anonymous,0,0x82600000,26M anony=1 || report_error   #for 3518E use

2、打开板端工具文件根目录下的configs文件夹并找到对应sensor的配置,推荐修改其【VbCnt】字段的值为8

如:
[vb_conf]
VbCnt=8

3、打开板端工具文件根目录下的configs文件夹并找到对应sensor的配置,推荐修改其【TargetFrmRate】字段的值为25

如:
[venc]
TargetFrmRate=25

其中第一步中的sf read就有些看不懂 内存起始地址为0x80 os内存范围就应该是0x80-0x826 mmz内存为0x826-0x84 为何sf read语句中 将内核加载到了后半32M的内存空间去了?
看各种资料中 都没有说明sf read是否需要随着前面的men参数修改 不需要么?
而第二步中 只需要修改0x82 和32m这两个参数么?

二、内存使用

1、DDR内存管理说明
1)所有DDR内存中,一部分由操作系统管理,称为OS内存;另一部分由MMZ模块管理,供媒体业务单独使用,称为MMZ内存。
2)OS内存起始地址为0x80000000,内存大小可通过bootargs进行配置,例如第三章中的setenv bootargs 'mem=64M ... ',表示分配给操作系统内存为64M,您可以根据实际情况进行调整。

可使用cat /proc/meminfo 查看内存信息

/mnt/mpp # cat /proc/meminfo
MemTotal: 124164 kB
MemFree: 107540 kB
Buffers: 0 kB
Cached: 5992 kB
SwapCached: 0 kB
Active: 1484 kB
Inactive: 5116 kB
Active(anon): 612 kB
Inactive(anon): 0 kB
Active(file): 872 kB
Inactive(file): 5116 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 632 kB
Mapped: 652 kB
Shmem: 4 kB
Slab: 5212 kB
SReclaimable: 780 kB
SUnreclaim: 4432 kB
KernelStack: 336 kB
PageTables: 124 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 62080 kB
Committed_AS: 1784 kB
VmallocTotal: 892928 kB
VmallocUsed: 10588 kB
VmallocChunk: 870824 kB
使用free查看内存使用情况

/mnt/mpp # free

         total         used         free       shared      buffers

Mem: 124164 16632 107532 0 0
-/+ buffers: 16632 107532
Swap: 0 0 0
扩展:在/proc/meminfo 显示的 MemTotal 为什么不等于cmdline 里的配置 mem=xxxM?

因为内核在启动时 reserved 了一些内存,如内核的代码段, pmem 里 reserved 的内存。我们看到的 MemTotal 的大小已经减去了内核早期保留的内存块。

3)MMZ内存由MMZ内核模块管理(mpp/ko_hi35xx目录下的mmz.ko),加载mmz模块时,通过模块参数指定其起始地址及大小,load脚本中根据osmem大小来进行计算,例如:
    ./load3516a -a -sensor mn34220 -osmem 64
您也可以通过修改mpp/ko目录下load3516a脚本中的mmz模块参数,来修改其起始地址和总大小。
4)请注意MMZ内存地址范围不能与OS内存重叠。

load3516a脚本中的mmz模块参数:

####################Variables Definition##########################

SNS_TYPE=mn34220 # sensor type

mem_total=512; # 512M, total mem
mem_start=0x80000000; # phy mem start

os_mem_size=64; # 64M, os mem
mmz_start=0x84000000; # mmz start addr
mmz_size=128M; # 128M, mmz size

##################################################################
注意:
(1)用户在配置启动参数时需要设置OS的管理内存为64M,“setenv bootargs 'mem=64M ...”。 
(2)系统启动后,配置load3516a脚本中指定总内存为512(mem_total=512),加载时指定osmem为64(-osmem 64),则MMZ管理的内存为448M。(如果未指定按照上面分配的)    
(3)如果有特殊应用,可以自行修改load3516a脚本,进行mmz区域划分,如“insmod mmz.ko mmz=anonymous,0,0x84000000,442M:jpeg,0,0x9fa00000,5M anony=1”。

“mmz =” 用来定义 media-mem 的分配池,格式为:
mmz=<name>,<gfp>,<phys_start_addr>,<size>:<name>,<gfp>,<phys_start_addr>
:字符串,分配池的名字,例如 ddr。
:数字,表示分配池的属性,主要用于在有多种内存的单板上指定 MMZ 位于哪种内存上(比如 DDR、 SDRAM、 DDR2、 DDR3),为 0 表示自动,目前一般都直接将该值置为 0。
: 分配池的物理起始位置, 16 进制数, 如 0x86000000; 注意 MMZ的内存区域不能与 linux 内核的内存区域重叠, MMZ 的物理起始位置就要从“内存起始地址+linux 内核使用的内存大小”开始。 在 Hi353x 平台上,内存的起始地址固定为 0x80000000;举例说明如下:假设单板的 bootargs 为 'mem=96M console=ttyAMA0,115200 root=xxxx', 这表示 linux 内核将使用 96M 的内存空间,那么 MMZ 的起始地址应该配置为 0x80000000+96M = 0x86000000。
:分配池的大小,可以使用如下两种表示方式: 0x100000、 1M。 注意分配池的大小加上 linux 内核的内存大小不能超过物理内存的实际大小。 比如单板上的物理内存是 256M 大小, linux 内核使用了 96M, MMZ 就只能使用最多 256-96=160M。
以上每一个参数都是必需的,参数之间用“ ,”号分隔,可以指定多个分配池,之间用“:”号分隔。 例如: modprobe mmz mmz =ddr,0, 0x86000000,64M:vdec,0, 0x8A000000, 64M。
————————————————
版权声明:本文为CSDN博主「聚优致成」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29350001/article/details/52945124

一、Hi3518E_SDK_V1.0.3.0.tgz解压后默认sensor为ar0230,为了适配ov9712,需要做如下修改:

1、mpp/ko/load3518e中:

原来配置如下:

SNS_TYPE=ar0230 # sensor type

mem_total=64; # 64M, total mem
mem_start=0x80000000; # phy mem start

os_mem_size=32; # 32M, os mem
mmz_start=0x82000000; # mmz start addr
mmz_size=32M; # 32M, mmz size

修改后配置如下:

SNS_TYPE=ov9712 # sensor type

mem_total=64; # 64M, total mem
mem_start=0x80000000; # phy mem start

os_mem_size=32; # 32M, os mem
mmz_start=0x82000000; # mmz start addr
mmz_size=32M; # 32M, mmz size

2、mpp/sample/Makefile.param中

原来配置如下:

CHIP_ID ?= CHIP_HI3516C_V200
#CHIP_ID ?= CHIP_HI3518E_V200
#CHIP_ID ?= CHIP_HI3518E_V201

################# select sensor type for your sample ####################

#SENSOR_TYPE ?= APTINA_9M034_DC_720P_30FPS

SENSOR_TYPE ?= SONY_IMX222_DC_1080P_30FPS
#SENSOR_TYPE ?= SONY_IMX222_DC_720P_30FPS

#SENSOR_TYPE ?= APTINA_AR0130_DC_720P_30FPS

#SENSOR_TYPE ?= PANASONIC_MN34222_MIPI_1080P_30FPS

#SENSOR_TYPE ?= APTINA_AR0230_HISPI_1080P_30FPS

#SENSOR_TYPE ?= OMNIVISION_OV9712_DC_720P_30FPS
#SENSOR_TYPE ?= OMNIVISION_OV9732_DC_720P_30FPS
#SENSOR_TYPE ?= OMNIVISION_OV9750_MIPI_720P_30FPS
#SENSOR_TYPE ?= OMNIVISION_OV9752_MIPI_720P_30FPS

#SENSOR_TYPE ?= OMNIVISION_OV2718_MIPI_1080P_25FPS

修改后配置如下:

#CHIP_ID ?= CHIP_HI3516C_V200
CHIP_ID ?= CHIP_HI3518E_V200
#CHIP_ID ?= CHIP_HI3518E_V201

################# select sensor type for your sample ####################

#SENSOR_TYPE ?= APTINA_9M034_DC_720P_30FPS

#SENSOR_TYPE ?= SONY_IMX222_DC_1080P_30FPS
#SENSOR_TYPE ?= SONY_IMX222_DC_720P_30FPS

#SENSOR_TYPE ?= APTINA_AR0130_DC_720P_30FPS

#SENSOR_TYPE ?= PANASONIC_MN34222_MIPI_1080P_30FPS

#SENSOR_TYPE ?= APTINA_AR0230_HISPI_1080P_30FPS

SENSOR_TYPE ?= OMNIVISION_OV9712_DC_720P_30FPS

#SENSOR_TYPE ?= OMNIVISION_OV9732_DC_720P_30FPS
#SENSOR_TYPE ?= OMNIVISION_OV9750_MIPI_720P_30FPS
#SENSOR_TYPE ?= OMNIVISION_OV9752_MIPI_720P_30FPS

#SENSOR_TYPE ?= OMNIVISION_OV2718_MIPI_1080P_25FPS

二、运行load3518e加载mpp所需的ko

mount -t nfs 192.168.1.6:/nfsroot/ /nfsroot -o nolock

cd /nfsroot/hi3518e/mpp/ko
./load3518e -a -sensor ov9712 -osmem 32 -total 64

加载mmz.ko出错、OS和MMZ内存重叠了。错误原因:

设置boot启动参数时如下

setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs)'
setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000'
sa

其中 mem=64M,为OS内存,DDR总内存64M,而1中分配OS内存32M,MMZ内存32M。

修改uboot启动参数如下:

setenv bootargs 'mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs)'
setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000'
sa

重启后再次运行,可以成功加载load3518e。

三、编译mpp/sample/venc/sample_venc并运行

Linux主机端:make

板卡端:

cd ../sample/venc

./sample_venc 0

起初会报错 system init failed,调用SAMPLE_COMM_SYS_Init进行SAMPLE_COMM_SYS_Init出错,追溯下去是HI_MPI_VB_Init出错,返回值是0xA002800C,分配内存失败,原因是没有进行一中2的修改,默认CHIP_HI3516C_V200的g_u32BlkCnt是10,所以VB分配出错。

可以成功获取h264码流文件,使用播放器播放可以出画面,只是白色区域偏粉,原因VI掩码设置与硬件不匹配,硬件使用的是D0~D9,修改如下:

VI_DEV_ATTR_S DEV_ATTR_OV9732_DC_720P_BASE ={
...
{0x03FF0000, 0x0},//{0xFFC0000, 0x0},//D2~D11
...
};

到此,可以成功的运行ov9712的sample_venc demo。

`