核烧写及UBOOT调试经验总结
在某项目经历了内核移植的全过程
- 某项目沿用FORLINX开发板的uboot及内核版本,项目整体版本虽然稳定但比较旧,在调试过程中遇到不少困难,就本次CID项目内核烧写及UBOOT调试经验总结如下:
- 一、 上电后使用烧录工具烧录故障
- 二、 LTIB工具编译过程中出现的错误
- 三、 EMMC版本故障
- 四、 启动后EMMC故障
- 五、UBOOT阶段打印丢失以及无法进入文件系统输入故障
某项目沿用FORLINX开发板的uboot及内核版本,项目整体版本虽然稳定但比较旧,在调试过程中遇到不少困难,就本次CID项目内核烧写及UBOOT调试经验总结如下:
基础版本
UBOOT:uboot-2009-08
KERNEL:linux3.0.35
MFGTOOL(烧录工具):Mfgtools-Rel-13.01.00_ER_MX6Q_UPDATER
遇到的问题及解决方案
一、 上电后使用烧录工具烧录故障
自研单板上电后,接上烧录工具,mfg工具运行到loading uboot阶段停止不动,串口没有任何打印。通过分析mfgtools工具的xml文件,发现mfg工具引导文件烧录分为两个阶段:
1、 Bootstrap阶段:将需要烧录的文件放置到内核可识别的对应地址
2、 Updater阶段:CPU顺序读取地址来执行指令
而整个烧录阶段需要烧录两套uboot&kernel&fs。一套是用来引导烧录使用的引导程序,包含一个uboot文件,一个uImage内核镜像和一个initramfs(运行在内存中的文件系统);而另一套则是我们真正使用的系统。
所以综合故障的现象,判断是因为我们的设计更换了外围的设备,所以原烧录工具中的整套引导无法加载,导致在BootStrap阶段之后引导系统无法运行,烧录终止。
故障解决方案:重新制作一套官方引导系统。
生成引导程序的方案有两个
1、 到freescale官方的开源YOCTO项目下载对应版本并编译BSP
2、 使用freescale的BSP工具LTIB配置对应的BSP
考虑到对YOCTO项目并不熟悉,而且调试周期的问题,本次调试使用了LTIB工具生成引导系统。
二、 LTIB工具编译过程中出现的错误
LTIB(linux target image BSP)是freescal发布的为各种目标镜像提供生成BSP的工具,目前官网已经不再维护3.1之前的LTIB版本,所以将在多方努力下找到的3.0.35版本备份到百度云,并且设置为永久有效,以供下载。https://pan.baidu.com/s/10AWRqcObhG6616Hu9b2VUA
在编译LTIB工具的过程中遇到了两个问题:
1、 m4模块安装报错
These packages failed to build:
m4
按照提示,是因为定义了gets变量,造成编译m4模块失败,但是多次修改/opt/freescale/ltib/usr/src/rpm/BUILD/m4-1.4.16下的stdio.h重新编译还是出错。经过网友指导发现/opt/freescale/ltib/usr/src/rpm/BUILD/m4-1.4.16下的文件在编译时会被/opt/freescale/ltib/usr/src/rpm/SOURCES/m4-1.4.16.tar.gz/解压文件所覆盖。所以修改/BUILD/m4-1.4.16下的stdio.h文件是无意义的,BUILD只是一个中间文件夹,每次编译的时候都会被clean。所以在 /opt/freescale/ltib/usr/src/rpm/SOURCES 目录下找到 m4-1.4.16.tar.gz 文件,解压后在m4-1.4.16/lib/目录下找到stdio.in.h,修改文件内容如下:
#if defined gets#undef gets_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");#endif
然后将修改后的m4-1.4.16文件夹重新打包为m4-1.4.16.tar.gz。并删除 /opt/freescale/ltib/usr/src/rpm/BUILD/m4-1.4.16 后重新运行 ./ltib ,故障解决。
2、在编译过程总提示根文件系统下缺少几个库
编译过程中报错
/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/../lib/gcc/arm-fsl-linux-gnueabi/4.6.2/../../../../arm-fsl-linux-gnueabi/bin/ld: cannot find /lib/libc.so.6
/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/../lib/gcc/arm-fsl-linux-gnueabi/4.6.2/../../../../arm-fsl-linux-gnueabi/bin/ld: cannot find /usr/lib/libc_nonshared.a
/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/../lib/gcc/arm-fsl-linux-gnueabi/4.6.2/../../../../arm-fsl-linux-gnueabi/bin/ld: cannot find /lib/ld-linux.so.3
将ltib目录下对应的库带链接拷贝到根文件系统下,ltib可以正常编译。
将LTIB编译好的uboot、uImage、initramfs拷贝到mfg烧录工具的对应目录下,烧录过程可以进行到Updater阶段。
三、 EMMC版本故障
根据mfg工具的log显示执行到下列命令时出现错误。
clean up u-boot parameter
该命令是清理内核u-boot存储区的原来的参数,也就是向mmc写0的过程。再联系烧录过程中的串口打印,发现如下错误。
mmc0: unrecognised EXT_CSD revision 8
mmc0: error -22 whilst initialising MMC card
搜索内核代码发现里面对EXT_CSD版本做了限制
vim drivers/mmc/core/mmc.c +264/* workaround: support emmc 4.5 cards to work at emmc 4.4 mode */if (card->ext_csd.rev > 6) {printk(KERN_ERR "%s: unrecognised EXT_CSD revision %d\n",mmc_hostname(card->host), card->ext_csd.rev);err = -EINVAL;goto out;}
可以看到实际打印出来的东芝EMMC的版本为8,将LTIB内核源码对CSD版本的限制量修改后,可以正常引导文件烧录成功。
四、 启动后EMMC故障
烧录完成后,自研板正常启动,在EMMC启动的过程中出现超时打印
mmc0: Timeout waiting for hardware interrupt.
sdhci: =========== REGISTER DUMP (mmc0)===========
sdhci: Sys addr: 0x00000000 | Version: 0x00000002
sdhci: Blk size: 0x00000200 | Blk cnt: 0x00000001
sdhci: Argument: 0x00000c00 | Trn mode: 0x00000000
sdhci: Present: 0xf7fd8009 | Host ctl: 0x00000001
sdhci: Power: 0x0000000d | Blk gap: 0x00000000
sdhci: Wake-up: 0x00000000 | Clock: 0x000010ff
sdhci: Timeout: 0x00000000 | Int stat: 0x00000000
sdhci: Int enab: 0x007f00c3 | Sig enab: 0x007f00c3
sdhci: AC12 err: 0x00000000 | Slot int: 0x00000003
sdhci: Caps: 0x07eb0000 | Caps_1: 0x00000007
sdhci: Cmd: 0x0000341a | Max curr: 0x00ffffff
sdhci: Host ctl2: 0x00000000
sdhci: ===========================================
从报错信息可以看到,EMMC并未产生中断,导致超时错误发生,根据网上经验,修改了emmc的超时时间和上拉能力,都没有解决该故障。配合东芝的FAE,怀疑是EMMC的供电导致。但是给emmc加了一路独立的qvcc还是同样的故障。
此时联想到启动阶段同时还存在uboot阶段打印丢失的故障,且只有该版本的内核在forlinx开发板上也会报EMMC的超时错误,怀疑该版本的内核代码存在问题。通过比较LTIB使用的官方内核和我们自己调试的内核,发现mx6q单板的头文件中缺少了EMMC引脚的复用定义。添加该引脚的复用信息后,再次生成内核文件,可以正常引导内核启动。
五、UBOOT阶段打印丢失以及无法进入文件系统输入故障
在烧录同样的uboot和内核的情况下,forlinx单板uboot可以正常打印,kernel启动阶段打印丢失,而自研单板uboot无法打印,kernel阶段打印却是正常的。但是在烧录引导阶段,引导uboot和内核的过程都是全程有打印的。所以问题应该是烧录到内核的uboot的串口配置有问题。
对比引导阶段uboot和正式启动uboot的源码,发现引导阶段uboot的串口使用的引脚是
MX6Q_PAD_CSI0_DAT10__UART1_TXD
MX6Q_PAD_CSI0_DAT10__UART1_RXD
而启动uboot源码中的串口引脚是沿用了forlinx系统的
MX6Q_PAD_SD3_DAT7__UART1_TXD
MX6Q_PAD_SD3_DAT6__UART1_RXD
修改了uboot的调试串口引脚后,启动打印正常。此时在系统完全启动后,可正常挂载文件系统,但是输入登录用户时发现无法输入。对于串口输入故障,同样是去检查内核阶段的调试串口配置。发现内核同时配置了CSI0和SD3的复用,删除掉原forlinx单板的引脚配置后,可正常登录系统。
核烧写及UBOOT调试经验总结相关推荐
- (1)eop烧写和uboot烧写
1.eop连接电脑和开发板 1.JTAG COM 驱动安装 2.使用eop烧写 在cmd里敲击命令 烧写完后一定要断开eop排线,因为排线上有记忆功能 3.MobaXterm软件的使用--串口连接 查 ...
- 烧写ubl,uboot,内核。
原创:http://blog.sina.com.cn/u/2312748742 1.打开超级终端,将开发板设置为串口模式.确定可以收到数据,即bootcm循环,关闭超级终端. 2.用命令打开F:\li ...
- vivado在远程服务器上完成本地设备的程序烧写和调试(vivado远程调试)
vivado远程调试 目录 1 概述 2 本地设置 3 远程服务器设置 1 概述 本文用于描述FPGA开发过程中,使用远程服务器时,直接在远程服务器连接到本地设备进行程序的烧写和调试的过程. 即运用场 ...
- 二、先在SD卡上启动U-boot,再烧写新的U-boot进Nandflash
1. 制作SD卡 先准备一张2G的SD卡(不能用8G的,2G的卡和8G的卡协议不一样),和烧写SD卡的工具write_sd以及需要烧写到SD卡中的u-boot-movi.bin.将SD卡格式化后连接到 ...
- sd卡烧写linux内核,uboot从SD卡烧写内核和文件系统
环境:ubuntu 13.04 一.首先制作sd启动盘: 插入SD卡 sudo dd iflag=dsync oflag=dsync if=tiny210v2-uboot.binof=/dev/mmc ...
- stm32f429的u-boot、uclinux内核烧写说明
最近比较忙,针对前面的留言说有怎么download u-boot.uclinux到stm32,我翻了翻以前记录下的笔记,特意贴上来,其实有些步骤我都已经忘记了... 一.搭建嵌入式linux开发环境 ...
- 嵌入式系统烧写uboot/bootloader/kernel的一般方法
嵌入式系统烧写uboot/bootloader/kernel的一般方法 本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误, ...
- Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-boot ...
- 嵌入式Linux之旅——环境搭建篇之烧写整个系统
上一小结我们已经烧写完u-boot,我烧写的u-boot是板子厂家定制的,本小节将利用这个u-boot烧写整个系统.当然,在系统移植篇的时候也会涉及到如何定制一个u-boot. 烧写整个系统我们一个叫 ...
最新文章
- Linux Linux程序练习十一(网络编程大文件发送UDP版)
- 计算机视觉方向简介 | 深度学习视觉三维重建
- CentOS6.8下安装Docker
- android NinePatch图片制做
- mysql 学习笔记(二)
- vfatfs.sys加载
- android 通过短信找回密码,如何通过强力安卓恢复精灵找回丢失的手机短信?
- 企业中MySQL高可用集群架构三部曲之MM+keepalived
- 【时间序列】动态时间规整(DTW)算法简介(python)
- KNN算法实现knn完成iris数据集分类
- 天勤数据结构代码——双链表
- 当今主流软件产品家族及其开发语言
- matlab逆变器原理,MATLAB中的单相全桥逆变器电路建模与仿真
- 计算机操作系统产生的先后顺序,任务调度优先级
- 学习笔记10----学成在线案例
- 【思前享后】区块链应用
- python解常微分方程龙格库_求解二阶常微分方程的RungeKutta四阶方法
- 电脑安装两个jdk版本无法切换 同时安装JDK8和JDK16 配置JAVA_HOME为JDK8但 java 和 javac 版本都是16
- E3ZG_D62传感器 STM32C8T6
- Discourse 论坛激活邮件问题
热门文章
- Win11下载和安装T3标准版11.2
- 值得收藏的 104个 CSS 面试题
- 解决PyCharm和Spyder不能兼容pip下载第三方包的问题
- 简单体验 Windows XP Service Pack 3 简体中文版
- 淘宝(tmall)抓取店铺订单解密数据、打印电子面单、订单推送保存到erp软件中
- 数字信号处理课程设计:语音信号采集与滤波处理系统设计与实现 (MATLAB)——(一)
- php的内存马的原理与查杀方法
- Java-Tomcat如何修改端口号
- Vue2-Vue开发环境搭建
- 士兵职业基本适应性测试软件,士兵职业基本适应性检测系统 类型1.2.3怎么分...