linux kernel note

news/2024/10/23 5:35:36/

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没有关系。


  1. 启动过程

// 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      // ★ 解析设备树

  1. 查看硬件信息

查看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();

  1. 反编译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

http://www.ppmy.cn/news/468537.html

相关文章

Notes

★ Core Data [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL] VS [[NSManagedObjectModel mergedModelFromBundles:nil] retain] appDelegate.moc ★ appDelegate实例 CEIBSAppDelegate *appDelegate (CEIBSAppDelegate *)[UIApplication sharedApplication].…

笔记...

抽象语言---编码 编码------二进制 二进制------电信号 处理电信号 OSI/RM 七层参考模型---开放式系统互联 参考模型 ----- ISO----国际标准化组织 第一台电子计算机---1946年2.14 1876年 贝尔获得电话专利 核心思想----分层 ​应用层---提供各种应用程序&#xff0c;将…

MySQL-notes

MySQL 学习笔记&#xff1a; 一、进入数据库&#xff1a;二、查看(database/table)三、使用数据库:四、创建(database/table):五、更改(表名/表中某栏目字段的数据类型)六、删除(数据库/表格):七、查询(表格内详细信息)&#xff1a;八、插入数据(table)&#xff1a;九、表格中删…

常用事件模型总结

事件模型一般有select、poll、 eventport 、dev/poll、epoll、kqueue这几种。以下对这几种事件模型逐个作原理讲解。 1.select模型  select通过select系统调用监视多个文件描述符集合&#xff0c;select调用返回后&#xff0c;集合中的文件描述符会被内核进行标志位的修改&a…

Kernel pwn 入门 (7)

本篇文章中&#xff0c;我们会练习回顾上一篇文章中学到的userfaultfd利用方式&#xff0c;同时学习一种新的利用方式&#xff1a;modprobe_path。使用的例题是&#xff1a;D^3CTF-2019 knote&#xff0c;需要两种利用配合使用。下面我们对本题进行分析。题目下载地址&#xff…

elementui el-image组件 点击预览图片

效果&#xff1a;点击单个图片&#xff0c;查看大图 <template><el-container class"platform-list-page"><el-main class"stationList"><data-tableref"DataTable":default-show-type"defaultShowType":default…

IPS、VA、TN屏构造和优缺点对比

转自https://display.ofweek.com/2018-05/ART-8321303-8500-30227810.html

送福利,价值1000的低蓝光护眼IPS显示屏,写代码神器!

快过年了&#xff0c; 为回馈各位老铁长期的关注与支持&#xff0c; 让大家能够更好的体验到编码的乐趣&#xff0c;提高技术水平&#xff0c; 直接送一个 低蓝光护眼IPS显示屏 &#xff01; 价值 1000 元&#xff0c; 简直美滋滋&#xff0c; 无论是自己用&#xff0c;还是当礼…