今天调试过程中出现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
阅读(2479) | 评论(0) | 转发(0) |