首页 > 其他分享 >stm32 uboot调试1--Apple的学习笔记

stm32 uboot调试1--Apple的学习笔记

时间:2023-10-29 22:00:45浏览次数:28  
标签:__ sdram uboot Apple -- debug pll 调试

一,前言

openocd+stlink的vscode远程gdb调试环境搭建完成了,那么用吧,串口也不连接了。用自带的configs/stm32f429-discovery_defconfig进行的编译,然后就直接调试了。

二,问题记录

问题1:board_init_f进入fdt初始化就进入hang。 答:因为fdt是分离的但是我并没有下载到某个地址,于是先配置为嵌入到uboot来解决。

问题2:serial_init初始化一路调用直到configure_clocks函数中,最后while1卡死

/* Enable the SAI PLL */
    setbits_le32(®s->cr, RCC_CR_PLLSAION);
    while (!(readl(®s->cr) & RCC_CR_PLLSAIRDY))

路径中先是串口设备类,然后调用pintrol设备类,最后调用你了clock设备类,问题出在clock,以前用stmF429的代码移植到stmF407,也遇到过clock相关错误,因为429支持180M,407最大支持168M

static const struct stm32_clk_info stm32f4_clk_info = {
    /* 180 MHz */
    .sys_pll_psc = {
        .pll_n = 360,
        .pll_p = 2,
        .pll_q = 8,
        .ahb_psc = AHB_PSC_1,
        .apb1_psc = APB_PSC_4,
        .apb2_psc = APB_PSC_2,
    },
    .has_overdrive = false,
    .v2 = false,
};

于是把.pll_n从360改成336即可让pll设置为168M。修改后依然在此while卡住,于是查手册RCC_CR的bit28~bit31是保留位,所以根本不存在bit29的PLLSAIRDY,所以直接注释掉即可。

问题3:继续全速运行跑,自己跑飞复位,调用了如下reset_cpu。

void bad_mode(void)
{
    panic("Resetting CPU ...\n");
    reset_cpu();
}
 

void do_hard_fault(struct autosave_regs *autosave_regs)
{
    printf("Hard fault\n");
    dump_regs(autosave_regs);
    bad_mode();
}

然后单步调试,就是board_init_f中一个个函数调用,看到reserve_board没正常退出,应该是分配内存的时候挂了。于是想到sdram是否设置正常,看了lib/fdtdec.c中的fdtdec_setup_mem_size_base函数。start地址0x90000000,长度是0x800000。那么应该是用了外部8M sdram。

stm32 uboot调试1--Apple的学习笔记_stm32uboot

但是我的板子不是F429,所以没有外部sdram,怪不得分配内存跑飞了。于是想到一个问题,就是uboot文件到底有多大,我调试的u-boot是带调试信息的所以很大,内部sdram分2块共192K,最大的一块只有112K,地址从0x20000000开始的。通过看到代码,得到信息来源是设备树

memory@90000000 {
		device_type = "memory";
		reg = <0x20000000 0x800000>;
	};

那么我暂时改成

memory@20000000 {
		device_type = "memory";
		reg = <0x20000000 0x1C000>;
	};

顺便再看看哪里配置内存的,看defconfig

CONFIG_SYS_MALLOC_LEN=0x0200000

也就是动态分配空间的大小,从2M改成64K

CONFIG_SYS_MALLOC_LEN=0x10000

调试的时候发现会进入mmu reserve空间,根本不用,所以添加设置

CONFIG_SYS_ICACHE_OFF=y
CONFIG_SYS_DCACHE_OFF=y

继续运行还是这里的问题,其实是非法gd->bd赋值的地址是否非法的。原因是之前仅设置了112K,然后reserve一些size,结果

gd->mon_len = (ulong)&__bss_end - (ulong)_start;

gd->mon_len已经超过了112K。

0x000000000802ad60                __bss_end

可以看到_start不是单单bss的大小,明显uboot设计的是把flash的内容也全部搬运到外部dram中。若我要裁剪,等于要修改uboot源码了,这样会破坏其他开发板的编译,而我目前对代码也不算很熟悉,不清楚删除某些内容是否会造成某些影响。

static int setup_mon_len(void)

{
#if defined(__ARM__) || defined(__MICROBLAZE__)
    gd->mon_len = (ulong)&__bss_end - (ulong)_start;

基于不想大概源码,仅裁剪的原则,所以最后我想到的解决方案是板子有外部sdram的预留,准备买一个外部sdram焊接上,再继续玩。

三,小结

用上了自己的基于openocd+stlink的vscode远程debug环境来调试,蛮好玩的,但是这块relocate地址的设计其实用打印看起来更加快。因为这块的数据流我都知道,之前有详细分析过。但是我的串口线当前连接在了am335x开发板,所以等于无串口,那么debug看变量也很方便,否则我的环境不是白搭了,需要把它用起来,用不同的debug方法来解决问题,也算增强debug技能的刻意练习。

标签:__,sdram,uboot,Apple,--,debug,pll,调试
From: https://blog.51cto.com/AppleCai/8081890

相关文章

  • 11月第一周学习计划(2023/10/29 )
    科目大类学习科目 言语标题填入  态度理解  道理解释  词句理解  提炼关键词 逻辑推理逻辑论证之归因论证 申论分析理解题目 每项需要完成事件1.看完相关网课,每一个部分整理笔记并且形成博......
  • 20231028
    23/10/28NOIP模拟赛总结时间安排7:40-8:00看题8:00-8:30看到T1题面的第一眼:寄。看到提示,发现做法已经给出来了,直接写过。8:30-8:50开T2,没啥思路,先打了30的暴力。8:50-9:30T3写了个\(O(n^2)\)的做法,当时以为是\(O(2^n)\),后来发现能拿40,但是调了很长时间。9:30-10:15......
  • iptables 使用总结
       Linux系统的防火墙功能是由内核实现的2.0版内核中,包过滤机制是ipfw,管理工具是ipfwadm2.2版内核中,包过滤机制是ipchain,管理工具是ipchains2.4版及以后的内核中,包过滤机制是netfilter,管理工具是iptablesiptables用户态位于/......
  • 使用telnet来调试游戏
    telnet是什么Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力但是,telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了。但仍然有很多别的系统......
  • 我的青春—— 一场盛大的意淫
    序一直想的是能够记录些什么,这样在以后无聊的日子里,再次回到这里打开看看,也是一种趣味吧(maybe。把所有的记录留在博客园,源于一段b站推广视频。也是由衷的佩服博客园的运营者们,当真是一群纯粹的理想主义者,建站这么久,依然能够保持初心,没有变成自己讨厌的样子,举例国内屎山——CSDN......
  • Marine pollution resources
    MarinePollutionTheworld’smarinepollutioncomesinmanyforms–fromtoxicchemicals,sewageandfertiliserstoplastics,discardedfishingnetsandeventhenoisefromshippinganddrilling.Over80%ofitoriginatesfromland-basedactivities(WWF,......
  • 求π
    利用蒙特卡罗方法求解π的值 fromrandomimportrandomfrommathimportsqrtfromtimeimportperf_counterprint("3107")DARTS=100000000hits=0.0n=1perf_counter()foriinrange(1,DARTS+1):x,y=random(),random()dist=sqrt(x**2+y**......
  • 进行了部分文章的整理
    删除了部分过时的文章,如wcf等技术知识部分重复的文章,  一些文章可以用后面更详细的文章代替  一些代码类的当时水平有限,时过境迁,现在也看不上。部分作为知识点记录的文章现在可以用chatgpt之类的ai引擎代替,并且知识点更新,更全面,更强大部分转载类的文章:转载基本上......
  • marine pollution
    MarinePollutionMarinepollutionisacombinationofchemicalsandtrash,mostofwhichcomesfromlandsourcesandiswashedorblownintotheocean.Thispollutionresultsindamagetotheenvironment,tothehealthofallorganisms,andtoeconomi......
  • 计算圆周率
    frommathimport*fromtimeimport*scale=20s,m,=1,2print("执行开始".center(scale//2,"-"))start=perf_counter()foriinrange(scale+1):s=sqrt((1-sqrt(1-pow(s,2)))/2)m=m*2a='*'*ib='.'*(scale-i)......