平台参数
- Chip: m7332
- OS Type: linux 4.9_64bit
- DVB Type: DVBC
- BOARD: BD_MT165B_10AT_19055_4K
- MI_PLATFORM_DIR: vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/build/…/platform/m7332/linux
- MI_PLATFORM_BOARD_DIR: vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/build/…/platform/m7332/linux/board_cfg
- MI_CONFIG_PATH: vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/build/…/platform/m7332/linux/configurations
编译命令
1. 清理
make -j32 RLS_CUSTOM_BUILD=true mtk_clean 2>&1 | tee make_clean.log
这个命令会清除之前的编译结果,保证每次编译都是从头开始的。
2. 编译全部
source build/envsetup.sh lunch m7332-userdebug make -j32 RLS_CUSTOM_BUILD=true mtk_build 2>&1 | tee make_build.log
这个命令会编译整个系统,包括内核、驱动、应用等。编译结果会输出到make_build.log文件中,方便查看和调试。
3. 编译OTA升级包
make -j32 RLS_CUSTOM_BUILD=true ENABLE_OTA=true mtk_build 2>&1 | tee makeota.log
这个命令会编译OTA升级包,用于在线更新系统。编译结果会输出到makeota.log文件中,方便查看和调试。
4. 编译全部 & 完整密钥
source build/envsetup.sh && lunch m7332-userdebug && make ODB=true-j32 USE_EFUSE_FULL_KEY=true mtk_build 2>&1|tee mtk_build.log
这个命令会编译整个系统,并使用完整密钥来加密和签名系统。这样可以提高系统的安全性和可靠性。
线刷固件方法
串口更新固件方法
- 需要用到专用的Mstar串口线 USB口插入电脑USB口。
- 新电脑需要安装Mstar USB debug tool驱动,下载地址为。
- 工具使用SecureCRT。
- 将MstarUpgrade.bin拷贝到U盘根目录,USB口插入主板。
- 配置SecureCRT,协议Serial,端口号根据电脑识别到为准,波特率115200,流量控制全部取消掉,点击连接,按电脑enter键,会出现打印信息。
- 在SecureCRT输入 reboot 后,一直按电脑enter,出现m7332#字样,再输入custar进行刷机,出现以下字样就说明刷机完成,重新给机器上电即可。
Dialog 满屏问题
上面效果是320的。调节density 240效果非常漂亮,临时改的话wm density 240
。
// 代码要增加获取屏宽高设置属性才能满屏 // 显示效果与density有关,可以调节wm density xx,可以修改成默认值 WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); lp.width = (int)(display.getWidth()); // 设置宽度 lp.height = (int)(display.getHeight()); // 设置高度 dialog.getWindow().setAttributes(lp); dialog.getWindow().setContentView(R.layout.dialog_demo);
设置视频区域大小16:9的显示效果
private void setVideoParams(MediaPlayer mp, boolean isLand) { ViewGroup.LayoutParams pa_rl = rl_video.getLayoutParams(); ViewGroup.LayoutParams pa_sv = sv_video.getLayoutParams(); // int s_width=getWindowManager().getDefaultDisplay().getWidth(); float s_width = getResources().getDisplayMetrics().widthPixels; float s_height = getResources().getDisplayMetrics().widthPixels / 16f * 9f; getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); if (isLand) { s_height = getResources().getDisplayMetrics().heightPixels; getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); } pa_rl.width = (int) s_width; pa_rl.height = (int) s_height; float v_width = mp.getVideoWidth(); float v_height = mp.getVideoHeight(); float s_por = s_width / s_height; float v_por = v_width / v_height; if (v_por < s_por) { // 16:12 16:9 pa_sv.height = (int) s_height; pa_sv.width = (int) (s_height * v_por); } else {// 19:9 16:9 pa_sv.height = (int) (s_width / v_por); pa_sv.width = (int) s_width; } rl_video.setLayoutParams(pa_rl); sv_video.setLayoutParams(pa_sv); }
VideoView在线播放44.1K采样率无声音
- Mediaplay测试
D:\Project_2022\yjhMediaPlayer
* https://media.w3.org/2010/05/sintel/trailer.mp4 * http://gcablefile.xxx.net/UploadFiles/Sleep/c7861a752cec4850a868995aa663d9dd.mp4 VideoView 只有https://media.w3.org/2010/05/sintel/trailer.mp4 能出声音
- VideoView测试
D:\Project_2022\MediaPlayerAndroid
* https://media.w3.org/2010/05/sintel/trailer.mp4 * http://gcablefile.xxx.net/UploadFiles/Sleep/c7861a752cec4850a868995aa663d9dd.mp4 MediaPlay 2个在线地址都可以出声音
- 调试
可以看到系统默认采样率为48k ,
adb shell adb root adb remount adb pull /vendor/etc/audio_policy_configuration.xml . #------------------------------------------------------------- # .... <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> # .... #-------------------------------------------------------------
把以上的2个mp4链接下载下来看 , 初步判断这就是为什么trailer.mp4能在mediaplay和videoview播放的原因。
把另外一个不能播放mp4转成48k , 放进app raw文件夹 就可以出声音了。
val uri = Uri.parse("android.resource://" + this.packageName+ "/raw/" + R.raw.video1) videoView = findViewById<VideoView>(R.id.videoView) videoView.setVideoURI(uri)
- 修改
通常使用android系统播放都会是一个固定的采样率输出,无论源是什么采样率,AudioFlinger都会将其重采样成同一个采样率的数据输出,一般平台都默认是44.1K或者48K,如果要修改成为其他采样率也比较简单,但需要注意几个地方。
我手动改成44k , 重新push进去系统 sync重启再测videoview还是没声音。
接着我准备把系统这个文件默认改成44k ,
#------------------------------------------------------------- # .... <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="44100" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> # .... #-------------------------------------------------------------
修改android系统默认采样率_这歌声无聊可是辉煌的博客-CSDN博客_安卓手机音频采样率自动切换
Live Tv 切换视频源问题
- 如果切换成ATV模式,进入LiveTV则是ATV模式(默认情况)。
- 如果切换成ATV模式,通过广播接口设置信号源,还是ATV模式。
修改PWM占空比
背光亮度控制
背光控制是电视里不可或缺的一项功能,一般客户会将控制背光的选项放在UI里供用户调节。有些客户将背光和Picture Mode挂钩起来,一起调节。当选择Picture Mode时,设置不同的背光值。还有一些客户会根据图像亮度的变化自动调节背光,以便降低功耗(简称DBC)。不论如何实现,这几种方法都会调用Supernova里的函数MSv_Picture:SetBacklight(U32u32 Value),最终会调用函数MDv_PWM_DutyCycle()来调节PWM脚的占空比,然后通过电容滤波,给Panel发送不同的电压值来控制背光的亮度。PWM的参数设置在对应的屏参ini文件中。
比如在FullHD_CMO216H1L01.ini文件中有以下内容:
u32PeriodPWM=0xFFFF; // 代表PWM的周期 u32DutyPWM=Ox7F; // 代表PWM的占空比 u16DivPWM=OxO0; // 代表PWM分频比,默认为0,即没有分频 bPolPWM=O; // O:NON_INVERSE,代表PWM占空比高电平极性 u16MaxPWMvalue=OxFFFF;// 代表PWM的占空比调节范围最大值 u16MinPWMvalue=Ox2000;// 代表PWM的占空比调节范围最小值
PWM的周期、频率符合以下关系:
OSC PERIOD FREQUENCY DIV
其中OSC代表时钟频率,PERIOD代表周期,FREQUENCY代表频率,DIV代表除频。
举例:OSC=12000000
(12MHZ)、DV=12
、FREQUENCY 100HZ
,则PERIOD = 12MHZ/12/100HZ = 10000ns
。
修改示例代码
fusion9$ git diff vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/platform/common/ini/main/panel/UD_VB1_8LANE_CSOT_URSA.ini diff --git a/vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/platform/common/ini/main/panel/UD_VB1_8LANE_CSOT_URSA.ini index 5d0bae2..86910c4 100755 --- a/vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/platform/common/ini/main/panel/UD_VB1_8LANE_CSOT_URSA.ini +++ b/vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/platform/common/ini/main/panel/UD_VB1_8LANE_CSOT_URSA.ini @@ -15,7 +15,7 @@ m_pPanelName = UD_VB1_8LANE; ########################### m_bPanelDither = 0; m_ePanelLinkType = 10;#LINK_LVDS; -m_ePanelLinkExtType = 51;#apiPNL.h -> APIPNL_LINK_EXT_TYPE +m_ePanelLinkExtType = 101;#apiPNL.h -> APIPNL_LINK_EXT_TYPE m_bPanelDualPort = 0; m_bPanelSwapPort = 0;#1^PANEL_CONNECTOR_SWAP_PORT; @@ -83,7 +83,7 @@ m_wSpreadSpectrumSpan = 0x00C0; m_ucDimmingCtl = 0x6D; m_ucMaxPWMVal = 0xFF; -m_ucMinPWMVal = 0x20; +m_ucMinPWMVal = 0x7F; m_bPanelDeinterMode = 0; @@ -123,11 +123,11 @@ m_bPanelNoiseDith = 1; ########################### u32PeriodPWM = 0xFFFF; -u32DutyPWM = 0x3FFF; +u32DutyPWM = 0x7FFF; u16DivPWM = 0x00; bPolPWM = 0; #0:NON_INVERSE u16MaxPWMvalue = 0xFFFF; -u16MinPWMvalue = 0x2000; +u16MinPWMvalue = 0x7F00; ########################### # 3D video flag. #
Live Tv切换视频源问题解决办法
解决办法:
先打开LiveTv再设置信号源,先进去再发广播可以解决。
- 打开LiveTv:
am start -n com.mediatek.wwtv.tvcenter/.nav.TurnkeyUiMainActivity
- 设置信号源:
am broadcast -a com.mediatek.select.source --es "com.mediatek.select.sourcename" "HDMI1"
- 发送广播切换至HDMI1:
am broadcast -a com.mediatek.select.HDMI1
adb打开Live TV
启动HDMI和Live TV
am broadcast -a com.mediatek.select.source --es "com.mediatek.select.sourcename" "HDMI1" am start -n com.mediatek.wwtv.tvcenter/.nav.TurnkeyUiMainActivity am broadcast -a com.mediatek.select.HDMI1
打开输入面板
am start -n com.mediatek.wwtv.tvcenter/.nav.inputpanel.InputsPanelActivity
打开调谐器设置
am start -n com.mediatek.tvinput/.tuner.TunerInputServiceSetup
修改屏参
屏参文件路径:/vendor/tvconfig/config/panel/
- 修改字段内容
sed "s/m_bPanelDualPort = 0;/m_bPanelDualPort = 1;/g" -i /vendor/tvconfig/config/panel/UD_VB1_8LANE_CSOT_URSA.ini sed "s/m_ePanelLinkExtType = 101;/m_ePanelLinkExtType = 51;/g" -i /vendor/tvconfig/config/panel/UD_VB1_8LANE_CSOT_URSA.ini sed "s/m_ePanelLinkExtType = 51;/m_ePanelLinkExtType = 101;/g" -i /vendor/tvconfig/config/panel/UD_VB1_8LANE_CSOT_URSA.ini
- 更换引用屏参文件
sed "s/UD_VB1_8LANE_CSOT_URSA/UD_VB1_8LANE_VRR/g" -i /vendor/config/model/Customer_1.ini
修改Boot Logo
- 将bootlogo.jpg拷贝到U盘中
cp /mnt/media_rw/.../bootlogo.jpg /vendor/tvconfig/bootlogo.jpg
- 重启并设置Boot Logo
setenv BootlogoFile /tvconfig/bootlogo.jpg save reset
视频播放泛白问题
在编译时启用USE_EFUSE_FULL_KEY=true
。
安装HDCP Key
HDCP 2.2 Key
adb root adb remount adb push 1_hdcp2_key.bin /vendor/tvcertificate/HDCP2/hdcp2_key_22.bin adb shell chmod 644 /vendor/tvcertificate/HDCP2/hdcp2_key_22.bin /vendor/bin/intertaca_manual 8 1
HDCP 1.4 Key
adb root adb remount adb push 1_hdcp_key.bin /vendor/tvcertificate/HDCP14/hdcp_key.bin adb shell chmod 644 /vendor/tvcertificate/HDCP14/hdcp_key.bin /vendor/bin/intertaca_manual 21 0
HDMI IN无声音问题测试
- 启动HDMI IN
adb root adb remount adb shell setprop vendor.mtk.auto_test 1 am broadcast -a com.mediatek.select.HDMI1 am start -n com.mediatek.wwtv.tvcenter/.nav.TurnkeyUiMainActivity
- 插入HDMI IN信号并播放视频
修改以下代码:
vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/modules/aout/src/mi_aout.c
AOUT_CONNECT_STRATEGY_DONE: // Mute for depop when change input MUX memset(&stMultiMuteParam, 0, sizeof(stMultiMuteParam)); stMultiMuteParam.pszMuteName = (MI_U8*)"MI_AOUT_AudioConnectInputSetChannel"; - stMultiMuteParam.bMute = TRUE; + stMultiMuteParam.bMute = FALSE; stMultiMuteParam.u32AutoUnmuteTimer = MI_AOUT_INPUT_POP_MUTE_DELAY_MS; eErrCode = _MI_AOUT_SetInputChannelMultiMute(u8PathIdx, &stMultiMuteParam); if(eErrCode != MI_OK)
vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/modules/aextin/src/mi_aextin.c
static void _MI_AEXTIN_CheckHdmiAudioStatus(void) { memset(&stMuteParams, 0, sizeof(MI_AOUT_MultiMuteParams_t)); stMuteParams.pszMuteName = (MI_U8*)"HdmiPcmStatusChangeMute_AEXTIN"; - stMuteParams.bMute = TRUE; + stMuteParams.bMute = FALSE; stMuteParams.u32AutoUnmuteTimer = MI_AEXTIN_DEPOP_MUTE_TIME; if(mi_aout_SetInputChannelMultiMute(eChannel, &stMuteParams) != MI_OK) {
vendor/mediatek/proprietary_tv/apollo/target/open/aud2/audio/aud_aout_handler.h /home/work2/mediatek/fusion4/vendor/mediatek/proprietary_tv/apollo/target/open/aud2/audio/aud_avsync.h /home/work2/mediatek/fusion4/vendor/mediatek/proprietary_tv/apollo/target/open/aud2/audio/aud_cfg.h /home/work2/mediatek/fusion4/vendor/mediatek/proprietary_tv/apollo/target/open/aud2/audio/aud_detect.h /home/work2/mediatek/fusion4/vendor/mediatek/proprietary_tv/apollo/target/open/aud2/audio/aud_dmic.h /home/work2/mediatek/fusion4/vendor/mediatek/proprietary_tv/apollo/target/open/aud2/audio/aud_drv.h /home/work2/mediatek/fusion4/vendor/mediatek/proprietary_tv/apollo/target/open/aud2/audio/aud_dsp_cfg.h /home/work2/mediatek/fusion4/vendor/mediatek/proprietary_tv/apollo/target/open/aud2/audio/aud_hdmi.h vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/OUT/mi_include/mi_disp_impl_HDMI.h vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/modules/aout/src/mi_aout.c vendor/mediatek/proprietary_tv/apollo/linux_core/misdk/mi/mi/modules/aextin/src/mi_aextin.c
目前跟到的情况是,初始化input source的时候就mute了,拔插不走这个流程,重新读到hdmi盒子信号,才会走,而且只会走一次,后面重启都不会走。
现在的情况就是每次刷机,第一次都没有声音,必须重启一次盒子,才有声音,以后都不用重启了。改了一版检测到信号默认不mute的。
HDMI IN声音小无法调节问题调试
通过以下接口获取和
设置音量:
int Volume = 0; int ret = MtkTvFApiResultTypeBase.MTKTV_FAPI_RET_FAIL; MtkTvFApiAudioTypes.EnumAoutPath ePath = MtkTvFApiAudioTypes.EnumAoutPath.E_FAPI_AUD_PATH_ALL; ret = MtkTvFApiAudio.getInstance().setAudioVolume(ePath, 100); Volume = MtkTvFApiAudio.getInstance().getAudioVolume(ePath);
USB0口无作用问题调试
- 检查电压是否正常
- 检查USB0是否被识别为调试口,需要关闭USB调试模式后重启
GPIO设置调节
代码接口方式
MtkTvFApiPeripheral.getInstance().controlGpio(MtkTvFApiGpioID.E_MI_GPIO_NAME_MUTE, MtkTvFApiGpioHighLow.E_GPIO_OUTPUT_LOW); int actualHighLow = MtkTvFApiPeripheral.getInstance().getGpioStatus(MtkTvFApiGpioID.E_MI_GPIO_NAME_MUTE);
adb方式
cat /sys/kernel/debug/gpio cat /sys/devices/gpiochip0/gpio/gpio16/direction cat /sys/devices/gpiochip0/gpio/gpio16/active_low cat /sys/devices/gpiochip0/gpio/gpio16/value
注意:reg
和pin ID
映射可参考mstar2\hal\m7332\gpio\mhal_gpio.c
文件。