NanoPC-T3 64位裸机编程 —— 启动和运行状态切换
一、系统框图
二、Memory Map
三、启动方式
- 原理图
- 从sdcard启动
四、64位裸机程序
首先需要认识一下nsih.bin文件,也就是上面说的Boot Header,它占一个扇区(512B)大小。可以参考https://github.com/SamsungARTIK/bl1-artik710/blob/artik/nsih-generator/PERIDOT_SYSINFO_Gen_ver03.xls,这个文件用excel表格的方式表示了Boot Header,由于我们这里要折腾的是64位裸机程序,所以在nsih.bin里需要实现对处理器运行状态的切换操作,好在前面的excel表格里已经有这部分操作了,下图是这个excel表格的DDR3 NSIH64标签的内容:
我们重点关注上图中红框里的内容:
nsih64.bin: file format binary Disassembly of section .data: <.data>:
: e3a00103 mov r0, #- ; 0xc0000000
: e3800a11 orr r0, r0, # ; 0x11000
: e590113c ldr r1, [r0, #] ; 0x13c
c: e3811a0f orr r1, r1, # ; 0xf000
: e580013c str r0, [r0, #] ; 0x13c
: e3a025ff mov r2, # ; 0x3fc00000
: e38229ff orr r2, r2, # ; 0x3fc000
1c: e3822080 orr r2, r2, # ; 0x80
: e5802140 str r2, [r0, #] ; 0x140
: e3a08103 mov r8, #- ; 0xc0000000
: e3888801 orr r8, r8, # ; 0x10000
2c: e59892ac ldr r9, [r8, #] ; 0x2ac
: e3899001 orr r9, r9, #
: e58892ac str r9, [r8, #] ; 0x2ac
: e320f003 wfi
3c: eafffffe b 0x3c
...
: ffff0000 ; <UNDEFINED> instruction: 0xffff0000
4c: ffff0000 ; <UNDEFINED> instruction: 0xffff0000
...
1fc: 4849534e stmdami r9, {r1, r2, r3, r6, r8, r9, ip, lr}^
{
#define REG32(addr) (*((volatile uint32 *)addr)) REG32(0xC001113c) |= 0xF000;
REG32(0xC0011140) = 0x3FFFC080;
REG32(0xC00102AC) |= 0x1;
wfi();
while();
}
结合6818的寄存器手册分析一下:
- 链接脚本spl.lds
- start.S
- boot.c
void boot_master(void)
{
int i, d = ; clrsetbits32(0xc001b020, << , << );
setbits32(0xc001b004, << ); clrsetbits32(0xc001b020, << , << );
setbits32(0xc001b004, << );
tglbits32(0xc001b000, << ); while () {
for (i = ; i < ; ++i)
d ^= i;
tglbits32(0xc001b000, << );
tglbits32(0xc001b000, << );
}
}
从github上下载后,进入工程目录执行make,就会在out目录下生成如下几个文件:
可以阅读Makefile看看这几个镜像都是怎么来的。 这里大概说明如下:NanoPC-T3.elf文件表示最后编译生成的elf格式的可执行文件,NanoPC-T3.map文件是NanoPC-T3.elf的地址空间map表,对于分析链接脚本以及每个成员的空间占用情况很有帮助,NanoPC-T3_nonsih.img是将NanoPC-T3.elf文件用objcopy处理得到的bin文件,NanoPC-T3.img是用build工具将nsih64.bin跟NanoPC-T3_nonsih.img组装起来的,同时会更新LOADSIZE和CRC32字段(可以用beyondcompare比较一下):
其中,NanoPi_M3.img就是我们需要烧写到sdcard中的,烧写命令如下:
dd if=./out/NanoPC-T3.img of=/dev/sdh bs= seek= conv=fdatasync
注意: 上面的/dev/sdh对应的就是sdcard的节点,sdh后面不太任何数字,表示的是整块sdcard,从0扇区开始。“bs=512 seek=1”表示跳过第一个512字节,也就是跳过第0个扇区,从第1个扇区开始烧写。
烧写完毕后,在板子上电或者reset时按住BOOT按键,此时就会从sdcard启动,这个裸机程序运行的效果是,板子上的两个LED灯交替闪烁,下面是原理图:
NanoPC-T3 64位裸机编程 —— 启动和运行状态切换的更多相关文章
- 64位电脑上启动程序出现丢失MSVCR110.dll的解决办法
启动程序报错如下: 无法启动此程序,因为计算机中丢失MSVCR110.dll.尝试重新安装该程序以解决此问题. 应该很容易就搜索到,缺少这样的dll文件,是没有安装Visual C++ Redistr ...
- 新建虚拟机_WIN8 64位系统_启动报错Directory "EZBOOT" not found
准备工作:下载win8 64 镜像文件 1.虚拟机安装win8 64位操作系统,新建虚拟机步骤同XP系统 2.BIOS设置CD/ROM启动,但启动报错,如下,由于镜像文件超过4G,无法从虚拟机安装,需 ...
- 用VC进行64位编程
用VC进行64位编程 分类: C/C++2014-04-30 15:14 532人阅读 评论(0) 收藏 举报 本文转自:http://www.usidcbbs.com/read-htm-tid-52 ...
- 【转】win32,win64编程永恒;语言编程需要注意的64位和32机器的区别
原文网址:http://www.cnblogs.com/kex1n/archive/2010/10/06/1844737.html 一.数据类型特别是int相关的类型在不同位数机器的平台下长度不同.C ...
- C# winIO32位,64位的使用(运行时要用管理员身份)
下载地址: http://www.internals.com/utilities/WinIo.zip 一个按键的消息产生流程如下: 1)硬件中断/硬件端口数据 WinIO能模拟,或者修改IDT是在这一 ...
- 64位win系统上面tomcat6启动不了 window不能再本地计算机启动
64位的jdk装完之后,jre的bin目录下面没有client文件夹, 而tomcat6.0.20的默认配置启动在client文件夹下面. 所以打开tomcat6w,在java选项界面,取消Use d ...
- 安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案
安装64位版Oracle11gR2后发现启动SQL Developer时弹出配置java.exe的路径,找到Oracle自带java.exe后产生的路径“C:\app\用户名\product\11.2 ...
- 安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案(原创) (2016-10-29 下午01:56)
安装64位版Oracle11gR2后发现启动SQL Developer时弹出配置java.exe的路径,找到Oracle自带java.exe后产生的路径"C:\app\用户名\product ...
- dll文件32位64位检测工具以及Windows文件夹SysWow64的坑(很详细,还有自动动手编程探测dll)
阅读目录 dll文件不匹配导致数据库无法启动 究竟是System32还是SysWow64 区分dll文件32位64位的程序让我倍感迷惑 再次判断究竟是System32还是SysWow64——意想不到的 ...
随机推荐
- Storm: 性能优化 (转载)
Storm 性能优化 原文地址:http://www.jianshu.com/p/f645eb7944b0 目录 场景假设 调优步骤和方法 Storm 的部分特性 Storm 并行度 Storm 消 ...
- Sql日期时间格式转换(转 子夜.)
sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...
- Python高级主题:Python ABC(抽象基类)
#抽象类实例 作用统一规范接口,降低使用复杂度.import abcclass Animal(metaclass = abc.ABCMeta): ##只能被继承,不能实例化,实例化会报错 @abc.a ...
- LOJ #6010. 「网络流 24 题」数字梯形
#6010. 「网络流 24 题」数字梯形 题目描述 给定一个由 n nn 行数字组成的数字梯形如下图所示.梯形的第一行有 m mm 个数字.从梯形的顶部的 m mm 个数字开始,在每个数字处可以 ...
- 设计模式之第20章-访问者模式(Java实现)
设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...
- 设计模式之第10章-桥接模式(Java实现)
设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...
- IOS开发学习笔记038-autolayout 自动布局 界面实现
在storyboard/xib文件中实现自动布局 autolayout 1.注意事项 autolayout和frame属性是有冲突的,所以如果准备使用autolayout,就不要再代码中对控件的fra ...
- CSU-2049 象棋
CSU-2049 象棋 Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車--他想知道,在一共N×M个点的矩形棋盘中摆最多 ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛
拖了好久了 链接:https://www.nowcoder.com/acm/contest/90/A来源:牛客网 跳台阶 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K, ...
- linux批量匹配移动文件的方法
需求 有需要移动的文件名清单 filename.txt filename.txt 内容如下: 15542842 1582457 1282427 1532158 4542457 1582453 6552 ...