s3c2416 sd android,S3C2416 u-boot SD卡笔记

博客内容涉及嵌入式系统中SD卡的初始化过程,包括HSMMC模块的错误排查,如CMDREG命令设置、ACMD41参数的正确发送、时钟配置等。作者在调试过程中遇到的错误包括raise信号错误、函数块缺失和头文件包含问题。通过修复这些问题,成功识别并初始化了SD卡。关键点在于理解SD卡初始化的步骤,如发送ACMD41时必须携带支持SDHC卡的参数,并且需要适当增加循环次数以等待卡片完成上电。
摘要由CSDN通过智能技术生成

今天调试过程中出现raise: Signal # 8 caught

搜索raise: Signal # %d caught

发现该代码在raise函数中,这是工具链提示的错误,因为用到了除法运算,但是可能libgcc.so中没有实现raise函数。

后面又检查发现不是除法的问题,是get_PLLCLK函数的else分支没有加{}所致。

添加另一份代码Hsmmc.c Hsmmc.h后,编译 报错,位置在s3c24x0.h,但是这个文件原先就包含了,为什么之前没报错?

expected '=', ',', ';', 'asm' or '__attribute__'

error: expected specifier-qualifier-list

这里u8 u16 u32没有定义,在s3c24x0.h添加#include 即可

#define rCLKSRC                CLKSRCCON_REG

#define rHM1_SYSAD         __REG(HM_SYSAD    )

#define rHM1_BLKSIZE       __REGw(HM_BLKSIZE    )

#define rHM1_BLKCNT        __REGw(HM_BLKCNT    )

#define rHM1_ARGUMENT      __REG(HM_ARGUMENT    )

#define rHM1_TRNMOD        __REGw(HM_TRNMOD    )

#define rHM1_CMDREG        __REGw(HM_CMDREG    )

#define rHM1_RSPREG0       __REG(HM_RSPREG0    )

#define rHM1_RSPREG1       __REG(HM_RSPREG1    )

#define rHM1_RSPREG2       __REG(HM_RSPREG2    )

#define rHM1_RSPREG3       __REG(HM_RSPREG3    )

#define rHM1_BDATA         __REG(HM_BDATA    )

#define rHM1_PRNSTS        __REG(HM_PRNSTS    )

#define rHM1_HOSTCTL       __REGb(HM_HOSTCTL    )

#define rHM1_PWRCON        __REGb(HM_PWRCON    )

#define rHM1_BLKGAP        __REGb(HM_BLKGAP    )

#define rHM1_WAKCON        __REGb(HM_WAKCON    )

#define rHM1_CLKCON        __REGw(HM_CLKCON    )

#define rHM1_TIMEOUTCON    __REGb(HM_TIMEOUTCON    )

#define rHM1_SWRST         __REGb(HM_SWRST    )

#define rHM1_NORINTSTS     __REGw(HM_NORINTSTS    )

#define rHM1_ERRINTSTS     __REGw(HM_ERRINTSTS    )

#define rHM1_NORINTSTSEN   __REGw(HM_NORINTSTSEN    )

#define rHM1_ERRINTSTSEN   __REGw(HM_ERRINTSTSEN    )

#define rHM1_NORINTSIGEN   __REGw(HM_NORINTSIGEN    )

#define rHM1_ERRINTSIGEN   __REGw(HM_ERRINTSIGEN    )

#define rHM1_ACMD12ERRST   __REGw(HM_ACMD12ERRSTS)

#define rHM1_CAPAREG       __REG(HM_CAPAREG    )

#define rHM1_MAXCURR       __REG(HM_MAXCURR    )

#define rHM1_CONTROL2          __REG(HM_CONTROL2)

#define rHM1_CONTROL3          __REG(HM_CONTROL3)

#define rHM1_CONTROL4          __REG(HM_CONTROL4)

#define rHM1_HCVER            __REG(HM_HCVER)

#define rGPLCON             __REG(GPLCON)

#define rGPLUDP                __REG(GPLPU)

CMDREG 为16bit,[15:8]为要发送的命令号,[7:6]为命令类型,除了CMD12需指明类型0x3,其余命令均忽略类型。

[5]设置是否占用数据线,1为占用。[4]设置是否检查命令。[3]为CRC enable,[1]选择响应长度和类型。

CMD为1个字节,最高两位固定为0x01,所以一般都要进行 CMD |= 0x40,但是s3c2416的hsmmc好像会自动完成这一步,如果是不带sd控制器的mcu,必须要cmd|=0x40。

static int Hsmmc_IssueCommand(unsigned char Cmd, unsigned int Arg, unsigned char Data, unsigned char Response)

Response

失败的设置:

HM_CONTROL2(0x80) = 0x000fc010

HM_CONTROL3(0x84) = 0x00800080

HM_CONTROL4(0x8c) = 0x00030000

HM_CLKCON  (0x2c) = 0x8003

正确识别卡的设置:

HM_CONTROL2(0x80) = 0xc00f0120

HM_CONTROL3(0x84) = 0x00000000

HM_CONTROL4(0x8c) = 0x00030000

HM_CLKCON  (0x2c) = 0x8003

clock_config函数中有错误:

699    hsmmc_clock_onoff(0);  这里应该关闭时钟,而不是打开

2015.6.9 经过对比发现rHM1_CONTROL3[31] [23] [15] [7]必须试着为0,原来的代码中将[23]和[7]设置为1,因此读卡超时。

OCR一直等于0x00f8000

这是因为发送ACMD41时必须发送参数(1<30),指明支持SDHC卡,一定要加上这个参数。SD卡必须有足够的时间完成上电工作,所以要循环发送ACMD41命令,检查busy位,原来的只有5次循环,加到1000就能识别出卡了。打印信息如下:

RSP of CMD8: 00000000

ocr2: 00ff8000

ocr2: 00ff8000

ocr2: 00ff8000

ocr2: 80ff8000

SD card is detected

Product Name : SU02G?

sd_spec = 0(0x00802502)

set_hostctl_speed NORMAL

clock config rHM_HOSTCTL(0x28) = 0x00

transfer rHM_HOSTCTL(0x28) = 0x02

ACMD41参数必须发送ocr|(1<<30)才能识别卡,不能只发送HCS位(1<30),大多数卡第一次获取的OCR值为 0x00ff8000

ocr = s3c_hsmmc_readl(HM_RSPREG0);

dbg("sdocr1: %08x\n", ocr);

for (i = 0; i < 50; i++) {//lhh modify 0802

issue_command(MMC_APP_CMD, 0x0, 0, MMC_RSP_R1);

issue_command(SD_APP_OP_COND, ocr|(1<<30), 0, MMC_RSP_R3);

测试:

拷贝MBR到0xc0000000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值