1.格式化打印
v1
#define CHARGER_PRINT(fmt,arg...) printk("<<-CHARGER_PRINT->> "fmt"\n",##arg)v2
#define CHARGER_PRINT(fmt,arg...) printk("<<-CHARGER_PRINT====func=%s, line =%d ->> "fmt"\n",__func__,__LINE__,##arg)v3 添加控制开关
#define MYDEBUG_ON 1
#define CHARGER_PRINT(fmt,arg...) do{\if(MYDEBUG_ON)\printk("<<-CHARGER_PRINT====func=%s, line =%d ->> "fmt"\n",__func__,__LINE__,##arg);\}while(0)
2.查看所有的中断
—— 可以看到名字,中断发生的次数
中断发生次数 中断类型(gpio中断还是其他) 中断名字
314: 0 qpnp-int usb-ocp
318: 4 qpnp-int qpnp_adc_tm_high_interrupt
319: 5 qpnp-int qpnp_adc_tm_low_interrupt
320: 0 qpnp-int pm8110_tz
325: 0 qpnp-int ocv_thr
326: 0 qpnp-int sw_cc_thr
329: 0 qpnp-int qpnp_rtc_alarm
330: 0 msmgpio hall_sensor_irq
331: 1334 msmgpio gt915l
335: 5 msmgpio ap3426
3.uevent事件添加打印
kernel\lib\kobject_uevent.c
kobject_uevent_env
...
/* default keys */retval = add_uevent_var(env, "ACTION=%s", action_string);if (retval)goto exit;retval = add_uevent_var(env, "DEVPATH=%s", devpath);if (retval)goto exit;retval = add_uevent_var(env, "SUBSYSTEM=%s", subsystem);if (retval)goto exit;// 添加uevent事件打印
printk("zch=====kobject_get_path DEVPATH =%s,ACTION=%s,SUBSYSTEM=%s",devpath,action_string, subsystem);
...
4.设备树中的 dev_get_platdata
设备树中并没有 platdata ,这个指针,
要么直接赋值:
pdev->dev.platform_data = pdata;
要么调用
platform_device_add_data
和device tree没有关系。
- 启动过程
// arch\arm\mach-msm\board-8610.cDT_MACHINE_START(MSM8610_DT, "Qualcomm MSM 8x10 / MSM 8x12 (Flattened Device Tree)").map_io = msm_map_msm8610_io,.init_irq = msm_dt_init_irq,.init_machine = msm8610_init,.handle_irq = gic_handle_irq,.timer = &msm_dt_timer,.dt_compat = msm8610_dt_match,.restart = msm_restart,.reserve = msm8610_reserve,.init_very_early = msm8610_early_memory,.smp = &arm_smp_ops,
MACHINE_ENDmsm8610_initboard_dt_populate // board-dt.cof_platform_populate // ★ 解析设备树
- 查看硬件信息
查看CPU信息:cat /proc/cpuinfo
查看内存信息:cat /proc/meminfo
查看USB设备:cat /proc/bus/usb/devices
查看键盘和鼠标:cat /proc/bus/input/devices
查看各分区使用情况:df
查看体系结构:busybox uname -a
查看中断信息:cat /proc/interrupts
7.看门狗 WDT (watch dog timer)
原理:不停喂狗,确保软件正常运行
涉及文件:drivers/watchdog/wtd.c
关键字:ping
结构:
struct watchdog_ops {struct module *owner;/* mandatory operations */int (*start)(struct watchdog_device *);int (*stop)(struct watchdog_device *);/* optional operations */int (*ping)(struct watchdog_device *); //喂狗操作 The routine that sends a keepalive ping to the watchdog device.unsigned int (*status)(struct watchdog_device *);int (*set_timeout)(struct watchdog_device *, unsigned int);unsigned int (*get_timeleft)(struct watchdog_device *);void (*ref)(struct watchdog_device *);void (*unref)(struct watchdog_device *);long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
};
8.查看usb控制器类型 uhci/ehci/xhci 1.0 2.0 3.0
cat /sys/bus/usb/devices/usb1/product
xHCI Host Controller
9.查看所有input 事件对应的event、name、键盘映射等详细信息
cat /proc/bus/input/devices
10.关闭 2.6内核的 lcd 光标, lcd console
这个办法就是: 写一个哑巴函数,直接返回,形如:
static int dummy_cursor(struct fb_info *info, struct fb_cursor *cursor)
{
return 0;
} 然后给 struct fb_ops 的 .fb_cursor 成员传入这个哑巴函数的地址,形如: .fb_cursor = dummy_cursor, 黑色小方块就不见了。
11.sdcard插拔打印
#1.kernel/vold/framwork sdcard插拔打印 KERNEL : [70056.058716] mmc2: new high speed SDXC card at address 0007KERNEL : [70056.069514] mmc2: calculated max. discard sectors 131072 for timeout 2684 msKERNEL : [70056.077736] mmcblk1: mmc2:0007 SD128 117 GiB KERNEL : [70056.094389] mmcblk1: p1 p2...KERNEL : [ 1072.835709] mmc2: card 0007 removedvold : /system/bin/sgdiskvold : --android-dumpvold : /dev/block/vold/disk:179,80VoldConnector: RCV <- {640 disk:179,80 5}VoldConnector: RCV <- {641 disk:179,80 125652959232}VoldConnector: RCV <- {642 disk:179,80 }VoldConnector: RCV <- {644 disk:179,80 /sys//devices/pci0000:00/INT33BB:01/mmc_host/mmc2/mmc2:0007/block/mmcblk1}vold : DISK gpt D9C01263-43A8-4E4D-8A84-88C4A2DBDA64vold : PART 1 19A710A2-B3CA-11E4-B026-10604B889DCF CAC02517-91B0-4DC7-A034-B691B17C1BDC android_metavold : PART 2 193D1EA4-B3CA-11E4-B075-10604B889DCF ACBB35BB-C0D7-0437-7CB7-734CCA913C86 android_expandvold : Found key for GUID acbb35bbc0d704377cb7734cca913c86vold : Disk at 253:3 changedVoldConnector: RCV <- {650 private:179,82 1 "disk:179,80" "ACBB35BB-C0D7-0437-7CB7-734CCA913C86"}VoldConnector: RCV <- {651 private:179,82 0}VoldConnector: RCV <- {643 disk:179,80}VoldConnector: SND -> {42 volume mount private:179,82 0 -1}vold : /system/bin/blkidvold : -cvold : /dev/nullvold : -svold : TYPEvold : -svold : UUIDvold : -svold : LABELvold : /dev/block/dm-3VoldConnector: RCV <- {651 private:179,82 1}MountService: Volume public:179,64 broadcasting checking to UserHandle{0}
MountService: Volume public:179,64 broadcasting xxx to xxx #2. 开始格式化为fat32 ☆VoldConnector: SND -> {31 volume partition disk:179,64 public}vold : /system/bin/sgdiskvold : --zap-allvold : /dev/block/vold/disk:179,64sgdisk : GPT data structures destroyed! You may now partition the disk using fdisk orsgdisk : other utilities.VoldConnector: RCV <- {200 31 Command succeeded}VoldConnector: NDC Command {31 volume partition disk:179,64 public} took too long (2554ms)vold : Disk at 179:64 changedvold : /system/bin/sgdiskvold : --android-dumpvold : /dev/block/vold/disk:179,64VoldConnector: RCV <- {641 disk:179,64 15523119104}VoldConnector: RCV <- {642 disk:179,64 }VoldConnector: RCV <- {644 disk:179,64 /sys//devices/pci0000:00/INT33BB:01/mmc_host/mmc2/mmc2:0007/block/mmcblk1}vold : DISK mbrvold : PART 1 cvold : Device just partitioned; silently formattingvold : Failed to determine size of /dev/block/vold/public:179,65: Bad addressvold : public:179,65 failed to wipevold : /system/bin/newfs_msdosvold : -Fvold : 32vold : -Ovold : androidvold : -cvold : 64vold : -Avold : /dev/block/vold/public:179,65Vold : Filesystem formatted OKVoldConnector: RCV <- {650 public:179,65 0 "disk:179,64" ""}VoldConnector: RCV <- {651 public:179,65 0}VoldConnector: RCV <- {643 disk:179,64}VoldConnector: SND -> {32 volume mount public:179,65 2 0}vold : /system/bin/blkidvold : -cvold : /dev/nullvold : -svold : TYPEvold : -svold : UUIDvold : -svold : LABELvold : /dev/block/vold/public:179,65VoldConnector: RCV <- {651 public:179,65 1}
11.sdcard 读写超时
由于各sdcard厂商生产的sdcard传输速率不同,可能会造成如下的现象,在如下代码位置中将timeout时间加大
/*(drivers/mmc/core/core.c)mmc_set_data_timeoutif (mmc_card_sd(card)) {unsigned int timeout_us, limit_us;timeout_us = data->timeout_ns / 1000;if (mmc_host_clk_rate(card->host))timeout_us += data->timeout_clks * 1000 /(mmc_host_clk_rate(card->host) / 1000);// modify by zch for add read/write sdcard timeout value
#if 0if (data->flags & MMC_DATA_WRITE)/** The MMC spec "It is strongly recommended* for hosts to implement more than 500ms* timeout value even if the card indicates* the 250ms maximum busy length." Even the* previous value of 300ms is known to be* insufficient for some cards.*/limit_us = 3000000;elselimit_us = 100000;
#elselimit_us = 5000000;
#endif
(2)add timeout
sdhci.c中的sdhci_send_command()
// 打印如下log
KERNEL : [ 5796.264938] mmcblk1: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0xb0007-18 13:27:35.373 0 0 E KERNEL : [ 2793.354386] mmc2: Timeout waiting for hardware interrupt.
07-18 13:27:35.379 0 0 E KERNEL : [ 2793.360428] sdhci: =========== REGISTER DUMP (mmc2)===========
07-18 13:27:35.385 0 0 E KERNEL : [ 2793.366945] sdhci: Sys addr: 0x00000100 | Version: 0x00001002
07-18 13:27:35.392 0 0 E KERNEL : [ 2793.373461] sdhci: Blk size: 0x00007200 | Blk cnt: 0x00000100
07-18 13:27:35.398 0 0 E KERNEL : [ 2793.379979] sdhci: Argument: 0x00000000 | Trn mode: 0x0000003b
07-18 13:27:35.405 0 0 E KERNEL : [ 2793.386495] sdhci: Present: 0x01ff0001 | Host ctl: 0x00000016
07-18 13:27:35.411 0 0 E KERNEL : [ 2793.393011] sdhci: Power: 0x0000000f | Blk gap: 0x00000080
07-18 13:27:35.418 0 0 E KERNEL : [ 2793.399527] sdhci: Wake-up: 0x00000000 | Clock: 0x00000007
07-18 13:27:35.424 0 0 E KERNEL : [ 2793.406044] sdhci: Timeout: 0x0000000a | Int stat: 0x00000000
07-18 13:27:35.431 0 0 E KERNEL : [ 2793.412562] sdhci: Int enab: 0x02ff008b | Sig enab: 0x02ff008b
07-18 13:27:35.438 0 0 E KERNEL : [ 2793.419078] sdhci: AC12 err: 0x00000000 | Slot int: 0x00000000
07-18 13:27:35.444 0 0 E KERNEL : [ 2793.425596] sdhci: Caps: 0x0568c8b2 | Caps_1: 0x00000807
07-18 13:27:35.451 0 0 E KERNEL : [ 2793.432113] sdhci: Cmd: 0x0000123a | Max curr: 0x00000000
07-18 13:27:35.457 0 0 E KERNEL : [ 2793.438629] sdhci: Host ctl2: 0x0000008b
07-18 13:27:35.461 0 0 E KERNEL : [ 2793.443009] sdhci: ADMA Err: 0x00000000 | ADMA Ptr: 0x7b85b800
07-18 13:27:35.468 0 0 E KERNEL : [ 2793.449523] sdhci: ===========================================
12、 设置sdcard mmc控制器时钟
// (drivers/mmc/core/core.c)
mmc_set_clock // 设置速率函数
13.打印内核调用关系
printk(KERN_ALERT "zch=========dump_stack start\n");dump_stack();printk(KERN_ALERT "zch=========dump_stack over\n");
14、内核中xxx、_xxx、__xxx、___xxx函数的使用情况
内核中经常有这样的函数,xxx、_xxx或者__xxx,区别是一个或者两个下划线,其中的含义是:
xxx接口,通常需要由某个锁保护,一般提供给其它模块调用。它会直接调用_xxx接口;
_xxx接口,则不需要保护,一般由模块内部在确保安全的情况下调用。有时,外部模块确信可行(不需要保护),也可能会直接调用;
__xxx接口,一般提供给arch-dependent的软件层实现,比如这里的arch/arm64/kernel/xxx.c。
理解这些含义后,会加快我们阅读代码的速度,另外,如果直接写代码,也尽量遵守这样的原则,以便使自己的代码更规范、更通用。
15、查看pmic寄存器值
cd /sys/kernel/debug/spmi/spmi-0
echo 0xA000> address
echo 0x27FF > count
cat data
16、qcom pmic mpp pwm参数配置
mpp@a300 {/* Backlight PWM */reg = <0xa300 0x100>; qcom,pin-num = <4>;qcom,mode = <1>; /* 模式选择:Digital output */qcom,invert = <0>; /* Disable invert */qcom,src-sel = <5>; /* 通道选择 DTEST1 4 DTEST2 5 */qcom,vin-sel = <2>; /* 电压选择:设置了此选项一般为1.8v ,不设置为3.6v */qcom,ain-route = <3>; /* AMUX 8 */qcom,master-en = <1>; /* Enable MPP */};----------pm8953_pwm: pwm@bc00 { status = "disabled";status = "okay";compatible = "qcom,qpnp-pwm";reg = <0xbc00 0x100>;reg-names = "qpnp-lpg-channel-base";qcom,channel-id = <0>;qcom,supported-sizes = <6>, <9>;#pwm-cells = <2>;qcom,mode-select = <0>;qcom,period = <100>;/*indicates which DTEST line to be configured for LPG or PWM output. For LPG subtypes, possible values are 1, 2, 3 and 4.For PWM subtype, possibe values are 1 and 2.*/ */qcom,dtest-line = <2>; qcom,dtest-output = <2>;qcom,pwm {qcom,duty = <100>;label = "pwm";};
18.高通平台drv关机动作
// /drivers/power/reset/msm-poweroff.c
void export_do_msm_poweroff(void)
{do_msm_poweroff(); // 关机
}//使用 (qpnp-smbcharger.c)
batt_pres_handler(int irq, void *_chip)if (chip->batt_present == 0)export_do_msm_poweroff();
- 反编译dtb文件成为dts文件
/data/QCT/A6090_LENOVO_code/out/target/product/hq_msm8953_64/obj/kernel/msm-3.18/dtc/dtc -I dtb -O dts -o my.dts msm8953-qrd-sku3.dtb
20.触发dump
adb shell echo c > /proc/sysrq-trigger
21.马达
pmi_haptic: qcom,haptic@c000 {compatible = "qcom,qpnp-haptic"
22.设备树
kernel/Documentation/devicetree/bindings/arm/msmboard-id.txt文件的解释如下:qcom,board-id = <board_id, reserved>where board_id is a 32-bit integer whosebit values are defined as follows:bits 31-24 = Platform Subtype ID Platform Subtype ID=0x00=0bits 23-16 = Platform Version (Major) Platform Version (Major)=0x12=18bits 15-8 = Platform Version(Minor) Platform Version(Minor)=0x00=0bits 7-0 =Platform Type ID Platform Type ID=0xb=11这和串口打印信息是一致的:B- 390766 - CDT version:3,PlatformID:11,Major ID:18,Minor ID:0,Subtype:0