-
Notifications
You must be signed in to change notification settings - Fork 0
/
emmc_erase.c
113 lines (94 loc) · 2.88 KB
/
emmc_erase.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
* Copyright (c) 2015-2018, Renesas Electronics Corporation. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/**
* @file emmc_erase.c
* @brief erase api
*
*/
/* ************************ HEADER (INCLUDE) SECTION *********************** */
#include "emmc_config.h"
#include "emmc_hal.h"
#include "emmc_std.h"
#include "emmc_registers.h"
#include "emmc_def.h"
#include "types.h"
/* ***************** MACROS, CONSTANTS, COMPILATION FLAGS ****************** */
/* ********************** STRUCTURES, TYPE DEFINITIONS ********************* */
/* ********************** DECLARATION OF EXTERNAL DATA ********************* */
/* ************************** FUNCTION PROTOTYPES ************************** */
/* ********************************* CODE ********************************** */
/** @brief function of erase sector
*
*
* - Pre-conditions:<BR>
* MMC card is mounted.
*
* - Post-conditions:<BR>
* .
*
* @param[in,out] buff_address_virtual virtual address of write data buffer.
* @param[in] sector_number data address for MMC device (sector number).
* @param[in] count number of sector.
* @param[in] transfer_mode Mode of data transfer, DMA or not DMA.
*/
EMMC_ERROR_CODE emmc_erase_sector(
uint32_t start_address,
uint32_t end_address
)
{
EMMC_ERROR_CODE result;
/* parameter check */
if (start_address > end_address)
{
emmc_write_error_info(EMMC_FUNCNO_ERASE_SECTOR, EMMC_ERR_PARAM);
return EMMC_ERR_PARAM;
}
/* state check */
if (mmc_drv_obj.mount != TRUE)
{
emmc_write_error_info(EMMC_FUNCNO_ERASE_SECTOR, EMMC_ERR_STATE);
return EMMC_ERR_STATE;
}
/* EXT_CSD[175] ERASE_GROUP_DEF check */
//if( )
/* CMD35 */
emmc_make_nontrans_cmd(CMD35_ERASE_GROUP_START, start_address);
result = emmc_exec_cmd(EMMC_R1_ERROR_MASK, mmc_drv_obj.response);
if (result != EMMC_SUCCESS)
{
return result;
}
/* CMD36 */
emmc_make_nontrans_cmd(CMD36_ERASE_GROUP_END, end_address);
result = emmc_exec_cmd(EMMC_R1_ERROR_MASK, mmc_drv_obj.response);
if (result != EMMC_SUCCESS)
{
return result;
}
/* CMD38 */
emmc_make_nontrans_cmd(CMD38_ERASE, 0);
result = emmc_exec_cmd(EMMC_R1_ERROR_MASK, mmc_drv_obj.response);
if (result != EMMC_SUCCESS)
{
return result;
}
//Figure A.11 - CIM_ERASE_GROUP CMD13
/* CMD13 */
emmc_make_nontrans_cmd(CMD13_SEND_STATUS, EMMC_RCA<<16);
result = emmc_exec_cmd(EMMC_R1_ERROR_MASK, mmc_drv_obj.response);
if (result != EMMC_SUCCESS)
{
return result;
}
/* ready status check */
if ( (mmc_drv_obj.r1_card_status & EMMC_R1_READY) == 0)
{
emmc_write_error_info(EMMC_FUNCNO_ERASE_SECTOR, EMMC_ERR_CARD_BUSY);
return EMMC_ERR_CARD_BUSY;
}
return EMMC_SUCCESS;
}
/* ******************************** END ************************************ */