bootloader---27.uboot中SD初始化及读写分析

原创 2016年08月30日 11:16:10
一、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]://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
版权声明:本文为博主原创文章,转载请注明出处。

linux下MMC/SD/SDIO驱动系列之一 ---- 概述

最近在研究WIFI驱动,驱动模块为broamd4330,基于SDIO接口,所以趁机研究了一下内核中对于SDIO设备的注册。               (我使用的linux内核版本为3.2.0  ...
  • xieweihua2012
  • xieweihua2012
  • 2013年10月16日 20:43
  • 9373

友善之臂tiny4412使用SD卡烧录uboot,并使开发板从SD卡启动进入uboot过程记录。

一、前提准备: 建议:为保持过程的一致性,建议使用和以下描述中一样的软硬件。其它软硬件不保证过程的可行性。以下描述的过程,博主已多次验证,可行。 1.安装了ubuntu系统的电脑一台,我使用的是14...
  • chicken_wing_is_good
  • chicken_wing_is_good
  • 2015年11月28日 11:52
  • 2469

uboot 源码官方下载地址

最近打算开始学习uboot,得好好加油。    U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展...
  • mrwangwang
  • mrwangwang
  • 2015年06月12日 09:19
  • 1677

U-Boot and MMC/SDIO

U-Boot supports MMC Cards with multiple paritions, with the FAT file system. For general information...
  • tronteng
  • tronteng
  • 2012年05月28日 21:20
  • 1000

uboot中挂载U盘,利用FAT文件系统读写U盘文件

关于使用U盘自动更新系统镜像,请看我的这篇博文:http://blog.chinaunix.net/space.php?uid=22030783&do=blog&id=3347599 下面开...
  • zjy900507
  • zjy900507
  • 2017年12月12日 10:27
  • 126

uboot里读sd卡内容

uboot里读sd卡内容
  • wen0006
  • wen0006
  • 2010年09月15日 17:22
  • 3129

sdio官方资料合集

  • 2017年02月09日 21:31
  • 4.59MB
  • 下载

uboot-2015.04

  • 2015年06月23日 21:07
  • 9.03MB
  • 下载

linux下为SD卡烧写uboot.bin的原理与方法

  • 2013年05月19日 00:07
  • 317KB
  • 下载

从零开始教你制作友善之壁TINY4412----SD卡uboot启动卡

关于这节,有很多小伙伴要我亲自写一遍,那好吧,我就亲自写一遍:首先,你要制作一张SD卡,把SD卡先插到电脑端口:然后看以下步骤:1、查看SD卡位于哪个分区哪个设备节点(1)先查看SD卡的设备节点是哪个...
  • morixinguan
  • morixinguan
  • 2017年04月16日 17:49
  • 1488
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bootloader---27.uboot中SD初始化及读写分析
举报原因:
原因补充:

(最多只允许输入30个字)