在某项目经历了内核移植的全过程

  • 某项目沿用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. (1)eop烧写和uboot烧写

    1.eop连接电脑和开发板 1.JTAG COM 驱动安装 2.使用eop烧写 在cmd里敲击命令 烧写完后一定要断开eop排线,因为排线上有记忆功能 3.MobaXterm软件的使用--串口连接 查 ...

  2. 烧写ubl,uboot,内核。

    原创:http://blog.sina.com.cn/u/2312748742 1.打开超级终端,将开发板设置为串口模式.确定可以收到数据,即bootcm循环,关闭超级终端. 2.用命令打开F:\li ...

  3. vivado在远程服务器上完成本地设备的程序烧写和调试(vivado远程调试)

    vivado远程调试 目录 1 概述 2 本地设置 3 远程服务器设置 1 概述 本文用于描述FPGA开发过程中,使用远程服务器时,直接在远程服务器连接到本地设备进行程序的烧写和调试的过程. 即运用场 ...

  4. 二、先在SD卡上启动U-boot,再烧写新的U-boot进Nandflash

    1. 制作SD卡 先准备一张2G的SD卡(不能用8G的,2G的卡和8G的卡协议不一样),和烧写SD卡的工具write_sd以及需要烧写到SD卡中的u-boot-movi.bin.将SD卡格式化后连接到 ...

  5. sd卡烧写linux内核,uboot从SD卡烧写内核和文件系统

    环境:ubuntu 13.04 一.首先制作sd启动盘: 插入SD卡 sudo dd iflag=dsync oflag=dsync if=tiny210v2-uboot.binof=/dev/mmc ...

  6. stm32f429的u-boot、uclinux内核烧写说明

    最近比较忙,针对前面的留言说有怎么download u-boot.uclinux到stm32,我翻了翻以前记录下的笔记,特意贴上来,其实有些步骤我都已经忘记了... 一.搭建嵌入式linux开发环境 ...

  7. 嵌入式系统烧写uboot/bootloader/kernel的一般方法

    嵌入式系统烧写uboot/bootloader/kernel的一般方法 本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误,   ...

  8. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写

    很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-boot ...

  9. 嵌入式Linux之旅——环境搭建篇之烧写整个系统

    上一小结我们已经烧写完u-boot,我烧写的u-boot是板子厂家定制的,本小节将利用这个u-boot烧写整个系统.当然,在系统移植篇的时候也会涉及到如何定制一个u-boot. 烧写整个系统我们一个叫 ...

最新文章

  1. Linux Linux程序练习十一(网络编程大文件发送UDP版)
  2. 计算机视觉方向简介 | 深度学习视觉三维重建
  3. CentOS6.8下安装Docker
  4. android NinePatch图片制做
  5. mysql 学习笔记(二)
  6. vfatfs.sys加载
  7. android 通过短信找回密码,如何通过强力安卓恢复精灵找回丢失的手机短信?
  8. 企业中MySQL高可用集群架构三部曲之MM+keepalived
  9. 【时间序列】动态时间规整(DTW)算法简介(python)
  10. KNN算法实现knn完成iris数据集分类
  11. 天勤数据结构代码——双链表
  12. 当今主流软件产品家族及其开发语言
  13. matlab逆变器原理,MATLAB中的单相全桥逆变器电路建模与仿真
  14. 计算机操作系统产生的先后顺序,任务调度优先级
  15. 学习笔记10----学成在线案例
  16. 【思前享后】区块链应用
  17. python解常微分方程龙格库_求解二阶常微分方程的RungeKutta四阶方法
  18. 电脑安装两个jdk版本无法切换 同时安装JDK8和JDK16 配置JAVA_HOME为JDK8但 java 和 javac 版本都是16
  19. E3ZG_D62传感器 STM32C8T6
  20. Discourse 论坛激活邮件问题

热门文章

  1. Win11下载和安装T3标准版11.2
  2. 值得收藏的 104个 CSS 面试题
  3. 解决PyCharm和Spyder不能兼容pip下载第三方包的问题
  4. 简单体验 Windows XP Service Pack 3 简体中文版
  5. 淘宝(tmall)抓取店铺订单解密数据、打印电子面单、订单推送保存到erp软件中
  6. 数字信号处理课程设计:语音信号采集与滤波处理系统设计与实现 (MATLAB)——(一)
  7. php的内存马的原理与查杀方法
  8. Java-Tomcat如何修改端口号
  9. Vue2-Vue开发环境搭建
  10. 士兵职业基本适应性测试软件,士兵职业基本适应性检测系统 类型1.2.3怎么分...