您的位置:首页 > 其它

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

2019-01-24 16:40 1151 查看

使用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等。固基于此版本进行相关总结,时间紧迫,论证并不充分,要是有不正确之处,欢迎指正。同时也会在后期不断完善补充各种发现的问题。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: