Rv1109内核调试

说明

在这之前只在qmenu中调试过内核,没有在真实的板上调试过。
本文记录rv1109 linux 内核GDB调试环境的搭建过程中遇到的问题。
SDK使用的是rk官方的。
串口波特率荣品从1500000 改为115200

GDB环境的准备

遇到的问题1:

查看gdb的环境是否配置正确,进入SDK包kernel 目录,执行

../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gdb vmlinux

结果出现如下错误

Traceback (most recent call last):
  File "/usr/lib/python2.7/site.py", line 554, in <module>
    main()
  File "/usr/lib/python2.7/site.py", line 536, in main
    known_paths = addusersitepackages(known_paths)
  File "/usr/lib/python2.7/site.py", line 272, in addusersitepackages
    user_site = getusersitepackages()
  File "/usr/lib/python2.7/site.py", line 247, in getusersitepackages
    user_base = getuserbase() # this will also set USER_BASE
  File "/usr/lib/python2.7/site.py", line 237, in getuserbase
    USER_BASE = get_config_var('userbase')
  File "/usr/lib/python2.7/sysconfig.py", line 587, in get_config_var
    return get_config_vars().get(name)
  File "/usr/lib/python2.7/sysconfig.py", line 533, in get_config_vars
    _init_posix(_CONFIG_VARS)
  File "/usr/lib/python2.7/sysconfig.py", line 417, in _init_posix
    from _sysconfigdata import build_time_vars
  File "/usr/lib/python2.7/_sysconfigdata.py", line 6, in <module>
    from _sysconfigdata_nd import *
ImportError: No module named _sysconfigdata_nd

这里浓度切换python 版本,从3.8切换到2.7也还是出错

sudo update-alternatives --config python
2 个候选项可用于替换 python (提供 /usr/bin/python)。

  选择       路径              优先级  状态
------------------------------------------------------------
  0            /usr/bin/python2.7   2         自动模式
* 1            /usr/bin/python2.7   2         手动模式
  2            /usr/bin/python3.8   1         手动模式

解决办法

sudo ln -fs /usr/lib/python2.7/plat-x86_64-linux-gnu/_sysconfigdata.py /usr/lib/python2.7/
sudo ln -fs /usr/lib/python2.7/plat-x86_64-linux-gnu/_sysconfigdata_nd.py /usr/lib/python2.7/

遇到的问题2

提示找不到libpython2.7.so.1.0 的库,搜索了/usr/目录下没有对应的库

解决方法,先用ldd命令查看还缺哪些库

ldd ../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gdb

然后在buildroot目录下查找名为libpython2.7.so.1.0的库,再export 环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx对应的库路径

遇到的问题3

python配置问题,报错信息发下

 symbol lookup error: ../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gdb: undefined symbol: PyUnicodeUCS4_FromEncodedObject

解决办法
1.buildroot编译配置时 指定,建议使用buildroot配置gdb,把python相关的功能加上

--enable-unicode=ucs4

或者手动重新编译python2.7

./configure --enable-shared --enable-ipv6 --enable-unicode=ucs4 --with-system-ffi --with-threads
make -j 16

然后再把问题2中的export 路径 (export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx对应的库路径) 改为手动编译的python路径。

KGDB环境的准备

步骤1

内核的配置
在这里插入图片描述CONFIG_KGDB_KDB 不用打开
CONFIG_KGDB_SERIAL_CONSOLE 要打开
CONFIG_DEBUG_INFO 也需要

步骤2

内核启动参数的配置
内核设置树中设置

chosen {
	bootargs = "loglevel=7 earlycon=uart8250,mmio32,0xff570000 console=ttyFIQ0 initcall_debug=1 kgdboc=ttyFIQ0,115200 kgdbcon root=PARTUUID=614e0000-0000 rootfstype=ext4 rw rootwait snd_aloop.index=7 kgdbwait";
};

这里波形率如果是150000 启动gdb时会报错。
解释:

kgdb over serial console (简称 kgdboc)
kgdbcon 是连接gdb时printk有用
要增加kgdbwait

进行调试

按上述配置后,烧入程序,进行板上内核,进入kgdb调试
在PC上执行

../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gdb vmlinux
(gdb) set serial baud 115200
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0

就可以进行行调试

可能遇到的问题

问题1

出现如下报错

Continuing.
[   89.574759] random: fast init done
[   89.575523] iommu: Adding device ffb00000.vop to group 0
[   89.611604] rockchip-vop ffb00000.vop: Linked as a consumer to ffb00f00.iommu
[   89.632529] random: crng init done
Reply contains invalid hex digit 84
(gdb) continue 
Cannot execute this command while the selected thread is running.
(gdb) 

注意random: crng init done 文件系统找不到时会报这样的错误,这里是因为earlycon与后面的ttyfiq衔接的问题导致的。
解决办法

earlycon=uart8250,mmio32,0xff570000

备注:不加上述不进行调试也可以正常启动。

问题2

 Reply contains invalid hex digit 105

虽要加上

initcall_debug=1

注意事项

1.在调试时不要再通过串口连接开发板,否则会出现通信错误。
2.调试时不能接屏,否则会出现/dev/ttyUSB0: Device or resource busy.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
具体来说,你需要按照以下步骤在RV1109内核中开启i2c-gpio: 1. 下载RV1109的内核源代码,并解压到本地目录。 2. 进入内核源代码根目录,并执行以下命令进入内核配置界面: ``` make menuconfig ARCH=arm CROSS_COMPILE=<your_cross_compile_prefix> ``` 其中,`<your_cross_compile_prefix>`是你使用的交叉编译器的前缀,比如arm-linux-gnueabihf-。 3. 进入Device Drivers -> GPIO Support菜单,并找到i2c-gpio选项。如果选项前面有一个星号(*),则表示该选项已经被选中。如果没有星号,则按空格键选中该选项。 4. 保存并退出配置界面,并执行以下命令重新编译内核: ``` make ARCH=arm CROSS_COMPILE=<your_cross_compile_prefix> -j4 ``` 其中,`-j4`表示使用4个线程进行编译,可以根据自己的CPU核心数进行调整。 5. 编译完成后,在`arch/arm/boot/`目录下可以找到生成的`Image`文件和`dts/rv1109-evb-v10.dtb`文件。 6. 将`Image`文件和`rv1109-evb-v10.dtb`文件烧录到RV1109设备上。具体的烧录方法可以参考RV1109的开发文档。 7. 在设备树中添加i2c-gpio节点,比如: ``` i2c-gpio { compatible = "i2c-gpio"; gpios = <&gpio1 0 1>; // GPIO1_0作为SCL i2c-gpio,delay-us = <2>; // I2C总线延时2us #address-cells = <1>; #size-cells = <0>; clock-frequency = <100000>; // I2C时钟频率100kHz linux,phandle = <0>; phandle = <0>; }; ``` 其中,`gpios`指定了SCL和SDA所使用的GPIO引脚,`i2c-gpio,delay-us`指定了I2C总线延时,`clock-frequency`指定了I2C时钟频率。 8. 启动设备后,可以使用i2cdetect等工具来检测i2c设备是否正常工作。比如,执行以下命令可以扫描I2C总线上所有的设备: ``` i2cdetect -y -r 0 ``` 其中,`-y`表示自动确认设备地址,`-r`表示进行快速扫描。如果I2C总线上有设备,会在终端上显示出设备地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值