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卡启动裸机程序相关推荐

  1. 基于S3C2440丛SD卡启动WinCE(或其它程序)的实现

    [楼主位] liuweiele Liuwei 积分:687 派别: 等级:------ 来自: 系统上电后,如果发现SD卡中有boot.ini文件,便按boot.ini文件中的指定参数运行,否则继续启 ...

  2. 嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210)

    嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210) 一.SD卡介绍 1. SD卡背景知识和特点 SD卡.MMC卡.MicroSD.TF卡:这些卡其实内部就是Flash存储颗粒,比 ...

  3. ARM裸机的知识点总结---------10、SD卡启动详解

    Author: 想文艺一点的程序员 自动化专业 工科男 再坚持一点,再自律一点 CSDN@想文艺一点的程序员 来自朱有鹏嵌入式的学习笔记 目录 一.主流的外存设备介绍 1.磁存储 2.Flash存储. ...

  4. IMX6ULL学习笔记(12)——通过SD卡启动官方SDK程序

    一.识别SD卡 首先 SD 卡插入读卡器,再把读卡器插入电脑. VMWare 有时候会自动弹出对话框,选择 连接到虚拟机 即可. 如果没有对话框,可以通过菜单 可移动设备 找到 SD 卡,点击 连接. ...

  5. 关于s3c6410的SD卡启动

        要研究裸机程序的编写,必须要有一个"全裸"的环境.友善提供的superboot可以提供执行用户自定义程序的能力,但其实这样运行的程序环境还是依赖于superboot的, 那 ...

  6. S5PV210体系结构与接口09:SD卡启动详解

    目录 1. MMC技术演进 1.1 NandFlash & NorFlash芯片 1.2 MMC卡 & SD卡 & MicroSD卡(TF卡) 1.2.1 代际关系 1.2.2 ...

  7. linux下通过SD卡烧录.bin程序

    1.文件mkv210_image.c详解 分析启动过程可知: 210 启动后先执行内部iROM中的BL0,BL0执行完后会根据OMpin 的配置选择一个外部设备来启动(有很多,我们实际使用的有2个:u ...

  8. NXP BootLoader源码分析并改写SD卡启动

    1 官方资料 NXP官方提供了MCUBoot SDK:NXP_Kinetis_Bootloader_2.0.0 package,里面包含了各种型号芯片的的BootLoader. BootLoader参 ...

  9. ZYNQ-7000如何生成从Flash和SD卡启动的镜像文件

    将PL与PS部分一起使用,并且通过JTAG下载到板子运行.对于ZYNQ,有多种启动方式,比如从JTAG启动.从QSPI(即Flash)启动,从SD卡启动等.对于从JTAG启动的,我们直接运行程序就OK ...

  10. WINCE6.0+S3C6410基于SD卡启动

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

最新文章

  1. paramiko安装
  2. 不要在 Spring Boot 集成测试中使用 @Transactional
  3. Transformer解析
  4. 七大步骤,详解预置算法构建模型的全过程
  5. ARM系统中断产生流程
  6. 【LINQ】Linq to SQL -- Select语句
  7. LogDashboard 1.0.4 版本发布
  8. python基础(十):异常和断言
  9. mysql强制编码导出、导入数据
  10. 卷积法求解系统的零状态响应_信号与系统题
  11. 人物-周鸿祎:周鸿祎
  12. MATLAB函数或变量无法识别
  13. 计算机主机hdmi接口是什么意思,hdmi接口有什么用,教你详细的计算机hdmi接口功能...
  14. 复杂网络作业四:第三题——随机图、小世界网络和真实网络的度分布
  15. Linux/Unix下Shell快捷键操作大集合
  16. 读《互联网:一部概念史》有感
  17. 润肤悦颜各种偏方秘方
  18. 脱不花《沟通的方法》读书笔记(一):学会倾听
  19. 短文本分类:电力95598工单分类实现
  20. MAC 如何强制关闭程序

热门文章

  1. 华为热设计工程师待遇_【华为热设计工程师面试】华为热设计工程师大家要慎重考虑。-看准网...
  2. java 免费发短信_java实现发短信功能---腾讯云短信
  3. 无线网络服务器网络异常,无线网络连接上但上不了网怎么解决
  4. 嗖嗖移动大厅之使用场景类
  5. 解决Win10打开可执行文件提示为了对电脑进行保护,已经阻止此应用的问题
  6. [电影]《指环王》新老三部曲完全赏析(王者归来)
  7. ImportError: cannot import name ‘chatBot‘ from ‘chatbot‘ (C:\Users\l\Pych
  8. 正确使用 CDN 让你更好规避安全风险
  9. 【Excel学习笔记8】“定位”可以用来干嘛?
  10. ASTC纹理压缩格式介绍