mtk平台串口使用
preloader
alps\vendor\mediatek\proprietary\bootable\bootloader\preloader\custom\xxx_lwctg65_64\cust_bldr.mak
CFG_UART_LOG :=UART1
CFG_UART_META :=UART1
log输出串口通道配置
lk
alps\vendor\mediatek\proprietary\bootable\bootloader\lk\app\mt_boot\mt_boot.c
case BUILD_TYPE_USER:
if (((g_boot_mode == META_BOOT) && is_meta_log_disable &&
#ifdef LOG_STORE_SUPPORT
(is_meta_log_disable() == 0)) || g_boot_arg->log_dynamic_switch)
#else
(is_meta_log_disable() == 0)))
#endif
cmdline_append("printk.disable_uart=0");
else
cmdline_append("printk.disable_uart=1");
break;
case BUILD_TYPE_USERDEBUG:
if ((g_boot_mode == META_BOOT) && is_meta_log_disable &&
#ifdef LOG_STORE_SUPPORT
(is_meta_log_disable() == 1) && (g_boot_arg->log_dynamic_switch == 0))
#else
(is_meta_log_disable() == 1))
#endif
cmdline_append("printk.disable_uart=1 slub_debug=O");
#ifdef LOG_STORE_SUPPORT
else if (boot_ftrace && g_boot_arg->log_dynamic_switch == 0)
#else
else if (boot_ftrace)
#endif
cmdline_append("printk.disable_uart=1 slub_debug=-");
else
cmdline_append("printk.disable_uart=0");//修改为1,切到kernel的时候可以关闭log输出,显示console,用来输入命令
break;
case BUILD_TYPE_ENG:
if ((g_boot_mode == META_BOOT) && is_meta_log_disable &&
(is_meta_log_disable() == 1))
cmdline_append("printk.disable_uart=1 slub_debug=O");
else
cmdline_append("printk.disable_uart=0 ddebug_query=\"file *mediatek* +p ; file *gpu* =_\"");
break;
kernel
alps\kernel-4.9\kernel\printk\printk.c
void mt_disable_uart(void)
{
//printk_disable_uart = 0;
//return;//默认开机动画结束后关闭kernel log输出,改为0,让log一直输出,调试用
/* uart print not always enable */
if ((mt_need_uart_console != 1) && (printk_disable_uart != 2))
printk_disable_uart = 1;
}
alps\kernel-4.9\arch\arm64\boot\dts\mediatek\mt6765.dts
chosen: chosen {
bootargs = "console=tty0 console=ttyS0,921600n1 vmalloc=400M \
slub_debug=OFZPU page_owner=on \
swiotlb=noforce androidboot.hardware=mt6765 \
maxcpus=8 loop.max_part=7 \
firmware_class.path=/vendor/firmware";
ttyS0对应preloader里 UART1
device
//打开uart控制台
persist.vendor.uartconsole.enable=1
init.rc
alps\system\core\rootdir\init.rc
service console /system/bin/sh
class core
console
#disabled
user root #默认是shell
group shell log readproc
seclabel u:r:shell:s0
setenv HOSTNAME console
on property:ro.debuggable=1 # eng 和userdebug这个属性为1
# Give writes to anyone for the trace folder on debug builds.
# The folder is used to store method traces.
chmod 0773 /data/misc/trace
# Give reads to anyone for the window trace folder on debug builds.
chmod 0775 /data/misc/wmtrace
start console
参考faq
-
Android P/Q uart log进lunch 关了,如何打开
[SOLUTION]
-
eng版本下如果有出现log 暂停,可以在log tool(例如:ttermpro)输入任意字符,触发log 继续。
-
userdebug版本 :
(1) 通过下cmd 打开: adb shell setprop persist.vendor.uartconsole.enable 1 (reboot 之后uart log 仍然可以输出)
(2) 也可以通过修改Kernel文件: alps/kernel-xx/kernel/printk.c : 修改函数mt_disable_uart()
printk_disable_uart=1为0, 这个条件在mt_enable_uart()和_call_console_drivers()都使用
-
user 版本: 进入kernel 之后默认uart log 停止
(1) modify mt_boot.c to enable kernel printk: 修改cmdline中'printk.disable_uart=0'。 path: vendor\mediatek\proprietary\bootable\bootloader\lk\app\mt_boot\mt_boot.c: boot_linux_fdt() (2) cmdline中如果含有‘loglevel=0' ,请修改为 ‘loglevel=8' (check dts里面配置)
-
-
通过串口进入敲 shell 命令的方法
[SOLUTION]
Uart Tx Rx 在DCT中分别配制成 UTXD URXD模式。
Tx Rx 通过串口线和PC连接。确认Uart 能吐 log,此时PC串口软件(如超级终端)中敲回车,会出现输入提示符,可以敲 shell 命令了。
如不能输入, 请检查如下命令的输出:
-
adb shell cat /proc/cmdline 可以看到Uart 输入输出的端口。
-
adb shell cat /init.rc 确认有如下内容:
service console /system/bin/sh
class core console disabled user root group log on property:ro.debuggable=1 start console
-
adb shell getprop ro.debuggable
确认其值为 1
-
-
Android L 版本后uart console 没有root 权限的说明
在Android L 后,Google 增强了Android 系统安全性, 强制性开启了SELinux. 去除了uart console 的root 权限. 如果你需要uart console , 可以临时调整.
(1). system/core/rootdir/init.rc
service console /system/bin/sh
class core console disabled user shell seclabel u:r:shell:s0
删除后面的user shell 这行以及 seclabel u:r:shell:s0 (M 版本后不能删除)这行.
注意的是: M 版本后, seclabel u:r:shell:s0 这行不能删除, 否则console service 无法启动, 其原因是: Google 增强了这块的SELinux约束,通过使用neverallow init { file_type fs_type}:file execure_no_trans;严格限制了init 启动service 都必须进行domain 切换,否则service 无法启动.
(2). 将SELinux 设置成permissve mode, 不然你还拿不到完整的root 权限 参考FAQ:
FAQ11484 [SELinux] 如何设置确认selinux 模式
https://online.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ11484