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

📄 sddriver.lst

📁 针对at91sam7a3为主芯片开发板开发的spi口应用程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    403          			return ret;
    404          		}
    405          		
    406          		ret = SD_EraseEndBlock(startaddr + sds.erase_unit - 1);		/* 选择终止块地址 select end address */
    407          		if (ret != SD_NO_ERR)
    408          		{
    409          			SD_EndSD();
    410          			return ret;
    411          		}
    412          			
    413          		ret = SD_EraseSelectedBlock();							/* 擦除所选的块 erase blocks selected */
    414          		if (ret != SD_NO_ERR)
    415          		{
    416          			SD_EndSD();
    417          			return ret;
    418          		}
    419          
    420          		startaddr += sds.erase_unit;								/* 起始地址递增 */
    421          		blocknum  -= sds.erase_unit;
    422          		tmp = blocknum - sds.erase_unit;
    423          	};		
    424          	
    425          	if (blocknum > 0)											/* 擦除不够once_erase块 */
    426          	{															/* erase blocks that numbers is not enough once_erase */
    427          		ret = SD_EraseStartBlock(startaddr);
    428          		if (ret != SD_NO_ERR)
    429          		{
    430          			SD_EndSD();
    431          			return ret;
    432          		}
    433          		
    434          		ret = SD_EraseEndBlock(startaddr + blocknum - 1);
    435          		if (ret != SD_NO_ERR)
    436          		{
    437          			SD_EndSD();
    438          			return ret;
    439          		}
    440          			
    441          		ret = SD_EraseSelectedBlock();
    442          		if (ret != SD_NO_ERR)
    443          		{
    444          			SD_EndSD();
    445          			return ret;
    446          		}
    447          	}
    448          
    449          	SD_EndSD();
    450          	return SD_NO_ERR;											/* 返回擦除成功 return erase sucessfully */
    451          }
    452          #endif
    453          
    454          
    455          	/*****************************************************************
    456          	
    457          	    		下面为子程序
    458          	
    459          	*****************************************************************/
    460          /*******************************************************************************************************************
    461          ** 函数名称: INT8U SD_GetCardInfo()				Name:	  INT8U SD_GetCardInfo()
    462          ** 功能描述: 获得SD/MMC卡的信息					Function: get the information of SD/MMC card
    463          ** 输   入: INT8U cardtype: 卡类型				Input:    INT8U cardtype: card type	
    464          ** 输    出: 0:   成功    >0:  错误码			Output:	  0:  right			>0:  error code
    465          *******************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    466          INT8U SD_GetCardInfo()
    467          {
   \                     SD_GetCardInfo:
   \   00000000   30B5               PUSH        {R4,R5,LR}
   \   00000002   84B0               SUB         SP,#+0x10
    468          	INT32U tmp;
    469          	INT8U  csdbuf[16],ret;
    470          
    471          	ret = SD_ReadCSD(16, csdbuf);	 								    		/* 读CSD寄存器    read CSD register */
   \   00000004   6946               MOV         R1,SP
   \   00000006   1020               MOV         R0,#+0x10
   \   00000008   ........           _BLF        SD_ReadCSD,SD_ReadCSD??rT
   \   0000000C   051C               MOV         R5,R0
    472          	if (ret != SD_NO_ERR)	
   \   0000000E   002D               CMP         R5,#+0
   \   00000010   01D0               BEQ         ??SD_GetCardInfo_0
    473          		return ret;	
   \   00000012   281C               MOV         R0,R5
   \   00000014   62E0               B           ??SD_GetCardInfo_1
    474          		
    475          	SD_CalTimeout(csdbuf);														/* 计算超时时间值 calculate timeout value */
   \                     ??SD_GetCardInfo_0:
   \   00000016   6846               MOV         R0,SP
   \   00000018   ........           BL          SD_CalTimeout
    476          		
    477          	/* 计算块的最大长度  */														/* calculate the size of a sector */
    478          	sds.block_len = 1 << (csdbuf[READ_BL_LEN_POS] & READ_BL_LEN_MSK);  			/* (2 ^ READ_BL_LEN) */
   \   0000001C   3148               LDR         R0,??SD_GetCardInfo_2  ;; sds + 8
   \   0000001E   0121               MOV         R1,#+0x1
   \   00000020   6A46               MOV         R2,SP
   \   00000022   5279               LDRB        R2,[R2, #+0x5]
   \   00000024   1207               LSL         R2,R2,#+0x1C       ;; ZeroExt     R2,R2,#+0x1C,#+0x1C
   \   00000026   120F               LSR         R2,R2,#+0x1C
   \   00000028   9140               LSL         R1,R2
   \   0000002A   0160               STR         R1,[R0, #+0]
    479          	
    480          	/* 计算卡中块的个数 */														/* calculate the sector numbers of the SD Card */
    481          	sds.block_num = ((csdbuf[C_SIZE_POS1] & C_SIZE_MSK1) << 10) +
    482          	      			 (csdbuf[C_SIZE_POS2] << 2) +
    483          	 	 			((csdbuf[C_SIZE_POS3] & C_SIZE_MSK3) >> 6) + 1;				/* (C_SIZE + 1)*/
   \   0000002C   ....               LDR         R0,??DataTable4    ;; sds + 4
   \   0000002E   6946               MOV         R1,SP
   \   00000030   8979               LDRB        R1,[R1, #+0x6]
   \   00000032   8907               LSL         R1,R1,#+0x1E       ;; ZeroExt     R1,R1,#+0x1E,#+0x1E
   \   00000034   890F               LSR         R1,R1,#+0x1E
   \   00000036   8902               LSL         R1,R1,#+0xA
   \   00000038   6A46               MOV         R2,SP
   \   0000003A   D279               LDRB        R2,[R2, #+0x7]
   \   0000003C   9200               LSL         R2,R2,#+0x2
   \   0000003E   8918               ADD         R1,R1,R2
   \   00000040   6A46               MOV         R2,SP
   \   00000042   127A               LDRB        R2,[R2, #+0x8]
   \   00000044   1206               LSL         R2,R2,#+0x18       ;; ZeroExt     R2,R2,#+0x18,#+0x18
   \   00000046   120E               LSR         R2,R2,#+0x18
   \   00000048   9209               LSR         R2,R2,#+0x6
   \   0000004A   1206               LSL         R2,R2,#+0x18       ;; ZeroExt     R2,R2,#+0x18,#+0x18
   \   0000004C   120E               LSR         R2,R2,#+0x18
   \   0000004E   8918               ADD         R1,R1,R2
   \   00000050   491C               ADD         R1,#+0x1
   \   00000052   0160               STR         R1,[R0, #+0]
    484          		 	  															
    485          	tmp = ((csdbuf[C_SIZE_MULT_POS1] & C_SIZE_MULT_MSK1) << 1) +
    486          	      ((csdbuf[C_SIZE_MULT_POS2] & C_SIZE_MULT_MSK2) >> 7) + 2;				/* (C_SIZE_MULT + 2) */
   \   00000054   6846               MOV         R0,SP
   \   00000056   407A               LDRB        R0,[R0, #+0x9]
   \   00000058   8007               LSL         R0,R0,#+0x1E       ;; ZeroExt     R0,R0,#+0x1E,#+0x1E
   \   0000005A   800F               LSR         R0,R0,#+0x1E
   \   0000005C   4000               LSL         R0,R0,#+0x1
   \   0000005E   6946               MOV         R1,SP
   \   00000060   897A               LDRB        R1,[R1, #+0xA]
   \   00000062   0906               LSL         R1,R1,#+0x18       ;; ZeroExt     R1,R1,#+0x18,#+0x18
   \   00000064   090E               LSR         R1,R1,#+0x18
   \   00000066   C909               LSR         R1,R1,#+0x7
   \   00000068   0906               LSL         R1,R1,#+0x18       ;; ZeroExt     R1,R1,#+0x18,#+0x18
   \   0000006A   090E               LSR         R1,R1,#+0x18
   \   0000006C   4018               ADD         R0,R0,R1
   \   0000006E   801C               ADD         R0,#+0x2
   \   00000070   041C               MOV         R4,R0
    487              	
    488              /* 获得卡中块的数量 */														/* get the block numbers in card */
    489          	sds.block_num = sds.block_num * (1 << tmp);									/* (C_SIZE + 1) * 2 ^ (C_SIZE_MULT + 2) */
   \   00000072   ....               LDR         R0,??DataTable4    ;; sds + 4
   \   00000074   ....               LDR         R1,??DataTable4    ;; sds + 4
   \   00000076   0968               LDR         R1,[R1, #+0]
   \   00000078   0122               MOV         R2,#+0x1
   \   0000007A   A240               LSL         R2,R4
   \   0000007C   5143               MUL         R1,R2
   \   0000007E   0160               STR         R1,[R0, #+0]
    490          																			
    491          	/* 计算擦除的单位(单位: 块) */	
    492          	if (sds.card_type == CARDTYPE_MMC)
   \   00000080   ....               LDR         R0,??DataTable7    ;; sds
   \   00000082   0078               LDRB        R0,[R0, #+0]
   \   00000084   0128               CMP         R0,#+0x1
   \   00000086   17D1               BNE         ??SD_GetCardInfo_3
    493          	{					
    494          		tmp  = ((csdbuf[ERASE_GRP_SIZE_POS] & ERASE_GRP_SIZE_MSK) >> 2) + 1;  	/* (ERASE_GRP_SIZE + 1)  */
   \   00000088   6846               MOV         R0,SP
   \   0000008A   807A               LDRB        R0,[R0, #+0xA]
   \   0000008C   7C21               MOV         R1,#+0x7C
   \   0000008E   0140               AND         R1,R0
   \   00000090   081C               MOV         R0,R1
   \   00000092   8010               ASR         R0,R0,#+0x2
   \   00000094   401C               ADD         R0,#+0x1
   \   00000096   041C               MOV         R4,R0
    495          		
    496          		/* (ERASE_GRP_SIZE + 1) * (ERASE_GRP_MULTI + 1) */
    497          		tmp *= ((csdbuf[ERASE_GRP_MULTI_POS1] & ERASE_GRP_MULTI_MSK1) << 3) +
    498          		       ((csdbuf[ERASE_GRP_MULTI_POS2] & ERASE_GRP_MULTI_MSK2) >> 5) + 1;	
   \   00000098   6846               MOV         R0,SP
   \   0000009A   807A               LDRB        R0,[R0, #+0xA]
   \   0000009C   8007               LSL         R0,R0,#+0x1E       ;; ZeroExt     R0,R0,#+0x1E,#+0x1E
   \   0000009E   800F               LSR         R0,R0,#+0x1E
   \   000000A0   C000               LSL         R0,R0,#+0x3
   \   000000A2   6946               MOV         R1,SP
   \   000000A4   C97A               LDRB        R1,[R1, #+0xB]
   \   000000A6   0906               LSL         R1,R1,#+0x18       ;; ZeroExt     R1,R1,#+0x18,#+0x18
   \   000000A8   090E               LSR         R1,R1,#+0x18
   \   000000AA   4909               LSR         R1,R1,#+0x5
   \   000000AC   0906               LSL         R1,R1,#+0x18       ;; ZeroExt     R1,R1,#+0x18,#+0x18
   \   000000AE   090E               LSR         R1,R1,#+0x18
   \   000000B0   4018               ADD         R0,R0,R1
   \   000000B2   401C               ADD         R0,#+0x1
   \   000000B4   4443               MUL         R4,R0
   \   000000B6   0EE0               B           ??SD_GetCardInfo_4
    499          	}
    500          	else																		/*calculate the size of sector */
    501          		tmp = ((csdbuf[SECTOR_SIZE_POS1] & SECTOR_SIZE_MSK1) << 1) +  			
    502          	          ((csdbuf[SECTOR_SIZE_POS2] & SECTOR_SIZE_MSK2) >> 7) + 1;			/* SD: SECTOR_SIZE */
   \                     ??SD_GetCardInfo_3:
   \   000000B8   6846               MOV         R0,SP
   \   000000BA   807A               LDRB        R0,[R0, #+0xA]
   \   000000BC   8006               LSL         R0,R0,#+0x1A       ;; ZeroExt     R0,R0,#+0x1A,#+0x1A
   \   000000BE   800E               LSR         R0,R0,#+0x1A
   \   000000C0   4000               LSL         R0,R0,#+0x1
   \   000000C2   6946               MOV         R1,SP
   \   000000C4   C97A               LDRB        R1,[R1, #+0xB]
   \   000000C6   0906               LSL         R1,R1,#+0x18       ;; ZeroExt     R1,R1,#+0x18,#+0x18
   \   000000C8   090E               LSR         R1,R1,#+0x18
   \   000000CA   C909               LSR         R1,R1,#+0x7
   \   000000CC   0906               LSL         R1,R1,#+0x18       ;; ZeroExt     R1,R1,#+0x18,#+0x18
   \   000000CE   090E               LSR         R1,R1,#+0x18
   \   000000D0   4018               ADD         R0,R0,R1
   \   000000D2   401C               ADD         R0,#+0x1
   \   000000D4   041C               MOV         R4,R0
    503          	
    504          	sds.erase_unit = tmp;	    												/* 擦除单位(块) */
   \                     ??SD_GetCardInfo_4:
   \   000000D6   0448               LDR         R0,??SD_GetCardInfo_2+0x4  ;; sds + 12
   \   000000D8   0460               STR         R4,[R0, #+0]
    505          	
    506          	return SD_NO_ERR;															/* 返回执行成功 return perform sucessfully */

⌨️ 快捷键说明

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