自己写Tiny6410的Bootloader总结!
1、由于Tiny6410 2G版的Nand flash(K9GAG08U0E)的页大小是8K的,但是s3c6410芯片设置为nand flash启动时先从nand flash复制8K代码到片内内存中去,这个复制不是直接复制nand flash 的第0页的8K而是从前四页中分别取出2K代码到片内内存(这是硬件决定的,为了兼容所有nand flash)。所以友善之臂就使下载uboot到nand flash时每页只用前2K的空间而后面6K的空间装载的内容和前2K是一样的!而从nand flash 复制代码到sdram中去时只复制每页的前2K内容。(通过uboot命令读取nand flash的内容知道的)
Tiny6410 2G版的Linux内核存放在Nand Flash的地址为: 0x400000(1G版的地址为0x80000)
用SD卡烧写系统时会在nandflash上写一个bootargs(相当于cmdline)此地址为:0x200000(1G版的地址为0x40000)
BootLoader将内核复制到SDRAM中的地址为 : 0x50008000
BootLoader向内核传递的tag参数在SDRAM中的位置为:0x50000100
S3C6410的机器码为 :2520
BootLoader向内核传递的cmdline为:
root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200 lcd=S70(Yaffs文件系统)
或root=ubi0:FriendlyARM-root ubi.mtd=2 rootfstype=ubifs init=/linuxrc console=ttySAC0,115200 lcd=S70(ubifs文件系统)
2、Tiny6410 2G版Nand flash K9GAG08U0E适合1KBytes/12 bit 硬件ECC校验,而6410 最大支持 512 Bytes/8 bit 硬件ECC校验,
所以S3C6410在硬件上根本就不支持K9GAG08U0E,然而为什么友善之臂的superboot为什么能成功启动系统?因为他们使用了软件和硬件结合的ECC校验算法,所以大部分情况下可以启动成功!但是这个软件算法友善之臂没有开源(理由是这个算法只有他们公司能够做到,哎,太小气了,建议初学者千万不要买这个版本),所以如果想在这块板子上跑自己的bootloader基本上是不可能成功启动整个Linux系统的,除非你够牛逼能够自己写出这个ECC算法!!
(这是花了我几天的时间得出的教训,即使你的的bootloader是对的,但是每次复制内核到SDRAM时都会出现各种各样的错误!而在1G版的Tiny6410上能正常运行!)
3、原来Uboot还可以通过命令读去S3C6410寄存器的值,只要用内存读取命令然后地址设为你要读的寄存器的值就行!
(这样调试就更加方便了!今天突然想到Uboot既然能读内存数据,为什么不能读寄存器的值了,然后我就试了一下,尽然成功了,哈哈!!)
4、Uboot 最终跳转到内存固定地址到Linux内核入口:
void (*theKernel)(int zero, int arch, unsigned int params); // 定义一个函数指针
theKernel = (void (*)(int,int,unsigned int))0x50008000; // 将函数指针赋值为内存地址 0x50008000
theKernel(0,2520,0x50000100);//go to linux kernel // 跳转到 0x50008000 运行
5、当一切问题都解决后,我的Uboot终于能够启动Linux内核后,能够运行Linux的shell程序了,但是当我执行例如 cp mv 等这种需要分配内存才能执行的命令时候,会出现提示说不能分配内存,并且命令执行失败,这个问题是几个月后我在看书的时候突然知道了到底是什么原因出现这种情况的:所有需要动态分配的内存空间都是在堆中分配的,操作系统中的内存管理模块在初始化时,需要知道它所管理的内存空间的起始地址是什么,这需要通过连接脚本的配合来获取,连接脚本的__end__符号就是表示堆的开始地址,堆的结束地址是内存的剩余所有空间。
就是因为我在写连接脚本的时候没有__end__这个符号,所以操作系统不知道从哪里分配内存!
自己写Tiny6410的Bootloader总结!的更多相关文章
- 自己用C语言写RL78 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 之前用C实现过多款PI ...
- Pixhawk---烧写FMU/IO bootloader
Pixhawk-FMU/IO烧写Bootloader 1 说明 用J-link来烧写Bootloader,Pixhawk板FMU/IO接口说明: J-link接口说明: Pix ...
- 自己用C语言写PIC32 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 从15年12月份以来我 ...
- 自己用C语言写单片机PIC16 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 为什么自己写bootl ...
- 使用USBASP给Arduino烧写bootloader教程
源:使用UsbAsp给UNO烧写bootloader ATMEGA16U2.ATMEGA328P固件烧写教程 arduino板由于操作不发导致固件损坏,或者想更新固件怎么办?今天给大家介绍一下如何使用 ...
- tiny6410采用sd卡烧写的问题
今天想用32G的SD卡来烧写tiny6410的uboot但是失败了,换了一张4G的卡就可以了, 还有sd卡启动的uboot使用tftp命令是有问题的
- 自己用C语言写RH850 F1KM serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 手上有块Renesas ...
- 自己用C语言写NXP S32K116 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 每次我有了新的EVA ...
- Xmodem Bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 多年前玩Cisco交换 ...
随机推荐
- 编译Code::Blocks源码 with MinGW on Win
Build Code::Blocks源码 ---By 狂徒归来 CodeBlocks是一款非常优秀的IDE !可惜的是没有64位的版本,而且本来是轻量级别的IDE就应该够轻,能够像记事本工具一样,迅速 ...
- leetcode_day03
https://leetcode-cn.com/problems/container-with-most-water/ 题目:盛水最多的容器 给定 n 个非负整数 a1,a2,...,an,每个数代表 ...
- PHP连接mysql数据库进行增删改查--修稿数据
<?php $id = $_GET['id']; $db = new Mysqli("localhost","root","root" ...
- jQuery选择器之id选择器
页面的任何操作都需要节点的支撑,开发者如果快速高效的找到指定的节点也是前端开发中的一个重点.jQuery提供了一系列的选择器帮助开发者达到这一目的,让开发者可以更少的处理复杂选择过程与性能优化,更多专 ...
- SQLServer对视图或函数’XXX’的更新或插入失败,因其包含派生域或常量域解决
原因:视图view不允许修改. 解决:重新创建一个相同结构内容的表. 解释:因为所创建的视图对其属性值进行了计算的其他形式上的改变,而对视图的更改最终表现为对表的更改而表中不存在视图的某一属性,或属性 ...
- 当发送ICMP包的时候不一定能收得到(arp已经应答了)【复现不了了】
arp已经应答了,然后再返回ICMP应答的时候竟然不被回复. 其实这里想想也很容易想清楚: 虽然arp给了回复,但是真正到ICMP报文到的时候,我理解报文到的时候,我理解还是要进行与本地网络兑换的,本 ...
- Dictionary & Chinese
Dictionary & Chinese DC & dict https://github.com/zollero/simplified-chinese https://github. ...
- Python中的单元测试模块Unittest快速入门
前言 为什么需要单元测试? 如果没有单元测试,我们会遇到这种情况:已有的健康运行的代码在经过改动之后,我们无法得知改动之后是否引入了Bug.如果有单元测试的话,只要单元测试全部通过,我们就可以保证没有 ...
- NBUT校赛 J Alex’s Foolish Function(分块+延迟标记)
Problem J: Alex’s Foolish Function Time Limit: 8 Sec Memory Limit: 128 MB Submit: 18 Solved: 2 Des ...
- [poj] 3180 the cow prom
原题 这是一道强连通分量板子题. 我们只用输出点数大于1的强连通分量的个数! #include<cstdio> #include<algorithm> #include< ...