嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结
1、在uboot中我可以添加自己的命令,添加的方法是找到一个uboot的命令,然后模仿着去增加属于自己的命令代码以及实现函数就可以
2、记住在使用printf进行调试的时候,在遇到指针或者字符串的时候最好使用“%x”,以为我不知道指针或者字符串中是否包含不可见字符,如果有不可见字符会导致错误,而且错误不好查找
3、对于uboot中的环境变量,其实是放在uboot里面的,也就是环境变量占用的是uboot的空间,如果不需要去实时修改环境变量的值那么就可以不用env这个分区;但是如果需要修改环境变量,那么首先需要知道saveenv的起始地址和大小,来防止env的保存会覆盖flash中其他的有用数据。具体运行saveenv就可以看到起始地址和env大小
4、有时候在烧写完成kernel的时候直接第一次reset是可以启动的,但是当断电然后再一次上电的时候可能就会出现错误,例如:
Resetting CPU ...
这就有可能是内核不完整了,说明前面的操作可能覆盖了内核的部分内容导致的
5、对flash(spi)串行flash进行分区的时候需要特别注意:
1):uboot对flash分区可能存在明显的代码分区列表可以直接进行修改
2):uboot中没有这个明显的代码的时候,可能是在uboot的env中传过去的
setenv bootargs mem=64Mconsole=ttyAMA0,115200 root=/dev/mtdblock4 rootfstype=jffs2mtdparts=hi_sfc:256k(boot)ro,128k(env),128k(config),3072k(kernel),11264k(rootfs)
具体是哪种方式可以去uboot源码中进行查找函数的入口参数的传入点
6、分区的具体信息需要根据uboot的大小(每一分区的大小最小是一个扇区,包括kernel和rootfs)
0x000000000000-0x000000040000 :"boot"
0x000000040000-0x000000060000 : "env"
0x000000060000-0x000000080000 : "conf"
0x000000080000-0x000000380000 : "kernel"
0x000000380000-0x000000e80000 : "rootfs"
7、uboot对flash分区具有最大上限一般为(32)
在使用jlink烧写之前必须对cpu进行初始化,然后进去normal模式,接着进行内存初始化,然后才能烧写
hi3518c初始化命令:
setmem 0x20030000 0x11000000 32
setmem 0x20030004 0x0068306E 32
setmem 0x20030008 0x12000000 32
setmem 0x2003000c 0x007C2063 32
setmem 0x20030010 0x19000000 32
setmem 0x20030014 0x00682064 32
setmem 0x20030020 0x1B000000 32
setmem 0x20030024 0x007C40E1 32
setmem 0x20030028 0x00000010 32
setmem 0x2011001c 0x80000600 32
setmem 0x20030028 0x00000410 32
setmem 0x2011001c 0x80000600 32
setmem 0x20050014 0x0fff8000 32
setmem 0x2011001c 0x80000600 32
setmem 0x20050000 0x00000214 32
setmem 0x2011001c 0x80000600 32
setmem 0x2011001c 0x80000600 32
setmem 0x20110020 0x00000785 32
setmem 0x20110058 0x3240a000 32
setmem 0x20110010 0x00000001 32
setmem 0x2011002c 0x00000122 32
setmem 0x20110040 0x80000000 32
setmem 0x20110050 0x62330a08 32
setmem 0x20110054 0xff626720 32
setmem 0x2011005c 0xffcff5f2 32
setmem 0x201100ac 0x03000001 32
setmem 0x2011001c 0x80000600 32
setmem 0x201100f4 0x00000001 32
setmem 0x20110004 0x00000000 32
setmem 0x2011001c 0x80000600 32
setmem 0x20120404 0x80000000 32
setmem 0x2011001c 0x80000600 32
setmem 0x20120408 0x01842200 32
setmem 0x20120418 0x00220055 32
setmem 0x2012041c 0x048b0d41 32
setmem 0x20120420 0x03233881 32
setmem 0x2012042c 0xf200001e 32
setmem 0x20120434 0x288f6693 32
setmem 0x20120438 0x0040009b 32
setmem 0x2012043c 0x1001aa00 32
setmem 0x20120584 0x0000006d 32
setmem 0x20120440 0x00001730 32
setmem 0x20120444 0x00000006 32
setmem 0x20120448 0x00000008 32
setmem 0x2011001c 0x80000600 32
setmem 0x201205c0 0x00000e81 32
setmem 0x20120600 0x00000e81 32
setmem 0x2011001c 0x80000600 32
setmem 0x20120404 0x000000ff 32
setmem 0x2011001c 0x80000600 32
setmem 0x20110058 0x3240a062 32
setmem 0x20120408 0x01842200 32
注:其中每一空白行的前一行setmem 0x2011001c 0x8000060032是为了实现wait操作
1、在裸板上使用jlink进行烧写uboot的需要知道uboot在内存中的运行地址也就是代码段的入口,可以去uboot源码下找到uboot.map进行查找text入口。
2、然后在串口中进行loadb 0x82000000(uboot中也是可以找到定义的),然后sfwrite到flash但是需要先擦除后烧写
3、有时候在烧写uboot之后saveenv后reset找不到内核,并提示wrong format image这可能是内核的头没了,原因是saveenv的时候覆盖了内核的文件,所以需要去uboot中找到类似下面的代码:
#defineCFG_ENV_ADDR 0x80000
#defineCFG_ENV_SIZE 0x2000
然后对flash分区进行重新计算
4、对flash分区3.0内核和uboot 2006中是使用环境变量进行划分的,类似代码如下:
setenv bootargs 'mem=64M console=ttyAMA0,115200root=/dev/mtdblock4 rootfstype=jffs2mtdparts=hi_sfc:256k(boot)ro,128k(env),128k(conf),2944k(os),12800k(rootfs)'
注:speed 1000 后使用AXD进行cpu和ram 初始化
sf probe 0;mw.b 0x82000000 ff 0x80000;
烧录uboot:
loadb 0x82000000
sf probe 0;sf erase 0x0 0x80000;sf write0x82000000 0x0 0x80000
烧录内核:
sf probe0;mw.b 82000000 ff 300000;loadb 0x82000000;sf erase c0000 300000;sfwrite 82000000 c0000 300000
//mw.b表示按字节显示 mw: 对RAM中的内容写操作,mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)
烧录文件系统:
sf probe 0;mw.b 82000000 ff C80000 ;loadb 0x82000000;sf erase 3c0000 C80000;sf write 82000000 3c0000 C80000
官方uboot_env:
bootargs=mem=64M console=ttyAMA0,115200
bootcmd=bootm 0x82000000
bootdelay=1
baudrate=115200
ethaddr=00:00:23:34:45:66
ipaddr=192.168.1.10
serverip=192.168.1.2
netmask=255.255.255.0
bootfile="uImage"
stdin=serial
stdout=serial
stderr=serial
verify=n
ver=U-Boot 2010.06 (Dec 12 2012 - 13:16:58)
Environment size: 294/262140 bytes
hi3518_qy;
sf probe 0;mw.b 0x82000000 ff 0x80000;
烧录uboot:
loadb 0x82000000
sf probe 0;sf erase 0x0 0x80000;sf write0x82000000 0x0 0x80000
烧录内核:
sf probe0;mw.b 82000000 ff 300000;loadb 0x82000000;sf erase c0000 300000;sfwrite 82000000 c0000 300000
//mw.b表示按字节显示 mw: 对RAM中的内容写操作,mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)
烧录文件系统:
sf probe 0;mw.b 82000000 ff C80000 ;loadb 0x82000000;sf erase 3c0000 C80000;sf write 82000000 3c0000 C80000
setenv bootargs 'mem=64M console=ttyAMA0,115200root=/dev/mtdblock4 rootfstype=jffs2mtdparts=hi_sfc:256k(boot)ro,128k(env),128k(conf),2944k(os),12800k(rootfs)'
内核:
setenv bootcmd sf probe 0\;sf read 0x82000000 0xc00000x300000\;bootm 0x82000000
剩余:
256k未使用
嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结的更多相关文章
- HI3518E用J-link烧写裸板fastboot u-boot流程
Hi3518E的裸板烧写fastboot是不能像HI3531那样,可以通过FB直接烧写.遵循ARM9的烧写流程.其中一般u-boot的烧写流程可分为几类:第一:通过编程器芯片直接烧写:第二通过RVDS ...
- JZ2440裸板烧写(打补丁)
制作uImage,需要上网下载内核+patch补丁 1.将内核用ftp发送到 打补丁patch -p1 < ../补丁文件名 打补丁文件(目录) 2.配置 :复制cp configuratio ...
- 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705 参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...
- uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试
今天在工作上搞了一天高通的芯片uboot程序,目的是希望将一个裸板的程序移植到uboot中,并且开机让它运行.这个芯片是NXP4330,目前是高通的一个芯片,基于ARM-contexA9架构,那么就跟 ...
- S5PV210裸板驱动:启动
以往2440和6410的启动方式,只要我们把裸板代码烧写到NAND FLASH的开始位置,当开发板上点启动时,处理器会自动从NAND FLASH上拷贝前面一段的代码到内部的RAM中执行.按照以前的方法 ...
- 学习嵌入式为什么要有uboot(深度解析)
ref:http://www.elecfans.com/d/617674.html 为什么要有uboot 1.1.计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统. 典型的 ...
- 嵌入式Linux开发板
嵌入式Linux开发板开发介绍: iTOP-4412嵌入式Linux开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,独家配备三星S5M8767电源管理,配备Andro ...
- 关于在arm裸板编程时使用printf问题的解决方法
在ARM裸板驱动编程中,是不允许程序直接调用C库程序的.为什么呢?因为此时kernel还没有被加载,所以在封装在kernel层的C库的API是用不了的,那怎么办? 在开发过程中,printf的功能我不 ...
- [转载非常好的文章]JLink+GDBServer调试S3C6410裸板的初始化代码 For OK6410开发板
要调试裸板,有两种初始化方法,一个是用烧好的uboot初始化,再有就是直接用JLink+GDBServer初始化.代码参考了网上的资料,根据手头的OK6410开发板做了修改.整体代码如下: # Con ...
随机推荐
- <<深入Java虚拟机>>-第三章-垃圾收集器与内存分配策略-学习笔记
垃圾收集 垃圾收集(Garbage Collection,GC),垃圾收集需要完成的三件事情. 哪些对象需要回收 什么时候回收 如何回收 如何确定对象已死(即不可能在被任何途径引用的对象) 引用计数算 ...
- hdu 4778 Gems Fight! 博弈+状态dp+搜索
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...
- 计算连续的IP地址
题目:要求计算连续的IP地址. 举例:起始IP为192.168.2.2,IP总个数为3,那么要求得的所有IP的为192.168.2.2,192.168.2.3,192.168.2.4.再举个例子,起始 ...
- C#基础(七)——静态类与非静态类、静态成员的区别
静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...
- java 调用oracle 分页存储过程 返回游标数据集
1.分页类 package org.zh.basic; /** * 页面类 * * @author keven * */ public class PageInfo { // 定义 private S ...
- 字符编码笔记:ASCII,Unicode和UTF-8【转载】
作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...
- python 生成排列、组合以及选择
from <python cookbook> 19.15 任务 需要对一个序列的排列(permutation).组合(combination)或选择(selection)进行迭代操作.即使 ...
- 【DB】SQLite学习笔记
下载”System.Data.SQLite.DLL”,程序中添加引用即可 //创建数据库文件 SQLiteConnection.CreateFile("sqlitetest.db" ...
- CSS3中translate、transform和translation的区别和联系
translate:移动,transform的一个方法 通过 translate() 方法,元素从其当前位置移动,根据给定的 left(x 坐标) 和 top(y 坐标) ...
- Python属性、方法和类管理系列之----属性初探
在学习dict的时候,肯定听过dict是Python中最重要的数据类型,但是不一定知道为什么.马上你就会明白原因了. Python中从模块.到函数.到类.到元类,其实主要管理方法就是靠一个一个的字典. ...