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