关于s3c6410的SD卡启动

发布者:快乐之源最新更新时间:2024-09-13 来源: cnblogs关键字:s3c6410  SD卡启动 手机看文章 扫描二维码
随时随地手机看文章

      要研究裸机程序的编写,必须要有一个“全裸”的环境。友善提供的superboot可以提供执行用户自定义程序的能力,但其实这样运行的程序环境还是依赖于superboot的, 那些内存初始化、时钟初始化,串口初始化等工作都已经由superboot做了。tiny6410支持nandflash和sd卡启动两种模式,nandflash的烧写还是依赖superboot,所以比较简便的方法是通过sd卡启动,superboot本身也是通过sd卡启动的。

      从网上搜了一下这方面的资料,主要参考文章来来去去就几篇, 三星的S3C6410_Internal_Rom_Booting.pdf是一份比较有用的资料,当然还有其中一些文章也比较有用,例如djyos的sd卡启动试验。这些文章描述s3c6410的要点总结如下:

      (1) s3c6410启动过程分成BL0, BL1, BL2几个阶段, 其中BL0是固化在s3c6410内部的IROM中的, 该段程序根据所选择的启动模式从存储介质加载BL1. s3c6410支持从多种存储介质中启动,nandflash, sd卡,sdhc卡,OneNand, MoviNand.... BL1和BL2存储于这些存储介质中。这里我主要关注sd和sdhc卡.

      (2) BL0在加载BL1前已经做了很多工作,sd控制器初始化,关闭看门狗等。

      (3) 对于sd卡, BL1位于 (totalSector - 18) 的扇区;对于sdhc卡,BL1位于(totalSector-1042)的扇区。BL1由BL0加载到 0x0C000000处运行,大小为8K.

       

知道了上面几点,就可以制作sd启动卡了,可以将所编写的裸机程序放到BL1的位置。下面编写一个最简单的点灯程序(LED1~LED4全亮):

led.s:


 1 .text

 2 .code 32

 3 .global _start

 4 _start:

 5            ldr r0,=0x7f008800

 6            ldr r1,=0x11111111

 7            str r1,[r0]

 8            ldr r0,=0x7f008808

 9            ldr r2,=0xff0f

10            str r2,[r0]

11 loop:

12            b loop

13  


makefile:       


CC=arm-linux-gcc

LD=arm-linux-ld

OBJCOPY=arm-linux-objcopy

CFLAG=-c

LDFLAG=-e _start -Ttext 0x0c000000


led.bin: led 

      $(OBJCOPY) -O binary $< $@


led: led.o

      $(LD) $(LDFLAG) $? -o $@


led.o:led.s           

      $(CC) $(CFLAG) $< -o $@


clean:

      rm *.o

      rm led

      rm led.bin


      下面要将led.bin写入BL1.使用的是2G的sd卡,所以应该写到 -512 * 18处。网上的文章都说用WinHex写入,我使用的是linux环境,没有WinHex可用,不过其实dd命令就可以对绝对磁盘扇区做读写。还有一个问题就是要知道sd卡的大小, 用fdisk命令就可以了:

      $ sudo fdisk -l /dev/sdb

      Disk /dev/sdb: 2059 MB, 2059403264 bytes

      207 heads, 37 sectors/track, 525 cylinders

      Units = cylinders of 7659 * 512 = 3921408 bytes

      Sector size (logical/physical): 512 bytes / 512 bytes

      I/O size (minimum/optimal): 512 bytes / 512 bytes

      Disk identifier: 0xb2a60e0e


      Device Boot Start End Blocks Id System

      /dev/sdb1 1 525 2010469 b W95 FAT32


      所以要写入的地址为 2059403264 - 18 * 512 = 2059394048


      然后用dd命令写入led.bin :

      $ sudo dd if=./led.bin of=/dev/sdb seek=2059394048 bs=1

      至此一张可启动的sd卡就完成了,插入tiny6410, 选择sd卡启动模式,就可以看到板子启动时4灯全亮。

      注:友善宣称它提供的SDFlasher.exe可以不论sd和sdhc卡都可以支持,从而优于三星提供的IROM_Flushing_Tool, 三星的要选择是sd还是sdhc。其实原理很简单,SDFlasher.exe写入时不论是-18扇区还是-1042扇区都写入。


关键字:s3c6410  SD卡启动 引用地址:关于s3c6410的SD卡启动

上一篇:[S3C6410-01]烧写Linux3.0.1系统
下一篇:Tiny6410裸机编程-----WatchDog

推荐阅读最新更新时间:2024-11-09 10:16

S3C6410嵌入式应用平台构建(一)
接下来,我们看看关闭MMU,至于为什么要关闭MMU,网上大家都说的很清楚,我就不再重述,但关于关闭MMU有如下代码: /* * disable MMU stuff and caches */ mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS) bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM) orr r0, r0, #0x00000002 @ set bit 2 (A) Align orr r0, r0, #0x00001000 @ se
[单片机]
S3C6410之uboot回炉再造(6)异常中断处理
这篇是中断向量的存储、注释比较清晰、就不再细讲 1 /* 2 ************************************************************************* 3 * 4 * Interrupt handling 5 * 6 ************************************************************************* 7 */ 8 @ 9 @ IRQ stack frame. 10 @ 11 #define S_FRAME_SIZE 72 12 13 #define S_OLD_R0 68 1
[单片机]
6410中断控制详解
S3C6410的中断主要改进是. 增加中断向量控制器,这样在S3C2440里需要用软件来跳转的中断处理机制,在S3C6410完全由硬件来跳转。你只要把ISR地址是存在连续向量寄存器空间,而不是象S3C2440自行分配空间自行管理。 换句话说,在S3C2440下是由CPU触发IRQ/FIQ异常,由异常处理函数里再查找相关中断寄存器来跳到指定的ISR,而可以全部由S3C6410的VIC硬件来自动处理。 这个大大简化中断处理编程。 另一个是外部中断加入滤波电路,这样原来需要软件去毛刺的地方均可以采用硬件来进行滤波了,这样大大简化外部中断处理。 S3C6410 中断操作 -----------------------
[单片机]
linux内核中S3C6410 timer相关代码理解
本文描述基于mini6410平台的time.c中的相关代码,主要描述下对部分代码的理解。 先贴上代码: 1 /* we use the shifted arithmetic to work out the ratio of timer ticks 2 * to usecs, as often the peripheral clock is not a nice even multiple 3 * of 1MHz. 4 * 5 * shift of 14 and 15 are too low for the 12MHz, 16 seems to be ok 6 * for the current HZ value
[单片机]
s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(1)
还是先说下整体结构,又要说到大家很熟悉的平台设备了,同样看门狗定时器也是作为平台设备存在的,但与以前的不同的地方是,看门狗定时器是一种混杂设备,先介绍下混杂设备。 1、混杂设备 1.1、混杂设备并没有明确的定义。它的主设备号是10,不同的设备用次设备号区分。混杂设备用结构体miscdevice表示,源码如下: struct miscdevice { int minor; 次设备号 const char *name; 设备名 const struct file_operations *fops;设备的操作函数,与字符设备相同 struct list_head list; 链接混杂设备的链表 struct device *
[单片机]
ARM11 S3C6410系列教程之二:串口
  对于一个微处理器,最常用也是最简单的接口就是串口,它不需要太多的管脚,也不需要太多的硬件电路,如果不放心,增加一个max232可以达到万无一失的境地,完成数据的传输。   S3C6410拥有187个复用功能的I/O端口,这些端口可以分为17组,具体如下:   S3C6410X UART 支持的比特率可达到 3Mbps。每个 UART包含两个 64-byte FIFO’s用于发送和接收数据。我们可以这样理解,当配置好寄存器后,我们可以从相应的缓存区读取或者发送相应的数据。通过上面的描述可以看出,S3C6410的GPA和GPB为串口。现在我以串口0为例介绍S3C6410的串口如何配置。对与串口0,通过设置GPACON为相应
[单片机]
ARM11 <font color='red'>S3C6410</font>系列教程之二:串口
S3C6410-uboot详细解读之smdk6410.h
/* * (C) Copyright 2002 * Sysgo Real-Time Solutions, GmbH * Marius Groeger * Gary Jennejohn * David Mueller * * Configuation settings for the SAMSUNG SMDK6400(mDirac-III) board. * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribut
[单片机]
linux中触摸屏驱动的实现(3)——基于s3c6410处理器
1、上一篇分析的是两个中断处理函数中的其中一个触摸屏中断,现在来分析另外一个ADC中断,对应的中断函数是stylus_action。当触摸屏在自动X/Y位置转换模式和独立的X/Y位置转换模式时,当坐标数据转换之后会产生IRQ_ADC中断,进而调用stylus_action函数,此函数源码如下: static irqreturn_t stylus_action(int irqno, void *param) { unsigned long data0; unsigned long data1; //printk( stylus_action.n ); data0 = readl(ts_base+S3C_ADCDAT0);
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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