S3C6410使用---7uboot中SD初始化及读写分析

发布者:创新脑细胞最新更新时间:2018-04-15 来源: eefocus关键字:S3C6410  uboot  SD初始化  读写分析 手机看文章 扫描二维码
随时随地手机看文章

一、uboot中SD卡的初始化
二、读取扇区
三、 写变量到SD卡中
四、

一、uboot中SD卡的初始化
1.1 硬件连线

  1. MMC0_CDN     -->     GPG6       --> SD卡检测引脚 

  2. MMC0_WPN     -->     GPGL13     --> SD卡写保护引脚

  3. MMC0_DATA[0-3] -->   GPG[2-5]   -->

  4. MMC0_CMD     -->     GPG1       --> SD命令线

  5. MMC0_CLK     -->     GPG0       --> SDIO/SD卡时钟线

1.2 uboot中初始化过程
uboot lib_arm/board.c中

  1. void start_armboot (void)

  2. {

  3. #if defined(CONFIG_BOOT_MOVINAND)

  4.     puts ("SD/MMC: ");

  5.     if ((0x24564236 == magic[0]) && (0x20764316 == magic[1])) {

  6.         printf("Boot up for burningn");

  7.     } else {

  8.         movi_set_capacity();

  9.         movi_set_ofs(MOVI_TOTAL_BLKCNT);

  10.         movi_init();

  11.     }

  12. #endif

  13. }

 a. 设置为sector mode   

  1. movi_set_capacity();

  2. {

  3.     if (MOVI_HIGH_CAPACITY & 0x1) //in sector mode, this value will be set

  4.         movi_hc = 1; //全局变量movi_hc=1

  5. }

 b.以扇区为单位,设置BL1,ENV,BL2,kernel,rootfs的位置    

  1. movi_set_ofs(MOVI_TOTAL_BLKCNT);

  2. {

  3.     if (ofsinfo.last != last) {

  4.         ofsinfo.last = last - (eFUSE_SIZE / MOVI_BLKSIZE);

  5.         ofsinfo.bl1 = ofsinfo.last - MOVI_BL1_BLKCNT;

  6.         ofsinfo.env = ofsinfo.bl1 - MOVI_ENV_BLKCNT;

  7.         ofsinfo.bl2 = ofsinfo.bl1 - (MOVI_BL2_BLKCNT + MOVI_ENV_BLKCNT);

  8.         ofsinfo.kernel = ofsinfo.bl2 - MOVI_ZIMAGE_BLKCNT;

  9.         ofsinfo.rootfs = ofsinfo.kernel - MOVI_ROOTFS_BLKCNT;

  10.         changed = 1;

  11.     }

  12. }

 c. SD控制器初始化   

  1. movi_init();

  2. {

  3.     hsmmc_set_gpio();

  4.     {

  5.         reg = readl(GPGCON) & 0xf0000000;

  6.         writel(reg | 0x02222222, GPGCON); //设置 GPG为MMC模式

  7.         reg = readl(GPGPUD) & 0xfffff000;

  8.         writel(reg, GPGPUD); //上拉电阻disable

  9.     }

  10.     hsmmc_reset();

  11.     {

  12.         s3c_hsmmc_writeb(0x3, HM_SWRST);   //data_line && cmd_line reset        

  13.     }

  14.     if (hsmmc_init()) {

  15.         printf("nCard Initialization failed.n");

  16.         return -1;

  17.     }

  18.     return 1;

  19. }

cpu/s3c64xx/hs_mmc.c

  1. int hsmmc_init (void)

  2. {

  3.     hsmmc_clock_onoff(0); //关闭SDCLK

  4.     {

  5.         a. CLKCON0[2]:0 //SD Clock diaable

  6.     }

  7.     

  8.     a. SCLK_GATE-->0x7E00_F038[27]:

  9.     SCLK_MMC0_48 [27] Gating special clock for MMC0 (0: mask, 1: pass)

  10.     

  11.     b.

  12.     set_clock(SD_EPLL, 0x80);

  13.     {

  14.         //CONTROL2_0 0x7C200080 R/W Control register 2 (Channel 0)

  15.         //[5:4]: Base Clock Source Select--> EPLL

  16.         //[14]:1 Feedback Clock Enable for Rx Data/Command Clock

  17.         //[30]:1 Command Conflict Mask Enable

  18.         //[31]:1 Write Status Clear Async Mode Enable 

  19.         s3c_hsmmc_writel(0xC0004100 | (clksrc << 4), HM_CONTROL2);

  20.         

  21.         s3c_hsmmc_writel(0x00008080, HM_CONTROL3);

  22.         s3c_hsmmc_writel(0x3 << 16, HM_CONTROL4);

  23.         //下3条: SDCLK Frequency Select

  24.         //div=80h base clock divided by 256

  25.         //

  26.         //最后的for The SD Host Driver shall wait to set SD Clock Enable until this bit is set to 1.

  27.         s3c_hsmmc_writew(s3c_hsmmc_readw(HM_CLKCON) & ~(0xff << 8), HM_CLKCON);

  28.         s3c_hsmmc_writew(((div<<8) | 0x1), HM_CLKCON);

  29.         for(i=0; i<0x10000; i++) ; //wait stable

  30.         

  31.         hsmmc_clock_onoff(1);

  32.     }

  33.     c. s3c_hsmmc_writeb(0xe, HM_TIMEOUTCON);

  34.         TIME_OUT_CNT=1110b TMCLK x 2的27

  35. }

为了区别SD卡是2.0还是1.0,或是MMC卡,这里根据协议向上兼容的原理,首先发送只有SD2.0才有的命令CMD8,如果CMD8返回无错误,则初步判断为2.0卡,进一步发送命令循环发送CMD55+ACMD41,直到返回0x00,确定SD2.0卡初始化成功,进入Ready状态,再发送CMD58命令来判断是HCSD还是SCSD,到此SD2.0卡初始化成功。如果CMD8返回错误则进一步判断为1.0卡还是MMC卡,循环发送CMD55+ACMD41,返回无错误,则为SD1.0卡,到此SD1.0卡初始成功,如果在一定的循环次数下,返回为错误,则进一步发送CMD1进行初始化,如果返回无错误,则确定为MMC卡,如果在一定的次数下,返回为错误,则不能识别该卡,初始结束。


二、读取扇区
SDMK6410> fatload mmc 0:1 50008000 zImage
以读取MBR为例
do_fat_fsload 
    --> fat_register_device(dev_desc,part);
        --> dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *)buffer);
1. 初始化时
hsmmc_init() //初始化mmc_dev的函数指针
{
    mmc_dev.if_type = IF_TYPE_MMC;
    mmc_dev.part_type = PART_TYPE_DOS;
    mmc_dev.dev = 0;
    mmc_dev.blksz = MMC_BLOCK_SIZE;
    mmc_dev.block_read = mmc_bread;
}    
2. 正式进入读取部分
cpu/s3c64xx/hs_mmc.c L1337
/*
    dev_num: 第几个mmc设备
    blknr:   开始的扇区
    blkcnt:  要读取的扇区数
    dst:     数据保存到的dst_buffer 
*/
static ulong mmc_bread (int dev_num, ulong blknr, ulong blkcnt, ulong* dst)
{
    if (dst >= 0xc0000000)
        dst = virt_to_phys(dst); //取物理地址
    if (blkcnt != 0)        //连dev_num都不要了,看来只能支持1个SD设备
        movi_read((uint) dst, (uint) blknr, (uint) blkcnt);
    return blkcnt;
}

void movi_read (uint addr, uint start_blk, uint blknum)
{
}

三、写入扇区
SMDK6410> saveenv


关键字:S3C6410  uboot  SD初始化  读写分析 引用地址:S3C6410使用---7uboot中SD初始化及读写分析

上一篇:S3C6410使用---10为SD卡与NAND FLASH的uboot加上menu菜单
下一篇:TQ2440之uboot---8.tftp下载内核并启动内核

推荐阅读最新更新时间:2024-03-16 16:00

uboot之\cpu\s3c44b0\start.S文件的详解
今天总算看完了,理解完了,理解清楚了,看透了start.S~~~~~~ 本来不想写的,想想还是轻描淡写吧:好理解的一笔带过,难理解的重点介绍。 .globl _start _start: b reset add pc, pc, #0x0c000000 add pc, pc, #0x0c000000 add pc, pc, #0x0c000000 add pc, pc, #0x0c000000 add pc, pc, #0x0c000000 add pc, pc, #0x0c000000 add pc, pc, #0x0c000000 .balignl 16,0xdeadbeef _start 全局变量,ub
[单片机]
<font color='red'>uboot</font>之\cpu\s3c44b0\start.S文件的详解
s3c6410 uboot代码分析
以下用以记录uboot代码的分析过程,目标是s3c6410,如有错误,欢迎指正。 强调,内容与三星原厂提供的uboot-1.1.6有更改的地方,因为外接外设的区别,特别是nand_flash、外接网卡芯片和LCD芯片 以下纯代码情景分析,请结合uboot的功能结构图和内存分布图查看代码,这样会更加容易理解。 s3c-u-boot-1.1.6源代码可以在三星下面的网站获得,但前提是你有官方的email。 还是百度google搜一下吧,当然我这也是有的哦。 http://www.samsung.com/global/business/semiconductor/productInfo.do?fmly_id=835&partnum
[单片机]
<font color='red'>s3c6410</font> <font color='red'>uboot</font>代码<font color='red'>分析</font>
用DNW通过USB烧uboot到nand
  烧写前提:已经把FS2410开发板的S3C2410_BIOS.bin通过JTAG烧到了NOR里面了,这样我们从NOR启动才可以使用USB下载功能,从NOR启动界面如下:   我们首先选择0,把我们自己的uboot下载到内存   我们这时把USB线插到主板和主机,如果是第一次使用,则会弹出对话框提示安装驱动,安装完驱动后会提示如下图:   我们配置一下要下载到内存的位置,选择菜单   Configuration Options 如下图:   在DownloadAddress 里的0X3020000是我们要下载到内存的地址   配置好后,然后我选择菜单   USB P
[嵌入式]
uboot之ARM位置无关代码设计
前言: 所谓位置无关代码是指:可执行镜像test.bin 我将它拷贝至内存0x30000000,然后pc = 0x30000000、它可以顺利执行; 我将它拷贝至内存0x38000000,然后pc = 0x38000000、它仍可以顺利执行。 1.程序的编译及运行流程 源码经过编译、汇编(生成相对地址符号表)和连接(提供绝对首地址、进而确定绝对地址符号表)后编程可执行镜像; 特别指出地是:在连接时,对各个目标文件进行重定位、建立符号引用规则;进而为变量和函数分配了绝对的运行地址; 程序执行时,系统必须把可执行镜像加载到连接阶段指定的地址空间,这样程序执行中才能对变量、函数等符号做正确引用,程序才能正常运行。 在有操作系
[单片机]
UBOOT添加命令的执行流程
BootLoader(引导装载程序)是嵌入式系统软件开发的第一个环节,它把操作系统和硬件平台衔接在一起,对于嵌入式系统的后续软件开发十分重要,在整个开发中也占有相当大的比例。U-BOOT是当前比较流行、功能强大的BootLoader,可以支持多种体系结构。LH7A400是Sharp公司生产的一款基于ARM922T内核的32位RISC芯片,本文详细介绍U-BOOT的功能、特点以及在LH7A400处理器上的移植过程。希望对大家有所帮助,更好的了解uboot命令的执行流程。 具体内容如下: U-Boot的命令为用户提供了交互功能,并且已经实现了几十个常用的命令。如果开发板需要很特殊的操作,可以添加新的U-Boot命令。 U-Boot的每
[单片机]
基于S3C6410裸机程序中可能用到的函数分享
裸机程序中可能用到的文件以及函数 #include“system.h” /************************************************************************************************************************* *函数:voidSetEINT_TriggerMode(u8EINT0_N,u8Trigger) *功能:设置外部中断组0触发模式 *参数:EINT0_N:中断源的编号(见:中断组0编号定义);Trigger:触发模式(EXT_LowLevel:低电平触发;EXT_HighLevel:高电平触发; EXT_NegEdg
[单片机]
基于<font color='red'>S3C6410</font>裸机程序中可能用到的函数分享
S3C6410输入子系统按键驱动程序
以前写的驱动程序要另外写一个测试程序,这样的驱动程序就有很大的局限性,只能自己用,为了通用性,别人的应用程序也可以用我的驱动程序就要引入输入子系统。在这个驱动程序里设置了5个按键L, S, ENTER, LEFTSHIFT, ESC.设置这几个按键主要是为了方便测试。以下是驱动程序button_input.c #include linux/module.h #include linux/init.h #include linux/fs.h #include linux/interrupt.h #include linux/irq.h #include linux/sched.h #include linux/pm.h
[单片机]
<font color='red'>S3C6410</font>输入子系统按键驱动程序
uboot如何检测s3c2440是从Nand Flash还是Nor Flash启动
nand启动时,地址0x00000000为SRAM映射的地址;nor启动时,地址0x00000000为norflash的实际起始地址。向norflash中写数据需要特定的命令时序,而向内存中写数据可以直接向内存地址赋值。 根据这两个特性,我们可以这样检测,代码如下 int check_flashboot_mode(void) { volatile unsigned int *pdw = (volatile unsigned int *)0; unsigned int dwVal; dwVal = *pdw; *pdw = 0x12345678; if (*pdw != 0x12345678)
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved