Linux-Kernel驱动调试

--- echo 0 > /proc/sys/kernel/sysrq 关闭 1开启 内核日志

DMESG

---dmesg指令打印的内容只与kernel相关,它的log源于内核缓冲区

//实时监控dmesg日志输出信息
[root@RedHat_test ~]# watch "dmesg | tail -20"

//输出dmesg至文档
dmesg > xx.log
==> exit后adb pull xx.log C:\Users\xxxxx

GPIO

//查看gpio信息
cd sys/kernel/debug
cat gpio

# 使能引脚GPIO1_C4
echo 52 > /sys/class/gpio/export

# 设置引脚为输入模式
echo in > /sys/class/gpio/gpio52/direction
# 读取引脚的值
cat /sys/class/gpio/gpio52/value

# 设置引脚为输出模式
echo out > /sys/class/gpio/gpio52/direction
# 设置引脚为低电平
echo 0 > /sys/class/gpio/gpio52/value
# 设置引脚为高电平
echo 1 > /sys/class/gpio/gpio52/value

# 复位引脚
echo 52 > /sys/class/gpio/unexport

GPIO被占用会报错,可能这个个引脚已被使用,需在设备树中自行查找

input事件

--- 查看linux下事件

# 查看总共有几个事件
 ls /dev/input/
 
# 查看event对应的设备信息
cat /proc/bus/iio/devices

# 直接读取事件的输入
cat /dev/input/event4

# evtest

ADC

--- 一般ADC接口有两种:温度传感器,逐次逼近ADC

# TS-ADC(Temperature Sensor):支持两通道,时钟频率必须低于800KHZ
# SAR-ADC(Successive Approximation Register):支持六通道单端10位的SAR-ADC,时钟频率必须小于13MHZ。

# 获取所有的ADC值
cat /sys/bus/iio/devices/iio\:device0/in_voltage*_raw
==> 逐次逼近ADC:1.8v上拉,10位采样率,因此读出来的值为1024,实际电压计算公式:Vresult = (1800mv * 读出来的值) / 1023;

UART-串口

串口功能
TXD发送信号线
RXD接受信号线
# 检查串口设备是否成功使能
ls /dev/tty*

FAN

# 查看风扇状态
cat /sys/class/thermal/cooling_device0/cur_state

I2C

# 查看i2c总线是否开启
ls /dev/i2c-*

I2C-TOOLS

--- 适用于挂载在I2C上的设备(例如某些挂载在i2c上的codec)

参数y:关闭交互模式,使用该参数时,不会提示警告信息。

参数a:扫描总线上的所有设备。

参数q:使用SMBus的“quick write”命令进行检测,不建议使用该参数。

参数r:使用SMBus的“receive byte”命令进行检测,不建议使用该参数。
  • i2cdetect
# 检测当前系统有几组I2C总线
i2cdetect -l

# 查看指定I2C3总线的挂载情况
i2cdetect -a 3
i2cdetect -r 3
i2cdetect -y 3 //如显示i2c3的挂载情况
  • i2cdump
# i2cdump 读取指定设备上的全部寄存器的值
i2cdump -y(自动执行yes) -f 0 0x30 //读取I2c0总线上0x30地址里面的数据
  • i2cget
# 查询单个寄存器值
# 读取指定IIC设备的某个寄存器的值,如下读取I2C0地址为0x30器件中的0x01寄存器值。
i2cget -f -y 0 0x30 0x01
  • i2cset
# 修改单个寄存器值
# 写入指定IIC设备的某个寄存器的值,如下设置I2C0地址为0x30器件中的0x01寄存器值为0x02;
i2cset -f -y 0 0x30 0x01 0x02

IO命令

--- 适合SOC寄存器查询

# 例如查询SOC上的I2S
cat proc/iomem | grep i2s
# 查询fe41000的寄存器值
io -4 -l 0x40 0xfe4100000
// -1|2|4     Sets memory access size in bytes (default byte)

image-20240118151440877

image-20240118151730657


regmap

ls /sys/kernel/debug/regmap/
cat /sys/kernel/debug/regmap/0-0020-rk817-codec/registers

image-20240118152042629


SPI

SPI功能
MOSI主设备输出/从设备输入
MISO主设备输入/从设备输出
CLOCK时钟信号线
CS0片选信号线0
CS1片选信号线1
# 检查SPI设备
ls /dev/spi*

PWM设备

# 查看pwm是否开启
ls /sys/class/pwm/

示例:
pwm1->pwmchip1
pwm5->pwmchip2
pwm7->pwmchip3

==> 操作PWM
# 将指定pwm导出到用户空间
echo 0 > /sys/class/pwm/pwmchip1/export

# 设置pwm周期 单位为ns
echo 1000000 > /sys/class/pwm/pwmchip1/pwm0/period

# 设置占空比
echo 500000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle

# 设置pwm极性
echo "normal" > /sys/class/pwm/pwmchip1/pwm0/polarity

# 使能pwm
echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable

# 取消将pwm3导出到用户空间
echo 0 > /sys/class/pwm/pwmchip1/unexport

Interrupts 中断信息

//查看Linux内核的中断信息
cat /proc/interrupts   //这个主要是硬件中断信息
==>hp-det-gpio = <&gpio4 RK_PA4 GPIO_ACTIVE_LOW>; 耳机设置后会看到headset中断
中断号 CPU0  CPU1  CPU2  CPU3使用次数                                   中断名字
119:    0     0     0     0        rockchip_gpio_irq   4 Edge      headset_detect


cat /proc/softirqs     //软中断


cat /sys/kernel/irq/xxx //可以看到具体的中断信息

音频功能调试-Linux

--- Linux 使用alsa;Android使用tinyalsa

  • Lingx 音频调试方法
# 查看当前已注册的声卡
cat /proc/asound/cards

# 查询音频时钟,确认时钟设置是否正确
cat /sys/kernel/debug/clk/clk_summary | egrep "i2s1|pll"

# 获取录音设备
aplay -l

# 获取录音设备
arecord -l

# 查看声卡驱动目录
ls /dev/snd/

# 列出可以控制card 1的控制器
amixer controls -c 1

# 列出所有card 1控制器能配置的值
amixer contents -c 1

# 查看声卡0控制器2的可配置的值
amixer -Dhw:0 cget numid=2
amixer -c 0 cget numid=2

# 设置声卡0控制2的值为3
amixer -Dhw:0 cset numid=2 3
amixer -c 0 cset numid=2 3

# 图形化查看当前信息
alsamixer

# 指定声卡0播放音频文件
aplay -D hw:0 test.wav
aplay -c 0 test.wav

# 使用声卡0,cd音质,录制10s
arecord -f cd -Dhw:1 -d 10 test.wav

# 使用card 1录制并使用card 1进行播放
sudo arecord -f cd -Dhw:1 | aplay -Dhw:1
  • 后续补充alsaloop、play、pacmd、pluseaudio指令

  • -Dhw:0,0详解

    • 第一位0是指定0声卡,第二位0是指定设备0;实际完整命令如:aplay -Dhw:0,0 test.wav;
  • -Dhw:0,0 和 -Dplughw:0,0的区别

  • hw:是直接访问硬件

  • plughw:是经过采样率和格式转换的插件

= =>如RK平台,录播都是仅支持2ch,如果直接使用hw:0,0播放mono文件则会报错:Channels count non available;只能使用stereo;

但是可以使用plughw:0,0的方式播放mono文件

  • 录音也可以使用plughw:0的方式录制mono格式的音频

= => plughw:0 很好用


音频功能调试-Andorid



自定义log打印

/* Debug */
#if 1
#define DBG(x...) printk(x)
#else
#define DBG(x...) do { } while (0)
#endif

#ifdef CONFIG_SND_DEBUG
#define DBG(args...) pr_info(args)
#else
#define DBG(args...)
#endif


dtb反编译

# fdtdump工具
sudo apt-get install device-tree-complier

# 反编译
fdtdump xxx.dtc >  xxx.dts