uboot官方标准uboot移植
 解决烧录运行问题:
输出错误信息分析:第一个SD checksum Error是第一顺序启动设备SD0(iNand)启动时校验和失败打印出来的;第二个SD checksum Error是第二顺序启动设备SD2(外部SD卡)启动时校验和失败打印出来的,所以外部SD卡校验失败,经过对比两份b-boot.bin的二进制文件发现当前u-boot.bin前面少了16字节的占位,导致mkbl1的校验和代码不成功。
 关于start.S文件的移植:
 确定lowlevel.S的位置:
1、确定方法有两个,可以查看两个文件所在的Makefile,发现board/samsung/goni下的lowlevel.o被包含进去了,而另一个由于宏定义不满足而未被包含进去
2、或者查看已经编译过的uboot源码目录,看哪个所在目录下被编译成了.o文件
 解决lowlevel_init.o重定义问题:
1、首先对代码添加开发板制锁,和串口打印字符“O”代码,发现并未起到效果
2、然后用led测试代码添加发现在调用lowlevel_init.S函数之前有作用,但进入lowlevel_init.S之后便没有作用,由此推测原因是在烧录uboot时是先将uboot的前8k烧进SRAM时候lowlevel_init.S不在其中,所以要将链接脚本u-boot.lds进行修改,将lowlevel_init.o放到前面,这样就保证lowlevel_init函数被链接到前8k中去了
3、修改后进行编译后出现lowlevel.o重定义的错误,原因是这个函数被链接时链接了2次,一次是lowlevel_init函数本身目录生成libgoni.o时,另一次是生成最终的u-boot时,那么解决思路是让它在当前目录下Makefile中不被链接,只在最终时链接,方法是参考start.S文件的解决方法,因为start.S这个文件和lowlevel_init.o这个文件情况一样,但却没有这个重定义问题,找到start.S目录下的Makefile,发现用了all: $(obj).depend $(START) $(LIB)这种方式,便避免了问题,所以我们也采用这种方法进行改造,便解决了问题。
 添加初始化DDR的代码:
1、在成功初始化串口后,直接转入_main函数,在_main函数中直接在DDR中设置栈,然后进行板级初始化(也就是进入到第二阶段了),所以我们要添加DDR初始化,并重定位。
2、在Samsung版本的初始化DDR函数和cpu_init.S文件和s5pc110.h头文件相关,cpu_init.S文件和lowlevel.S文件一样,都要放到前8k中,所以处理方法一样,然后对cpu_init.S代码进行修整,把无用代码去掉,将缺少的宏定义人工添加处理上;再对s5pc110.h进行修整;调用初始化代码,在后面添加输出字符“K”,经过验证看到OK字样。说明DDR初始化成功。
 重定位代码的移植:
 在跳转到第二阶段的_main函数之前添加重定位的代码,根据Samsung版本的代码移植设置栈、movi_bl2_copy、清bss等代码,movi_bl2_copy的代码在movi.c中,从原来版本进行拷贝,去掉里面的无关代码,这个movi.o也要放到前8k中,所以处理方法与lowlevel_init.o一样。该文件中的宏定义依赖于movi.h,所以再将movi.h拷贝过来,movi.c中的其他头文件先暂不做处理,(再对_main中进行处理,将里面的重定位代码去掉)然后进行编译,出现movi.c中reg.h未定义,解决方法将它注释掉;再编译出现奇怪的连接错误:u-boot contains relocations other than R_ARM_RELATIVE,然后在Ubuntu下用grep "R_ARM_RELATIVE" -nR *搜索(原因是在ubuntu下可以搜索到所有文件,包括Makefile),发现在Makefile中有一个重定位的规则,解决方法是将它屏蔽掉;再进行编译,正确。但启动后发现毫无作用,进行检测在代码前面加上打印“A”的调试信息发现没有显示,表示重定位代码根本就没有运行,再进行前面lowlevel_init中的复查,发现里面有一个关于自锁检查的循环应该出来问题,导致不能返回,解决方法是将下面的mov lr, r11和mov pc, lr放到初始化DDR后,让它直接返回(这里经过试验验证还要将bl internal_ram_init这句代码屏蔽掉,不然会卡在里面出不来)即可,再次编译启动就看到了uboot的打印信息。至此说明uboot的DDR初始化和重定位已经成功,后面就是第二阶段的移植了。
 CPU时钟显示:
1、先在print_cpuinfo打印CPU信息函数中更改显示时钟的代码(按照以前Samsung的格式方法)
2、原来的uboot中并没有代码初始化时钟,所以是默认的iROM中的初始化,ARMCLK是400MHZ,所以要进行修改
3、在lowlevel_init.S中删除以前的初始化时钟代码,添加新的时钟初始化代码(ARMCLK是1000MHZ),并在头文件中添加相应的宏
4、添加过后进行编译出现很奇怪的错误:Error: internal_relocation (type: OFFSET_IMM) not fixed up,其实就是没有加头文件的原因,添加#include <s5pc110.h>就正确了
 board、DDR、MACH_TYPE的移植:
board和DDR配置比较简单,不做详细记录;MACH_TYPE在board_init中定义,在这个uboot中是将机器码集中配置在一个头文件中的,所以将其改成我们开发板的MACH_TYPE_SMDKV210即可
 去掉oneNand,添加SD/MMC:
1、刚开始为了简便只是单纯地把onenand_init函数给屏蔽掉了,这样编译通过也可以启动进入命令行,但是存在问题,因为原来的环境变量默认放在onenand中,这样修改还是无法解决这个问题
2、正确的方法是将限制这个函数的宏定义CONFIG_CMD_ONENAND注释掉,这样编译会出现关于环境变量的保存和重定位等错误,错误在/common/env_ononand.c中其实在配置头文件中有关于定位env环境变量位置的一些宏定义,CONFIG_ENV_IS_IN_ONENAND等,它们的作用就是配置要把环境变量放到哪里;我们也可以另一个角度来思考为什么会编译env_ononand.c这个文件,我们进到相应目录下的Makefile中看到这个.o文件就被CONFIG_ENV_IS_IN_ONENAND这个宏所限制,所以我们先将这几个宏定义去掉,看会发生什么错误
3、编译出现了#error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|SPI_FLASH|NVRAM|MMC|FAT|REMOTE|UBI} or CONFIG_ENV_IS_NOWHERE,这样我们就知道了我们必须定义环境变量所在的位置,那么我们就要定义到SD/MMC中,我们便添加宏#define CONFIG_ENV_IS_IN_MMC  1
4、这个宏的添加将会导致相应的env_mmc.c被编译,可能会出现一些文件中相关的错误,经过编译出现了error: 'CONFIG_SYS_MMC_ENV_DEV' undeclared (first use in this function),在这个文件中向下查找发现saveenv中的find_mmc_device函数也引用了这个宏,在以前uboot分析时知道这个函数是在查找mmc设备号,0表示内部iNand,1表示外部SD卡
5、再次编译,在onenand.c中出现问题,现在我们已经不需要这个文件了,便直接在相应目录下Makefile中去掉即可,再次编译成功
 SD卡驱动移植:
1、uboot2013.10中:驱动相关的文件主要有:drivers/mmc/mmc.c、drivers/mmc/sdhci.c、drivers/mmc/s5p_sdhci.c、board/samsung/goni/goni.c
 三星移植版本中,驱动相关的文件主要有:drivers/mmc/mmc.c、drivers/mmc/s3c_hsmmc.c、cpu/s5pc11x/cpu.c、cpu/s5pc11x/setup_hsmmc.c
 先将Samsung中的mmc.c和s3c_hsmmc.c复制到当前uboot中,然后对相应目录下的Makefile进行修改,将原来的驱动文件去除,添加上我们新移植的
2、将原来Samsung版本cpu_mmc_init函数的内容添加到board_mmc_init中,进行代码浏览,将需要移植的头文件和修改的地方进行修改,进行编译,查看错误
3、regs.h没有定义出现错误,将其注释掉(同时也将setup_hsmmc.c中的去掉),编译;cmd_mmc.c这个文件出现错误,这个文件明显是和mmc目录相关的,因为我们将mmc的驱动改变了,所以相应的命令也会改变,所以我们的解决方法是将原来Samsung的这个文件拷贝过来,编译;出现s3c_hsmmc.c这个文件中的宏未定义的错误,加上头文件s5pc110.h(推测这个头文件应该是在regs.h中有包含,同时也将setup_hsmmc.c中的加上),编译;mmc_write.c这个文件出现错误,这个文件应该和原来的mmc.c有关,但我们将它替换了,所以我们就把他在Makefile中去掉,编译;出现MPLL未定义的错误,原因是头文件未包含,这个头文件应该用链接符号的方式来定义<asm/arch/clk.h>才可以,编译成功,经过测试mmc读写也都成功
 环境变量的移植:
1、先分析env环境变量应该放在哪里,它的位置不能和uboot、kernel、rootfs等冲突,根据重定位movi_bl2_copy代码的#define MOVI_BL2_POS ((eFUSE_SIZE / MOVI_BLKSIZE) + MOVI_BL1_BLKCNT + MOVI_ENV_BLKCNT) 就是1+16+32,其中的1就是扇区0(空闲的),16是就是扇区1-16(uboot的BL1),32就是扇区17-48(存放ENV的),49自然就是uboot的BL2开始扇区了,所以我们只要将ENV分区放到17扇区即可。
2、我们分析这个uboot代码中的saveenv函数中的mmc_get_env_addr和write_env得知通过这个宏CONFIG_ENV_OFFSET来定义ENV在iNand(我们之前把ENV保存在iNand中)的起始扇区位置,所以这里我们要把起始扇区改为17
3、再将初始环境变量整理一下,在配置头文件中进行删除增添,编译后对iNand的17扇区进行读测试,正确
 网卡驱动的移植:
1、我们要在这个uboot中添加网络支持,浏览代码发现网络初始化依赖于CONFIG_CMD_NET这个宏,所以我们首先要把它定义在头文件中(这里有一个关键点:在配置头文件中有这样一句#undef CONFIG_CMD_NET,会取消我们的定义,所以一定要记得把它去掉才行),然后分别添加ping和tftp命令,这两个命令也分别依赖宏定义,将其添加上,经过编译启动后的现象是可以出现这两个命令,但是并不能起作用
2、经过前面的代码,我们并没有看到有初始化dm9000网卡的代码,所以还要先移植初始化代码,还是和原来一样放到board_init中,编译运行还是不起作用

3、根据uboot启动信息提示定位错误代码:Net Initialization Skipped和No ethernet found,前一个错误是没有定义自己的board_eth_init函数,我们定义一个同名的board_eth_init这个函数就可以,第二个错误根据代码分析是由于eth_devices(每一个网卡驱动都要在这个链表里面注册,这样才能发现网卡驱动,不然就会提示找不到网卡)这个链表是空的,所以我们在这个函数之前就要在这个链表中注册好网卡,那么注册网卡驱动的函数在dm9000x.c中的dm9000_initialize,我们就要调用这个函数,所以我们就在自己定义的board_eth_init中调用dm9000_initialize,编译时出现board_eth_init重定义问题,解决方法是将原来的board_eth_init注释掉,这样便实现了网络模块。

在s5pv210开发板上移植官方2101310版本的uboot相关推荐

  1. linux内核添加usb键盘驱动,配置USB外设 - linux-2.6.32在mini2440开发板上移植_Linux编程_Linux公社-Linux系统门户网站...

    linux-2.6.32在mini2440开发板上移植 配置USB外设 [日期:2013-04-08] 来源:Linux社区 作者:ssdsafsdsd [字体:大 中 小] 编者:因为LINUX内核 ...

  2. 飞腾FT-2000/4开发板上移植Ubuntu18.04.5且更换飞腾内核4.19.8教程

    PDF版本下载链接:​​​​​​(4条消息) 飞腾FT-2000-4开发板上移植Ubuntu18.04.5且更换飞腾内核4.19.8教程-嵌入式文档类资源-CSDN文库https://download ...

  3. linux-2.6.32在mini2440开发板上移植(16)之LED 驱动程序移植

    LED 驱动程序移植 编者:对于led的驱动程序,很多文章都有详细的介绍,我的博客里面有一篇专门详解这个的.需要看的,可以找下.led灯的驱动其实就代表了I/O口的驱动.在linux系统下,操作一个I ...

  4. linux-2.6.32在mini2440开发板上移植 ---W35型LCD驱动移植

    转载:http://blog.csdn.net/viewsky11/article/details/11846359 编者注:本移植主要步骤还是按照手册来,里面讲解了一些有用的基础知识.但书册上提供了 ...

  5. linux在开发板LCD上显,W35型LCD驱动移植 - linux-2.6.32在mini2440开发板上移植_Linux编程_Linux公社-Linux系统门户网站...

    编者注:本移植主要步骤还是按照手册来,里面讲解了一些有用的基础知识.但书册上提供了集中屏幕的方案,我们这里主要就用一种,也就是开发板自带的W35型号.液晶驱动的源程序在src/drivers/vide ...

  6. 【FreeRTOS】在Cortex-M4开发板上移植FreeRTOS并且实现LED灯闪烁(保姆级教程)

    相信有不少小伙伴手上只有M4的开发板,想要移植FreeRTOS:但是,网上大部分都是M3移植教程.因此,陷入深深的迷茫中,难不成只能使用仿真了???

  7. 迅为IMX6Q开发板上移植mplayer

    好久不见,最近真的是太忙了~最近有很多小伙伴也在问我开发板Linux系统要怎么播放音视频,为了弥补大家,所以今天写一个长文来和大家一起探讨下. 01.mplayer简介 mplayer是一款开源多媒体 ...

  8. 在Corex-M3开发板上移植.Net Micro Framework系列文章

    .NET Micro Framework 将 .NET 的可靠性和效率与 Visual Studio® 的高生产率结合起来,以针对价格较低.资源受限的小型设备开发应用程序,可帮助人们使用熟悉的 Vis ...

  9. 基于Domoticz智能家居系统(十三)Domoticz-3.8153在Tiny6410开发板上的移植

    Domoticz-3.8153在Tiny6410开发板上的移植 本文将在友善之臂Tiny6410开发板上移植Domoticz-3.8153,起因是去年在mini2440上移植的3.5877版本编译出来 ...

最新文章

  1. 2.2.2 指数加权平均
  2. Electron中与Vue集成流程
  3. Kafka 是如何保证数据可靠性和一致性
  4. grep搜索子目录中包含某字符串的特定文件
  5. if 组件是否存在_UE4 UMG简介+Slate组件问题排查
  6. bootstrap-datepicker实现日期input readonly 标签中选择时间功能
  7. Git更新本地分支信息
  8. 创建物理卷报错Can‘t open /dev/sdb5 exclusively. Mounted filesystem的问题解决过程记录
  9. MATLAB使用教程(三)——慢慢练手做项目啦——新手来看
  10. 转载:医疗保险,公积金、养老、生育、工伤、失业保险
  11. snownlp抛出错误_网易云评论爬虫及情感分析
  12. 滴滴校招 餐馆最大收益问题
  13. a标签在IE浏览器进行download下载,出现中文乱码 - 戴向天
  14. 浅谈领域驱动设计(DDD:Domain-Driven Design)
  15. 【SQL文档整理系列1】MySQL创建procedure(可以用来造测试数据)
  16. 模糊C均值聚类以及C实现
  17. ssh中dao自定义的模板类
  18. 好吧,CSS3 3D transform变换,不过如此!
  19. 开启我的Python之旅
  20. 2022年12月最新python学习基础教程01

热门文章

  1. 导入mysql 1044_MySQL导入sql文件错误#1044
  2. 如何以HTML显示Base64图像?
  3. 并查集+字符排序-困兽之斗(乐视题)
  4. canvas画布js代码实现大风车的动画
  5. 提升效率:优化Java代码的35个小技巧
  6. 疫情期间居家所需物品清单
  7. Linux 基础操作、常用shell命令、vi常用命令、man帮助手册
  8. 2021顶级的开源 BI(商业智能)软件和报表工具
  9. Numpy中的数组变形操作01——reshape() 重塑, flatten()/reval() 扁平化
  10. Walle 瓦力 安装部署