uboot调试指南
- 格式:docx
- 大小:5.54 MB
- 文档页数:15
uboot 调式方法U-Boot调试方法U-Boot是一个开源的嵌入式系统引导加载程序,广泛应用于各种嵌入式设备中。
在开发嵌入式系统时,经常需要对U-Boot进行调试来解决问题或改进功能。
本文将介绍一些常用的U-Boot调试方法,帮助开发人员有效地进行调试工作。
一、串口调试串口调试是最常用的U-Boot调试方法之一。
通过串口调试,可以在开发板和主机之间建立一个串口通信通道,实时显示和获取U-Boot的调试信息。
1. 连接串口需要将开发板的串口和主机的串口进行连接。
一般来说,开发板会提供一个或多个串口接口,可以通过连接线将其与主机的串口接口相连。
2. 配置串口参数在主机上,需要打开一个串口终端程序,如minicom或PuTTY。
然后,设置串口参数,包括波特率、数据位、停止位等。
这些参数需要与U-Boot的配置相匹配,一般来说,U-Boot的默认串口配置为115200 bps、8数据位、1停止位、无校验位。
3. 启动开发板将开发板连接到主机后,可以通过重启或上电的方式启动开发板。
在开发板上电后,U-Boot会自动输出调试信息到串口终端程序。
4. 查看调试信息在串口终端程序中,可以实时查看U-Boot的调试信息。
这些信息包括启动过程中的各种状态、引导加载程序的执行过程以及命令行的输入输出等。
二、JTAG调试JTAG调试是另一种常用的U-Boot调试方法。
通过JTAG调试,可以在硬件级别上对U-Boot进行调试,实时监控和修改寄存器的值、查看内存数据等。
1. 连接JTAG调试器需要将JTAG调试器连接到开发板上的JTAG接口。
JTAG调试器一般会提供相应的连接线和插头,可以将其与开发板的JTAG接口相连。
2. 配置调试环境在主机上,需要安装相应的JTAG调试工具,如OpenOCD或J-Link等。
然后,配置调试环境,包括连接调试器、选择目标设备等。
3. 启动调试会话配置好调试环境后,可以启动一个JTAG调试会话。
【转】U-Boot没有串口打印信息调试u boot假如U-Boot没有任何串口打印信息,手头又没有硬件调试工具,那样怎么知道U-Boot执行到什么地方了呢?可以通过开发板上的LED指示灯判断。
开发板上最好设计安装八段数码管等LED,可以用来显示数字或者数字位。
U-Boot可以定义函数show_boot_progress (int status),用来指示当前启动进度。
在include/common.h头文件中声明这个函数。
#ifdef CONFIG_SHOW_BOOT_PROGRESSvoid show_boot_progress (int status);#endifCONFIG_SHOW_BOOT_PROGRESS是需要定义的。
这个在板子配置的头文件中定义。
CSB226开发板对这项功能有完整实现,可以参考。
在头文件include/configs/csb226.h中,有下列一行。
#define CONFIG_SHOW_BOOT_PROGRESS 1函数show_boot_progress (int status)的实现跟开发板关系密切,所以一般在board目录下的文件中实现。
看一下CSB226在board/csb226/csb226.c中的实现函数。
/** 设置CSB226板的0、1、2三个指示灯的开关状态* csb226_set_led: - switch LEDs on or off* @param led: LED to switch (0,1,2)* @param state: switch on (1) or off (0)*/void csb226_set_led(int led, int state){switch(led) {case 0: if (state==1) {GPCR0 |= CSB226_USER_LED0; } else if (state==0) {GPSR0 |= CSB226_USER_LED0; }break;case 1: if (state==1) {GPCR0 |= CSB226_USER_LED1; } else if (state==0) {GPSR0 |= CSB226_USER_LED1; }break;case 2: if (state==1) {GPCR0 |= CSB226_USER_LED2; } else if (state==0) {GPSR0 |= CSB226_USER_LED2;}break;}return;}/** 显示启动进度函数,在比较重要的阶段,设置三个灯为亮的状态(1, 5, 15)*/void show_boot_progress (int status){switch(status) {case 1: csb226_set_led(0,1); break;case 5: csb226_set_led(1,1); break;case 15: csb226_set_led(2,1); break;}return;}这样,在U-Boot启动过程中就可以通过show_boot_progresss指示执行进度。
CodeWarrior+USBTAP调试U-Boot2010-07-15 15:55:50分类:LINUX!# U-Boot 编译调试 ## 请参考Pro_&_Linux_App_Edition_Targeting_Manual.chm./ltib ## install ltib$ ./ltib -p u-boot -m prep ## get U-Boot source$ cd rpm/BUILD/u-boot-1.1.3$ vim config.mkDBGFLAGS = -g2 -gdwarf-2AFLAGS_DEBUG = -Wa,-gdwarf2OPTFLAGS = -O1$ vim u-boot-1.1.3/lib_ppc/board.c ## line624: debug => printfdebug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr);=> printf ("Now running in RAM - U-Boot at: %08lx\n", dest_addr);$ make ## 编译,最好用 ./ltib -p u-boot -m scbuild注意: 用ltib 编译,要修改confing/platform/mpc8349itx/.config中CLFAGS参数编译常用(make distclean ; make MPC8349ITX_config ; make )启动linux samba服务,将u-boot目录做共享目录由windows访问在windows上访问uboot共享目录,打开后右键点击共享目录,映射为磁盘驱动器z启动CodeWarrior IDE,@ IDE: File > Open , find and open ELF file: u-boot , click OK@ IDE: Choose Debugger : CodeWarrior USB TAP , click OK按照提示选择添加缺少的文件start.S(前提是将源码完全复制),其余会自动添加,不能自动添加的,手动添加。
uboot dm-gpio使用方法以及工作流程1. 引言1.1 介绍【引言】uboot dm-gpio是uboot中的一个驱动模块,用于控制板上的GPIO(General Purpose Input/Output)引脚。
GPIO引脚在嵌入式系统中起着非常重要的作用,可以用于控制外设、传输数据、进行通信等功能。
uboot dm-gpio模块可以帮助开发人员在bootloader阶段对GPIO进行操作,这在嵌入式系统的启动过程中是非常关键的。
本篇文章将介绍uboot dm-gpio的概述、使用方法、工作流程以及示例和注意事项。
读者可以通过学习本文了解如何在uboot中使用dm-gpio模块来控制GPIO,并且掌握一些使用上的注意事项,从而更好地应用于自己的嵌入式系统开发中。
1.2 背景在嵌入式系统开发中,GPIO(General Purpose Input/Output)是一种非常常用的接口,用于控制外部设备和传感器。
在嵌入式系统中,引导加载程序(Bootloader)的选择至关重要,因为它负责初始化硬件设备和加载操作系统。
U-Boot是一种常用的开源引导加载程序,它支持多种处理器架构和嵌入式设备。
随着U-Boot的不断发展,新的GPIO框架被引入,称为`dm-gpio`,它提供了更强大和灵活的GPIO控制接口。
`dm-gpio`通过设备模型(Device Model)的方式管理GPIO设备,使得开发者可以更方便地管理和控制GPIO。
在使用`dm-gpio`之前,开发者需要了解其概念、使用方法和工作流程,以确保正确地配置和操作GPIO接口。
本文将介绍`dm-gpio`的概念、使用方法和工作流程,同时给出一个示例来演示如何在U-Boot中使用`dm-gpio`来控制GPIO。
我们还会提供一些注意事项,帮助开发者避免常见的问题和错误。
2. 正文2.1 uboot dm-gpio概述在U-Boot中,dm-gpio是一个设备模型中的GPIO控制器,用于控制通用输入输出端口。
凌FL2440超详细U-BOOT作业(UBoot介绍+H-jtag使用+Uboot使用)Bootloader是高端嵌入式系统开发不可或缺的部分。
它是在操作系统内核启动之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
现在主流的bootloader有U-BOOT、vivi、Eboot等。
本次作业先做Uboot的烧写吧。
希望通过这个帖子,能让更多的初学者朋友了解一些UBoot的知识,也希望高手朋友对我的不足予以斧正。
首先说一下什么是Uboot:U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FAD SROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linu x系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。
这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
IPC搜索升级工具客户使用说明书武汉富视安智能科技有限公司2022年8月1.运行工具Upgrade.exe2.工具主界面如下图(最新版工具20211215)设备状态显示未就绪:浅蓝色高亮未授权:红色高亮UBoot模式下:黄色高亮点击【搜索】,将搜索出局域网内在线设备;勾选/不勾选【全选】,将全选/全不选搜索到的所有在线设备;点击【系统配置】设置语言和搜索时间;选中设备,点击鼠标右键“预览单通道”或“一键预览”或双击IPC索引通道,可预览实时画面;注:状态为正常,IPC处于正常工作状态,此时能够通过IP地址进入IE网页。
状态为未就绪,此时不能通过IP地址进入IE网页,通常是IPC处于正在重启。
当电脑未关闭防火墙时,IPC搜索升级工具也会大批量显示状态为未就绪,应该关闭电脑防火墙,再搜索。
选中设备,点击鼠标右键“修改”,可修改设备IP地址;查看二维码功能需要IPC支持手机APP才能显示二维码,使用APP 扫描二维码即可添加;3.工具模块—常用功能区【一键预览】:勾选设备,开启设备实时预览界面启动UBoot模式:IPC启动UBoot模式升级UBoot包(单击后会变为关闭UBoot模式按钮)关闭UBoot模式:IPC关闭UBoot模式(UBoot升级完成后需要关闭UBoot模式)开启Telnetd:IPC开启Telnetd功能,进入调试模式。
关闭Telnetd:IPC关闭Telnetd功能。
【恢复默认】:根据需要选择旧版本恢复默认(针对之前老固件版本的恢复默认)恢复默认界面按电脑键盘ctrl+shift+alt键会新增{工厂级恢复默认},工厂级恢复默认,会删除IPC锁定的参数恢复默认尽量不要勾选网络参数,以免恢复为192.168.1.188,与当前局域网其他设备混淆,引起冲突。
【灯板参数】:设置IPC灯板类型、模式、亮度、日夜切换、红外是否收光、Ircut正反向;在全选栏中设置需要修改的参数然后下方点击修改,刷新验证是否修改成功【编码设置】:设置IPC的主子码流分辨率,编码类型,定/变码率,H264/265、图像质量在全选栏中设置需要修改的参数,然后下方点击修改,刷新验证是否修改成功【启用UBOOT模式】:作为设备IPC升级的一种模式,详细使用方法见本文档第6部分。
UBOOTPHY驱动分析及调试⽅法UBOOT版本:2017.11⼀、PHY 简介M edia I ndependent I nterface ( MII ),介质独⽴接⼝,起初是定义 100M 以太⽹(Fast Ethernet)的MAC层与PHY 芯⽚之间的传输标准。
MAC 与 PHY 之间的 MII 连接可以是可插拔的连接器,或者是同⼀块 PCB 上 MAC 与 PHY 之间的⾛线。
MDIO与MDCLK是 MII 接⼝的⼀部分,⼆者可称为SMI (Serial Management Interface) 串⾏管理接⼝,⽤于在 MAC 和 PHY 之间传递配置信息。
在 MDIO 规范中定义 PHY 地址为5 bit,即同⼀组MDIO最多可配置 2^5 = 32个 PHY。
MII 接⼝图如下所⽰:能够和MII相提并论的还有RMII(精简MII)、SMII(串⾏MII)、GMII(千兆MII)、RGMII(精简GMII)等接⼝,它们与普通MII相⽐较,仅是传输速率与数据传输⽅式不同等,这⾥不做过多的介绍。
⼆、PHY 设备创建及驱动匹配以 rockchip 为例,当它的 mac 驱动 gmac_rockchip 成功的被匹配时,会调⽤到 gmac_rockchip_probe ,mac 相关我们不做分析,直接进⼊主题 designware_eth_probe 函数中。
⾸先会获取到对应的 regulator ,并会做⼀些电源配置,1 device_get_supply_regulator(dev, "phy-supply",2 &phy_supply);3 regulator_set_enable(phy_supply, true);UBOOT 中引⼊了 DM 驱动模型,相关的设备与驱动事先已经绑定过,如这⾥通过 phandle 进⽽找出其对应的,驱动在 rk8xx.c 中定义:1 U_BOOT_DRIVER(rk8xx_switch) = {2 .name = "rk8xx_switch",3 .id = UCLASS_REGULATOR,4 .ops = &rk8xx_switch_ops,5 .probe = rk8xx_switch_probe,6 };接下来要初始化 mdio 总线,并将其注册到系统的 mii_devs 中,在获取某个控制器时,即可通过 miiphy_get_dev_by_name 来获取:1 dw_mdio_init(dev->name, dev);2 priv->bus = miiphy_get_dev_by_name(dev->name);电源以及 MDIO 总线已初始化完毕,万事俱备,接下来就正式的对 phy 进⾏操作了,⼀起来看 dw_phy_init 函数:1static int dw_phy_init(struct dw_eth_dev *priv, void *dev)2 {3struct phy_device *phydev;4int mask = 0xffffffff, ret;56 #ifdef CONFIG_PHY_ADDR7 mask = 1 << CONFIG_PHY_ADDR;8#endif910 phydev = phy_find_by_mask(priv->bus, mask, priv->interface);11if (!phydev)12return -ENODEV;1314 phy_connect_dev(phydev, dev);1516 phydev->supported &= PHY_GBIT_FEATURES;17if (priv->max_speed) {18 ret = phy_set_supported(phydev, priv->max_speed);19if (ret)20return ret;21 }22 phydev->advertising = phydev->supported;2324 priv->phydev = phydev;25 phy_config(phydev);2627return0;28 }我们主要来看 phy_find_by_mask ,这⾥是核⼼,其它细节配置不去分析以免喧宾夺主。
uboot fpga命令【最新版】目录1.U-Boot FPGA 命令简介2.U-Boot FPGA 命令的使用方法3.常见 U-Boot FPGA 命令介绍4.总结正文【1.U-Boot FPGA 命令简介】U-Boot FPGA 命令是一种用于配置和控制 FPGA(现场可编程门阵列)设备的命令行工具。
FPGA 是一种集成电路,可以根据需要重新配置硬件逻辑,从而实现不同的功能。
U-Boot FPGA 命令允许用户对 FPGA 设备进行配置、下载和测试等操作,使得开发人员可以更方便地对 FPGA 设备进行开发和调试。
【2.U-Boot FPGA 命令的使用方法】在使用 U-Boot FPGA 命令之前,需要确保用户已经正确连接了 FPGA 设备,并启动了 U-Boot。
接下来,用户可以通过命令行界面输入相应的U-Boot FPGA 命令来对 FPGA 设备进行操作。
一般来说,U-Boot FPGA 命令的使用方法如下:- 首先,输入“fpgacmd”命令,进入 FPGA 命令行界面。
- 然后,根据需要输入相应的命令,例如“fpgainit”命令用于初始化 FPGA 设备,“fpga_download”命令用于下载 FPGA 配置文件等。
- 最后,输入“exit”命令退出 FPGA 命令行界面。
【3.常见 U-Boot FPGA 命令介绍】以下是一些常见的 U-Boot FPGA 命令及其功能:- fpgainit:初始化 FPGA 设备。
- fpga_download:下载 FPGA 配置文件到设备。
- fpga_upload:上传 FPGA 配置文件到设备。
- fpga_reset:重置 FPGA 设备。
- fpga_test:对 FPGA 设备进行测试。
【4.总结】U-Boot FPGA 命令是一种方便实用的工具,它可以帮助开发人员对FPGA 设备进行配置、下载和测试等操作。
1.1 概述TI针对DM6467提供的UBOOT和内核默认都是串口0作为调试串口输出的,但现在我需要使用DM6467的UART0的modem功能,所以修改代码,改变调试串口为串口2。
需要修改的主要有几部分内容:1. UBL 代码(这部分代码在刚上电的时候,初始化CPU和拷贝UBOOT到DDR,打印信息只有很少,所以不做修改)。
2. UBOOT代码。
3. linux内核驱动。
2.1 修改UBOOT代码因为DM6467的串口是符合TL16C550标准的,所以驱动也是使用16550的驱动,默认情况下,我们只需要提供需要配置的串口的基地址和中断号等资源给16550的驱动就可以了,寄存器的配置不需要我们去关心。
要用起DM6467的串口有几个地方的配置一定要注意:1. 引脚复用寄存器(PINMUX0/1);2. VDD3P3V_PWDN寄存器,需要使能UART的相关引脚(bit4~bit9置零)3.CLKCTL,bit24/25置零。
在UBOOT里涉及到上面几个寄存器的配置的是在dm6467_evm.c的初始化部分我的修改如下:1static void davinci_hd_psc_enable ( void )2 {3 unsigned int alwaysonpdnum = 0;45/* Note this function assumes that the Power Domains are alread on */6 REG(PSC_ADDR+0xA00+4*14) |= 0x03; /* EMAC */7 REG(PSC_ADDR+0xA00+4*15) |= 0x03; /* VDCE */8 REG(PSC_ADDR+0xA00+4*16) |= 0x03; /* Video Port */9 REG(PSC_ADDR+0xA00+4*17) |= 0x03; /* Video Port */10 REG(PSC_ADDR+0xA00+4*20) |= 0x03; /* DDR2 */11 REG(PSC_ADDR+0xA00+4*21) |= 0x03; /* EMIFA */12 REG(PSC_ADDR+0xA00+4*26) |= 0x03; /* UART0 */13 REG(PSC_ADDR+0xA00+4*27) |= 0x03; /* UART1 */14 REG(PSC_ADDR+0xA00+4*28) |= 0x03; /* UART2 */15 REG(PSC_ADDR+0xA00+4*31) |= 0x03; /* I2C */16 REG(PSC_ADDR+0xA00+4*33) |= 0x03; /* GPIO */17 REG(PSC_ADDR+0xA00+4*34) |= 0x03; /* TIMER0 */18 REG(PSC_ADDR+0xA00+4*35) |= 0x03; /* TIMER1 */1920/* Set PTCMD.GO to 0x1 to initiate the state transtion for Modules i n21 * the ALWAYSON Power Domain22*/23 REG(PSC_PTCMD) = (1<<alwaysonpdnum);2425/* Wait for PTSTAT.GOSTAT0 to clear to 0x0 */26while(! (((REG(PSC_PTSTAT) >> alwaysonpdnum) & 0x00000001) == 0));2728/* Enable GIO3.3V cells used for EMAC (???) */29 REG(VDD3P3V_PWDN) = (1<<27); //disable clkout03031/* Select UART function on UART0 */32 REG(PINMUX0) &= ~(0x0000003f << 18);34 REG(PINMUX1) = ((1<<4)|(1<<2)|(1<<0));3536/* Enable USB */37 REG(PINMUX0) &= ~(0x80000000);3839/* Set the Bus Priority Register to appropriate value */40 REG(VBPR) = 0x20;41 }接下来还有一个比较重要的地方需要修改,因为DM6467的串口是支持多种模式的,但16550的驱动是默认设备是工作在UART模式的,它没有去配置设备串口的工作模式,所以我们需要去配置一下串口的工作模式。
[uboot](第五章)uboot流程——uboot启动流程/ooonebook/article/details/53070065以下例⼦都以project X项⽬tiny210(s5pv210平台,armv7)为例[uboot] uboot流程系列:建议先看《[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例⼦了解⼀下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运⾏位置,功能。
建议可以和《[uboot] (番外篇)global_data介绍》和《[uboot] (番外篇)uboot relocation介绍》结合起来看。
=================================================================================⼀、uboot说明1、uboot要做的事情CPU初始刚上电的状态。
需要⼩⼼的设置好很多状态,包括cpu状态、中断状态、MMU状态等等。
其次,就是要根据硬件资源进⾏板级的初始化,代码重定向等等。
最后,就是进⼊命令⾏状态,等待处理命令。
在armv7架构的uboot,主要需要做如下事情arch级的初始化关闭中断,设置svc模式禁⽤MMU、TLB关键寄存器的设置,包括时钟、看门狗的寄存器板级的初始化堆栈环境的设置代码重定向之前的板级初始化,包括串⼝、定时器、环境变量、I2C\SPI等等的初始化进⾏代码重定向代码重定向之后的板级初始化,包括板级代码中定义的初始化操作、emmc、nand flash、⽹络、中断等等的初始化。
进⼊命令⾏状态,等待终端输⼊命令以及对命令进⾏处理上述⼯作,也就是uboot流程的核⼼。
2、疑问在前⾯的⽂章中虽然已经说明了,在spl的阶段中已经对arch级进⾏了初始化了,为什么uboot⾥⾯还要对arch再初始化⼀遍?回答:spl对于启动uboot来说并不是必须的,在某些情况下,上电之后uboot可能在ROM上或者flash上开始执⾏⽽并没有使⽤spl。
uboot启动阶段修改启动参数⽅法及分析作者:围补本来启动⽅式这节不是什么复杂的事⼉,不过想简单的说清楚明⽩,还真是不知道怎么组织。
毕竟⽂字跟有声语⾔表达有别。
但愿简单的东西别让我讲的太复杂!Arm板系统⽂件⼀般有三个——bootloader(uboot)、kernel(uImage)及根⽂件系统(rootfs)。
在arm板上电后,按uboot->kernel->rootfs的顺序依次启动。
由于开发板上有多种存储介质,三个⽂件可以放在任何可以存储的介质上,因此也就导致⽂件的多种启动⽅式。
本⽂就来讨论,以上三个⽂件对应不通存放位置的不同启动配置。
⼀般开发板上会有flash(Nor or NAND),mmc,emmc,sd卡等。
系统⽂件可以烧写在其中的任意⼀种上,因此也就对应不通的启动。
在开发过程中,有时经常需要改动内核,或者修改应⽤程序,如果每次都修改后都重新烧写到板上的存储介质,会⽐较⿇烦。
因此,为⽅便调试,uImage和rootfs还可以从⽹络启动,即nfs启动。
但uboot只能从板上介质启动。
启动过程其实是先将要启动的⽂件从存储位置拷贝到内存空间,再在内存中运⾏。
因此所谓不同位置启动,也就是从不同位置拷贝⽽已。
下⾯我们以开发板启动为例,分别介绍三个⽂件从不同位置启动的过程⽅法。
我使⽤的开发板上有emmc和两个sd卡。
我们按照启动顺序,依次介绍。
⾸先是uboot启动。
Uboot是三个系统⽂件中第⼀个启动的,对它的拷贝⼯作由cpu中的固件决定。
固件中⽀持从⼏个位置拷贝uboot,它就能存放在⼏个位置上。
⾄于每次启动具体从其中的哪⾥开始,硬件拨码开关决定,对应拨码在开发板⼿册上能查到。
启动之前,先将uboot的⼆进制⽂件拷贝到对应介质。
有两种不同⽅法烧写,如下:1. uboot⼆进制⽂件拷贝到emmc,是通过芯⽚供应商的下载⼯具软件烧写完成;2. 拷贝到sd卡是在linux下,通过dd命令完成的。
配置GDB调试U-BOOTGDB是什么正像Windows和Linux的对比,集成开发环境比GDB在嵌入式开发领域,拥有更多的用户,但这并不意味的GDB不好。
GDB(GNU Project Debugger)是开源软件组织GNU开发和维护的一种调试工具,它能调试目前所有的能跑Linux的CPU,当然ARM也是其中一员。
对于初学者来说,不建议使用GDB,还是先从集成开发环境入手,例如ADS、SDT、Keil、IAR之类的。
其实从编译器的层面来讲,集成开发环境和GDB所用的编译器GCC没有什么区别,但集成开发环境里面提供了源文件组织与浏览、工程文件管理、调试等多种功能,用起来很友好。
GCC+GDB光学习写相当于工程文件的Makefile就要花很多的时间。
但是,一旦你的学习进了一步到了Linux的Loader和内核,集成开发环境就无能为力了。
前面已经提到了,本文覆盖了从刚开始的裸奔代码到涉足操作系统的GCC+GDB调试环境的建立方法。
本文关于GDB的部分应该是国内挺难找到的HOWTO,转载请注明来自EE 小站。
关于GDB,可以参考下我之前的这篇文章/blog/cns!4201FDC93932DDAF!268.entry。
在开始之前请先确认你的电脑有并口,如果是笔记本就算了,买个PCMIA转并口的卡的钱够买个盗版U-Link了;要是肯下血本买盗版J-Link,那就看我以后写的文章。
∙首先说代码裸奔怎么做你需要的东西有:● 带并口的电脑一台● 并口延长线一根● Wiggler一个● 随便什么ARM7或ARM9的开发板一个如果没有并口延长线,可以去电脑城买一根。
如果没有Wiggler,你可以选择DIY,下面这张图是Wiggler的一种版本:如果不想DIY,上淘宝淘一个去。
ARM开发板也可以在淘宝上淘淘,看你的经济能力了。
你需要的软件有:● ADS (ARM Developer Suite) V1.2● H-JtagADS在一般学校的FTP上都有,H-JTAG请访问。
基于AM335x的U-Boot/SPL 的CCS 调试在基于Linux的AM335x软件开发流程中,第一步就是U-Boot/SPL (Second Program Loader)的移植。
在移植中遇到问题比较常见,而U-Boot/SPL的调试手段比较简陋,不便于迅速找到问题。
利用仿真器可以单步调试的特点,就可以迅速定位到出问题的代码所在位置,加速移植的调试过程。
本文主要介绍如何用CCS+emulator调试基于AM335x的U-Boot/SPL。
1.AM335x Linux启动过程以及U-Boot/SPL调试代码的准备1.1 AM335x Linux的启动过程AM335x Linux的启动主要包括ROM,SPL, U-Boot 和kernel四个启动步骤:A.ROM codeROM code是固化在芯片内部的代码,当上电时序正确,而且晶振等芯片启动所需的条件都具备时,AM335x会从ROM code开始运行。
ROM code首先会读取sys_boot引脚上的配置,以确定存放SPL的存储器,或者可以获取SPL的外设。
具体可以参考AM335x 中的第26章Initialization。
ROM code会从相应的地方读取/获取SPL,并运行SPL。
B.SPLSPL和U-Boot 是bootloader的两个阶段。
这里分为两个阶段的原因是, ROM code中不会配置DDR,时钟等最小系统,所以ROM code只能把bootloader加载到片上SRAM中,而片上SRAM对成本影响很大,所以通常很小,例如在AM335x上只有64K,不足够放下整个U-Boot,所以将U-Boot分成两部分,SPL和U-Boot。
SPL主要的职责就是初始化DDR,时钟等最小系统,以读取U-Boot,并加载到DDR中。
具体来看,SPL 由ROM code加载到片上SRAM的起始位置,也就是0x402F0400。
SPL会进一步对芯片进行配置,主要包括以下几个方面以完成其主要职责:a.配置ARM core。
uboot 编译流程Uboot是一款开源的嵌入式系统引导程序,它是Linux系统启动的第一步,负责初始化硬件设备、加载内核镜像和设备树等操作。
本文将介绍Uboot的编译流程,帮助读者了解Uboot的构建过程。
一、准备工作在开始编译Uboot之前,需要先准备好交叉编译工具链和Uboot 源代码。
交叉编译工具链是用于在主机上编译嵌入式系统的工具,它能够生成适用于目标平台的可执行文件。
Uboot源代码可以从官方网站或Github上下载,也可以从开发板厂商提供的SDK中获取。
二、配置编译环境在开始编译Uboot之前,需要先配置编译环境。
首先需要设置交叉编译工具链的路径,可以通过export命令设置环境变量,例如:export CROSS_COMPILE=arm-linux-gnueabihf-接着需要配置Uboot的编译选项,可以通过make menuconfig命令进入配置界面,选择需要编译的功能和驱动程序。
在配置完成后,需要保存配置并退出。
三、编译Uboot在配置完成后,可以通过make命令编译Uboot。
编译过程中会生成一系列的中间文件和最终的可执行文件。
编译完成后,可以通过make install命令将Uboot烧录到目标设备中。
四、调试Uboot在Uboot编译完成后,需要进行调试和测试。
可以通过串口连接目标设备,使用minicom或者putty等终端工具进行调试。
在调试过程中,可以查看Uboot的启动日志和调试信息,以便发现和解决问题。
五、Uboot的更新和升级在使用Uboot的过程中,可能需要对Uboot进行更新和升级。
可以通过tftp或者nfs等方式将新的Uboot镜像下载到目标设备中,然后使用Uboot的命令进行更新和升级。
在更新和升级过程中,需要注意备份原有的Uboot镜像,以防止出现问题。
六、总结Uboot是嵌入式系统启动的重要组成部分,它的编译和调试对于嵌入式系统的开发和调试至关重要。
AMLOGIC8726M MBX编译调试指南1、安装UBUNTU操作系统。
如安装UBUNTU虚拟机可参考:/Linux/2010-04/25829.htm2、安装编译器如果是Ubuntu Linux (32-bit x86):$ sudo apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev如果是Ubuntu Linux (64-bit x86):$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl sun-java6-jdk zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libsx11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev配置JAVA编译环境(方法自己上网查询)编译器安装可参考下面网页:/wiki/index.php/Arm/Android/source/download.html3、编译ROOTFS$ cd ~/mydroid$ source build/envsetup.sh$ lunch选择12 (c03ref-user)$ make4、编译KERNEL•从下面地址下载GNU TOOLCHAIN/download/linux/ARM/gnutools/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-li nux-gnu.tar.bz2安装交叉编译器$ cd /opt$ sudo tar jxvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2配置交叉编译器$ cd kernel$ gedit env.sh修改路径export CROSS_COMPILE=/opt/arm-2010q1/bin/arm-none-linux-gnueabi-$ . env.sh编译uImage选择板子对应的kernel配置文件:$ make help如原理图为MBX版本选择meson_refc03_defconfig$ make meson_refc03_defconfig$ make menuconfigenable General setup->Initial RAM filesystem and RAM diskset "Initramfs source file" to root dir(../out/target/product/c03ef/root)$ make uImage$ cp ./arch/arm/boot/uImage ../out/target/product/c03ref/编译uImage_recovery选择recovery的kernel配置$ make help选择meson_refc03_recovery_defconfig$ make meson_refc03_recovery_defconfig$ make menuconfigset General setup->"Initramfs source file" to recovery root dir(../out/target/product/c03ref/recovery/root)$ make uImage$ cp ./arch/arm/boot/uImage ../out/target/product/c03ref/uImage_recovery5、编译update.zip升级包文件$ cd ~/mydroid$source build/envsetup.sh$ lunch选择12 (c03ref-user)$ make otapackage6、编译uboot选择uboot路径选择板子对应的uboot配置$ make help如果原理图对应的是MBX版本,选择:$make m1_dvbc_config$make即可得到编译的uboot文件(文件夹build目录下的u-boot-aml-ucl.bin文件)7、制作烧录SPI的SPI.BIN文件。
Uboot调试参考指南
一、调试目的
Uboot的调试旨在通过观察uboot运行时状态来测试硬件问题。
二、调试步骤
1.修改代码
在uboot代码路径下,编辑uboot代码,需要做以下修改;
a.修改config.mk文件,添加以下两行内容:
AFLAGS += -Wa,-gdwarf2
CFLAGS += -g2 -gdwarf-2
b.修改. /arch/powerpc/lib/board.c文件
debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
printf("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
将debug改为printf,如上所示。
2.编译uboot
执行make BSC9131RDB_SYSCLK100_NAND,编译uboot
3.将编译好的u-boot-nand.bin(uboot image格式)及u-boot(elf格式文件)文件拷
贝出来
4.烧录uboot
将步骤3中保存的u-boot-nand.bin烧录到目标板中,烧录过程略。
5.建立工程
a.在cw界面,点击file->import, 选择code warrior -> Power architecture ELF
executable,如图1所示:
图1 建立elf工程
b.选择步骤3中保存的u-boot(elf格式文件),toolchain选择bareboard application,
target OS选择none,工程名字请根据需要设置,比如我的机器上设置为example,
点击next,如图2所示:
图2 载入elf文件c.选择处理器,9131,如图3所示
图3 选择处理器d.选择调试链接使用硬件,如图4所示
图4 选择调试链接使用硬件
e.配置硬件连接特性,图5所示
图5 配置工程连接特性
f.完成工程创建
6.匹配源代码
Uboot调试工程创建完成后,通过在修改uboot代码编译的uboot elf文件中已经包含符号表信息,其对应的源代码信息已经包含着elf文件中,因为我们的uboot编译是在linux服务器上执行,而cw的调试是在Windows机器上,因此,需要将uboot elf中的代码信息链接到windows的代码中。
A.指定某一个文件的连接关系,后续的连接都会自动对应起来;
图6 配置源代码映射
B.若双击其中某个文件显示找不到源代码,则指定源代码即可
7.编辑连接/调试
A.启动configuration配置,点击run->debug configuration,如图7所示
图7 配置调试
B.选择codewarrior attach进行配置,如图8所示
图8 配置cw attach
C.配置连接,选择连接,new,选择硬件或软件模拟器连接,选择PA,
BSC9131RDB->ROM,选择BSC9131RDB-core0_ROM_BSC9131PA NAND u-boot 32 all stage,如图9所示:
图9 配置硬件或者模拟器连接
D.在目标行,选择new目标,选择硬件或者软件模拟器连接->PA,选择9131,如
图10所示
图10 配置目标
E.点击next,选择初始化目标
${PA_TOOLS_HOME}/PA_Support/Initialization_Files/Qonverge/BSC9131RDB_uboo t_32.tcl,如图11所示
图11 选择初始化目标
F.选择内存初始化目标,点击内存选项卡,选择内存配置
BSC9131RDB_uboot_32_NAND.mem,如图12所示
图12 选择内存配置
G.点击finish,完成配置
H.在cw attach配置界面,在main选项卡中点击apply,应用配置
I.配置debugger备用加载地址,点击debugger选项卡,点击PIC选项卡,进行备
用加载地址配置,如图13所示:
图13 配置备用加载地址
J.填入0xfffff000,点击apply,点击debug,如图14所示,即可调试uboot启动第一阶段
图14 启动调试
K.执行上一步骤后调试界面出现,如图15所示,调试界面
图15 启动调试界面
L.点击复位按钮,在弹出的服务对话框中,确定初始化目标为BSC9131RDB_uboot_32.tcl,如图16所示
图16 执行复位
M.复位后即可执行单步调试,如图17所示
图17 执行服务后调试界面N.执行单步跟踪,可以调试start.S代码,如图17所示
图17 调试uboot启动第一阶段
三、调试阶段
Uboot的调试从内存布局的视图可以分为四个主要阶段:
1.Flash内执行阶段
2.使能MMU并在flash内执行
3.使能MMU并relocate到内存阶段
4.内存运行阶段
Uboot不同阶段的调试工程建立,连接建立的过程基本一致,不同之处是PIC的设置;
四、后续阶段调试
在第二部分建立的工程中已经可以调试第一阶段uboot,当单步执行到无法对应C代码时,即显示no source available for 0x****时,说明代码已经执行到第二阶段,如图18所示,需要进行第二阶段调试的配置;
图18 第二阶段开始
1.点击主菜单Windows->show view->debug shell,如图19所示
图19 调出debug shell窗口
2.在开始的debug shell中输入命令setpicloadaddr 0xff801000,如图20所示,则即可对
应C代码继续单步执行:
图20 设置第二阶段pic offset
3.继续单步调试,可以在汇编语言或者c语言出设置断点,继续执行;
4.当发生no source available for 0x*****时,说明已经进入uboot启动第三阶段,此时
如图21所示;
图20 uboot调试进入第三阶段
5.在debug shell窗口中设置setpicloadaddr 0xff800000,如图21所示
图21 设置第三阶段的pic offset
6.继续调试,当进入第四阶段运行时,在debug shell中输入setpicloadaddr 0x36f30000,
即可继续进行调试。
五、各阶段PIC offset的确定
1.启动阶段pic offset的确定
系统启动后,pc指针会指向0xfffffffc的地址执行,此地址上是一条跳转指令,会跳
转到0xfffff000地址执行。
如图22所示,此地址即为uboot的加载地址,因此需要
设置uboot pic offset为0xfffff000地址;
图22 第一阶段pic offset地址确定
2.第二阶段pic offset地址的确定
第二阶段与第三阶段的pic offset地址确定都是通过查看代码的方式来确定的。
将disassembly窗口向上滚动,发现到代码起始处地址即为当前阶段pic offset地址,如图22,图23所示:
图22 第二阶段pic offset地址确定
图23 第三阶段启动pic便宜地址确定
3.第四阶段pic offset地址的确定:
a)修改将uboot代码arch/powerpc/lib/board.c,将其中debug("Now running in
RAM - U-Boot at: %08lx\n", dest_addr);修改为printf输出;
b)在uboot启动过程中,查看串口输入,如图24所示,记下地址,即为ram运
行后的pic 偏移地址。
图24 第四阶段pic offset的确定
六、调试过程中其他需要注意的问题
1.注意代码的匹配,生成elf即uboot-nand.bin的代码为同一份代码,此特性在编译
时已经保证,无需赘述,但是往往windows调试环境上的代码与生成uboot的代码
不严格匹配,将导致软件调试时代码不匹配。
2.调试时需要初始化,即调试开始后往往需要按下reset按钮,才能如我所愿的进行
单步调试
3.Pic offset的确定,不同阶段的确定方法不同,而freescale并没有提供第一、第二、
第三阶段的确定方式,此方法非官方,不过在我的机器上可以调试工作。
4.调试过程中寄存器、内存、断点等调试方法不再赘述。