Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2159703
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: Android平台

2015-11-12 12:06:05

一. console disable
1. 问题描述
在用串口输出内核的log时,到了下面一句话就没有了
[   44.352822].(1)[1027:sh]<< printk console disable >>
串口打印被disable了,如何破?

2.分析
在./mediatek/kernel/drivers/mtprof/bootprof.c中
2.1 创建了/proc/bootprof文件
  1. static int __init init_boot_prof(void)
  2. {
  3.     struct proc_dir_entry *pe;
  4.     pe = proc_create("bootprof", 0664, NULL, &mt_bootprof_fops);  //创建了/proc/bootprof文件
  5.     return 0;
  6. }
mt_bootprof_fops中规定了/proc/bootprof的写操作是mt_bootprof_write
2.2 /proc/bootprof的写操作
  1. static ssize_t mt_bootprof_write(struct file *filp, const char *ubuf,
  2.        size_t cnt, loff_t *data)
  3. {
  4.     copy_from_user(&buf, ubuf, copy_size); cnt);
  5.     if(cnt==1){
  6.       if(buf[0] == '0')
  7.           mt_bootprof_switch(0);
  8.       else if(buf[0] == '1')
  9.           mt_bootprof_switch(1);
  10.     }
  11.    return cnt;
  12. }
如果写入0,就关闭console打印,如果写入1就打开console打印
2.3 mt_bootprof_switch
  1. static void mt_bootprof_switch(int on)
  2. {
  3.     dbmsg("on=%d", on);
  4.     mutex_lock(&mt_bootprof_lock);
  5.     if (mt_bootprof_enabled ^ on)
  6.     {
  7.         if (on)
  8.         {
  9.             mt_bootprof_enabled = 1;
  10.             mt_enable_uart();    //这个是我添加的
  11.         }
  12.         else
  13.         { // boot up complete
  14.             mt_bootprof_enabled = 0;
  15.             bootup_finish();  -->就是调用mt_disable_uart()
  16.         }
  17.     }
  18.     mutex_unlock(&mt_bootprof_lock);

  19. }
mt_bootprof_switch中若是打开则会调用mt_enable_uart
若是关闭则会调用mt_disable_uart

3.
mt_disable_uart与mt_enable_uart实际上只是将标志printk_disable_uart置1或置0
那么这个标志printk_disable_uart是如何影响串口打印的呢?
答案是控制printk中的输出

在/kernel/kernel/printk.c中
  1. printk
  2. --> 对每个args调用vprintk
  3.  --> 添加时间打印后调用 console_unlock
  4.    --> call_console_drivers
  5.      -->_call_console_drivers
  6.        -->在调用con->write之前先判断printk_disable_uart标志是不是等于1
  7.        如果等于1,则不打印

二.实验
1.代码修改
a. ./mediatek/kernel/drivers/mtprof/bootprof.c中
  1. +extern void mt_enable_uart(void);
  2.  static void mt_bootprof_switch(int on)
  3.  {
  4.      mutex_lock(&mt_bootprof_lock);
  5.      if (mt_bootprof_enabled ^ on)
  6.         {
  7.                 if (on)
  8.                 {
  9.                     mt_bootprof_enabled = 1;
  10. +                    mt_enable_uart();       //当on=1时需要将enable_uart
  11.                 }
  12.           }
  13.            
  14. static ssize_t mt_bootprof_write(struct file *filp, const char *ubuf,
  15. - if(cnt==1){                                       //将文件打开数的判断去掉,可能上层一直有占用这个
  16. + //if(cnt==1){
  17.         if(buf[0] == '0')
  18.             mt_bootprof_switch(0);
  19.         else if(buf[0] == '1')
  20.             mt_bootprof_switch(1);
  21. - }
  22. + //}
  23.  
  24. }
b. kernel/kernel/printk中
  1. inline void mt_enable_uart(void)
  2.  {
  3. + printk_disable_uart = 0;
  4. + printk("<< printk console enabled >>\n");
  5. +
  6. +#if 0
  7.      if(mt_need_uart_console == 1){    //这个标志会影响printk_disable_uart
  8.          if(printk_disable_uart == 0)
  9.              return;
  10. @@ -97,6 +103,7 @@ inline void mt_enable_uart(void)
  11.      }else{
  12.          printk("<< printk console can't be enabled >>\n");
  13.      }
  14. +#endif
  15.  }
2.实验
root@hqunited72_we_72_kk:/ # echo 1 > /proc/bootprof      //串口会从disable中继续打印
root@hqunited72_we_72_kk:/ # echo 0 > /proc/bootprof      //串口不打印了

阅读(7321) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

ranmeizi2019-04-20 09:24:22

请问还有MTK的FAQ么?能不能共享一份

wangcong023452015-12-24 18:25:00

lxglxt:这个可以在内核直接配置吧?三星的是这样的[*]Support for console on Samsung SoC serial port

这个主要是想看一下\"串口打印被disable\"的过程,即代码里面是如何实现这个disable的过程的。
不改代码,直接配置的话,mtk的FAQ说明的很清楚,执行如下命令:
adb shell setprop persist.uartconsole.enable 1

MTK平台是这样的,三星的没用过不清楚。

回复 | 举报

lxglxt2015-12-24 10:26:50

这个可以在内核直接配置吧?三星的是这样的[*]Support for console on Samsung SoC serial port