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

  • 相关阅读:
    残缺的字符串
    [BZOJ3513: [MUTC2013]idiots]
    FFT感性瞎扯
    Quartz框架简介
    异常状态码总结
    【SSM】拦截器的原理、实现
    FastDFS实现文件上传下载实战
    分布式文件系统FastDFS设计原理(转)
    FastDFS简介
    【设计模式】观察者模式
  • 原文地址:https://www.cnblogs.com/lh03061238/p/10315327.html
Copyright © 2020-2023  润新知