串口 (五) linux串口之应用

对串口 的使用

1. 内核打印信息解读
2. dmesg没有显示内核最开始的打印信息,如何调整.
3. 控制台级别及打印级别
4. dmesg 的使用
1. 内核打印信息解读
Starting kernel ... 是 U-boot 打印的最后一句
[    0.000000] Booting Linux on physical CPU 0x0 是Linux打印的第一句,前面是时间戳
  • pr_notice(“%s”, linux_banner);

Linux version 4.4.76 (pop@ubuntu) (gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) ) #22 SMP Sat Oct 6 19:29:17 PDT 2018

  • pr_notice(“Kernel command line: %s\n”, boot_command_line);

Kernel command line: root=/dev/nfs rw         nfsroot=192.168.131.142:/home/pop/linux-debug/rootfs init=/linuxrc         ip=192.168.131.140  console=ttyAMA0

  • mm_init

Memory: 512592K/524288K available (4881K kernel code, 156K rwdata, 1392K rodata, 284K init, 152K bss, 11696K reserved, 0K cma-reserved)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
    vmalloc : 0xa0800000 - 0xff800000   (1520 MB)
    lowmem  : 0x80000000 - 0xa0000000   ( 512 MB)
    modules : 0x7f000000 - 0x80000000   (  16 MB)
      .text : 0x80008000 - 0x80628758   (6274 kB)
      .init : 0x80629000 - 0x80670000   ( 284 kB)
      .data : 0x80670000 - 0x806971a0   ( 157 kB)
       .bss : 0x8069a000 - 0x806c03b8   ( 153 kB)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1

  • console_init

Console: colour dummy device 80x30

  • vfs_caches_init

Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)

  • kernel_init_freeable

before kernel_init_freeable


CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x60008280 - 0x600082d8
Brought up 1 CPUs
SMP: Total of 1 processors activated (525.92 BogoMIPS).
CPU: All CPU(s) started in SVC mode.



before do_basic_setup
devtmpfs: initialized  //driver_init->driver_init


before do_initcalls

do do_initcall_level :0 begin
do do_initcall_level :0 end

do do_initcall_level :1 begin
VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 0
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex hash table entries: 1024 (order: 4, 65536 bytes)
NET: Registered protocol family 16
do do_initcall_level :1 end


do do_initcall_level :2 begin
DMA: preallocated 256 KiB pool for atomic coherent allocations
cpuidle: using governor ladder
cpuidle: using governor menu
do do_initcall_level :2 end


do do_initcall_level :3 begin
of_amba_device_create(): amba_device_add() failed (-19) for /memory-controller@100e0000
of_amba_device_create(): amba_device_add() failed (-19) for /memory-controller@100e1000
of_amba_device_create(): amba_device_add() failed (-19) for /watchdog@100e5000
of_amba_device_create(): amba_device_add() failed (-19) for /smb/motherboard/iofpga@7,00000000/sysctl@01000
of_amba_device_create(): amba_device_add() failed (-19) for /smb/motherboard/iofpga@7,00000000/wdt@0f000
hw-breakpoint: debug architecture 0x4 unsupported.
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.76 #28
Hardware name: ARM-Versatile Express
[<80016420>] (unwind_backtrace) from [<80012e80>] (show_stack+0x10/0x14)
[<80012e80>] (show_stack) from [<802452b8>] (dump_stack+0x84/0x98)
[<802452b8>] (dump_stack) from [<80642654>] (pl011_init+0x8/0x48)
[<80642654>] (pl011_init) from [<8000973c>] (do_one_initcall+0x90/0x1d8)
[<8000973c>] (do_one_initcall) from [<80629f90>] (kernel_init_freeable+0x200/0x2b4)
[<80629f90>] (kernel_init_freeable) from [<804a4bcc>] (kernel_init+0x24/0x114)
[<804a4bcc>] (kernel_init) from [<8000f478>] (ret_from_fork+0x14/0x3c)
Serial: AMBA PL011 UART driver
10009000.uart: ttyAMA0 at MMIO 0x10009000 (irq = 35, base_baud = 0) is a PL011 rev1
console [ttyAMA0] enabled
1000a000.uart: ttyAMA1 at MMIO 0x1000a000 (irq = 36, base_baud = 0) is a PL011 rev1
1000b000.uart: ttyAMA2 at MMIO 0x1000b000 (irq = 37, base_baud = 0) is a PL011 rev1
1000c000.uart: ttyAMA3 at MMIO 0x1000c000 (irq = 38, base_baud = 0) is a PL011 rev1
do do_initcall_level :3 end


do do_initcall_level :4 begin
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Advanced Linux Sound Architecture Driver Initialized.
do do_initcall_level :4 end


do do_initcall_level :5 begin
clocksource: Switched to clocksource arm,sp804
NET: Registered protocol family 2
TCP established hash table entries: 4096 (order: 2, 16384 bytes)
TCP bind hash table entries: 4096 (order: 3, 32768 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
UDP hash table entries: 256 (order: 1, 8192 bytes)
UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
do do_initcall_level :5 end


do do_initcall_level :6 begin
hw perfevents: enabled with armv7_cortex_a9 PMU driver, 1 counters available
squashfs: version 4.0 (2009/01/31) Phillip Lougher
jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
9p: Installing v9fs 9p2000 file system support
io scheduler noop registered (default)
clcd-pl11x 10020000.clcd: PL111 rev2 at 0x10020000
clcd-pl11x 10020000.clcd: /clcd@10020000 hardware, 1024x768@59 display
Console: switching to colour frame buffer device 128x48
clcd-pl11x 1001f000.clcd: PL111 rev2 at 0x1001f000
clcd-pl11x 1001f000.clcd: /smb/motherboard/iofpga@7,00000000/clcd@1f000 hardware, 640x480@59 display
40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000
Intel/Sharp Extended Query Table at 0x0031
Using buffer write method
40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000
Intel/Sharp Extended Query Table at 0x0031
Using buffer write method
Concatenating MTD devices:
(0): "40000000.flash"
(1): "40000000.flash"
into device "40000000.flash"
libphy: smsc911x-mdio: probed
smsc911x 4e000000.ethernet eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=4e000000.etherne:01, irq=-1)
smsc911x 4e000000.ethernet eth0: MAC Address: 52:54:00:12:34:56
isp1760 4f000000.usb: bus width: 32, oc: digital
isp1760 4f000000.usb: NXP ISP1760 USB Host Controller
isp1760 4f000000.usb: new USB bus registered, assigned bus number 1
isp1760 4f000000.usb: Scratch test failed.
isp1760 4f000000.usb: can't setup: -19
isp1760 4f000000.usb: USB bus 1 deregistered
usbcore: registered new interface driver usb-storage
mousedev: PS/2 mouse device common for all mice
rtc-pl031 10017000.rtc: rtc core: registered pl031 as rtc0
mmci-pl18x 10005000.mmci: Got CD GPIO
mmci-pl18x 10005000.mmci: Got WP GPIO
mmci-pl18x 10005000.mmci: No vqmmc regulator found
mmci-pl18x 10005000.mmci: mmc0: PL181 manf 41 rev0 at 0x10005000 irq 31,32 (pio)
ledtrig-cpu: registered to indicate activity on CPUs
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
input: AT Raw Set 2 keyboard as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10006000.kmi/serio0/input/input0
aaci-pl041 10004000.aaci: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 30
aaci-pl041 10004000.aaci: FIFO 512 entries
oprofile: using arm/armv7-ca9
NET: Registered protocol family 17
9pnet: Installing 9P2000 support
do do_initcall_level :6 end


do do_initcall_level :7 begin
Registering SWP/SWPB emulation handler
rtc-pl031 10017000.rtc: setting system clock to 2018-10-07 03:22:01 UTC (1538882521)
smsc911x 4e000000.ethernet eth0: SMSC911x/921x identified at 0xa12a0000, IRQ: 28
input: ImExPS/2 Generic Explorer Mouse as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2
IP-Config: Guessing netmask 255.255.255.0
IP-Config: Complete:
     device=eth0, hwaddr=52:54:00:12:34:56, ipaddr=192.168.131.140, mask=255.255.255.0, gw=255.255.255.255
     host=192.168.131.140, domain=, nis-domain=(none)
     bootserver=255.255.255.255, rootserver=192.168.131.142, rootpath=
ALSA device list:
  #0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 30
do do_initcall_level :7 end



after do_initcalls


after do_basic_setup


VFS: Mounted root (nfs filesystem) on device 0:13.


after kernel_init_freeable

  • prepare_namespace();

VFS: Mounted root (nfs filesystem) on device 0:13.

  • 最后的打印信息

VFS: Mounted root (nfs filesystem) on device 0:13. // 这一句是 kernel_init_freeable 打印出来的.
Freeing unused kernel memory: 284K (80629000 - 80670000) //这一句是 free_initmem->free_reserved_area 打印出来的 
----------------------------------- //从这一句开始就不是内核打印的了.是 init 用户进程打印出来的
 welcome to A9 vexpress board
-----------------------------------

Please press Enter to activate this console. 

2. dmesg没有显示内核最开始的打印信息,如何调整.
调整 CONFIG_LOG_BUF_SHIFT
可以直接修改 .config,也可以直接修改 def_config

make menuconfig 位置在
General setup  --->
    (14) Kernel log buffer size (16 => 64KB, 17 => 128KB)
help 信息
  | CONFIG_LOG_BUF_SHIFT:                                                                                                                 |  
  |                                                                                                                                       |  
  | Select the minimal kernel log buffer size as a power of 2.                                                                            |  
  | The final size is affected by LOG_CPU_MAX_BUF_SHIFT config                                                                            |  
  | parameter, see below. Any higher size also might be forced                                                                            |  
  | by "log_buf_len" boot parameter.                                                                                                      |  
  |                                                                                                                                       |  
  | Examples:                                                                                                                             |  
  |            17 => 128 KB                                                                                                               |  
  |            16 => 64 KB                                                                                                                |  
  |            15 => 32 KB                                                                                                                |  
  |            14 => 16 KB                                                                                                                |  
  |            13 =>  8 KB                                                                                                                |  
  |            12 =>  4 KB                                                                                                                |  
  |                                                                                                                                       |  
  | Symbol: LOG_BUF_SHIFT [=14]                                                                                                           |  
  | Type  : integer                                                                                                                       |  
  | Range : [12 21]                                                                                                                       |  
  | Prompt: Kernel log buffer size (16 => 64KB, 17 => 128KB)                                                                              |  
  |   Location:                                                                                                                           |  
  |     -> General setup                                                                                                                  |  
  |   Defined at init/Kconfig:820                                                                                                         |  
  |   Depends on: PRINTK [=y] 
3. 控制台级别及打印级别
$ cat /proc/sys/kernel/printk
    8                 4           		1              		 7
    当前控制台 		   default 			 minimum 			  boot-time-default
    当前控制台日志级别   默认的消息日志级别    最低的控制台日志级别    默认的控制台日志级别

小于等于 控制台 loglevel 的 log 才能打出来
勘误:
小于 控制台 loglevel 的 log 才能打出来


一般不会改的几个值.
    default 			 minimum 			  boot-time-default
    默认的消息日志级别	  最低的控制台日志级别    默认的控制台日志级别
    
    默认的消息日志级别 	: 一般为4,printk("<4>" "level 4!\n");printk("level 4!\n");pr_warning("level 4!\n"); 效果是一样的
    最低的控制台日志级别 : 一般为1.如果此时控制台级别设置为1,此时 KERN_EMERG(0) 和 KERN_ALERT 仍会打印出来.
    默认的控制台日志级别 : 一般为7,此时 KERN_DEBUG(7) ... KERN_EMERG(6) 都会打印出来.

        
怎么改变控制台日志级别
	1. 改变 dts chosen 节点中的 loglevel=5 为 loglevel=6,将当前控制台信息级别改为6.
        改变的 是 cat /proc/sys/kernel/printk 中的第一个值, 控制台 loglevel
	2. echo 1 > /proc/sys/kernel/printk ,将当前控制台信息级别改为1
怎么 改变打印级别

    loglevel=   All Kernel Messages with a loglevel smaller than the
            console loglevel will be printed to the console. It can
            also be changed with klogd or other programs. The
            loglevels are defined as follows:

            0 (KERN_EMERG)      system is unusable
            1 (KERN_ALERT)      action must be taken immediately
            2 (KERN_CRIT)       critical conditions
            3 (KERN_ERR)        error conditions
            4 (KERN_WARNING)    warning conditions
            5 (KERN_NOTICE)     normal but significant condition
            6 (KERN_INFO)       informational
            7 (KERN_DEBUG)      debug-level messages
 
            #define KERN_EMERG "\001" "<0>" 通常是系统崩溃前的信息

            #define KERN_ALERT "\001" "<1>" 需要立即处理的消息

            #define KERN_CRIT "\001" "<2>" 严重情况

            #define KERN_ERR "\001" "<3>" 错误情况

            #define KERN_WARNING "\001" "<4>" 有问题的情况

            #define KERN_NOTICE "\001" "<5>" 正常情况,但仍然要注意

            #define KERN_INFO "\001" "<6>" 信息型消息

            #define KERN_DEBUG "\001" "<7>" 用作调试作用


printk("\001" "<0>" "level 0!\n"); // printk(KERN_EMERG "level 0!\n");

printk("\001" "<1>" "level 1!\n"); // printk(KERN_ALERT "level 1!\n");

printk("\001" "<2>" "level 2!\n");

printk("\001" "<3>" "level 3!\n");

printk("\001" "<4>" "level 4!\n");

printk("\001" "<5>" "level 5!\n");

printk("\001" "<6>" "level 6!\n");

printk("\001" "<7>" "level 7!\n"); 

内核提供了动态打印的系统,例如pr_debug,dev_debug这种接口。他们是对printk(log_level " ")的二次封装

include/linux/kernel.h
#define pr_emerg(fmt, ...) \
        printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)
#define pr_alert(fmt, ...) \
        printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)
#define pr_crit(fmt, ...) \
        printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)
#define pr_err(fmt, ...) \
        printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
#define pr_warning(fmt, ...) \
        printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
#define pr_notice(fmt, ...) \
        printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
#define pr_info(fmt, ...) \
        printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
#define pr_cont(fmt, ...) \
		printk(KERN_CONT fmt, ##__VA_ARGS__) // NOT LEVEL 7 
  
  /* If you are writing a driver, please use dev_dbg instead */                    
  #if defined(CONFIG_DYNAMIC_DEBUG)                                                
  /* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */       
  #define pr_debug(fmt, ...) \                                                        
      dynamic_pr_debug(fmt, ##__VA_ARGS__)                                            
  #elif defined(DEBUG)                                                                
  #define pr_debug(fmt, ...) \                                                        
      printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)                                   
  #else                                                                               
  #define pr_debug(fmt, ...) \                                                        
      no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)                                
  #endif

4. dmesg 的使用
BusyBox v1.30.0.git (2019-02-15 18:29:52 PST) multi-call binary.

Usage: dmesg [-c] [-n LEVEL] [-s SIZE]

Print or control the kernel ring buffer

        -c              Clear ring buffer after printing // 打印后清空buf
        -n LEVEL        Set console logging level // 设置当前控制台优先级
        -s SIZE         Buffer size  //
        -r              Print raw message buffer // 可看出打印优先级
ubuntu dmesg
 		dmesg -T  // 按照标准事件显示
 		dmesg -d  // 显示两条信息的时间间隔
 		dmesg -d -T
 		dmesg | tail // 最近一次内核输出
 		dmesg -l 5  // 只打印level 5
5. early_printk 如何使用
内核侧配置 CONFIG_EARLY_PRINTK=y
uboot侧配置 earlyprintk=ttySAC0,115200 (一般根据console=的值进行调整)

setenv bootargs "root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200 bootmem_debug earlyprintk=ttySAC0,115200"
6. 动态打印
7. pr_debug 打不出来
在你关心的模块的目录下的Makefile下添加如下代码,例如 mmc_core ,对应 drivers/mmc/core/Makefile
ccflags-y += -DDEBUG -DVERBOSE_DEBUG
include/linux/printk.h
406 /* If you are writing a driver, please use dev_dbg instead */                    
407 #if defined(CONFIG_DYNAMIC_DEBUG) || \                                           
408     (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE))        
409 #include <linux/dynamic_debug.h>                                                 
410                                                                                  
411 /**                                                                              
412  * pr_debug - Print a debug-level message conditionally                          
413  * @fmt: format string                                                           
414  * @...: arguments for the format string                                         
415  *                                                                               
416  * This macro expands to dynamic_pr_debug() if CONFIG_DYNAMIC_DEBUG is           
417  * set. Otherwise, if DEBUG is defined, it's equivalent to a printk with         
418  * KERN_DEBUG loglevel. If DEBUG is not defined it does nothing.                 
419  *                                                                               
420  * It uses pr_fmt() to generate the format string (dynamic_pr_debug() uses       
421  * pr_fmt() internally).                                                         
422  */                                                                              
423 #define pr_debug(fmt, ...)          \                                            
424     dynamic_pr_debug(fmt, ##__VA_ARGS__)                                         
425 #elif defined(DEBUG)                                                             
426 #define pr_debug(fmt, ...) \                                                     
427     printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)                                
428 #else                                                                            
429 #define pr_debug(fmt, ...) \                                                     
430     no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)                             
431 #endif

其他

  • 在内核中添加log,然后从dmesg 输出log
printk(KERN_EMERG "mylog level 0!\n");
dmesg -l 0 -T -d

logcat

安卓下打印上层应用的log , logcat 原理类似于dmesg 的原理,只不过dmesg是在内核空间维护环形buff,另一个是在用户空间维护环形buff
adb logcat -c // 清log缓冲区
adb logcat  // 实时打印到终端
adb logcat > D:\logcat.txt // 打印到文件里

  • logcatd 启动时机

# cat /system/etc/init/logcatd.rc

# logcatd service
service logcatd /system/bin/logcatd -L -b ${logd.logpersistd.buffer:-all} -v threadtime -v usec -v printable -D -f /data/misc/logd/logcat -r 1024 -n ${logd.logpersistd.size:-256} --id=${ro.build.id}
    class late_start
    disabled
    # logd for write to /data/misc/logd, log group for read from log daemon
    user logd
    group log
    writepid /dev/cpuset/system-background/tasks
    oom_score_adjust -600

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值