自己写Tiny6410的Bootloader总结!

发布者:悠闲之旅最新更新时间:2024-10-08 来源: cnblogs关键字:Tiny6410  Bootloader  nandflash 手机看文章 扫描二维码
随时随地手机看文章

  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  nandflash 引用地址:自己写Tiny6410的Bootloader总结!

上一篇:ok6410如何从sdram中启动uboot 调试 这是一个猜想还没有验证
下一篇:Ubuntu14.04和Tiny6410挂载NFS服务!

推荐阅读最新更新时间:2026-03-20 12:15

linux-2.6.38到tiny6410的移植手册(1):nand flash
环境 VirtualBox+ubuntu 10.04 编译器,友善自带arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz 硬件,tiny6410,核心板号1107 1、下载linux-2.6.38的源码, ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.tar.bz2 2、解压 tar xvfj /mnt/ubuntu/linux-2.6.38.tar.bz2 -C . 3、vi Makefile 191行改为 ARCH ?= arm 4、cp arch/arm/configs/s3c6400_defconfig .con
[单片机]
linux-2.6.38到<font color='red'>tiny6410</font>的移植手册(1):nand flash
Tiny6410下的第一个Linux驱动程序
Linux系统环境是照着友善之臂的教程搭建的 //Hello World驱动程序源文件 1 #include linux/miscdevice.h 2 #include linux/delay.h 3 #include asm/irq.h 4 5 #include mach/hardware.h 6 #include linux/kernel.h 7 #include linux/module.h 8 #include linux/init.h 9 #include linux/mm.h 10 #include linux/fs.h 11 #include linux/types.h 12 #incl
[单片机]
基于Tiny6410的ds18b20驱动
从网站上下载了lixin的mini2410的ds18b20代码,并做了修改,成功实现了Tiny6410的ds18b20驱动。 【程序清单】 ds18b20.c /******************************************Copyright(c)************************************************ ** 文件名称: ds18b20_drv.c ** 作 者: lixin ** 版 本: v1.0 ** 说 明: ds18b20驱动程序.工作过程及时序见ds18b20 datasheet ** 修改记录: 2009-8-27创建 ** 最后修改时间
[单片机]
记录在tiny6410平台上采用4GSD卡来启动uboot和烧写nand flash uboot
下面这种方法是从网上转的 没有验证 环境:ubuntu 13.04 一、首先制作sd启动盘: 插入SD卡 sudo dd iflag=dsync oflag=dsync if=tiny210v2-uboot.binof=/dev/mmcblk0 seek=1 tiny210v2-uboot.bin来自: http://www.arm9home.net/read.php?tid-80476.html 二、SD卡分区 卸载SD卡, sudo /sbin/fdisk /dev/mmcblk0 如果你的SD卡上有几个分区 Command (mfor help): d   回车 删除硬盘分割区属性 Partitionn
[单片机]
记录tiny6410 使用linux-2.6.28.6内核遇到starting kernel...的问题
1\问题的解决主要是参考了tiny210相同的问题 2\/home/suxuandong/Documents/computer/linux_kernel/tiny6410/linux-2.6.28.6/arch/arm/mach-s3c6400/include/mach/uncompress.h 修改这个文件
[单片机]
记录<font color='red'>tiny6410</font> 使用linux-2.6.28.6内核遇到starting kernel...的问题
Tiny6410移植tslib
一、将Tiny6410一线触摸程序改成输入设备(input device) 由于友善一线触摸下位机不开源,所以只能在官方提供的内核模块上进行修改。 官方源代码:http://pan.baidu.com/s/1bog4rZD 1、修改模块加载函数 1 static int __init dev_init(void) 2 { 3 int ret; 4 #ifdef TS_INPUT_DRIVER 5 /* alloc input system device */ 6 ts.input = input_allocate_device(); 7 8 ts.input- evbit = BI
[单片机]
<font color='red'>Tiny6410</font>移植tslib
Tiny6410 LED 裸机驱动笔记
1. 先查看《Tiny6410-1170 CPU核心板原理图》,找到LED部分:   从上图可知,当nLED_1为低电平时,LEDx就会亮。 2. 再在《Tiny6410-1170 CPU核心板原理图》中找到nLED_x连接图(应该就在附近):   从上图可知:   LED1 连接 GPK4   LED2 连接 GPK5   LED3 连接 GPK6   LED4 连接 GPK7 知识点: GPIO: GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CP
[单片机]
<font color='red'>Tiny6410</font> LED 裸机驱动笔记
tiny6410】led裸板程序
start.s文件 启动代码很简单,主要做一些硬件相关的设置:告诉CPU外设的基地址、关看门狗、设置栈(为调用c语言准备) .globl _start _start: /* 硬件相关的设置 */ /* Peri port setup */ ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff) /* 关看门狗 */ /* 往WTCON(0x7E004000)写0 */ ldr r0, =0x7E004000 mov r1, #0 str r1, /* 设置
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved