⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sddriver.lst

📁 针对at91sam7a3为主芯片开发板开发的spi口应用程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \                     ??SD_GetCardInfo_1:
   \   000000DC   04B0               ADD         SP,#+0x10
   \   000000DE   30BC               POP         {R4,R5}
   \   000000E0   02BC               POP         {R1}
   \   000000E2   0847               BX          R1                 ;; return
   \                     ??SD_GetCardInfo_2:
   \   000000E4   ........           DC32        sds + 8
   \   000000E8   ........           DC32        sds + 12
    507          }
    508          
    509          /*******************************************************************************************************************
    510          ** 函数名称: INT8U SD_CalTimeout()				Name:	  INT8U SD_CalTimeout()
    511          ** 功能描述: 计算读/写/擦超时时间				Function: calculate timeout of reading,writing,erasing
    512          ** 输   入: INT8U *csdbuf : CSD寄存器内容		Input: 	  INT8U *csdbuf : CSD register content
    513          ** 输    出: 0:   成功    >0:  错误码			Output:	  0:  right			>0:  error code
    514          *******************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    515          INT8U SD_CalTimeout(INT8U *csdbuf)
    516          {
   \                     SD_CalTimeout:
   \   00000000   F0B5               PUSH        {R4-R7,LR}
   \   00000002   021C               MOV         R2,R0
    517          	INT32U tmp;
    518          	INT8U time_u,time_v,fator;
    519          	
    520          	sds.timeout_read = READ_TIMEOUT_100MS;								/* 默认读超时为100ms */
   \   00000004   3C48               LDR         R0,??SD_CalTimeout_0  ;; sds + 16
   \   00000006   8721               MOV         R1,#+0x87
   \   00000008   4902               LSL         R1,R1,#+0x9        ;; #+0x10E00
   \   0000000A   0160               STR         R1,[R0, #+0]
    521          	sds.timeout_write = WRITE_TIMEOUT_250MS;							/* 默认写超时为250ms */
   \   0000000C   3B48               LDR         R0,??SD_CalTimeout_0+0x4  ;; sds + 20
   \   0000000E   3C49               LDR         R1,??SD_CalTimeout_0+0x8  ;; 0x2a300
   \   00000010   0160               STR         R1,[R0, #+0]
    522          	sds.timeout_erase = WRITE_TIMEOUT_250MS;
   \   00000012   3C48               LDR         R0,??SD_CalTimeout_0+0xC  ;; sds + 24
   \   00000014   3A49               LDR         R1,??SD_CalTimeout_0+0x8  ;; 0x2a300
   \   00000016   0160               STR         R1,[R0, #+0]
    523          		
    524          	time_u = (csdbuf[TAAC_POS] & TAAC_MSK);								/* 读超时时间单位 read timeout unit */
   \   00000018   5078               LDRB        R0,[R2, #+0x1]
   \   0000001A   4007               LSL         R0,R0,#+0x1D       ;; ZeroExt     R0,R0,#+0x1D,#+0x1D
   \   0000001C   400F               LSR         R0,R0,#+0x1D
   \   0000001E   031C               MOV         R3,R0
    525          	time_v = (csdbuf[TAAC_POS] & NSAC_MSK) >> 3;						/* 读超时时间值   read timeout value */
   \   00000020   5078               LDRB        R0,[R2, #+0x1]
   \   00000022   7821               MOV         R1,#+0x78
   \   00000024   0140               AND         R1,R0
   \   00000026   081C               MOV         R0,R1
   \   00000028   C010               ASR         R0,R0,#+0x3
   \   0000002A   041C               MOV         R4,R0
    526          	fator = (csdbuf[R2WFACTOR_POS] & R2WFACTOR_MSK) >> 2;				/* 读超时时间因数 read timeout factor */
   \   0000002C   107B               LDRB        R0,[R2, #+0xC]
   \   0000002E   1C21               MOV         R1,#+0x1C
   \   00000030   0140               AND         R1,R0
   \   00000032   081C               MOV         R0,R1
   \   00000034   8010               ASR         R0,R0,#+0x2
   \   00000036   051C               MOV         R5,R0
    527          	
    528          	if(time_v == 0)	return SD_ERR_CARD_PARAM;							/* 卡参数有错误 card parameter is error */
   \   00000038   2406               LSL         R4,R4,#+0x18       ;; ZeroExt     R4,R4,#+0x18,#+0x18
   \   0000003A   240E               LSR         R4,R4,#+0x18
   \   0000003C   002C               CMP         R4,#+0
   \   0000003E   01D1               BNE         ??SD_CalTimeout_1
   \   00000040   0320               MOV         R0,#+0x3
   \   00000042   56E0               B           ??SD_CalTimeout_2
    529          	
    530          	tmp = SPI_CLOCK * time_value[time_v] / 10 / time_unit[time_u];		/* TACC * f (单位 unit: clock) */
   \                     ??SD_CalTimeout_1:
   \   00000044   2406               LSL         R4,R4,#+0x18       ;; ZeroExt     R4,R4,#+0x18,#+0x18
   \   00000046   240E               LSR         R4,R4,#+0x18
   \   00000048   2F48               LDR         R0,??SD_CalTimeout_0+0x10  ;; time_value
   \   0000004A   005D               LDRB        R0,[R0, R4]
   \   0000004C   2F49               LDR         R1,??SD_CalTimeout_0+0x14  ;; 0x546000
   \   0000004E   4843               MUL         R0,R1
   \   00000050   0A21               MOV         R1,#+0xA
   \   00000052   ........           _BLF        ??div32_t,??rT??div32_t
   \   00000056   081C               MOV         R0,R1
   \   00000058   1B06               LSL         R3,R3,#+0x18       ;; ZeroExt     R3,R3,#+0x18,#+0x18
   \   0000005A   1B0E               LSR         R3,R3,#+0x18
   \   0000005C   0421               MOV         R1,#+0x4
   \   0000005E   5943               MUL         R1,R3
   \   00000060   2B4F               LDR         R7,??SD_CalTimeout_0+0x18  ;; time_unit
   \   00000062   7958               LDR         R1,[R7, R1]
   \   00000064   ........           _BLF        ??divu32_t,??rT??divu32_t
   \   00000068   0E1C               MOV         R6,R1
    531          	tmp = tmp + csdbuf[NSAC_POS] * 100;									/* TACC * f + NSAC * 100 (单位 unit: clock) */
   \   0000006A   9078               LDRB        R0,[R2, #+0x2]
   \   0000006C   6421               MOV         R1,#+0x64
   \   0000006E   4843               MUL         R0,R1
   \   00000070   3618               ADD         R6,R6,R0
    532          	
    533          	/* 计算得到的超时值 the timeout value of being calculated */
    534          	sds.timeout_read = tmp;
   \   00000072   2148               LDR         R0,??SD_CalTimeout_0  ;; sds + 16
   \   00000074   0660               STR         R6,[R0, #+0]
    535          	sds.timeout_write = tmp * r2w_fator[fator];							/* (TACC * f + NSAC * 100) * R2WFACTOR (单位 unit:clock)*/
   \   00000076   2148               LDR         R0,??SD_CalTimeout_0+0x4  ;; sds + 20
   \   00000078   2D06               LSL         R5,R5,#+0x18       ;; ZeroExt     R5,R5,#+0x18,#+0x18
   \   0000007A   2D0E               LSR         R5,R5,#+0x18
   \   0000007C   2549               LDR         R1,??SD_CalTimeout_0+0x1C  ;; r2w_fator
   \   0000007E   495D               LDRB        R1,[R1, R5]
   \   00000080   7143               MUL         R1,R6
   \   00000082   0160               STR         R1,[R0, #+0]
    536          	
    537          	if (sds.card_type == CARDTYPE_SD)
   \   00000084   ....               LDR         R0,??DataTable7    ;; sds
   \   00000086   0078               LDRB        R0,[R0, #+0]
   \   00000088   0028               CMP         R0,#+0
   \   0000008A   1FD1               BNE         ??SD_CalTimeout_3
    538          	{
    539          		sds.timeout_read  = sds.timeout_read * 100 / 8;					/* 实际值为计算值的100倍 */
   \   0000008C   1A48               LDR         R0,??SD_CalTimeout_0  ;; sds + 16
   \   0000008E   1A49               LDR         R1,??SD_CalTimeout_0  ;; sds + 16
   \   00000090   0968               LDR         R1,[R1, #+0]
   \   00000092   6427               MOV         R7,#+0x64
   \   00000094   7943               MUL         R1,R7
   \   00000096   C908               LSR         R1,R1,#+0x3
   \   00000098   0160               STR         R1,[R0, #+0]
    540          		sds.timeout_write = sds.timeout_write * 100 / 8;
   \   0000009A   1848               LDR         R0,??SD_CalTimeout_0+0x4  ;; sds + 20
   \   0000009C   1749               LDR         R1,??SD_CalTimeout_0+0x4  ;; sds + 20
   \   0000009E   0968               LDR         R1,[R1, #+0]
   \   000000A0   6427               MOV         R7,#+0x64
   \   000000A2   7943               MUL         R1,R7
   \   000000A4   C908               LSR         R1,R1,#+0x3
   \   000000A6   0160               STR         R1,[R0, #+0]
    541          		if (sds.timeout_read > READ_TIMEOUT_100MS)						/* 取计算值与默认值中的最小值 */
   \   000000A8   1348               LDR         R0,??SD_CalTimeout_0  ;; sds + 16
   \   000000AA   0068               LDR         R0,[R0, #+0]
   \   000000AC   1A49               LDR         R1,??SD_CalTimeout_0+0x20  ;; 0x10e01
   \   000000AE   8842               CMP         R0,R1
   \   000000B0   03D3               BCC         ??SD_CalTimeout_4
    542          			sds.timeout_read = READ_TIMEOUT_100MS;
   \   000000B2   1148               LDR         R0,??SD_CalTimeout_0  ;; sds + 16
   \   000000B4   8721               MOV         R1,#+0x87
   \   000000B6   4902               LSL         R1,R1,#+0x9        ;; #+0x10E00
   \   000000B8   0160               STR         R1,[R0, #+0]
    543          		
    544          		if (sds.timeout_write > WRITE_TIMEOUT_250MS)
   \                     ??SD_CalTimeout_4:
   \   000000BA   1048               LDR         R0,??SD_CalTimeout_0+0x4  ;; sds + 20
   \   000000BC   0068               LDR         R0,[R0, #+0]
   \   000000BE   1749               LDR         R1,??SD_CalTimeout_0+0x24  ;; 0x2a301
   \   000000C0   8842               CMP         R0,R1
   \   000000C2   11D3               BCC         ??SD_CalTimeout_5
    545          			sds.timeout_write = WRITE_TIMEOUT_250MS;
   \   000000C4   0D48               LDR         R0,??SD_CalTimeout_0+0x4  ;; sds + 20
   \   000000C6   0E49               LDR         R1,??SD_CalTimeout_0+0x8  ;; 0x2a300
   \   000000C8   0160               STR         R1,[R0, #+0]
   \   000000CA   0DE0               B           ??SD_CalTimeout_5
    546          	}
    547          	else
    548          	{
    549          		sds.timeout_read  = sds.timeout_read * 10 / 8;					/* 实际值为计算值的10倍 */
   \                     ??SD_CalTimeout_3:
   \   000000CC   0A48               LDR         R0,??SD_CalTimeout_0  ;; sds + 16
   \   000000CE   0A49               LDR         R1,??SD_CalTimeout_0  ;; sds + 16
   \   000000D0   0968               LDR         R1,[R1, #+0]
   \   000000D2   0A27               MOV         R7,#+0xA
   \   000000D4   7943               MUL         R1,R7
   \   000000D6   C908               LSR         R1,R1,#+0x3
   \   000000D8   0160               STR         R1,[R0, #+0]
    550          		sds.timeout_write = sds.timeout_write * 10 / 8;
   \   000000DA   0848               LDR         R0,??SD_CalTimeout_0+0x4  ;; sds + 20
   \   000000DC   0749               LDR         R1,??SD_CalTimeout_0+0x4  ;; sds + 20
   \   000000DE   0968               LDR         R1,[R1, #+0]
   \   000000E0   0A27               MOV         R7,#+0xA
   \   000000E2   7943               MUL         R1,R7
   \   000000E4   C908               LSR         R1,R1,#+0x3
   \   000000E6   0160               STR         R1,[R0, #+0]
    551          	}
    552          	
    553          	sds.timeout_erase = sds.timeout_write;
   \                     ??SD_CalTimeout_5:
   \   000000E8   0648               LDR         R0,??SD_CalTimeout_0+0xC  ;; sds + 24
   \   000000EA   0449               LDR         R1,??SD_CalTimeout_0+0x4  ;; sds + 20
   \   000000EC   0968               LDR         R1,[R1, #+0]
   \   000000EE   0160               STR         R1,[R0, #+0]
    554          	return SD_NO_ERR;	
   \   000000F0   0020               MOV         R0,#+0
   \                     ??SD_CalTimeout_2:
   \   000000F2   F0BC               POP         {R4-R7}
   \   000000F4   02BC               POP         {R1}
   \   000000F6   0847               BX          R1                 ;; return
   \                     ??SD_CalTimeout_0:
   \   000000F8   ........           DC32        sds + 16
   \   000000FC   ........           DC32        sds + 20
   \   00000100   00A30200           DC32        0x2a300
   \   00000104   ........           DC32        sds + 24
   \   00000108   ........           DC32        time_value
   \   0000010C   00605400           DC32        0x546000
   \   00000110   ........           DC32        time_unit
   \   00000114   ........           DC32        r2w_fator
   \   00000118   010E0100           DC32        0x10e01
   \   0000011C   01A30200           DC32        0x2a301
    555          }
    556          
    557          /*******************************************************************************************************************
    558          ** 函数名称: INT8U SD_ActiveInit()				Name:	  INT8U SD_ActiveInit()
    559          ** 功能描述: 激活卡,并获得卡型					Function: active card, and get the card type
    560          ** 输   入: 无								 	Input:    NULL
    561          ** 输    出: 0:   成功    >0:  错误码			Output:	  0:  right			>0:  error code
    562          ** 函数说明: 该命令不断重复发送到SD卡,直到响应R1的Bit0(Idle)位为0,表示SD卡内部初始化处理完成。
    563          		     当响应的Idle位为0时,SD卡就完全进入SPI模式了。当然重复发送命令CMD1是有次数限制的,
    564          		     最大次数为宏定义SD_IDLE_WAIT_MAX.
    565          *******************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    566          INT8U SD_ActiveInit(void)
    567          {
   \                     SD_ActiveInit:
   \   00000000   30B5               PUSH        {R4,R5,LR}
   \   00000002   83B0               SUB         SP,#+0xC
    568          	INT8U param[4] =

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -