Tiny6410 SD卡启动裸机程序
1. 启动流程
根据"S3C6410 Internal ROM Booting"手册,6410的启动流程如下:
① iROM(BL0)自动进行初始化启动:初始化系统时钟、D-TCM,、设备控制器、启动设备(SD/MMC Card, OneNand, Nand)。
② iROM将启动设备中的bootloader中的4KB代码加载到SRAM中,这8KB boot loader叫做BL1。
③ BL1: 初始化系统时钟、串口、SDRAM,然后将剩余的bootloader(BL2)加载到SDRAM中。
④ 最后,跳转到BL2的起始地址,为用户系统做好环境准备。
2. SD卡启动设备的块分配
博主的启动设备为SDHC卡(8GB), 代码应该拷贝到倒数1042个扇区(sectors)开始的地方。 用fdisk命令查看一下SD卡的扇区:
[root@localhost 22]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00053920Device Boot Start End Blocks Id System
/dev/sda1 * 2048 616447 307200 83 Linux
/dev/sda2 616448 618495 1024 83 Linux
/dev/sda3 618496 37814271 18597888 83 Linux
/dev/sda4 37814272 41943039 2064384 5 Extended
/dev/sda5 37816320 41943039 2063360 82 Linux swap / SolarisDisk /dev/sdb: 7948 MB, 7948206080 bytes
255 heads, 63 sectors/track, 966 cylinders, total 15523840 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe62818a6Device Boot Start End Blocks Id System
/dev/sdb1 2048 15521791 7759872 c W95 FAT32 (LBA)
2.1 根据扇区计算拷贝位置
计算一下代码应该拷贝的扇区位置为: 15523840 - 1042 = 15522798
使用dd命令将事先准备好的LED闪烁程序下载到SD卡的15522798扇区位置
注意:一定要带“iflag=dsync oflag=dsync”,否则程序不会运行!
[root@localhost 22.sdboot]# dd iflag=dsync oflag=dsync if=led.bin of=/dev/sdb seek=15522798 bs=512
0+1 records in
0+1 records out
162 bytes (162 B) copied, 0.0246958 s, 6.6 kB/s
2.2 根据字节计算拷贝位置
计算一下代码应该拷贝的字节位置:7948206080 - 1042*512 = 7947672576
使用dd命令将事先准备好的LED闪烁程序下载到SD卡的7947672576字节位置:
注意:一定要带“iflag=dsync oflag=dsync”,否则程序不会运行!
[root@localhost 22.sdboot]# dd iflag=dsync oflag=dsync if=led.bin of=/dev/sdb seek=7947672576 bs=1
162+0 records in
162+0 records out
162 bytes (162 B) copied, 0.820881 s, 0.2 kB/s
将SD卡插入开发板,将开关拨到SDBOOT位置,启动电源开关,可以看到4个LED闪烁。
3. 代码
3.1 start.S
/* start.S */.global _start
_start: //外设基地址及大小告诉CPUldr r0, =0x70000000 //ldr: loadorr r0, r0, #0x13 //0x13=b10011=256M, 参见arm1176jzfs内核参考手册Page3-130mcr p15,0,r0,c15,c2,4 //把r0的值(包括了外设基地址+外设大小)告诉cpu//关看门狗ldr r0, =0x7E004000 //watch dog timer base addressmov r1, #0str r1, [r0] //disable watch dog. str: Store //设置GPKCON0ldr r0, =0x7F008800 //GPKCON0 addressldr r1, =0x11110000 //GPK_4,5,6,7设置为输出, GPKn设置为0001时,GPKn引脚设置为输出str r1, [r0]mov r2, #0x1000 //LED循环计数
led_blink:ldr r0, =0x7F008808 //GPKDAT addressmov r1, #0xF0 //设置GPK_4,5,6,7为高电平,Led熄灭str r1, [r0] bl delay ldr r0, =0x7F008808mov r1, #0x00 //设置GPK_4,5,6,7为低电平,Led点亮str r1, [r0] bl delaysub r2, r2, #1 //r2=r2-1cmp r2, #0bne led_blink //如果r2!=0,则跳转至led_blink处执行。bne:Branch Not Equal
halt:b halt //b: Branch
delay:mov r0, #0x1000000
delay_loop: sub r0, r0, #1cmp r0, #0bne delay_loopmov pc, lr //从delay子程序返回
3.2 链接脚本
/* led.lds */SECTIONS
{. = 0x0C000000; /*BL1 start address*/.text : {start.o* (.text)}.data : {* (.data)}.bss_start = .;.bss : {* (.bss)}.bss_end = .;
}
注意,BL1的起始地址为0x0C000000(见Memory Map)
3.3 Makefile
led.bin: start.oarm-linux-ld -Tled.lds -o led.elf $^arm-linux-objcopy -O binary led.elf led.binarm-linux-objdump -D led.elf > led_elf.dis
%.o : %.Sarm-linux-gcc -o $@ $< -c
%.o : %.carm-linux-gcc -o $@ $< -c
clean:rm *.o *.elf *.bin *.dis -rf
Tiny6410 SD卡启动裸机程序相关推荐
- 基于S3C2440丛SD卡启动WinCE(或其它程序)的实现
[楼主位] liuweiele Liuwei 积分:687 派别: 等级:------ 来自: 系统上电后,如果发现SD卡中有boot.ini文件,便按boot.ini文件中的指定参数运行,否则继续启 ...
- 嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210)
嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210) 一.SD卡介绍 1. SD卡背景知识和特点 SD卡.MMC卡.MicroSD.TF卡:这些卡其实内部就是Flash存储颗粒,比 ...
- ARM裸机的知识点总结---------10、SD卡启动详解
Author: 想文艺一点的程序员 自动化专业 工科男 再坚持一点,再自律一点 CSDN@想文艺一点的程序员 来自朱有鹏嵌入式的学习笔记 目录 一.主流的外存设备介绍 1.磁存储 2.Flash存储. ...
- IMX6ULL学习笔记(12)——通过SD卡启动官方SDK程序
一.识别SD卡 首先 SD 卡插入读卡器,再把读卡器插入电脑. VMWare 有时候会自动弹出对话框,选择 连接到虚拟机 即可. 如果没有对话框,可以通过菜单 可移动设备 找到 SD 卡,点击 连接. ...
- 关于s3c6410的SD卡启动
要研究裸机程序的编写,必须要有一个"全裸"的环境.友善提供的superboot可以提供执行用户自定义程序的能力,但其实这样运行的程序环境还是依赖于superboot的, 那 ...
- S5PV210体系结构与接口09:SD卡启动详解
目录 1. MMC技术演进 1.1 NandFlash & NorFlash芯片 1.2 MMC卡 & SD卡 & MicroSD卡(TF卡) 1.2.1 代际关系 1.2.2 ...
- linux下通过SD卡烧录.bin程序
1.文件mkv210_image.c详解 分析启动过程可知: 210 启动后先执行内部iROM中的BL0,BL0执行完后会根据OMpin 的配置选择一个外部设备来启动(有很多,我们实际使用的有2个:u ...
- NXP BootLoader源码分析并改写SD卡启动
1 官方资料 NXP官方提供了MCUBoot SDK:NXP_Kinetis_Bootloader_2.0.0 package,里面包含了各种型号芯片的的BootLoader. BootLoader参 ...
- ZYNQ-7000如何生成从Flash和SD卡启动的镜像文件
将PL与PS部分一起使用,并且通过JTAG下载到板子运行.对于ZYNQ,有多种启动方式,比如从JTAG启动.从QSPI(即Flash)启动,从SD卡启动等.对于从JTAG启动的,我们直接运行程序就OK ...
- WINCE6.0+S3C6410基于SD卡启动
********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...
最新文章
- paramiko安装
- 不要在 Spring Boot 集成测试中使用 @Transactional
- Transformer解析
- 七大步骤,详解预置算法构建模型的全过程
- ARM系统中断产生流程
- 【LINQ】Linq to SQL -- Select语句
- LogDashboard 1.0.4 版本发布
- python基础(十):异常和断言
- mysql强制编码导出、导入数据
- 卷积法求解系统的零状态响应_信号与系统题
- 人物-周鸿祎:周鸿祎
- MATLAB函数或变量无法识别
- 计算机主机hdmi接口是什么意思,hdmi接口有什么用,教你详细的计算机hdmi接口功能...
- 复杂网络作业四:第三题——随机图、小世界网络和真实网络的度分布
- Linux/Unix下Shell快捷键操作大集合
- 读《互联网:一部概念史》有感
- 润肤悦颜各种偏方秘方
- 脱不花《沟通的方法》读书笔记(一):学会倾听
- 短文本分类:电力95598工单分类实现
- MAC 如何强制关闭程序
热门文章
- 华为热设计工程师待遇_【华为热设计工程师面试】华为热设计工程师大家要慎重考虑。-看准网...
- java 免费发短信_java实现发短信功能---腾讯云短信
- 无线网络服务器网络异常,无线网络连接上但上不了网怎么解决
- 嗖嗖移动大厅之使用场景类
- 解决Win10打开可执行文件提示为了对电脑进行保护,已经阻止此应用的问题
- [电影]《指环王》新老三部曲完全赏析(王者归来)
- ImportError: cannot import name ‘chatBot‘ from ‘chatbot‘ (C:\Users\l\Pych
- 正确使用 CDN 让你更好规避安全风险
- 【Excel学习笔记8】“定位”可以用来干嘛?
- ASTC纹理压缩格式介绍