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

使用CCS调试基于AM335X的SPL、Uboot(原创)的更多相关文章

  1. 基于335X平台的UBOOT中交换芯片驱动移植

    基于335X平台的UBOOT中交换芯片驱动移植 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3 ...

  2. am335x UART1输入u-boot 调试信息代码修改

    AM335x 调试信息UART1输出代码修改1. 关于pin_mux  的配置代码修改位置:/board/forlinx/ok335x/mux.c void enable_uart0_pin_mux( ...

  3. am335x system upgrade uboot ethernet(二)

    系统可以通过SD卡引道之后,为了之后了调试方便 通过查看网卡的硬件设计 正常来说需要注意的有如下几点: 1) 网口 的接线方式: RMII 2) 网口的PHY地址两张网口,这里我们只需先初始化一张网卡 ...

  4. am335x system upgrade uboot nand boot(三)

    在uboot 下初始化nand,一般需要做如下工作: 第一: 配置默认从NAND boot Index: include/configs/am335x_evm.h=================== ...

  5. am335x system upgrade uboot sd boot(一)

    由于上层应用的需求,需要运行arm docker,在kernel3.2上面还不支持,且编译器的glibc版本比较低的问题,故需要做系统升级 新的内核4.14.40驱动开发和以往有很大的不同,关键在于d ...

  6. 基于AM335X,如何搭建优良的Linux开发环境(下)

    接着上一篇文章的Linux开发环境搭建,文章中详细讲解了 VMware14.1.1虚拟机安装.基于虚拟机安装Ubuntu14.04.3操作系统.安装Ubuntu14.04.3操作系统.安装虚拟机工具. ...

  7. 驱动开发学习笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统

    驱动开发读书笔记. 0.02 基于EASYARM-IMX283 怎么烧写自己裁剪的linux内核?(非所有arm9通用) 手上有一块tq2440,但是不知道什么原因,没有办法烧boot进norflas ...

  8. 使用Visual Studio Code调试基于ActionScript的LayaAir HTML5游戏

    使用Visual Studio Code(VS Code)调试的优势 使用VS Code我们可以极大地提高LayaAir Html5游戏项目的调试效率,VS Code的优势有以下几点: 在发生Java ...

  9. CCS调试教程

    包括CCS3.3和CCS5.5两个版本的调试教程. CCS3.3 3.3教程来自http://zhujlhome.blog.163.com/blog/static/205621092201261032 ...

随机推荐

  1. Java之动手动脑(三)

    日期:2018.10.12 星期五 博客期:017 这次留了两个动手动脑作业!我需要一个一个来说!先说第一个吧! Part 1 :随机生成1000个随机数 代码: //以下为 RandomMaker. ...

  2. embed标签详解

    HTML-embed标签详解 Embed(一).基本语法:embed src=url说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等,      Net ...

  3. hdu1540 区间合并+询问某点的最大连续块

    询问操作需要搞一下 今天被区间合并降智了 /* D a: 摧毁第a个点 Q a:询问a所在的点的块大小 R :修复最后被破坏的点 对于所有的点需要进行一次更新 更新比较容易,tag用来表示区间是否是完 ...

  4. cf1107e uva10559区间dp升维

    /* 区间dp,为什么要升维? 因为若用dp[l][r]表示消去dp[l][r]的最大的分,那么显然状态转移方程dp[l][r]=max{dp[l+1][k-1]+(len[l]+len[k])^2+ ...

  5. add web server(nginx)

    #!/bin/bash # # Web Server Install Script # Last Updated 2012.09.24 # ##### modify by WanJie 2012.09 ...

  6. JMeter 如何把上一个请求的结果作为下一个请求的参数 —— 使用正则提取器

    有这样一个压力测试环境,有一个上传页面,上传成功之后服务器会返回一些上传信息(比如文件的 id 或者保存路径之类的信息),然后压力机会继续下一个请求,比如调整 id 为 xx 的文件的一些信息等等.问 ...

  7. spring cloud 使用spring cloud bus自动刷新配置

    Spring Cloud Bus提供了批量刷新配置的机制,它使用轻量级的消息代理(例如RabbitMQ.Kafka等)连接分布式系统的节点,这样就可以通过Spring Cloud Bus广播配置的变化 ...

  8. ZOJ 4057 XOR Clique(位运算)

    XOR Clique BaoBao has a sequence a​1​,a​2,...,a​n. He would like to find a subset S of {1,2,...,n} s ...

  9. GAN-生成对抗网络原理

    最近一直在看GAN,我一直认为只有把博客看了一遍,然后再敲一遍.这样才会有深刻的感悟. GAN(生成式对抗网络)(GAN, Generative Adversarial Networks )是一种深度 ...

  10. react-native 之gradle-2.x-all.zip 下载缓慢或失败

    去官网http://www.gradle.org/downloadshttp://services.gradle.org/distributions下载匹配的 Gradle 版本把zip直接放到C:\ ...