嵌入式开发中的一句话备忘 - 嵌入式linux(非安卓)


目录


  • uboot
  • 嵌入式linux

//DTC除了可以编译.dts文件以外,其实也可以“反汇编”.dtb文件为.dts文件,其指令格式为:
./scripts/dtc/dtc -I dtb -O dts -o xxx.dts arch/arm/boot/dts/xxx.dtb
用这种方式把树莓派的设备树“还原”出来。

//Linux kernal的文档使用rst结构化文本编写,阅读kernal\msm-4.1.4\README文档可知,可以通过

make htmldocs

生成可读的html,不过也可以直接在
https://www.kernel.org/doc/html/latest/index.html#
就能搜索。
//打印编译fail的某个.c文件的完整编译命令,内核原始makefile有v=1来开启,也可以在直接篡改一下:
原始:

# Use 'make V=1' to see the full commands

ifeq ("$(origin V)", "command line")
  KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
  KBUILD_VERBOSE = 0
endif

修改后:

# Use 'make V=1' to see the full commands

ifeq ("$(origin V)", "command line")
  KBUILD_VERBOSE = 1
endif
ifndef KBUILD_VERBOSE
  KBUILD_VERBOSE = 1
endif

// 对于某些定位问题的时候需要时间戳,可以使用 ts命令 在每一行行首增加了时间戳。下面给出另一个例子:

$ ls -l | ts
Aug 21 13:34:25 total 120
Aug 21 13:34:25 drwxr-xr-x 2 sk users 12288 Aug 20 20:05 Desktop
Aug 21 13:34:25 drwxr-xr-x 2 sk users 4096 Aug 10 18:44 Documents
Aug 21 13:34:25 drwxr-xr-x 24 sk users 12288 Aug 21 13:06 Downloads
[...]

--- 来自文章 (https://linux.cn/article-9962-1.html 《一套有用的 Unix 实用程序 》)
类似地,可以用sudo execsnoop |ts
来记录函数调用的时间戳。
//
Q:如何由dtb生成dts?
A:dtc -I dtb -O dts -o xxx.dts xxx.dtb

Q:linux下有多套gcc版本,如何手工切换需要的版本?
A:使用 update-alternatives 选择某个版本的gcc:
往系统添加一个 arm-linux-guneabi-gcc-5 的链接配置并设置优先级。
$ sudo update-alternatives --install /usr/bin/arm-linux-gnueabi-gcc arm-linux-gnueabi-gcc /usr/bin/arm-linux-gnueabi-gcc-5 5

接下来往系统添加一个 arm-linux-guneabi-gcc-7 的链接配置并设置优先级。
$ sudo update-alternatives --install /usr/bin/arm-linux-gnueabi-gcc arm-linux-gnueabi-gcc /usr/bin/arm-linux-gnueabi-gcc-7 7

使用 update-alternatives 命令来选择一个配置。
$ sudo update-alternatives --config arm-linux-gnueabi-gcc

然后可以看到arm-linux-gnueabi-gcc 指向的是/etc/alternatives/ 的一个自己选择的版本号的gcc
ls -al /usr/bin/arm-linux-gnueabi-gcc
lrwxrwxrwx 1 root root 39 7月 13 2020 /usr/bin/arm-linux-gnueabi-gcc -> /etc/alternatives/arm-linux-gnueabi-gcc-5

//i2ctools软件中的工具 i2ctransfer 和 i2cdump 都可以读芯片的寄存器,命令稍不同,如下:
注意i2cdetect 扫描到只是说明设备树中有这个设备,实际可能这个芯片根本没有贴片.

1|mek_8q_raite:/ # i2cdetect -y -a 9
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- 2c -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- 41 42 43 44 45 -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
mek_8q_raite:/ #
可以看到bus=9下面有6a,41~45,2c这几个i2c设备.

i2cdump -f -y 9 0x6a
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: ef 00 00 01 00 00 90 51 2d d4 ff e4 91 f3 50 0b ?..?..?Q-?.???P?
10: 00 00 f3 0f e4 9b 00 01 00 00 60 00 f4 ff 40 02 ..????.?..`.?.@?
20: 55 00 0f 00 00 00 00 bf 00 00 00 00 00 00 00 00 U.?....?........
30: fa 45 99 99 b6 00 00 00 00 00 00 2e 24 54 c8 22 ?E???.......$T?"
40: 5a 10 00 a0 00 00 55 ff ef 0f ff 00 00 00 05 00 Z?.?..U.??....?.
50: 00 00 05 00 00 00 05 00 00 00 05 90 51 2d 00 00 ..?...?...??Q-..
60: 45 ff 1f 00 00 12 96 00 50 b0 00 00 00 00 00 00 E.?..??.P?......
70: f0 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ??..............
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
mek_8q_raite:/ #
mek_8q_raite:/ #
mek_8q_raite:/ # i2ctransfer -f -y 9 w1@0x6a 0x0 r2
0xef 0x00
mek_8q_raite:/ #
mek_8q_raite:/ # i2ctransfer -f -y 9 w1@0x6a 0x2 r2
0x00 0x01
mek_8q_raite:/ # i2ctransfer -f -y 9 w1@0x6a 0x4 r2
0x00 0x00
mek_8q_raite:/ # i2ctransfer -f -y 9 w1@0x6a 0x6 r2
0x90 0x51
mek_8q_raite:/ # i2ctransfer -f -y 9 w1@0x6a 0x8 r2
0x2d 0xd4
mek_8q_raite:/ #
mek_8q_raite:/ #
mek_8q_raite:/ # i2ctransfer -f -y 9 w1@0x6a 0x0 r16
0xef 0x00 0x00 0x01 0x00 0x00 0x90 0x51 0x2d 0xd4 0xff 0xe4 0x91 0xf3 0x50 0x0b

1|mek_8q_raite:/ # i2cget -f -y 9 0x6a 0 //读寄存器0#
0xef
mek_8q_raite:/ # i2cget -f -y 9 0x6a 1 //读寄存器1#
0x00
mek_8q_raite:/ # i2cset -f -y 9 0x6a 1 4 //写寄存器1#
mek_8q_raite:/ # i2cget -f -y 9 0x6a 1 //读寄存器1#
0x04

注意:i2cdump/i2cget 读寄存器只能输入1byte地址,返回1到多字节结果;如果需要输入地址为2byte,则只能使用 i2ctransfer ,比如读max96722的ID寄存器:

console:/ # i2ctransfer -f -y 2 w2@0x29 0x00 0x0d r1 (输入地址2byte=0x000d,返回值1byte)
0xa1 //正确返回,地址为0x000d

console:/ # i2cget -f -y 2 0x29 0x0d
0x00 //错误返回,地址当做0x0d

//截屏: 截取fb1界面到sdcard,文件名为fb1.png
screencap -d /dev/graphics/fb1 sdcard/fb1.png

//使用文件系统节点来操作时,需要注意有可能设备树的修改导致节点路径变更了,比如:
原始:
/sys/devices/platform/58226000.i2c/i2c-9/9-006a/max9286_reset
删除了i2c 一个bus后,变成
/sys/devices/platform/58226000.i2c/i2c-8/8-006a/max9286_reset
可能造成上层找不到文件节点,导致功能异常.
上层使用节点,最好使用find 先搜到节点路径,用搜索结果再去操作.

//python循环打印max96722(bus2,addr=0x29)的寄存器的值:

import os
import time

a=0
os.system('adb root')
os.system('adb remount')    

s_hex=""

while a < 255:
    b='adb shell i2ctransfer -f -y 2 w2@0x29 0x00 '
    b += s_hex + hex(a)
    b +=' r1'
    os.system(b)
    a+=1

//打印结构体的内容,使用 print_hex_dump(),类似:
print_hex_dump(KERN_NOTICE," " ,0,16,1,sd,sizeof(struct v4l2_subdev),true);

相关