Mstar 9632方案调试杂项临时笔记

简介: Mstar 9632方案调试杂项临时笔记

平台参数

  • 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

这个命令会编译整个系统,并使用完整密钥来加密和签名系统。这样可以提高系统的安全性和可靠性。

线刷固件方法

串口更新固件方法

  1. 需要用到专用的Mstar串口线 USB口插入电脑USB口。
  2. 新电脑需要安装Mstar USB debug tool驱动,下载地址为。
  3. 工具使用SecureCRT。
  4. 将MstarUpgrade.bin拷贝到U盘根目录,USB口插入主板。
  5. 配置SecureCRT,协议Serial,端口号根据电脑识别到为准,波特率115200,流量控制全部取消掉,点击连接,按电脑enter键,会出现打印信息。
  6. 在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采样率无声音

  1. 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 能出声音
  1. VideoView测试
    D:\Project_2022\MediaPlayerAndroid
* https://media.w3.org/2010/05/sintel/trailer.mp4
* http://gcablefile.xxx.net/UploadFiles/Sleep/c7861a752cec4850a868995aa663d9dd.mp4
MediaPlay 2个在线地址都可以出声音
  1. 调试
    可以看到系统默认采样率为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)
  1. 修改
    通常使用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 切换视频源问题

  1. 如果切换成ATV模式,进入LiveTV则是ATV模式(默认情况)。
  2. 如果切换成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=12FREQUENCY 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再设置信号源,先进去再发广播可以解决。

  1. 打开LiveTv:
am start -n com.mediatek.wwtv.tvcenter/.nav.TurnkeyUiMainActivity
  1. 设置信号源:
am broadcast -a com.mediatek.select.source --es "com.mediatek.select.sourcename" "HDMI1"
  1. 发送广播切换至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/

  1. 修改字段内容
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
  1. 更换引用屏参文件
sed "s/UD_VB1_8LANE_CSOT_URSA/UD_VB1_8LANE_VRR/g" -i /vendor/config/model/Customer_1.ini

修改Boot Logo

  1. 将bootlogo.jpg拷贝到U盘中
cp /mnt/media_rw/.../bootlogo.jpg /vendor/tvconfig/bootlogo.jpg
  1. 重启并设置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无声音问题测试

  1. 启动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
  1. 插入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口无作用问题调试

  1. 检查电压是否正常
  2. 检查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

注意:regpin ID映射可参考mstar2\hal\m7332\gpio\mhal_gpio.c文件。

相关文章
|
6月前
|
Linux 编译器 程序员
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
606 0
|
4月前
|
存储 缓存 Serverless
函数计算操作报错合集之安装插件时遇到了空间不足的错误,该如何解决
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
5月前
|
C++
spdlog 日志库部分源码说明——日志格式设定,DIY你自己喜欢的调试信息,你能调试的远比你想象的还要丰富
spdlog 日志库部分源码说明——日志格式设定,DIY你自己喜欢的调试信息,你能调试的远比你想象的还要丰富
294 6
|
小程序 开发工具 开发者
小程序发布注意事项
小程序发布注意事项
89 0
|
NoSQL Java 数据库
基于C#的ArcEngine二次开发40:如何删除临时GDB文件
基于C#的ArcEngine二次开发40:如何删除临时GDB文件
|
C++
VS平台的基本设置以及相关报错问题解决方法
在刚开始学习编程后,期间总会遇到问题,以前都是记录下来没有整理。现在积少成多,也乘着有空就在这里给整理一下。
165 0
|
Linux Android开发
【Android 逆向】代码调试器开发 ( 代码调试器功能简介 | 设置断点 | 读写内存 | 读写寄存器 | 恢复运行 | Attach 进程 )
【Android 逆向】代码调试器开发 ( 代码调试器功能简介 | 设置断点 | 读写内存 | 读写寄存器 | 恢复运行 | Attach 进程 )
209 0