mtk 串列埠讀取uart log
平臺:mt6582 + android 4.4
mtk通過串列埠連線機器讀取uart log資訊,但是在系統啟動完成之後在uart log中會出現這樣的資訊:
<< printk console disable >>
通過搜尋在kernel/kernel/printk.c中的mt_disable_uart函式打印出來的。
通過上面程式碼猜測如果要取消disable uart功能,即在系統啟動完成之後也要能夠看到uart log資訊,需要取消CONFIG_MT_PRINTK_UART_CONSOLE配置,然後繼續搜尋,在mediatek/config/mt6582/autoconfig/kconfig/platform中找到了這個配置,但是這個檔案在開始處就說明了是自動生成的,那麼我們在修改這個檔案時也最好自動生成它,而不是強制修改它。#ifdef CONFIG_MT_PRINTK_UART_CONSOLE extern int mt_need_uart_console; inline void mt_disable_uart() { if(mt_need_uart_console == 0){ printk("<< printk console disable >>\n"); printk_disable_uart = 1; }else{ printk("<< printk console can't be disabled >>\n"); } } inline void mt_enable_uart() { if(mt_need_uart_console == 1){ if(printk_disable_uart == 0) return; printk_disable_uart = 0; printk("<< printk console enable >>\n"); }else{ printk("<< printk console can't be enabled >>\n"); } } #endif
根據以往的經驗,platform這個檔案應該是make menuconfig生成的.config檔案,所以將這個檔案放到kernel目錄下,並重命名為.config,然後執行make menuconfig命令,但是會提示TARGET_PRODUCT/PROJECT is not set這樣的錯誤,指定project,輸入命令make TARGET_PRODUCT=hexing82_cwet_kk menuconfig,然後做如下的配置:
[*] MediaTek Properitary Configuration ---> Kernel Configurations ---> [ ] MTK printk UART controller
然後在編譯的時候有可能會編譯錯誤,會提示需要輸入make mrproper命令,還是在kernel目錄下輸入命令make TARGET_PRODUCT=hexing82_cwet_kk mrproper,重新編譯即可。
// 2016.04.22 add
平臺:mt6735 Android版本:5.1
user版本預設進入核心串列埠是沒有log輸出的,但是本人就遇到了一個問題,eng版本可以正常開機,而user版本在kernel處不斷重啟,沒有辦法,必須抓一下log,要在user版本下抓串列埠log,需要修改lk傳遞給kernel的命令列引數,修改內容如下(bootable/bootloader/lk/app/mt_boot/mt_boot.c):
#ifdef USER_BUILD
- sprintf(cmdline,"%s%s",cmdline," printk.disable_uart=1");
+ sprintf(cmdline,"%s%s",cmdline," printk.disable_uart=0");
#else
sprintf(cmdline,"%s%s",cmdline," printk.disable_uart=0 ddebug_query=\"file *mediatek* +p ; file *gpu* =_\"");
#endif
也就是將命令列引數printk.disable_uart的值由1改成0。
// 2016.11.25 add
在串列埠抓log輸出<< printk console disable >>這個資訊之後,就不會再有出來log了,除了改配置以外,還有3種方式可以再出log。
1. 接串列埠,在終端裡面輸入任意字元。
2. 在adb shell裡面輸入adb shell echo 1 > /proc/mtprintk。
3. 在adb shell裡面輸入setprop persist.uartconsole.enable 1。
如果需要禁止第一種方式,需要修改mtk的uart.c的mtk_uart_irq()函式,在該函式中,如果接收到了任意字元,並且該串列埠是log串列埠的話,會把printk_disable_uart置0,註釋掉這一句就可以了。