使用CCS调试基于AM335X的SPL、Uboot(原创) - lh03061238

时间:2024-01-23 21:19:20

使用CCS调试基于AM335X的SPL、Uboot(原创)

使用CCS调试基于AM335XSPLUboot

 

 

一、开发环境

1、硬件平台:创龙AM3359核心板

2、SDK版本:ti-processor-sdk-linux-am335x-evm-03.00.00.04-Linux-x86-Install

3、Uboot版本:u-boot-2016.05-g1051776-v1.4.tar

4、CCS版本:CCS6.2.0.00050_linux-x64.tar

二、开发准备

1、使用虚拟机安装64位 Ubuntu16.04系统。

2、SDK的安装按照创龙提供的相关文档或TI官网的相关指导

3、CCS使用CCS6.2版本,需要注意以下几点

 

(1)    需要安装对应SDK版本的推荐CCS版本(6.13)或以上版本,这里使用了CCS6.2版本,否则会出错或有相关的库不支持。

(2)    要注意CCS版本和相应的ubuntu版本是否兼容,参见TI相关网站查看,如:

http://processors.wiki.ti.com/index.php/Download_CCS#Code_Composer_Studio_Version_6_Downloads

(3)    需要按照相关安装指导进行安装,如下:

Ubuntu 16.04 64bit

Resolve Dependencies

  • sudo apt-get update
  • sudo apt-get install libc6:i386 libx11-6:i386 libasound2:i386 libatk1.0-0:i386 libcairo2:i386 libcups2:i386 libdbus-glib-1-2:i386 libgconf-2-4:i386 libgcrypt20:i386 libgdk-pixbuf2.0-0:i386 libgtk-3-0:i386 libice6:i386 libncurses5:i386 libsm6:i386 liborbit2:i386 libudev1:i386 libusb-0.1-4:i386 libstdc++6:i386 libxt6:i386 libxtst6:i386 libgnomeui-0:i386 libusb-1.0-0-dev:i386 libcanberra-gtk-module:i386 gtk2-engines-murrine:i386 unzip

Note: the libgcrypt11 library is not supplied with Ubuntu 16.04 anymore. In this case, please check this blog post for details on how to install it in your system.

Install CCS

  • ./ccs_setup_6.x.x.xxxxx.bin (replace the x.x.xxxxx with the version number of your installer executable).
    • If the installer does not even start, please make sure to install all the dependencies above before attempting to run it.
    • If the install fails, you may need to unset the environment variable JAVA_TOOL_OPTIONS and try again, as mentioned in this support thread
    • Complains about libudev.so.0 missing
      • One workaround is mentioned in this blog post
      • Another suggestion is to run this command: sudo ln -s /lib/i386-linux-gnu/libudev.so.1 /lib/libudev.so.0

Install Drivers

  • Go to the /ccsv6/install_scripts folder
  • sudo ./install_drivers.sh

安装好后运行相关命令查看如下:

 

三、编译、建立目标调试环境

1、 编译Uboot、SPL代码

(1)参考创龙光盘资料《1-6.U-Boot编译方法》或SDK相关指导

(2)编译完成后在Uboot根目录下生成相关文件如下:

 

(3)注意:SPL编译后的u-boot-spl.bin和u-boot-spl文件在/SPL目录下,可以将u-boot-spl拷贝到UBOOT根目录下,此步骤在调试SPL时有用,后续会说明。

2、  建立仿真环境

(1)引入uboot工程

(2)挂接仿真器Spectrum Digital XDS560V2 STM USB Emulator,建立debug目标

相关步骤可参考:

http://processors.wiki.ti.com/index.php/Sitara_Linux_Training:_uboot_linux_debug_with_ccsv5

注意下图中导入代码时的提示(important)部分

 

倒入uboot代码,建立调试配置文件如下:

 

 

 

四、  调试SPL

(1)连接目标:右键点击配置文件,右键菜单中选择Launch SelectedConfiguration,连接成功后,可以得到下图

 

 

(2)  此时,PC 和仿真器以及仿真器和SOC的JTAG连接成功,但是ARM core还没有连上。从图中可以看到,有多个core的配置选项,由于U-Boot/SPL,Linux 运行在ARM coretex-A8 core上,这里只关注ARM core。在Debug窗口中,右键点击CortxA8 core, 选择Connect Target. 连接成功后,如下图所示:

 

 

(3)选择hradware reset,得到结果如下图:

 

 

在开始调试SPL之前,是需要设置Cortex-A8 core到ARM状态。ARM core 启动后,默认在Thumb(16bit)模式下,需要将其切换到ARM(32bit)下。具体做法是,View->Registers, 展开CPSR寄存器,把T位设置为0。或者采用hradware reset‘’

 

(4)  LOAD 二进制文件:

     Click Tools -> Load Memory

     选择加载的地址。由于加载的U-Boot-spl.bin是RAW data,所以需要指定loadaddress,这个地址就是SPL的入口地址,对于AM335x,SPL的入口地址是0x402F0400,对应的宏定义为CONFIG_SPL_TEXT_BASE。如下图所示:

 

(5)倒入symbols

  • Click Run -> Load -> Load Symbols...

需要注意的是:需要选择之前拷贝到UBOOT源码根目录下的u-boot-spl,若是选择的是/spl目录下的u-boot-spl,则调试时会找不到相关文件或代码原因待定。

如下图操作:

 

注意:选择的ELF文件的路径

(6)开始调试

倒入symbols后的debug窗口如下:

 

可以看到起始位置在0x402f0400.可以在C函数中设置断点,如下所示:

 

设置好断点后,点击green run按钮运行SPL,会看到运行至断点处

 

在这时可用工具栏的单步执行按钮进行单步执行操作。

至此,SPL阶段的调试环境搭建完成。

 

五、  调试UBOOT

总体来说, U-Boot的调试过程和SPL调试过程是类似的,这里主要说明不同的几点:

A.   从AM335x的启动过程可知,U-Boot是运行在DDR中的,而DDR是由SPL来初始化的,SPL还会初始化相关底层功能。所以,加载U-Boot前,先加载并运行SPL。

B.   此版本的UBOOT使用了FDT(扁平设备树文件)。编译后的文件意义如下

 

 

 所以我们需要导入u-boot.bin文件,此文件包含了uboot和.dtb所有信息。这是和不使用设备树的uboot的调试不同之处。

C.   UBOOT代码执行过程中会有重定位操作,在board_init_f和board_init_f之间的relocate_code中实现。这个版本中的relocaddr= 0x8FF57000。为了能够调试重定位前、后的两部分代码。在LOAD symbols时,通过offset来区分。

 

1、调试relocation之前的 UBOOT代码

(1)加载U-Boot-spl.bin

(2)运行U-Boot-spl.bin之后立刻停住,如下所示

 

 

(3)加载u-boot.bin,start address: CONFIG_SYS_TEXT_BASE          0x80800000

 

 

(4)load symbols->u-boot

 

 

加载完成后界面如下:

 

 

可以看到起始地址是0x80800000,还可以看到相应的源文件vectors.s

(5)设置断点

找到重定位前的C函数board_init_f,打断点,如下;

 

 

点击运行后看到停在断点处,如下图所示:

 

 

(6)单步调试执行

  至此,可以单步执行相应的代码调试。

注意:这样就可以调试relocate_code之前的代码。

 

2、调试relocation之后的 UBOOT代码

参考relocation之前的调试方法,relocation之后的 UBOOT代码调试在第(4)步有区别,之前(1)(2)(3)步一样,体现为加载symbols时有offset,offset这里为relocaddr   = 0x8FF57000。

如下图所示:

(4)load symbols->u-boot

 

 

加载之后界面如下:

 

 

与relocation之前的调试步骤对比,在这时并不能看到相应的源码或文件,我的理解是因为在此时符号表被加载到了0x8FF57000,固在0x80800000看不到相应代码(symbols)。不过没关系,这里我们只是为了调试relocation之后的代码。

(5)设置断点

在board_init_r 函数中打断点

 

 

点击运行,会看到代码停在断点处。如下图所示:

 

 

此时,就可以通过单步运行来进行相关代码调试。

注意:在SPL和UBOOT调试阶段时,设置断点及仿真时的技巧和方法还需进一步摸索。也可参考TI相关说明,比如:

 

 

六、  总结

之前查看网上相关资料,发现基于CCS调试UBOOT的文章也有详细的步骤讲解,但是由于SDK版本的差别。在一些方面有差异,如编译过程,UBOOT外设初始化方式,是否使用设备树及DM等。固基于此版本进行相关总结,时间紧迫,论证并不充分,要是有不正确之处,欢迎指正。同时也会在后期不断完善补充各种发现的问题。