Chinaunix首页 | 论坛 | 博客
  • 博客访问: 465445
  • 博文数量: 100
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 955
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-21 09:30
文章分类

全部博文(100)

文章存档

2017年(1)

2016年(16)

2015年(83)

我的朋友

分类: 嵌入式

2015-06-27 10:46:14

今天调试过程中出现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
阅读(2357) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~