1. 程式人生 > >mtk 串列埠讀取uart log

mtk 串列埠讀取uart log

平臺:mt6582 + android 4.4

mtk通過串列埠連線機器讀取uart log資訊,但是在系統啟動完成之後在uart log中會出現這樣的資訊:

<< printk console disable >>

通過搜尋在kernel/kernel/printk.c中的mt_disable_uart函式打印出來的。

#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
通過上面程式碼猜測如果要取消disable uart功能,即在系統啟動完成之後也要能夠看到uart log資訊,需要取消CONFIG_MT_PRINTK_UART_CONSOLE配置,然後繼續搜尋,在mediatek/config/mt6582/autoconfig/kconfig/platform中找到了這個配置,但是這個檔案在開始處就說明了是自動生成的,那麼我們在修改這個檔案時也最好自動生成它,而不是強制修改它。

根據以往的經驗,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,註釋掉這一句就可以了。