前言
在hi3516a内核启动后的rcS文件中有一句调用:
./load3516a -i -sensor bt1120 -osmem 128 -offline
本文将对load3516a进行解析。
无私分享,从我做起!如有错误,还请指出!
MMZ
Media Memory Zone
在解析load3516a前,需要了解一下mmz的知识,后面会有分配MMZ大小的参数。
如图所示,在海思平台上将内存分为两个部分:os内存和mmz内存。os内存指:由linux操作系统管理的内存;mmz内存:由mmz驱动模块进行管理供媒体业务单独使用的内存,在驱动加载时可以指定该模块管理内存的大小:
insmod mmz.ko mmz=anonymous,0,0x4fa00000,6Manony=1 || report_error
该驱动主要由两个文件组成:media-mem.c和mmz-userdev.c,加载驱动后相应的设备文件:/dev/mmz_userdev,应用层通过打开该设备文件进行ioctl(申请mmz内存、释放mmz内存、重映射mmz内存到内核等)和直接mmap操作,而媒体底层驱动模块则直接调用mmz驱动的导出接口进行相应操作。
load3516a文件
#!/bin/sh
# Useage: ./load3516a [ -r|-i|-a ] [ sensor ]
# -r : rmmod all modules
# -i : insmod all modules
# default : rmmod all moules and then insmod them
#
# imx178 mn34220 imx185 ar0330 ov4689 ov5658 ar0230 imx117 ar0237
####################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
//0x84000000-0x80000000=0x04000000,即64M;
//实际调用传入的参数是-osmem 128,故最终mmz_start=0x88000000
##################################################################
report_error()
{
echo "******* Error: There's something wrong, please check! *****"
exit 1
}
//加载音频所需的模块
insert_audio()
{
insmod acodec.ko
#insmod hidmac.ko
insmod hi3516a_aio.ko
insmod hi3516a_ai.ko
insmod hi3516a_ao.ko
insmod hi3516a_aenc.ko
insmod hi3516a_adec.ko
#insmod extdrv/tlv_320aic31.ko
#insmod extdrv/ak7756.ko
echo "insert audio"
}
// 卸载音频部分的模块
remove_audio()
{
#rmmod tlv_320aic31.ko
#rmmod ak7756.ko
rmmod hi3516a_adec
rmmod hi3516a_aenc
rmmod hi3516a_ao
rmmod hi3516a_ai
rmmod hi3516a_aio
rmmod acodec
echo "remove audio"
}
//加载传感器类型对应的模块,根据传感器类型来配置传感器对接的管脚
insert_sns()
{
case $SNS_TYPE in
ar0130|9m034)
himm 0x200f0050 0x2; # i2c0_scl
himm 0x200f0054 0x2; # i2c0_sda
;;
mt9p006)
himm 0x200f0050 0x2; # i2c0_scl
himm 0x200f0054 0x2; # i2c0_sda
himm 0x2003002c 0xE0007 # sensor unreset, clk 24MHz, VI 250MHz
;;
imx136)
himm 0x200f0050 0x1; # spi0_sclk
himm 0x200f0054 0x1; # spi0_sdo
himm 0x200f0058 0x1; # spi0_sdi
himm 0x200f005c 0x1; # spi0_csn
;;
imx123)
himm 0x200f0050 0x1; # spi0_sclk
himm 0x200f0054 0x1; # spi0_sdo
himm 0x200f0058 0x1; # spi0_sdi
himm 0x200f005c 0x1; # spi0_csn
#himm 0x2003002c 0xb0007 # sensor unreset, clk 27MHz, VI 250MHz
himm 0x2003002c 0x90007 # sensor unreset, clk 37.125MHz, VI 250MHz
himm 0x20030104 0x0; # VI 250MHz
insmod extdrv/sensor_spi.ko
;;
imx178)
himm 0x200f0050 0x2; # i2c0_scl
himm 0x200f0054 0x2; # i2c0_sda
himm 0x2003002c 0xF0007 # sensor unreset, clk 25MHz, VI 250MHz
#himm 0x2003002c 0x90007 # sensor unreset, clk 37.125MHz, VI 250MHz
;;
imx185)
himm 0x200f0050 0x1; # spi0_sclk
himm 0x200f0054 0x1; # spi0_sdo
himm 0x200f0058 0x1; # spi0_sdi
himm 0x200f005c 0x1;